changeset 83507:81f2d90dee68

Merged from Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-188 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-189 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-190 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-191 Undo incorrect merge of etc/images/README from Gnus 5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-192 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-193 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-194 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-195 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-196 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-197 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-198 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-199 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-200 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-201 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-202 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-203 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-204 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-205 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-206 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-73 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-74 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-75 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-76 Update from CVS: README: Addition from 5.10.6 tar ball. * emacs@sv.gnu.org/gnus--rel--5.10--patch-77 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-78 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-79 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-80 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-547
author Karoly Lorentey <lorentey@elte.hu>
date Mon, 10 Apr 2006 14:52:24 +0000
parents 9905fc171253 (current diff) c3699b2f4b6f (diff)
children cc8354d6fe87
files ChangeLog configure configure.in etc/TODO lisp/ChangeLog lisp/emacs-lisp/bytecomp.el lisp/emulation/cua-base.el lisp/files.el lisp/international/mule-cmds.el lisp/mh-e/ChangeLog lisp/mh-e/mh-e.el lisp/net/rcirc.el lisp/progmodes/gdb-ui.el lisp/progmodes/idlw-rinfo.el lisp/progmodes/idlw-shell.el lisp/progmodes/idlw-toolbar.el lisp/progmodes/idlwave.el lisp/recentf.el lisp/simple.el lisp/startup.el lisp/subr.el lispref/ChangeLog man/ChangeLog man/emacs.texi man/frames.texi man/mh-e.texi src/alloc.c src/config.in src/image.c src/keymap.c src/lisp.h src/macterm.c src/process.c src/puresize.h
diffstat 108 files changed, 9790 insertions(+), 8745 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,18 @@
+2006-04-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* configure: Regenerated.
+
+2006-04-01  Emanuele Giaquinta  <emanuele.giaquinta@gmail.com>  (tiny change)
+
+	* configure.in (HAVE_XAW3D): Disable Xaw3d check if
+	--without-toolkit-scroll-bars was specified.
+
+2006-04-01  Christoph Bauer  <Christoph.Bauer@lms-gmbh.de>  (tiny change)
+
+	* configure.in (hppa*-hp-hpux1[1-9]*): Add
+	-D_INCLUDE__STDC_A1_SOURCE to CFLAGS.  Update Copyright years
+	written to src/config.in.
+
 2006-03-18  Claudio Fontana  <claudio@gnu.org>
 
 	* Makefile.in (INFO_FILES): New variable, contains all Info file names.
--- a/INSTALL	Sat Apr 01 17:16:18 2006 +0000
+++ b/INSTALL	Mon Apr 10 14:52:24 2006 +0000
@@ -260,7 +260,7 @@
 
 If `--with-x-toolkit=gtk' is specified, you can tell configure where
 to search for GTK by specifying `--with-pkg-config-prog=PATH' where
-PATH is the pathname to pkg-config.  Note that GTK version 2.0 or
+PATH is the pathname to pkg-config.  Note that GTK version 2.4 or
 newer is required for Emacs.
 
 The `--with-gcc' option specifies that the build process should
--- a/configure	Sat Apr 01 17:16:18 2006 +0000
+++ b/configure	Mon Apr 10 14:52:24 2006 +0000
@@ -2093,6 +2093,7 @@
   ;;
   hppa*-hp-hpux1[1-9]* )
     machine=hp800 opsys=hpux11
+    CFLAGS="-D_INCLUDE__STDC_A1_SOURCE $CFLAGS"
   ;;
 
   hppa*-*-linux-gnu* )
@@ -11230,7 +11231,7 @@
 ### Is -lXaw3d available?
 HAVE_XAW3D=no
 if test "${HAVE_X11}" = "yes"; then
-  if test "${USE_X_TOOLKIT}" != "none"; then
+  if test "${USE_X_TOOLKIT}" != "none" && test "${with_toolkit_scroll_bars}" != "no"; then
             echo "$as_me:$LINENO: checking for X11/Xaw3d/Scrollbar.h" >&5
 echo $ECHO_N "checking for X11/Xaw3d/Scrollbar.h... $ECHO_C" >&6
 if test "${ac_cv_header_X11_Xaw3d_Scrollbar_h+set}" = set; then
--- a/configure.in	Sat Apr 01 17:16:18 2006 +0000
+++ b/configure.in	Mon Apr 10 14:52:24 2006 +0000
@@ -611,6 +611,7 @@
   ;;
   hppa*-hp-hpux1[1-9]* )
     machine=hp800 opsys=hpux11
+    CFLAGS="-D_INCLUDE__STDC_A1_SOURCE $CFLAGS"
   ;;
 
   hppa*-*-linux-gnu* )
@@ -2182,7 +2183,7 @@
 ### Is -lXaw3d available?
 HAVE_XAW3D=no
 if test "${HAVE_X11}" = "yes"; then
-  if test "${USE_X_TOOLKIT}" != "none"; then
+  if test "${USE_X_TOOLKIT}" != "none" && test "${with_toolkit_scroll_bars}" != "no"; then
     dnl Fixme: determine what Scrollbar.h needs to avoid compilation
     dnl errors from the test without the `-'.
     AC_CHECK_HEADER(X11/Xaw3d/Scrollbar.h,
@@ -2843,7 +2844,7 @@
 fi
 
 AH_TOP([/* GNU Emacs site configuration template file.
-   Copyright (C) 1988, 1993, 1994, 1999, 2000, 2002, 2004
+   Copyright (C) 1988, 1993, 1994, 1999, 2000, 2002, 2004, 2005, 2006
              Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
--- a/etc/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/etc/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,7 @@
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* NEWS: Add string-or-null-p.
+
 2006-03-28  Bill Wohler  <wohler@newt.com>
 
 	* images/README: Update with following information.
--- a/etc/NEWS	Sat Apr 01 17:16:18 2006 +0000
+++ b/etc/NEWS	Mon Apr 10 14:52:24 2006 +0000
@@ -3470,6 +3470,15 @@
 `risky-local-variable' property is nil.
 
 ---
+The function `comint-send-input' now accepts 3 optional arguments:
+
+  (comint-send-input &optional no-newline artificial)
+
+Callers sending input not from the user should use bind the 3rd
+argument `artificial' to a non-nil value, to prevent Emacs from
+deleting the part of subprocess output that matches the input.
+
+---
 ** Support for Mocklisp has been removed.
 
 +++
@@ -3615,6 +3624,11 @@
 
 If it is non-nil, the function lists only faces matching this regexp.
 
++++
+*** New function `string-or-null-p'.
+
+Return t if OBJECT is a string or nil.  Otherwise, return nil.
+
 ** Lisp code indentation features:
 
 +++
--- a/etc/TODO	Sat Apr 01 17:16:18 2006 +0000
+++ b/etc/TODO	Mon Apr 10 14:52:24 2006 +0000
@@ -9,6 +9,12 @@
 
 * Small but important fixes needed in existing features:
 
+** Make vc-checkin avoid reverting the buffer if has not changed after
+   the checkin. Comparing (md5 BUFFER) to (md5 FILE) should be enough.
+
+** Make vc-annotate show place the cursor in the annotate buffer at the 
+   same line as the current buffer.
+
 ** buffer-offer-save should be a permanent local.
 
 ** revert-buffer should eliminate overlays and the mark.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etc/images/redo.xpm	Mon Apr 10 14:52:24 2006 +0000
@@ -0,0 +1,69 @@
+/* XPM */
+static char * stock_redo_xpm[] = {
+"24 24 42 1",
+" 	c None",
+".	c #000000",
+"+	c #939A8D",
+"@	c #BAD09D",
+"#	c #92998C",
+"$	c #818F71",
+"%	c #ADBDA0",
+"&	c #C2D5AA",
+"*	c #D1DFBE",
+"=	c #BED2A3",
+"-	c #99A28F",
+";	c #A8BCA6",
+">	c #D5E1C6",
+",	c #CDDCBC",
+"'	c #D2E0BF",
+")	c #C5D7AE",
+"!	c #919889",
+"~	c #8C9A7F",
+"{	c #D4E0C5",
+"]	c #D3E0C1",
+"^	c #BFD3A6",
+"/	c #9BAA87",
+"(	c #B5C3A9",
+"_	c #92AD62",
+":	c #7C9B40",
+"<	c #59702D",
+"[	c #7F8E6B",
+"}	c #C8D9B2",
+"|	c #85A24D",
+"1	c #53692A",
+"2	c #A4B690",
+"3	c #9BB572",
+"4	c #6D8839",
+"5	c #95A77E",
+"6	c #8BA859",
+"7	c #657255",
+"8	c #98AF74",
+"9	c #AFC394",
+"0	c #6D7A5B",
+"a	c #9CAF84",
+"b	c #748261",
+"c	c #879772",
+"                        ",
+"                        ",
+"                        ",
+"            .           ",
+"            ..          ",
+"            .+.         ",
+"         ....@#.        ",
+"        .$%&*=@-.       ",
+"       .;>,')@@@!.      ",
+"      .~{]*^@@@@@/.     ",
+"      .(>_::::::<.      ",
+"     .[}|::::::1.       ",
+"     .23:<...:1.        ",
+"     .@:4.  .<.         ",
+"     .@:..  ..          ",
+"     .56.   .           ",
+"     .78.               ",
+"      .9.               ",
+"      .0a.              ",
+"       .bc.             ",
+"        ...             ",
+"                        ",
+"                        ",
+"                        "};
--- a/lib-src/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/lib-src/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,13 @@
+2006-04-02  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* b2m.c (main): Don't include <limits.h>.
+	(TM_YEAR_BASE): New macro.
+	(TM_YEAR_IN_ASCTIME_RANGE): Don't define if already defined, so
+	that s/ files can override this.  Use the more-conservative range
+	1000-9999.
+	(main): Check for asctime returning NULL.
+	* fakemail.c: Likewise.
+
 2006-03-27  Paul Eggert  <eggert@cs.ucla.edu>
 
 	* b2m.c: Include <limits.h>.
--- a/lib-src/README	Sat Apr 01 17:16:18 2006 +0000
+++ b/lib-src/README	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,3 @@
 This directory contains the source code for the architecture-dependent
 files that go in ${archlibdir}.  At present, these are mostly utility
-programs used by Emacs.
+programs used by GNU Emacs.
--- a/lib-src/b2m.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/lib-src/b2m.c	Mon Apr 10 14:52:24 2006 +0000
@@ -26,7 +26,6 @@
 #undef static
 #endif
 
-#include <limits.h>
 #include <stdio.h>
 #include <time.h>
 #include <sys/types.h>
@@ -45,15 +44,13 @@
 
 typedef int logical;
 
-/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
-   to asctime.  Glibc asctime returns a useful string unless TM_YEAR
-   is nearly INT_MAX, but the C Standard lets C libraries overrun a
-   buffer if TM_YEAR needs more than 4 bytes.  */
-#ifdef __GLIBC__
-# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
-#else
+#define TM_YEAR_BASE 1900
+
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
-    (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
 #endif
 
 /*
@@ -148,9 +145,9 @@
      Don't use 'ctime', as that might dump core if the hardware clock
      is set to a bizarre value.  */
   tm = localtime (&ltoday);
-  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)
+	 && (today = asctime (tm))))
     fatal ("current time is out of range");
-  today = asctime (tm);
   data.size = 200;
   data.buffer = xnew (200, char);
 
--- a/lib-src/fakemail.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/lib-src/fakemail.c	Mon Apr 10 14:52:24 2006 +0000
@@ -53,7 +53,6 @@
 #include "ntlib.h"
 #endif
 
-#include <limits.h>
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
@@ -71,15 +70,13 @@
 #define true 1
 #define false 0
 
-/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
-   to asctime.  Glibc asctime returns a useful string unless TM_YEAR
-   is nearly INT_MAX, but the C Standard lets C libraries overrun a
-   buffer if TM_YEAR needs more than 4 bytes.  */
-#ifdef __GLIBC__
-# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
-#else
+#define TM_YEAR_BASE 1900
+
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
-    (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
 #endif
 
 /* Various lists */
@@ -378,9 +375,9 @@
      Don't use 'ctime', as that might dump core if the hardware clock
      is set to a bizarre value.  */
   tm = localtime (&idiotic_interface);
-  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)
+	 && (the_date = asctime (tm))))
     fatal ("current time is out of range", 0);
-  the_date = asctime (tm);
   /* the_date has an unwanted newline at the end */
   date_length = strlen (the_date) - 1;
   the_date[date_length] = '\0';
--- a/lisp/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,374 @@
+2006-04-09  Richard Stallman  <rms@gnu.org>
+
+	* mail/rmail.el (rmail-mime-charset-pattern): Ignore format and delsp
+	specs while looking for charset.
+
+	* textmodes/picture.el (picture-mode-exit): Run picture-mode-exit-hook.
+
+	* play/landmark.el (lm-font-lock-face-O, lm-font-lock-face-X):
+	Make them faces.
+	(lm-font-lock-keywords): Update appropriately.
+
+2006-04-10  Kim F. Storm  <storm@cua.dk>
+
+	* simple.el (filter-buffer-substring): Add NOPROPS arg, so
+	it can also replace buffer-substring-no-properties.
+
+	* emulation/cua-base.el (cua-delete-region, cua-paste)
+	(cua-repeat-replace-region): Use filter-buffer-substring.
+
+	* emulation/cua-gmrk.el (cua-copy-region-to-global-mark)
+	(cua-cut-region-to-global-mark): Likewise.
+
+	* emulation/cua-rect.el (cua--extract-rectangle)
+	(cua-incr-rectangle, cua--rectangle-aux-replace): Likewise.
+
+2006-04-09  Roland Winkler  <Roland.Winkler@physik.uni-erlangen.de>
+
+	* textmodes/bibtex.el (bibtex-entry-update): New optional arg
+	entry-type.  Add field delimiters to numerical fields if they are
+	not present.
+
+2006-04-09  Roland Winkler  <Roland.Winkler@physik.uni-erlangen.de>
+
+	* textmodes/bibtex.el (bibtex-find-text-internal): Add new element
+	string-const to return value.
+	(bibtex-remove-delimiters): Use it.
+
+2006-04-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/bytecomp.el (byte-compile-form): Don't call
+	cl-byte-compile-compiler-macro unless it exists.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* files.el (hack-local-variables-confirm) <offer-save>:
+	Clarify message text.  Suggested by Ralf Angeli.
+
+2006-04-08  Michael Cadilhac  <michael.cadilhac@lrde.org>  (tiny change)
+
+	* rect.el (kill-rectangle): Don't barf if `kill-read-only-ok' is set.
+	(delete-extract-rectangle-line): Use `filter-buffer-substring'
+	instead of `buffer-substring' and `delete-region'.  (Most of the
+	code actually copied from `kill-region'.)
+
+2006-04-08  Ryan Yeske  <rcyeske@gmail.com>
+
+	* rcirc.el (rcirc-default-server): Rename from rcirc-server.
+	(rcirc-default-port): Rename from rcirc-port.
+	(rcirc-default-nick): Rename from rcirc-nick.
+	(rcirc-default-user-name): Rename from rcirc-user-name.
+	(rcirc-default-user-full-name): Rename from rcirc-user-full-name.
+	(rcirc-low-priority-flag): New variable.
+	(rcirc-decode-coding-system): New defcustom.
+	(rcirc-encode-coding-system): New defcustom.
+	(rcirc-coding-system-alist): New defcustom.
+	(rcirc-multiline-major-mode): New defcustom.
+	(rcirc-nick): New internal variable.
+	(rcirc-process): Remove variable.
+	(rcirc-server-buffer): New variable.
+	(rcirc): Update to use rcirc-default-* variables above.
+	(rcirc-connect): Do not add window-configuration-hook-here.
+	(rcirc-server): New internal variable.
+	(rcirc-connect): Do not send keepalive pings if
+	rcirc-keepalive-seconds is nil.
+	(with-rcirc-server-buffer): New macro.
+	(rcirc-send-string): Encode with rcirc-encode-coding-system.
+	(rcirc-server-name): Rename from rcirc-server.
+	(rcirc-buffer-process): New function.
+	(rcirc-buffer-nick): New function.
+	(rcirc-buffer-target): Remove function.
+	(set-rcirc-decode-coding-system, set-rcirc-encode-coding-system):
+	New commands.
+	(rcirc-mode-map): Change binding of C-c C-l to
+	rcirc-toggle-low-priority.
+	(rcirc-mode): Initialize coding system based on
+	rcirc-coding-system-alist.  New change-major-mode-hook to part the
+	channel on a mode change.  Make kill-buffer-hook buffer-local.
+	(rcirc-change-major-mode-hook): New function.
+	(rcirc-clean-up-buffer): Rename from rcirc-kill-buffer-hook-1.
+	(rcirc-last-post-time): New variable.
+	(rcirc-process-message): Store the last time user posted a message
+	to this target.
+	(rcirc-multiline-minor-mode): New mode.
+	(rcirc-multiline-minor-mode-map): New mode map.
+	(rcirc-edit-multiline): Put multiline-edit buffer in
+	rcirc-multiline-major-mode along with rcirc-multiline-minor-mode.
+	(rcirc-print): Any line starting with an ignored nick will be
+	ignored.
+	(rcirc-print): Decode using rcirc-decode-coding-system.
+	(rcirc-track-minor-mode): Update global-mode-string when disabling
+	this mode.
+	(minor-mode-alist): add LowPri indicator.
+	(rcirc-toggle-low-priority): New function.
+	(rcirc-last-non-irc-buffer): Prefix arg now no means switch to
+	next lowpriority buffer with activity.
+	(rcirc-record-activity): Sort buffers in rcirc-activity by the
+	last time the user posted a message in to the target.
+	(rcirc-update-activity-string): New formatting for low priority
+	buffers.
+	(rcirc-split-activity): New function.
+	(rcirc-handler-PART, rcirc-handler-KICK)
+	(rcirc-handler-PART-or-KICK): Kick responses are printed properly.
+	(rcirc-nick-away-alist): New variable.
+	(rcirc-handler-301): New handler.  Away messages are printed once
+	per change.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* info.el (Info-follow-nearest-node): Doc fix.
+
+	* international/mule-cmds.el (set-locale-environment): Make sure
+	the coding-system preferred by the locale's language has the same
+	EOL conversion type as the original buffer-file-coding-system.
+	(locale-language-names): Add a few MS Windows language codes.
+
+2006-04-07  Richard Stallman  <rms@gnu.org>
+
+	* simple.el (eval-expression): Doc fix.
+
+	* emacs-lisp/lisp-mode.el (eval-print-last-sexp, eval-last-sexp)
+	(eval-defun): Doc fixes.
+
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* pgg-gpg.el: Revert to revision 1.8 to allow the use of
+	gpg-agent.
+
+2006-04-07  Nick Roberts  <nickrob@snap.net.nz>
+
+	* progmodes/gdb-ui.el (gdb-init-2): Set current filename using
+	GDB list command without argument for greater generality.
+
+2006-04-06  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* subr.el (string-or-null-p): New function.
+
+	* textmodes/paragraphs.el (sentence-end): Use string-or-null-p.
+
+	* textmodes/ispell.el (ispell-local-dictionary): Use
+	string-or-null-p.
+
+	* files.el: Update comment about safe-local-variable declarations.
+
+2006-04-06  J.D. Smith  <jdsmith@as.arizona.edu>
+
+	* progmodes/idlwave.el: Updated to IDLWAVE version 6.0.  See
+	idlwave.org.
+
+	* progmodes/idlw-shell.el: Updated to IDLWAVE version 6.0.  See
+	idlwave.org.  Includes code to obsolete idlw-rinfo.el.
+
+	* progmodes/idlw-help.el: Updated to IDLWAVE version 6.0.  See
+	idlwave.org.
+
+	* progmodes/idlw-complete-structtag.el: Updated to IDLWAVE
+	version 6.0 (minimal changes).  See idlwave.org.
+
+	* progmodes/idlw-toolbar.el: Updated to IDLWAVE version
+	6.0 (minimal changes).  See idlwave.org.
+
+	* progmodes/idlw-rinfo.el: File obsoleted and removed.
+
+2006-04-06  Romain Francoise  <romain@orebokech.com>
+
+	* pgg-gpg.el: Sync back with Gnus 5.10, reverting changes that add
+	symmetric encryption features and a new asynchronous interface to
+	GnuPG.  This new version is version 1.4, plus whitespace changes.
+
+2006-04-06  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* files.el: Move some `safe-local-variable' declarations to the
+	respective files.
+
+	* textmodes/ispell.el (ispell-check-comments)
+	(ispell-local-dictionary): Mark as safe.
+
+	* abbrev.el (abbrev-mode): Mark as safe.
+
+	* add-log.el (change-log-default-name): Mark as safe.
+
+	* textmodes/reftex-vars.el (reftex-vref-is-default)
+	(reftex-fref-is-default, reftex-level-indent)
+	(reftex-guess-label-type): Mark as safe.
+
+	* textmodes/fill.el (colon-double-space): Mark as safe.
+
+	* textmodes/paragraphs.el (paragraph-start, paragraph-separate)
+	(sentence-end-double-space, sentence-end-without-period)
+	(sentence-end-without-space, sentence-end, sentence-end-base)
+	(page-delimiter, paragraph-ignore-fill-prefix): Mark as safe.
+
+2006-04-06  Kim F. Storm  <storm@cua.dk>
+
+	* ido.el (ido-mode): Remove ido-ignore-unc-host-regexps from
+	the :set-after list.
+	(ido-downcase-unc-hosts): New user option.  Default on.
+	(ido-ignore-unc-host-regexps): Don't reset ido-unc-hosts-cache
+	when it is set, as regexps are now applied on the fly.
+	(ido-unc-hosts): Keep all known hosts in ido-unc-hosts-cache.
+	Make C-a DTRT--filter hosts through ido-ignore-unc-host-regexps
+	on the fly, but only when ido-process-ignore-lists is set.
+	Do case insensitive filtering if ido-downcase-unc-hosts is set.
+	Only downcase names if ido-downcase-unc-hosts is set.
+
+2006-04-06  Juanma Barranquero  <lekktu@gmail.com>
+
+	* ido.el (ido-unc-hosts-cache): Fix typo in docstring.
+
+	* woman.el (WoMan-xref-man-page): Fix call to `substring'.
+
+2006-04-05  Kim F. Storm  <storm@cua.dk>
+
+	* ido.el (ido-mode): Set after ido-unc-hosts and
+	ido-ignore-unc-host-regexps.
+	(ido-save-history): Save ido-unc-hosts-cache.
+	(ido-load-history): Load ido-unc-hosts-cache.
+	(ido-reread-directory): Refresh unc hosts cache in // dir.
+
+	* startup.el (fancy-splash-screens): Set emulation-mode-map-alists
+	to nil while displaying slash screen.
+
+2006-04-05  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el (pgg-gpg-encrypt-region, pgg-gpg-sign-region): Wait
+	for BEGIN_SIGNING too, new in GnuPG 1.4.3.
+
+2006-04-05  Kenichi Handa  <handa@m17n.org>
+
+	* international/characters.el: Setup cases of Latin, Greek, and
+	Cyrillic characters in CJK charsets.
+
+2006-03-29  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el (pgg-gpg-start-process): Don't bind
+	default-enable-multibyte-characters.  This reverts the change from
+	revision 6.17 which is no longer necessary because the passphrase
+	is sent separately now.  GnuPG messages are unreadable under
+	multibyte locales with default-enable-multibyte-characters set to
+	nil.
+
+2006-04-04  Andreas Schwab  <schwab@suse.de>
+
+	* files.el: Mark `left-margin', `byte-compile-dynamic-docstrings'
+	and `byte-compile-warnings' as `safe-local-variable'.
+
+2006-04-04  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* man.el (Man-mode-map): Restore the \r binding.
+	(Man-abstract-xref-man-page): If Man-target-string is a function,
+	call it.
+	(Man-highlight-references): Use Man-default-man-entry to get the
+	target. Deal with xrefs too.
+	(Man-highlight-references0): Don't call the target function.
+
+	* woman.el (WoMan-xref-man-page): Strip the section number, woman
+	cannot deal with it.
+
+2006-04-04  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el: Clean up process buffers every time gpg processes
+	complete.
+
+2006-04-04  Kenichi Handa  <handa@m17n.org>
+
+	* sort.el (sort-build-lists): Don't bind inhibit-field-text-motion
+	here.
+	(sort-lines, sort-numeric-fields, sort-fields, sort-columns):
+	Temporarily bind inhibit-field-text-motion to t.
+
+2006-04-03  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* startup.el (normal-splash-screen): Only set mode-line-format in the
+	splash buffer, so as not to interfere when debugging the code.
+	Ignore errors when switching buffer.
+
+2006-04-03  Romain Francoise  <romain@orebokech.com>
+
+	* dired.el (dired-dnd-protocol-alist): Fix typo.
+
+2006-04-03  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* savehist.el (savehist): Add :version.
+	(savehist-ignored-variables): New variable.
+	(savehist-minibuffer-hook): Don't save variables listed in
+	`savehist-ignored-variables'.
+
+	* dired.el (dired-dnd-protocol-alist): Mention that change does
+	only apply to new buffers in doc string.
+
+2006-04-03  Lennart Borgman  <lennart.borgman.073@student.lu.se>  (tiny change)
+
+	* recentf.el (recentf-open-files-item): Include newline in button
+	field, so opening a file will work, when the point is at the end
+	of the file name.  Allow, for example, to [i]search a file by
+	extension and just push RET to open it.
+
+2006-04-03  Daiki Ueno  <ueno@unixuser.org>
+
+	* pgg-gpg.el (pgg-gpg-process-filter)
+	(pgg-gpg-wait-for-completion): Check if buffer is alive.
+
+	* pgg-gpg.el (pgg-gpg-process-sentinel): Don't remove GNUPG:
+	lines, temporary fix.
+
+2006-04-02  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* ibuf-macs.el (define-ibuffer-column): Document the new parameter.
+
+2006-04-02  Richard Stallman  <rms@gnu.org>
+
+	* progmodes/compile.el (compilation-message-face): Make it defcustom.
+
+2006-04-02  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* ibuf-macs.el (define-ibuffer-column): Add a new key:
+	header-mouse-map.
+
+	* ibuffer.el (ibuffer-name-header-map, ibuffer-size-header-map)
+	(ibuffer-mode-header-map): New keymaps.
+	(ibuffer-update-title-and-summary): Enable mouse face highlighting
+	and keybindings for column headers.
+	(name,size,mode) <define-ibuffer-column>: Add a header-mouse-map
+	property.
+
+2006-04-02  Drew Adams  <drew.adams@oracle.com>  (tiny change)
+
+	* speedbar.el (speedbar-after-create-hook): Doc fix.
+
+2006-04-02  Michael Ernst  <mernst@alum.mit.edu>
+
+	* shell.el (shell-directory-tracker)
+	(shell-dynamic-complete-command): Doc fixes.
+
+2006-04-01  Matt Hodges  <MPHodges@member.fsf.org>
+
+	* pcomplete.el (pcomplete-show-completions): Recognize TAB on text
+	terminals.
+
+2006-04-01  Kim F. Storm  <storm@cua.dk>
+
+	* ido.el (ido-unc-hosts-cache): New defvar.
+	(ido-unc-hosts): If value of defcustom is a function, call it to
+	get list of UNC hosts.  Add function-item choices to specify
+	ido-unc-hosts-net-view or user function.
+	(ido-ignore-unc-host-regexps): New defcustom.
+	(ido-unc-hosts-net-view, ido-unc-hosts): New functions.
+	(ido-is-unc-root, ido-is-unc-host, ido-file-name-all-completions)
+	(ido-exhibit): Call ido-unc-hosts to get list of UNC hosts.
+
+2006-03-13  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* pcvs-util.el (cvs-insert-strings): Fix bug with strings longer than
+	wwidth.
+
+2006-03-31  Juanma Barranquero  <lekktu@gmail.com>
+
+	* ido.el (ido-cache-unc-host-shares-time, ido-report-no-match)
+	(ido-max-work-file-list, ido-switch-buffer)
+	(ido-read-file-name-as-directory-commands):
+	Fix typos in docstrings.
+
 2006-03-30  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
 	* term/mac-win.el (mac-system-coding-system): Define and use after
@@ -24,8 +395,7 @@
 
 2006-03-27  Carsten Dominik  <dominik@science.uva.nl>
 
-	* textmodes/org.el (org-get-level-face): Fix bug with level
-	counting.
+	* textmodes/org.el (org-get-level-face): Fix bug with level counting.
 
 2006-03-26  Andreas Schwab  <schwab@suse.de>
 
@@ -60,8 +430,8 @@
 	(cua--init-keymaps): Use it instead of fixed C-return.
 	(cua-mode): Set after it.
 
-	* emulation/cua-rect.el (cua--init-rectangles): Use
-	cua-rectangle-mark-key instead of fixed C-return.
+	* emulation/cua-rect.el (cua--init-rectangles):
+	Use cua-rectangle-mark-key instead of fixed C-return.
 
 2006-03-25  Nick Roberts  <nickrob@snap.net.nz>
 
@@ -97,8 +467,7 @@
 	* progmodes/gdb-ui.el (gdb-continuation): Declare earlier to
 	prevent compiler warnings.
 	(gdb-stopped): Check for gud-last-last-frame (case: signal).
-	(breakpoint-disabled): Make lighter for contrast with overlay
-	arrow.
+	(breakpoint-disabled): Make lighter for contrast with overlay arrow.
 	(gdb-assembler-custom): Use hollow-right-triangle for assembler
 	buffer too.
 
@@ -433,11 +802,6 @@
 	* tree-widget.el (tree-widget-themes-load-path)
 	(tree-widget-themes-directory, tree-widget-theme): Doc fix.
 
-2006-03-13  Stefan Monnier  <monnier@iro.umontreal.ca>
-
-	* pcvs-util.el (cvs-insert-strings): Fix bug with strings longer than
-	wwidth.
-
 2006-03-13  Ryan Yeske  <rcyeske@gmail.com>
 
 	* net/rcirc.el (rcirc) <defgroup>: Add link to manual.
@@ -1028,7 +1392,7 @@
 	(org-format-org-table-html, org-format-table-table-html):
 	Fix typos in docstrings.
 
-12006-02-23  Carsten Dominik  <dominik@science.uva.nl>
+2006-02-23  Carsten Dominik  <dominik@science.uva.nl>
 
 	* textmodes/org.el (org-cleaned-string-for-export)
 	(org-solidify-link-text): New function.
@@ -6340,7 +6704,7 @@
 
 2005-11-24  Carsten Dominik  <dominik@science.uva.nl>
 
-	* textmodes/org.el (org-export-plain-list-max-depth): Renamed from
+	* textmodes/org.el (org-export-plain-list-max-depth): Rename from
 	`org-export-local-list-max-depth'.  Change default value to 3.
 	(org-auto-renumber-ordered-lists)
 	(org-plain-list-ordered-item-terminator): New options.
@@ -15187,7 +15551,7 @@
 	* add-log.el (change-log-font-lock-keywords): Make the regexp for
 	date lines stricter.
 
-2005-06-10  Zhang Wei  <id.brep@gmail.com>  (tiny change)
+2005-06-10  Zhang Wei  <id.brep@gmail.com>
 
 	* term/x-win.el (x-clipboard-yank): Use x-selection-value instead
 	of x-get-selection.
--- a/lisp/abbrev.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/abbrev.el	Mon Apr 10 14:52:24 2006 +0000
@@ -58,6 +58,7 @@
 to enable or disable Abbrev mode in the current buffer."
   :type 'boolean
   :group 'abbrev-mode)
+;;;###autoload(put 'abbrev-mode 'safe-local-variable t)
 
 
 (defvar edit-abbrevs-map
--- a/lisp/add-log.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/add-log.el	Mon Apr 10 14:52:24 2006 +0000
@@ -45,6 +45,8 @@
   :type '(choice (const :tag "default" nil)
 		 string)
   :group 'change-log)
+(put 'change-log-default-name 'safe-local-variable
+     (lambda (a) (or (stringp a) (null a))))
 
 (defcustom change-log-mode-hook nil
   "Normal hook run by `change-log-mode'."
--- a/lisp/dired.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/dired.el	Mon Apr 10 14:52:24 2006 +0000
@@ -206,7 +206,8 @@
     ("^file:"    . dired-dnd-handle-local-file))
   "The functions to call when a drop in `dired-mode' is made.
 See `dnd-protocol-alist' for more information.  When nil, behave
-as in other buffers."
+as in other buffers.  Changing this option is effective only for
+new dired buffers."
   :type '(choice (repeat (cons (regexp) (function)))
 		 (const :tag "Behave as in other buffers" nil))
   :version "22.1"
--- a/lisp/emacs-lisp/bytecomp.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Mon Apr 10 14:52:24 2006 +0000
@@ -2765,9 +2765,15 @@
 		(byte-compile-warn "`%s' used from Lisp code\n\
 That command is designed for interactive use only" fn))
 	   (if (and handler
-		    (or (not (byte-compile-version-cond
-			      byte-compile-compatibility))
-			(not (get (get fn 'byte-opcode) 'emacs19-opcode))))
+                    ;; Make sure that function exists.  This is important
+                    ;; for CL compiler macros since the symbol may be
+                    ;; `cl-byte-compile-compiler-macro' but if CL isn't
+                    ;; loaded, this function doesn't exist.
+                    (or (not (memq handler '(cl-byte-compile-compiler-macro)))
+                        (fboundp handler))
+		    (not (and (byte-compile-version-cond
+                               byte-compile-compatibility)
+                              (get (get fn 'byte-opcode) 'emacs19-opcode))))
                (funcall handler form)
 	     (when (memq 'callargs byte-compile-warnings)
 	       (if (memq fn '(custom-declare-group custom-declare-variable custom-declare-face))
--- a/lisp/emacs-lisp/lisp-mode.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/emacs-lisp/lisp-mode.el	Mon Apr 10 14:52:24 2006 +0000
@@ -443,6 +443,9 @@
 (defun eval-print-last-sexp ()
   "Evaluate sexp before point; print value into current buffer.
 
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger.
+
 Note that printing the result is controlled by the variables
 `eval-expression-print-length' and `eval-expression-print-level',
 which see."
@@ -614,7 +617,10 @@
 
 (defun eval-last-sexp (eval-last-sexp-arg-internal)
   "Evaluate sexp before point; print value in minibuffer.
-Interactively, with prefix argument, print output into current buffer."
+Interactively, with prefix argument, print output into current buffer.
+
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger."
   (interactive "P")
   (if (null eval-expression-debug-on-error)
       (eval-last-sexp-1 eval-last-sexp-arg-internal)
@@ -722,6 +728,9 @@
 \(Normally `defvar' and `defcustom' do not alter the value if there
 already is one.)
 
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger.
+
 With a prefix argument, instrument the code for Edebug.
 
 If acting on a `defun' for FUNCTION, and the function was
--- a/lisp/emulation/cua-base.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/emulation/cua-base.el	Mon Apr 10 14:52:24 2006 +0000
@@ -769,7 +769,7 @@
   (let ((start (mark)) (end (point)))
     (or (<= start end)
 	(setq start (prog1 end (setq end start))))
-    (setq cua--last-deleted-region-text (buffer-substring start end))
+    (setq cua--last-deleted-region-text (filter-buffer-substring start end))
     (if cua-delete-copy-to-register-0
 	(set-register ?0 cua--last-deleted-region-text))
     (delete-region start end)
@@ -858,7 +858,7 @@
       (if regtxt
 	  (cua--insert-at-global-mark regtxt)
 	(when (not (eobp))
-	  (cua--insert-at-global-mark (buffer-substring (point) (+ (point) count)))
+	  (cua--insert-at-global-mark (filter-buffer-substring (point) (+ (point) count)))
 	  (forward-char count))))
      (buffer-read-only
       (message "Cannot paste into a read-only buffer"))
@@ -875,7 +875,7 @@
 		(setq paste-lines (cua--delete-rectangle))
 		(if (= paste-lines 1)
 		    (setq paste-lines nil))) ;; paste all
-	    (if (string= (buffer-substring (point) (mark))
+	    (if (string= (filter-buffer-substring (point) (mark))
 			 (car kill-ring))
 		(current-kill 1))
 	    (cua-delete-region)))
@@ -950,7 +950,7 @@
 		  (setq s (car u) e (cdr u)))))))
 	  (setq cua--repeat-replace-text
 		(cond ((and s e (<= s e) (= s (mark t)))
-		       (buffer-substring-no-properties s e))
+		       (filter-buffer-substring s e nil t))
 		      ((and (null s) (eq u elt)) ;; nothing inserted
 		       "")
 		      (t
--- a/lisp/emulation/cua-gmrk.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/emulation/cua-gmrk.el	Mon Apr 10 14:52:24 2006 +0000
@@ -143,7 +143,7 @@
       (let ((src-buf (current-buffer)))
 	(save-excursion
 	  (if (equal (marker-buffer cua--global-mark-marker) src-buf)
-	      (let ((text (buffer-substring-no-properties start end)))
+	      (let ((text (filter-buffer-substring start end nil t)))
 		(goto-char (marker-position cua--global-mark-marker))
 		(insert text))
 	    (set-buffer (marker-buffer cua--global-mark-marker))
@@ -167,7 +167,7 @@
 	      (if (and (< start (marker-position cua--global-mark-marker))
 		       (< (marker-position cua--global-mark-marker) end))
 		  (message "Can't move region into itself")
-		(let ((text (buffer-substring-no-properties start end))
+		(let ((text (filter-buffer-substring start end nil t))
 		      (p1 (copy-marker start))
 		      (p2 (copy-marker end)))
 		  (goto-char (marker-position cua--global-mark-marker))
--- a/lisp/emulation/cua-rect.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/emulation/cua-rect.el	Mon Apr 10 14:52:24 2006 +0000
@@ -631,7 +631,7 @@
     (if (not (cua--rectangle-virtual-edges))
 	(cua--rectangle-operation nil nil nil nil nil ; do not tabify
 	  '(lambda (s e l r)
-	     (setq rect (cons (buffer-substring-no-properties s e) rect))))
+	     (setq rect (cons (filter-buffer-substring s e nil t) rect))))
       (cua--rectangle-operation nil 1 nil nil nil ; do not tabify
 	'(lambda (s e l r v)
 	   (let ((copy t) (bs 0) (as 0) row)
@@ -649,7 +649,7 @@
 	       (setq as (- r (max (current-column) l))
 		     e (point)))
        	     (setq row (if (and copy (> e s))
-			   (buffer-substring-no-properties s e)
+			   (filter-buffer-substring s e nil t)
 			 ""))
     	     (when (> bs 0)
     	       (setq row (concat (make-string bs ?\s) row)))
@@ -1127,12 +1127,12 @@
      '(lambda (s e l r)
         (cond
          ((re-search-forward "0x\\([0-9a-fA-F]+\\)" e t)
-          (let* ((txt (buffer-substring-no-properties (match-beginning 1) (match-end 1)))
+          (let* ((txt (filter-buffer-substring (match-beginning 1) (match-end 1) nil t))
                  (n (string-to-number txt 16))
                  (fmt (format "0x%%0%dx" (length txt))))
             (replace-match (format fmt (+ n increment)))))
          ((re-search-forward "\\( *-?[0-9]+\\)" e t)
-          (let* ((txt (buffer-substring-no-properties (match-beginning 1) (match-end 1)))
+          (let* ((txt (filter-buffer-substring (match-beginning 1) (match-end 1) nil t))
                  (prefix (if (= (aref txt 0) ?0) "0" ""))
                  (n (string-to-number txt 10))
                  (fmt (format "%%%s%dd" prefix (length txt))))
@@ -1213,7 +1213,7 @@
       (when replace
         (goto-char (point-min))
         (while (not (eobp))
-          (setq z (cons (buffer-substring (point) (line-end-position)) z))
+          (setq z (cons (filter-buffer-substring (point) (line-end-position)) z))
           (forward-line 1))))
     (if (not cua--debug)
 	(kill-buffer auxbuf))
--- a/lisp/erc/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/erc/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -197,7 +197,7 @@
 
 	* erc.el (erc-version-string): Release ERC 5.1.1.
 
-2006-02-03  Zhang Wei  <id.brep@gmail.com>  (tiny change)
+2006-02-03  Zhang Wei  <id.brep@gmail.com>
 
 	* erc.el (erc-version-string): Don't hard-code Emacs version.
 	(erc-version): Use emacs-version.
--- a/lisp/files.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/files.el	Mon Apr 10 14:52:24 2006 +0000
@@ -2323,40 +2323,44 @@
 
 ;; Safe local variables:
 ;;
-;; For variables defined by minor modes, put the safety declarations
-;; here, not in the file defining the minor mode (when Emacs visits a
-;; file specifying that local variable, the minor mode file may not be
-;; loaded yet).  For variables defined by major modes, the safety
-;; declarations can go into the major mode's file, since that will be
-;; loaded before file variables are processed.
-
+;; For variables defined by major modes, the safety declarations can go into
+;; the major mode's file, since that will be loaded before file variables are
+;; processed.
+;;
+;; For variables defined by minor modes, put the safety declarations in the
+;; file defining the minor mode after the defcustom/defvar using an autoload
+;; cookie, e.g.:
+;;
+;;   ;;;###autoload(put 'variable 'safe-local-variable 'stringp)
+;;
+;; Otherwise, when Emacs visits a file specifying that local variable, the
+;; minor mode file may not be loaded yet.
+;;
+;; For variables defined in the C source code the declaration should go here:
+
+;; FIXME: Some variables should be moved according to the rules above.
 (let ((string-or-null (lambda (a) (or (stringp a) (null a)))))
   (eval
    `(mapc (lambda (pair)
 	    (put (car pair) 'safe-local-variable (cdr pair)))
 	  '((byte-compile-dynamic . t)
+	    (byte-compile-dynamic-docstrings . t)
+	    (byte-compile-warnings . t)
 	    (c-basic-offset     .  integerp)
 	    (c-file-style       .  stringp)
 	    (c-indent-level     .  integerp)
 	    (comment-column     .  integerp)
-	    (compile-command    . ,string-or-null)
+	    (compile-command    .  string-or-null-p)
 	    (fill-column        .  integerp)
-	    (fill-prefix        . ,string-or-null)
+	    (fill-prefix        .  string-or-null-p)
 	    (indent-tabs-mode   .  t)
-	    (ispell-check-comments . (lambda (a)
-				       (memq a '(nil t exclusive))))
-	    (ispell-local-dictionary . ,string-or-null)
 	    (kept-new-versions  .  integerp)
+	    (left-margin        .  t)
 	    (no-byte-compile    .  t)
 	    (no-update-autoloads . t)
-	    (outline-regexp     . ,string-or-null)
-	    (page-delimiter     . ,string-or-null)
-	    (paragraph-start    . ,string-or-null)
-	    (paragraph-separate . ,string-or-null)
-	    (sentence-end       . ,string-or-null)
-	    (sentence-end-double-space . t)
-	    (tab-width          .  integerp)
-	    (truncate-lines     .  t)
+	    (outline-regexp     .  string-or-null-p)
+	    (tab-width          .  integerp) ;; C source code
+	    (truncate-lines     .  t) ;; C source code
 	    (version-control    .  t)))))
 
 (put 'c-set-style 'safe-local-eval-function t)
@@ -2389,8 +2393,8 @@
 n  -- to ignore the local variables list.")
 	  (if offer-save
 	      (insert "
-!  -- to apply the local variables list, and mark these values (*) as
-      safe (in the future, they can be set automatically.)\n\n")
+!  -- to apply the local variables list, and permanently mark these
+      values (*) as safe (in the future, they will be set automatically.)\n\n")
 	    (insert "\n\n"))
 	  (dolist (elt vars)
 	    (cond ((member elt unsafe-vars)
--- a/lisp/gnus/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/gnus/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,18 @@
+2006-04-06  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus-fun.el (gnus): Require it for gnus-directory.
+
+2006-04-04  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
+
+	* nnweb.el (nnweb-google-create-mapping): Update regexp.  Some
+	whitespace was matched into the url, which broke browsing hits
+	> 100 when mm-url-use-external was nil.
+
+2006-03-31  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus-group.el (gnus-group-update-tool-bar): Add :initialize and
+	:set.
+
 2006-03-23  Katsumi Yamaoka  <yamaoka@jpl.org>
 
 	* mml.el (mml-insert-mime): Ignore cached contents of
@@ -2132,6 +2147,10 @@
 	* nnrss.el (nnrss-fetch): Signal an error if w3-parse-buffer also
 	failed.
 
+2005-04-06  Joakim Verona  <joakim@verona.se>  (tiny change)
+
+	* nnrss.el (nnrss-read-group-data): Fix off-by-one error.
+
 2005-04-06  Jesper Harder  <harder@ifa.au.dk>
 
 	* mm-util.el (mm-subst-char-in-string): Support inplace.
@@ -2142,9 +2161,8 @@
 	(nnrss-request-delete-group): Use nnrss-make-filename.
 	(nnrss-read-server-data): Use nnrss-make-filename; use load.
 	(nnrss-save-server-data): Use nnrss-make-filename; use gnus-prin1.
-	(nnrss-read-group-data): Fix off-by-one error.  From Joakim Verona
-	<joakim@verona.se>; hash on description if link is missing; use
-	nnrss-make-filename; use load.
+	(nnrss-read-group-data): hash on description if link is missing;
+	use nnrss-make-filename; use load.
 	(nnrss-save-group-data): Use nnrss-make-filename; use gnus-prin1.
 	(nnrss-make-filename): New function.
 	(nnrss-close): New function.
@@ -2293,11 +2311,10 @@
 	* nnmaildir.el (nnmaildir-request-accept-article):
 	Use `nnheader-cancel-timer' for compatibility with current XEmacs.
 
-2005-03-13  Steve Youngs  <steve@sxemacs.org>
+2005-03-13  Andrey Slusar  <anrays@gmail.com>  (tiny change)
 
 	* gnus.el: Don't try and mark `gnus-agent-save-groups' as an
 	autoloaded function.
-	From: Andrey Slusar <anrays@gmail.com>.
 
 2005-03-13  Steve Youngs  <steve@sxemacs.org>
 
@@ -2659,6 +2676,11 @@
 	article buffer with a draft file.  This is a temporary measure
 	against the 2004-08-22 change to gnus-article-edit-mode.
 
+2004-11-02  From Ilya N. Golubev  <gin@mo.msk.ru>.
+
+	* mm-util.el (mm-mime-mule-charset-alist): Add the windows-1251
+	entry.
+
 2004-11-02  Katsumi Yamaoka  <yamaoka@jpl.org>
 
 	* html2text.el (html2text-get-attr): Remove unused argument `tag'.
@@ -2667,11 +2689,9 @@
 	* mm-util.el (mm-enrich-utf-8-by-mule-ucs): Fix cleaning of
 	after-load-alist.
 
-	* mm-util.el (mm-mime-mule-charset-alist): Add the windows-1251
-	entry.  From Ilya N. Golubev <gin@mo.msk.ru>.
-	(mm-enrich-utf-8-by-mule-ucs): New function run when Mule-UCS is
-	loaded under XEmacs.
-	(): Don't make duplicated entries in mm-mime-mule-charset-alist.
+	* mm-util.el (mm-enrich-utf-8-by-mule-ucs): New function run when
+	Mule-UCS is loaded under XEmacs.
+	(mm-mime-mule-charset-alist): Avoid duplicated entries.
 
 	* mm-util.el (mm-coding-system-p): Return a coding-system.
 	(mm-mime-mule-charset-alist): Use shift_jis instead of
@@ -3277,6 +3297,10 @@
 
 	* mm-decode.el (mm-copy-to-buffer): Don't use set-buffer-multibyte.
 
+2004-09-26  Christian Neukirchen  <chneukirchen@yahoo.de>  (tiny change)
+
+	* mm-util.el (mm-image-load-path): Handle nil in load-path.
+
 2004-09-26  Jesper Harder  <harder@ifa.au.dk>
 
 	* gnus-msg.el (gnus-post-news): Use blank Newsgroups line if
@@ -3306,9 +3330,6 @@
 	* gnus-cache.el (gnus-cache-save-buffers): Check if buffer is
 	alive.  Reported by Laurent Martelli <laurent@aopsys.com>.
 
-	* mm-util.el (mm-image-load-path): Handle nil in load-path.
-	From Christian Neukirchen <chneukirchen@yahoo.de>.
-
 	* html2text.el (html2text-replace-list): Add &amp; and &apos;.
 
 	* nnheader.el (nnheader-max-head-length): Increase to 8192.
@@ -3532,7 +3553,8 @@
 
 	* gnus-sum.el (gnus-summary-insert-subject): Remove list identifiers.
 
-	From Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp> (tiny change).
+2004-09-03  Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp>  (tiny change)
+
 	* spam-stat.el (spam-stat-reduce-size): Set spam-stat-dirty.
 	(spam-stat-save): Accept prefix argument.
 
@@ -3555,7 +3577,7 @@
 
 	* pgg-pgp.el (pgg-pgp-verify-region): Clean up.
 
-2004-05-19  Michael Schierl  <schierlm-usenet@gmx.de>
+2004-05-19  Michael Schierl  <schierlm-usenet@gmx.de>  (tiny change)
 
 	* pgg-pgp.el (pgg-pgp-verify-region): Default when signature
 	isn't a string.
@@ -3674,8 +3696,25 @@
 
 	* gnus-agent.el (gnus-agent-restore-gcc): Use ^ and regexp-quote.
 
-	* gnus-sum.el (gnus-newsgroup-variables): Doc fix (tiny change).
-	From Helmut Waitzmann <Helmut.Waitzmann@web.de>.
+2004-08-30  Helmut Waitzmann  <Helmut.Waitzmann@web.de>  (tiny change)
+
+	* gnus-sum.el (gnus-newsgroup-variables): Doc fix.
+
+2004-08-26  YAGI Tatsuya <ynyaaa@ybb.ne.jp>  (tiny change)
+
+	* gnus-art.el (gnus-article-next-page): Fix the way to find a real
+	end-of-buffer.
+
+2004-08-26  Stefan Wiens <s.wi@gmx.net>  (tiny change)
+
+	* gnus-sum.el (gnus-read-header): Don't remove a header for the
+	parent article of a sparse article in the thread hashtb.
+
+2004-08-26  David Hedbor <dhedbor@real.com>  (tiny change)
+
+	* nnmail.el (nnmail-split-lowercase-expanded): New user option.
+	(nnmail-expand-newtext): Lowercase expanded entries if
+	nnmail-split-lowercase-expanded is non-nil.
 
 	* gnus-agent.el (gnus-agent-regenerate-group): Activate the group
 	when the group's active is not available.
@@ -3683,8 +3722,6 @@
 	* gnus-art.el (article-hide-headers): Refer to the values for
 	gnus-ignored-headers and gnus-visible-headers in the summary
 	buffer since a user may have set them as group parameters.
-	(gnus-article-next-page): Fix the way to find a real end-of-buffer
-	(tiny change).  From YAGI Tatsuya <ynyaaa@ybb.ne.jp>.
 	(gnus-article-read-summary-keys): Restore new window-start and
 	hscroll to summary window.
 	(gnus-prev-page-map): Remove duplicated one.
@@ -3713,10 +3750,6 @@
 	* gnus-spec.el (gnus-update-format): Replace pp-to-string with
 	gnus-pp-to-string.
 
-	* gnus-sum.el (gnus-read-header): Don't remove a header for the
-	parent article of a sparse article in the thread hashtb.
-	From Stefan Wiens <s.wi@gmx.net>.
-
 	* gnus-util.el (gnus-bind-print-variables): New macro.
 	(gnus-prin1): Use it.
 	(gnus-prin1-to-string): Use it.
@@ -3756,11 +3789,6 @@
 	(nndoc-rfc822-forward-generate-article): New function.
 	(nndoc-rfc822-forward-generate-head): New function.
 
-	From David Hedbor <dhedbor@real.com>.
-	* nnmail.el (nnmail-split-lowercase-expanded): New user option.
-	(nnmail-expand-newtext): Lowercase expanded entries if
-	nnmail-split-lowercase-expanded is non-nil.
-
 	* score-mode.el (gnus-score-pretty-print): Replace pp with gnus-pp.
 
 	* webmail.el (webmail-debug): Replace pp with gnus-pp.
--- a/lisp/gnus/gnus-fun.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/gnus/gnus-fun.el	Mon Apr 10 14:52:24 2006 +0000
@@ -32,6 +32,7 @@
 (require 'mm-util)
 (require 'gnus-ems)
 (require 'gnus-util)
+(require 'gnus)
 
 (defcustom gnus-x-face-directory (expand-file-name "x-faces" gnus-directory)
   "*Directory where X-Face PBM files are stored."
--- a/lisp/gnus/gnus-group.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/gnus/gnus-group.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1389,6 +1389,13 @@
   "Force updating the group buffer tool bar."
   :group 'gnus-group
   :version "22.1"
+  :initialize 'custom-initialize-default
+  :set (lambda (symbol value)
+	 (set-default symbol value)
+	 (when (gnus-alive-p)
+	   (with-current-buffer gnus-group-buffer
+	     ;; FIXME: Is there a better way to redraw the group buffer?
+	     (gnus-group-get-new-news 0))))
   :type 'boolean)
 
 (defun gnus-group-insert-group-line (gnus-tmp-group gnus-tmp-level
--- a/lisp/gnus/nnweb.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/gnus/nnweb.el	Mon Apr 10 14:52:24 2006 +0000
@@ -415,7 +415,7 @@
 	    (goto-char (point-min))
 	    (incf i 100)
 	    (if (or (not (re-search-forward
-			  "<a href=\"\n\\([^>\"]+\\)\"><img src=\"[^\"]+next"
+			  "<a href=\"\n\\([^>\" \n\t]+\\)[^<]*<img src=[^>]+next"
 			  nil t))
 		    (>= i nnweb-max-hits))
 		(setq more nil)
--- a/lisp/ibuf-macs.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/ibuf-macs.el	Mon Apr 10 14:52:24 2006 +0000
@@ -75,8 +75,8 @@
 ;; (put 'ibuffer-save-marks 'lisp-indent-function 0)
 
 ;;;###autoload
-(defmacro* define-ibuffer-column (symbol (&key name inline props
-					       summarizer) &rest body)
+(defmacro* define-ibuffer-column (symbol (&key name inline props summarizer 
+					       header-mouse-map) &rest body)
   "Define a column SYMBOL for use with `ibuffer-formats'.
 
 BODY will be called with `buffer' bound to the buffer object, and
@@ -90,6 +90,9 @@
 function which will be passed a list of all the strings in its column;
 it should return a string to display at the bottom.
 
+If HEADER-MOUSE-MAP is given, it will be used as a keymap for the
+title of the column.
+
 Note that this macro expands into a `defun' for a function named
 ibuffer-make-column-NAME.  If INLINE is non-nil, then the form will be
 inlined into the compiled format versions.  This means that if you
@@ -115,6 +118,7 @@
 	    ,(if (stringp name)
 		 name
 	       (capitalize (symbol-name symbol))))
+       ,(if header-mouse-map `(put (quote ,sym) 'header-mouse-map ,header-mouse-map))
        ,(if summarizer
 	    ;; Store the name of the summarizing function.
 	    `(put (quote ,sym) 'ibuffer-column-summarizer
--- a/lisp/ibuffer.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/ibuffer.el	Mon Apr 10 14:52:24 2006 +0000
@@ -829,6 +829,21 @@
     (define-key map (kbd "RET") 'ibuffer-interactive-filter-by-mode)
     map))
 
+(defvar ibuffer-name-header-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(mouse-1)] 'ibuffer-do-sort-by-alphabetic)
+    map))
+
+(defvar ibuffer-size-header-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(mouse-1)] 'ibuffer-do-sort-by-size)
+    map))
+
+(defvar ibuffer-mode-header-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(mouse-1)] 'ibuffer-do-sort-by-major-mode)
+    map))
+
 (defvar ibuffer-mode-filter-group-map
   (let ((map (make-sparse-keymap)))
     (define-key map [(mouse-1)] 'ibuffer-mouse-toggle-mark)
@@ -1666,6 +1681,7 @@
 
 (define-ibuffer-column name
   (:inline t
+   :header-mouse-map ibuffer-name-header-map
    :props
    ('mouse-face 'highlight 'keymap ibuffer-name-map
 		'ibuffer-name-column t
@@ -1682,6 +1698,7 @@
 
 (define-ibuffer-column size
   (:inline t
+   :header-mouse-map ibuffer-size-header-map
    :summarizer
    (lambda (column-strings)
      (let ((total 0))
@@ -1695,6 +1712,7 @@
 
 (define-ibuffer-column mode
   (:inline t
+   :header-mouse-map ibuffer-mode-header-map
    :props
    ('mouse-face 'highlight
 		'keymap ibuffer-mode-name-map
@@ -2009,12 +2027,18 @@
 		  (setq min (- min)))
 		(let* ((name (or (get sym 'ibuffer-column-name)
 				 (error "Unknown column %s in ibuffer-formats" sym)))
-		       (len (length name)))
-		  (if (< len min)
-		      (ibuffer-format-column name
-					     (- min len)
-					     align)
-		    name))))))
+		       (len (length name))
+		       (hmap (get sym 'header-mouse-map))
+		       (strname (if (< len min)
+				    (ibuffer-format-column name
+							   (- min len)
+							   align)
+				  name)))
+		  (when hmap
+		    (setq
+		     strname 
+		     (propertize strname 'mouse-face 'highlight 'keymap hmap)))
+		  strname)))))
 	 (add-text-properties opos (point) `(ibuffer-title-header t))
 	 (insert "\n")
 	 ;; Add the underlines
--- a/lisp/ido.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/ido.el	Mon Apr 10 14:52:24 2006 +0000
@@ -360,7 +360,10 @@
   :initialize 'custom-initialize-set
   :require 'ido
   :link '(emacs-commentary-link "ido.el")
-  :set-after '(ido-save-directory-list-file)
+  :set-after '(ido-save-directory-list-file
+	       ;; This will clear ido-unc-hosts-cache, so set it
+	       ;; before loading history file.
+	       ido-unc-hosts)
   :type '(choice (const :tag "Turn on only buffer" buffer)
                  (const :tag "Turn on only file" file)
                  (const :tag "Turn on both buffer and file" both)
@@ -630,22 +633,44 @@
   :type '(repeat regexp)
   :group 'ido)
 
+(defvar ido-unc-hosts-cache t
+  "Cached value from `ido-unc-hosts' function.")
+
 (defcustom ido-unc-hosts nil
-  "*List of known UNC host names to complete after initial //."
-  :type '(repeat string)
+  "*List of known UNC host names to complete after initial //.
+If value is a function, that function is called to search network for
+hosts on first use of UNC path."
+  :type '(choice (repeat :tag "List of UNC host names" string)
+		 (function-item :tag "Use `NET VIEW'"
+				:value ido-unc-hosts-net-view)
+		 (function :tag "Your own function"))
+  :set #'(lambda (symbol value)
+	   (set symbol value)
+	   (setq ido-unc-hosts-cache t))
+  :group 'ido)
+
+(defcustom ido-downcase-unc-hosts t
+  "*Non-nil if UNC host names should be downcased."
+  :type 'boolean
+  :group 'ido)
+
+(defcustom ido-ignore-unc-host-regexps nil
+  "*List of regexps matching UNC hosts to ignore.
+Case is ignored if `ido-downcase-unc-hosts' is set."
+  :type '(repeat regexp)
   :group 'ido)
 
 (defcustom ido-cache-unc-host-shares-time 8.0
   "*Maximum time to cache shares of an UNC host (in hours).
 Use C-l in prompt to refresh list.
-If zero, unc host shares are not cached."
+If zero, UNC host shares are not cached."
   :type 'number
   :group 'ido)
 
 (defcustom ido-max-work-file-list 10
   "*Maximum number of names of recently opened files to record.
 This is the list the file names (sans directory) which have most recently
-been opened. See `ido-work-file-list' and `ido-save-directory-list-file'."
+been opened.  See `ido-work-file-list' and `ido-save-directory-list-file'."
   :type 'integer
   :group 'ido)
 
@@ -891,7 +916,7 @@
   :group 'ido)
 
 (defcustom ido-read-file-name-as-directory-commands '()
-  "List of commands which uses read-file-name to read a directory name.
+  "List of commands which uses `read-file-name' to read a directory name.
 When `ido-everywhere' is non-nil, the commands in this list will read
 the directory using `ido-read-directory-name'."
   :type '(repeat symbol)
@@ -988,7 +1013,7 @@
   "List of files currently matching `ido-text'.")
 
 (defvar ido-report-no-match t
-  "Report [No Match] when no completions matches ido-text.")
+  "Report [No Match] when no completions matches `ido-text'.")
 
 (defvar ido-exit nil
   "Flag to monitor how `ido-find-file' exits.
@@ -1111,18 +1136,65 @@
 	  (pop-to-buffer b t t)
 	  (setq truncate-lines t)))))
 
+(defun ido-unc-hosts (&optional query)
+  "Return list of UNC host names."
+  (let ((hosts
+	 (cond
+	  ((listp ido-unc-hosts)
+	   ido-unc-hosts)		;; static list or nil
+	  ((listp ido-unc-hosts-cache)
+	   ido-unc-hosts-cache)	;; result of net search
+	  ((and query (fboundp ido-unc-hosts))
+	   (message (propertize "Searching for UNC hosts..." 'face 'highlight))
+	   (setq ido-unc-hosts-cache (funcall ido-unc-hosts))
+	   (message nil)
+	   ido-unc-hosts-cache)
+	  (query
+	   (setq ido-unc-hosts-cache nil))
+	  (t (fboundp ido-unc-hosts)))))
+    (when query
+      (let ((case-fold-search ido-downcase-unc-hosts)
+	    res host re-list re)
+	(while hosts
+	  (setq host (car hosts)
+		hosts (cdr hosts)
+		re-list (and ido-process-ignore-lists
+			     ido-ignore-unc-host-regexps))
+	  (while re-list
+	    (setq re (car re-list)
+		  re-list (cdr re-list))
+	    (if (string-match re host)
+		(setq re-list nil
+		      host nil)))
+	  (when host
+	    (when ido-downcase-unc-hosts
+	      (setq host (downcase host)))
+	    (setq res (cons host res))))
+	(setq hosts (sort res #'string<))))
+    hosts))
+
+(defun ido-unc-hosts-net-view ()
+  "Query network for list of UNC host names using `NET VIEW'."
+  (let (hosts)
+    (with-temp-buffer
+      (shell-command "net view" t)
+      (goto-char (point-min))
+      (while (re-search-forward "^\\\\\\\\\\([[:graph:]]+\\)" nil t)
+	(setq hosts (cons (match-string 1) hosts))))
+    hosts))
+
 (defun ido-is-tramp-root (&optional dir)
   (and ido-enable-tramp-completion
        (string-match "\\`/[^/]+[@:]\\'"
 		     (or dir ido-current-directory))))
 
 (defun ido-is-unc-root (&optional dir)
-  (and ido-unc-hosts
+  (and (ido-unc-hosts)
        (string-equal "//"
 		     (or dir ido-current-directory))))
 
 (defun ido-is-unc-host (&optional dir)
-  (and ido-unc-hosts
+  (and (ido-unc-hosts)
        (string-match "\\`//[^/]+/\\'"
 		     (or dir ido-current-directory))))
 
@@ -1221,6 +1293,9 @@
 	    (ido-pp 'ido-work-directory-list)
 	    (ido-pp 'ido-work-file-list)
 	    (ido-pp 'ido-dir-file-cache "\n\n ")
+	    (if (listp ido-unc-hosts-cache)
+		(ido-pp 'ido-unc-hosts-cache)
+	      (insert "\n;; ----- ido-unc-hosts-cache -----\nt\n"))
 	    (insert "\n")
 	    (write-file ido-save-directory-list-file nil))
 	(kill-buffer buf)))))
@@ -1242,7 +1317,8 @@
 		    (setq ido-last-directory-list (read (current-buffer))
 			  ido-work-directory-list (read (current-buffer))
 			  ido-work-file-list (read (current-buffer))
-			  ido-dir-file-cache (read (current-buffer)))
+			  ido-dir-file-cache (read (current-buffer))
+			  ido-unc-hosts-cache (read (current-buffer)))
 		  (error nil)))
 	    (kill-buffer buf)))))
   (ido-wash-history))
@@ -1699,7 +1775,7 @@
 ;;       the relevant function is called (find-file, write-file, etc).
 
 (defun ido-read-internal (item prompt history &optional default require-match initial)
-  "Perform the ido-read-buffer and ido-read-file-name functions.
+  "Perform the `ido-read-buffer' and `ido-read-file-name' functions.
 Return the name of a buffer or file selected.
 PROMPT is the prompt to give to the user.
 DEFAULT if given is the default directory to start with.
@@ -2523,7 +2599,9 @@
   (interactive)
   (if (and ido-mode (eq ido-cur-item 'file))
       (progn
-	(ido-remove-cached-dir ido-current-directory)
+	(if (ido-is-unc-root)
+	    (setq ido-unc-hosts-cache t)
+	  (ido-remove-cached-dir ido-current-directory))
 	(setq ido-text-init ido-text)
 	(setq ido-rotate-temp t)
 	(setq ido-exit 'refresh)
@@ -3238,7 +3316,7 @@
     (mapcar
      (lambda (host)
        (if (string-match "/\\'" host) host (concat host "/")))
-     ido-unc-hosts))
+     (ido-unc-hosts t)))
    ((and (numberp ido-max-dir-file-cache) (> ido-max-dir-file-cache 0)
 	 (stringp dir) (> (length dir) 0)
 	 (ido-may-cache-directory dir))
@@ -3734,7 +3812,7 @@
 in another frame.
 
 As you type in a string, all of the buffers matching the string are
-displayed if substring-matching is used \(default). Look at
+displayed if substring-matching is used \(default).  Look at
 `ido-enable-prefix' and `ido-toggle-prefix'.  When you have found the
 buffer you want, it can then be selected.  As you type, most keys have
 their normal keybindings, except for the following: \\<ido-buffer-completion-map>
@@ -3757,7 +3835,7 @@
 \\[ido-toggle-prefix] Toggle between substring and prefix matching.
 \\[ido-toggle-case] Toggle case-sensitive searching of buffer names.
 \\[ido-completion-help] Show list of matching buffers in separate window.
-\\[ido-enter-find-file] Drop into ido-find-file.
+\\[ido-enter-find-file] Drop into `ido-find-file'.
 \\[ido-kill-buffer-at-head] Kill buffer at head of buffer list.
 \\[ido-toggle-ignore] Toggle ignoring buffers listed in `ido-ignore-buffers'."
   (interactive)
@@ -4026,7 +4104,7 @@
 	   ((and (ido-is-tramp-root) (string-equal contents "/"))
 	    (ido-set-current-directory ido-current-directory contents)
 	    (setq refresh t))
-	   ((and ido-unc-hosts (string-equal contents "/")
+	   ((and (ido-unc-hosts) (string-equal contents "/")
 		 (let ((ido-enable-tramp-completion nil))
 		   (ido-is-root-directory)))
 	    (ido-set-current-directory "//")
--- a/lisp/info.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/info.el	Mon Apr 10 14:52:24 2006 +0000
@@ -3044,7 +3044,11 @@
 (defun Info-follow-nearest-node (&optional fork)
   "Follow a node reference near point.
 If point is on a reference, follow that reference.  Otherwise,
-if point is in a menu item description, follow that menu item."
+if point is in a menu item description, follow that menu item.
+
+If FORK is non-nil (interactively with a prefix arg), show the node in
+a new Info buffer.
+If FORK is a string, it is the name to use for the new buffer."
   (interactive "P")
   (or (Info-try-follow-nearest-node fork)
       (when (save-excursion
--- a/lisp/international/characters.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/international/characters.el	Mon Apr 10 14:52:24 2006 +0000
@@ -177,6 +177,17 @@
     (modify-category-entry (make-char 'chinese-gb2312 row) ?C)
     (setq row (1+ row))))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 26)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x23 (+ #x41 i))
+			  (make-char 'chinese-gb2312 #x23 (+ #x61 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x26 (+ #x21 i))
+			  (make-char 'chinese-gb2312 #x26 (+ #x41 i)) tbl))
+  (dotimes (i 33)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x27 (+ #x21 i))
+			  (make-char 'chinese-gb2312 #x27 (+ #x51 i)) tbl)))
+
 ;; Chinese character set (BIG5)
 
 (let ((from (decode-big5-char #xA141))
@@ -217,6 +228,17 @@
   (modify-category-entry generic-big5-1-char ?\|)
   (modify-category-entry generic-big5-2-char ?\|))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 22)
+    (set-case-syntax-pair (decode-big5-char (+ #xA2CF i))
+			  (decode-big5-char (+ #xA2CF i 26)) tbl))
+  (dotimes (i 4)
+    (set-case-syntax-pair (decode-big5-char (+ #xA2E4 i))
+			  (decode-big5-char (+ #xA340 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (decode-big5-char (+ #xA344 i))
+			  (decode-big5-char (+ #xA344 i 24)) tbl)))
+
 
 ;; Chinese character set (CNS11643)
 
@@ -629,6 +651,17 @@
     (modify-category-entry (car chars) ?C)
     (setq chars (cdr chars))))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 26)
+    (set-case-syntax-pair (make-char 'japanese-jisx0208 #x23 (+ #x41 i))
+			  (make-char 'japanese-jisx0208 #x23 (+ #x61 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (make-char 'japanese-jisx0208 #x26 (+ #x21 i))
+			  (make-char 'japanese-jisx0208 #x26 (+ #x41 i)) tbl))
+  (dotimes (i 33)
+    (set-case-syntax-pair (make-char 'japanese-jisx0208 #x27 (+ #x21 i))
+			  (make-char 'japanese-jisx0208 #x27 (+ #x51 i)) tbl)))
+
 ;; JISX0212
 ;; (modify-syntax-entry (make-char 'japanese-jisx0212) "w")
 (modify-syntax-entry (make-char 'japanese-jisx0212 33) "_")
@@ -674,6 +707,20 @@
     (modify-syntax-entry open (format "(%c" close))
     (modify-syntax-entry close (format ")%c" open))))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 26)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x23 (+ #x41 i))
+			  (make-char 'korean-ksc5601 #x23 (+ #x61 i)) tbl))
+  (dotimes (i 10)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x25 (+ #x21 i))
+			  (make-char 'korean-ksc5601 #x25 (+ #x30 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x25 (+ #x41 i))
+			  (make-char 'korean-ksc5601 #x25 (+ #x61 i)) tbl))
+  (dotimes (i 33)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x2C (+ #x21 i))
+			  (make-char 'korean-ksc5601 #x2C (+ #x51 i)) tbl)))
+
 ;; Latin character set (latin-1,2,3,4,5,8,9)
 
 (modify-category-entry (make-char 'latin-iso8859-1) ?l)
--- a/lisp/international/mule-cmds.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/international/mule-cmds.el	Mon Apr 10 14:52:24 2006 +0000
@@ -2135,6 +2135,7 @@
     ("cy" "Welsh" iso-8859-14)
     ("da" . "Latin-1") ; Danish
     ("de" "German" iso-8859-1)
+    ; dv Divehi
     ; dz Bhutani
     ("el" "Greek" iso-8859-7)
     ;; Users who specify "en" explicitly typically want Latin-1, not ASCII.
@@ -2296,6 +2297,10 @@
     ("jp" . "Japanese") ; e.g. MS Windows
     ("chs" . "Chinese-GB") ; MS Windows Chinese Simplified
     ("cht" . "Chinese-BIG5") ; MS Windows Chinese Traditional
+    ("gbz" . "UTF-8") ; MS Windows Dari Persian
+    ("div" . "UTF-8") ; MS Windows Divehi (Maldives)
+    ("wee" . "Latin-2") ; MS Windows Lower Sorbian
+    ("wen" . "Latin-2") ; MS Windows Upper Sorbian
     ))
   "Alist of locale regexps vs the corresponding languages and coding systems.
 Each element has these form:
@@ -2501,6 +2506,8 @@
 	     (locale-name-match locale locale-language-names))
 	    (charset-language-name
 	     (locale-name-match locale locale-charset-language-names))
+	    (default-eol-type (coding-system-eol-type
+			       default-buffer-file-coding-system))
 	    (coding-system
 	     (or (locale-name-match locale locale-preferred-coding-systems)
 		 (when locale
@@ -2521,6 +2528,13 @@
 	  (if (not language-name)
 	      (setq language-name charset-language-name)))
 
+	;; If a specific EOL conversion was specified in the default
+	;; buffer-file-coding-system, preserve it in the coding system
+	;; we will be using from now on.
+	(if (memq default-eol-type '(0 1 2 unix dos mac))
+	    (setq coding-system (coding-system-change-eol-conversion
+				 coding-system default-eol-type)))
+
 	(when language-name
 
 	  ;; Set up for this character set.  This is now the right way
--- a/lisp/mail/rmail.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/mail/rmail.el	Mon Apr 10 14:52:24 2006 +0000
@@ -623,7 +623,9 @@
 
 ;;;###autoload
 (defvar rmail-mime-charset-pattern
-  "^content-type:[ ]*text/plain;[ \t\n]*charset=\"?\\([^ \t\n\";]+\\)\"?"
+  (concat "^content-type:[ ]*text/plain;"
+	  "\\(?:[ \t\n]*\\(format\\|delsp\\)=\"?[-a-z0-9]+\"?;\\)*"
+	  "[ \t\n]*charset=\"?\\([^ \t\n\";]+\\)\"?")
   "Regexp to match MIME-charset specification in a header of message.
 The first parenthesized expression should match the MIME-charset name.")
 
--- a/lisp/man.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/man.el	Mon Apr 10 14:52:24 2006 +0000
@@ -416,6 +416,9 @@
   (define-key Man-mode-map "k"    'Man-kill)
   (define-key Man-mode-map "q"    'Man-quit)
   (define-key Man-mode-map "m"    'man)
+  ;; Not all the man references get buttons currently. The text in the
+  ;; manual page can contain references to other man pages
+  (define-key Man-mode-map "\r"   'man-follow)
   (define-key Man-mode-map "?"    'describe-mode))
 
 ;; buttons
@@ -423,10 +426,13 @@
   'follow-link t
   'help-echo "mouse-2, RET: display this man page"
   'func nil
-  'action (lambda (button) (funcall 
-			    (button-get button 'func)
-			    (or (button-get button 'Man-target-string)
-				(button-label button)))))
+  'action (lambda (button) 
+	    (funcall 
+	     (button-get button 'func)
+	     (let ((func (button-get button 'Man-target-string)))
+	       (if func
+		   (if (functionp func) (funcall func) func)
+		 (button-label button))))))
 
 (define-button-type 'Man-xref-man-page 
   :supertype 'Man-abstract-xref-man-page
@@ -929,15 +935,14 @@
     (setq Man-arguments ""))
   (if (string-match "-k " Man-arguments)
       (progn
-	(Man-highlight-references0 nil Man-reference-regexp 1 nil
+	(Man-highlight-references0 nil Man-reference-regexp 1
+				   'Man-default-man-entry
 				   (or xref-man-type 'Man-xref-man-page))
 	(Man-highlight-references0 nil Man-apropos-regexp 1
-				   (lambda ()
-				     (format "%s(%s)"
-					     (match-string 1)
-					     (match-string 2)))
+				   'Man-default-man-entry
 				   (or xref-man-type 'Man-xref-man-page)))
-    (Man-highlight-references0 Man-see-also-regexp Man-reference-regexp 1 nil
+    (Man-highlight-references0 Man-see-also-regexp Man-reference-regexp 1 
+			       'Man-default-man-entry
 			       (or xref-man-type 'Man-xref-man-page))
     (Man-highlight-references0 Man-synopsis-regexp Man-header-regexp 0 2
 			       'Man-xref-header-file)
@@ -966,7 +971,7 @@
 			     ((numberp target) 
 			      (match-string target))
 			     ((functionp target)
-			      (funcall target))
+			      target)
 			     (t nil)))))))
 
 (defun Man-cleanup-manpage (&optional interactive)
--- a/lisp/mh-e/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/mh-e/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,15 @@
+2006-04-07  Bill Wohler  <wohler@newt.com>
+
+	* mh-e.el (mh-path, mh-variant): Define with mh-defcustom and add
+	:package-version keyword.
+
+2006-03-31  Bill Wohler  <wohler@newt.com>
+
+	* mh-e.el (mh-strip-package-version): Move before use to avoid
+	compiler error. Make macro, also to avoid compiler error.
+	(mh-defface-compat): Incorporate body into mh-face-data and
+	delete.
+
 2006-03-30  Bill Wohler  <wohler@newt.com>
 
 	* mh-e.el (mh-defcustom, mh-defface, mh-defgroup): Macros to
--- a/lisp/mh-e/mh-e.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/mh-e/mh-e.el	Mon Apr 10 14:52:24 2006 +0000
@@ -644,13 +644,66 @@
 
 
 
+;;; MH-E Customization Support Routines
+
+;; Shush compiler (Emacs 21 and XEmacs).
+(defvar customize-package-emacs-version-alist)
+
+;; Temporary function and data structure used customization.
+;; These will be unbound after the options are defined.
+(defmacro mh-strip-package-version (args)
+  "Strip :package-version keyword and its value from ARGS.
+In Emacs versions that support the :package-version keyword,
+ARGS is returned unchanged."
+  `(if (boundp 'customize-package-emacs-version-alist)
+       ,args
+     (let (seen)
+       (loop for keyword in ,args
+             if (cond ((eq keyword ':package-version) (setq seen t) nil)
+                      (seen (setq seen nil) nil)
+                      (t t))
+             collect keyword))))
+
+(defmacro mh-defgroup (symbol members doc &rest args)
+  "Declare SYMBOL as a customization group containing MEMBERS.
+See documentation for `defgroup' for a description of the arguments
+SYMBOL, MEMBERS, DOC and ARGS.
+This macro is used by Emacs versions that lack the :package-version
+keyword, introduced in Emacs 22."
+  (declare (doc-string 3))
+  `(defgroup ,symbol ,members ,doc ,@(mh-strip-package-version args)))
+(put 'mh-defgroup 'lisp-indent-function 'defun)
+
+(defmacro mh-defcustom (symbol value doc &rest args)
+  "Declare SYMBOL as a customizable variable that defaults to VALUE.
+See documentation for `defcustom' for a description of the arguments
+SYMBOL, VALUE, DOC and ARGS.
+This macro is used by Emacs versions that lack the :package-version
+keyword, introduced in Emacs 22."
+  (declare (doc-string 3))
+  `(defcustom ,symbol ,value ,doc ,@(mh-strip-package-version args)))
+(put 'mh-defcustom 'lisp-indent-function 'defun)
+
+(defmacro mh-defface (face spec doc &rest args)
+  "Declare FACE as a customizable face that defaults to SPEC.
+See documentation for `defface' for a description of the arguments
+FACE, SPEC, DOC and ARGS.
+This macro is used by Emacs versions that lack the :package-version
+keyword, introduced in Emacs 22."
+  (declare (doc-string 3))
+  `(defface ,face ,spec ,doc ,@(mh-strip-package-version args)))
+(put 'mh-defface 'lisp-indent-function 'defun)
+
+
+
 ;;; Variant Support
 
-(defcustom mh-path nil
+(mh-defcustom mh-path nil
   "*Additional list of directories to search for MH.
 See `mh-variant'."
   :group 'mh-e
-  :type '(repeat (directory)))
+  :type '(repeat (directory))
+  :package-version '(MH-E "8.0"))
 
 (defun mh-variants ()
   "Return a list of installed variants of MH on the system.
@@ -859,7 +912,7 @@
                (mapconcat '(lambda (x) (format "%s" (car x)))
                           (mh-variants) " or "))))))
 
-(defcustom mh-variant 'autodetect
+(mh-defcustom mh-variant 'autodetect
   "*Specifies the variant used by MH-E.
 
 The default setting of this option is \"Auto-detect\" which means
@@ -884,61 +937,8 @@
   :set (lambda (symbol value)
          (set-default symbol value)     ;Done in mh-variant-set-variant!
          (mh-variant-set value))
-  :group 'mh-e)
-
-
-
-;;; MH-E Customization Support Routines
-
-;; Shush compiler (Emacs 21 and XEmacs).
-(defvar customize-package-emacs-version-alist)
-
-;; Temporary function and data structure used customization.
-;; These will be unbound after the options are defined.
-(defmacro mh-defgroup (symbol members doc &rest args)
-  "Declare SYMBOL as a customization group containing MEMBERS.
-See documentation for `defgroup' for a description of the arguments
-SYMBOL, MEMBERS, DOC and ARGS.
-This macro is used by Emacs versions that lack the :package-version
-keyword, introduced in Emacs 22."
-  (declare (doc-string 3))
-  `(defgroup ,symbol ,members ,doc ,@(mh-strip-package-version args)))
-(put 'mh-defgroup 'lisp-indent-function 'defun)
-
-(defmacro mh-defcustom (symbol value doc &rest args)
-  "Declare SYMBOL as a customizable variable that defaults to VALUE.
-See documentation for `defcustom' for a description of the arguments
-SYMBOL, VALUE, DOC and ARGS.
-This macro is used by Emacs versions that lack the :package-version
-keyword, introduced in Emacs 22."
-  (declare (doc-string 3))
-  `(defcustom ,symbol ,value ,doc ,@(mh-strip-package-version args)))
-(put 'mh-defcustom 'lisp-indent-function 'defun)
-
-(defmacro mh-defface (face spec doc &rest args)
-  "Declare FACE as a customizable face that defaults to SPEC.
-See documentation for `defface' for a description of the arguments
-FACE, SPEC, DOC and ARGS.
-This macro is used by Emacs versions that lack the :package-version
-keyword, introduced in Emacs 22."
-  (declare (doc-string 3))
-  `(defface ,face ,spec ,doc ,@(mh-strip-package-version args)))
-(put 'mh-defface 'lisp-indent-function 'defun)
-
-;;;###autoload
-(defun mh-strip-package-version (args)
-  "Strip :package-version keyword and its value from ARGS.
-In Emacs versions that support the :package-version keyword,
-ARGS is returned unchanged."
-  (if (boundp 'customize-package-emacs-version-alist)
-      args
-    (let (seen)
-      (loop for keyword in args
-            if (cond ((eq keyword ':package-version) (setq seen t) nil)
-                     (seen (setq seen nil) nil)
-                     (t t))
-            collect keyword))))
-
+  :group 'mh-e
+  :package-version '(MH-E "8.0"))
 
 
 
@@ -3117,46 +3117,12 @@
 (if (boundp 'facemenu-unlisted-faces)
     (add-to-list 'facemenu-unlisted-faces "^mh-"))
 
-;; Temporary function and data structure used for defining faces.
-;; These will be unbound after the faces are defined.
-(defvar mh-min-colors-defined-flag (and (not mh-xemacs-flag)
-                                        (>= emacs-major-version 22))
-  "Non-nil means `defface' supports min-colors display requirement.")
-
-(defun mh-defface-compat (spec)
-  "Convert SPEC for defface if necessary to run on older platforms.
-Modifies SPEC in place and returns it. See `defface' for the spec definition.
-
-When `mh-min-colors-defined-flag' is nil, this function finds
-display entries with \"min-colors\" requirements and either
-removes the \"min-colors\" requirement or strips the display
-entirely if the display does not support the number of specified
-colors."
-  (if mh-min-colors-defined-flag
-      spec
-    (let ((cells (mh-display-color-cells))
-          new-spec)
-      ;; Remove entries with min-colors, or delete them if we have fewer colors
-      ;; than they specify.
-      (loop for entry in (reverse spec) do
-            (let ((requirement (if (eq (car entry) t)
-                                   nil
-                                 (assoc 'min-colors (car entry)))))
-              (if requirement
-                  (when (>= cells (nth 1 requirement))
-                    (setq new-spec (cons (cons (delq requirement (car entry))
-                                               (cdr entry))
-                                         new-spec)))
-                (setq new-spec (cons entry new-spec)))))
-      new-spec)))
-
-(require 'cus-face)
-
-(defvar mh-inherit-face-flag (assq :inherit custom-face-attributes)
-  "Non-nil means that the `defface' :inherit keyword is available.
-The :inherit keyword is available on all supported versions of
-GNU Emacs and XEmacs from at least 21.5.23 on.")
-
+;; To add a new face:
+;; 1. Add entry to variable mh-face-data.
+;; 2. Create face using mh-defface (which removes min-color spec and
+;;    :package-version keyword where these are not supported),
+;;    accessing face data with function mh-face-data.
+;; 3. Add inherit argument to function mh-face-data if applicable.
 (defvar mh-face-data
   '((mh-folder-followup
      ((((class color) (background light))
@@ -3299,19 +3265,61 @@
       (((class color) (background dark))
        (:foreground "red1" :underline t))
       (t
-       (:underline t))))))
+       (:underline t)))))
+  "MH-E face data.
+Used by function `mh-face-data' which returns spec that is
+consumed by `mh-defface'.")
+
+(require 'cus-face)
+
+(defvar mh-inherit-face-flag (assq :inherit custom-face-attributes)
+  "Non-nil means that the `defface' :inherit keyword is available.
+The :inherit keyword is available on all supported versions of
+GNU Emacs and XEmacs from at least 21.5.23 on.")
+
+(defvar mh-min-colors-defined-flag (and (not mh-xemacs-flag)
+                                        (>= emacs-major-version 22))
+  "Non-nil means `defface' supports min-colors display requirement.")
 
 (defun mh-face-data (face &optional inherit)
   "Return spec for FACE.
+See `defface' for the spec definition.
+
 If INHERIT is non-nil and `defface' supports the :inherit
-keyword, return INHERIT literally; otherwise, return spec for FACE.
-
-This isn't a perfect implementation. In the case that
-the :inherit keyword is not supported, any additional attributes
-in the inherit parameter are not added to the returned spec."
-  (if (and inherit mh-inherit-face-flag)
-      inherit
-    (mh-defface-compat (cadr (assoc face mh-face-data)))))
+keyword, return INHERIT literally; otherwise, return spec for
+FACE from the variable `mh-face-data'. This isn't a perfect
+implementation. In the case that the :inherit keyword is not
+supported, any additional attributes in the inherit parameter are
+not added to the returned spec.
+
+Furthermore, when `mh-min-colors-defined-flag' is nil, this
+function finds display entries with \"min-colors\" requirements
+and either removes the \"min-colors\" requirement or strips the
+display entirely if the display does not support the number of
+specified colors."
+  (let ((spec
+         (if (and inherit mh-inherit-face-flag)
+             inherit
+           (or (cadr (assq face mh-face-data))
+               (error "Could not find %s in mh-face-data" face)))))
+
+    (if mh-min-colors-defined-flag
+        spec
+      (let ((cells (mh-display-color-cells))
+            new-spec)
+        ;; Remove entries with min-colors, or delete them if we have
+        ;; fewer colors than they specify.
+        (loop for entry in (reverse spec) do
+              (let ((requirement (if (eq (car entry) t)
+                                     nil
+                                   (assq 'min-colors (car entry)))))
+                (if requirement
+                    (when (>= cells (nth 1 requirement))
+                      (setq new-spec (cons (cons (delq requirement (car entry))
+                                                 (cdr entry))
+                                           new-spec)))
+                  (setq new-spec (cons entry new-spec)))))
+        new-spec))))
 
 (mh-defface mh-folder-address
   (mh-face-data 'mh-folder-subject '((t (:inherit mh-folder-subject))))
@@ -3522,9 +3530,9 @@
 ;; Get rid of temporary functions and data structures.
 (fmakunbound 'mh-defcustom)
 (fmakunbound 'mh-defface)
-(fmakunbound 'mh-defface-compat)
 (fmakunbound 'mh-defgroup)
 (fmakunbound 'mh-face-data)
+(fmakunbound 'mh-strip-package-version)
 (makunbound 'mh-face-data)
 (makunbound 'mh-inherit-face-flag)
 (makunbound 'mh-min-colors-defined-flag)
--- a/lisp/net/rcirc.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/net/rcirc.el	Mon Apr 10 14:52:24 2006 +0000
@@ -53,27 +53,27 @@
   :link '(custom-manual "(rcirc)")
   :group 'applications)
 
-(defcustom rcirc-server "irc.freenode.net"
+(defcustom rcirc-default-server "irc.freenode.net"
   "The default server to connect to."
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-port 6667
+(defcustom rcirc-default-port 6667
   "The default port to connect to."
   :type 'integer
   :group 'rcirc)
 
-(defcustom rcirc-nick (user-login-name)
+(defcustom rcirc-default-nick (user-login-name)
   "Your nick."
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-user-name (user-login-name)
+(defcustom rcirc-default-user-name (user-login-name)
   "Your user name sent to the server when connecting."
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-user-full-name (if (string= (user-full-name) "")
+(defcustom rcirc-default-user-full-name (if (string= (user-full-name) "")
 				 rcirc-user-name
 			       (user-full-name))
   "The full name sent to the server when connecting."
@@ -112,6 +112,10 @@
   "If non-nil, ignore activity in this buffer.")
 (make-variable-buffer-local 'rcirc-ignore-buffer-activity-flag)
 
+(defvar rcirc-low-priority-flag nil
+  "If non-nil, activity in this buffer is considered low priority.")
+(make-variable-buffer-local 'rcirc-low-priority-flag)
+
 (defcustom rcirc-time-format "%H:%M "
   "*Describes how timestamps are printed.
 Used as the first arg to `format-time-string'."
@@ -213,6 +217,43 @@
   :type 'boolean
   :group 'rcirc)
 
+(defcustom rcirc-decode-coding-system 'undecided
+  "Coding system used to decode incoming irc messages."
+  :type 'coding-system
+  :group 'rcirc)
+
+(defcustom rcirc-encode-coding-system 'utf-8
+  "Coding system used to encode outgoing irc messages."
+  :type 'coding-system
+  :group 'rcirc)
+
+(defcustom rcirc-coding-system-alist nil
+  "Alist to decide a coding system to use for a file I/O operation.
+The format is ((PATTERN . VAL) ...).
+PATTERN is either a string or a cons of strings.
+If PATTERN is a string, it is used to match a target.
+If PATTERN is a cons of strings, the car part is used to match a
+target, and the cdr part is used to match a server.
+VAL is either a coding system or a cons of coding systems.
+If VAL is a coding system, it is used for both decoding and encoding
+messages.
+If VAL is a cons of coding systems, the car part is used for decoding,
+and the cdr part is used for encoding."
+  :type '(alist :key-type (choice (string :tag "Channel Regexp")
+					  (cons (string :tag "Channel Regexp")
+						(string :tag "Server Regexp")))
+		:value-type (choice coding-system
+				    (cons (coding-system :tag "Decode")
+					  (coding-system :tag "Encode"))))
+  :group 'rcirc)
+
+(defcustom rcirc-multiline-major-mode 'fundamental-mode
+  "Major-mode function to use in multiline edit buffers."
+  :type 'function
+  :group 'rcirc)
+
+(defvar rcirc-nick nil)
+
 (defvar rcirc-prompt-start-marker nil)
 (defvar rcirc-prompt-end-marker nil)
 
@@ -230,14 +271,14 @@
 (defvar rcirc-buffer-alist nil)
 
 (defvar rcirc-activity nil
-  "List of channels with unviewed activity.")
+  "List of buffers with unviewed activity.")
 
 (defvar rcirc-activity-string ""
   "String displayed in modeline representing `rcirc-activity'.")
 (put 'rcirc-activity-string 'risky-local-variable t)
 
-(defvar rcirc-process nil
-  "The server process associated with this buffer.")
+(defvar rcirc-server-buffer nil
+  "The server buffer associated with this channel buffer.")
 
 (defvar rcirc-target nil
   "The channel or user associated with this buffer.")
@@ -246,7 +287,8 @@
   "List of urls seen in the current buffer.")
 
 (defvar rcirc-keepalive-seconds 60
-  "Number of seconds between keepalive pings.")
+  "Number of seconds between keepalive pings.
+If nil, do not send keepalive pings.")
 
 (defconst rcirc-id-string (concat "rcirc on GNU Emacs " emacs-version))
 
@@ -257,31 +299,30 @@
 If ARG is non-nil, prompt for a server to connect to."
   (interactive "P")
   (if arg
-      (let* ((server (read-string "IRC Server: " rcirc-server))
-	     (port (read-string "IRC Port: " (number-to-string rcirc-port)))
-	     (nick (read-string "IRC Nick: " rcirc-nick))
+      (let* ((server (read-string "IRC Server: " rcirc-default-server))
+	     (port (read-string "IRC Port: " (number-to-string rcirc-default-port)))
+	     (nick (read-string "IRC Nick: " rcirc-default-nick))
 	     (channels (split-string
 			(read-string "IRC Channels: "
-				     (mapconcat 'identity
-						(rcirc-startup-channels server)
-						" "))
+				     (mapconcat 'identity (rcirc-startup-channels server) " "))
 			"[, ]+" t)))
-	(rcirc-connect server port nick rcirc-user-name rcirc-user-full-name
+	(rcirc-connect server port nick rcirc-default-user-name rcirc-default-user-full-name
 		       channels))
     ;; make new connection using defaults unless already connected to
     ;; the default rcirc-server
-    (let ((default-server (default-value 'rcirc-server))
-	  connected)
+    (let (connected)
       (dolist (p (rcirc-process-list))
-	(when (string= default-server (process-name p))
+	(when (string= rcirc-default-server (process-name p))
 	  (setq connected p)))
       (if (not connected)
-	  (rcirc-connect rcirc-server rcirc-port rcirc-nick
-			 rcirc-user-name rcirc-user-full-name
-			 (rcirc-startup-channels rcirc-server))
+	  (rcirc-connect rcirc-default-server rcirc-default-port 
+			 rcirc-default-nick rcirc-default-user-name
+			 rcirc-default-user-full-name
+			 (rcirc-startup-channels rcirc-default-server))
 	(switch-to-buffer (process-buffer connected))
-	(message "Connected to %s" rcirc-server)))))
-
+	(message "Connected to %s" 
+		 (process-contact (get-buffer-process (current-buffer))
+				  :host))))))
 ;;;###autoload
 (defalias 'irc 'rcirc)
 
@@ -290,12 +331,10 @@
 (defvar rcirc-topic nil)
 (defvar rcirc-keepalive-timer nil)
 (defvar rcirc-last-server-message-time nil)
+(defvar rcirc-server nil)
 
 ;;;###autoload
 (defun rcirc-connect (&optional server port nick user-name full-name startup-channels)
-  (add-hook 'window-configuration-change-hook
-	    'rcirc-window-configuration-change)
-
   (save-excursion
     (message "Connecting to %s..." server)
     (let* ((inhibit-eol-conversion)
@@ -303,26 +342,26 @@
 			    (if (stringp port)
 				(string-to-number port)
 			      port)
-			  rcirc-port))
-	   (server (or server rcirc-server))
-	   (nick (or nick rcirc-nick))
-	   (user-name (or user-name rcirc-user-name))
-	   (full-name (or full-name rcirc-user-full-name))
-	   (startup-channels (or startup-channels (rcirc-startup-channels server)))
+			  rcirc-default-port))
+	   (server (or server rcirc-default-server))
+	   (nick (or nick rcirc-default-nick))
+	   (user-name (or user-name rcirc-default-user-name))
+	   (full-name (or full-name rcirc-default-user-full-name))
+	   (startup-channels startup-channels)
            (process (open-network-stream server nil server port-number)))
       ;; set up process
       (set-process-coding-system process 'raw-text 'raw-text)
-      (set-process-filter process 'rcirc-filter)
       (switch-to-buffer (rcirc-generate-new-buffer-name process nil))
       (set-process-buffer process (current-buffer))
+      (rcirc-mode process nil)
       (set-process-sentinel process 'rcirc-sentinel)
-      (rcirc-mode process nil)
+      (set-process-filter process 'rcirc-filter)
+      (make-local-variable 'rcirc-server)
+      (setq rcirc-server server)
       (make-local-variable 'rcirc-buffer-alist)
       (setq rcirc-buffer-alist nil)
       (make-local-variable 'rcirc-nick-table)
       (setq rcirc-nick-table (make-hash-table :test 'equal))
-      (make-local-variable 'rcirc-server)
-      (setq rcirc-server server)
       (make-local-variable 'rcirc-nick)
       (setq rcirc-nick nick)
       (make-local-variable 'rcirc-process-output)
@@ -339,9 +378,10 @@
                                       full-name))
 
       ;; setup ping timer if necessary
-      (unless rcirc-keepalive-timer
-        (setq rcirc-keepalive-timer
-              (run-at-time 0 rcirc-keepalive-seconds 'rcirc-keepalive)))
+      (when rcirc-keepalive-seconds
+	(unless rcirc-keepalive-timer
+	  (setq rcirc-keepalive-timer
+		(run-at-time 0 rcirc-keepalive-seconds 'rcirc-keepalive))))
 
       (message "Connecting to %s...done" server)
 
@@ -353,6 +393,11 @@
   `(with-current-buffer (process-buffer ,process)
      ,@body))
 
+(defmacro with-rcirc-server-buffer (&rest body)
+  (declare (indent 0) (debug t))
+  `(with-current-buffer rcirc-server-buffer
+     ,@body))
+
 (defun rcirc-keepalive ()
   "Send keep alive pings to active rcirc processes.
 Kill processes that have not received a server message since the
@@ -471,24 +516,35 @@
 
 (defun rcirc-send-string (process string)
   "Send PROCESS a STRING plus a newline."
-  (let ((string (concat (encode-coding-string string
-                                              buffer-file-coding-system)
+  (let ((string (concat (encode-coding-string string rcirc-encode-coding-system)
                         "\n")))
-    (unless (eq (process-status rcirc-process) 'open)
+    (unless (eq (process-status process) 'open)
       (error "Network connection to %s is not open"
-             (process-name rcirc-process)))
+             (process-name process)))
     (rcirc-debug process string)
     (process-send-string process string)))
 
-(defun rcirc-server (process)
-  "Return PROCESS server, given by the 001 response."
+(defun rcirc-buffer-process (&optional buffer)
+  "Return the process associated with channel BUFFER.
+With no argument or nil as argument, use the current buffer."
+  (get-buffer-process (or buffer rcirc-server-buffer)))
+
+(defun rcirc-server-name (process)
+  "Return PROCESS server name, given by the 001 response."
   (with-rcirc-process-buffer process
-    rcirc-server))
+    (or rcirc-server rcirc-default-server)))
 
 (defun rcirc-nick (process)
   "Return PROCESS nick."
-  (with-rcirc-process-buffer process
-    rcirc-nick))
+  (with-rcirc-process-buffer process 
+    (or rcirc-nick rcirc-default-nick)))
+
+(defun rcirc-buffer-nick (&optional buffer)
+  "Return the nick associated with BUFFER.
+With no argument or nil as argument, use the current buffer."
+  (with-current-buffer (or buffer (current-buffer))
+    (with-current-buffer rcirc-server-buffer
+      (or rcirc-nick rcirc-default-nick))))
 
 (defvar rcirc-max-message-length 450
   "Messages longer than this value will be split.")
@@ -554,8 +610,8 @@
 		 rcirc-nick-completion-start-offset)
 	      (point))
 	     (mapcar (lambda (x) (cons x nil))
-		     (rcirc-channel-nicks rcirc-process
-					  (rcirc-buffer-target)))))))
+		     (rcirc-channel-nicks (rcirc-buffer-process)
+					  rcirc-target))))))
   (let ((completion (car rcirc-nick-completions)))
     (when completion
       (delete-region (+ rcirc-prompt-end-marker
@@ -567,11 +623,15 @@
                              rcirc-prompt-end-marker)
                           ": "))))))
 
-(defun rcirc-buffer-target (&optional buffer)
-  "Return the name of target for BUFFER.
-If buffer is nil, return the target of the current buffer."
-  (with-current-buffer (or buffer (current-buffer))
-    rcirc-target))
+(defun set-rcirc-decode-coding-system (coding-system)
+  "Set the decode coding system used in this channel."
+  (interactive "zCoding system for incoming messages: ")
+  (setq rcirc-decode-coding-system coding-system))
+
+(defun set-rcirc-encode-coding-system (coding-system)
+  "Set the encode coding system used in this channel."
+  (interactive "zCoding system for outgoing messages: ")
+  (setq rcirc-encode-coding-system coding-system))
 
 (defvar rcirc-mode-map (make-sparse-keymap)
   "Keymap for rcirc mode.")
@@ -584,7 +644,7 @@
 (define-key rcirc-mode-map (kbd "C-c C-c") 'rcirc-edit-multiline)
 (define-key rcirc-mode-map (kbd "C-c C-j") 'rcirc-cmd-join)
 (define-key rcirc-mode-map (kbd "C-c C-k") 'rcirc-cmd-kick)
-(define-key rcirc-mode-map (kbd "C-c C-l") 'rcirc-cmd-list)
+(define-key rcirc-mode-map (kbd "C-c C-l") 'rcirc-toggle-low-priority)
 (define-key rcirc-mode-map (kbd "C-c C-d") 'rcirc-cmd-mode)
 (define-key rcirc-mode-map (kbd "C-c C-m") 'rcirc-cmd-msg)
 (define-key rcirc-mode-map (kbd "C-c C-r") 'rcirc-cmd-nick) ; rename
@@ -612,6 +672,8 @@
 (defvar rcirc-mode-hook nil
   "Hook run when setting up rcirc buffer.")
 
+(defvar rcirc-last-post-time nil)
+
 (defun rcirc-mode (process target)
   "Major mode for IRC channel buffers.
 
@@ -623,12 +685,14 @@
 
   (make-local-variable 'rcirc-input-ring)
   (setq rcirc-input-ring (make-ring rcirc-input-ring-size))
-  (make-local-variable 'rcirc-process)
-  (setq rcirc-process process)
+  (make-local-variable 'rcirc-server-buffer)
+  (setq rcirc-server-buffer (process-buffer process))
   (make-local-variable 'rcirc-target)
   (setq rcirc-target target)
   (make-local-variable 'rcirc-topic)
   (setq rcirc-topic nil)
+  (make-local-variable 'rcirc-last-post-time)
+  (setq rcirc-last-post-time (current-time))
 
   (make-local-variable 'rcirc-short-buffer-name)
   (setq rcirc-short-buffer-name nil)
@@ -636,6 +700,16 @@
   (setq rcirc-urls nil)
   (setq use-hard-newlines t)
 
+  (make-local-variable 'rcirc-decode-coding-system)
+  (make-local-variable 'rcirc-encode-coding-system)
+  (dolist (i rcirc-coding-system-alist)
+    (let ((chan (if (consp (car i)) (caar i) (car i)))
+	  (serv (if (consp (car i)) (cdar i) "")))
+      (when (and (string-match chan (or target ""))
+		 (string-match serv (rcirc-server-name process)))
+	(setq rcirc-decode-coding-system (if (consp (cdr i)) (cadr i) i)
+	      rcirc-encode-coding-system (if (consp (cdr i)) (cddr i) i)))))
+
   ;; setup the prompt and markers
   (make-local-variable 'rcirc-prompt-start-marker)
   (setq rcirc-prompt-start-marker (make-marker))
@@ -649,6 +723,13 @@
   (setq overlay-arrow-position (make-marker))
   (set-marker overlay-arrow-position nil)
 
+  ;; if the user changes the major mode or kills the buffer, there is
+  ;; cleanup work to do
+  (make-local-variable 'change-major-mode-hook)
+  (add-hook 'change-major-mode-hook 'rcirc-change-major-mode-hook)
+  (make-local-variable 'kill-buffer-hook)
+  (add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook)
+
   ;; add to buffer list, and update buffer abbrevs
   (when target				; skip server buffer
     (let ((buffer (current-buffer)))
@@ -675,11 +756,9 @@
 	  (prompt (or rcirc-prompt "")))
       (mapc (lambda (rep)
 	      (setq prompt
-		    (replace-regexp-in-string (car rep) (regexp-quote (cdr rep)) prompt)))
-	    (list (cons "%n" (with-rcirc-process-buffer rcirc-process
-			       rcirc-nick))
-		  (cons "%s" (with-rcirc-process-buffer rcirc-process
-			       rcirc-server))
+		    (replace-regexp-in-string (car rep) (cdr rep) prompt)))
+	    (list (cons "%n" (rcirc-buffer-nick))
+		  (cons "%s" (with-rcirc-server-buffer (or rcirc-server "")))
 		  (cons "%t" (or rcirc-target ""))))
       (save-excursion
 	(delete-region rcirc-prompt-start-marker rcirc-prompt-end-marker)
@@ -713,27 +792,29 @@
 (defun rcirc-kill-buffer-hook ()
   "Part the channel when killing an rcirc buffer."
   (when (eq major-mode 'rcirc-mode)
-    (rcirc-kill-buffer-hook-1)))
-(defun rcirc-kill-buffer-hook-1 ()
+    (rcirc-clean-up-buffer "Killed buffer")))
+
+(defun rcirc-change-major-mode-hook ()
+  "Part the channel when changing the major-mode."
+  (rcirc-clean-up-buffer "Changed major mode"))
+
+(defun rcirc-clean-up-buffer (reason)
   (let ((buffer (current-buffer)))
     (rcirc-clear-activity buffer)
-    (when (and rcirc-process
-	       (eq (process-status rcirc-process) 'open))
-      (with-rcirc-process-buffer rcirc-process
-	(setq rcirc-buffer-alist
-	      (rassq-delete-all buffer rcirc-buffer-alist)))
+    (when (and (rcirc-buffer-process)
+	       (eq (process-status (rcirc-buffer-process)) 'open))
+      (with-rcirc-server-buffer
+       (setq rcirc-buffer-alist
+	     (rassq-delete-all buffer rcirc-buffer-alist)))
       (rcirc-update-short-buffer-names)
       (if (rcirc-channel-p rcirc-target)
-	  (rcirc-send-string rcirc-process
-			     (concat "PART " rcirc-target
-				     " :Killed buffer"))
+	  (rcirc-send-string (rcirc-buffer-process)
+			     (concat "PART " rcirc-target " :" reason))
 	(when rcirc-target
-	  (rcirc-remove-nick-channel rcirc-process
-				     (rcirc-nick rcirc-process)
+	  (rcirc-remove-nick-channel (rcirc-buffer-process)
+				     (rcirc-buffer-nick)
 				     rcirc-target))))))
 
-(add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook)
-
 (defun rcirc-generate-new-buffer-name (process target)
   "Return a buffer name based on PROCESS and TARGET.
 This is used for the initial name given to IRC buffers."
@@ -756,7 +837,7 @@
   "Return the buffer associated with the PROCESS and TARGET.
 Create the buffer if it doesn't exist."
   (let ((buffer (rcirc-get-buffer process target)))
-    (if buffer
+    (if (and buffer (buffer-live-p buffer))
 	(with-current-buffer buffer
 	  (when (not rcirc-target)
  	    (setq rcirc-target target))
@@ -789,22 +870,20 @@
 		   (buffer-substring-no-properties start end)))))
     ;; process input
     (goto-char (point-max))
-    (let ((target (rcirc-buffer-target))
-	  (start rcirc-prompt-end-marker))
-      (when (not (equal 0 (- (point) start)))
-	;; delete a trailing newline
-	(when (eq (point) (point-at-bol))
-	  (delete-backward-char 1))
-	(let ((input (buffer-substring-no-properties
-		      rcirc-prompt-end-marker (point))))
-	  (dolist (line (split-string input "\n"))
-	    (rcirc-process-input-line rcirc-process target line))
-	  ;; add to input-ring
-	  (save-excursion
-	    (ring-insert rcirc-input-ring input)
-	    (setq rcirc-input-ring-index 0)))))))
+    (when (not (equal 0 (- (point) rcirc-prompt-end-marker)))
+      ;; delete a trailing newline
+      (when (eq (point) (point-at-bol))
+	(delete-backward-char 1))
+      (let ((input (buffer-substring-no-properties
+		    rcirc-prompt-end-marker (point))))
+	(dolist (line (split-string input "\n"))
+	  (rcirc-process-input-line line))
+	;; add to input-ring
+	(save-excursion
+	  (ring-insert rcirc-input-ring input)
+	  (setq rcirc-input-ring-index 0))))))
 
-(defun rcirc-process-input-line (process target line)
+(defun rcirc-process-input-line (line)
   (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" line)
       (rcirc-process-command (match-string 1 line)
 			     (match-string 2 line)
@@ -813,27 +892,29 @@
 
 (defun rcirc-process-message (line)
   (if (not rcirc-target)
-      (message "Not joined")
+      (message "Not joined (no target)")
     (delete-region rcirc-prompt-end-marker (point))
-    (rcirc-send-message rcirc-process rcirc-target line)))
+    (rcirc-send-message (rcirc-buffer-process) rcirc-target line)
+    (setq rcirc-last-post-time (current-time))))
 
 (defun rcirc-process-command (command args line)
   (if (eq (aref command 0) ?/)
       ;; "//text" will send "/text" as a message
       (rcirc-process-message (substring line 1))
-    (let* ((fun (intern-soft (concat "rcirc-cmd-" command))))
+    (let ((fun (intern-soft (concat "rcirc-cmd-" command)))
+	  (process (rcirc-buffer-process)))
       (newline)
       (with-current-buffer (current-buffer)
 	(delete-region rcirc-prompt-end-marker (point))
 	(if (string= command "me")
-	    (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+	    (rcirc-print process (rcirc-buffer-nick)
 			 "ACTION" rcirc-target args)
-	  (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+	  (rcirc-print process (rcirc-buffer-nick)
 		       "COMMAND" rcirc-target line))
 	(set-marker rcirc-prompt-end-marker (point))
 	(if (fboundp fun)
-	    (funcall fun args rcirc-process rcirc-target)
-	  (rcirc-send-string rcirc-process
+	    (funcall fun args process rcirc-target)
+	  (rcirc-send-string process
 			     (concat command " " args)))))))
 
 (defvar rcirc-parent-buffer nil)
@@ -844,38 +925,41 @@
   (let ((pos (1+ (- (point) rcirc-prompt-end-marker))))
     (goto-char (point-max))
     (let ((text (buffer-substring rcirc-prompt-end-marker (point)))
-          (parent (buffer-name))
-          (process rcirc-process))
+          (parent (buffer-name)))
       (delete-region rcirc-prompt-end-marker (point))
       (setq rcirc-window-configuration (current-window-configuration))
       (pop-to-buffer (concat "*multiline " parent "*"))
-      (rcirc-multiline-edit-mode)
+      (funcall rcirc-multiline-major-mode)
+      (rcirc-multiline-minor-mode 1)
       (setq rcirc-parent-buffer parent)
-      (setq rcirc-process process)
       (insert text)
       (and (> pos 0) (goto-char pos))
       (message "Type C-c C-c to return text to %s, or C-c C-k to cancel" parent))))
 
-(define-derived-mode rcirc-multiline-edit-mode
-  text-mode "rcirc multi"
-  "Major mode for multiline edits
-\\{rcirc-multiline-edit-mode-map}"
-  (make-local-variable 'rcirc-parent-buffer)
-  (make-local-variable 'rcirc-process))
+(defvar rcirc-multiline-minor-mode-map (make-sparse-keymap)
+  "Keymap for multiline mode in rcirc.")
+(define-key rcirc-multiline-minor-mode-map 
+  (kbd "C-c C-c") 'rcirc-multiline-minor-submit)
+(define-key rcirc-multiline-minor-mode-map
+  (kbd "C-x C-s") 'rcirc-multiline-minor-submit)
+(define-key rcirc-multiline-minor-mode-map
+  (kbd "C-c C-k") 'rcirc-multiline-minor-cancel)
+(define-key rcirc-multiline-minor-mode-map
+  (kbd "ESC ESC ESC") 'rcirc-multiline-minor-cancel)
 
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "C-c C-c") 'rcirc-multiline-edit-submit)
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "C-x C-s") 'rcirc-multiline-edit-submit)
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "C-c C-k") 'rcirc-multiline-edit-cancel)
-(define-key rcirc-multiline-edit-mode-map
-  (kbd "ESC ESC ESC") 'rcirc-multiline-edit-cancel)
+(define-minor-mode rcirc-multiline-minor-mode
+  "Minor mode for editing multiple lines in rcirc."
+  :init-value nil
+  :lighter " rcirc-mline"
+  :keymap rcirc-multiline-minor-mode-map
+  :global nil
+  :group 'rcirc
+  (make-local-variable 'rcirc-parent-buffer)
+  (put 'rcirc-parent-buffer 'permanent-local t))
 
-(defun rcirc-multiline-edit-submit ()
+(defun rcirc-multiline-minor-submit ()
   "Send the text in buffer back to parent buffer."
   (interactive)
-  (assert (eq major-mode 'rcirc-multiline-edit-mode))
   (assert rcirc-parent-buffer)
   (untabify (point-min) (point-max))
   (let ((text (buffer-substring (point-min) (point-max)))
@@ -888,10 +972,9 @@
     (set-window-configuration rcirc-window-configuration)
     (goto-char (+ rcirc-prompt-end-marker (1- pos)))))
 
-(defun rcirc-multiline-edit-cancel ()
+(defun rcirc-multiline-minor-cancel ()
   "Cancel the multiline edit."
   (interactive)
-  (assert (eq major-mode 'rcirc-multiline-edit-mode))
   (kill-buffer (current-buffer))
   (set-window-configuration rcirc-window-configuration))
 
@@ -903,7 +986,7 @@
       (if (and buffer
 	       (with-current-buffer buffer
 		 (and (eq major-mode 'rcirc-mode)
-		      (eq rcirc-process process))))
+		      (eq (rcirc-buffer-process) process))))
 	  buffer
 	(process-buffer process)))))
 
@@ -932,8 +1015,7 @@
   %fs       Following text uses the face `rcirc-server'
   %f[FACE]  Following text uses the face FACE
   %f-       Following text uses the default face
-  %%        A literal `%' character
-"
+  %%        A literal `%' character"
   :type '(alist :key-type (choice (string :tag "Type")
 				  (const :tag "Default" t))
 		:value-type string)
@@ -963,8 +1045,8 @@
 		   "%")
 		  ((or (eq key ?n) (eq key ?N))
 		   ;; %n/%N -- nick
-		   (let ((nick (concat (if (string= (with-rcirc-process-buffer
-							process rcirc-server)
+		   (let ((nick (concat (if (string= (with-rcirc-process-buffer process
+						      rcirc-server)
 						    sender)
 					   ""
 					 sender)
@@ -1037,13 +1119,18 @@
 
 (defvar rcirc-activity-type nil)
 (make-variable-buffer-local 'rcirc-activity-type)
+(defvar rcirc-last-sender nil)
+(make-variable-buffer-local 'rcirc-last-sender)
+(defvar rcirc-gray-toggle nil)
+(make-variable-buffer-local 'rcirc-gray-toggle)
 (defun rcirc-print (process sender response target text &optional activity)
   "Print TEXT in the buffer associated with TARGET.
 Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
 record activity."
+  (or text (setq text ""))
   (unless (or (member sender rcirc-ignore-list)
 	      (member (with-syntax-table rcirc-nick-syntax-table
-			(when (string-match "^\\([^/]\\w*\\)[:,]" text)
+			(when (string-match "^\\([^/]\\w*\\)\\b" text)
 			  (match-string 1 text))) rcirc-ignore-list))
     (let* ((buffer (rcirc-target-buffer process sender response target text))
 	   (inhibit-read-only t))
@@ -1054,8 +1141,7 @@
 
 	  (unless (string= sender (rcirc-nick process))
 	    ;; only decode text from other senders, not ours
-	    (setq text (decode-coding-string (or text "")
-					     buffer-file-coding-system))
+	    (setq text (decode-coding-string text rcirc-decode-coding-system))
 	    ;; mark the line with overlay arrow
 	    (unless (or (marker-position overlay-arrow-position)
 			(get-buffer-window (current-buffer)))
@@ -1142,7 +1228,8 @@
 		      nick-match)
 	      (rcirc-record-activity
 	       (current-buffer)
-	       (when (or nick-match (not (rcirc-channel-p rcirc-target)))
+	       (when (or nick-match (and (not (rcirc-channel-p rcirc-target))
+					 (not rcirc-low-priority-flag)))
 		 'nick)))))
 
 	(sit-for 0)			; displayed text before hook
@@ -1215,18 +1302,21 @@
           (puthash nick newchans rcirc-nick-table)
         (remhash nick rcirc-nick-table)))))
 
-(defun rcirc-channel-nicks (process channel)
-  "Return the list of nicks in CHANNEL sorted by last activity."
-  (with-rcirc-process-buffer process
-    (let (nicks)
-      (maphash
-       (lambda (k v)
-         (let ((record (assoc-string channel v t)))
-           (if record
-               (setq nicks (cons (cons k (cdr record)) nicks)))))
-       rcirc-nick-table)
-      (mapcar (lambda (x) (car x))
-              (sort nicks (lambda (x y) (time-less-p (cdr y) (cdr x))))))))
+(defun rcirc-channel-nicks (process target)
+  "Return the list of nicks associated with TARGET sorted by last activity."
+  (when target
+    (if (rcirc-channel-p target)
+	(with-rcirc-process-buffer process
+	  (let (nicks)
+	    (maphash
+	     (lambda (k v)
+	       (let ((record (assoc-string target v t)))
+		 (if record
+		     (setq nicks (cons (cons k (cdr record)) nicks)))))
+	     rcirc-nick-table)
+	    (mapcar (lambda (x) (car x))
+		    (sort nicks (lambda (x y) (time-less-p (cdr y) (cdr x)))))))
+      (list target))))
 
 (defun rcirc-ignore-update-automatic (nick)
   "Remove NICK from `rcirc-ignore-list'
@@ -1256,15 +1346,23 @@
   (or global-mode-string (setq global-mode-string '("")))
   ;; toggle the mode-line channel indicator
   (if rcirc-track-minor-mode
-      (and (not (memq 'rcirc-activity-string global-mode-string))
-	   (setq global-mode-string
-		 (append global-mode-string '(rcirc-activity-string))))
+      (progn
+	(and (not (memq 'rcirc-activity-string global-mode-string))
+	     (setq global-mode-string
+		   (append global-mode-string '(rcirc-activity-string))))
+	(add-hook 'window-configuration-change-hook
+		  'rcirc-window-configuration-change))
     (setq global-mode-string 
-	  (delete 'rcirc-activity-string global-mode-string))))
+	  (delete 'rcirc-activity-string global-mode-string))
+    (remove-hook 'window-configuration-change-hook
+		 'rcirc-window-configuration-change)))
 
 (or (assq 'rcirc-ignore-buffer-activity-flag minor-mode-alist)
     (setq minor-mode-alist
           (cons '(rcirc-ignore-buffer-activity-flag " Ignore") minor-mode-alist)))
+(or (assq 'rcirc-low-priority-flag minor-mode-alist)
+    (setq minor-mode-alist
+          (cons '(rcirc-low-priority-flag " LowPri") minor-mode-alist)))
 
 (defun rcirc-toggle-ignore-buffer-activity ()
   "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
@@ -1276,6 +1374,16 @@
 	     "Notice activity in this buffer"))
   (force-mode-line-update))
 
+(defun rcirc-toggle-low-priority ()
+  "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
+  (interactive)
+  (setq rcirc-low-priority-flag
+	(not rcirc-low-priority-flag))
+  (message (if rcirc-low-priority-flag
+	       "Activity in this buffer is low priority"
+	     "Activity in this buffer is normal priority"))
+  (force-mode-line-update))
+
 (defvar rcirc-switch-to-buffer-function 'switch-to-buffer
   "Function to use when switching buffers.
 Possible values are `switch-to-buffer', `pop-to-buffer', and
@@ -1284,7 +1392,7 @@
 (defun rcirc-switch-to-server-buffer ()
   "Switch to the server buffer associated with current channel buffer."
   (interactive)
-  (funcall rcirc-switch-to-buffer-function (process-buffer rcirc-process)))
+  (funcall rcirc-switch-to-buffer-function rcirc-server-buffer))
 
 (defun rcirc-jump-to-first-unread-line ()
   "Move the point to the first unread line in this buffer."
@@ -1296,27 +1404,35 @@
   "The buffer to switch to when there is no more activity.")
 
 (defun rcirc-next-active-buffer (arg)
-  "Go to the ARGth rcirc buffer with activity.
+  "Go to the next rcirc buffer with activity.
+With prefix ARG, go to the next low priority buffer with activity.
 The function given by `rcirc-switch-to-buffer-function' is used to
 show the buffer."
-  (interactive "p")
-  (if rcirc-activity
-      (progn
-        (unless (eq major-mode 'rcirc-mode)
-          (setq rcirc-last-non-irc-buffer (current-buffer)))
-        (if (and (> arg 0)
-                 (<= arg (length rcirc-activity)))
-            (funcall rcirc-switch-to-buffer-function
-		     (nth (1- arg) rcirc-activity))
-          (message "Invalid arg: %d" arg)))
-    (if (eq major-mode 'rcirc-mode)
-        (if (not (and rcirc-last-non-irc-buffer
-                      (buffer-live-p rcirc-last-non-irc-buffer)))
-            (message "No IRC activity.  Start something.")
-	  (message "No more IRC activity.  Go back to work.")
-          (funcall rcirc-switch-to-buffer-function rcirc-last-non-irc-buffer)
-          (setq rcirc-last-non-irc-buffer nil))
-      (message "No IRC activity."))))
+  (interactive "P")
+  (let* ((pair (rcirc-split-activity rcirc-activity))
+	 (lopri (car pair))
+	 (hipri (cdr pair)))		
+    (if (or (and (not arg) hipri)
+	    (and arg lopri))
+	(progn
+	  (unless (eq major-mode 'rcirc-mode)
+	    (setq rcirc-last-non-irc-buffer (current-buffer)))
+	  (funcall rcirc-switch-to-buffer-function
+		   (car (if arg lopri hipri))))
+      (if (eq major-mode 'rcirc-mode)
+	  (if (not (and rcirc-last-non-irc-buffer
+			(buffer-live-p rcirc-last-non-irc-buffer)))
+	      (message "No IRC activity.  Start something.")
+	    (message "No more IRC activity.  Go back to work.")
+	    (funcall rcirc-switch-to-buffer-function rcirc-last-non-irc-buffer)
+	    (setq rcirc-last-non-irc-buffer nil))
+	(message (concat 
+		  "No IRC activity."
+		  (when lopri
+		    (concat 
+		     "  Type C-u "
+		     (key-description (this-command-keys))
+		     " for low priority activity."))))))))
 
 (defvar rcirc-activity-hooks nil
   "Hook to be run when there is channel activity.
@@ -1325,13 +1441,18 @@
 activity.  Only run if the buffer is not visible and
 `rcirc-ignore-buffer-activity-flag' is non-nil.")
 
-(defun rcirc-record-activity (buffer type)
+(defun rcirc-record-activity (buffer &optional type)
   "Record BUFFER activity with TYPE."
   (with-current-buffer buffer
     (when (not (get-buffer-window (current-buffer) t))
-      (add-to-list 'rcirc-activity (current-buffer))
+      (setq rcirc-activity
+	    (sort (add-to-list 'rcirc-activity (current-buffer))
+		  (lambda (b1 b2)
+		    (let ((t1 (with-current-buffer b1 rcirc-last-post-time))
+			  (t2 (with-current-buffer b2 rcirc-last-post-time)))
+		      (time-less-p t2 t1)))))
       (if (not rcirc-activity-type)
-          (setq rcirc-activity-type type))
+	  (setq rcirc-activity-type type))
       (rcirc-update-activity-string)))
   (run-hook-with-args 'rcirc-activity-hooks buffer))
 
@@ -1341,22 +1462,45 @@
   (with-current-buffer buffer
     (setq rcirc-activity-type nil)))
 
+(defun rcirc-split-activity (activity)
+  "Return a cons cell with ACTIVITY split into (lopri . hipri)."
+  (let (lopri hipri)
+    (dolist (buf rcirc-activity)
+      (with-current-buffer buf
+	(if (and rcirc-low-priority-flag
+		 (not (eq rcirc-activity-type 'nick)))
+	    (add-to-list 'lopri buf t)
+	  (add-to-list 'hipri buf t))))
+    (cons lopri hipri)))
+
 ;; TODO: add mouse properties
 (defun rcirc-update-activity-string ()
   "Update mode-line string."
-  (setq rcirc-activity-string
-	(if (not rcirc-activity)
-	       ""
-	  (concat "-["
-		  (mapconcat
-		   (lambda (b)
-		     (let ((s (rcirc-short-buffer-name b)))
-		       (with-current-buffer b
-			 (if (not (eq rcirc-activity-type 'nick))
-			     s
-			   (rcirc-facify s 'rcirc-mode-line-nick)))))
-		   rcirc-activity ",")
-		  "]-"))))
+  (let* ((pair (rcirc-split-activity rcirc-activity))
+	 (lopri (car pair))
+	 (hipri (cdr pair)))
+    (setq rcirc-activity-string
+	  (if (or hipri lopri)
+	      (concat "-"
+		      (and hipri "[")
+		      (rcirc-activity-string hipri)
+		      (and hipri lopri ",")
+		      (and lopri
+			   (concat "("
+				   (rcirc-activity-string lopri)
+				   ")"))
+		      (and hipri "]")
+		      "-")
+	    "-[]-"))))
+
+(defun rcirc-activity-string (buffers)
+  (mapconcat (lambda (b)
+	       (let ((s (rcirc-short-buffer-name b)))
+		 (with-current-buffer b
+		   (if (not (eq rcirc-activity-type 'nick))
+		       s
+		     (rcirc-facify s 'rcirc-mode-line-nick)))))
+	     buffers ","))
 
 (defun rcirc-short-buffer-name (buffer)
   "Return a short name for BUFFER to use in the modeline indicator."
@@ -1370,9 +1514,11 @@
   (let ((current-now-hidden t))
     (walk-windows (lambda (w)
 		    (let ((buf (window-buffer w)))
-		      (rcirc-clear-activity buf)
-		      (when (eq buf rcirc-current-buffer)
-			(setq current-now-hidden nil)))))
+		      (when (eq major-mode 'rcirc-mode)
+			(rcirc-clear-activity buf)
+			(when (eq buf rcirc-current-buffer)
+			  (setq current-now-hidden nil))))))
+    ;; add overlay arrow if the buffer isn't displayed
     (when (and rcirc-current-buffer current-now-hidden)
       (with-current-buffer rcirc-current-buffer
 	(when (eq major-mode 'rcirc-mode)
@@ -1395,8 +1541,9 @@
 				    rcirc-buffer-alist))
 				(rcirc-process-list)))))
     (dolist (i (rcirc-abbreviate bufalist))
-      (with-current-buffer (cdr i)
-	(setq rcirc-short-buffer-name (car i))))))
+      (when (buffer-live-p (cdr i))
+	(with-current-buffer (cdr i)
+	  (setq rcirc-short-buffer-name (car i)))))))
 
 (defun rcirc-abbreviate (pairs)
   (apply 'append (mapcar 'rcirc-rebuild-tree (rcirc-make-trees pairs))))
@@ -1451,11 +1598,10 @@
   "Define a command."
   `(defun ,(intern (concat "rcirc-cmd-" (symbol-name command)))
      (,@argument &optional process target)
-     ,(concat docstring "\n\nNote: If PROCESS or TARGET are nil, the values of"
-              "\nbuffer local variables `rcirc-process' and `rcirc-target',"
-              "\nwill be used.")
+     ,(concat docstring "\n\nNote: If PROCESS or TARGET are nil, the values given"
+              "\nby `rcirc-buffer-process' and `rcirc-target' will be used.")
      ,interactive-form
-     (let ((process (or process rcirc-process))
+     (let ((process (or process (rcirc-buffer-process)))
            (target (or target rcirc-target)))
        ,@body)))
 
@@ -1465,8 +1611,8 @@
   (if (null message)
       (progn
         (setq target (completing-read "Message nick: "
-                                      (with-rcirc-process-buffer rcirc-process
-                                        rcirc-nick-table)))
+                                      (with-rcirc-server-buffer 
+					rcirc-nick-table)))
         (when (> (length target) 0)
           (setq message (read-string (format "Message %s: " target)))
           (when (> (length message) 0)
@@ -1480,8 +1626,7 @@
 (defun-rcirc-command query (nick)
   "Open a private chat buffer to NICK."
   (interactive (list (completing-read "Query nick: "
-                                      (with-rcirc-process-buffer rcirc-process
-                                        rcirc-nick-table))))
+                                      (with-rcirc-server-buffer rcirc-nick-table))))
   (let ((existing-buffer (rcirc-get-buffer process nick)))
     (switch-to-buffer (or existing-buffer
 			  (rcirc-get-buffer-create process nick)))
@@ -1493,9 +1638,9 @@
   (interactive "sJoin channel: ")
   (let ((buffer (rcirc-get-buffer-create process
                                          (car (split-string channel)))))
+    (rcirc-send-string process (concat "JOIN " channel))
     (when (not (eq (selected-window) (minibuffer-window)))
-      (funcall rcirc-switch-to-buffer-function buffer))
-    (rcirc-send-string process (concat "JOIN " channel))))
+      (funcall rcirc-switch-to-buffer-function buffer))))
 
 (defun-rcirc-command part (channel)
   "Part CHANNEL."
@@ -1544,8 +1689,7 @@
   "Request information from server about NICK."
   (interactive (list
                 (completing-read "Whois: "
-                                 (with-rcirc-process-buffer rcirc-process
-                                   rcirc-nick-table))))
+                                 (with-rcirc-server-buffer rcirc-nick-table))))
   (rcirc-send-string process (concat "WHOIS " nick)))
 
 (defun-rcirc-command mode (args)
@@ -1573,8 +1717,9 @@
   "Kick NICK from current channel."
   (interactive (list
                 (concat (completing-read "Kick nick: "
-                                         (rcirc-channel-nicks rcirc-process
-                                                              rcirc-target))
+                                         (rcirc-channel-nicks 
+					  (rcirc-buffer-process)
+					  rcirc-target))
                         (read-from-minibuffer "Kick reason: "))))
   (let* ((arglist (split-string arg))
          (argstring (concat (car arglist) " :"
@@ -1768,7 +1913,7 @@
 			 ((string-match "^\\[\\(#[^ ]+\\)\\]" message)
 			  (match-string 1 message))
 			 (sender
-			  (if (string= sender (rcirc-server process))
+			  (if (string= sender (rcirc-server-name process))
 			      nil	; server notice
 			    sender)))
                  message t))))
@@ -1782,19 +1927,14 @@
     (rcirc-print process sender "JOIN" channel "")
 
     ;; print in private chat buffer if it exists
-    (when (rcirc-get-buffer rcirc-process sender)
+    (when (rcirc-get-buffer (rcirc-buffer-process) sender)
       (rcirc-print process sender "JOIN" sender channel))
 
     (rcirc-put-nick-channel process sender channel)))
 
 ;; PART and KICK are handled the same way
 (defun rcirc-handler-PART-or-KICK (process response channel sender nick args)
-  (rcirc-print process sender response channel (concat channel " " args))
-
-  ;; print in private chat buffer if it exists
-  (when (rcirc-get-buffer rcirc-process nick)
-    (rcirc-print process sender response nick (concat channel " " args)))
-
+  (rcirc-ignore-update-automatic nick)
   (if (not (string= nick (rcirc-nick process)))
       ;; this is someone else leaving
       (rcirc-remove-nick-channel process nick channel)
@@ -1810,14 +1950,27 @@
 	  (setq rcirc-target nil))))))
 
 (defun rcirc-handler-PART (process sender args text)
-  (rcirc-ignore-update-automatic sender)
-  (rcirc-handler-PART-or-KICK process "PART"
-                              (car args) sender sender
-                              (cadr args)))
+  (let* ((channel (car args))
+	 (reason (cadr args))
+	 (message (concat channel " " reason)))
+    (rcirc-print process sender "PART" channel message)
+    ;; print in private chat buffer if it exists
+    (when (rcirc-get-buffer (rcirc-buffer-process) sender)
+      (rcirc-print process sender "PART" sender message))
+
+    (rcirc-handler-PART-or-KICK process "PART" channel sender sender reason)))
 
 (defun rcirc-handler-KICK (process sender args text)
-  (rcirc-handler-PART-or-KICK process "KICK" (car args) sender (cadr args)
-                              (caddr args)))
+  (let* ((channel (car args))
+	 (nick (cadr args))
+	 (reason (caddr args))
+	 (message (concat nick " " channel " " reason)))
+    (rcirc-print process sender "KICK" channel message t)
+    ;; print in private chat buffer if it exists
+    (when (rcirc-get-buffer (rcirc-buffer-process) nick)
+      (rcirc-print process sender "KICK" nick message))
+
+    (rcirc-handler-PART-or-KICK process "KICK" channel sender nick reason)))
 
 (defun rcirc-handler-QUIT (process sender args text)
   (rcirc-ignore-update-automatic sender)
@@ -1826,7 +1979,7 @@
 	(rcirc-nick-channels process sender))
 
   ;; print in private chat buffer if it exists
-  (when (rcirc-get-buffer rcirc-process sender)
+  (when (rcirc-get-buffer (rcirc-buffer-process) sender)
     (rcirc-print process sender "QUIT" sender (apply 'concat args)))
 
   (rcirc-nick-remove process sender))
@@ -1875,6 +2028,21 @@
     (with-current-buffer (rcirc-get-buffer process (car args))
       (setq rcirc-topic topic))))
 
+(defvar rcirc-nick-away-alist nil)
+(defun rcirc-handler-301 (process sender args text)
+  "RPL_AWAY"
+  (let* ((nick (cadr args))
+	 (rec (assoc-string nick rcirc-nick-away-alist))
+	 (away-message (caddr args)))
+    (when (or (not rec)
+	      (not (string= (cdr rec) away-message)))
+      ;; away message has changed
+      (rcirc-handler-generic process "AWAY" nick (cdr args) text)
+      (if rec
+	  (setcdr rec away-message)
+	(setq rcirc-nick-away-alist (cons (cons nick away-message)
+					  rcirc-nick-away-alist))))))
+
 (defun rcirc-handler-332 (process sender args text)
   "RPL_TOPIC"
   (let ((buffer (or (rcirc-get-buffer process (cadr args))
@@ -1948,9 +2116,10 @@
   "Send authentication to process associated with current buffer.
 Passwords are stored in `rcirc-authinfo' (which see)."
   (interactive)
-  (with-rcirc-process-buffer rcirc-process
+  (with-rcirc-server-buffer
     (dolist (i rcirc-authinfo)
-      (let ((server (car i))
+      (let ((process (rcirc-buffer-process))
+	    (server (car i))
 	    (nick (caddr i))
 	    (method (cadr i))
 	    (args (cdddr i)))
@@ -1958,19 +2127,19 @@
 		   (string-match nick rcirc-nick))
 	  (cond ((equal method 'nickserv)
 		 (rcirc-send-string
-		  rcirc-process
+		  process
 		  (concat
 		   "PRIVMSG nickserv :identify "
 		   (car args))))
 		((equal method 'chanserv)
 		 (rcirc-send-string
-		  rcirc-process
+		  process
 		  (concat
 		   "PRIVMSG chanserv :identify "
 		   (cadr args) " " (car args))))
 		((equal method 'bitlbee)
 		 (rcirc-send-string
-		  rcirc-process
+		  process
 		  (concat "PRIVMSG &bitlbee :identify " (car args))))
 		(t
 		 (message "No %S authentication method defined"
@@ -2102,6 +2271,7 @@
   '((t (:bold t)))
   "The face used indicate activity directed at you."
   :group 'rcirc-faces)
+
 
 ;; When using M-x flyspell-mode, only check words after the prompt
 (put 'rcirc-mode 'flyspell-mode-predicate 'rcirc-looking-at-input)
--- a/lisp/pcomplete.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/pcomplete.el	Mon Apr 10 14:52:24 2006 +0000
@@ -978,7 +978,9 @@
 		(set-window-configuration pcomplete-last-window-config)
 		(setq pcomplete-last-window-config nil)
 		(throw 'done nil))
-	       ((event-matches-key-specifier-p event 'tab)
+	       ((or (event-matches-key-specifier-p event 'tab)
+                    ;; Needed on a terminal
+                    (event-matches-key-specifier-p event 9))
 		(save-selected-window
 		  (select-window (get-buffer-window "*Completions*"))
 		  (if (pos-visible-in-window-p (point-max))
--- a/lisp/pcvs-util.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/pcvs-util.el	Mon Apr 10 14:52:24 2006 +0000
@@ -157,10 +157,11 @@
       (setq tab-width colwidth)
       ;; The insertion should be "sensible" no matter what choices were made.
       (dolist (str strings)
-	(unless (bolp) (insert " \t"))
-	(when (< wwidth (+ (max colwidth (length str)) (current-column)))
-	  (delete-char -2) (insert "\n"))
-	(insert str)))))
+	(unless (bolp)
+          (insert " \t")
+          (when (< wwidth (+ (max colwidth (length str)) (current-column)))
+            (delete-char -2) (insert "\n")))
+        (insert str)))))
 
 
 (defun cvs-file-to-string (file &optional oneline args)
@@ -357,7 +358,8 @@
   and reset the persistence."
   (let* ((prefix (symbol-value (cvs-prefix-sym sym)))
 	 (numarg (if (integerp arg) arg 0))
-	 (defs (cvs-flags-defaults prefix)))
+	 ;; (defs (cvs-flags-defaults prefix))
+         )
 
     ;; set persistence if requested
     (when (> (prefix-numeric-value arg) 9)
--- a/lisp/pgg-gpg.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/pgg-gpg.el	Mon Apr 10 14:52:24 2006 +0000
@@ -4,7 +4,8 @@
 ;;   2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
-;; Symmetric encryption support added by: Sascha Wilde <wilde@sha-bang.de>
+;; Symmetric encryption and gpg-agent support added by: 
+;;   Sascha Wilde <wilde@sha-bang.de>
 ;; Created: 1999/10/28
 ;; Keywords: PGP, OpenPGP, GnuPG
 
@@ -28,6 +29,7 @@
 ;;; Code:
 
 (eval-when-compile
+  (require 'cl)				; for gpg macros
   (require 'pgg))
 
 (defgroup pgg-gpg ()
@@ -58,183 +60,85 @@
 (defvar pgg-gpg-user-id nil
   "GnuPG ID of your default identity.")
 
-(defvar pgg-gpg-user-id-alist nil
-  "An alist mapping from key ID to user ID.")
-
-(defvar pgg-gpg-read-point nil)
-(defvar pgg-gpg-output-file-name nil)
-(defvar pgg-gpg-pending-status-list nil)
-(defvar pgg-gpg-key-id nil)
-(defvar pgg-gpg-passphrase nil)
-(defvar pgg-gpg-debug nil)
-
-(defun pgg-gpg-start-process (args)
-  (let* ((output-file-name (pgg-make-temp-file "pgg-output"))
+(defun pgg-gpg-process-region (start end passphrase program args)
+  (let* ((use-agent (pgg-gpg-use-agent-p)) 
+	 (output-file-name (pgg-make-temp-file "pgg-output"))
 	 (args
-	  (append (list "--no-tty"
-			"--status-fd" "1"
-			"--command-fd" "0"
-			"--yes" ; overwrite
-			"--output" output-file-name)
-		  (if pgg-gpg-use-agent '("--use-agent"))
-		  pgg-gpg-extra-args
-		  args))
-	 (coding-system-for-write 'binary)
-	 (process-connection-type nil)
+	  `("--status-fd" "2"
+	    ,@(if use-agent '("--use-agent")
+		(if passphrase '("--passphrase-fd" "0")))
+	    "--yes" ; overwrite
+	    "--output" ,output-file-name
+	    ,@pgg-gpg-extra-args ,@args))
+	 (output-buffer pgg-output-buffer)
+	 (errors-buffer pgg-errors-buffer)
 	 (orig-mode (default-file-modes))
-	 default-enable-multibyte-characters
-	 (buffer (generate-new-buffer " *pgg-gpg*"))
-	 process)
-    (with-current-buffer buffer
-      (make-local-variable 'pgg-gpg-read-point)
-      (setq pgg-gpg-read-point (point-min))
-      (make-local-variable 'pgg-gpg-output-file-name)
-      (setq pgg-gpg-output-file-name output-file-name)
-      (make-local-variable 'pgg-gpg-pending-status-list)
-      (setq pgg-gpg-pending-status-list nil)
-      (make-local-variable 'pgg-gpg-key-id)
-      (setq pgg-gpg-key-id nil)
-      (make-local-variable 'pgg-gpg-passphrase)
-      (setq pgg-gpg-passphrase nil))
+	 (process-connection-type nil)
+	 exit-status)
+    (with-current-buffer (get-buffer-create errors-buffer)
+      (buffer-disable-undo)
+      (erase-buffer))
     (unwind-protect
 	(progn
 	  (set-default-file-modes 448)
-	  (setq process
-		(apply #'start-process "pgg-gpg" buffer pgg-gpg-program args)))
-      (set-default-file-modes orig-mode))
-    (set-process-filter process #'pgg-gpg-process-filter)
-    (set-process-sentinel process #'pgg-gpg-process-sentinel)
-    process))
-
-(defun pgg-gpg-process-filter (process input)
-  (save-excursion
-    (if pgg-gpg-debug
-	(save-excursion
-	  (set-buffer (get-buffer-create  " *pgg-gpg-debug*"))
-	  (goto-char (point-max))
-	  (insert input)))
-    (set-buffer (process-buffer process))
-    (goto-char (point-max))
-    (insert input)
-    (goto-char pgg-gpg-read-point)
-    (beginning-of-line)
-    (while (looking-at ".*\n")		;the input line is finished
-      (save-excursion
-	(if (looking-at "\\[GNUPG:] \\([A-Z_]+\\)\\>.*")
-	    (let* ((status (match-string 1))
-		   (symbol (intern-soft (concat "pgg-gpg-status-" status)))
-		   (entry (member status pgg-gpg-pending-status-list)))
-	      (if entry
-		  (setq pgg-gpg-pending-status-list
-			(delq (car entry)
-			      pgg-gpg-pending-status-list)))
-	      (if (and symbol
-		       (fboundp symbol))
-		  (funcall symbol process (buffer-substring (match-beginning 1)
-							    (match-end 0)))))))
-      (forward-line))
-    (setq pgg-gpg-read-point (point))))
-
-(defun pgg-gpg-process-sentinel (process status)
-  (set-process-filter process nil)
-  (save-excursion
-    ;; Copy the contents of process-buffer to pgg-errors-buffer.
-    (set-buffer (get-buffer-create pgg-errors-buffer))
-    (buffer-disable-undo)
-    (erase-buffer)
-    (when (buffer-live-p (process-buffer process))
-      (insert-buffer-substring (process-buffer process))
-      (goto-char (point-min))
-      (delete-matching-lines "^\\[GNUPG:] ")
-      (goto-char (point-min))
-      (while (re-search-forward "^gpg: " nil t)
-	(replace-match "")))
-    ;; Read the contents of the output file to pgg-output-buffer.
-    (set-buffer (get-buffer-create pgg-output-buffer))
-    (buffer-disable-undo)
-    (erase-buffer)
-    (if (and (equal status "finished\n")
-	     (buffer-live-p (process-buffer process)))
-	(let ((output-file-name (with-current-buffer (process-buffer process)
-				  pgg-gpg-output-file-name)))
-	  (when (file-exists-p output-file-name)
-	    (let ((coding-system-for-read (if pgg-text-mode
-					      'raw-text
-					    'binary)))
-	      (insert-file-contents output-file-name))
-	    (delete-file output-file-name))))))
+	  (let ((coding-system-for-write 'binary)
+		(input (buffer-substring-no-properties start end))
+		(default-enable-multibyte-characters nil))
+	    (with-temp-buffer
+	      (when passphrase
+		(insert passphrase "\n"))
+	      (insert input)
+	      (setq exit-status
+		    (apply #'call-process-region (point-min) (point-max) program
+			   nil errors-buffer nil args))))
+	  (with-current-buffer (get-buffer-create output-buffer)
+	    (buffer-disable-undo)
+	    (erase-buffer)
+	    (if (file-exists-p output-file-name)
+		(let ((coding-system-for-read (if pgg-text-mode
+						  'raw-text
+						'binary)))
+		  (insert-file-contents output-file-name)))
+	    (set-buffer errors-buffer)
+	    (if (not (equal exit-status 0))
+		(insert (format "\n%s exited abnormally: '%s'\n"
+				program exit-status)))))
+      (if (file-exists-p output-file-name)
+	  (delete-file output-file-name))
+      (set-default-file-modes orig-mode))))
 
-(defun pgg-gpg-wait-for-status (process status-list)
-  (with-current-buffer (process-buffer process)
-    (setq pgg-gpg-pending-status-list status-list)
-    (while (and (eq (process-status process) 'run)
-		pgg-gpg-pending-status-list)
-      (accept-process-output process 1))))
-
-(defun pgg-gpg-wait-for-completion (process &optional status-list)
-  (process-send-eof process)
-  (while (eq (process-status process) 'run)
-    (sit-for 0.1))
-  (save-excursion
-    (set-buffer (process-buffer process))
-    (setq status-list (copy-sequence status-list))
-    (let ((pointer status-list))
-      (while pointer
-	(goto-char (point-min))
-	(unless (re-search-forward
-		 (concat "^\\[GNUPG:] " (car pointer) "\\>")
-		 nil t)
-	  (setq status-list (delq (car pointer) status-list)))
-	(setq pointer (cdr pointer))))
-    (kill-buffer (process-buffer process))
-    status-list))
-
-(defun pgg-gpg-status-USERID_HINT (process line)
-  (if (string-match "\\`USERID_HINT \\([^ ]+\\) \\(.*\\)" line)
-      (let* ((key-id (match-string 1 line))
-	     (user-id (match-string 2 line))
-	     (entry (assoc key-id pgg-gpg-user-id-alist)))
-	(if entry
-	    (setcdr entry user-id)
-	  (setq pgg-gpg-user-id-alist (cons (cons key-id user-id)
-					    pgg-gpg-user-id-alist))))))
+(defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key notruncate)
+  (if (and passphrase
+	   pgg-cache-passphrase
+	   (progn
+	     (goto-char (point-min))
+	     (re-search-forward "^\\[GNUPG:] \\(GOOD_PASSPHRASE\\>\\)\\|\\(SIG_CREATED\\)" nil t)))
+      (pgg-add-passphrase-to-cache
+       (or key
+	   (progn
+	     (goto-char (point-min))
+	     (if (re-search-forward
+		  "^\\[GNUPG:] NEED_PASSPHRASE\\(_PIN\\)? \\w+ ?\\w*" nil t)
+		 (substring (match-string 0) -8))))
+       passphrase
+       notruncate)))
 
-(defun pgg-gpg-status-NEED_PASSPHRASE (process line)
-  (if (string-match "\\`NEED_PASSPHRASE \\([^ ]+\\)" line)
-      (setq pgg-gpg-key-id (match-string 1 line))))
-
-(defun pgg-gpg-status-NEED_PASSPHRASE_SYM (process line)
-  (setq pgg-gpg-key-id 'SYM))
-
-(defun pgg-gpg-status-NEED_PASSPHRASE_PIN (process line)
-  (setq pgg-gpg-key-id 'PIN))
+(defvar pgg-gpg-all-secret-keys 'unknown)
 
-(defun pgg-gpg-status-GET_HIDDEN (process line)
-  (let ((entry (assoc pgg-gpg-key-id pgg-gpg-user-id-alist)))
-    (if (setq pgg-gpg-passphrase
-	      (if (eq pgg-gpg-key-id 'SYM)
-		  (pgg-read-passphrase
-		   "GnuPG passphrase for symmetric encryption: ")
-		(pgg-read-passphrase
-		 (format "GnuPG passphrase for %s: "
-			 (if entry
-			     (cdr entry)
-			   pgg-gpg-key-id))
-		 (if (eq pgg-gpg-key-id 'PIN)
-		     "PIN"
-		   pgg-gpg-key-id))))
-	(process-send-string process (concat pgg-gpg-passphrase "\n")))))
-
-(defun pgg-gpg-status-GOOD_PASSPHRASE (process line)
-  (when (and pgg-gpg-passphrase
-	     (stringp pgg-gpg-key-id))
-    (pgg-add-passphrase-to-cache pgg-gpg-key-id pgg-gpg-passphrase)
-    (setq pgg-gpg-passphrase nil)))
-
-(defun pgg-gpg-status-BAD_PASSPHRASE (process line)
-  (when pgg-gpg-passphrase
-    (fillarray pgg-gpg-passphrase 0)
-    (setq pgg-gpg-passphrase nil)))
+(defun pgg-gpg-lookup-all-secret-keys ()
+  "Return all secret keys present in secret key ring."
+  (when (eq pgg-gpg-all-secret-keys 'unknown)
+    (setq pgg-gpg-all-secret-keys '())
+    (let ((args (list "--with-colons" "--no-greeting" "--batch"
+		      "--list-secret-keys")))
+      (with-temp-buffer
+	(apply #'call-process pgg-gpg-program nil t nil args)
+	(goto-char (point-min))
+	(while (re-search-forward
+		"^\\(sec\\|pub\\):[^:]*:[^:]*:[^:]*:\\([^:]*\\)" nil t)
+	  (push (substring (match-string 2) 8)
+		pgg-gpg-all-secret-keys)))))
+  pgg-gpg-all-secret-keys)
 
 (defun pgg-gpg-lookup-key (string &optional type)
   "Search keys associated with STRING."
@@ -248,15 +152,52 @@
 			     nil t)
 	  (substring (match-string 2) 8)))))
 
+(defun pgg-gpg-lookup-key-owner (string &optional all)
+  "Search keys associated with STRING and return owner of identified key.
+
+The value may be just the bare key id, or it may be a combination of the
+user name associated with the key and the key id, with the key id enclosed
+in \"<...>\" angle brackets.
+
+Optional ALL non-nil means search all keys, including secret keys."
+  (let ((args (list "--with-colons" "--no-greeting" "--batch"
+		    (if all "--list-secret-keys" "--list-keys")
+		    string))
+	(key-regexp (concat "^\\(sec\\|pub\\)"
+			    ":[^:]*:[^:]*:[^:]*:\\([^:]*\\):[^:]*"
+			    ":[^:]*:[^:]*:[^:]*:\\([^:]*\\):")))
+    (with-temp-buffer
+      (apply #'call-process pgg-gpg-program nil t nil args)
+      (goto-char (point-min))
+      (if (re-search-forward key-regexp
+			     nil t)
+	  (match-string 3)))))
+
+(defun pgg-gpg-key-id-from-key-owner (key-owner)
+  (cond ((not key-owner) nil)
+	;; Extract bare key id from outermost paired angle brackets, if any:
+	((string-match "[^<]*<\\(.+\\)>[^>]*" key-owner)
+	 (substring key-owner (match-beginning 1)(match-end 1)))
+	(key-owner)))
+
 (defun pgg-gpg-encrypt-region (start end recipients &optional sign passphrase)
   "Encrypt the current region between START and END.
 
-If optional argument SIGN is non-nil, do a combined sign and encrypt."
+If optional argument SIGN is non-nil, do a combined sign and encrypt.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
   (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
+	 (passphrase (or passphrase
+			 (when (and sign (not (pgg-gpg-use-agent-p)))
+			   (pgg-read-passphrase
+			    (format "GnuPG passphrase for %s: "
+				    pgg-gpg-user-id)
+			    pgg-gpg-user-id))))
 	 (args
 	  (append
-	   '("--armor" "--always-trust" "--encrypt")
-	   (if pgg-text-mode '("--textmode"))
+	   (list "--batch" "--armor" "--always-trust" "--encrypt")
+	   (if pgg-text-mode (list "--textmode"))
 	   (if sign (list "--sign" "--local-user" pgg-gpg-user-id))
 	   (if recipients
 	       (apply #'nconc
@@ -264,71 +205,178 @@
 				(list pgg-gpg-recipient-argument rcpt))
 			      (append recipients
 				      (if pgg-encrypt-for-me
-					  (list pgg-gpg-user-id))))))))
-	 (process (pgg-gpg-start-process args)))
-    (if (and sign (not pgg-gpg-use-agent))
-	(pgg-gpg-wait-for-status process '("GOOD_PASSPHRASE")))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("SIG_CREATED" "END_ENCRYPTION"))))
+					  (list pgg-gpg-user-id)))))))))
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (when sign
+      (with-current-buffer pgg-errors-buffer
+	;; Possibly cache passphrase under, e.g. "jas", for future sign.
+	(pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
+	;; Possibly cache passphrase under, e.g. B565716F, for future decrypt.
+	(pgg-gpg-possibly-cache-passphrase passphrase)))
+    (pgg-process-when-success)))
 
 (defun pgg-gpg-encrypt-symmetric-region (start end &optional passphrase)
-  "Encrypt the current region between START and END with symmetric cipher."
-  (let* ((args
-	  (append '("--armor" "--symmetric")
-		  (if pgg-text-mode '("--textmode"))))
-	 (process (pgg-gpg-start-process args)))
-    (pgg-gpg-wait-for-status process '("BEGIN_ENCRYPTION"))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("END_ENCRYPTION"))))
+  "Encrypt the current region between START and END with symmetric cipher.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
+  (let* ((passphrase (or passphrase
+			 (when (not (pgg-gpg-use-agent-p))
+			   (pgg-read-passphrase
+			    "GnuPG passphrase for symmetric encryption: "))))
+	 (args
+	  (append (list "--batch" "--armor" "--symmetric" )
+		  (if pgg-text-mode (list "--textmode")))))
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (pgg-process-when-success)))
 
 (defun pgg-gpg-decrypt-region (start end &optional passphrase)
-  "Decrypt the current region between START and END."
-  (let* ((args '("--decrypt"))
-	 (process (pgg-gpg-start-process args)))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-status process '("BEGIN_DECRYPTION"))
-    (pgg-gpg-wait-for-completion process '("GOODSIG" "DECRYPTION_OKAY"))))
+  "Decrypt the current region between START and END.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
+  (let* ((current-buffer (current-buffer))
+	 (message-keys (with-temp-buffer
+			 (insert-buffer-substring current-buffer)
+			 (pgg-decode-armor-region (point-min) (point-max))))
+	 (secret-keys (pgg-gpg-lookup-all-secret-keys))
+	 ;; XXX the user is stuck if they need to use the passphrase for
+	 ;;     any but the first secret key for which the message is
+	 ;;     encrypted.  ideally, we would incrementally give them a
+	 ;;     chance with subsequent keys each time they fail with one.
+	 (key (pgg-gpg-select-matching-key message-keys secret-keys))
+	 (key-owner (and key (pgg-gpg-lookup-key-owner key t)))
+	 (key-id (pgg-gpg-key-id-from-key-owner key-owner))
+	 (pgg-gpg-user-id (or key-id key
+			      pgg-gpg-user-id pgg-default-user-id))
+	 (passphrase (or passphrase
+			 (when (not (pgg-gpg-use-agent-p))
+			   (pgg-read-passphrase
+			    (format (if (pgg-gpg-symmetric-key-p message-keys)
+					"Passphrase for symmetric decryption: "
+				      "GnuPG passphrase for %s: ")
+				    (or key-owner "??"))
+			    pgg-gpg-user-id))))
+	 (args '("--batch" "--decrypt")))
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (with-current-buffer pgg-errors-buffer
+      (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
+      (goto-char (point-min))
+      (re-search-forward "^\\[GNUPG:] DECRYPTION_OKAY\\>" nil t))))
+
+;;;###autoload
+(defun pgg-gpg-symmetric-key-p (message-keys)
+  "True if decoded armor MESSAGE-KEYS has symmetric encryption indicator."
+  (let (result)
+    (dolist (key message-keys result)
+      (when (and (eq (car key) 3)
+		 (member '(symmetric-key-algorithm) key))
+	(setq result key)))))
+
+(defun pgg-gpg-select-matching-key (message-keys secret-keys)
+  "Choose a key from MESSAGE-KEYS that matches one of the keys in SECRET-KEYS."
+  (loop for message-key in message-keys
+	for message-key-id = (and (equal (car message-key) 1)
+				  (cdr (assq 'key-identifier
+					     (cdr message-key))))
+	for key = (and message-key-id (pgg-lookup-key message-key-id 'encrypt))
+	when (and key (member key secret-keys)) return key))
 
 (defun pgg-gpg-sign-region (start end &optional cleartext passphrase)
   "Make detached signature from text between START and END."
   (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
+	 (passphrase (or passphrase
+			 (when (not (pgg-gpg-use-agent-p))
+			   (pgg-read-passphrase
+			    (format "GnuPG passphrase for %s: "
+				    pgg-gpg-user-id)
+			    pgg-gpg-user-id))))
 	 (args
 	  (append (list (if cleartext "--clearsign" "--detach-sign")
-			"--armor" "--verbose"
+			"--armor" "--batch" "--verbose"
 			"--local-user" pgg-gpg-user-id)
-		  (if pgg-text-mode '("--textmode"))))
-	 (process (pgg-gpg-start-process args)))
-    (unless pgg-gpg-use-agent
-      (pgg-gpg-wait-for-status process '("GOOD_PASSPHRASE")))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("SIG_CREATED"))))
+		  (if pgg-text-mode (list "--textmode"))))
+	 (inhibit-read-only t)
+	 buffer-read-only)
+    (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
+    (with-current-buffer pgg-errors-buffer
+      ;; Possibly cache passphrase under, e.g. "jas", for future sign.
+      (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
+      ;; Possibly cache passphrase under, e.g. B565716F, for future decrypt.
+      (pgg-gpg-possibly-cache-passphrase passphrase))
+    (pgg-process-when-success)))
 
 (defun pgg-gpg-verify-region (start end &optional signature)
   "Verify region between START and END as the detached signature SIGNATURE."
-  (let ((args '("--verify"))
-	process)
+  (let ((args '("--batch" "--verify")))
     (when (stringp signature)
       (setq args (append args (list signature))))
-    (setq process (pgg-gpg-start-process (append args '("-"))))
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("GOODSIG"))))
+    (setq args (append args '("-")))
+    (pgg-gpg-process-region start end nil pgg-gpg-program args)
+    (with-current-buffer pgg-errors-buffer
+      (goto-char (point-min))
+      (while (re-search-forward "^gpg: \\(.*\\)\n" nil t)
+	(with-current-buffer pgg-output-buffer
+	  (insert-buffer-substring pgg-errors-buffer
+				   (match-beginning 1) (match-end 0)))
+	(delete-region (match-beginning 0) (match-end 0)))
+      (goto-char (point-min))
+      (re-search-forward "^\\[GNUPG:] GOODSIG\\>" nil t))))
 
 (defun pgg-gpg-insert-key ()
   "Insert public key at point."
   (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
-	 (args (list "--export" "--armor"
-		     pgg-gpg-user-id))
-	 (process (pgg-gpg-start-process args)))
-    (pgg-gpg-wait-for-completion process)
+	 (args (list "--batch" "--export" "--armor"
+		     pgg-gpg-user-id)))
+    (pgg-gpg-process-region (point)(point) nil pgg-gpg-program args)
     (insert-buffer-substring pgg-output-buffer)))
 
 (defun pgg-gpg-snarf-keys-region (start end)
   "Add all public keys in region between START and END to the keyring."
-  (let* ((args '("--import" "-"))
-	 (process (pgg-gpg-start-process args))
-	 status)
-    (process-send-region process start end)
-    (pgg-gpg-wait-for-completion process '("IMPORT_RES"))))
+  (let ((args '("--import" "--batch" "-")) status)
+    (pgg-gpg-process-region start end nil pgg-gpg-program args)
+    (set-buffer pgg-errors-buffer)
+    (goto-char (point-min))
+    (when (re-search-forward "^\\[GNUPG:] IMPORT_RES\\>" nil t)
+      (setq status (buffer-substring (match-end 0)
+				     (progn (end-of-line)(point)))
+	    status (vconcat (mapcar #'string-to-number (split-string status))))
+      (erase-buffer)
+      (insert (format "Imported %d key(s).
+\tArmor contains %d key(s) [%d bad, %d old].\n"
+		      (+ (aref status 2)
+			 (aref status 10))
+		      (aref status 0)
+		      (aref status 1)
+		      (+ (aref status 4)
+			 (aref status 11)))
+	      (if (zerop (aref status 9))
+		  ""
+		"\tSecret keys are imported.\n")))
+    (append-to-buffer pgg-output-buffer (point-min)(point-max))
+    (pgg-process-when-success)))
+
+(defun pgg-gpg-update-agent ()
+  "Try to connet to gpg-agent and send UPDATESTARTUPTTY."
+  (if (fboundp 'make-network-process)
+      (let* ((agent-info (getenv "GPG_AGENT_INFO"))
+	     (socket (and agent-info
+			  (string-match "^\\([^:]*\\)" agent-info)
+			  (match-string 1 agent-info)))
+	     (conn (and socket
+			(make-network-process :name "gpg-agent-process"
+					      :host 'local :family 'local
+					      :service socket))))
+	(when (and conn (eq (process-status conn) 'open))
+	  (process-send-string conn "UPDATESTARTUPTTY\n")
+	  (delete-process conn)
+	  t))
+    ;; We can't check, so assume gpg-agent is up.
+    t))
+
+(defun pgg-gpg-use-agent-p ()
+  "Return t if `pgg-gpg-use-agent' is t and gpg-agent is available."
+  (and pgg-gpg-use-agent (pgg-gpg-update-agent)))
 
 (provide 'pgg-gpg)
 
--- a/lisp/play/landmark.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/play/landmark.el	Mon Apr 10 14:52:24 2006 +0000
@@ -211,22 +211,24 @@
 (defvar lm-emacs-won ()
   "*For making font-lock use the winner's face for the line.")
 
-(defvar lm-font-lock-face-O
-  (if (display-color-p)
-      (list (facemenu-get-face 'fg:red) 'bold))
-  "*Face to use for Emacs' O.")
+(defface lm-font-lock-face-O '((((class color)) :foreground "red")
+			       (t :weight bold))
+  "*Face to use for Emacs' O."
+  :version "22.1"
+  :group 'lm)
 
-(defvar lm-font-lock-face-X
-  (if (display-color-p)
-      (list (facemenu-get-face 'fg:green) 'bold))
-  "*Face to use for your X.")
+(defface lm-font-lock-face-X '((((class color)) :foreground "green")
+			       (t :weight bold))
+  "*Face to use for your X."
+  :version "22.1"
+  :group 'lm)
 
 (defvar lm-font-lock-keywords
-  '(("O" . lm-font-lock-face-O)
-    ("X" . lm-font-lock-face-X)
+  '(("O" . 'lm-font-lock-face-O)
+    ("X" . 'lm-font-lock-face-X)
     ("[-|/\\]" 0 (if lm-emacs-won
-		     lm-font-lock-face-O
-		   lm-font-lock-face-X)))
+		     'lm-font-lock-face-O
+		   'lm-font-lock-face-X)))
   "*Font lock rules for Lm.")
 
 (put 'lm-mode 'front-sticky
--- a/lisp/progmodes/compile.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/progmodes/compile.el	Mon Apr 10 14:52:24 2006 +0000
@@ -527,11 +527,14 @@
   :group 'compilation
   :version "22.1")
 
-(defvar compilation-message-face 'underline
+(defcustom compilation-message-face 'underline
   "Face name to use for whole messages.
 Faces `compilation-error-face', `compilation-warning-face',
 `compilation-info-face', `compilation-line-face' and
-`compilation-column-face' get prepended to this, when applicable.")
+`compilation-column-face' get prepended to this, when applicable."
+  :type 'face
+  :group 'compilation
+  :version "22.1")
 
 (defvar compilation-error-face 'compilation-error
   "Face name to use for file name in error messages.")
--- a/lisp/progmodes/gdb-ui.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/progmodes/gdb-ui.el	Mon Apr 10 14:52:24 2006 +0000
@@ -571,9 +571,9 @@
 	   'gdb-set-gud-minor-mode-existing-buffers-1))
     (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-2))
 
-  ;; find source file and compilation directory here
-  (gdb-enqueue-input (list "server list main\n"   'ignore))   ; C program
-  (gdb-enqueue-input (list "server list MAIN__\n" 'ignore))   ; Fortran program
+  ;; Find source file and compilation directory here.
+  ;; Works for C, C++, Fortran and Ada but not Java (GDB 6.4)
+  (gdb-enqueue-input (list "server list\n" 'ignore))
   (gdb-enqueue-input (list "server info source\n" 'gdb-source-info))
 
   (run-hooks 'gdba-mode-hook))
--- a/lisp/progmodes/idlw-complete-structtag.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/progmodes/idlw-complete-structtag.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1,8 +1,7 @@
 ;;; idlw-complete-structtag.el --- Completion of structure tags.
-;; Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
+;; Copyright (c) 2001,2002,2003,2004,2005,2006 Free Software Foundation
 
-;; Author: Carsten Dominik <dominik@science.uva.nl>
+;; Author: Carsten Dominik <dominik@astro.uva.nl>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
 ;; Version: 1.2
 ;; Keywords: languages
@@ -54,10 +53,10 @@
 ;;
 ;; INSTALLATION
 ;; ============
-;; Put this file on the emacs load path and load it with the following
+;; Put this file on the emacs load path and load it with the following 
 ;; line in your .emacs file:
 ;;
-;;   (add-hook 'idlwave-load-hook
+;;   (add-hook 'idlwave-load-hook 
 ;;             (lambda () (require 'idlw-complete-structtag)))
 ;;
 ;; DESCRIPTION
@@ -88,7 +87,7 @@
 ;;  - You can force an update of the tag list with the usual command
 ;;    to update routine info in IDLWAVE: C-c C-i
 
-(defvar idlwave-completion-help-info)
+(require 'idlwave)
 
 ;; Some variables to identify the previously used structure
 (defvar idlwave-current-tags-var nil)
@@ -107,7 +106,7 @@
 (add-hook 'idlwave-update-rinfo-hook 'idlwave-structtag-reset)
 
 ;;; The main code follows below
-
+(defvar idlwave-completion-help-info)
 (defun idlwave-complete-structure-tag ()
   "Complete a structure tag.
 This works by looking in the current file for a structure assignment to a
@@ -146,9 +145,9 @@
                   (not (equal start idlwave-current-tags-completion-pos)))
 	      (idlwave-prepare-structure-tag-completion var))
           (setq idlwave-current-tags-completion-pos start)
-	  (setq idlwave-completion-help-info
+	  (setq idlwave-completion-help-info 
 		(list 'idlwave-complete-structure-tag-help))
-	  (idlwave-complete-in-buffer 'structtag 'structtag
+	  (idlwave-complete-in-buffer 'structtag 'structtag 
 				      idlwave-current-struct-tags nil
 				      "Select a structure tag" "structure tag")
 	  t) ; we did the completion: return t to skip other completions
@@ -167,7 +166,7 @@
   (if (eq major-mode 'idlwave-shell-mode)
       ;; OK, we are in the shell, do it dynamically
       (progn
-        (message "preparing shell tags")
+        (message "preparing shell tags") 
         ;; The following call puts the tags into `idlwave-current-struct-tags'
         (idlwave-complete-structure-tag-query-shell var)
         ;; initialize
@@ -189,7 +188,7 @@
             ;; Find possible definitions of the structure.
             (while (idlwave-find-structure-definition var nil 'all)
               (let ((tags (idlwave-struct-tags)))
-                (when tags
+                (when tags 
                   ;; initialize
                   (setq idlwave-sint-structtags nil
                         idlwave-current-tags-buffer (current-buffer)
--- a/lisp/progmodes/idlw-help.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/progmodes/idlw-help.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1,12 +1,12 @@
 ;;; idlw-help.el --- HTML Help code for IDLWAVE
 ;; Copyright (c) 2000 Carsten Dominik
 ;; Copyright (c) 2001, 2002 J.D. Smith
-;; Copyright (c) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+;; Copyright (c) 2003,2004,2005,2006 Free Software Foundation
 ;;
 ;; Authors: J.D. Smith <jdsmith@as.arizona.edu>
 ;;          Carsten Dominik <dominik@science.uva.nl>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 
 ;; This file is part of GNU Emacs.
 
@@ -36,13 +36,12 @@
 ;; information, at:
 ;;
 ;;           http://idlwave.org
-;;
+;; 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
+
 ;;; Code:
-(defvar browse-url-generic-args)
-
 (defvar idlwave-help-browse-url-available nil
   "Whether browse-url is available")
 
@@ -60,25 +59,32 @@
   :group 'idlwave-online-help
   :type 'boolean)
 
-(defvar idlwave-html-link-sep
+(defvar idlwave-html-link-sep 
   (if idlwave-html-help-pre-v6 "#" "#wp"))
 
-(defcustom idlwave-html-help-location
-  (if (memq system-type '(ms-dos windows-nt))
-      nil
-    "/usr/local/etc/")
-  "The directory where the idl_html_help/ dir or idl.chm help file
-(Windows only) lives."
+(defcustom idlwave-html-system-help-location   "help/online_help/"
+  "The directory, relative to idlwave-system-directory, where the idl
+HTML help files live, for IDL 6.2 and later.  This location, if found,
+is used in preference to the old idlwave-html-help-location."
   :group 'idlwave-online-help
   :type 'directory)
 
-(defcustom idlwave-help-use-hh nil
-  "Whether to use the HTMLHelp viewer with idl.chm (Windows only)."
+(defcustom idlwave-html-help-location 
+   (if (memq system-type '(ms-dos windows-nt))
+      nil
+    "/usr/local/etc/")
+  "The directory where the idl_html_help/ dir lives.  Obsolete for IDL
+6.2 or later (see idlwave-html-system-help-location)."
   :group 'idlwave-online-help
-  :type '(choice :tag "use help viewer"
-		 (const :tag "<none>" nil)
-		 (const :tag "hh" 'hh)
-		 (const :tag "keyhh" 'keyhh)))
+  :type 'directory)
+
+(defvar idlwave-help-use-hh nil
+  "Obsolete variable.") 
+
+(defcustom idlwave-help-use-assistant t
+  "Whether to use the IDL Assistant as the help browser."
+  :group 'idlwave-online-help
+  :type 'boolean)
 
 (defcustom idlwave-help-browser-function browse-url-browser-function
   "Function to use to display html help.
@@ -91,7 +97,9 @@
   :group 'idlwave-online-help
   :type 'string)
 
-(defcustom idlwave-help-browser-generic-args
+(defvar browse-url-generic-args)
+
+(defcustom idlwave-help-browser-generic-args 
   (if (boundp 'browse-url-generic-args)
       browse-url-generic-args "")
   "Program args to use if using browse-url-generic-program."
@@ -198,7 +206,7 @@
 
 (defvar idlwave-help-activate-links-aggressively nil
   "Obsolete variable.")
-
+  
 (defvar idlwave-completion-help-info)
 
 (defvar idlwave-help-frame nil
@@ -289,22 +297,39 @@
   (set (make-local-variable 'idlwave-help-def-pos) nil)
   (set (make-local-variable 'idlwave-help-args) nil)
   (set (make-local-variable 'idlwave-help-in-header) nil)
-  (run-mode-hooks 'idlwave-help-mode-hook))
+  (run-hooks 'idlwave-help-mode-hook))
 
-(defvar idlwave-system-directory)
 (defun idlwave-html-help-location ()
   "Return the help directory where HTML files are, or nil if that is unknown."
-  (or (and (stringp idlwave-html-help-location)
-	   (> (length idlwave-html-help-location) 0)
-	   (file-directory-p idlwave-html-help-location)
-	   idlwave-html-help-location)
-      (getenv "IDLWAVE_HELP_LOCATION")
-      (and (memq system-type '(ms-dos windows-nt)) ; Base it on sysdir
-	   idlwave-help-use-hh
-	   (stringp idlwave-system-directory)
-	   (> (length idlwave-system-directory) 0)
-	   (file-directory-p idlwave-system-directory)
-	   (expand-file-name "HELP" idlwave-system-directory))))
+  (let ((syshelp-dir (expand-file-name 
+		      idlwave-html-system-help-location (idlwave-sys-dir)))
+	(help-dir (or (and (stringp idlwave-html-help-location)
+			   (> (length idlwave-html-help-location) 0)
+			   idlwave-html-help-location)
+		      (getenv "IDLWAVE_HELP_LOCATION"))))
+    (if (file-directory-p syshelp-dir) 
+	syshelp-dir
+      (setq help-dir (expand-file-name "idl_html_help" help-dir))
+      (if (file-directory-p help-dir) help-dir))))
+      
+(defvar idlwave-help-assistant-available nil) 
+
+(defun idlwave-help-check-locations ()
+  ;; Check help locations and assistant.
+  (let ((sys-dir (idlwave-sys-dir))
+	(help-loc (idlwave-html-help-location)))
+    (if (or (not (file-directory-p sys-dir))
+	    (not (file-directory-p help-loc)))
+	(message
+	 "HTML help location not found: try setting `idlwave-system-directory' and/or `idlwave-html-help-location'."))
+    ;; see if we have the assistant
+    (when (and idlwave-help-use-assistant
+	       (not (eq (idlwave-help-assistant-available) t)))
+      (message "Cannot locate IDL Assistant, enabling default browser.")
+      (setq idlwave-help-use-assistant nil)
+      (unless idlwave-help-browse-url-available
+	(error "browse-url is not available; install it or IDL Assistant to use HTML help.")))))
+
 
 (defvar idlwave-current-obj_new-class)
 (defvar idlwave-help-diagnostics)
@@ -326,7 +351,7 @@
       (setq idlwave-last-context-help-pos marker)
       (idlwave-do-context-help1 arg)
       (if idlwave-help-diagnostics
-	  (message "%s" (mapconcat 'identity
+	  (message "%s" (mapconcat 'identity 
 				   (nreverse idlwave-help-diagnostics)
 				   "; "))))))
 
@@ -339,7 +364,7 @@
 (defun idlwave-do-context-help1 (&optional arg)
   "The work-horse version of `idlwave-context-help', which see."
   (save-excursion
-    (if (equal (char-after) ?/)
+    (if (equal (char-after) ?/) 
 	(forward-char 1)
       (if (equal (char-before) ?=)
 	  (backward-char 1)))
@@ -349,15 +374,15 @@
 	   (beg (save-excursion (skip-chars-backward chars) (point)))
 	   (end (save-excursion (skip-chars-forward chars) (point)))
 	   (this-word (buffer-substring-no-properties beg end))
-	   (st-ass (assoc (downcase this-word)
-			  idlwave-help-special-topic-words))
+	   (st-ass (assoc-string this-word
+				 idlwave-help-special-topic-words t))
 	   (classtag (and (string-match "self\\." this-word)
 			  (< beg (- end 4))))
 	   (structtag (and (fboundp 'idlwave-complete-structure-tag)
 			   (string-match "\\`\\([^.]+\\)\\." this-word)
 			   (< beg (- end 4))))
 	   module keyword cw mod1 mod2 mod3)
-      (if (or arg
+      (if (or arg 
 	      (and (not st-ass)
 		   (not classtag)
 		   (not structtag)
@@ -376,15 +401,15 @@
 		      (setq module (list "init" 'fun (match-string 1 str))
 			    idlwave-current-obj_new-class (match-string 1 str))
 		    )))))
-      (cond
+      (cond 
        (arg (setq mod1 module))
-
+       
        ;; A special topic -- only system help
        (st-ass (setq mod1 (list (cdr st-ass))))
-
+       
        ;; A system variable -- only system help
-       ((string-match
-	 "\\`!\\([a-zA-Z0-9_]+\\)\\(\.\\([A-Za-z0-9_]+\\)\\)?"
+       ((string-match 
+	 "\\`!\\([a-zA-Z0-9_]+\\)\\(\.\\([A-Za-z0-9_]+\\)\\)?" 
 	 this-word)
 	(let* ((word  (match-string-no-properties 1 this-word))
 	       (entry (assq (idlwave-sintern-sysvar word)
@@ -396,10 +421,10 @@
 				      (cdr (assq 'tags entry))))))
 	       (link (nth 1 (assq 'link entry))))
 	  (if tag-target
-	      (setq link (idlwave-substitute-link-target link
+	      (setq link (idlwave-substitute-link-target link 
 							 tag-target)))
 	  (setq mod1 (list link))))
-
+			  
        ;; An executive command -- only system help
        ((string-match "^\\.\\([A-Z_]+\\)" this-word)
 	(let* ((word  (match-string 1 this-word))
@@ -407,7 +432,7 @@
 			    word
 			    idlwave-executive-commands-alist t))))
 	  (setq mod1 (list link))))
-
+       
        ;; A class -- system OR in-text help (via class__define).
        ((and (eq cw 'class)
 	     (or (idlwave-in-quote)  ; e.g. obj_new
@@ -421,28 +446,28 @@
 	       (name   (concat (downcase this-word) "__define"))
 	       (link   (nth 1 (assq 'link entry))))
 	  (setq mod1 (list link name 'pro))))
-
+       
        ;; A class structure tag (self.BLAH) -- only in-text help available
        (classtag
 	(let ((tag (substring this-word (match-end 0)))
 	      class-with found-in)
-	  (when (setq class-with
+	  (when (setq class-with 
 		      (idlwave-class-or-superclass-with-tag
 		       (nth 2 (idlwave-current-routine))
 		       tag))
 	    (setq found-in (idlwave-class-found-in class-with))
-	    (if (assq (idlwave-sintern-class class-with)
+	    (if (assq (idlwave-sintern-class class-with) 
 		      idlwave-system-class-info)
 		(error "No help available for system class tags"))
 	    (setq idlwave-help-do-class-struct-tag t)
-	    (setq mod1 (list nil
+	    (setq mod1 (list nil 
 			     (if found-in
 				 (cons (concat found-in "__define") class-with)
 			       (concat class-with "__define"))
 			     'pro
 			     nil ; no class.... it's a procedure!
 			     tag)))))
-
+       
        ;; A regular structure tag -- only in text, and if
        ;; optional `complete-structtag' loaded.
        (structtag
@@ -453,7 +478,7 @@
 	  (setq idlwave-help-do-struct-tag
 		idlwave-structtag-struct-location
 		mod1 (list nil nil nil nil tag))))
-
+       
        ;; A routine keyword -- in text or system help
        ((and (memq cw '(function-keyword procedure-keyword))
 	     (stringp this-word)
@@ -495,7 +520,7 @@
 	       (setq mod1 (append (list t) module (list keyword))
 		     mod2 (list t this-word 'fun nil)
 		     mod3 (append (list t) module)))))
-
+       
        ;; Everything else
        (t
 	(setq mod1 (append (list t) module))))
@@ -528,14 +553,14 @@
 	 word link)
     (mouse-set-point ev)
 
-
+	  
     ;; See if we can also find help somewhere, e.g. for multiple classes
     (setq word (idlwave-this-word))
     (if (string= word "")
 	(error "No help item selected"))
     (setq link (get-text-property 0 'link word))
     (select-window cw)
-    (cond
+    (cond 
      ;; Routine name
      ((memq what '(procedure function routine))
       (setq name word)
@@ -546,9 +571,9 @@
 			   type)))
 	    (setq link t)		; No specific link valid yet
 	    (if sclasses
-		(setq classes (idlwave-members-only
+		(setq classes (idlwave-members-only 
 			       classes (cons class sclasses))))
-	    (setq class (idlwave-popup-select ev classes
+	    (setq class (idlwave-popup-select ev classes 
 					      "Select Class" 'sort))))
 
       ;; XXX is this necessary, given all-method-classes?
@@ -568,7 +593,7 @@
 			   type)))
 	    (setq link t) ; Link can't be correct yet
 	    (if sclasses
-		(setq classes (idlwave-members-only
+		(setq classes (idlwave-members-only 
 			       classes (cons class sclasses))))
 	    (setq class (idlwave-popup-select ev classes
 					      "Select Class" 'sort))
@@ -580,14 +605,14 @@
 	(if (string= (downcase name) "obj_new")
 	    (setq class idlwave-current-obj_new-class
 		  name "Init"))))
-
+	  
      ;; Class name
      ((eq what 'class)
       (setq class word
 	    word nil))
-
+     
      ;; A special named function to call which sets some of our variables
-     ((and (symbolp what)
+     ((and (symbolp what) 
 	   (fboundp what))
       (funcall what 'set word))
 
@@ -602,7 +627,7 @@
   "Highlight all completions for which help is available and attach link.
 Those words in `idlwave-completion-help-links' have links.  The
 `idlwave-help-link' face is used for this."
-  (if idlwave-highlight-help-links-in-completion
+  (if idlwave-highlight-help-links-in-completion      
       (with-current-buffer (get-buffer "*Completions*")
 	(save-excursion
 	  (let* ((case-fold-search t)
@@ -618,7 +643,7 @@
 	      (setq beg (match-beginning 1) end (match-end 1)
 		    word (match-string 1) doit nil)
 	      ;; Call special completion function test
-	      (if (and (symbolp what)
+	      (if (and (symbolp what) 
 		       (fboundp what))
 		  (setq doit (funcall what 'test word))
 		;; Look for special link property passed in help-links
@@ -649,13 +674,13 @@
 	     ;; Try to select the return frame.
 	     ;; This can crash on slow network connections, obviously when
 	     ;; we kill the help frame before the return-frame is selected.
-	     ;; To protect the workings, we wait for up to one second
+	     ;; To protect the workings, we wait for up to one second 
 	     ;; and check if the return-frame *is* now selected.
 	     ;; This is marked "eperimental" since we are not sure when its OK.
 	     (let ((maxtime 1.0) (time 0.) (step 0.1))
 	       (select-frame idlwave-help-return-frame)
 	       (while (and (sit-for step)
-			   (not (eq (selected-frame)
+			   (not (eq (selected-frame) 
 				    idlwave-help-return-frame))
 			   (< (setq time (+ time step)) maxtime)))))
 	 (delete-frame idlwave-help-frame))
@@ -668,7 +693,7 @@
 (defvar default-toolbar-visible-p)
 
 (defun idlwave-help-display-help-window (&optional pos-or-func)
-  "Display the help window.
+  "Display the help window.  
 Move window start to POS-OR-FUNC, if passed as a position, or call it
 if passed as a function.  See `idlwave-help-use-dedicated-frame'."
   (let ((cw (selected-window))
@@ -679,13 +704,13 @@
 	  (switch-to-buffer buf))
       ;; Do it in this frame and save the window configuration
       (if (not (get-buffer-window buf nil))
-	  (setq idlwave-help-window-configuration
+	  (setq idlwave-help-window-configuration 
 		(current-window-configuration)))
       (display-buffer buf nil (selected-frame))
       (select-window (get-buffer-window buf)))
     (raise-frame)
-    (if pos-or-func
-	(if (functionp pos-or-func)
+    (if pos-or-func 
+	(if (functionp pos-or-func) 
 	    (funcall pos-or-func)
 	  (goto-char pos-or-func)
 	  (recenter 0)))
@@ -707,31 +732,43 @@
       (select-frame idlwave-help-return-frame)))
 
 (defun idlwave-online-help (link &optional name type class keyword)
-  "Display HTML or other special help on a certain topic.
+  "Display HTML or other special help on a certain topic.  
 Either loads an HTML link, if LINK is non-nil, or gets special-help on
 the optional arguments, if any special help is defined.  If LINK is
 `t', first look up the optional arguments in the routine info list to
 see if a link is set for it.  Try extra help functions if necessary."
   ;; Lookup link
-  (if (eq link t)
-      (let ((entry (idlwave-best-rinfo-assoc name type class
+  (if (eq link t) 
+      (let ((entry (idlwave-best-rinfo-assoc name type class 
 					     (idlwave-routines) nil t)))
-	(cond
-	 ;; Try keyword link
-	 ((and keyword
-	       (setq link (cdr (idlwave-entry-find-keyword entry keyword)))))
-	 ;; Default, regular entry link
-	 (t (setq link (idlwave-entry-has-help entry))))))
+	(if entry
+	    (cond
+	     ;; Try keyword link
+	     ((and keyword 
+		   (setq link (cdr 
+			       (idlwave-entry-find-keyword entry keyword)))))
+	     ;; Default, regular entry link
+	     (t (setq link (idlwave-entry-has-help entry))))
+	  (if (and 
+	       class
+	       ;; Check for system class help
+	       (setq entry (assq (idlwave-sintern-class class)
+				 idlwave-system-class-info)
+		     link (nth 1 (assq 'link entry))))
+	      (message 
+	       (concat "No routine info for %s"
+		       ", falling back on class help.")
+	       (idlwave-make-full-name class name))))))
 
   (cond
    ;; An explicit link
-   ((stringp link)
+   ((stringp link) 
     (idlwave-help-html-link link))
-
+   
    ;; Any extra help
    (idlwave-extra-help-function
     (idlwave-help-get-special-help name type class keyword))
-
+   
    ;; Nothing worked
    (t (idlwave-help-error name type class keyword))))
 
@@ -742,7 +779,7 @@
 	 (help-pos (save-excursion
 		     (set-buffer (idlwave-help-get-help-buffer))
 		     (let ((buffer-read-only nil))
-		       (funcall idlwave-extra-help-function
+		       (funcall idlwave-extra-help-function 
 				name type class keyword)))))
     (if help-pos
 	(idlwave-help-display-help-window help-pos)
@@ -757,36 +794,22 @@
 	;(browse-url-generic-args idlwave-help-browser-generic-args)
 	full-link)
 
-    (unless idlwave-help-browse-url-available
-      (error "browse-url is not available -- install it to use HTML help."))
+    ;; Just a regular file name (+ anchor name)
+    (unless (and (stringp help-loc)
+		 (file-directory-p help-loc))
+      (error "Invalid help location."))
+    (setq full-link (browse-url-file-url (expand-file-name link help-loc)))
 
-    (if (and (memq system-type '(ms-dos windows-nt))
-	     idlwave-help-use-hh)
-	(progn
-	  (setq browse-url-browser-function 'browse-url-generic
-		full-link (concat (expand-file-name "idl.chm" help-loc)
-				  "::/"
-				  link))
-	  (if (memq 'keyhh idlwave-help-use-hh)
-	      (setq browse-url-generic-program "KEYHH"
-		    browse-url-generic-args '("-IDLWAVE"))
-	    (setq browse-url-generic-program "HH")))
-      ;; Just a regular file name (+ anchor name)
-      (unless (and (stringp help-loc)
-		   (file-directory-p help-loc))
-	(error
-	 "Invalid help location; customize `idlwave-html-help-location'."))
-      (setq full-link (concat
-		       "file://"
-		       (expand-file-name
-			link
-			(expand-file-name "idl_html_help" help-loc)))))
+    ;; Select the browser
+    (cond
+     (idlwave-help-use-assistant
+      (idlwave-help-assistant-open-link link))
 
-    ;; Check for a local browser
-    (if (or idlwave-help-browser-is-local
-	    (string-match "w3" (symbol-name idlwave-help-browser-function)))
-	(idlwave-help-display-help-window '(lambda () (browse-url full-link)))
-      (browse-url full-link))))
+     ((or idlwave-help-browser-is-local
+	  (string-match "w3" (symbol-name idlwave-help-browser-function)))
+      (idlwave-help-display-help-window '(lambda () (browse-url full-link))))
+
+     (t (browse-url full-link)))))
 
 ;; A special help routine for source-level syntax help in files.
 (defvar idlwave-help-fontify-source-code)
@@ -814,7 +837,7 @@
     (if class-only   ;Help with class?  Using "Init" as source.
 	(setq name "Init"
 	      type 'fun))
-    (if (not struct-tag)
+    (if (not struct-tag) 
 	(setq file
 	      (idlwave-routine-source-file
 	       (nth 3 (idlwave-best-rinfo-assoc
@@ -827,16 +850,15 @@
     (if (or struct-tag (stringp file))
 	(progn
 	  (setq in-buf ; structure-tag completion is always in current buffer
-		(if struct-tag
+		(if struct-tag 
 		    idlwave-current-tags-buffer
 		  (idlwave-get-buffer-visiting file)))
 	  ;; see if file is in a visited buffer, insert those contents
 	  (if in-buf
 	      (progn
 		(setq file (buffer-file-name in-buf))
-		(erase-buffer)
-		(insert-buffer-substring in-buf)
-                (goto-char (point-min)))
+		(erase-buffer)		
+		(insert-buffer-substring in-buf))
 	    (if (file-exists-p file) ;; otherwise just load the file
 		(progn
 		  (erase-buffer)
@@ -850,19 +872,19 @@
     ;; Try to find a good place to display
     (setq def-pos
 	  ;; Find the class structure tag if that's what we're after
-	  (cond
+	  (cond 
 	   ;; Class structure tags: find the class or named structure
 	   ;; definition
 	   (class-struct-tag
-	    (save-excursion
+	    (save-excursion 
 	      (setq class
-		    (if (string-match "[a-zA-Z0-9]\\(__\\)" name)
+		    (if (string-match "[a-zA-Z0-9]\\(__\\)" name) 
 			(substring name 0 (match-beginning 1))
 		      idlwave-current-tags-class))
 	      (and
 	       (idlwave-find-class-definition class nil real-class)
 	       (idlwave-find-struct-tag keyword))))
-
+	   
 	   ;; Generic structure tags: the structure definition
 	   ;; location within the file has been recorded in
 	   ;; `struct-tag'
@@ -872,14 +894,14 @@
 	       (integerp struct-tag)
 	       (goto-char struct-tag)
 	       (idlwave-find-struct-tag keyword))))
-
+	   
 	   ;; Just find the routine definition
 	   (t
 	    (if class-only (point-min)
 	      (idlwave-help-find-routine-definition name type class keyword))))
 	  idlwave-help-def-pos def-pos)
 
-    (if (and idlwave-help-source-try-header
+    (if (and idlwave-help-source-try-header 
 	     (not (or struct-tag class-struct-tag)))
 	;; Check if we can find the header
 	(save-excursion
@@ -889,7 +911,7 @@
 		idlwave-help-in-header header-pos)))
 
     (if (or header-pos def-pos)
-	(progn
+	(progn 
 	  (if (boundp 'idlwave-help-min-frame-width)
 	      (setq idlwave-help-min-frame-width 80))
 	  (goto-char (or header-pos def-pos)))
@@ -903,7 +925,7 @@
 KEYWORD is ignored. Returns the point of match if successful, nil otherwise."
   (save-excursion
     (goto-char (point-max))
-    (if (re-search-backward
+    (if (re-search-backward 
 	 (concat "^[ \t]*"
 		 (if (eq type 'pro) "pro"
 		   (if (eq type 'fun) "function"
@@ -949,22 +971,22 @@
 If there is a match, we assume it is the keyword description."
   (let* ((case-fold-search t)
 	 (rname (if (stringp class)
-		    (concat
+		    (concat 
 		     "\\("
 		     ;; Traditional name or class::name
 		     "\\("
 		     "\\(" (regexp-quote (downcase class)) "::\\)?"
 		     (regexp-quote (downcase name))
 		     "\\>\\)"
-		     (concat
+		     (concat 
 		      "\\|"
 		      ;; class__define or just class
 		      (regexp-quote (downcase class)) "\\(__define\\)?")
 		     "\\)")
 		  (regexp-quote (downcase name))))
-
+	 
 	 ;; NAME tag plus the routine name.  The new version is from JD.
-	 (name-re (concat
+	 (name-re (concat 
 		   "\\(^;+\\*?[ \t]*"
 		   idlwave-help-doclib-name
 		   "\\([ \t]*:\\|[ \t]*$\\)[ \t]*\\(\n;+[ \t]*\\)*"
@@ -999,7 +1021,7 @@
 		       (regexp-quote (upcase keyword))
 		      "\\>")))
 	 dstart dend name-pos kwds-pos kwd-pos)
-    (catch 'exit
+    (catch 'exit 
       (save-excursion
 	(goto-char (point-min))
 	(while (and (setq dstart (re-search-forward idlwave-doclib-start nil t))
@@ -1007,7 +1029,7 @@
 	  ;; found a routine header
 	  (goto-char dstart)
 	  (if (setq name-pos (re-search-forward name-re dend t))
-	      (progn
+	      (progn 
 		(if keyword
 		    ;; We do need a keyword
 		    (progn
@@ -1089,7 +1111,7 @@
       (idlwave-help-find-first-header nil)
     (setq idlwave-help-in-header nil)
     (idlwave-help-toggle-header-match-and-def arg 'top)))
-
+  
 (defun idlwave-help-toggle-header-match-and-def (arg &optional top)
   (interactive "P")
   (let ((args idlwave-help-args)
@@ -1101,7 +1123,7 @@
 	  (setq pos idlwave-help-def-pos))
       ;; Try to display header
       (setq pos (apply 'idlwave-help-find-in-doc-header
-		       (if top
+		       (if top 
 			   (list (car args) (nth 1 args) (nth 2 args) nil)
 			 args)))
       (if pos
@@ -1135,7 +1157,7 @@
 	      (font-lock-fontify-buffer))
 	  (set-syntax-table syntax-table)))))
 
-
+      
 (defun idlwave-help-error (name type class keyword)
   (error "Can't find help on %s%s %s"
 	 (or (and (or class name) (idlwave-make-full-name class name))
@@ -1191,6 +1213,98 @@
   (let ((entry (idlwave-best-rinfo-assoc name type class (idlwave-routines))))
     (idlwave-entry-has-help entry)))
 
+;;----- Control the IDL Assistant, which shipped with IDL v6.2
+(defvar idlwave-help-assistant-process nil)
+(defvar idlwave-help-assistant-socket nil)
+
+;; The Windows version does not have a !DIR/bin/* set of front-end
+;; scripts, but instead only links directly to bin.x86.  As a result,
+;; we must pass the -profile argument as well.
+(defvar idlwave-help-assistant-command 
+  (if (memq system-type '(ms-dos windows-nt))
+      "bin/bin.x86/idl_assistant"
+    "bin/idl_assistant")
+  "The command, rooted at idlwave-system-directory, which invokes the
+IDL assistant.")
+
+(defun idlwave-help-assistant-available ()
+  (if idlwave-help-assistant-available
+      (eq idlwave-help-assistant-available t)
+    (setq idlwave-help-assistant-available
+	  (if (file-executable-p (idlwave-help-assistant-command))
+	      t
+	    'not-available))))
+
+(defun idlwave-help-assistant-command ()
+  (expand-file-name idlwave-help-assistant-command (idlwave-sys-dir)))
+
+(defun idlwave-help-assistant-start (&optional link)
+  "Start the IDL Assistant, loading LINK, if passed."
+  (when (or (not idlwave-help-assistant-socket)
+	    (not (eq (process-status idlwave-help-assistant-socket) 'open)))
+    (let* ((help-loc (idlwave-html-help-location))
+	   (command (idlwave-help-assistant-command))
+	   (extra-args 
+	    (nconc
+	     (if (memq system-type '(ms-dos windows-nt))
+		 `("-profile" ,(expand-file-name "idl.adp" help-loc)))
+	     (if link 
+		 `("-file" ,(expand-file-name link help-loc)))))
+	   port)
+      (if idlwave-help-assistant-socket 
+	  (delete-process idlwave-help-assistant-socket))
+	
+      (setq idlwave-help-assistant-process 
+	    (apply 'start-process 
+		   "IDL_ASSISTANT_PROC" nil command "-server" extra-args))
+      
+      (set-process-filter idlwave-help-assistant-process
+			  (lambda (proc string)
+			    (setq port (string-to-number string))))
+      (unless (accept-process-output idlwave-help-assistant-process 15)
+	(error "Failed binding IDL_ASSISTANT socket"))
+      (if (not port)
+	  (error "Unable to open IDL_ASSISTANT.")
+	(set-process-filter idlwave-help-assistant-process nil)
+	(setq idlwave-help-assistant-socket 
+	      (open-network-stream "IDL_ASSISTANT_SOCK" 
+				   nil "localhost" port))
+	(if (eq (process-status idlwave-help-assistant-socket) 'open)
+	    (process-send-string  idlwave-help-assistant-socket
+				  (concat "setHelpPath " help-loc "\n"))
+	  (idlwave-help-assistant-close)
+	  (error "Cannot communicate with IDL_ASSISTANT"))))))
+
+(defun idlwave-help-assistant-raise ()
+  (idlwave-help-assistant-start)
+  (process-send-string idlwave-help-assistant-socket "raise\n"))
+
+(defun idlwave-help-assistant-open-link (&optional link)
+  ;; Open a link (file name with anchor, no leading path) in the assistant.
+  (if link 
+      (let ((file (expand-file-name link (idlwave-html-help-location))))
+	(idlwave-help-assistant-start link)
+	(process-send-string idlwave-help-assistant-socket
+			     (concat "openLink " file "\n"))
+	(string-match "\.html" link)
+	(process-send-string idlwave-help-assistant-socket
+			     (concat "searchIndexNoOpen " 
+				     (substring link 0 (match-beginning 0))
+				     "\n")))
+    (idlwave-help-assistant-raise)))
+  
+(defun idlwave-help-assistant-close ()
+  (when (and idlwave-help-assistant-process
+	     (eq (process-status idlwave-help-assistant-process) 'run))
+    (when idlwave-help-assistant-socket
+      (process-send-string idlwave-help-assistant-socket "quit\n")
+      (delete-process idlwave-help-assistant-socket))
+    (stop-process idlwave-help-assistant-process)
+    (delete-process idlwave-help-assistant-process)
+    (setq idlwave-help-assistant-socket nil
+	  idlwave-help-assistant-process nil)))
+
+
 (provide 'idlw-help)
 (provide 'idlwave-help)
 
--- a/lisp/progmodes/idlw-rinfo.el	Sat Apr 01 17:16:18 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2069 +0,0 @@
-;;; idlw-rinfo.el --- Routine Information for IDLWAVE
-;; Copyright (c) 1999 Carsten Dominik
-;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
-
-;; Author: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
-;; Keywords: languages
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-
-;; The constants which contain information about IDLs builtin
-;; functions, procedures, system variables and class tags.  This
-;; information is extracted automatically from the IDL documentation
-;; and by talking to IDL.
-;;
-;; Created by get_html_rinfo on Wed May 11 14:52:40 2005
-;; IDL version: 6.1
-;; Number of files scanned:  3393
-;; Number of routines found: 1850
-;; Number of keywords found: 7685
-;;
-;; New versions of IDLWAVE, documentation, and more information
-;; available from:
-;;                 http://idlwave.org
-;; 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; Code:
-(defconst idlwave-system-routines
-  '(
-    ("ANNOTATE" pro nil (system) "%s" ("A9.html" ("COLOR_INDICES" . 756628) ("DRAWABLE" . 756633) ("LOAD_FILE" . 756636) ("TEK_COLORS" . 756639) ("WINDOW" . 756642)))
-    ("ARROW" pro nil (system) "%s, X0, Y0, X1, Y1" ("A15.html" ("COLOR" . 756673) ("DATA" . 756664) ("HSIZE" . 756670) ("HTHICK" . 756676) ("NORMALIZED" . 756667) ("SOLID" . 756679) ("THICK" . 756682)))
-    ("AXIS" pro nil (system) "%s [, X [, Y [, Z]]]" ("A20.html" ("SAVE" . 986499) ("XAXIS" . 983775) ("XLOG" . 983760) ("YAXIS" . 983765) ("YLOG" . 983752) ("YNOZERO" . 158293) ("ZAXIS" . 983724)) ("graphkeyw2.html" ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("NODATA" . 316018) ("NOERASE" . 316024) ("NORMAL" . 315963) ("SUBTITLE" . 316057) ("T3D" . 315956) ("TICKLEN" . 332207) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("BAR_PLOT" pro nil (system) "%s, Values" ("B.html" ("BACKGROUND" . 756719) ("BARNAMES" . 756722) ("BAROFFSET" . 756725) ("BARSPACE" . 756728) ("BARWIDTH" . 756731) ("BASELINES" . 756734) ("BASERANGE" . 756737) ("COLORS" . 756740) ("OUTLINE" . 756743) ("OVERPLOT" . 756746) ("ROTATE" . 756749) ("TITLE" . 756752) ("XTITLE" . 756755) ("YTITLE" . 756758)))
-    ("BLAS_AXPY" pro nil (system) "%s, Y, A, X [, D1, Loc1 [, D2, Range]]" ("B13.html"))
-    ("BOX_CURSOR" pro nil (system) "%s, [ X0, Y0, NX, NY]" ("B15.html" ("FIXED_SIZE" . 756816) ("INIT" . 756813) ("MESSAGE" . 756819)))
-    ("BREAK" pro nil (system) "%s" ("B16.html"))
-    ("BREAKPOINT" pro nil (system) "%s [, File], Index" ("B17.html" ("AFTER" . 113854) ("CLEAR" . 675862) ("CONDITION" . 113859) ("DISABLE" . 907385) ("ENABLE" . 984755) ("ON_RECOMPILE" . 984772) ("ONCE" . 990987) ("SET" . 675866)))
-    ("BYTEORDER" pro nil (system) "%s, Variable1, ..., Variablen" ("B21.html" ("DTOVAX" . 906658) ("DTOXDR" . 906876) ("FTOVAX" . 675911) ("FTOXDR" . 906884) ("HTONL" . 906665) ("HTONS" . 675913) ("L64SWAP" . 965960) ("LSWAP" . 675915) ("NTOHL" . 675917) ("NTOHS" . 675919) ("SSWAP" . 675921) ("SWAP_IF_BIG_ENDIAN" . 906711) ("SWAP_IF_LITTLE_ENDIAN" . 906720) ("VAXTOD" . 675923) ("VAXTOF" . 906693) ("XDRTOD" . 906679) ("XDRTOF" . 675925)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CALDAT" pro nil (system) "%s, Julian, Month [, Day [, Year [, Hour [, Minute [, Second]]]]]" ("C2.html"))
-    ("CALENDAR" pro nil (system) "%s [[, Month] , Year]" ("C3.html"))
-    ("CALL_METHOD" pro nil (system) "%s, Name, ObjRef, [, P1, ..., Pn]" ("C6.html"))
-    ("CALL_PROCEDURE" pro nil (system) "%s, Name [, P1, ..., Pn]" ("C7.html"))
-    ("CATCH" pro nil (system) "%s, [Variable]" ("C9.html" ("CANCEL" . 716974)))
-    ("CD" pro nil (system) "%s [, Directory]" ("C10.html" ("CURRENT" . 676059)))
-    ("CDF_ATTDELETE" pro nil (system) "%s, Id, Attribute [, EntryNum]" ("CDF-routines9.html" ("ZVARIABLE" . 1002456)))
-    ("CDF_ATTGET" pro nil (system) "%s, Id, Attribute, EntryNum, Value" ("CDF-routines11.html" ("CDF_TYPE" . 1003937) ("ZVARIABLE" . 997078)))
-    ("CDF_ATTINQ" pro nil (system) "%s, Id, Attribute, Name, Scope, MaxEntry [, MaxZEntry]" ("CDF-routines12.html"))
-    ("CDF_ATTPUT" pro nil (system) "%s, Id, Attribute, EntryNum, Value" ("CDF-routines14.html" ("ZVARIABLE" . 997143)))
-    ("CDF_ATTRENAME" pro nil (system) "%s, Id, OldAttr, NewName" ("CDF-routines15.html"))
-    ("CDF_CLOSE" pro nil (system) "%s, Id" ("CDF-routines16.html"))
-    ("CDF_COMPRESSION" pro nil (system) "%s, Id" ("CDF-routines17.html" ("GET_COMPRESSION" . 1019949) ("GET_GZIP_LEVEL" . 1019952) ("GET_VAR_COMPRESSION" . 1019955) ("GET_VAR_GZIP_LEVEL" . 1019957) ("SET_COMPRESSION" . 1019965) ("SET_GZIP_LEVEL" . 1020981) ("SET_VAR_COMPRESSION" . 1019968) ("SET_VAR_GZIP_LEVEL" . 1026491) ("VARIABLE" . 1026493) ("ZVARIABLE" . 1019982)))
-    ("CDF_CONTROL" pro nil (system) "%s, Id" ("CDF-routines18.html" ("ATTRIBUTE" . 997198) ("GET_ATTR_INFO" . 997201) ("GET_CACHESIZE" . 997209) ("GET_COPYRIGHT" . 997212) ("GET_FILENAME" . 997215) ("GET_FORMAT" . 997218) ("GET_NEGTOPOSFP0_MODE" . 997226) ("GET_NUMATTRS" . 997229) ("GET_READONLY_MODE" . 1047427) ("GET_RVAR_CACHESIZE" . 997236) ("GET_VAR_INFO" . 997242) ("GET_ZMODE" . 997259) ("GET_ZVAR_CACHESIZE" . 997266) ("SET_CACHESIZE" . 997269) ("SET_EXTENDRECS" . 997272) ("SET_INITIALRECS" . 997275) ("SET_NEGTOPOSFP0_MODE" . 997278) ("SET_PADVALUE" . 997281) ("SET_READONLY_MODE" . 997284) ("SET_RVAR_CACHESIZE" . 997287) ("SET_RVARS_CACHESIZE" . 997290) ("SET_ZMODE" . 997293) ("SET_ZVAR_CACHESIZE" . 997296) ("SET_ZVARS_CACHESIZE" . 997298) ("VARIABLE" . 997301) ("ZVARIABLE" . 997307)))
-    ("CDF_DELETE" pro nil (system) "%s, Id" ("CDF-routines20.html"))
-    ("CDF_DOC" pro nil (system) "%s, Id, Version, Release, Copyright" ("CDF-routines21.html" ("INCREMENT" . 997427)))
-    ("CDF_EPOCH" pro nil (system) "%s, Epoch, Year [, Month, Day, Hour, Minute, Second, Milli]" ("CDF-routines23.html" ("BREAKDOWN_EPOCH" . 997509) ("COMPUTE_EPOCH" . 997512)))
-    ("CDF_LIB_INFO" pro nil (system) "%s" ("CDF-routines27.html" ("COPYRIGHT" . 997623) ("INCREMENT" . 997626) ("RELEASE" . 997629) ("SUBINCREMENT" . 997632) ("VERSION" . 997635)))
-    ("CDF_VARDELETE" pro nil (system) "%s, Id, Variable" ("CDF-routines31.html" ("ZVARIABLE" . 997776)))
-    ("CDF_VARGET" pro nil (system) "%s, Id, Variable, Value" ("CDF-routines32.html" ("COUNT" . 997847) ("INTERVAL" . 997850) ("OFFSET" . 997853) ("REC_COUNT" . 997856) ("REC_INTERVAL" . 997859) ("REC_START" . 997862) ("STRING" . 997865) ("ZVARIABLE" . 997868)))
-    ("CDF_VARGET1" pro nil (system) "%s, Id, Variable, Value" ("CDF-routines33.html" ("OFFSET" . 997909) ("REC_START" . 997912) ("STRING" . 997915) ("ZVARIABLE" . 997918)))
-    ("CDF_VARPUT" pro nil (system) "%s, Id, Variable, Value" ("CDF-routines36.html" ("COUNT" . 998005) ("INTERVAL" . 998008) ("OFFSET" . 998011) ("REC_INTERVAL" . 998014) ("REC_START" . 998017) ("ZVARIABLE" . 998020)))
-    ("CDF_VARRENAME" pro nil (system) "%s, Id, OldVariable, NewName" ("CDF-routines37.html" ("ZVARIABLE" . 998048)))
-    ("CHOLDC" pro nil (system) "%s, A, P" ("C17.html" ("DOUBLE" . 1108599)))
-    ("CIR_3PNT" pro nil (system) "%s, X, Y, R, X0, Y0" ("C20.html"))
-    ("CLOSE" pro nil (system) "%s[, Unit1, ..., Unitn]" ("C21.html" ("ALL" . 676122) ("EXIT_STATUS" . 1017312) ("FILE" . 1017618) ("FORCE" . 1017321)))
-    ("COLOR_CONVERT" pro nil (system) "%s, I0, I1, I2, O0, O1, O2" ("C25.html" ("HLS_RGB" . 861671) ("HSV_RGB" . 861673) ("RGB_HLS" . 861669) ("RGB_HSV" . 676146)))
-    ("CONSTRAINED_MIN" pro nil (system) "%s, X, Xbnd, Gbnd, Nobj, Gcomp, Inform" ("C38.html" ("EPSTOP" . 908210) ("LIMSER" . 927415) ("MAXIMIZE" . 927406) ("NSTOP" . 975889) ("REPORT" . 942066) ("TITLE" . 927408)))
-    ("CONTOUR" pro nil (system) "%s, Z [, X, Y]" ("C40.html" ("C_ANNOTATION" . 1023103) ("C_CHARSIZE" . 676279) ("C_CHARTHICK" . 905138) ("C_COLORS" . 676281) ("C_LABELS" . 676286) ("C_LINESTYLE" . 676292) ("C_ORIENTATION" . 676298) ("C_SPACING" . 676300) ("C_THICK" . 676302) ("CELL_FILL" . 892176) ("CLOSED" . 676304) ("DOWNHILL" . 676306) ("FILL" . 676308) ("FOLLOW" . 676311) ("IRREGULAR" . 879096) ("ISOTROPIC" . 676316) ("LEVELS" . 927695) ("MAX_VALUE" . 676323) ("MIN_VALUE" . 47033) ("NLEVELS" . 676325) ("OVERPLOT" . 861732) ("PATH_DATA_COORDS" . 879089) ("PATH_DOUBLE" . 1015046) ("PATH_FILENAME" . 676329) ("PATH_INFO" . 746342) ("PATH_XY" . 746343) ("TRIANGULATION" . 746344) ("XLOG" . 158329) ("YLOG" . 158344) ("ZAXIS" . 676344)))
-    ("COPY_LUN" pro nil (system) "%s, FromUnit, ToUnit [, Num]" ("C44.html" ("EOF" . 1090923) ("LINES" . 1090926) ("TRANSFER_COUNT" . 1090928)))
-    ("CPU" pro nil (system) "%s" ("C48.html" ("RESET" . 1178606) ("RESTORE" . 1178609) ("TPOOL_MAX_ELTS" . 1032362) ("TPOOL_MIN_ELTS" . 1032364) ("TPOOL_NTHREADS" . 1032366) ("VECTOR_ENABLE" . 1032368)))
-    ("CREATE_VIEW" pro nil (system) "%s" ("C52.html" ("AX" . 756876) ("AY" . 756879) ("AZ" . 756882) ("PERSP" . 756885) ("RADIANS" . 756888) ("WINX" . 756891) ("WINY" . 756894) ("XMAX" . 756897) ("XMIN" . 756900) ("YMAX" . 756903) ("YMIN" . 756906) ("ZFAC" . 756909) ("ZMAX" . 756912) ("ZMIN" . 756915) ("ZOOM" . 756918)))
-    ("CURSOR" pro nil (system) "%s, X, Y [, Wait]" ("C57.html" ("CHANGE" . 676458) ("DATA" . 676460) ("DEVICE" . 676464) ("DOWN" . 676462) ("NORMAL" . 676466) ("NOWAIT" . 676468) ("UP" . 676470) ("WAIT" . 676472)))
-    ("CW_ANIMATE_GETP" pro nil (system) "%s, Widget, Pixmaps" ("C62.html" ("KILL_ANYWAY" . 853956)))
-    ("CW_ANIMATE_LOAD" pro nil (system) "%s, Widget" ("C63.html" ("CYCLE" . 853989) ("FRAME" . 853992) ("IMAGE" . 853995) ("ORDER" . 853998) ("WINDOW" . 854001) ("XOFFSET" . 854006) ("YOFFSET" . 854009)))
-    ("CW_ANIMATE_RUN" pro nil (system) "%s, Widget [, Rate]" ("C64.html" ("NFRAMES" . 854045) ("STOP" . 854048)))
-    ("CW_LIGHT_EDITOR_GET" pro nil (system) "%s, WidgetID" ("C75.html" ("DIRECTION_DISABLED" . 1001479) ("DRAG_EVENTS" . 1001481) ("HIDE_DISABLED" . 1001485) ("LIGHT" . 1001487) ("LOCATION_DISABLED" . 1001489) ("TYPE_DISABLED" . 1001491) ("XRANGE" . 1001493) ("XSIZE" . 1001495) ("YRANGE" . 1001497) ("YSIZE" . 1001499) ("ZRANGE" . 1001501)))
-    ("CW_LIGHT_EDITOR_SET" pro nil (system) "%s, WidgetID" ("C76.html" ("DIRECTION_DISABLED" . 1001515) ("DRAG_EVENTS" . 1001517) ("HIDE_DISABLED" . 1001521) ("LIGHT" . 1001523) ("LOCATION_DISABLED" . 1001525) ("TYPE_DISABLED" . 1001527) ("XRANGE" . 1001529) ("XSIZE" . 1001531) ("YRANGE" . 1001533) ("YSIZE" . 1001535) ("ZRANGE" . 1001537)))
-    ("CW_PALETTE_EDITOR_GET" pro nil (system) "%s, WidgetID" ("C79.html" ("ALPHA" . 1001551) ("HISTOGRAM" . 1001677)))
-    ("CW_PALETTE_EDITOR_SET" pro nil (system) "%s, WidgetID" ("C80.html" ("ALPHA" . 1001567) ("HISTOGRAM" . 1001569)))
-    ("DEFINE_KEY" pro nil (system) "%s, Key [, Value]" ("D5.html" ("BACK_CHARACTER" . 1001954) ("BACK_WORD" . 1001956) ("CONTROL" . 1001958) ("DELETE_CHARACTER" . 1001962) ("DELETE_CURRENT" . 1001964) ("DELETE_EOL" . 1001966) ("DELETE_LINE" . 1001968) ("DELETE_WORD" . 1001970) ("END_OF_FILE" . 1001974) ("END_OF_LINE" . 1001972) ("ENTER_LINE" . 1001976) ("ESCAPE" . 1001978) ("FORWARD_CHARACTER" . 1001984) ("FORWARD_WORD" . 1001986) ("INSERT_OVERSTRIKE_TOGGLE" . 1001988) ("MATCH_PREVIOUS" . 676503) ("NEXT_LINE" . 1002066) ("NOECHO" . 676505) ("PREVIOUS_LINE" . 1002076) ("RECALL" . 1002078) ("REDRAW" . 1002103) ("START_OF_LINE" . 1002105) ("TERMINATE" . 676507)))
-    ("DEFINE_MSGBLK" pro nil (system) "%s, BlockName, ErrorNames, ErrorFormats" ("D6.html" ("IGNORE_DUPLICATE" . 991846) ("PREFIX" . 991848)))
-    ("DEFINE_MSGBLK_FROM_FILE" pro nil (system) "%s, Filename" ("D7.html" ("BLOCK" . 991885) ("IGNORE_DUPLICATE" . 991890) ("PREFIX" . 991892) ("VERBOSE" . 991894)))
-    ("DEFSYSV" pro nil (system) "%s, Name, Value [, Read_Only]" ("D9.html" ("EXISTS" . 676585)))
-    ("DELVAR" pro nil (system) "%s, V1, ..., Vn" ("D10.html"))
-    ("DENDRO_PLOT" pro nil (system) "%s, Clusters, Linkdistance" ("D11.html" ("LABEL_CHARSIZE" . 1033249) ("LABEL_CHARTHICK" . 1032525) ("LABEL_COLOR" . 1032528) ("LABEL_NAMES" . 1032531) ("LABEL_ORIENTATION" . 1032535) ("LINECOLOR" . 1032538) ("ORIENTATION" . 1032541) ("OVERPLOT" . 1032569)) ("graphkeyw2.html" ("BACKGROUND" . 328424) ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NODATA" . 316018) ("NOERASE" . 316024) ("NORMAL" . 315963) ("POSITION" . 316026) ("PSYM" . 316038) ("SUBTITLE" . 316057) ("SYMSIZE" . 316061) ("T3D" . 315956) ("THICK" . 316006) ("TICKLEN" . 332207) ("TITLE" . 332238) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("DENDROGRAM" pro nil (system) "%s, Clusters, Linkdistance, Outverts, Outconn" ("D12.html" ("LEAFNODES" . 1032898)))
-    ("DEVICE" pro nil (system) "%s" ("D16.html" ) ("devices4.html" ("AVANTGARDE" . 482989) ("AVERAGE_LINES" . 144491) ("BINARY" . 144309) ("BITS_PER_PIXEL" . 144308) ("BKMAN" . 143940) ("BOLD" . 144497) ("BOOK" . 144499) ("BYPASS_TRANSLATION" . 144256) ("CLOSE" . 144712) ("CLOSE_DOCUMENT" . 451438) ("CLOSE_FILE" . 144158) ("CMYK" . 732196) ("COLOR" . 144479) ("COLORS" . 144313) ("COPY" . 143954) ("COURIER" . 144503) ("CURSOR_CROSSHAIR" . 144502) ("CURSOR_IMAGE" . 143934) ("CURSOR_MASK" . 144824) ("CURSOR_ORIGINAL" . 144828) ("CURSOR_STANDARD" . 144830) ("CURSOR_XY" . 143722) ("DECOMPOSED" . 144834) ("DEMI" . 143930) ("DIRECT_COLOR" . 145006) ("EJECT" . 143752) ("ENCAPSULATED" . 143751) ("ENCODING" . 144315) ("FILENAME" . 143748) ("FLOYD" . 144833) ("FONT_INDEX" . 143943) ("FONT_SIZE" . 144522) ("GET_CURRENT_FONT" . 144518) ("GET_DECOMPOSED" . 554681) ("GET_FONTNAMES" . 554610) ("GET_FONTNUM" . 144326) ("GET_GRAPHICS_FUNCTION" . 145007) ("GET_PAGE_SIZE" . 587045) ("GET_SCREEN_SIZE" . 149759) ("GET_VISUAL_DEPTH" . 452299) ("GET_VISUAL_NAME" . 551382) ("GET_WINDOW_POSITION" . 143947) ("GET_WRITE_MASK" . 143949) ("GIN_CHARS" . 143951) ("GLYPH_CACHE" . 499334) ("HELVETICA" . 144524) ("INCHES" . 144166) ("INDEX_COLOR" . 451483) ("ISOLATIN1" . 144322) ("ITALIC" . 143723) ("LANDSCAPE" . 606950) ("LANGUAGE_LEVEL" . 144167) ("LIGHT" . 618160) ("MEDIUM" . 144529) ("NARROW" . 417784) ("NCAR" . 144157) ("OBLIQUE" . 562813) ("OPTIMIZE" . 144405) ("ORDERED" . 143941) ("OUTPUT" . 144538) ("PALATINO" . 144366) ("PIXELS" . 144468) ("PLOT_TO" . 485584) ("PLOTTER_ON_OFF" . 144371) ("POLYFILL" . 144368) ("PORTRAIT" . 144170) ("PRE_DEPTH" . 144169) ("PRE_XSIZE" . 601831) ("PRE_YSIZE" . 597448) ("PREVIEW" . 601886) ("PRINT_FILE" . 556886) ("PSEUDO_COLOR" . 144688) ("RESET_STRING" . 144455) ("RESOLUTION" . 144473) ("RETAIN" . 144472) ("SCALE_FACTOR" . 144547) ("SCHOOLBOOK" . 144551) ("SET_CHARACTER_SIZE" . 486143) ("SET_COLORMAP" . 161043) ("SET_COLORS" . 486222) ("SET_FONT" . 499045) ("SET_GRAPHICS_FUNCTION" . 499029) ("SET_RESOLUTION" . 144941) ("SET_STRING" . 144466) ("SET_TRANSLATION" . 150093) ("SET_WRITE_MASK" . 143957) ("STATIC_COLOR" . 144842) ("STATIC_GRAY" . 144844) ("SYMBOL" . 144554) ("TEK4014" . 144553) ("TEK4100" . 144475) ("TEXT" . 144841) ("THRESHOLD" . 144376) ("TIMES" . 144557) ("TRANSLATION" . 144556) ("TRUE_COLOR" . 144849) ("TT_FONT" . 542703) ("TTY" . 144477) ("VT240" . 144174) ("VT241" . 144174) ("VT340" . 144532) ("VT341" . 144532) ("WINDOW_STATE" . 144546) ("XOFFSET" . 143719) ("XON_XOFF" . 144379) ("XSIZE" . 144540) ("YOFFSET" . 144175) ("YSIZE" . 144568) ("Z_BUFFERING" . 144512) ("ZAPFCHANCERY" . 144513) ("ZAPFDINGBATS" . 144515)))
-    ("DFPMIN" pro nil (system) "%s, X, Gtol, Fmin, Func, Dfunc" ("D17.html" ("DOUBLE" . 50547) ("EPS" . 50550) ("ITER" . 50553) ("ITMAX" . 50556) ("STEPMAX" . 50559) ("TOLX" . 50562)))
-    ("DISSOLVE" pro nil (system) "%s, Image" ("D28.html" ("DELAY" . 757174) ("ORDER" . 757177) ("SIZ" . 757180) ("X0" . 757184) ("Y0" . 757184)))
-    ("DLM_LOAD" pro nil (system) "%s, DLMNameStr1 [, DLMNameStr2,..., DLMNameStrn]" ("D31.html"))
-    ("DLM_REGISTER" pro nil (system) "%s, DLMDefFilePath1 [, DLMDefFilePath2, ..., DLMDefFilePathn]" ("D32.html"))
-    ("DOC_LIBRARY" pro nil (system) "%s [, Name]" ("D33.html" ("DIRECTORY" . 1003439) ("MULTI" . 1003447) ("PRINT" . 42998)))
-    ("DRAW_ROI" pro nil (system) "%s, oROI" ("D35.html" ("LINE_FILL" . 986287) ("SPACING" . 986289)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("ORIENTATION" . 315964) ("PSYM" . 316038) ("SYMSIZE" . 316061) ("T3D" . 315956) ("THICK" . 316006)))
-    ("EFONT" pro nil (system) "%s [, Init_Font]" ("E.html" ("BLOCK" . 921048) ("GROUP" . 988298)))
-    ("EMPTY" pro nil (system) "%s" ("E5.html"))
-    ("ENABLE_SYSRTN" pro nil (system) "%s [, Routines]" ("E6.html" ("DISABLE" . 986251) ("EXCLUSIVE" . 986253) ("FUNCTIONS" . 986256)))
-    ("ERASE" pro nil (system) "%s [, Background_Color]" ("E9.html" ("CHANNEL" . 676712) ("COLOR" . 676714)))
-    ("ERRPLOT" pro nil (system) "%s, [ X, ] Low, High" ("E14.html" ("WIDTH" . 757212)))
-    ("EXIT" pro nil (system) "%s" ("E16.html" ("NO_CONFIRM" . 126978) ("STATUS" . 126983)))
-    ("EXPAND" pro nil (system) "%s, A, Nx, Ny, Result" ("E18.html" ("FILLVAL" . 986579) ("MAXVAL" . 757253)))
-    ("FILE_CHMOD" pro nil (system) "%s, File [, Mode]" ("F6.html" ("A_EXECUTE" . 882191) ("A_READ" . 882193) ("A_WRITE" . 882195) ("G_EXECUTE" . 882197) ("G_READ" . 882199) ("G_WRITE" . 882201) ("NOEXPAND_PATH" . 882956) ("O_EXECUTE" . 882203) ("O_READ" . 882205) ("O_WRITE" . 882207) ("SETGID" . 900602) ("SETUID" . 900604) ("STICKY_BIT" . 900606) ("U_EXECUTE" . 882209) ("U_READ" . 882211) ("U_WRITE" . 882213)))
-    ("FILE_COPY" pro nil (system) "%s, SourcePath, DestPath" ("F7.html" ("ALLOW_SAME" . 906390) ("COPY_NAMED_PIPE" . 906392) ("COPY_SYMLINK" . 906394) ("FORCE" . 906396) ("NOEXPAND_PATH" . 906399) ("OVERWRITE" . 906404) ("RECURSIVE" . 906406) ("REQUIRE_DIRECTORY" . 906412) ("VERBOSE" . 906414)))
-    ("FILE_DELETE" pro nil (system) "%s, File1 [,... Filen]" ("F8.html" ("ALLOW_NONEXISTENT" . 882944) ("NOEXPAND_PATH" . 906788) ("QUIET" . 906823) ("RECURSIVE" . 892369) ("VERBOSE" . 906799)))
-    ("FILE_LINK" pro nil (system) "%s, SourcePath, DestPath" ("F13.html" ("ALLOW_SAME" . 906533) ("HARDLINK" . 906535) ("NOEXPAND_PATH" . 906537) ("VERBOSE" . 906542)))
-    ("FILE_MKDIR" pro nil (system) "%s, File1 [,... FileN]" ("F14.html" ("NOEXPAND_PATH" . 882989)))
-    ("FILE_MOVE" pro nil (system) "%s, SourcePath, DestPath" ("F15.html" ("ALLOW_SAME" . 906590) ("NOEXPAND_PATH" . 906592) ("OVERWRITE" . 906597) ("REQUIRE_DIRECTORY" . 906599) ("VERBOSE" . 906601)))
-    ("FLICK" pro nil (system) "%s, A, B [, Rate]" ("F25.html"))
-    ("FLOW3" pro nil (system) "%s, Vx, Vy, Vz" ("F28.html" ("ARROWSIZE" . 757304) ("BLOB" . 757307) ("LEN" . 757310) ("NSTEPS" . 757313) ("NVECS" . 757316) ("SX" . 757321) ("SY" . 757321) ("SZ" . 757321)))
-    ("FLUSH" pro nil (system) "%s, Unit1, ..., Unitn" ("F30.html"))
-    ("FREE_LUN" pro nil (system) "%s [, Unit1, ..., Unitn]" ("F34.html" ("EXIT_STATUS" . 875865) ("FORCE" . 875880)))
-    ("FUNCT" pro nil (system) "%s, X, A, F [, Pder]" ("F37.html"))
-    ("GAMMA_CT" pro nil (system) "%s, Gamma" ("G2.html" ("CURRENT" . 759174) ("INTENSITY" . 759177)))
-    ("GET_LUN" pro nil (system) "%s, Unit" ("G10.html"))
-    ("GRID_INPUT" pro nil (system) "%s, X, Y, F, X1, Y1, F1" ("G14.html" ("DEGREES" . 877045) ("DUPLICATES" . 877047) ("EPSILON" . 877086) ("EXCLUDE" . 877088) ("POLAR" . 877090) ("SPHERE" . 877092)))
-    ("H5_CLOSE" pro nil (system) "%s" ("HDF5-routines10.html"))
-    ("H5_OPEN" pro nil (system) "%s" ("HDF5-routines12.html"))
-    ("H5A_CLOSE" pro nil (system) "%s, Attribute_id" ("HDF5-routines14.html"))
-    ("H5D_CLOSE" pro nil (system) "%s, Dataset_id" ("HDF5-routines22.html"))
-    ("H5F_CLOSE" pro nil (system) "%s, File_id" ("HDF5-routines28.html"))
-    ("H5G_CLOSE" pro nil (system) "%s, Group_id" ("HDF5-routines31.html"))
-    ("H5S_CLOSE" pro nil (system) "%s, Dataspace_id" ("HDF5-routines41.html"))
-    ("H5S_OFFSET_SIMPLE" pro nil (system) "%s, Dataspace_id, Offset" ("HDF5-routines55.html"))
-    ("H5S_SELECT_ALL" pro nil (system) "%s, Dataspace_id" ("HDF5-routines56.html"))
-    ("H5S_SELECT_ELEMENTS" pro nil (system) "%s, Dataspace_id, Coordinates" ("HDF5-routines57.html" ("RESET" . 1149840)))
-    ("H5S_SELECT_HYPERSLAB" pro nil (system) "%s, Dataspace_id, Start, Count" ("HDF5-routines58.html" ("BLOCK" . 1149884) ("RESET" . 1149886) ("STRIDE" . 1149888)))
-    ("H5S_SELECT_NONE" pro nil (system) "%s, Dataspace_id" ("HDF5-routines59.html"))
-    ("H5T_CLOSE" pro nil (system) "%s, Datatype_id" ("HDF5-routines61.html"))
-    ("H_EQ_CT" pro nil (system) "%s [, Image]" ("H.html"))
-    ("H_EQ_INT" pro nil (system) "%s [, Image]" ("H2.html"))
-    ("HDF_AN_END" pro nil (system) "%s, Annotation_id" ("HDF-routines13.html"))
-    ("HDF_AN_ENDACCESS" pro nil (system) "%s, Annotation_id" ("HDF-routines14.html"))
-    ("HDF_CLOSE" pro nil (system) "%s, FileHandle" ("HDF-routines25.html"))
-    ("HDF_DELDD" pro nil (system) "%s, FileHandle, Tag, Ref" ("HDF-routines26.html"))
-    ("HDF_DF24_ADDIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines27.html" ("FORCE_BASELINE" . 1025840) ("JPEG" . 1025843) ("QUALITY" . 1025857) ("RLE" . 1025860)))
-    ("HDF_DF24_GETIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines28.html" ("LINE" . 996986) ("PIXEL" . 996989) ("PLANE" . 996992)))
-    ("HDF_DF24_GETINFO" pro nil (system) "%s, Filename, Width, Height, Interlace" ("HDF-routines29.html"))
-    ("HDF_DF24_READREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines32.html"))
-    ("HDF_DF24_RESTART" pro nil (system) "%s" ("HDF-routines33.html"))
-    ("HDF_DFAN_ADDFDS" pro nil (system) "%s, Filename, Description" ("HDF-routines34.html"))
-    ("HDF_DFAN_ADDFID" pro nil (system) "%s, Filename, Label" ("HDF-routines35.html"))
-    ("HDF_DFAN_GETDESC" pro nil (system) "%s, Filename, Tag, Ref, Description" ("HDF-routines36.html" ("STRING" . 997205)))
-    ("HDF_DFAN_GETFDS" pro nil (system) "%s, Filename, Description" ("HDF-routines37.html" ("FIRST" . 997250) ("STRING" . 997253)))
-    ("HDF_DFAN_GETFID" pro nil (system) "%s, Filename, Label" ("HDF-routines38.html" ("FIRST" . 997305)))
-    ("HDF_DFAN_GETLABEL" pro nil (system) "%s, Filename, Tag, Ref, Label" ("HDF-routines39.html"))
-    ("HDF_DFAN_PUTDESC" pro nil (system) "%s, Filename, Tag, Ref, Description" ("HDF-routines42.html"))
-    ("HDF_DFAN_PUTLABEL" pro nil (system) "%s, Filename, Tag, Ref, Label" ("HDF-routines43.html"))
-    ("HDF_DFP_ADDPAL" pro nil (system) "%s, Filename, Palette" ("HDF-routines44.html"))
-    ("HDF_DFP_GETPAL" pro nil (system) "%s, Filename, Palette" ("HDF-routines45.html"))
-    ("HDF_DFP_PUTPAL" pro nil (system) "%s, Filename, Palette" ("HDF-routines48.html" ("DELETE" . 1016492) ("OVERWRITE" . 997545)))
-    ("HDF_DFP_READREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines49.html"))
-    ("HDF_DFP_RESTART" pro nil (system) "%s" ("HDF-routines50.html"))
-    ("HDF_DFP_WRITEREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines51.html"))
-    ("HDF_DFR8_ADDIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines52.html" ("FORCE_BASELINE" . 997601) ("IMCOMP" . 1025489) ("JPEG" . 1025496) ("PALETTE" . 997604) ("QUALITY" . 997612) ("RLE" . 1025510)))
-    ("HDF_DFR8_GETIMAGE" pro nil (system) "%s, Filename, Image [, Palette]" ("HDF-routines53.html"))
-    ("HDF_DFR8_GETINFO" pro nil (system) "%s, Filename, Width, Height, Has_Palette" ("HDF-routines54.html"))
-    ("HDF_DFR8_PUTIMAGE" pro nil (system) "%s, Filename, Image" ("HDF-routines57.html" ("FORCE_BASELINE" . 1025782) ("IMCOMP" . 1025788) ("JPEG" . 1025785) ("PALETTE" . 1025813) ("QUALITY" . 1025821) ("RLE" . 1025802)))
-    ("HDF_DFR8_READREF" pro nil (system) "%s, Filename, Reference_number" ("HDF-routines58.html"))
-    ("HDF_DFR8_RESTART" pro nil (system) "%s" ("HDF-routines59.html"))
-    ("HDF_DFR8_SETPALETTE" pro nil (system) "%s, Palette" ("HDF-routines60.html"))
-    ("HDF_DUPDD" pro nil (system) "%s, FileHandle, NewTag, NewRef, OldTag, OldRef" ("HDF-routines61.html"))
-    ("HDF_GR_END" pro nil (system) "%s, gr_id" ("HDF-routines65.html"))
-    ("HDF_GR_ENDACCESS" pro nil (system) "%s, ri_id" ("HDF-routines66.html"))
-    ("HDF_LIB_INFO" pro nil (system) "%s, [FileHandle]" ("HDF-routines92.html" ("MAJOR" . 1031740) ("MINOR" . 1031746) ("RELEASE" . 1031752) ("VERSION" . 1031973)))
-    ("HDF_SD_ADDDATA" pro nil (system) "%s, SDdataset_id, Data" ("HDF-routines97.html" ("COUNT" . 1053602) ("NOREVERSE" . 1053605) ("START" . 1053608) ("STRIDE" . 1053611)))
-    ("HDF_SD_ATTRINFO" pro nil (system) "%s, SD_id, Attr_Index" ("HDF-routines99.html" ("COUNT" . 1053698) ("DATA" . 1053701) ("HDF_TYPE" . 1053704) ("NAME" . 1053707) ("TYPE" . 1053710)))
-    ("HDF_SD_ATTRSET" pro nil (system) "%s, SD_id, Attr_Name, Values [, Count]" ("HDF-routines100.html" ("BYTE" . 1053770) ("DFNT_CHAR" . 1053773) ("DFNT_FLOAT32" . 1053776) ("DFNT_FLOAT64" . 1053779) ("DFNT_INT16" . 1053785) ("DFNT_INT32" . 1053788) ("DFNT_INT8" . 1053782) ("DFNT_UINT16" . 1053794) ("DFNT_UINT32" . 1053797) ("DFNT_UINT8" . 1053791) ("DOUBLE" . 1053800) ("FLOAT" . 1053803) ("INT" . 1053806) ("LONG" . 1053809) ("SHORT" . 1053812) ("STRING" . 1053815)))
-    ("HDF_SD_DIMGET" pro nil (system) "%s, Dim_ID" ("HDF-routines102.html" ("COMPATIBILITY" . 1053946) ("COUNT" . 1053944) ("FORMAT" . 1053948) ("LABEL" . 1053950) ("NAME" . 1053952) ("NATTR" . 1053954) ("SCALE" . 1053956) ("TYPE" . 1053958) ("UNIT" . 1053960)))
-    ("HDF_SD_DIMSET" pro nil (system) "%s, Dim_ID" ("HDF-routines104.html" ("BW_INCOMP" . 1054021) ("FORMAT" . 1054025) ("LABEL" . 1054027) ("NAME" . 1054029) ("SCALE" . 1054031) ("UNIT" . 1054033)))
-    ("HDF_SD_END" pro nil (system) "%s, SDinterface_id" ("HDF-routines105.html"))
-    ("HDF_SD_ENDACCESS" pro nil (system) "%s, SDinterface_id" ("HDF-routines106.html"))
-    ("HDF_SD_FILEINFO" pro nil (system) "%s, SDinterface_id, Datasets, Attributes" ("HDF-routines107.html"))
-    ("HDF_SD_GETDATA" pro nil (system) "%s, SDdataset_id, Data" ("HDF-routines108.html" ("COUNT" . 1054195) ("NOREVERSE" . 1054198) ("START" . 1054201) ("STRIDE" . 1054204)))
-    ("HDF_SD_GETINFO" pro nil (system) "%s, SDdataset_id" ("HDF-routines109.html" ("CALDATA" . 1054234) ("COORDSYS" . 1054238) ("DIMS" . 1054241) ("FILL" . 1054244) ("FORMAT" . 1054247) ("HDF_TYPE" . 1054250) ("LABEL" . 1054253) ("NAME" . 1054256) ("NATTS" . 1054259) ("NDIMS" . 1054262) ("NOREVERSE" . 1054265) ("RANGE" . 1054268) ("TYPE" . 1054271) ("UNIT" . 1054274)))
-    ("HDF_SD_SETCOMPRESS" pro nil (system) "%s, SDdataset_id, comptype" ("HDF-routines115.html" ("EFFORT" . 1074118)))
-    ("HDF_SD_SETEXTFILE" pro nil (system) "%s, SDdataset_id, Filename" ("HDF-routines116.html" ("OFFSET" . 1054488)))
-    ("HDF_SD_SETINFO" pro nil (system) "%s, SDdataset_id" ("HDF-routines117.html" ("CALDATA" . 1205515) ("COORDSYS" . 1205576) ("FILL" . 1054536) ("FORMAT" . 1054539) ("LABEL" . 1054542) ("RANGE" . 1054545) ("UNIT" . 1054548)))
-    ("HDF_UNPACKDATA" pro nil (system) "%s, packeddata, data1 [, data2 [, data3 [, data4 [, data5 [, data6 [, data7 [, data8]]]]]]]" ("HDF-routines119.html" ("HDF_ORDER" . 1042997) ("HDF_TYPE" . 1043000) ("NREC" . 1043003)))
-    ("HDF_VD_ATTRINFO" pro nil (system) "%s, VData, FieldID, AttrID" ("HDF-routines122.html" ("COUNT" . 1109959) ("DATA" . 1109961) ("HDF_TYPE" . 1109963) ("NAME" . 1109965) ("TYPE" . 1109967)))
-    ("HDF_VD_ATTRSET" pro nil (system) "%s, VData, FieldID, Attr_Name, Values [, Count]" ("HDF-routines123.html" ("BYTE" . 1110005) ("DFNT_CHAR88" . 1110007) ("DFNT_FLOAT32" . 1110009) ("DFNT_FLOAT64" . 1110011) ("DFNT_INT16" . 1110015) ("DFNT_INT32" . 1110017) ("DFNT_INT8" . 1110013) ("DFNT_UCHAR88" . 1110019) ("DFNT_UINT16" . 1110023) ("DFNT_UINT32" . 1110025) ("DFNT_UINT8" . 1110021) ("DOUBLE" . 1110027) ("FLOAT" . 1110029) ("INT" . 1110031) ("LONG" . 1110033) ("SHORT" . 1110035) ("STRING" . 1110037) ("UINT" . 1110039) ("ULONG" . 1110041)))
-    ("HDF_VD_DETACH" pro nil (system) "%s, VData" ("HDF-routines124.html"))
-    ("HDF_VD_FDEFINE" pro nil (system) "%s, VData, Fieldname" ("HDF-routines125.html" ("BYTE" . 999536) ("DOUBLE" . 999539) ("FLOAT" . 999542) ("INT" . 999545) ("LONG" . 999548) ("ORDER" . 999551)))
-    ("HDF_VD_GET" pro nil (system) "%s, VData" ("HDF-routines128.html" ("CLASS" . 999597) ("COUNT" . 999600) ("FIELDS" . 999603) ("INTERLACE" . 999606) ("NAME" . 999609) ("NFIELDS" . 999612) ("REF" . 999615) ("SIZE" . 999618) ("TAG" . 999621)))
-    ("HDF_VD_GETINFO" pro nil (system) "%s, VData, Index" ("HDF-routines130.html" ("NAME" . 999666) ("ORDER" . 999669) ("SIZE" . 999672) ("TYPE" . 999675)))
-    ("HDF_VD_INSERT" pro nil (system) "%s, VGroup, VData(or Vgroup)" ("HDF-routines131.html" ("POSITION" . 1141285)))
-    ("HDF_VD_SEEK" pro nil (system) "%s, VData, Record" ("HDF-routines138.html"))
-    ("HDF_VD_SETINFO" pro nil (system) "%s, VData" ("HDF-routines139.html" ("CLASS" . 999834) ("FULL_INTERLACE" . 999837) ("NAME" . 999840) ("NO_INTERLACE" . 999843)))
-    ("HDF_VD_WRITE" pro nil (system) "%s, VData, Fields, Data" ("HDF-routines140.html" ("FULL_INTERLACE" . 999876) ("NO_INTERLACE" . 999879) ("NRECORDS" . 999882)))
-    ("HDF_VG_ADDTR" pro nil (system) "%s, VGroup, Tag, Ref" ("HDF-routines141.html"))
-    ("HDF_VG_DETACH" pro nil (system) "%s, VGroup" ("HDF-routines143.html"))
-    ("HDF_VG_GETINFO" pro nil (system) "%s, VGroup" ("HDF-routines145.html" ("CLASS" . 1000002) ("NAME" . 1000005) ("NENTRIES" . 1000008) ("REF" . 1109613) ("TAG" . 1109591)))
-    ("HDF_VG_GETTR" pro nil (system) "%s, VGroup, Index, Tags, Refs" ("HDF-routines147.html"))
-    ("HDF_VG_GETTRS" pro nil (system) "%s, VGroup, Tags, Refs" ("HDF-routines148.html" ("MAXSIZE" . 1000064)))
-    ("HDF_VG_INSERT" pro nil (system) "%s, VGroup, VData(or Vgroup)" ("HDF-routines150.html" ("POSITION" . 1234250)))
-    ("HDF_VG_SETINFO" pro nil (system) "%s, VGroup" ("HDF-routines155.html" ("CLASSNAME" . 1000182) ("NAME" . 1000184)))
-    ("HEAP_FREE" pro nil (system) "%s, Var" ("H9.html" ("OBJ" . 877472) ("PTR" . 877474) ("VERBOSE" . 877477)))
-    ("HEAP_GC" pro nil (system) "%s" ("H10.html" ("OBJ" . 871683) ("PTR" . 832713) ("VERBOSE" . 832717)))
-    ("HELP" pro nil (system) "%s, Expression1, ..., Expressionn" ("H11.html" ("ALL_KEYS" . 677134) ("BREAKPOINTS" . 677136) ("BRIEF" . 870534) ("CALLS" . 870532) ("DEVICE" . 677140) ("DLM" . 677142) ("FILES" . 843801) ("FULL" . 832176) ("FUNCTIONS" . 870207) ("HEAP_VARIABLES" . 870621) ("KEYS" . 677144) ("LAST_MESSAGE" . 843755) ("LEVEL" . 897567) ("MEMORY" . 677146) ("MESSAGES" . 677148) ("NAMES" . 843817) ("OBJECTS" . 832180) ("OUTPUT" . 832171) ("PATH_CACHE" . 677150) ("PROCEDURES" . 888071) ("RECALL_COMMANDS" . 870903) ("ROUTINES" . 869603) ("SHARED_MEMORY" . 880202) ("SOURCE_FILES" . 168290) ("STRUCTURES" . 677154) ("SYSTEM_VARIABLES" . 677156) ("TRACEBACK" . 677158)))
-    ("HLS" pro nil (system) "%s, Litlo, Lithi, Satlo, Sathi, Hue, Loops [, Colr]" ("H16.html"))
-    ("HSV" pro nil (system) "%s, Vlo, Vhi, Satlo, Sathi, Hue, Loops [, Colr]" ("H19.html"))
-    ("ICONTOUR" pro nil (system) "%s[, Z[, X, Y]]" ("I2.html" ("AM_PM" . 937300) ("ANISOTROPY" . 937305) ("BACKGROUND_COLOR" . 963582) ("C_COLOR" . 963600) ("C_FILL_PATTERN" . 937326) ("C_LABEL_INTERVAL" . 937328) ("C_LABEL_NOGAPS" . 937330) ("C_LABEL_OBJECTS" . 937332) ("C_LABEL_SHOW" . 937341) ("C_LINESTYLE" . 937343) ("C_THICK" . 937356) ("C_USE_LABEL_COLOR" . 937358) ("C_USE_LABEL_ORIENTATION" . 937360) ("C_VALUE" . 937362) ("CLIP_PLANES" . 937364) ("COLOR" . 937367) ("DAYS_OF_WEEK" . 937369) ("DEPTH_OFFSET" . 963869) ("DIMENSIONS" . 937374) ("DOWNHILL" . 937376) ("FILL" . 937378) ("GRID_UNITS" . 964865) ("HIDE" . 937391) ("IDENTIFIER" . 937395) ("LABEL_FONT" . 937397) ("LABEL_FORMAT" . 937399) ("LABEL_FRMTDATA" . 937406) ("LABEL_UNITS" . 937408) ("LOCATION" . 937422) ("MACRO_NAMES" . 964542) ("MAX_VALUE" . 937424) ("MIN_VALUE" . 937431) ("MONTHS" . 937426) ("N_LEVELS" . 937435) ("NAME" . 937433) ("NO_SAVEPROMPT" . 982371) ("OVERPLOT" . 937437) ("PLANAR" . 937440) ("RGB_INDICES" . 937445) ("RGB_TABLE" . 937451) ("SHADE_RANGE" . 937458) ("SHADING" . 937460) ("STYLE_NAME" . 964365) ("TICKINTERVAL" . 937465) ("TICKLEN" . 937467) ("TITLE" . 937469) ("USE_TEXT_ALIGNMENTS" . 937471) ("VIEW_GRID" . 937473) ("VIEW_NEXT" . 937475) ("VIEW_NUMBER" . 937478) ("XGRIDSTYLE" . 937481) ("XMAJOR" . 961791) ("XMINOR" . 937483) ("XRANGE" . 937485) ("XSUBTICKLEN" . 937487) ("XTEXT_COLOR" . 937489) ("XTICKFONT_INDEX" . 937491) ("XTICKFONT_SIZE" . 937499) ("XTICKFONT_STYLE" . 937501) ("XTICKFORMAT" . 937508) ("XTICKINTERVAL" . 937526) ("XTICKLAYOUT" . 937530) ("XTICKLEN" . 937538) ("XTICKNAME" . 937540) ("XTICKUNITS" . 937542) ("XTICKVALUES" . 937558) ("XTITLE" . 937560) ("YGRIDSTYLE" . 937481) ("YMAJOR" . 961791) ("YMINOR" . 937483) ("YRANGE" . 937485) ("YSUBTICKLEN" . 937487) ("YTEXT_COLOR" . 937489) ("YTICKFONT_INDEX" . 937491) ("YTICKFONT_SIZE" . 937499) ("YTICKFONT_STYLE" . 937501) ("YTICKFORMAT" . 937508) ("YTICKINTERVAL" . 937526) ("YTICKLAYOUT" . 937530) ("YTICKLEN" . 937538) ("YTICKNAME" . 937540) ("YTICKUNITS" . 937542) ("YTICKVALUES" . 937558) ("YTITLE" . 937560) ("ZGRIDSTYLE" . 937481) ("ZMAJOR" . 961791) ("ZMINOR" . 937483) ("ZRANGE" . 937485) ("ZSUBTICKLEN" . 937487) ("ZTEXT_COLOR" . 937489) ("ZTICKFONT_INDEX" . 937491) ("ZTICKFONT_SIZE" . 937499) ("ZTICKFONT_STYLE" . 937501) ("ZTICKFORMAT" . 937508) ("ZTICKINTERVAL" . 937526) ("ZTICKLAYOUT" . 937530) ("ZTICKLEN" . 937538) ("ZTICKNAME" . 937540) ("ZTICKUNITS" . 937542) ("ZTICKVALUES" . 937558) ("ZTITLE" . 937560) ("ZVALUE" . 937562)))
-    ("IIMAGE" pro nil (system) "%s[, Image[, X, Y]]" ("I8.html" ("ALPHA_CHANNEL" . 942273) ("BACKGROUND_COLOR" . 963611) ("BLUE_CHANNEL" . 940200) ("CHANNEL" . 940203) ("CLIP_PLANES" . 940205) ("DIMENSIONS" . 940208) ("GREEN_CHANNEL" . 940210) ("GRID_UNITS" . 964788) ("HIDE" . 940212) ("IDENTIFIER" . 940216) ("IMAGE_DIMENSIONS" . 940218) ("IMAGE_LOCATION" . 940220) ("INTERPOLATE" . 940222) ("LOCATION" . 940224) ("MACRO_NAMES" . 964551) ("NAME" . 940226) ("NO_SAVEPROMPT" . 982596) ("ORDER" . 964559) ("OVERPLOT" . 940230) ("RED_CHANNEL" . 940233) ("RGB_TABLE" . 940235) ("STYLE_NAME" . 964392) ("TITLE" . 940237) ("VIEW_GRID" . 940239) ("VIEW_NEXT" . 940241) ("VIEW_NUMBER" . 940244) ("XGRIDSTYLE" . 961815) ("XMAJOR" . 940247) ("XMINOR" . 940249) ("XRANGE" . 940251) ("XSUBTICKLEN" . 940253) ("XTEXT_COLOR" . 940255) ("XTICKFONT_INDEX" . 940257) ("XTICKFONT_SIZE" . 940264) ("XTICKFONT_STYLE" . 940266) ("XTICKFORMAT" . 940272) ("XTICKINTERVAL" . 940289) ("XTICKLAYOUT" . 940292) ("XTICKLEN" . 940299) ("XTICKNAME" . 940301) ("XTICKUNITS" . 940303) ("XTICKVALUES" . 940318) ("XTITLE" . 940320) ("YGRIDSTYLE" . 961815) ("YMAJOR" . 940247) ("YMINOR" . 940249) ("YRANGE" . 940251) ("YSUBTICKLEN" . 940253) ("YTEXT_COLOR" . 940255) ("YTICKFONT_INDEX" . 940257) ("YTICKFONT_SIZE" . 940264) ("YTICKFONT_STYLE" . 940266) ("YTICKFORMAT" . 940272) ("YTICKINTERVAL" . 940289) ("YTICKLAYOUT" . 940292) ("YTICKLEN" . 940299) ("YTICKNAME" . 940301) ("YTICKUNITS" . 940303) ("YTICKVALUES" . 940318) ("YTITLE" . 940320)))
-    ("IMAGE_CONT" pro nil (system) "%s, A" ("I9.html" ("ASPECT" . 757356) ("INTERP" . 757359) ("WINDOW_SCALE" . 757362)))
-    ("IMAGE_STATISTICS" pro nil (system) "%s, Data" ("I10.html" ("COUNT" . 873572) ("DATA_SUM" . 873574) ("LABELED" . 873576) ("LUT" . 873582) ("MASK" . 873584) ("MAXIMUM" . 873586) ("MEAN" . 873588) ("MINIMUM" . 873590) ("STDDEV" . 873592) ("SUM_OF_SQUARES" . 873594) ("VARIANCE" . 873596) ("VECTOR" . 873598) ("WEIGHT_SUM" . 873600) ("WEIGHTED" . 873603)))
-    ("IMAP" pro nil (system) "%s" ("I12.html" ("BACKGROUND_COLOR" . 966654) ("CENTER_LATITUDE" . 966771) ("CENTER_LONGITUDE" . 966773) ("CONTOUR" . 966500) ("DATUM" . 966775) ("DIMENSIONS" . 966656) ("FALSE_EASTING" . 966916) ("FALSE_NORTHING" . 966918) ("GRID_UNITS" . 981023) ("HEIGHT" . 966920) ("HOM_AZIM_ANGLE" . 966924) ("HOM_AZIM_LONGITUDE" . 966922) ("HOM_LATITUDE1" . 966926) ("HOM_LATITUDE2" . 966928) ("HOM_LONGITUDE1" . 966930) ("HOM_LONGITUDE2" . 966932) ("IDENTIFIER" . 966658) ("IS_JUSTIFY" . 966936) ("IS_ZONES" . 966934) ("LIMIT" . 966941) ("LOCATION" . 966660) ("MACRO_NAMES" . 966666) ("MAP_PROJECTION" . 966503) ("MERCATOR_SCALE" . 966943) ("NAME" . 966668) ("NO_SAVEPROMPT" . 982447) ("OEA_ANGLE" . 966945) ("OEA_SHAPEM" . 966947) ("OEA_SHAPEN" . 966950) ("OVERPLOT" . 966670) ("SEMIMAJOR_AXIS" . 966953) ("SEMIMINOR_AXIS" . 966955) ("SOM_FLAG" . 966965) ("SOM_INCLINATION" . 966957) ("SOM_LANDSAT_NUMBER" . 966967) ("SOM_LANDSAT_PATH" . 966969) ("SOM_LONGITUDE" . 966959) ("SOM_PERIOD" . 966961) ("SOM_RATIO" . 966963) ("SPHERE_RADIUS" . 966971) ("STANDARD_PAR1" . 966975) ("STANDARD_PAR2" . 966977) ("STANDARD_PARALLEL" . 966973) ("STYLE_NAME" . 966673) ("TITLE" . 966678) ("TRUE_SCALE_LATITUDE" . 966979) ("VIEW_GRID" . 966680) ("VIEW_NEXT" . 966682) ("VIEW_NUMBER" . 966685) ("XGRIDSTYLE" . 966688) ("XMAJOR" . 966690) ("XMINOR" . 966692) ("XRANGE" . 966694) ("XSUBTICKLEN" . 966696) ("XTEXT_COLOR" . 966698) ("XTICKFONT_INDEX" . 966700) ("XTICKFONT_SIZE" . 966707) ("XTICKFONT_STYLE" . 966709) ("XTICKFORMAT" . 966715) ("XTICKINTERVAL" . 966736) ("XTICKLAYOUT" . 966739) ("XTICKLEN" . 966746) ("XTICKNAME" . 966748) ("XTICKUNITS" . 966750) ("XTICKVALUES" . 966766) ("XTITLE" . 966768) ("YGRIDSTYLE" . 966688) ("YMAJOR" . 966690) ("YMINOR" . 966692) ("YRANGE" . 966694) ("YSUBTICKLEN" . 966696) ("YTEXT_COLOR" . 966698) ("YTICKFONT_INDEX" . 966700) ("YTICKFONT_SIZE" . 966707) ("YTICKFONT_STYLE" . 966709) ("YTICKFORMAT" . 966715) ("YTICKINTERVAL" . 966736) ("YTICKLAYOUT" . 966739) ("YTICKLEN" . 966746) ("YTICKNAME" . 966748) ("YTICKUNITS" . 966750) ("YTICKVALUES" . 966766) ("YTITLE" . 966768) ("ZONE" . 966981)) ("I2.html" ("AM_PM" . 937300) ("ANISOTROPY" . 937305) ("BACKGROUND_COLOR" . 963582) ("C_COLOR" . 963600) ("C_FILL_PATTERN" . 937326) ("C_LABEL_INTERVAL" . 937328) ("C_LABEL_NOGAPS" . 937330) ("C_LABEL_OBJECTS" . 937332) ("C_LABEL_SHOW" . 937341) ("C_LINESTYLE" . 937343) ("C_THICK" . 937356) ("C_USE_LABEL_COLOR" . 937358) ("C_USE_LABEL_ORIENTATION" . 937360) ("C_VALUE" . 937362) ("CLIP_PLANES" . 937364) ("COLOR" . 937367) ("DAYS_OF_WEEK" . 937369) ("DEPTH_OFFSET" . 963869) ("DIMENSIONS" . 937374) ("DOWNHILL" . 937376) ("FILL" . 937378) ("GRID_UNITS" . 964865) ("HIDE" . 937391) ("IDENTIFIER" . 937395) ("LABEL_FONT" . 937397) ("LABEL_FORMAT" . 937399) ("LABEL_FRMTDATA" . 937406) ("LABEL_UNITS" . 937408) ("LOCATION" . 937422) ("MACRO_NAMES" . 964542) ("MAX_VALUE" . 937424) ("MIN_VALUE" . 937431) ("MONTHS" . 937426) ("N_LEVELS" . 937435) ("NAME" . 937433) ("NO_SAVEPROMPT" . 982371) ("OVERPLOT" . 937437) ("PLANAR" . 937440) ("RGB_INDICES" . 937445) ("RGB_TABLE" . 937451) ("SHADE_RANGE" . 937458) ("SHADING" . 937460) ("STYLE_NAME" . 964365) ("TICKINTERVAL" . 937465) ("TICKLEN" . 937467) ("TITLE" . 937469) ("USE_TEXT_ALIGNMENTS" . 937471) ("VIEW_GRID" . 937473) ("VIEW_NEXT" . 937475) ("VIEW_NUMBER" . 937478) ("XGRIDSTYLE" . 937481) ("XMAJOR" . 961791) ("XMINOR" . 937483) ("XRANGE" . 937485) ("XSUBTICKLEN" . 937487) ("XTEXT_COLOR" . 937489) ("XTICKFONT_INDEX" . 937491) ("XTICKFONT_SIZE" . 937499) ("XTICKFONT_STYLE" . 937501) ("XTICKFORMAT" . 937508) ("XTICKINTERVAL" . 937526) ("XTICKLAYOUT" . 937530) ("XTICKLEN" . 937538) ("XTICKNAME" . 937540) ("XTICKUNITS" . 937542) ("XTICKVALUES" . 937558) ("XTITLE" . 937560) ("YGRIDSTYLE" . 937481) ("YMAJOR" . 961791) ("YMINOR" . 937483) ("YRANGE" . 937485) ("YSUBTICKLEN" . 937487) ("YTEXT_COLOR" . 937489) ("YTICKFONT_INDEX" . 937491) ("YTICKFONT_SIZE" . 937499) ("YTICKFONT_STYLE" . 937501) ("YTICKFORMAT" . 937508) ("YTICKINTERVAL" . 937526) ("YTICKLAYOUT" . 937530) ("YTICKLEN" . 937538) ("YTICKNAME" . 937540) ("YTICKUNITS" . 937542) ("YTICKVALUES" . 937558) ("YTITLE" . 937560) ("ZGRIDSTYLE" . 937481) ("ZMAJOR" . 961791) ("ZMINOR" . 937483) ("ZRANGE" . 937485) ("ZSUBTICKLEN" . 937487) ("ZTEXT_COLOR" . 937489) ("ZTICKFONT_INDEX" . 937491) ("ZTICKFONT_SIZE" . 937499) ("ZTICKFONT_STYLE" . 937501) ("ZTICKFORMAT" . 937508) ("ZTICKINTERVAL" . 937526) ("ZTICKLAYOUT" . 937530) ("ZTICKLEN" . 937538) ("ZTICKNAME" . 937540) ("ZTICKUNITS" . 937542) ("ZTICKVALUES" . 937558) ("ZTITLE" . 937560) ("ZVALUE" . 937562)) ("I8.html" ("ALPHA_CHANNEL" . 942273) ("BACKGROUND_COLOR" . 963611) ("BLUE_CHANNEL" . 940200) ("CHANNEL" . 940203) ("CLIP_PLANES" . 940205) ("DIMENSIONS" . 940208) ("GREEN_CHANNEL" . 940210) ("GRID_UNITS" . 964788) ("HIDE" . 940212) ("IDENTIFIER" . 940216) ("IMAGE_DIMENSIONS" . 940218) ("IMAGE_LOCATION" . 940220) ("INTERPOLATE" . 940222) ("LOCATION" . 940224) ("MACRO_NAMES" . 964551) ("NAME" . 940226) ("NO_SAVEPROMPT" . 982596) ("ORDER" . 964559) ("OVERPLOT" . 940230) ("RED_CHANNEL" . 940233) ("RGB_TABLE" . 940235) ("STYLE_NAME" . 964392) ("TITLE" . 940237) ("VIEW_GRID" . 940239) ("VIEW_NEXT" . 940241) ("VIEW_NUMBER" . 940244) ("XGRIDSTYLE" . 961815) ("XMAJOR" . 940247) ("XMINOR" . 940249) ("XRANGE" . 940251) ("XSUBTICKLEN" . 940253) ("XTEXT_COLOR" . 940255) ("XTICKFONT_INDEX" . 940257) ("XTICKFONT_SIZE" . 940264) ("XTICKFONT_STYLE" . 940266) ("XTICKFORMAT" . 940272) ("XTICKINTERVAL" . 940289) ("XTICKLAYOUT" . 940292) ("XTICKLEN" . 940299) ("XTICKNAME" . 940301) ("XTICKUNITS" . 940303) ("XTICKVALUES" . 940318) ("XTITLE" . 940320) ("YGRIDSTYLE" . 961815) ("YMAJOR" . 940247) ("YMINOR" . 940249) ("YRANGE" . 940251) ("YSUBTICKLEN" . 940253) ("YTEXT_COLOR" . 940255) ("YTICKFONT_INDEX" . 940257) ("YTICKFONT_SIZE" . 940264) ("YTICKFONT_STYLE" . 940266) ("YTICKFORMAT" . 940272) ("YTICKINTERVAL" . 940289) ("YTICKLAYOUT" . 940292) ("YTICKLEN" . 940299) ("YTICKNAME" . 940301) ("YTICKUNITS" . 940303) ("YTICKVALUES" . 940318) ("YTITLE" . 940320)))
-    ("INTERVAL_VOLUME" pro nil (system) "%s, Data, Value0, Value1, Outverts, Outconn" ("I20.html" ("AUXDATA_IN" . 877934) ("AUXDATA_OUT" . 877937) ("GEOM_XYZ" . 877940) ("PROGRESS_CALLBACK" . 904666) ("PROGRESS_METHOD" . 904664) ("PROGRESS_OBJECT" . 904694) ("PROGRESS_PERCENT" . 904705) ("PROGRESS_USERDATA" . 904717) ("TETRAHEDRA" . 904724)))
-    ("IPLOT" pro nil (system) "%s, [X,] Y or %s, X, Y, Z or %s[, R], Theta" ("I23.html" ("BACKGROUND_COLOR" . 940548) ("CLIP_PLANES" . 963636) ("COLOR" . 940551) ("DIMENSIONS" . 984454) ("ERRORBAR_CAPSIZE" . 940557) ("ERRORBAR_COLOR" . 940555) ("FILL_BACKGROUND" . 940559) ("FILL_COLOR" . 940561) ("FILL_LEVEL" . 940563) ("HIDE" . 940565) ("HISTOGRAM" . 940569) ("IDENTIFIER" . 940571) ("LINESTYLE" . 940573) ("LOCATION" . 940586) ("MACRO_NAMES" . 964589) ("MAX_VALUE" . 940588) ("MIN_VALUE" . 940591) ("NAME" . 940594) ("NO_SAVEPROMPT" . 982649) ("NSUM" . 940596) ("OVERPLOT" . 940598) ("POLAR" . 940601) ("RGB_TABLE" . 940603) ("SCATTER" . 940605) ("STYLE_NAME" . 964415) ("SYM_COLOR" . 940607) ("SYM_INCREMENT" . 940610) ("SYM_INDEX" . 940612) ("SYM_SIZE" . 940623) ("SYM_THICK" . 940625) ("THICK" . 940627) ("TITLE" . 940629) ("TRANSPARENCY" . 940631) ("USE_DEFAULT_COLOR" . 940633) ("VERT_COLORS" . 940637) ("VIEW_GRID" . 940639) ("VIEW_NEXT" . 940641) ("VIEW_NUMBER" . 940644) ("X_ERRORBARS" . 940649) ("X_LOG" . 940651) ("XERROR" . 940653) ("XGRIDSTYLE" . 961829) ("XMAJOR" . 940655) ("XMINOR" . 940657) ("XRANGE" . 940659) ("XSUBTICKLEN" . 940661) ("XTEXT_COLOR" . 940663) ("XTICKFONT_INDEX" . 940665) ("XTICKFONT_SIZE" . 940673) ("XTICKFONT_STYLE" . 940675) ("XTICKFORMAT" . 940682) ("XTICKINTERVAL" . 940700) ("XTICKLAYOUT" . 940704) ("XTICKLEN" . 940712) ("XTICKNAME" . 940714) ("XTICKUNITS" . 940716) ("XTICKVALUES" . 940732) ("XTITLE" . 940734) ("XY_SHADOW" . 940647) ("XZ_SHADOW" . 940736) ("Y_ERRORBARS" . 940649) ("Y_LOG" . 940651) ("YERROR" . 940653) ("YGRIDSTYLE" . 961829) ("YMAJOR" . 940655) ("YMINOR" . 940657) ("YRANGE" . 940659) ("YSUBTICKLEN" . 940661) ("YTEXT_COLOR" . 940663) ("YTICKFONT_INDEX" . 940665) ("YTICKFONT_SIZE" . 940673) ("YTICKFONT_STYLE" . 940675) ("YTICKFORMAT" . 940682) ("YTICKINTERVAL" . 940700) ("YTICKLAYOUT" . 940704) ("YTICKLEN" . 940712) ("YTICKNAME" . 940714) ("YTICKUNITS" . 940716) ("YTICKVALUES" . 940732) ("YTITLE" . 940734) ("YZ_SHADOW" . 940738) ("Z_ERRORBARS" . 940649) ("Z_LOG" . 940651) ("ZERROR" . 940653) ("ZGRIDSTYLE" . 961829) ("ZMAJOR" . 940655) ("ZMINOR" . 940657) ("ZRANGE" . 940659) ("ZSUBTICKLEN" . 940661) ("ZTEXT_COLOR" . 940663) ("ZTICKFONT_INDEX" . 940665) ("ZTICKFONT_SIZE" . 940673) ("ZTICKFONT_STYLE" . 940675) ("ZTICKFORMAT" . 940682) ("ZTICKINTERVAL" . 940700) ("ZTICKLAYOUT" . 940704) ("ZTICKLEN" . 940712) ("ZTICKNAME" . 940714) ("ZTICKUNITS" . 940716) ("ZTICKVALUES" . 940732) ("ZTITLE" . 940734)))
-    ("ISOCONTOUR" pro nil (system) "%s, Values, Outverts, Outconn" ("I25.html" ("AUXDATA_IN" . 873707) ("AUXDATA_OUT" . 873709) ("C_LABEL_INTERVAL" . 873711) ("C_LABEL_SHOW" . 880877) ("C_VALUE" . 880888) ("DOUBLE" . 875352) ("FILL" . 873713) ("GEOMX" . 873715) ("GEOMY" . 873717) ("GEOMZ" . 873719) ("LEVEL_VALUES" . 873723) ("N_LEVELS" . 873725) ("OUT_LABEL_OFFSETS" . 873727) ("OUT_LABEL_POLYLINES" . 880899) ("OUT_LABEL_STRINGS" . 880914) ("OUTCONN_INDICES" . 880934) ("POLYGONS" . 873730)))
-    ("ISOSURFACE" pro nil (system) "%s, Data, Value, Outverts, Outconn" ("I26.html" ("AUXDATA_IN" . 873750) ("AUXDATA_OUT" . 873753) ("GEOM_XYZ" . 873756) ("PROGRESS_CALLBACK" . 873759) ("PROGRESS_METHOD" . 904740) ("PROGRESS_OBJECT" . 904767) ("PROGRESS_PERCENT" . 904780) ("PROGRESS_USERDATA" . 904786) ("TETRAHEDRA" . 904793)))
-    ("ISURFACE" pro nil (system) "%s[, Z [, X, Y]]" ("I27.html" ("BACKGROUND_COLOR" . 940941) ("BOTTOM" . 963651) ("CLIP_PLANES" . 940943) ("COLOR" . 940946) ("DEPTH_OFFSET" . 940950) ("DIMENSIONS" . 940948) ("EXTENDED_LEGO" . 940960) ("HIDDEN_LINES" . 940962) ("HIDE" . 940964) ("IDENTIFIER" . 940968) ("LINESTYLE" . 940970) ("LOCATION" . 940983) ("MACRO_NAMES" . 964571) ("NAME" . 940985) ("NO_SAVEPROMPT" . 982715) ("OVERPLOT" . 940987) ("RGB_TABLE" . 940990) ("SHADING" . 940992) ("SHOW_SKIRT" . 940997) ("SKIRT" . 940999) ("STYLE" . 941001) ("STYLE_NAME" . 964441) ("TEXTURE_ALPHA" . 941010) ("TEXTURE_BLUE" . 941012) ("TEXTURE_GREEN" . 941014) ("TEXTURE_HIGHRES" . 941016) ("TEXTURE_IMAGE" . 941019) ("TEXTURE_INTERP" . 941021) ("TEXTURE_RED" . 941023) ("THICK" . 941025) ("TITLE" . 941027) ("USE_TRIANGLES" . 941029) ("VERT_COLORS" . 941031) ("VIEW_GRID" . 941033) ("VIEW_NEXT" . 941035) ("VIEW_NUMBER" . 941038) ("XGRIDSTYLE" . 961847) ("XMAJOR" . 941041) ("XMINOR" . 941043) ("XRANGE" . 941045) ("XSUBTICKLEN" . 941047) ("XTEXT_COLOR" . 941049) ("XTICKFONT_INDEX" . 941051) ("XTICKFONT_SIZE" . 941058) ("XTICKFONT_STYLE" . 941060) ("XTICKFORMAT" . 941066) ("XTICKINTERVAL" . 941083) ("XTICKLAYOUT" . 941086) ("XTICKLEN" . 941093) ("XTICKNAME" . 941095) ("XTICKUNITS" . 941097) ("XTICKVALUES" . 941112) ("XTITLE" . 941114) ("YGRIDSTYLE" . 961847) ("YMAJOR" . 941041) ("YMINOR" . 941043) ("YRANGE" . 941045) ("YSUBTICKLEN" . 941047) ("YTEXT_COLOR" . 941049) ("YTICKFONT_INDEX" . 941051) ("YTICKFONT_SIZE" . 941058) ("YTICKFONT_STYLE" . 941060) ("YTICKFORMAT" . 941066) ("YTICKINTERVAL" . 941083) ("YTICKLAYOUT" . 941086) ("YTICKLEN" . 941093) ("YTICKNAME" . 941095) ("YTICKUNITS" . 941097) ("YTICKVALUES" . 941112) ("YTITLE" . 941114) ("ZERO_OPACITY_SKIP" . 941116) ("ZGRIDSTYLE" . 961847) ("ZMAJOR" . 941041) ("ZMINOR" . 941043) ("ZRANGE" . 941045) ("ZSUBTICKLEN" . 941047) ("ZTEXT_COLOR" . 941049) ("ZTICKFONT_INDEX" . 941051) ("ZTICKFONT_SIZE" . 941058) ("ZTICKFONT_STYLE" . 941060) ("ZTICKFORMAT" . 941066) ("ZTICKINTERVAL" . 941083) ("ZTICKLAYOUT" . 941086) ("ZTICKLEN" . 941093) ("ZTICKNAME" . 941095) ("ZTICKUNITS" . 941097) ("ZTICKVALUES" . 941112) ("ZTITLE" . 941114)))
-    ("ITCURRENT" pro nil (system) "%s, iToolID" ("I28.html"))
-    ("ITDELETE" pro nil (system) "%s[, iToolID]" ("I29.html"))
-    ("ITREGISTER" pro nil (system) "%s, Name, ItemName" ("I31.html" ("ANNOTATION" . 961620) ("DEFAULT" . 980906) ("FILE_READER" . 961629) ("FILE_WRITER" . 961635) ("TYPES" . 941578) ("UI_PANEL" . 941581) ("UI_SERVICE" . 941584) ("USER_INTERFACE" . 961874) ("VISUALIZATION" . 941586)))
-    ("ITRESET" pro nil (system) "%s" ("I32.html" ("NO_PROMPT" . 941670)))
-    ("ITRESOLVE" pro nil (system) "%s" ("I33.html" ("PATH" . 969191)))
-    ("IVOLUME" pro nil (system) "%s[, Vol0[, Vol1][, Vol2, Vol3]]" ("I34.html" ("AMBIENT" . 941804) ("AUTO_RENDER" . 941806) ("BACKGROUND_COLOR" . 941809) ("BOUNDS" . 963673) ("CLIP_PLANES" . 963690) ("COMPOSITE_FUNCTION" . 941815) ("DEPTH_CUE" . 941828) ("DIMENSIONS" . 941837) ("EXTENTS_TRANSPARENCY" . 964340) ("HIDE" . 941839) ("HINTS" . 941843) ("IDENTIFIER" . 941849) ("INTERPOLATE" . 941851) ("LIGHTING_MODEL" . 941853) ("LOCATION" . 941856) ("MACRO_NAMES" . 964580) ("NAME" . 941858) ("NO_SAVEPROMPT" . 982766) ("OPACITY_TABLE0" . 941860) ("OPACITY_TABLE1" . 941862) ("OVERPLOT" . 941864) ("RENDER_EXTENTS" . 941867) ("RENDER_QUALITY" . 941874) ("RENDER_STEP" . 941872) ("RGB_TABLE0" . 941879) ("RGB_TABLE1" . 941881) ("STYLE_NAME" . 964479) ("SUBVOLUME" . 941883) ("TITLE" . 941885) ("TWO_SIDED" . 941887) ("VIEW_GRID" . 941889) ("VIEW_NEXT" . 941891) ("VIEW_NUMBER" . 941894) ("VOLUME_DIMENSIONS" . 941897) ("VOLUME_LOCATION" . 941899) ("XGRIDSTYLE" . 961859) ("XMAJOR" . 941901) ("XMINOR" . 941903) ("XRANGE" . 941905) ("XSUBTICKLEN" . 941907) ("XTEXT_COLOR" . 941909) ("XTICKFONT_INDEX" . 941911) ("XTICKFONT_SIZE" . 941918) ("XTICKFONT_STYLE" . 941920) ("XTICKFORMAT" . 941926) ("XTICKINTERVAL" . 941943) ("XTICKLAYOUT" . 941946) ("XTICKLEN" . 941953) ("XTICKNAME" . 941955) ("XTICKUNITS" . 941957) ("XTICKVALUES" . 941972) ("XTITLE" . 941974) ("YGRIDSTYLE" . 961859) ("YMAJOR" . 941901) ("YMINOR" . 941903) ("YRANGE" . 941905) ("YSUBTICKLEN" . 941907) ("YTEXT_COLOR" . 941909) ("YTICKFONT_INDEX" . 941911) ("YTICKFONT_SIZE" . 941918) ("YTICKFONT_STYLE" . 941920) ("YTICKFORMAT" . 941926) ("YTICKINTERVAL" . 941943) ("YTICKLAYOUT" . 941946) ("YTICKLEN" . 941953) ("YTICKNAME" . 941955) ("YTICKUNITS" . 941957) ("YTICKVALUES" . 941972) ("YTITLE" . 941974) ("ZBUFFER" . 941976) ("ZERO_OPACITY_SKIP" . 941978) ("ZGRIDSTYLE" . 961859) ("ZMAJOR" . 941901) ("ZMINOR" . 941903) ("ZRANGE" . 941905) ("ZSUBTICKLEN" . 941907) ("ZTEXT_COLOR" . 941909) ("ZTICKFONT_INDEX" . 941911) ("ZTICKFONT_SIZE" . 941918) ("ZTICKFONT_STYLE" . 941920) ("ZTICKFORMAT" . 941926) ("ZTICKINTERVAL" . 941943) ("ZTICKLAYOUT" . 941946) ("ZTICKLEN" . 941953) ("ZTICKNAME" . 941955) ("ZTICKUNITS" . 941957) ("ZTICKVALUES" . 941972) ("ZTITLE" . 941974)))
-    ("JOURNAL" pro nil (system) "%s [, Arg]" ("J.html"))
-    ("LA_CHOLDC" pro nil (system) "%s, Array" ("L2.html" ("DOUBLE" . 969070) ("STATUS" . 969072) ("UPPER" . 969077)))
-    ("LA_LUDC" pro nil (system) "%s, Array, Index" ("L16.html" ("DOUBLE" . 970769) ("STATUS" . 970771)))
-    ("LA_SVD" pro nil (system) "%s, Array, W, U, V" ("L19.html" ("DIVIDE_CONQUER" . 971149) ("DOUBLE" . 971151) ("STATUS" . 971153)))
-    ("LA_TRIDC" pro nil (system) "%s, AL, A, AU, U2, Index" ("L20.html" ("DOUBLE" . 971273) ("STATUS" . 971275)))
-    ("LA_TRIQL" pro nil (system) "%s, D, E [, A]" ("L22.html" ("DOUBLE" . 971540) ("STATUS" . 971542)))
-    ("LA_TRIRED" pro nil (system) "%s, Array, D, E" ("L23.html" ("DOUBLE" . 971643) ("UPPER" . 971645)))
-    ("LINKIMAGE" pro nil (system) "%s, Name, Image [, Type [, Entry]]" ("L34.html" ("DEVICE" . 855619) ("FUNCT" . 855622) ("KEYWORDS" . 855625) ("MAX_ARGS" . 855628) ("MIN_ARGS" . 855632)))
-    ("LOADCT" pro nil (system) "%s [, Table]" ("L40.html" ("BOTTOM" . 168327) ("FILE" . 759299) ("GET_NAMES" . 759305) ("NCOLORS" . 759308) ("SILENT" . 759311)))
-    ("LUDC" pro nil (system) "%s, A, Index" ("L51.html" ("COLUMN" . 58718) ("DOUBLE" . 50959) ("INTERCHANGES" . 50962)))
-    ("MAKE_DLL" pro nil (system) "%s, InputFiles [, OutputFile], ExportedRoutineNames" ("M4.html" ("CC" . 960457) ("COMPILE_DIRECTORY" . 960459) ("DLL_PATH" . 960461) ("EXPORTED_DATA" . 960463) ("EXTRA_CFLAGS" . 960465) ("EXTRA_LFLAGS" . 960467) ("INPUT_DIRECTORY" . 960469) ("LD" . 960471) ("NOCLEANUP" . 960473) ("OUTPUT_DIRECTORY" . 960502) ("REUSE_EXISTING" . 973081) ("SHOW_ALL_OUTPUT" . 960504) ("VERBOSE" . 960506)))
-    ("MAP_CONTINENTS" pro nil (system) "%s" ("M6.html" ("COASTS" . 1048587) ("COLOR" . 887531) ("CONTINENTS" . 957787) ("COUNTRIES" . 887534) ("FILL_CONTINENTS" . 887537) ("HIRES" . 887540) ("LIMIT" . 957885) ("MAP_STRUCTURE" . 1059750) ("MLINESTYLE" . 1059754) ("MLINETHICK" . 887584) ("ORIENTATION" . 887588) ("RIVERS" . 887591) ("SPACING" . 887594) ("USA" . 887597)) ("graphkeyw2.html" ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("MAP_GRID" pro nil (system) "%s" ("M7.html" ("BOX_AXES" . 919039) ("CHARSIZE" . 887636) ("CLIP_TEXT" . 919041) ("COLOR" . 887639) ("FILL_HORIZON" . 958045) ("GLINESTYLE" . 887642) ("GLINETHICK" . 887648) ("HORIZON" . 958090) ("INCREMENT" . 958092) ("LABEL" . 958064) ("LATALIGN" . 887654) ("LATDEL" . 887657) ("LATLAB" . 887660) ("LATNAMES" . 887663) ("LATS" . 887668) ("LONALIGN" . 887673) ("LONDEL" . 887676) ("LONLAB" . 887679) ("LONNAMES" . 887682) ("LONS" . 887687) ("MAP_STRUCTURE" . 1059914) ("NO_GRID" . 958111) ("ORIENTATION" . 887692)) ("graphkeyw2.html" ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("MAP_PROJ_INFO" pro nil (system) "%s [, iproj]" ("M12.html" ("AZIMUTHAL" . 918995) ("CIRCLE" . 928077) ("CURRENT" . 918999) ("CYLINDRICAL" . 919001) ("LL_LIMITS" . 919003) ("NAME" . 919005) ("PROJ_NAMES" . 919007) ("UV_LIMITS" . 919011) ("UV_RANGE" . 928995)))
-    ("MAP_SET" pro nil (system) "%s [, P0lat, P0lon, Rot]" ("M15.html" ("ADVANCE" . 887984) ("AITOFF" . 957265) ("ALBERS" . 887925) ("AZIMUTHAL" . 887931) ("CENTRAL_AZIMUTH" . 888123) ("CHARSIZE" . 887987) ("CLIP" . 887990) ("COLOR" . 887997) ("CON_COLOR" . 888003) ("CONIC" . 887934) ("CONTINENTS" . 888000) ("CYLINDRICAL" . 887940) ("E_CONTINENTS" . 888006) ("E_GRID" . 888009) ("E_HORIZON" . 888013) ("ELLIPSOID" . 888127) ("GLINESTYLE" . 888019) ("GLINETHICK" . 888025) ("GNOMIC" . 887943) ("GOODESHOMOLOSINE" . 918601) ("GRID" . 949681) ("HAMMER" . 887946) ("HIRES" . 888031) ("HORIZON" . 888034) ("ISOTROPIC" . 888134) ("LABEL" . 918537) ("LAMBERT" . 887950) ("LATALIGN" . 888043) ("LATDEL" . 888049) ("LATLAB" . 888046) ("LIMIT" . 888141) ("LONALIGN" . 888052) ("LONDEL" . 888055) ("LONLAB" . 888058) ("MERCATOR" . 887953) ("MILLER_CYLINDRICAL" . 887956) ("MLINESTYLE" . 888061) ("MLINETHICK" . 888101) ("MOLLWEIDE" . 887959) ("NAME" . 958229) ("NOBORDER" . 958173) ("NOERASE" . 888107) ("ORTHOGRAPHIC" . 887962) ("REVERSE" . 888110) ("ROBINSON" . 919362) ("SAT_P" . 888146) ("SATELLITE" . 887965) ("SCALE" . 958134) ("SINUSOIDAL" . 887971) ("STANDARD_PARALLELS" . 888156) ("STEREOGRAPHIC" . 887974) ("TITLE" . 958298) ("TRANSVERSE_MERCATOR" . 887977) ("USA" . 888113) ("XMARGIN" . 958356) ("YMARGIN" . 888119)) ("graphkeyw2.html" ("POSITION" . 316026) ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("MESH_OBJ" pro nil (system) "%s, Type, Vertex_List, Polygon_List, Array1 [, Array2]" ("M29.html" ("CLOSED" . 888559) ("DEGREES" . 965212) ("P1" . 888562) ("P5")))
-    ("MESSAGE" pro nil (system) "%s, [Text]" ("M34.html" ("BLOCK" . 888669) ("CONTINUE" . 965245) ("INFORMATIONAL" . 888672) ("IOERROR" . 888676) ("LEVEL" . 965401) ("NAME" . 965353) ("NONAME" . 965554) ("NOPREFIX" . 888682) ("NOPRINT" . 888686) ("REISSUE_LAST" . 1016375) ("RESET" . 1016373) ("TRACEBACK" . 888698)))
-    ("MK_HTML_HELP" pro nil (system) "%s, Sources, Filename" ("M37.html" ("STRICT" . 888862) ("TITLE" . 888864) ("VERBOSE" . 888866)))
-    ("MODIFYCT" pro nil (system) "%s, Itab, Name, R, G, B" ("M38.html" ("FILE" . 962516)))
-    ("MPEG_CLOSE" pro nil (system) "%s, mpegID" ("M47.html"))
-    ("MPEG_PUT" pro nil (system) "%s, mpegID" ("M49.html" ("COLOR" . 889108) ("FRAME" . 915949) ("IMAGE" . 889110) ("ORDER" . 889112) ("WINDOW" . 889114)))
-    ("MPEG_SAVE" pro nil (system) "%s, mpegID" ("M50.html" ("FILENAME" . 889150)))
-    ("MULTI" pro nil (system) "%s, N" ("M51.html"))
-    ("NCDF_ATTCDEL" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines12.html" ("GLOBAL" . 996962)))
-    ("NCDF_ATTGET" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines13.html" ("GLOBAL" . 996996)))
-    ("NCDF_ATTPUT" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines16.html" ("BYTE" . 997126) ("CHAR" . 997129) ("DOUBLE" . 997132) ("FLOAT" . 997135) ("GLOBAL" . 997116) ("LENGTH" . 997119) ("LONG" . 997138) ("SHORT" . 997141)))
-    ("NCDF_ATTRENAME" pro nil (system) "%s, Cdfid [, Varid]" ("NetCDF-routines17.html" ("GLOBAL" . 997166)))
-    ("NCDF_CLOSE" pro nil (system) "%s, Cdfid" ("NetCDF-routines18.html"))
-    ("NCDF_CONTROL" pro nil (system) "%s, Cdfid" ("NetCDF-routines19.html" ("ABORT" . 997195) ("ENDEF" . 997198) ("FILL" . 997201) ("NOFILL" . 997237) ("NOVERBOSE" . 997240) ("OLDFILL" . 997243) ("REDEF" . 997247) ("SYNC" . 997250) ("VERBOSE" . 997253)))
-    ("NCDF_DIMINQ" pro nil (system) "%s, Cdfid, Dimid, Name, Size" ("NetCDF-routines23.html"))
-    ("NCDF_DIMRENAME" pro nil (system) "%s, Cdfid, Dimid, NewName" ("NetCDF-routines24.html"))
-    ("NCDF_VARGET" pro nil (system) "%s, Cdfid, Varid, Value" ("NetCDF-routines29.html" ("COUNT" . 997494) ("OFFSET" . 997497) ("STRIDE" . 997500)))
-    ("NCDF_VARGET1" pro nil (system) "%s, Cdfid, Varid, Value" ("NetCDF-routines30.html" ("OFFSET" . 997545)))
-    ("NCDF_VARPUT" pro nil (system) "%s, Cdfid, Varid, Value" ("NetCDF-routines33.html" ("COUNT" . 997627) ("OFFSET" . 997630) ("STRIDE" . 997633)))
-    ("NCDF_VARRENAME" pro nil (system) "%s, Cdfid, Varid, Name" ("NetCDF-routines34.html"))
-    ("OBJ" pro nil (system) "%s - > [IDLffJPEG2000::]Cleanup" ("objects_ff37.html"))
-    ("OBJ_DESTROY" pro nil (system) "%s, Obj" ("objects_ff89.html"))
-    ("ON_ERROR" pro nil (system) "%s, N" ("O7.html"))
-    ("ON_IOERROR" pro nil (system) "%s, Label" ("O8.html"))
-    ("ONLINE_HELP" pro nil (system) "%s [, Value]" ("O9.html" ("BOOK" . 889642) ("CONTEXT" . 934178) ("FOLD_CASE" . 934187) ("FULL_PATH" . 932136) ("PAGE" . 934194) ("QUIT" . 932700) ("SUPPRESS_PLUGIN_ERRORS" . 940902) ("TOPICS" . 931860)))
-    ("ONLINE_HELP_PDF_INDEX" pro nil (system) "%s [, SearchTerm]" ("O10.html"))
-    ("OPENR" pro nil (system) "%s, Unit, File" ("O11.html" ("APPEND" . 889709) ("BUFSIZE" . 889712) ("COMPRESS" . 928372) ("DELETE" . 928370) ("ERROR" . 889720) ("F77_UNFORMATTED" . 889729) ("GET_LUN" . 889739) ("MORE" . 889747) ("NOEXPAND_PATH" . 929441) ("RAWIO" . 934244) ("STDIO" . 930929) ("SWAP_ENDIAN" . 889764) ("SWAP_IF_BIG_ENDIAN" . 889767) ("SWAP_IF_LITTLE_ENDIAN" . 889770) ("VAX_FLOAT" . 889773) ("WIDTH" . 889787) ("XDR" . 889796)))
-    ("OPENU" pro nil (system) "%s, Unit, File" ("O11.html" ("APPEND" . 889709) ("BUFSIZE" . 889712) ("COMPRESS" . 928372) ("DELETE" . 928370) ("ERROR" . 889720) ("F77_UNFORMATTED" . 889729) ("GET_LUN" . 889739) ("MORE" . 889747) ("NOEXPAND_PATH" . 929441) ("RAWIO" . 934244) ("STDIO" . 930929) ("SWAP_ENDIAN" . 889764) ("SWAP_IF_BIG_ENDIAN" . 889767) ("SWAP_IF_LITTLE_ENDIAN" . 889770) ("VAX_FLOAT" . 889773) ("WIDTH" . 889787) ("XDR" . 889796)))
-    ("OPENW" pro nil (system) "%s, Unit, File" ("O11.html" ("APPEND" . 889709) ("BUFSIZE" . 889712) ("COMPRESS" . 928372) ("DELETE" . 928370) ("ERROR" . 889720) ("F77_UNFORMATTED" . 889729) ("GET_LUN" . 889739) ("MORE" . 889747) ("NOEXPAND_PATH" . 929441) ("RAWIO" . 934244) ("STDIO" . 930929) ("SWAP_ENDIAN" . 889764) ("SWAP_IF_BIG_ENDIAN" . 889767) ("SWAP_IF_LITTLE_ENDIAN" . 889770) ("VAX_FLOAT" . 889773) ("WIDTH" . 889787) ("XDR" . 889796)))
-    ("OPLOT" pro nil (system) "%s, [X,] Y" ("O12.html" ("MAX_VALUE" . 889969) ("MIN_VALUE" . 889976) ("NSUM" . 889983) ("POLAR" . 889990) ("THICK" . 889995)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("PSYM" . 316038) ("SYMSIZE" . 316061) ("T3D" . 315956) ("ZVALUE" . 316102)))
-    ("OPLOTERR" pro nil (system) "%s, [ X ,] Y , Err [, Psym]" ("O13.html"))
-    ("PARTICLE_TRACE" pro nil (system) "%s, Data, Seeds, Verts, Conn [, Normals]" ("P2.html" ("ANISOTROPY" . 1071147) ("INTEGRATION" . 1071149) ("MAX_ITERATIONS" . 1071158) ("MAX_STEPSIZE" . 1071160) ("SEED_NORMAL" . 1071154) ("TOLERANCE" . 1071156) ("UNIFORM" . 1071162)))
-    ("PATH_CACHE" pro nil (system) "%s" ("P3.html" ("CLEAR" . 1105531) ("ENABLE" . 1105534) ("REBUILD" . 1105537)))
-    ("PLOT" pro nil (system) "%s, [X,] Y" ("P6.html" ("ISOTROPIC" . 948898) ("MAX_VALUE" . 678098) ("MIN_VALUE" . 47057) ("NSUM" . 678100) ("POLAR" . 678103) ("THICK" . 678106) ("XLOG" . 810411) ("YLOG" . 810463) ("YNOZERO" . 810415)) ("graphkeyw2.html" ("BACKGROUND" . 328424) ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NODATA" . 316018) ("NOERASE" . 316024) ("NORMAL" . 315963) ("POSITION" . 316026) ("PSYM" . 316038) ("SUBTITLE" . 316057) ("SYMSIZE" . 316061) ("T3D" . 315956) ("TICKLEN" . 332207) ("TITLE" . 332238) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("PLOT_3DBOX" pro nil (system) "%s, X, Y, Z" ("P7.html" ("GRIDSTYLE" . 137555) ("PSYM" . 137608) ("SOLID_WALLS" . 835291) ("XY_PLANE" . 137639) ("XYSTYLE" . 137642) ("XZ_PLANE" . 137637) ("XZSTYLE" . 137638) ("YZ_PLANE" . 137640) ("YZSTYLE" . 137643)) ("S75.html" ("AX" . 679220) ("AZ" . 679225) ("ZAXIS" . 679256)))
-    ("PLOT_FIELD" pro nil (system) "%s, U, V" ("P8.html" ("ASPECT" . 757604) ("LENGTH" . 757607) ("N" . 757610) ("TITLE" . 757613)))
-    ("PLOTERR" pro nil (system) "%s, [ X ,] Y , Err" ("P9.html" ("PSYM" . 757654) ("TYPE" . 757647)))
-    ("PLOTS" pro nil (system) "%s, X [, Y [, Z]]" ("P10.html" ("CONTINUE" . 678168)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("PSYM" . 316038) ("SYMSIZE" . 316061) ("T3D" . 315956) ("THICK" . 316006) ("Z" . 332658)))
-    ("POINT_LUN" pro nil (system) "%s, Unit, Position" ("P12.html"))
-    ("POLAR_CONTOUR" pro nil (system) "%s, Z, Theta, R" ("P13.html" ("SHOW_TRIANGULATION" . 128404)) ("C40.html" ("C_ANNOTATION" . 1023103) ("C_CHARSIZE" . 676279) ("C_CHARTHICK" . 905138) ("C_COLORS" . 676281) ("C_LINESTYLE" . 676292) ("C_ORIENTATION" . 676298) ("C_SPACING" . 676300) ("C_THICK" . 676302) ("CLOSED" . 676304) ("FILL" . 676308) ("IRREGULAR" . 879096) ("LEVELS" . 927695) ("MAX_VALUE" . 676323) ("MIN_VALUE" . 47033) ("NLEVELS" . 676325) ("OVERPLOT" . 861732) ("PATH_DATA_COORDS" . 879089) ("TRIANGULATION" . 746344) ("XLOG" . 158329) ("YLOG" . 158344) ("ZAXIS" . 676344)))
-    ("POLYFILL" pro nil (system) "%s, X [, Y [, Z]]" ("P19.html" ("IMAGE_COORD" . 678254) ("IMAGE_INTERP" . 678256) ("LINE_FILL" . 678258) ("PATTERN" . 678260) ("SPACING" . 678269) ("TRANSPARENT" . 678271)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("LINESTYLE" . 331728) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("ORIENTATION" . 315964) ("T3D" . 315956) ("THICK" . 316006) ("Z" . 332658)))
-    ("POLYWARP" pro nil (system) "%s, Xi, Yi, Xo, Yo, Degree, Kx, Ky" ("P22.html" ("DOUBLE" . 1075034) ("STATUS" . 1075060)))
-    ("POPD" pro nil (system) "%s" ("P23.html"))
-    ("POWELL" pro nil (system) "%s, P, Xi, Ftol, Fmin, Func" ("P24.html" ("DOUBLE" . 51467) ("ITER" . 51470) ("ITMAX" . 51473)))
-    ("PRINT" pro nil (system) "%s [, Expr1, ..., Exprn]" ("P26.html" ("AM_PM" . 678362) ("DAYS_OF_WEEK" . 1015582) ("FORMAT" . 1015576) ("MONTHS" . 1015619) ("STDIO_NON_FINITE" . 1015513)))
-    ("PRINTD" pro nil (system) "%s" ("P27.html"))
-    ("PRINTF" pro nil (system) "%s [, Unit, Expr1, ..., Exprn]" ("P26.html" ("AM_PM" . 678362) ("DAYS_OF_WEEK" . 1015582) ("FORMAT" . 1015576) ("MONTHS" . 1015619) ("STDIO_NON_FINITE" . 1015513)))
-    ("PROFILER" pro nil (system) "%s [, Module]" ("P31.html" ("CLEAR" . 900205) ("DATA" . 1088814) ("OUTPUT" . 900155) ("REPORT" . 900194) ("RESET" . 900195) ("SYSTEM" . 900159)))
-    ("PROFILES" pro nil (system) "%s, Image" ("P32.html" ("ORDER" . 757719) ("SX" . 757722) ("SY" . 757725) ("WSIZE" . 757728)))
-    ("PS_SHOW_FONTS" pro nil (system) "%s" ("P34.html" ("NOLATIN" . 762026)))
-    ("PSAFM" pro nil (system) "%s, Input_Filename, Output_Filename" ("P35.html"))
-    ("PSEUDO" pro nil (system) "%s, Litlo, Lithi, Satlo, Sathi, Hue, Loops [, Colr]" ("P36.html"))
-    ("PTR_FREE" pro nil (system) "%s, P1, ... ..., Pn" ("P37.html"))
-    ("PUSHD" pro nil (system) "%s, Dir" ("P41.html"))
-    ("QHULL" pro nil (system) "%s, V, Tr or, %s, V0 , V1, [, V2 ... [, V6] ] , Tr" ("Q2.html" ("BOUNDS" . 1073465) ("CONNECTIVITY" . 1073467) ("DELAUNAY" . 1073473) ("SPHERE" . 1073475) ("VDIAGRAM" . 1073477) ("VNORMALS" . 1073481) ("VVERTICES" . 1073483)))
-    ("RDPIX" pro nil (system) "%s, Image [, X0, Y0]" ("R7.html"))
-    ("READ" pro nil (system) "%s, [Prompt,] Var1, ..., Varn" ("R8.html" ("AM_PM" . 1015647) ("DAYS_OF_WEEK" . 1015649) ("FORMAT" . 1015645) ("MONTHS" . 1015670) ("PROMPT" . 863855)))
-    ("READ_GIF" pro nil (system) "%s, Filename, Image [, R, G, B]" ("R13.html" ("CLOSE" . 1165757) ("MULTIPLE" . 1165763)))
-    ("READ_INTERFILE" pro nil (system) "%s, File, Data" ("R15.html"))
-    ("READ_JPEG" pro nil (system) "%s [, Filename] , Image [, Colortable]" ("R16.html" ("BUFFER" . 279694) ("COLORS" . 279696) ("DITHER" . 279697) ("GRAYSCALE" . 1064444) ("ORDER" . 868283) ("TRUE" . 279699) ("TWO_PASS_QUANTIZE" . 279700) ("UNIT" . 279701)))
-    ("READ_PICT" pro nil (system) "%s, Filename, Image [, R, G, B]" ("R19.html"))
-    ("READ_PPM" pro nil (system) "%s, Filename, Image" ("R21.html" ("MAXVAL" . 67809)))
-    ("READ_SRF" pro nil (system) "%s, Filename, Image [, R, G, B]" ("R23.html"))
-    ("READ_WAVE" pro nil (system) "%s, File, Variables, Names, Dimensions" ("R27.html" ("MESHNAMES" . 756240)))
-    ("READ_X11_BITMAP" pro nil (system) "%s, File, Bitmap [, X, Y]" ("R28.html" ("EXPAND_TO_BYTES" . 756264)))
-    ("READF" pro nil (system) "%s, [Prompt,] Unit, Var1, ..., Varn" ("R8.html" ("AM_PM" . 1015647) ("DAYS_OF_WEEK" . 1015649) ("FORMAT" . 1015645) ("MONTHS" . 1015670) ("PROMPT" . 863855)))
-    ("READS" pro nil (system) "%s, Input, Var1, ..., Varn" ("R30.html" ("AM_PM" . 1015707) ("DAYS_OF_WEEK" . 1015709) ("FORMAT" . 678457) ("MONTHS" . 1015728)))
-    ("READU" pro nil (system) "%s, Unit, Var1, ..., Varn" ("R31.html" ("TRANSFER_COUNT" . 678471)))
-    ("REDUCE_COLORS" pro nil (system) "%s, Image, Values" ("R36.html"))
-    ("REGISTER_CURSOR" pro nil (system) "%s, Name, Image" ("R39.html" ("HOTSPOT" . 1108842) ("MASK" . 1108840) ("OVERWRITE" . 1108844)))
-    ("REPLICATE_INPLACE" pro nil (system) "%s, X, Value [, D1, Loc1 [, D2, Range]]" ("R43.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("RESOLVE_ALL" pro nil (system) "%s" ("R44.html" ("CLASS" . 1114080) ("CONTINUE_ON_ERROR" . 1114078) ("QUIET" . 1014991) ("RESOLVE_EITHER" . 1166218) ("RESOLVE_FUNCTION" . 1166223) ("RESOLVE_PROCEDURE" . 1166248) ("SKIP_ROUTINES" . 1166262) ("UNRESOLVED" . 1166255)))
-    ("RESOLVE_ROUTINE" pro nil (system) "%s, Name" ("R45.html" ("COMPILE_FULL_FILE" . 1069898) ("EITHER" . 1073138) ("IS_FUNCTION" . 1069896) ("NO_RECOMPILE" . 1069991)))
-    ("RESTORE" pro nil (system) "%s [[, Filename]]" ("R46.html" ("DESCRIPTION" . 1135778) ("FILENAME" . 678568) ("RELAXED_STRUCTURE_ASSIGNMENT" . 900571) ("RESTORED_OBJECTS" . 900564) ("VERBOSE" . 678570)))
-    ("RETALL" pro nil (system) "%s" ("R47.html"))
-    ("SAVE" pro nil (system) "%s [, Var1, ..., Varn]" ("S2.html" ("ALL" . 678631) ("COMM" . 678633) ("COMPRESS" . 1074405) ("DESCRIPTION" . 678635) ("FILENAME" . 1199210) ("ROUTINES" . 678637) ("SYSTEM_VARIABLES" . 678639) ("VARIABLES" . 678642) ("VERBOSE" . 678644)))
-    ("SCALE3" pro nil (system) "%s" ("S4.html" ("AX" . 787108) ("AZ" . 787111) ("XRANGE" . 787099) ("YRANGE" . 787102) ("ZRANGE" . 787105)))
-    ("SCALE3D" pro nil (system) "%s" ("S5.html"))
-    ("SET_PLOT" pro nil (system) "%s, Device" ("S11.html" ("COPY" . 862592) ("INTERPOLATE" . 862599)))
-    ("SET_SHADING" pro nil (system) "%s" ("S12.html" ("GOURAUD" . 678682) ("LIGHT" . 678685) ("REJECT" . 678687) ("VALUES" . 678689)))
-    ("SETENV" pro nil (system) "%s, Environment_Expression" ("S13.html"))
-    ("SETUP_KEYS" pro nil (system) "%s" ("S14.html" ("ANSI" . 43203) ("APP_KEYPAD" . 43217) ("EIGHTBIT" . 1015422) ("HP9000" . 43209) ("IBM" . 1015421) ("MIPS" . 43211) ("NUM_KEYPAD" . 43219) ("SGI" . 43215) ("SUN" . 43205) ("VT200" . 43207)))
-    ("SHADE_SURF" pro nil (system) "%s, Z [, X, Y]" ("S16.html" ("AX" . 678754) ("AZ" . 678759) ("IMAGE" . 678761) ("MAX_VALUE" . 678763) ("MIN_VALUE" . 47127) ("PIXELS" . 844042) ("SAVE" . 678765) ("SHADES" . 678767) ("XLOG" . 158361) ("YLOG" . 158393)) ("graphkeyw2.html" ("CHARSIZE" . 266973) ("CHARTHICK" . 331668) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("NODATA" . 316018) ("NORMAL" . 315963) ("POSITION" . 316026) ("SUBTITLE" . 316057) ("T3D" . 315956) ("THICK" . 316006) ("TICKLEN" . 332207) ("TITLE" . 332238) ("XCHARSIZE" . 331699) ("XGRIDSTYLE" . 332009) ("XMARGIN" . 332038) ("XMINOR" . 332061) ("XRANGE" . 332090) ("XSTYLE" . 332116) ("XTHICK" . 332298) ("XTICK_GET" . 332321) ("XTICKFORMAT" . 332347) ("XTICKINTERVAL" . 332463) ("XTICKLAYOUT" . 332488) ("XTICKLEN" . 332513) ("XTICKNAME" . 332536) ("XTICKS" . 332559) ("XTICKUNITS" . 332586) ("XTICKV" . 332628) ("XTITLE" . 316100) ("YCHARSIZE" . 331699) ("YGRIDSTYLE" . 332009) ("YMARGIN" . 332038) ("YMINOR" . 332061) ("YRANGE" . 332090) ("YSTYLE" . 332116) ("YTHICK" . 332298) ("YTICK_GET" . 332321) ("YTICKFORMAT" . 332347) ("YTICKINTERVAL" . 332463) ("YTICKLAYOUT" . 332488) ("YTICKLEN" . 332513) ("YTICKNAME" . 332536) ("YTICKS" . 332559) ("YTICKUNITS" . 332586) ("YTICKV" . 332628) ("YTITLE" . 316100) ("ZCHARSIZE" . 331699) ("ZGRIDSTYLE" . 332009) ("ZMARGIN" . 332038) ("ZMINOR" . 332061) ("ZRANGE" . 332090) ("ZSTYLE" . 332116) ("ZTHICK" . 332298) ("ZTICK_GET" . 332321) ("ZTICKFORMAT" . 332347) ("ZTICKINTERVAL" . 332463) ("ZTICKLAYOUT" . 332488) ("ZTICKLEN" . 332513) ("ZTICKNAME" . 332536) ("ZTICKS" . 332559) ("ZTICKUNITS" . 332586) ("ZTICKV" . 332628) ("ZTITLE" . 316100) ("ZVALUE" . 316102)))
-    ("SHADE_SURF_IRR" pro nil (system) "%s, Z, X, Y" ("S17.html" ("AX" . 787162) ("AZ" . 787165) ("IMAGE" . 787168) ("PLIST" . 787171) ("T3D" . 867401)))
-    ("SHADE_VOLUME" pro nil (system) "%s, Volume, Value, Vertex, Poly" ("S18.html" ("LOW" . 678801) ("SHADES" . 678803) ("VERBOSE" . 678805) ("XRANGE" . 678807) ("YRANGE" . 678809) ("ZRANGE" . 678811)))
-    ("SHMMAP" pro nil (system) "%s [, SegmentName] [, D1, ..., D8]" ("S21.html" ("BYTE" . 1143213) ("COMPLEX" . 1143215) ("DCOMPLEX" . 1143217) ("DESTROY_SEGMENT" . 1143219) ("DIMENSION" . 1143226) ("DOUBLE" . 1143228) ("FILENAME" . 1143230) ("FLOAT" . 1143234) ("GET_NAME" . 1143237) ("GET_OS_HANDLE" . 1143240) ("INTEGER" . 1143245) ("L64" . 1143247) ("LONG" . 1143252) ("OFFSET" . 1143254) ("OS_HANDLE" . 1143259) ("PRIVATE" . 1143277) ("SIZE" . 1143281) ("SYSV" . 1143286) ("TEMPLATE" . 1143291) ("TYPE" . 1143293) ("UINT" . 1143298) ("UL64" . 1143302) ("ULONG" . 1143300)))
-    ("SHMUNMAP" pro nil (system) "%s, SegmentName" ("S22.html"))
-    ("SHOW3" pro nil (system) "%s, Image [, X, Y]" ("S24.html" ("E_CONTOUR" . 863032) ("E_SURFACE" . 863036) ("INTERP" . 862964) ("SSCALE" . 787203)))
-    ("SHOWFONT" pro nil (system) "%s, Font, Name" ("S25.html" ("ENCAPSULATED" . 762072) ("TT_FONT" . 901959)))
-    ("SKIP_LUN" pro nil (system) "%s, FromUnit, [, Num]" ("S32.html" ("EOF" . 1143762) ("LINES" . 1143765) ("TRANSFER_COUNT" . 1143767)))
-    ("SLICER3" pro nil (system) "%s [, hData3D]" ("S33.html" ("DATA_NAMES" . 914863) ("DETACH" . 914866) ("GROUP" . 914869) ("MODAL" . 914872)))
-    ("SLIDE_IMAGE" pro nil (system) "%s [, Image]" ("S34.html" ("BLOCK" . 923990) ("CONGRID" . 787344) ("FULL_WINDOW" . 787347) ("GROUP" . 787350) ("ORDER" . 787353) ("REGISTER" . 787356) ("RETAIN" . 787360) ("SHOW_FULL" . 787366) ("SLIDE_WINDOW" . 787363) ("TITLE" . 900068) ("TOP_ID" . 787369) ("XSIZE" . 787374) ("XVISIBLE" . 787377) ("YSIZE" . 787380) ("YVISIBLE" . 787383)))
-    ("SOCKET" pro nil (system) "%s, Unit, Host, Port" ("S37.html" ("CONNECT_TIMEOUT" . 1098145) ("ERROR" . 1098148) ("GET_LUN" . 1142975) ("RAWIO" . 1098160) ("READ_TIMEOUT" . 1098166) ("STDIO" . 1133828) ("SWAP_ENDIAN" . 1098168) ("SWAP_IF_BIG_ENDIAN" . 1098171) ("SWAP_IF_LITTLE_ENDIAN" . 1098175) ("WIDTH" . 1098179) ("WRITE_TIMEOUT" . 1098187)))
-    ("SPAWN" pro nil (system) "%s [, Command [, Result] [, ErrResult]]" ("S39.html" ("COUNT" . 678969) ("EXIT_STATUS" . 678971) ("HIDE" . 1133996) ("LOG_OUTPUT" . 1134006) ("NOSHELL" . 1108410) ("NOTTYRESET" . 1134017) ("NOWAIT" . 1134051) ("NULL_STDIN" . 1134151) ("PID" . 1084167) ("SH" . 1133965) ("STDERR" . 1133968) ("UNIT" . 1133975)))
-    ("SPH_4PNT" pro nil (system) "%s, X, Y, Z, Xc, Yc, Zc, R" ("S40.html" ("DOUBLE" . 1094107)))
-    ("SPLINE_P" pro nil (system) "%s, X, Y, Xr, Yr" ("S46.html" ("DOUBLE" . 1187959) ("INTERVAL" . 758561) ("TAN0" . 758564) ("TAN1" . 758567)))
-    ("STOP" pro nil (system) "%s [, Expr1, ..., Exprn]" ("S54.html"))
-    ("STREAMLINE" pro nil (system) "%s, Verts, Conn, Normals, Outverts, Outconn" ("S58.html" ("ANISOTROPY" . 1078861) ("PROFILE" . 1078865) ("SIZE" . 1078863)))
-    ("STRETCH" pro nil (system) "%s [, Low, High [, Gamma]]" ("S60.html" ("CHOP" . 759533)))
-    ("STRPUT" pro nil (system) "%s, Destination, Source [, Position]" ("S69.html"))
-    ("STRUCT_ASSIGN" pro nil (system) "%s, Source, Destination" ("S72.html" ("NOZERO" . 1074356) ("VERBOSE" . 901018)))
-    ("STRUCT_HIDE" pro nil (system) "%s, Arg1 [, Arg2, ..., Argn]" ("S73.html"))
-    ("SURFACE" pro nil (system) "%s, Z [, X, Y]" ("S75.html" ("AX" . 679220) ("AZ" . 679225) ("BOTTOM" . 679227) ("HORIZONTAL" . 679229) ("LEGO" . 716839) ("LOWER_ONLY" . 679231) ("MAX_VALUE" . 679233) ("MIN_VALUE" . 47161) ("SAVE" . 679235) ("SHADES" . 679245) ("SKIRT" . 679247) ("UPPER_ONLY" . 679250) ("XLOG" . 158409) ("YLOG" . 158414) ("ZAXIS" . 679256) ("ZLOG" . 862016)))
-    ("SURFR" pro nil (system) "%s" ("S76.html" ("AX" . 787417) ("AZ" . 787420)))
-    ("SVDC" pro nil (system) "%s, A, W, U, V" ("S77.html" ("COLUMN" . 58767) ("DOUBLE" . 52115) ("ITMAX" . 1095860)))
-    ("SWAP_ENDIAN_INPLACE" pro nil (system) "%s, Variable" ("S81.html" ("SWAP_IF_BIG_ENDIAN" . 1143824) ("SWAP_IF_LITTLE_ENDIAN" . 1143826)))
-    ("T3D" pro nil (system) "%s [, Array]" ("T3.html" ("MATRIX" . 787453) ("OBLIQUE" . 1076313) ("PERSPECTIVE" . 787459) ("RESET" . 787462) ("ROTATE" . 787465) ("SCALE" . 787468) ("TRANSLATE" . 787471) ("XYEXCH" . 787474) ("XZEXCH" . 787477) ("YZEXCH" . 787480)))
-    ("TEK_COLOR" pro nil (system) "%s [, Start_Index, Colors]" ("T7.html"))
-    ("THREED" pro nil (system) "%s, A [, Sp]" ("T13.html" ("TITLE" . 787515) ("XTITLE" . 787518) ("YTITLE" . 787521)))
-    ("TIME_TEST2" pro nil (system) "%s [, Filename]" ("T14.html"))
-    ("TRIANGULATE" pro nil (system) "%s, X, Y, Triangles [, B]" ("T21.html" ("CONNECTIVITY" . 679547) ("DEGREES" . 126686) ("FVALUE" . 126695) ("REPEATS" . 679555) ("SPHERE" . 126681)))
-    ("TRIQL" pro nil (system) "%s, D, E, A" ("T23.html" ("DOUBLE" . 52221)))
-    ("TRIRED" pro nil (system) "%s, A, D, E" ("T24.html" ("DOUBLE" . 52282)))
-    ("TRUNCATE_LUN" pro nil (system) "%s, Unit1, ..., Unitn" ("T26.html"))
-    ("TV" pro nil (system) "%s, Image [, Position] or %s, Image [, X, Y [, Channel]]" ("T31.html" ("CENTIMETERS" . 679682) ("INCHES" . 679690) ("ORDER" . 679694) ("TRUE" . 679698) ("WORDS" . 679701) ("XSIZE" . 679703) ("YSIZE" . 679705)) ("graphkeyw2.html" ("CHANNEL" . 315931) ("DATA" . 315961) ("DEVICE" . 315977) ("NORMAL" . 315963) ("T3D" . 315956) ("Z" . 332658)))
-    ("TVCRS" pro nil (system) "%s [, ON_OFF] or %s [, X, Y]" ("T32.html" ("CENTIMETERS" . 679732) ("HIDE_CURSOR" . 817846) ("INCHES" . 817861)) ("graphkeyw2.html" ("DATA" . 315961) ("DEVICE" . 315977) ("NORMAL" . 315963) ("T3D" . 315956) ("Z" . 332658)))
-    ("TVLCT" pro nil (system) "%s, V1, V2, V3 [, Start]" ("T33.html" ("GET" . 844142) ("HLS" . 679761) ("HSV" . 679763)))
-    ("TVSCL" pro nil (system) "%s, Image [, Position] or %s, Image [, X, Y [, Channel]]" ("T35.html" ("CENTIMETERS") ("INCHES") ("NAN" . 902069) ("ORDER") ("TOP" . 218988) ("TRUE") ("WORDS") ("XSIZE") ("YSIZE")) ("T31.html" ("CENTIMETERS" . 679682) ("INCHES" . 679690) ("ORDER" . 679694) ("TRUE" . 679698) ("WORDS" . 679701) ("XSIZE" . 679703) ("YSIZE" . 679705)) ("graphkeyw2.html" ("CHANNEL" . 315931) ("DATA" . 315961) ("DEVICE" . 315977) ("NORMAL" . 315963) ("T3D" . 315956) ("Z" . 332658)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("USERSYM" pro nil (system) "%s, X [, Y]" ("U12.html" ("COLOR" . 886945) ("FILL" . 886948) ("THICK" . 886951)))
-    ("VECTOR_FIELD" pro nil (system) "%s, Field, Outverts, Outconn" ("V3.html" ("ANISOTROPY" . 957083) ("SCALE" . 957085) ("VERTICES" . 957087)))
-    ("VEL" pro nil (system) "%s, U, V" ("V4.html" ("LENGTH" . 956021) ("NSTEPS" . 956033) ("NVECS" . 787550) ("TITLE" . 956041) ("XMAX" . 787553)))
-    ("VELOVECT" pro nil (system) "%s, U, V [, X, Y]" ("V5.html" ("COLOR" . 787592) ("DOTS" . 787595) ("LENGTH" . 787598) ("MISSING" . 787601) ("OVERPLOT" . 957555)) ("P6.html" ("ISOTROPIC" . 948898) ("MAX_VALUE" . 678098) ("MIN_VALUE" . 47057) ("NSUM" . 678100) ("POLAR" . 678103) ("THICK" . 678106) ("XLOG" . 810411) ("YLOG" . 810463) ("YNOZERO" . 810415)))
-    ("VORONOI" pro nil (system) "%s, X, Y, I0, C, Xp, Yp, Rect" ("V8.html"))
-    ("WAIT" pro nil (system) "%s, Seconds" ("W.html"))
-    ("WDELETE" pro nil (system) "%s [, Window_Index [, ...]]" ("W5.html"))
-    ("WF_DRAW" pro nil (system) "%s, X, Y" ("W6.html" ("COLD" . 787681) ("COLOR" . 787684) ("CONVERGENCE" . 787687) ("DATA" . 787690) ("DEVICE" . 787693) ("FRONT_TYPE" . 787696) ("INTERVAL" . 787699) ("NORMAL" . 787702) ("OCCLUDED" . 787705) ("PSYM" . 787708) ("STATIONARY" . 787714) ("SYM_HT" . 787717) ("SYM_LEN" . 787720) ("THICK" . 787723) ("WARM" . 787726)))
-    ("WIDGET_CONTROL" pro nil (system) "%s [, Widget_ID]" ("W13.html" ("ALIGNMENT" . 894840) ("ALL_TABLE_EVENTS" . 894849) ("ALL_TEXT_EVENTS" . 680079) ("AM_PM" . 949789) ("APPEND" . 886776) ("BAD_ID" . 680083) ("BASE_SET_TITLE" . 977104) ("BITMAP" . 1077396) ("CANCEL_BUTTON" . 910691) ("CLEAR_EVENTS" . 978647) ("COLUMN_LABELS" . 894928) ("COLUMN_WIDTHS" . 894930) ("COMBOBOX_ADDITEM" . 981369) ("COMBOBOX_DELETEITEM" . 981434) ("COMBOBOX_INDEX" . 981376) ("CONTEXT_EVENTS" . 949802) ("DAYS_OF_WEEK" . 970733) ("DEFAULT_BUTTON" . 909921) ("DEFAULT_FONT" . 680087) ("DELAY_DESTROY" . 680090) ("DELETE_COLUMNS" . 894963) ("DELETE_ROWS" . 919067) ("DESTROY" . 680094) ("DRAW_BUTTON_EVENTS" . 680097) ("DRAW_EXPOSE_EVENTS" . 907371) ("DRAW_KEYBOARD_EVENTS" . 985153) ("DRAW_MOTION_EVENTS" . 680099) ("DRAW_VIEWPORT_EVENTS" . 680101) ("DRAW_XSIZE" . 58243) ("DRAW_YSIZE" . 58244) ("DYNAMIC_RESIZE" . 192830) ("EDIT_CELL" . 895011) ("EDITABLE" . 889314) ("EVENT_FUNC" . 895036) ("EVENT_PRO" . 680108) ("FORMAT" . 895067) ("FUNC_GET_VALUE" . 680113) ("GET_DRAW_VIEW" . 680115) ("GET_UVALUE" . 680117) ("GET_VALUE" . 680122) ("GROUP_LEADER" . 933268) ("HOURGLASS" . 680134) ("ICONIFY" . 680136) ("INPUT_FOCUS" . 680138) ("INSERT_COLUMNS" . 895129) ("INSERT_ROWS" . 895131) ("KBRD_FOCUS_EVENTS" . 919052) ("KILL_NOTIFY" . 680140) ("MANAGED" . 680144) ("MAP" . 680146) ("MONTHS" . 949815) ("MULTIPLE_PROPERTIES" . 1100768) ("NO_COPY" . 680150) ("NO_NEWLINE" . 680152) ("NOTIFY_REALIZE" . 67586) ("PRO_SET_VALUE" . 680154) ("PROPERTYSHEET_SETSELECTED" . 1070765) ("PUSHBUTTON_EVENTS" . 1020091) ("REALIZE" . 680156) ("REFRESH_PROPERTY" . 1018381) ("RESET" . 1018400) ("ROW_HEIGHTS" . 895150) ("ROW_LABELS" . 895148) ("SCR_XSIZE" . 58190) ("SCR_YSIZE" . 58191) ("SEND_EVENT" . 58210) ("SENSITIVE" . 680164) ("SET_BUTTON" . 680167) ("SET_COMBOBOX_SELECT" . 981513) ("SET_DRAW_VIEW" . 680169) ("SET_DROPLIST_SELECT" . 680172) ("SET_LIST_SELECT" . 58235) ("SET_LIST_TOP" . 680175) ("SET_SLIDER_MAX" . 680177) ("SET_SLIDER_MIN" . 680179) ("SET_TAB_CURRENT" . 977118) ("SET_TAB_MULTILINE" . 977124) ("SET_TABLE_SELECT" . 895216) ("SET_TABLE_VIEW" . 895208) ("SET_TEXT_SELECT" . 680181) ("SET_TEXT_TOP_LINE" . 680185) ("SET_TREE_BITMAP" . 978535) ("SET_TREE_EXPANDED" . 978542) ("SET_TREE_SELECT" . 978548) ("SET_TREE_VISIBLE" . 978561) ("SET_UNAME" . 1095671) ("SET_UVALUE" . 949285) ("SET_VALUE" . 680190) ("SHOW" . 680199) ("TAB_MODE" . 1069607) ("TABLE_BLANK" . 1069681) ("TABLE_DISJOINT_SELECTION" . 987414) ("TABLE_XSIZE" . 895238) ("TABLE_YSIZE" . 895244) ("TIMER" . 680201) ("TLB_GET_OFFSET" . 680204) ("TLB_GET_SIZE" . 680206) ("TLB_ICONIFY_EVENTS" . 984722) ("TLB_KILL_REQUEST_EVENTS" . 192837) ("TLB_MOVE_EVENTS" . 984735) ("TLB_SET_TITLE" . 680208) ("TLB_SET_XOFFSET" . 680210) ("TLB_SET_YOFFSET" . 680212) ("TLB_SIZE_EVENTS" . 984752) ("TOOLTIP" . 982093) ("TRACKING_EVENTS" . 58183) ("UNITS" . 895316) ("UPDATE" . 680214) ("USE_TABLE_SELECT" . 934621) ("USE_TEXT_SELECT" . 192856) ("X_BITMAP_EXTRA" . 680216) ("XOFFSET" . 58269) ("XSIZE" . 58220) ("YOFFSET" . 58279) ("YSIZE" . 58221)))
-    ("WIDGET_DISPLAYCONTEXTMENU" pro nil (system) "%s, Parent, X, Y, ContextBase_ID" ("W14.html"))
-    ("WINDOW" pro nil (system) "%s [, Window_Index]" ("W27.html" ("COLORS" . 896410) ("FREE" . 680620) ("PIXMAP" . 680622) ("RETAIN" . 680624) ("TITLE" . 680625) ("XPOS" . 680628) ("XSIZE" . 680635) ("YPOS" . 680633) ("YSIZE" . 680637)))
-    ("WRITE_BMP" pro nil (system) "%s, Filename, Image[, R, G, B]" ("W28.html" ("FOUR_BIT" . 756441) ("HEADER_DEFINE" . 756447) ("IHDR" . 756444) ("RGB" . 964751)))
-    ("WRITE_GIF" pro nil (system) "%s, Filename, Image[, R, G, B]" ("W29.html" ("CLOSE" . 1068115) ("MULTIPLE" . 1068121)))
-    ("WRITE_IMAGE" pro nil (system) "%s, Filename, Format, Data [, Red, Green, Blue]" ("W30.html" ("APPEND" . 961233)))
-    ("WRITE_JPEG" pro nil (system) "%s [, Filename] , Image" ("W31.html" ("ORDER" . 279735) ("PROGRESSIVE" . 912025) ("QUALITY" . 279736) ("TRUE" . 279737) ("UNIT" . 896438)))
-    ("WRITE_JPEG2000" pro nil (system) "%s, Filename, Image [, Red, Green, Blue]" ("W32.html" ("N_LAYERS" . 1112356) ("N_LEVELS" . 1112359) ("ORDER" . 1112362) ("REVERSIBLE" . 1112365)))
-    ("WRITE_NRIF" pro nil (system) "%s, File, Image [, R, G, B]" ("W33.html"))
-    ("WRITE_PICT" pro nil (system) "%s, Filename [, Image, R, G, B]" ("W34.html"))
-    ("WRITE_PNG" pro nil (system) "%s, Filename, Image[, R, G, B]" ("W35.html" ("ORDER" . 950656) ("TRANSPARENT" . 950659) ("VERBOSE" . 964556)))
-    ("WRITE_PPM" pro nil (system) "%s, Filename, Image" ("W36.html" ("ASCII" . 67923)))
-    ("WRITE_SPR" pro nil (system) "%s, AS, Filename" ("W37.html"))
-    ("WRITE_SRF" pro nil (system) "%s, Filename [, Image, R, G, B]" ("W38.html" ("ORDER" . 756556) ("WRITE_32" . 756559)))
-    ("WRITE_TIFF" pro nil (system) "%s, Filename [, Image]" ("W40.html" ("APPEND" . 945440) ("BITS_PER_SAMPLE" . 945448) ("BLUE" . 960346) ("CMYK" . 1049851) ("COMPRESSION" . 972526) ("DESCRIPTION" . 1049872) ("DOCUMENT_NAME" . 1049881) ("DOT_RANGE" . 1049890) ("FLOAT" . 945539) ("GEOTIFF" . 945456) ("GREEN" . 960346) ("ICC_PROFILE" . 1049899) ("LONG" . 945853) ("ORIENTATION" . 972561) ("PHOTOSHOP" . 1049908) ("PLANARCONFIG" . 896473) ("RED" . 960346) ("SHORT" . 945559) ("UNITS" . 960431) ("VERBOSE" . 972627) ("XPOSITION" . 1063829) ("XRESOL" . 896478) ("YPOSITION" . 1063850) ("YRESOL" . 917320)))
-    ("WRITE_WAV" pro nil (system) "%s, Filename, Data, Rate" ("W41.html"))
-    ("WRITE_WAVE" pro nil (system) "%s, File, Array" ("W42.html" ("BIN" . 756580) ("DATANAME" . 756583) ("MESHNAME" . 756586) ("NOMESHDEF" . 756589) ("VECTOR" . 756592)))
-    ("WRITEU" pro nil (system) "%s, Unit, Expr1 ..., Exprn" ("W43.html" ("TRANSFER_COUNT" . 680669)))
-    ("WSET" pro nil (system) "%s [, Window_Index]" ("W44.html"))
-    ("WSHOW" pro nil (system) "%s [, Window_Index [, Show]]" ("W45.html" ("ICONIC" . 680709)))
-    ("WV_APPLET" pro nil (system) "%s [, Input]" ("ref4.html" ("ARRAY" . 1004583) ("GROUP_LEADER" . 1004841) ("NO_SPLASH" . 1004848) ("TOOLS" . 1004856) ("WAVELETS" . 1005269)))
-    ("WV_IMPORT_DATA" pro nil (system) "%s, Data" ("ref16.html" ("MESSAGE_OUT" . 1006957) ("PARENT" . 1008033)))
-    ("WV_IMPORT_WAVELET" pro nil (system) "%s [, Wavelet]" ("ref17.html" ("RESET" . 1007019)))
-    ("XBM_EDIT" pro nil (system) "%s" ("X.html" ("BLOCK" . 937479) ("FILENAME" . 762711) ("GROUP" . 762714) ("XSIZE" . 762717) ("YSIZE" . 762720)))
-    ("XDISPLAYFILE" pro nil (system) "%s, Filename" ("X2.html" ("BLOCK" . 937490) ("DONE_BUTTON" . 960338) ("EDITABLE" . 960341) ("FONT" . 960336) ("GROUP" . 762749) ("HEIGHT" . 762752) ("MODAL" . 933305) ("TEXT" . 762755) ("TITLE" . 762758) ("WIDTH" . 762761) ("WTEXT" . 960359)))
-    ("XDXF" pro nil (system) "%s [, Filename]" ("X3.html" ("BLOCK" . 976345) ("GROUP" . 976354) ("SCALE" . 976358) ("TEST" . 976360)))
-    ("XINTERANIMATE" pro nil (system) "%s [, Rate]" ("X5.html" ("BLOCK" . 964691) ("CLOSE" . 894369) ("CYCLE" . 894339) ("FRAME" . 894353) ("GROUP" . 964285) ("IMAGE" . 894356) ("KEEP_PIXMAPS" . 894375) ("MODAL" . 964292) ("MPEG_BITRATE" . 964699) ("MPEG_CLOSE" . 941497) ("MPEG_FILENAME" . 934000) ("MPEG_IFRAME_GAP" . 964723) ("MPEG_MOTION_VEC_LENGTH" . 964730) ("MPEG_OPEN" . 934051) ("MPEG_QUALITY" . 964762) ("ORDER" . 894359) ("SET" . 894336) ("SHOWLOAD" . 894342) ("TITLE" . 894348) ("TRACK" . 894345) ("WINDOW" . 894362) ("XOFFSET" . 894378) ("YOFFSET" . 894381)))
-    ("XLOADCT" pro nil (system) "%s" ("X6.html" ("BLOCK" . 937520) ("BOTTOM" . 937526) ("FILE" . 937512) ("GROUP" . 959363) ("MODAL" . 930516) ("NCOLORS" . 930518) ("SILENT" . 761913) ("UPDATECALLBACK" . 950093) ("UPDATECBDATA" . 950095) ("USE_CURRENT" . 761916)))
-    ("XMANAGER" pro nil (system) "%s [, Name, ID]" ("X7.html" ("CATCH" . 919187) ("CLEANUP" . 762794) ("EVENT_HANDLER" . 762797) ("GROUP_LEADER" . 762800) ("JUST_REG" . 762804) ("NO_BLOCK" . 921241)))
-    ("XMNG_TMPL" pro nil (system) "%s" ("X8.html" ("BLOCK" . 937533) ("GROUP" . 762854)))
-    ("XMTOOL" pro nil (system) "%s" ("X9.html" ("BLOCK" . 937544) ("GROUP" . 762874)))
-    ("XOBJVIEW" pro nil (system) "%s, Obj" ("X10.html" ("BACKGROUND" . 956927) ("BLOCK" . 964889) ("DOUBLE_VIEW" . 956930) ("GROUP" . 960389) ("JUST_REG" . 959168) ("MODAL" . 988927) ("REFRESH" . 959524) ("RENDERER" . 980622) ("SCALE" . 969430) ("STATIONARY" . 959520) ("TEST" . 959458) ("TITLE" . 959454) ("TLB" . 1013972) ("XOFFSET" . 959432) ("XSIZE" . 1000024) ("YOFFSET" . 973883) ("YSIZE" . 1000026)))
-    ("XOBJVIEW_ROTATE" pro nil (system) "%s, Axis, Angle" ("X11.html" ("PREMULTIPLY" . 984371)))
-    ("XOBJVIEW_WRITE_IMAGE" pro nil (system) "%s, Filename, Format" ("X12.html" ("DIMENSIONS" . 984402)))
-    ("XPALETTE" pro nil (system) "%s" ("X13.html" ("BLOCK" . 937555) ("GROUP" . 761941) ("UPDATECALLBACK" . 949914) ("UPDATECBDATA" . 949916)))
-    ("XPCOLOR" pro nil (system) "%s" ("X14.html" ("GROUP" . 976510)))
-    ("XPLOT3D" pro nil (system) "%s, X, Y, Z" ("X15.html" ("BLOCK" . 976543) ("COLOR" . 976552) ("DOUBLE_VIEW" . 976554) ("GROUP" . 976556) ("LINESTYLE" . 976558) ("MODAL" . 976571) ("NAME" . 976577) ("OVERPLOT" . 976579) ("SYMBOL" . 976581) ("TEST" . 976583) ("THICK" . 976585) ("TITLE" . 976587) ("XRANGE" . 976589) ("XTITLE" . 1014240) ("YRANGE" . 976591) ("YTITLE" . 1014248) ("ZRANGE" . 976593) ("ZTITLE" . 976599)))
-    ("XROI" pro nil (system) "%s [, ImageData] [, R] [, G] [, B]" ("X17.html" ("BLOCK" . 984509) ("FLOATING" . 984515) ("GROUP" . 984518) ("MODAL" . 984520) ("REGIONS_IN" . 984522) ("REGIONS_OUT" . 984530) ("REJECTED" . 984535) ("RENDERER" . 984540) ("ROI_COLOR" . 984544) ("ROI_GEOMETRY" . 984546) ("ROI_SELECT_COLOR" . 984572) ("STATISTICS" . 984574) ("TITLE" . 984608) ("TOOLS" . 984610) ("X_SCROLL_SIZE" . 999474) ("Y_SCROLL_SIZE" . 999479)))
-    ("XSURFACE" pro nil (system) "%s, Data" ("X19.html" ("BLOCK" . 937566) ("GROUP" . 787853)))
-    ("XVAREDIT" pro nil (system) "%s, Var" ("X20.html" ("GROUP" . 759115) ("NAME" . 917618) ("X_SCROLL_SIZE" . 917623) ("Y_SCROLL_SIZE" . 917633)))
-    ("XVOLUME" pro nil (system) "%s, Vol" ("X21.html" ("BLOCK" . 977093) ("GROUP" . 977102) ("INTERPOLATE" . 977104) ("MODAL" . 977106) ("RENDERER" . 977112) ("REPLACE" . 977116) ("SCALE" . 977121) ("TEST" . 977123) ("XSIZE" . 977128) ("YSIZE" . 977130)))
-    ("XVOLUME_ROTATE" pro nil (system) "%s, Axis, Angle" ("X22.html" ("PREMULTIPLY" . 977322)))
-    ("XVOLUME_WRITE_IMAGE" pro nil (system) "%s, Filename, Format" ("X23.html" ("DIMENSIONS" . 977402)))
-    ("XYOUTS" pro nil (system) "%s, [X, Y,] String" ("X24.html" ("ALIGNMENT" . 680731) ("CHARSIZE" . 680733) ("CHARTHICK" . 680735) ("TEXT_AXES" . 680737) ("WIDTH" . 680739)) ("graphkeyw2.html" ("CLIP" . 315949) ("COLOR" . 315952) ("DATA" . 315961) ("DEVICE" . 315977) ("FONT" . 331795) ("NOCLIP" . 323508) ("NORMAL" . 315963) ("ORIENTATION" . 315964) ("T3D" . 315956) ("Z" . 332658)))
-    ("ZOOM" pro nil (system) "%s" ("Z.html" ("CONTINUOUS" . 787879) ("FACT" . 787882) ("INTERP" . 787885) ("KEEP" . 787888) ("NEW_WINDOW" . 787891) ("XSIZE" . 787894) ("YSIZE" . 787897) ("ZOOM_WINDOW" . 787900)))
-    ("ZOOM_24" pro nil (system) "%s" ("Z2.html" ("FACT" . 787920) ("RIGHT" . 787923) ("XSIZE" . 787926) ("YSIZE" . 787929)))
-    ("A_CORRELATE" fun nil (system) "Result = %s(X, Lag)" ("A2.html" ("COVARIANCE" . 54405) ("DOUBLE" . 826748)))
-    ("ABS" fun nil (system) "Result = %s(X)" ("A3.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ACOS" fun nil (system) "Result = %s(X)" ("A4.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ADAPT_HIST_EQUAL" fun nil (system) "Result = %s (Image)" ("A5.html" ("CLIP" . 985045) ("FCN" . 987804) ("NREGIONS" . 985047) ("TOP" . 985049)))
-    ("ALOG" fun nil (system) "Result = %s(X)" ("A6.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ALOG10" fun nil (system) "Result = %s(X)" ("A7.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("AMOEBA" fun nil (system) "Result = %s( Ftol)" ("A8.html" ("FUNCTION_NAME" . 864079) ("FUNCTION_VALUE" . 864085) ("NCALLS" . 864089) ("NMAX" . 864091) ("P0" . 864094) ("SCALE" . 864103) ("SIMPLEX" . 864424)))
-    ("APP_USER_DIR" fun nil (system) "Result = %s(AuthorDirname, AuthorDesc, AppDirname, AppDesc, AppReadmeText, AppReadmeVersion)" ("A10.html" ("AUTHOR_README_TEXT" . 1011596) ("AUTHOR_README_VERSION" . 1011600) ("RESTRICT_APPVERSION" . 1011616) ("RESTRICT_ARCH" . 1011619) ("RESTRICT_FAMILY" . 1011624) ("RESTRICT_FILE_OFFSET_BITS" . 1011630) ("RESTRICT_IDL_RELEASE" . 1011635) ("RESTRICT_MEMORY_BITS" . 1011640) ("RESTRICT_OS" . 1011645)))
-    ("APP_USER_DIR_QUERY" fun nil (system) "Result = %s(AuthorDirname, AppDirname)" ("A11.html" ("COUNT" . 1011749) ("EXCLUDE_CURRENT" . 1011751) ("QUERY_APPVERSION" . 1011762) ("QUERY_ARCH" . 1011764) ("QUERY_FAMILY" . 1011766) ("QUERY_FILE_OFFSET_BITS" . 1011768) ("QUERY_IDL_RELEASE" . 1011770) ("QUERY_MEMORY_BITS" . 1011772) ("QUERY_OS" . 1011774)))
-    ("ARG_PRESENT" fun nil (system) "Result = %s(Variable)" ("A12.html"))
-    ("ARRAY_EQUAL" fun nil (system) "Result = %s( Op1 , Op2)" ("A13.html" ("NO_TYPECONV" . 987069)))
-    ("ARRAY_INDICES" fun nil (system) "Result = %s(Array, Index)" ("A14.html"))
-    ("ASCII_TEMPLATE" fun nil (system) "Result = %s( [Filename])" ("A16.html" ("BROWSE_LINES" . 871007) ("CANCEL" . 871139) ("GROUP" . 884032)))
-    ("ASIN" fun nil (system) "Result = %s(X)" ("A17.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ASSOC" fun nil (system) "Result = %s( Unit, Array_Structure [, Offset])" ("A18.html" ("PACKED" . 906241)))
-    ("ATAN" fun nil (system) "Result = %s([Y,] X)" ("A19.html" ("PHASE" . 995606)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BESELI" fun nil (system) "Result = %s(X, N)" ("B3.html" ("DOUBLE" . 998579) ("ITER" . 998584)))
-    ("BESELJ" fun nil (system) "Result = %s(X, N)" ("B4.html" ("DOUBLE" . 998704) ("ITER" . 998706)))
-    ("BESELK" fun nil (system) "Result = %s( X, N)" ("B5.html" ("DOUBLE" . 998712) ("ITER" . 998714)))
-    ("BESELY" fun nil (system) "Result = %s(X, N)" ("B6.html" ("DOUBLE" . 998720) ("ITER" . 998722)))
-    ("BETA" fun nil (system) "Result = %s( Z, W)" ("B7.html" ("DOUBLE" . 50234)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BILINEAR" fun nil (system) "Result = %s(P, IX, JY)" ("B8.html" ("MISSING" . 996637)))
-    ("BIN_DATE" fun nil (system) "Result = %s(Ascii_Time)" ("B9.html"))
-    ("BINARY_TEMPLATE" fun nil (system) "Result = %s ( [Filename])" ("B10.html" ("CANCEL" . 985257) ("GROUP" . 985259) ("N_ROWS" . 985261) ("TEMPLATE" . 988405)))
-    ("BINDGEN" fun nil (system) "Result = %s(D1 [, ...,D8])" ("B11.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BINOMIAL" fun nil (system) "Result = %s(V, N, P)" ("B12.html" ("DOUBLE" . 988094) ("GAUSSIAN" . 988097)))
-    ("BLK_CON" fun nil (system) "Result = %s( Filter, Signal)" ("B14.html" ("B_LENGTH" . 749505) ("DOUBLE" . 987871)))
-    ("BROYDEN" fun nil (system) "Result = %s( X, Vecfunc)" ("B18.html" ("CHECK" . 50283) ("DOUBLE" . 50286) ("EPS" . 50289) ("ITMAX" . 989330) ("STEPMAX" . 50292) ("TOLF" . 50295) ("TOLMIN" . 50298) ("TOLX" . 50301)))
-    ("BYTARR" fun nil (system) "Result = %s( D1[, ..., D8])" ("B19.html" ("NOZERO" . 675878)))
-    ("BYTE" fun nil (system) "Result = %s( Expression[, Offset [, D1[, ..., D8]]] )" ("B20.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("BYTSCL" fun nil (system) "Result = %s( Array)" ("B22.html" ("MAX" . 675964) ("MIN" . 675966) ("NAN" . 47179) ("TOP" . 675968)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("C_CORRELATE" fun nil (system) "Result = %s( X, Y, Lag)" ("C.html" ("COVARIANCE" . 54458) ("DOUBLE" . 826756)))
-    ("CALL_EXTERNAL" fun nil (system) "Result = %s(Image, Entry [, P0, ..., PN-1])" ("C4.html" ("ALL_VALUE" . 905908) ("AUTO_GLUE" . 1025677) ("B_VALUE" . 951311) ("CC" . 1012394) ("CDECL" . 905911) ("COMPILE_DIRECTORY" . 1012398) ("D_VALUE" . 905920) ("EXTRA_CFLAGS" . 1012436) ("EXTRA_LFLAGS" . 1012440) ("F_VALUE" . 905923) ("I_VALUE" . 905926) ("IGNORE_EXISTING_GLUE" . 1012444) ("L64_VALUE" . 951332) ("LD" . 1012449) ("NOCLEANUP" . 1012453) ("RETURN_TYPE" . 1029187) ("S_VALUE" . 951354) ("SHOW_ALL_OUTPUT" . 1012458) ("UI_VALUE" . 951320) ("UL64_VALUE" . 965882) ("UL_VALUE" . 965879) ("UNLOAD" . 993357) ("VALUE" . 905936) ("VERBOSE" . 1012497) ("WRITE_WRAPPER" . 1029198)))
-    ("CALL_FUNCTION" fun nil (system) "Result = %s(Name [, P1, ..., Pn])" ("C5.html"))
-    ("CALL_METHOD" fun nil (system) "Result = %s, Name, ObjRef, [, P1, ..., Pn]" ("C6.html"))
-    ("CDF_ATTCREATE" fun nil (system) "Result = %s( Id, Attribute_Name)" ("CDF-routines8.html" ("GLOBAL_SCOPE" . 996934) ("VARIABLE_SCOPE" . 996937)))
-    ("CDF_ATTEXISTS" fun nil (system) "Result = %s( Id, Attribute [, EntryNum])" ("CDF-routines10.html" ("ZVARIABLE" . 1002462)))
-    ("CDF_ATTNUM" fun nil (system) "Result = %s(Id, Attribute_Name)" ("CDF-routines13.html"))
-    ("CDF_CREATE" fun nil (system) "Result = %s( Filename, [Dimensions])" ("CDF-routines19.html" ("ALPHAOSF1_DECODING" . 1017799) ("ALPHAOSF1_ENCODING" . 997337) ("ALPHAVMSD_DECODING" . 1017802) ("ALPHAVMSD_ENCODING" . 997340) ("ALPHAVMSG_DECODING" . 1017805) ("ALPHAVMSG_ENCODING" . 997343) ("CLOBBER" . 1017643) ("COL_MAJOR" . 1017646) ("DECSTATION_DECODING" . 1017808) ("DECSTATION_ENCODING" . 1017778) ("HOST_DECODING" . 1017811) ("HOST_ENCODING" . 997349) ("HP_DECODING" . 1017814) ("HP_ENCODING" . 997352) ("IBMPC_DECODING" . 1017817) ("IBMPC_ENCODING" . 1017767) ("IBMRS_DECODING" . 1017820) ("IBMRS_ENCODING" . 997355) ("MAC_DECODING" . 1017823) ("MAC_ENCODING" . 997367) ("MULTI_FILE" . 1017715) ("NETWORK_DECODING" . 1017826) ("NETWORK_ENCODING" . 997378) ("NEXT_DECODING" . 1017829) ("NEXT_ENCODING" . 997381) ("ROW_MAJOR" . 1017746) ("SGI_DECODING" . 1017832) ("SGI_ENCODING" . 1017789) ("SINGLE_FILE" . 1017749) ("SUN_DECODING" . 1017835) ("SUN_ENCODING" . 997390)))
-    ("CDF_ENCODE_EPOCH" fun nil (system) "Result = %s(Epoch)" ("CDF-routines22.html" ("EPOCH" . 997448)))
-    ("CDF_ERROR" fun nil (system) "Result = %s(Status)" ("CDF-routines24.html"))
-    ("CDF_EXISTS" fun nil (system) "Result = %s( )" ("CDF-routines25.html"))
-    ("CDF_INQUIRE" fun nil (system) "Result = %s(Id)" ("CDF-routines26.html"))
-    ("CDF_OPEN" fun nil (system) "Result = %s(Filename)" ("CDF-routines28.html"))
-    ("CDF_PARSE_EPOCH" fun nil (system) "Result = %s(Epoch_string)" ("CDF-routines29.html"))
-    ("CDF_VARCREATE" fun nil (system) "Result = %s( Id, Name [, DimVary])" ("CDF-routines30.html" ("ALLOCATERECS" . 997736) ("DIMENSIONS" . 997739) ("NUMELEM" . 997744) ("REC_NOVARY" . 997747) ("REC_VARY" . 997750) ("VARIABLETYPE" . 1027601) ("ZVARIABLE" . 997753)))
-    ("CDF_VARINQ" fun nil (system) "Result = %s( Id, Variable)" ("CDF-routines34.html" ("ZVARIABLE" . 997944)))
-    ("CDF_VARNUM" fun nil (system) "Result = %s( Id, VarName [, IsZVar] )" ("CDF-routines35.html"))
-    ("CEIL" fun nil (system) "Result = %s(X)" ("C12.html" ("L64" . 1015251)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CHEBYSHEV" fun nil (system) "Result = %s(D, N)" ("C13.html"))
-    ("CHECK_MATH" fun nil (system) "Result = %s()" ("C14.html" ("MASK" . 993110) ("NOCLEAR" . 993190) ("PRINT" . 993188)))
-    ("CHISQR_CVF" fun nil (system) "Result = %s(P, Df)" ("C15.html"))
-    ("CHISQR_PDF" fun nil (system) "Result = %s(V, Df)" ("C16.html"))
-    ("CHOLSOL" fun nil (system) "Result = %s( A, P, B)" ("C18.html" ("DOUBLE" . 50387)))
-    ("CINDGEN" fun nil (system) "Result = %s(D1[, ..., D8])" ("C19.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CLUST_WTS" fun nil (system) "Result = %s( Array)" ("C22.html" ("DOUBLE" . 862498) ("N_CLUSTERS" . 862487) ("N_ITERATIONS" . 862488) ("VARIABLE_WTS" . 862545)))
-    ("CLUSTER" fun nil (system) "Result = %s( Array, Weights)" ("C23.html" ("DOUBLE" . 862580) ("N_CLUSTERS" . 862583)))
-    ("CLUSTER_TREE" fun nil (system) "Result = %s( Pairdistance, Linkdistance)" ("C24.html" ("DATA" . 1196682) ("LINKAGE" . 1196686) ("MEASURE" . 1196715) ("POWER_MEASURE" . 1196749)))
-    ("COLOR_QUAN" fun nil (system) "Result = %s( Image_R, Image_G, Image_B, R, G, B) or Result = %s( Image, Dim, R, G, B )" ("C26.html" ("COLORS" . 676177) ("CUBE" . 676179) ("DITHER" . 676181) ("ERROR" . 676183) ("GET_TRANSLATION" . 676185) ("MAP_ALL" . 676187) ("TRANSLATION" . 676189)))
-    ("COLORMAP_APPLICABLE" fun nil (system) "Result = %s( redrawRequired )" ("C27.html"))
-    ("COMFIT" fun nil (system) "Result = %s( X, Y, A)" ("C28.html" ("EXPONENTIAL" . 53208) ("GEOMETRIC" . 838932) ("GOMPERTZ" . 838937) ("HYPERBOLIC" . 838944) ("LOGISTIC" . 838961) ("LOGSQUARE" . 838970) ("SIGMA" . 838980) ("WEIGHTS" . 53265) ("YFIT" . 53268)))
-    ("COMPLEX" fun nil (system) "Result = %s( Real [, Imaginary])" ("C31.html" ("DOUBLE" . 1041956)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("COMPLEXARR" fun nil (system) "Result = %s( D1[, ..., D8])" ("C32.html" ("NOZERO" . 676236)))
-    ("COMPLEXROUND" fun nil (system) "Result = %s(Input)" ("C33.html"))
-    ("COMPUTE_MESH_NORMALS" fun nil (system) "Result = %s( fVerts[, iConn] )" ("C34.html"))
-    ("COND" fun nil (system) "Result = %s( A)" ("C35.html" ("DOUBLE" . 749542) ("LNORM" . 1042001)))
-    ("CONGRID" fun nil (system) "Result = %s( Array, X, Y, Z)" ("C36.html" ("CENTER" . 757848) ("CUBIC" . 1042041) ("INTERP" . 757851) ("MINUS_ONE" . 757854)))
-    ("CONJ" fun nil (system) "Result = %s(X)" ("C37.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CONVERT_COORD" fun nil (system) "Result = %s( X [, Y [, Z]])" ("C41.html" ("DATA" . 676377) ("DEVICE" . 676379) ("DOUBLE" . 1015017) ("NORMAL" . 676381) ("T3D" . 676383) ("TO_DATA" . 676385) ("TO_DEVICE" . 676387) ("TO_NORMAL" . 676389)))
-    ("CONVOL" fun nil (system) "Result = %s( Array, Kernel [, Scale_Factor])" ("C42.html" ("CENTER" . 676409) ("EDGE_TRUNCATE" . 746326) ("EDGE_WRAP" . 228821) ("MISSING" . 1028668) ("NAN" . 1028683)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("COORD2TO3" fun nil (system) "Result = %s( Mx, My, Dim, D0 [, PTI] )" ("C43.html"))
-    ("CORRELATE" fun nil (system) "Result = %s( X [, Y])" ("C45.html" ("COVARIANCE" . 53307) ("DOUBLE" . 868819)))
-    ("COS" fun nil (system) "Result = %s(X)" ("C46.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("COSH" fun nil (system) "Result = %s(X)" ("C47.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("CRAMER" fun nil (system) "Result = %s( A, B)" ("C49.html" ("DOUBLE" . 749607) ("ZERO" . 749609)))
-    ("CREATE_CURSOR" fun nil (system) "Result = %s( StringArray)" ("C50.html" ("HOTSPOT" . 1192516) ("MASK" . 1222423)))
-    ("CREATE_STRUCT" fun nil (system) "Result = %s( [Tag1, Values1, ..., Tagn, Valuesn] [, Structuresn])" ("C51.html" ("NAME" . 279439)))
-    ("CROSSP" fun nil (system) "Result = %s(V1, V2)" ("C53.html"))
-    ("CRVLENGTH" fun nil (system) "Result = %s( X, Y)" ("C54.html" ("DOUBLE" . 862840)))
-    ("CT_LUMINANCE" fun nil (system) "Result = %s( [R, G, B])" ("C55.html" ("BRIGHT" . 759145) ("DARK" . 759148) ("READ_TABLES" . 759151)))
-    ("CTI_TEST" fun nil (system) "Result = %s( Obfreq)" ("C56.html" ("COEFF" . 53357) ("CORRECTED" . 53360) ("CRAMV" . 53363) ("DF" . 53366) ("EXFREQ" . 53369) ("RESIDUAL" . 53372)))
-    ("CURVEFIT" fun nil (system) "Result = %s( X, Y, Weights, A [, Sigma])" ("C58.html" ("CHISQ" . 1024958) ("DOUBLE" . 1024093) ("FITA" . 148399) ("FUNCTION_NAME" . 1118305) ("ITER" . 150209) ("ITMAX" . 150211) ("NODERIVATIVE" . 150222) ("STATUS" . 1107869) ("TOL" . 1108021) ("YERROR" . 1053331)))
-    ("CV_COORD" fun nil (system) "Result = %s()" ("C59.html" ("DEGREES" . 756965) ("DOUBLE" . 1025482) ("FROM_CYLIN" . 756968) ("FROM_POLAR" . 756971) ("FROM_RECT" . 756974) ("FROM_SPHERE" . 756977) ("TO_CYLIN" . 1109055) ("TO_POLAR" . 756983) ("TO_RECT" . 756986) ("TO_SPHERE" . 756989)))
-    ("CVTTOBM" fun nil (system) "Result = %s( Array)" ("C60.html" ("THRESHOLD" . 871509)))
-    ("CW_ANIMATE" fun nil (system) "Result = %s( Parent, Sizex, Sizey, Nframes)" ("C61.html" ("NO_KILL" . 853861) ("OPEN_FUNC" . 853864) ("PIXMAPS" . 853868) ("TAB_MODE" . 1189372) ("TRACK" . 853871) ("UNAME" . 996617) ("UVALUE" . 853874)))
-    ("CW_ARCBALL" fun nil (system) "Result = %s( Parent)" ("C65.html" ("COLORS" . 755064) ("FRAME" . 755074) ("LABEL" . 755077) ("RETAIN" . 755080) ("SIZE" . 755108) ("TAB_MODE" . 1189488) ("UNAME" . 996624) ("UPDATE" . 1189483) ("UVALUE" . 755114) ("VALUE" . 755117)))
-    ("CW_BGROUP" fun nil (system) "Result = %s( Parent, Names)" ("C66.html" ("BUTTON_UVALUE" . 755175) ("COLUMN" . 755178) ("EVENT_FUNC" . 755181) ("EXCLUSIVE" . 755184) ("FONT" . 755187) ("FRAME" . 755190) ("IDS" . 755193) ("LABEL_LEFT" . 755196) ("LABEL_TOP" . 755199) ("MAP" . 755202) ("NO_RELEASE" . 755208) ("NONEXCLUSIVE" . 755205) ("RETURN_ID" . 755211) ("RETURN_INDEX" . 755214) ("RETURN_NAME" . 755217) ("ROW" . 755220) ("SCROLL" . 755223) ("SET_VALUE" . 755226) ("SPACE" . 755230) ("TAB_MODE" . 1189560) ("UNAME" . 996707) ("UVALUE" . 755233) ("X_SCROLL_SIZE" . 755245) ("XOFFSET" . 755236) ("XPAD" . 755239) ("XSIZE" . 755242) ("Y_SCROLL_SIZE" . 755257) ("YOFFSET" . 755248) ("YPAD" . 755251) ("YSIZE" . 755254)))
-    ("CW_CLR_INDEX" fun nil (system) "Result = %s( Parent)" ("C67.html" ("COLOR_VALUES" . 854099) ("EVENT_FUNC" . 854102) ("FRAME" . 854105) ("LABEL" . 854108) ("NCOLORS" . 854111) ("START_COLOR" . 854114) ("TAB_MODE" . 1189650) ("UNAME" . 996631) ("UVALUE" . 854117) ("VALUE" . 854120) ("XSIZE" . 1025090) ("YSIZE" . 854123)))
-    ("CW_COLORSEL" fun nil (system) "Result = %s( Parent)" ("C68.html" ("FRAME" . 854194) ("TAB_MODE" . 1189739) ("UNAME" . 996638) ("UVALUE" . 1233223) ("XOFFSET" . 854200) ("YOFFSET" . 854203)))
-    ("CW_DEFROI" fun nil (system) "Result = %s( Draw)" ("C69.html" ("IMAGE_SIZE" . 755439) ("OFFSET" . 755442) ("ORDER" . 755445) ("RESTORE" . 755448) ("TAB_MODE" . 1189809) ("ZOOM" . 755451)))
-    ("CW_FIELD" fun nil (system) "Result = %s( Parent)" ("C70.html" ("ALL_EVENTS" . 755508) ("COLUMN" . 755511) ("FIELDFONT" . 755514) ("FLOATING" . 755517) ("FONT" . 755520) ("FRAME" . 755523) ("INTEGER" . 755526) ("LONG" . 755529) ("NOEDIT" . 755532) ("RETURN_EVENTS" . 755535) ("ROW" . 755540) ("STRING" . 755543) ("TAB_MODE" . 1189883) ("TEXT_FRAME" . 755546) ("TITLE" . 1029040) ("UNAME" . 996600) ("UVALUE" . 755549) ("VALUE" . 755552) ("XSIZE" . 755555) ("YSIZE" . 755558)))
-    ("CW_FILESEL" fun nil (system) "Result = %s ( Parent)" ("C71.html" ("FILENAME" . 1001063) ("FILTER" . 1001065) ("FIX_FILTER" . 1001072) ("FRAME" . 1001074) ("IMAGE_FILTER" . 1001076) ("MULTIPLE" . 1001078) ("PATH" . 1001080) ("SAVE" . 1024908) ("TAB_MODE" . 1189963) ("UNAME" . 1001082) ("UVALUE" . 1001085) ("WARN_EXIST" . 1024611)))
-    ("CW_FORM" fun nil (system) "Result = %s( [Parent,] Desc)" ("C72.html" ("COLUMN" . 141396) ("IDS" . 141399) ("TAB_MODE" . 1190037) ("TITLE" . 141402) ("UNAME" . 996652) ("UVALUE" . 141405)))
-    ("CW_FSLIDER" fun nil (system) "Result = %s( Parent)" ("C73.html" ("DOUBLE" . 755581) ("DRAG" . 1028998) ("EDIT" . 755584) ("FORMAT" . 755587) ("FRAME" . 755590) ("MAXIMUM" . 755593) ("MINIMUM" . 755596) ("SCROLL" . 218849) ("SUPPRESS_VALUE" . 755599) ("TAB_MODE" . 1190109) ("TITLE" . 755602) ("UNAME" . 996664) ("UVALUE" . 755605) ("VALUE" . 755608) ("VERTICAL" . 755611) ("XSIZE" . 755614) ("YSIZE" . 755617)))
-    ("CW_ITMENU" fun nil (system) "Result = %s(Parent, UI, Target)" ("fw_cw_ref4.html" ("CONTEXT_MENU" . 999147) ("UNAME" . 999150) ("UVALUE" . 999153)))
-    ("CW_ITPANEL" fun nil (system) "Result = %s(Parent, UI)" ("fw_cw_ref5.html" ("ORIENTATION" . 999520) ("UNAME" . 999524) ("UVALUE" . 999527)))
-    ("CW_ITSTATUSBAR" fun nil (system) "Result = %s(Parent, UI)" ("fw_cw_ref6.html" ("UNAME" . 999554) ("UVALUE" . 999557) ("XSIZE" . 999560)))
-    ("CW_ITTOOLBAR" fun nil (system) "Result = %s(Parent, UI, Target)" ("fw_cw_ref7.html" ("EXCLUSIVE" . 999187) ("ROW" . 999190) ("UNAME" . 1001835) ("UVALUE" . 999196)))
-    ("CW_ITWINDOW" fun nil (system) "Result = %s(Parent, UI)" ("fw_cw_ref8.html" ("DIMENSIONS" . 999225) ("UNAME" . 999229) ("UVALUE" . 999232) ("VIRTUAL_DIMENSIONS" . 1002122)))
-    ("CW_LIGHT_EDITOR" fun nil (system) "Result = %s (Parent)" ("C74.html" ("DIRECTION_DISABLED" . 1001420) ("DRAG_EVENTS" . 1001422) ("FRAME" . 1001426) ("HIDE_DISABLED" . 1001428) ("LIGHT" . 1001430) ("LOCATION_DISABLED" . 1001432) ("TAB_MODE" . 1239092) ("TYPE_DISABLED" . 1001434) ("UNAME" . 1001436) ("UVALUE" . 1001439) ("XRANGE" . 1001441) ("XSIZE" . 1001443) ("YRANGE" . 1001445) ("YSIZE" . 1001447) ("ZRANGE" . 1001449)))
-    ("CW_ORIENT" fun nil (system) "Result = %s( Parent)" ("C77.html" ("AX" . 755637) ("AZ" . 755640) ("FRAME" . 755643) ("TAB_MODE" . 1190182) ("TITLE" . 755646) ("UNAME" . 996671) ("UVALUE" . 755649) ("XSIZE" . 755652) ("YSIZE" . 755655)))
-    ("CW_PALETTE_EDITOR" fun nil (system) "Result = %s (Parent)" ("C78.html" ("DATA" . 1001627) ("FRAME" . 1001629) ("HISTOGRAM" . 1001631) ("HORIZONTAL" . 1001633) ("SELECTION" . 1001635) ("TAB_MODE" . 1190256) ("UNAME" . 1001637) ("UVALUE" . 1001640) ("XSIZE" . 1001642) ("YSIZE" . 1001644)))
-    ("CW_PDMENU" fun nil (system) "Result = %s( Parent, Desc)" ("C81.html" ("COLUMN" . 755708) ("CONTEXT_MENU" . 1025506) ("DELIMITER" . 1042113) ("FONT" . 67046) ("HELP" . 855550) ("IDS" . 860166) ("MBAR" . 1188103) ("RETURN_FULL_NAME" . 755726) ("RETURN_ID" . 1188112) ("RETURN_INDEX" . 755720) ("RETURN_NAME" . 755723) ("TAB_MODE" . 1190329) ("UNAME" . 996678) ("UVALUE" . 755731) ("XOFFSET" . 755734) ("YOFFSET" . 755737)))
-    ("CW_RGBSLIDER" fun nil (system) "Result = %s( Parent)" ("C82.html" ("CMY" . 755795) ("COLOR_INDEX" . 755798) ("DRAG" . 755801) ("FRAME" . 755804) ("GRAPHICS_LEVEL" . 755807) ("HLS" . 755810) ("HSV" . 1025517) ("LENGTH" . 755813) ("RGB" . 755816) ("TAB_MODE" . 1190402) ("UNAME" . 996685) ("UVALUE" . 755819) ("VALUE" . 755822) ("VERTICAL" . 1025592)))
-    ("CW_TMPL" fun nil (system) "Result = %s( Parent)" ("C83.html" ("TAB_MODE" . 1239165) ("UNAME" . 996692) ("UVALUE" . 137507)))
-    ("CW_ZOOM" fun nil (system) "Result = %s( Parent)" ("C84.html" ("FRAME" . 755848) ("MAX" . 755851) ("MIN" . 755854) ("RETAIN" . 755857) ("SAMPLE" . 755885) ("SCALE" . 755888) ("TAB_MODE" . 1190480) ("TRACK" . 755891) ("UNAME" . 996700) ("UVALUE" . 755894) ("X_SCROLL_SIZE" . 755900) ("X_ZSIZE" . 755903) ("XSIZE" . 755897) ("Y_SCROLL_SIZE" . 755909) ("Y_ZSIZE" . 755912) ("YSIZE" . 755906)))
-    ("DB_EXISTS" fun nil (system) "status = %s()" ("api5.html"))
-    ("DBLARR" fun nil (system) "Result = %s( D1[, ..., D8])" ("D.html" ("NOZERO" . 676487)))
-    ("DCINDGEN" fun nil (system) "Result = %s( D1 [, ..., D8 ])" ("D2.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("DCOMPLEX" fun nil (system) "Result = %s( Real [, Imaginary] ) or Result = %s( Expression, Offset [, D1 [, ..., D8]] )" ("D3.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("DCOMPLEXARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("D4.html" ("NOZERO" . 37699)))
-    ("DEFROI" fun nil (system) "Result = %s( Sx, Sy [, Xverts, Yverts])" ("D8.html" ("NOFILL" . 757032) ("NOREGION" . 757029) ("RESTORE" . 757035) ("X0" . 757039) ("Y0" . 757039) ("ZOOM" . 757042)))
-    ("DERIV" fun nil (system) "Result = %s([X,] Y)" ("D13.html"))
-    ("DERIVSIG" fun nil (system) "Result = %s( [X, Y, Sigx,] Sigy )" ("D14.html"))
-    ("DETERM" fun nil (system) "Result = %s( A)" ("D15.html" ("CHECK" . 749767) ("DOUBLE" . 37196) ("ZERO" . 749769)))
-    ("DIAG_MATRIX" fun nil (system) "Result = %s(A [, Diag] )" ("D18.html"))
-    ("DIALOG_DBCONNECT" fun nil (system) "status = %s(DBobj)" ("api4.html" ("DATASOURCE" . 1007548) ("DIALOG_PARENT" . 1007555) ("PASSWORD" . 1007553) ("USER_ID" . 1007551)))
-    ("DIALOG_MESSAGE" fun nil (system) "Result = %s( Message_Text)" ("D19.html" ("CANCEL" . 863012) ("DEFAULT_CANCEL" . 863015) ("DEFAULT_NO" . 863018) ("DIALOG_PARENT" . 863021) ("DISPLAY_NAME" . 871724) ("ERROR" . 863025) ("INFORMATION" . 863028) ("QUESTION" . 863031) ("RESOURCE_NAME" . 863035) ("TITLE" . 863041)))
-    ("DIALOG_PICKFILE" fun nil (system) "Result = %s()" ("D20.html" ("DEFAULT_EXTENSION" . 1010269) ("DIALOG_PARENT" . 907482) ("DIRECTORY" . 951270) ("DISPLAY_NAME" . 907484) ("FILE" . 862313) ("FILTER" . 907329) ("FIX_FILTER" . 907334) ("GET_PATH" . 862316) ("GROUP" . 862319) ("MULTIPLE_FILES" . 907351) ("MUST_EXIST" . 1009929) ("OVERWRITE_PROMPT" . 1009949) ("PATH" . 1009942) ("READ" . 862322) ("RESOURCE_NAME" . 1006308) ("TITLE" . 907359) ("WRITE" . 862325)))
-    ("DIALOG_PRINTERSETUP" fun nil (system) "Result = %s( [PrintDestination])" ("D21.html" ("DIALOG_PARENT" . 984460) ("DISPLAY_NAME" . 984463) ("RESOURCE_NAME" . 984466) ("TITLE" . 984469)))
-    ("DIALOG_PRINTJOB" fun nil (system) "Result = %s( [PrintDestination])" ("D22.html" ("DIALOG_PARENT" . 863760) ("DISPLAY_NAME" . 870902) ("RESOURCE_NAME" . 870904) ("TITLE" . 870915)))
-    ("DIALOG_READ_IMAGE" fun nil (system) "Result = %s ( [Filename])" ("D23.html" ("BLUE" . 986778) ("DIALOG_PARENT" . 986218) ("FILE" . 986220) ("FILTER_TYPE" . 986222) ("FIX_FILTER" . 986226) ("GET_PATH" . 986785) ("GREEN" . 990353) ("IMAGE" . 986228) ("PATH" . 986230) ("QUERY" . 986232) ("RED" . 986234) ("TITLE" . 986240)))
-    ("DIALOG_WRITE_IMAGE" fun nil (system) "Result = %s ( Image [, R, G, B])" ("D24.html" ("DIALOG_PARENT" . 986258) ("FILE" . 986260) ("FIX_TYPE" . 986262) ("NOWRITE" . 986264) ("OPTIONS" . 986266) ("PATH" . 986268) ("TITLE" . 986270) ("TYPE" . 986272) ("WARN_EXIST" . 990326)))
-    ("DIGITAL_FILTER" fun nil (system) "Result = %s( Flow, Fhigh, A, Nterms)" ("D25.html" ("DOUBLE" . 1002899)))
-    ("DILATE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" ("D26.html" ("BACKGROUND" . 984751) ("CONSTRAINED" . 984770) ("GRAY" . 984614) ("PRESERVE_TYPE" . 984778) ("UINT" . 984780) ("ULONG" . 984782) ("VALUES" . 984617)))
-    ("DINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("D27.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("DIST" fun nil (system) "Result = %s(N [, M])" ("D29.html"))
-    ("DISTANCE_MEASURE" fun nil (system) "Result = %s( Array)" ("D30.html" ("DOUBLE" . 1033017) ("MATRIX" . 1033020) ("MEASURE" . 1033023) ("POWER_MEASURE" . 1033069)))
-    ("DOUBLE" fun nil (system) "Result = %s(Expression[, Offset [, D1 [, ..., D8]]])" ("D34.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("EIGENQL" fun nil (system) "Result = %s( A)" ("E2.html" ("ABSOLUTE" . 870576) ("ASCENDING" . 862897) ("DOUBLE" . 862899) ("EIGENVECTORS" . 870583) ("OVERWRITE" . 862901) ("RESIDUAL" . 862903)))
-    ("EIGENVEC" fun nil (system) "Result = %s( A, Eval)" ("E3.html" ("DOUBLE" . 47356) ("ITMAX" . 47358) ("RESIDUAL" . 47286)))
-    ("ELMHES" fun nil (system) "Result = %s( A)" ("E4.html" ("COLUMN" . 983389) ("DOUBLE" . 50601) ("NO_BALANCE" . 50604)))
-    ("EOF" fun nil (system) "Result = %s(Unit)" ("E7.html"))
-    ("EOS_EH_CONVANG" fun nil (system) "Result = %s(inAngle, code)" ("EOS-routines8.html"))
-    ("EOS_EH_GETVERSION" fun nil (system) "Result = %s(fid, version)" ("EOS-routines9.html"))
-    ("EOS_EH_IDINFO" fun nil (system) "Result = %s(fid, HDFfid, sdInterfaceID)" ("EOS-routines10.html"))
-    ("EOS_EXISTS" fun nil (system) "Result = %s( )" ("EOS-routines11.html"))
-    ("EOS_GD_ATTACH" fun nil (system) "Result = %s(fid, gridname)" ("EOS-routines12.html"))
-    ("EOS_GD_ATTRINFO" fun nil (system) "Result = %s(gridID, attrname, numbertype, count)" ("EOS-routines13.html"))
-    ("EOS_GD_BLKSOMOFFSET" fun nil (system) "Result = %s(gridID, offset, code)" ("EOS-routines14.html"))
-    ("EOS_GD_CLOSE" fun nil (system) "Result = %s(fid)" ("EOS-routines15.html"))
-    ("EOS_GD_COMPINFO" fun nil (system) "Result = %s(gridID, fieldname, compcode, compparm)" ("EOS-routines16.html"))
-    ("EOS_GD_CREATE" fun nil (system) "Result = %s(fid, gridname, xdimsize, ydimsize, upleftpt, lowrightpt)" ("EOS-routines17.html"))
-    ("EOS_GD_DEFBOXREGION" fun nil (system) "Result = %s(gridID, cornerlon, cornerlat)" ("EOS-routines18.html"))
-    ("EOS_GD_DEFCOMP" fun nil (system) "Result = %s(gridID, compcode [, compparm] )" ("EOS-routines19.html"))
-    ("EOS_GD_DEFDIM" fun nil (system) "Result = %s(gridID, dimname, dim)" ("EOS-routines20.html"))
-    ("EOS_GD_DEFFIELD" fun nil (system) "Result = %s(gridID, fieldname, dimlist, numbertype)" ("EOS-routines21.html" ("MERGE" . 1030256)))
-    ("EOS_GD_DEFORIGIN" fun nil (system) "Result = %s(gridID, origincode)" ("EOS-routines22.html"))
-    ("EOS_GD_DEFPIXREG" fun nil (system) "Result = %s(gridID, pixreg)" ("EOS-routines23.html"))
-    ("EOS_GD_DEFPROJ" fun nil (system) "Result = %s(gridID, projcode, zonecode, spherecode, projparm)" ("EOS-routines24.html"))
-    ("EOS_GD_DEFTILE" fun nil (system) "Result = %s( gridID, tilecode [, tilerank, tiledims] )" ("EOS-routines25.html"))
-    ("EOS_GD_DEFVRTREGION" fun nil (system) "Result = %s(gridID, regionID, vertObj, range)" ("EOS-routines26.html"))
-    ("EOS_GD_DETACH" fun nil (system) "Result = %s(gridID)" ("EOS-routines27.html"))
-    ("EOS_GD_DIMINFO" fun nil (system) "Result = %s(gridID, dimname)" ("EOS-routines28.html"))
-    ("EOS_GD_DUPREGION" fun nil (system) "Result = %s(regionID)" ("EOS-routines29.html"))
-    ("EOS_GD_EXTRACTREGION" fun nil (system) "Result = %s(gridID, regionID, fieldname, buffer)" ("EOS-routines30.html"))
-    ("EOS_GD_FIELDINFO" fun nil (system) "Result = %s(gridID, fieldname, rank, dims, numbertype, dimlist)" ("EOS-routines31.html"))
-    ("EOS_GD_GETFILLVALUE" fun nil (system) "Result = %s(gridID, fieldname, fillvalue)" ("EOS-routines32.html"))
-    ("EOS_GD_GETPIXELS" fun nil (system) "Result = %s(gridID, nLonLat, lonVal, latVal, pixRow, pixCol)" ("EOS-routines33.html"))
-    ("EOS_GD_GETPIXVALUES" fun nil (system) "Result = %s(gridID, nPixels, pixCol, pixRow, fieldname, buffer)" ("EOS-routines34.html"))
-    ("EOS_GD_GRIDINFO" fun nil (system) "Result = %s(gridID, xdimsize, ydimsize, upleft, lowright)" ("EOS-routines35.html"))
-    ("EOS_GD_INQATTRS" fun nil (system) "Result = %s( gridID, attrlist)" ("EOS-routines36.html" ("LENGTH" . 1030732)))
-    ("EOS_GD_INQDIMS" fun nil (system) "Result = %s(gridID, dimname, dims)" ("EOS-routines37.html"))
-    ("EOS_GD_INQFIELDS" fun nil (system) "Result = %s(gridID, fieldlist, rank, numbertype)" ("EOS-routines38.html"))
-    ("EOS_GD_INQGRID" fun nil (system) "Result = %s( filename, gridlist)" ("EOS-routines39.html" ("LENGTH" . 1030811)))
-    ("EOS_GD_INTERPOLATE" fun nil (system) "Result = %s(gridID, Interp, lonVal, latVal, fieldname, interpVal)" ("EOS-routines40.html"))
-    ("EOS_GD_NENTRIES" fun nil (system) "Result = %s( gridID, entrycode)" ("EOS-routines41.html" ("LENGTH" . 1030866)))
-    ("EOS_GD_OPEN" fun nil (system) "Result = %s( filename, access)" ("EOS-routines42.html" ("CREATE" . 1030919) ("RDWR" . 1030921) ("READ" . 1030923)))
-    ("EOS_GD_ORIGININFO" fun nil (system) "Result = %s(gridID, origincode)" ("EOS-routines43.html"))
-    ("EOS_GD_PIXREGINFO" fun nil (system) "Result = %s(gridID, pixregcode)" ("EOS-routines44.html"))
-    ("EOS_GD_PROJINFO" fun nil (system) "Result = %s(gridID, projcode, zonecode, spherecode, projparm)" ("EOS-routines45.html"))
-    ("EOS_GD_QUERY" fun nil (system) "Result = %s( Filename, GridName, [Info])" ("EOS-routines46.html"))
-    ("EOS_GD_READATTR" fun nil (system) "Result = %s(gridID, attrname, datbuf)" ("EOS-routines47.html"))
-    ("EOS_GD_READFIELD" fun nil (system) "Result = %s( gridID, fieldname, buffer)" ("EOS-routines48.html" ("EDGE" . 1031035) ("START" . 1031037) ("STRIDE" . 1031039)))
-    ("EOS_GD_READTILE" fun nil (system) "Result = %s(gridID, fieldname, tilecoords, buffer)" ("EOS-routines49.html"))
-    ("EOS_GD_REGIONINFO" fun nil (system) "Result = %s(gridID, regionID, fieldname, ntype, rank, dims, size, upleftpt, lowrightpt)" ("EOS-routines50.html"))
-    ("EOS_GD_SETFILLVALUE" fun nil (system) "Result = %s(gridID, fieldname, fillvalue)" ("EOS-routines51.html"))
-    ("EOS_GD_SETTILECACHE" fun nil (system) "Result = %s(gridID, fieldname, maxcache, cachecode)" ("EOS-routines52.html"))
-    ("EOS_GD_TILEINFO" fun nil (system) "Result = %s(gridID, fieldname, tilecode, tilerank, tiledims)" ("EOS-routines53.html"))
-    ("EOS_GD_WRITEATTR" fun nil (system) "Result = %s( gridID, attrname, datbuf)" ("EOS-routines54.html" ("COUNT" . 1031201) ("HDF_TYPE" . 1031203)))
-    ("EOS_GD_WRITEFIELD" fun nil (system) "Result = %s( gridID, fieldname, data)" ("EOS-routines55.html" ("EDGE" . 1031230) ("START" . 1031232) ("STRIDE" . 1031234)))
-    ("EOS_GD_WRITEFIELDMETA" fun nil (system) "Result = %s(gridID, fieldname, dimlist, numbertype)" ("EOS-routines56.html"))
-    ("EOS_GD_WRITETILE" fun nil (system) "Result = %s(gridID, fieldname, tilecoords, data)" ("EOS-routines57.html"))
-    ("EOS_PT_ATTACH" fun nil (system) "Result = %s(fid, pointname)" ("EOS-routines58.html"))
-    ("EOS_PT_ATTRINFO" fun nil (system) "Result = %s( pointID, attrname, numbertype, count)" ("EOS-routines59.html"))
-    ("EOS_PT_BCKLINKINFO" fun nil (system) "Result = %s(pointID, level, linkfield)" ("EOS-routines60.html"))
-    ("EOS_PT_CLOSE" fun nil (system) "Result = %s(fid)" ("EOS-routines61.html"))
-    ("EOS_PT_CREATE" fun nil (system) "Result = %s(fid, pointname)" ("EOS-routines62.html"))
-    ("EOS_PT_DEFBOXREGION" fun nil (system) "Result = %s(pointID, cornerlon, cornerlat)" ("EOS-routines63.html"))
-    ("EOS_PT_DEFLEVEL" fun nil (system) "Result = %s(pointID, levelname, fieldlist, fieldtype, fieldorder)" ("EOS-routines64.html"))
-    ("EOS_PT_DEFLINKAGE" fun nil (system) "Result = %s(pointID, parent, child, linkfield)" ("EOS-routines65.html"))
-    ("EOS_PT_DEFTIMEPERIOD" fun nil (system) "Result = %s(pointID, starttime, stoptime)" ("EOS-routines66.html"))
-    ("EOS_PT_DEFVRTREGION" fun nil (system) "Result = %s( pointID, regionID, vertObj, range)" ("EOS-routines67.html"))
-    ("EOS_PT_DETACH" fun nil (system) "Result = %s(pointID)" ("EOS-routines68.html"))
-    ("EOS_PT_EXTRACTPERIOD" fun nil (system) "Result = %s(pointID, periodID, level, fieldlist, buffer)" ("EOS-routines69.html"))
-    ("EOS_PT_EXTRACTREGION" fun nil (system) "Result = %s( pointID, regionID, level, fieldlist, buffer)" ("EOS-routines70.html"))
-    ("EOS_PT_FWDLINKINFO" fun nil (system) "Result = %s(pointID, level, linkfield)" ("EOS-routines71.html"))
-    ("EOS_PT_GETLEVELNAME" fun nil (system) "Result = %s( pointID, level, levelname)" ("EOS-routines72.html" ("LENGTH" . 1017099)))
-    ("EOS_PT_GETRECNUMS" fun nil (system) "Result = %s( pointID, inlevel, outlevel, inNrec, inRecs, outNrec, outRecs)" ("EOS-routines73.html"))
-    ("EOS_PT_INQATTRS" fun nil (system) "Result = %s( pointID, attrlist)" ("EOS-routines74.html" ("LENGTH" . 1017172)))
-    ("EOS_PT_INQPOINT" fun nil (system) "Result = %s( filename, pointlist)" ("EOS-routines75.html" ("LENGTH" . 1017203)))
-    ("EOS_PT_LEVELINDX" fun nil (system) "Result = %s( pointID, levelname)" ("EOS-routines76.html"))
-    ("EOS_PT_LEVELINFO" fun nil (system) "Result = %s(pointID, level, fieldlist, fldtype, fldorder)" ("EOS-routines77.html"))
-    ("EOS_PT_NFIELDS" fun nil (system) "Result = %s( pointID, level)" ("EOS-routines78.html" ("LENGTH" . 1017295)))
-    ("EOS_PT_NLEVELS" fun nil (system) "Result = %s(pointID)" ("EOS-routines79.html"))
-    ("EOS_PT_NRECS" fun nil (system) "Result = %s( pointID, level)" ("EOS-routines80.html"))
-    ("EOS_PT_OPEN" fun nil (system) "Result = %s( fieldname)" ("EOS-routines81.html" ("CREATE" . 1017375) ("RDWR" . 1024341) ("READ" . 1024343)))
-    ("EOS_PT_PERIODINFO" fun nil (system) "Result = %s(pointID, periodID, level, fieldlist, size)" ("EOS-routines82.html"))
-    ("EOS_PT_PERIODRECS" fun nil (system) "Result = %s(pointID, periodID, level, nrec, recs)" ("EOS-routines83.html"))
-    ("EOS_PT_QUERY" fun nil (system) "Result = %s( Filename, PointName, [Info] )" ("EOS-routines84.html"))
-    ("EOS_PT_READATTR" fun nil (system) "Result = %s(pointID, attrname, datbuf)" ("EOS-routines85.html"))
-    ("EOS_PT_READLEVEL" fun nil (system) "Result = %s(pointID, level, fieldlist, nrec, recs, buffer)" ("EOS-routines86.html"))
-    ("EOS_PT_REGIONINFO" fun nil (system) "Result = %s(pointID, regionID, level, fieldlist, size)" ("EOS-routines87.html"))
-    ("EOS_PT_REGIONRECS" fun nil (system) "Result = %s(pointID, regionID, level, nrec, recs)" ("EOS-routines88.html"))
-    ("EOS_PT_SIZEOF" fun nil (system) "Result = %s(pointID, fieldlist, fldlevel)" ("EOS-routines89.html"))
-    ("EOS_PT_UPDATELEVEL" fun nil (system) "Result = %s(pointID, level, field, list, nrec, recs, data)" ("EOS-routines90.html"))
-    ("EOS_PT_WRITEATTR" fun nil (system) "Result = %s( pointID, attrname, datbuf)" ("EOS-routines91.html" ("COUNT" . 1017685) ("HDF_TYPE" . 1024378)))
-    ("EOS_PT_WRITELEVEL" fun nil (system) "Result = %s(pointID, level, nrec, data)" ("EOS-routines92.html"))
-    ("EOS_QUERY" fun nil (system) "Result = %s( Filename, [Info] )" ("EOS-routines93.html"))
-    ("EOS_SW_ATTACH" fun nil (system) "Result = %s(fid, swathname)" ("EOS-routines94.html"))
-    ("EOS_SW_ATTRINFO" fun nil (system) "Result = %s(swathID, attrname, numbertype, count)" ("EOS-routines95.html"))
-    ("EOS_SW_CLOSE" fun nil (system) "Result = %s(fid)" ("EOS-routines96.html"))
-    ("EOS_SW_COMPINFO" fun nil (system) "Result = %s(swathID, fieldname, compcode, compparm)" ("EOS-routines97.html"))
-    ("EOS_SW_CREATE" fun nil (system) "Result = %s(fid, swathname)" ("EOS-routines98.html"))
-    ("EOS_SW_DEFBOXREGION" fun nil (system) "Result = %s(swathID, cornerlon, cornerlat, mode)" ("EOS-routines99.html"))
-    ("EOS_SW_DEFCOMP" fun nil (system) "Result = %s( swathID, compcode, [, compparm] )" ("EOS-routines100.html"))
-    ("EOS_SW_DEFDATAFIELD" fun nil (system) "Result = %s( swathID, fieldname, dimlist, numbertype)" ("EOS-routines101.html" ("MERGE" . 1017975)))
-    ("EOS_SW_DEFDIM" fun nil (system) "Result = %s(swathID, fieldname, dim)" ("EOS-routines102.html"))
-    ("EOS_SW_DEFDIMMAP" fun nil (system) "Result = %s(swathID, geodim, datadim, offset, increment)" ("EOS-routines103.html"))
-    ("EOS_SW_DEFGEOFIELD" fun nil (system) "Result = %s( swathID, fieldname, dimlist, numbertype)" ("EOS-routines104.html" ("MERGE" . 1022830)))
-    ("EOS_SW_DEFIDXMAP" fun nil (system) "Result = %s(swathID, geodim, datadim, index)" ("EOS-routines105.html"))
-    ("EOS_SW_DEFTIMEPERIOD" fun nil (system) "Result = %s(swathID, starttime , stoptime, mode)" ("EOS-routines106.html"))
-    ("EOS_SW_DEFVRTREGION" fun nil (system) "Result = %s(swathID, regionID, vertObj, range)" ("EOS-routines107.html"))
-    ("EOS_SW_DETACH" fun nil (system) "Result = %s(swathID)" ("EOS-routines108.html"))
-    ("EOS_SW_DIMINFO" fun nil (system) "Result = %s(swathID, dimname)" ("EOS-routines109.html"))
-    ("EOS_SW_DUPREGION" fun nil (system) "Result = %s(regionID)" ("EOS-routines110.html"))
-    ("EOS_SW_EXTRACTPERIOD" fun nil (system) "Result = %s(swathID, periodID, fieldname, external_mode, buffer)" ("EOS-routines111.html"))
-    ("EOS_SW_EXTRACTREGION" fun nil (system) "Result = %s(swathID, regionID, fieldname, external_mode, buffer)" ("EOS-routines112.html"))
-    ("EOS_SW_FIELDINFO" fun nil (system) "Result = %s(swathID, fieldname, rank, dims, numbertype, dimlist)" ("EOS-routines113.html"))
-    ("EOS_SW_GETFILLVALUE" fun nil (system) "Result = %s(swathID, fieldname, fillvalue)" ("EOS-routines114.html"))
-    ("EOS_SW_IDXMAPINFO" fun nil (system) "Result = %s(swathID, geodim, datadim, index)" ("EOS-routines115.html"))
-    ("EOS_SW_INQATTRS" fun nil (system) "Result = %s( swathID, attrlist)" ("EOS-routines116.html" ("LENGTH" . 1018488)))
-    ("EOS_SW_INQDATAFIELDS" fun nil (system) "Result = %s(swathID, fieldlist, rank, numbertype)" ("EOS-routines117.html"))
-    ("EOS_SW_INQDIMS" fun nil (system) "Result = %s(swathID, dimname, dim)" ("EOS-routines118.html"))
-    ("EOS_SW_INQGEOFIELDS" fun nil (system) "Result = %s(swathID, fieldlist, rank, numbertype)" ("EOS-routines119.html"))
-    ("EOS_SW_INQIDXMAPS" fun nil (system) "Result = %s(swathID, idxmap, idxsizes)" ("EOS-routines120.html"))
-    ("EOS_SW_INQMAPS" fun nil (system) "Result = %s(swathID, dimmap, offset, increment)" ("EOS-routines121.html"))
-    ("EOS_SW_INQSWATH" fun nil (system) "Result = %s( filename, swathlist)" ("EOS-routines122.html" ("LENGTH" . 1018674)))
-    ("EOS_SW_MAPINFO" fun nil (system) "Result = %s(swathID, geodim, datadim, offset, increment)" ("EOS-routines123.html"))
-    ("EOS_SW_NENTRIES" fun nil (system) "Result = %s( swathID, entrycode)" ("EOS-routines124.html" ("LENGTH" . 1018745)))
-    ("EOS_SW_OPEN" fun nil (system) "Result = %s( filename)" ("EOS-routines125.html" ("CREATE" . 1018776) ("RDWR" . 1024156) ("READ" . 1024157)))
-    ("EOS_SW_PERIODINFO" fun nil (system) "Result = %s(swathID, periodID, fieldname, ntype, rank, dims, size)" ("EOS-routines126.html"))
-    ("EOS_SW_QUERY" fun nil (system) "Result=%s(Filename, SwathName, [Info])" ("EOS-routines127.html"))
-    ("EOS_SW_READATTR" fun nil (system) "Result = %s(swathID, attrname, datbuf)" ("EOS-routines128.html"))
-    ("EOS_SW_READFIELD" fun nil (system) "Result = %s( swathID, fieldname, buffer)" ("EOS-routines129.html" ("EDGE" . 1018883) ("START" . 1024163) ("STRIDE" . 1024164)))
-    ("EOS_SW_REGIONINFO" fun nil (system) "Result = %s(swathID, regionID, fieldname, ntype, rank, dims, size)" ("EOS-routines130.html"))
-    ("EOS_SW_SETFILLVALUE" fun nil (system) "Result = %s(swathID, fieldname, fillvalue)" ("EOS-routines131.html"))
-    ("EOS_SW_WRITEATTR" fun nil (system) "Result = %s( swathID, attrname, datbuf)" ("EOS-routines132.html" ("COUNT" . 1019002) ("HDF_TYPE" . 1024170)))
-    ("EOS_SW_WRITEDATAMETA" fun nil (system) "Result = %s(swathID, fieldname, dimlist, numbertype)" ("EOS-routines133.html"))
-    ("EOS_SW_WRITEFIELD" fun nil (system) "Result = %s( swathID, fieldname, data)" ("EOS-routines134.html" ("EDGE" . 1026788) ("START" . 1026786) ("STRIDE" . 1025378)))
-    ("EOS_SW_WRITEGEOMETA" fun nil (system) "Result = %s(swathID, fieldname, dimlist, numbertype)" ("EOS-routines135.html"))
-    ("ERF" fun nil (system) "Result = %s(Z)" ("E10.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ERFC" fun nil (system) "Result = %s(Z)" ("E11.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ERFCX" fun nil (system) "Result = %s(Z)" ("E12.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ERODE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" ("E13.html" ("GRAY" . 989437) ("PRESERVE_TYPE" . 989439) ("UINT" . 989441) ("ULONG" . 989443) ("VALUES" . 989445)))
-    ("EXECUTE" fun nil (system) "Result = %s(String [, QuietCompile] [, QuietExecution])" ("E15.html"))
-    ("EXP" fun nil (system) "Result = %s(Expression)" ("E17.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("EXPAND_PATH" fun nil (system) "Result = %s( String)" ("E19.html" ("ALL_DIRS" . 987744) ("ARRAY" . 987739) ("COUNT" . 676819) ("DLM" . 987893) ("HELP" . 987895)))
-    ("EXPINT" fun nil (system) "Result = %s( N, X)" ("E20.html" ("DOUBLE" . 50644) ("EPS" . 997966) ("ITER" . 997968) ("ITMAX" . 997920)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("EXTRAC" fun nil (system) "Result = %s( Array, C1, C2, ..., Cn, S1, S2, ..., Sn )" ("E21.html"))
-    ("EXTRACT_SLICE" fun nil (system) "Result = %s( Vol, Xsize, Ysize, Xcenter, Ycenter, Zcenter, Xrot, Yrot, Zrot)" ("E22.html" ("ANISOTROPY" . 985393) ("OUT_VAL" . 988206) ("RADIANS" . 758834) ("SAMPLE" . 758840) ("VERTICES" . 985402)))
-    ("F_CVF" fun nil (system) "Result = %s(P, Dfn, Dfd)" ("F.html"))
-    ("F_PDF" fun nil (system) "Result = %s(V, Dfn, Dfd)" ("F2.html"))
-    ("FACTORIAL" fun nil (system) "Result = %s( N)" ("F3.html" ("STIRLING" . 54500) ("UL64" . 880257)))
-    ("FFT" fun nil (system) "Result = %s( Array [, Direction])" ("F4.html" ("DIMENSION" . 37862) ("DOUBLE" . 882851) ("INVERSE" . 37868) ("OVERWRITE" . 676843)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FILE_BASENAME" fun nil (system) "Result = %s(Path [, RemoveSuffix])" ("F5.html" ("FOLD_CASE" . 922324)))
-    ("FILE_DIRNAME" fun nil (system) "Result = %s(Path)" ("F9.html" ("MARK_DIRECTORY" . 922462)))
-    ("FILE_EXPAND_PATH" fun nil (system) "Result = %s (Path)" ("F10.html"))
-    ("FILE_INFO" fun nil (system) "Result = %s(Path)" ("F11.html" ("NOEXPAND_PATH" . 883815)))
-    ("FILE_LINES" fun nil (system) "Result = %s(Path)" ("F12.html" ("COMPRESS" . 910561) ("NOEXPAND_PATH" . 910559)))
-    ("FILE_READLINK" fun nil (system) "Result = %s(Path)" ("F16.html" ("ALLOW_NONEXISTENT" . 906651) ("ALLOW_NONSYMLINK" . 906653) ("NOEXPAND_PATH" . 906655)))
-    ("FILE_SAME" fun nil (system) "Result = %s(Path1, Path2)" ("F17.html" ("NOEXPAND_PATH" . 906717)))
-    ("FILE_SEARCH" fun nil (system) "Result = %s(Path_Specification) or Result = %s(Dir_Specification, Recur_Pattern)" ("F18.html" ("COUNT" . 883932) ("EXPAND_ENVIRONMENT" . 883934) ("EXPAND_TILDE" . 883941) ("FOLD_CASE" . 883947) ("FULLY_QUALIFY_PATH" . 883949) ("ISSUE_ACCESS_ERROR" . 883957) ("MARK_DIRECTORY" . 883959) ("MATCH_ALL_INITIAL_DOT" . 883965) ("MATCH_INITIAL_DOT" . 883967) ("NOSORT" . 883969) ("QUOTE" . 883975) ("TEST_BLOCK_SPECIAL" . 900969) ("TEST_CHARACTER_SPECIAL" . 900971) ("TEST_DANGLING_SYMLINK" . 900973) ("TEST_DIRECTORY" . 883984) ("TEST_EXECUTABLE" . 883986) ("TEST_GROUP" . 900983) ("TEST_NAMED_PIPE" . 900993) ("TEST_READ" . 883991) ("TEST_REGULAR" . 883994) ("TEST_SETGID" . 901003) ("TEST_SETUID" . 901005) ("TEST_SOCKET" . 901015) ("TEST_STICKY_BIT" . 901017) ("TEST_SYMLINK" . 901019) ("TEST_USER" . 901021) ("TEST_WRITE" . 883996) ("TEST_ZERO_LENGTH" . 883999) ("WINDOWS_SHORT_NAMES" . 932747)))
-    ("FILE_TEST" fun nil (system) "Result = %s( File)" ("F19.html" ("BLOCK_SPECIAL" . 901098) ("CHARACTER_SPECIAL" . 901108) ("DANGLING_SYMLINK" . 901110) ("DIRECTORY" . 882375) ("EXECUTABLE" . 882377) ("GET_MODE" . 882382) ("GROUP" . 901120) ("NAMED_PIPE" . 901122) ("NOEXPAND_PATH" . 883024) ("READ" . 882391) ("REGULAR" . 882393) ("SETGID" . 901132) ("SETUID" . 901134) ("SOCKET" . 901136) ("STICKY_BIT" . 901143) ("SYMLINK" . 901145) ("USER" . 901152) ("WRITE" . 882395) ("ZERO_LENGTH" . 882397)))
-    ("FILE_WHICH" fun nil (system) "Result = %s( [Path, ] File)" ("F20.html" ("INCLUDE_CURRENT_DIR" . 882459)))
-    ("FILEPATH" fun nil (system) "Result = %s( Filename)" ("F21.html" ("ROOT_DIR" . 762284) ("SUBDIRECTORY" . 762286) ("TERMINAL" . 762290) ("TMP" . 762292)))
-    ("FINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("F22.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FINITE" fun nil (system) "Result = %s( X)" ("F23.html" ("INFINITY" . 862771) ("NAN" . 862772) ("SIGN" . 887616)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FIX" fun nil (system) "Result = %s( Expression [, Offset [, D1 [, ..., D8]]])" ("F24.html" ("PRINT" . 871518) ("TYPE" . 871524)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FLOAT" fun nil (system) "Result = %s( Expression [, Offset [, D1 [, ..., D8]]] )" ("F26.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FLOOR" fun nil (system) "Result = %s(X)" ("F27.html" ("L64" . 875894)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("FLTARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("F29.html" ("NOZERO" . 676947)))
-    ("FORMAT_AXIS_VALUES" fun nil (system) "Result = %s( Values )" ("F32.html"))
-    ("FSTAT" fun nil (system) "Result = %s(Unit)" ("F35.html"))
-    ("FULSTR" fun nil (system) "Result = %s(A)" ("F36.html"))
-    ("FV_TEST" fun nil (system) "Result = %s(X, Y)" ("F39.html"))
-    ("FX_ROOT" fun nil (system) "Result = %s(X, Func)" ("F40.html" ("DOUBLE" . 749893) ("ITMAX" . 749897) ("STOP" . 749899) ("TOL" . 749901)))
-    ("FZ_ROOTS" fun nil (system) "Result = %s(C)" ("F41.html" ("DOUBLE" . 52525) ("EPS" . 902541) ("NO_POLISH" . 902543)))
-    ("GAMMA" fun nil (system) "Result = %s(Z)" ("G.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("GAUSS2DFIT" fun nil (system) "Result = %s( Z, A [, X, Y])" ("G5.html" ("NEGATIVE" . 199709) ("TILT" . 199711)))
-    ("GAUSS_CVF" fun nil (system) "Result = %s(P)" ("G3.html"))
-    ("GAUSS_PDF" fun nil (system) "Result = %s(V)" ("G4.html"))
-    ("GAUSSFIT" fun nil (system) "Result = %s( X, Y [, A])" ("G6.html" ("CHISQ" . 881490) ("ESTIMATES" . 841704) ("MEASURE_ERRORS" . 841712) ("NTERMS" . 889863) ("SIGMA" . 881498) ("YERROR" . 881500)))
-    ("GAUSSINT" fun nil (system) "Result = %s(X)" ("G7.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("GET_DRIVE_LIST" fun nil (system) "Result = %s()" ("G8.html" ("CDROM" . 884482) ("COUNT" . 876351) ("FIXED" . 876358) ("REMOTE" . 878573) ("REMOVABLE" . 878575)))
-    ("GET_KBRD" fun nil (system) "Result = %s(Wait)" ("G9.html"))
-    ("GET_SCREEN_SIZE" fun nil (system) "Result = %s( [Display_name])" ("G11.html" ("DISPLAY_NAME" . 841676) ("RESOLUTION" . 853571)))
-    ("GETENV" fun nil (system) "Result = %s( Name)" ("G12.html" ("ENVIRONMENT" . 887078)))
-    ("GRID3" fun nil (system) "Result = %s( X, Y, Z, F, Gx, Gy, Gz)" ("G16.html" ("DELTA" . 677098) ("DTOL" . 168207) ("GRID" . 677100) ("NGRID" . 677102) ("START" . 677104)))
-    ("GRID_TPS" fun nil (system) "Result = %s (Xp, Yp, Values)" ("G15.html" ("COEFFICIENTS" . 871830) ("DELTA" . 871832) ("NGRID" . 871834) ("START" . 871836)))
-    ("GRIDDATA" fun nil (system) "Result = %s( X, F ) or Result = %s( X, Y, F ) or Result = %s( X, Y, Z, F)" ("G17.html" ("ANISOTROPY" . 877568) ("DEGREES" . 877573) ("DELTA" . 877575) ("DIMENSION" . 877578) ("EMPTY_SECTORS" . 877581) ("FAULT_POLYGONS" . 877584) ("FAULT_XY" . 877588) ("FUNCTION_TYPE" . 877591) ("GRID" . 877652) ("INVERSE_DISTANCE" . 877655) ("KRIGING" . 877657) ("LINEAR" . 877659) ("MAX_PER_SECTOR" . 877661) ("METHOD" . 877664) ("MIN_CURVATURE" . 877713) ("MIN_POINTS" . 877715) ("MISSING" . 877719) ("NATURAL_NEIGHBOR" . 877723) ("NEAREST_NEIGHBOR" . 877726) ("NEIGHBORHOOD" . 877729) ("POLYNOMIAL_REGRESSION" . 877733) ("POWER" . 877749) ("QUINTIC" . 877752) ("RADIAL_BASIS_FUNCTION" . 877755) ("SEARCH_ELLIPSE" . 877757) ("SECTORS" . 877761) ("SHEPARDS" . 877763) ("SMOOTHING" . 877766) ("SPHERE" . 877769) ("START" . 877771) ("TRIANGLES" . 877774) ("VARIOGRAM" . 877778) ("XOUT" . 877781) ("YOUT" . 877784)))
-    ("GS_ITER" fun nil (system) "Result = %s( A, B)" ("G18.html" ("CHECK" . 750095) ("DOUBLE" . 875451) ("LAMBDA" . 750097) ("MAX_ITER" . 750102) ("TOL" . 872926) ("X_0" . 750104)))
-    ("H5_BROWSER" fun nil (system) "Result = %s([Files])" ("H4.html" ("DIALOG_READ" . 885865)))
-    ("H5_GET_LIBVERSION" fun nil (system) "Result = %s( )" ("HDF5-routines11.html"))
-    ("H5_PARSE" fun nil (system) "Result = %s (File)" ("HDF5-routines13.html" ("FILE" . 1148311) ("PATH" . 1148313) ("READ_DATA" . 1148315)))
-    ("H5A_GET_NAME" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines15.html"))
-    ("H5A_GET_NUM_ATTRS" fun nil (system) "Result = %s(Loc_id)" ("HDF5-routines16.html"))
-    ("H5A_GET_SPACE" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines17.html"))
-    ("H5A_GET_TYPE" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines18.html"))
-    ("H5A_OPEN_IDX" fun nil (system) "Result = %s(Loc_id, Index)" ("HDF5-routines19.html"))
-    ("H5A_OPEN_NAME" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines20.html"))
-    ("H5A_READ" fun nil (system) "Result = %s(Attribute_id)" ("HDF5-routines21.html"))
-    ("H5D_GET_SPACE" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines23.html"))
-    ("H5D_GET_STORAGE_SIZE" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines24.html"))
-    ("H5D_GET_TYPE" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines25.html"))
-    ("H5D_OPEN" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines26.html"))
-    ("H5D_READ" fun nil (system) "Result = %s(Dataset_id)" ("HDF5-routines27.html" ("FILE_SPACE" . 1148824) ("MEMORY_SPACE" . 1148826)))
-    ("H5F_IS_HDF5" fun nil (system) "Result = %s(Filename)" ("HDF5-routines29.html"))
-    ("H5F_OPEN" fun nil (system) "Result = %s(Filename)" ("HDF5-routines30.html"))
-    ("H5G_GET_COMMENT" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines32.html"))
-    ("H5G_GET_LINKVAL" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines33.html"))
-    ("H5G_GET_MEMBER_NAME" fun nil (system) "Result = %s(Loc_id, Name, Index)" ("HDF5-routines34.html"))
-    ("H5G_GET_NMEMBERS" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines35.html"))
-    ("H5G_GET_OBJINFO" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines36.html" ("FOLLOW_LINK" . 1149214)))
-    ("H5G_OPEN" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines37.html"))
-    ("H5I_GET_TYPE" fun nil (system) "Result = %s(Obj_id)" ("HDF5-routines38.html"))
-    ("H5R_DEREFERENCE" fun nil (system) "Result = %s(Loc_id, Reference)" ("HDF5-routines39.html"))
-    ("H5R_GET_OBJECT_TYPE" fun nil (system) "Result = %s(Loc_id, Reference)" ("HDF5-routines40.html"))
-    ("H5S_COPY" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines42.html"))
-    ("H5S_CREATE_SIMPLE" fun nil (system) "Result = %s(Dimensions)" ("HDF5-routines43.html" ("MAX_DIMENSIONS" . 1149414)))
-    ("H5S_GET_SELECT_BOUNDS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines44.html"))
-    ("H5S_GET_SELECT_ELEM_NPOINTS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines45.html"))
-    ("H5S_GET_SELECT_ELEM_POINTLIST" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines46.html" ("NUMBER" . 1149508) ("START" . 1149506)))
-    ("H5S_GET_SELECT_HYPER_BLOCKLIST" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines47.html" ("NUMBER" . 1149544) ("START" . 1149542)))
-    ("H5S_GET_SELECT_HYPER_NBLOCKS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines48.html"))
-    ("H5S_GET_SELECT_NPOINTS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines49.html"))
-    ("H5S_GET_SIMPLE_EXTENT_DIMS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines50.html" ("MAX_DIMENSIONS" . 1149642)))
-    ("H5S_GET_SIMPLE_EXTENT_NDIMS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines51.html"))
-    ("H5S_GET_SIMPLE_EXTENT_NPOINTS" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines52.html"))
-    ("H5S_GET_SIMPLE_EXTENT_TYPE" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines53.html"))
-    ("H5S_IS_SIMPLE" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines54.html"))
-    ("H5S_SELECT_VALID" fun nil (system) "Result = %s(Dataspace_id)" ("HDF5-routines60.html"))
-    ("H5T_COMMITTED" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines62.html"))
-    ("H5T_COPY" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines63.html"))
-    ("H5T_EQUAL" fun nil (system) "Result = %s(Datatype_id1, Datatype_id2)" ("HDF5-routines64.html"))
-    ("H5T_GET_ARRAY_DIMS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines65.html" ("PERMUTATIONS" . 1150077)))
-    ("H5T_GET_ARRAY_NDIMS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines66.html"))
-    ("H5T_GET_CLASS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines67.html"))
-    ("H5T_GET_CSET" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines68.html"))
-    ("H5T_GET_EBIAS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines69.html"))
-    ("H5T_GET_FIELDS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines70.html"))
-    ("H5T_GET_INPAD" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines71.html"))
-    ("H5T_GET_MEMBER_CLASS" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines72.html"))
-    ("H5T_GET_MEMBER_NAME" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines73.html"))
-    ("H5T_GET_MEMBER_OFFSET" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines74.html"))
-    ("H5T_GET_MEMBER_TYPE" fun nil (system) "Result = %s(Datatype_id, Member)" ("HDF5-routines75.html"))
-    ("H5T_GET_NMEMBERS" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines76.html"))
-    ("H5T_GET_NORM" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines77.html"))
-    ("H5T_GET_OFFSET" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines78.html"))
-    ("H5T_GET_ORDER" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines79.html"))
-    ("H5T_GET_PAD" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines80.html"))
-    ("H5T_GET_PRECISION" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines81.html"))
-    ("H5T_GET_SIGN" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines82.html"))
-    ("H5T_GET_SIZE" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines83.html"))
-    ("H5T_GET_STRPAD" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines84.html"))
-    ("H5T_GET_SUPER" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines85.html"))
-    ("H5T_IDLTYPE" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines86.html" ("ARRAY_DIMENSIONS" . 1150764) ("STRUCTURE" . 1150766)))
-    ("H5T_MEMTYPE" fun nil (system) "Result = %s(Datatype_id)" ("HDF5-routines87.html"))
-    ("H5T_OPEN" fun nil (system) "Result = %s(Loc_id, Name)" ("HDF5-routines88.html"))
-    ("HANNING" fun nil (system) "Result = %s( N1 [, N2])" ("H5.html" ("ALPHA" . 758100) ("DOUBLE" . 874103)))
-    ("HDF_AN_ANNLEN" fun nil (system) "Result = %s(Annotation_id)" ("HDF-routines8.html"))
-    ("HDF_AN_ANNLIST" fun nil (system) "Result = %s(Annotation_id, Annotation_type, Object_tag, Object_ref, Annotation_list)" ("HDF-routines9.html"))
-    ("HDF_AN_ATYPE2TAG" fun nil (system) "Result = %s(Annotation_type)" ("HDF-routines10.html"))
-    ("HDF_AN_CREATE" fun nil (system) "Result = %s(Annotation_id, Object_tag, Object_ref, Annotation_type)" ("HDF-routines11.html"))
-    ("HDF_AN_CREATEF" fun nil (system) "Result = %s(Annotation_id, Annotation_type)" ("HDF-routines12.html"))
-    ("HDF_AN_FILEINFO" fun nil (system) "Result = %s(Annotation_id, n_file_labels, n_file_descs, n_data_labels, n_data_descs)" ("HDF-routines15.html"))
-    ("HDF_AN_GET_TAGREF" fun nil (system) "Result = %s(Annotation_id, index, Annotation_type, Annotation_tag, Annotation_ref)" ("HDF-routines16.html"))
-    ("HDF_AN_NUMANN" fun nil (system) "Result = %s(Annotation_id, Annotation_type, Object_tag, Object_ref)" ("HDF-routines18.html"))
-    ("HDF_AN_READANN" fun nil (system) "Result = %s( Annotation_id, annotation)" ("HDF-routines19.html" ("LENGTH" . 1056839)))
-    ("HDF_AN_SELECT" fun nil (system) "Result = %s(Annotation_id, index, Annotation_type)" ("HDF-routines20.html"))
-    ("HDF_AN_START" fun nil (system) "Result = %s(file_id)" ("HDF-routines21.html"))
-    ("HDF_AN_WRITEANN" fun nil (system) "Result = %s( Annotation_id, annotation)" ("HDF-routines24.html" ("LENGTH" . 1056941)))
-    ("HDF_ANNOTATION_ID2TAGREF" fun nil (system) "Result = %s(Annotation_id, Annotation_tag, Annotation_ref)" ("HDF-routines17.html"))
-    ("HDF_ANNOTATION_TAG2ATYPE" fun nil (system) "Result = %s(Annotation_tag)" ("HDF-routines22.html"))
-    ("HDF_ANNOTATION_TAGREF2ID" fun nil (system) "Result = %s(Annotation_id, Annotation_tag, Annotation_ref)" ("HDF-routines23.html"))
-    ("HDF_BROWSER" fun nil (system) "Template = %s([Filename])" ("H7.html" ("CANCEL" . 852206) ("GROUP" . 870963) ("PREFIX" . 852209)))
-    ("HDF_DF24_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines30.html"))
-    ("HDF_DF24_NIMAGES" fun nil (system) "Result = %s(Filename)" ("HDF-routines31.html"))
-    ("HDF_DFAN_LABLIST" fun nil (system) "Result = %s( Filename, Tag, Reflist, Labellist)" ("HDF-routines40.html" ("LISTSIZE" . 997374) ("MAXLABEL" . 997377) ("STARTPOS" . 997380) ("STRING" . 997383)))
-    ("HDF_DFAN_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines41.html"))
-    ("HDF_DFP_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines46.html"))
-    ("HDF_DFP_NPALS" fun nil (system) "Result = %s(Filename)" ("HDF-routines47.html"))
-    ("HDF_DFR8_LASTREF" fun nil (system) "Result = %s( )" ("HDF-routines55.html"))
-    ("HDF_DFR8_NIMAGES" fun nil (system) "Result = %s(Filename)" ("HDF-routines56.html"))
-    ("HDF_EXISTS" fun nil (system) "Result = %s( )" ("HDF-routines62.html"))
-    ("HDF_GR_ATTRINFO" fun nil (system) "Result = %s(obj_id, attr_index, name, data_type, count)" ("HDF-routines63.html"))
-    ("HDF_GR_CREATE" fun nil (system) "Result = %s(gr_id, name, ncomp, data_type, interlace_mode, dim_sizes)" ("HDF-routines64.html"))
-    ("HDF_GR_FILEINFO" fun nil (system) "Result = %s(gr_id, n_images, n_file_attrs)" ("HDF-routines67.html"))
-    ("HDF_GR_FINDATTR" fun nil (system) "Result = %s(obj_id, attr_name)" ("HDF-routines68.html"))
-    ("HDF_GR_GETATTR" fun nil (system) "Result = %s(obj_id, attr_index, values)" ("HDF-routines69.html"))
-    ("HDF_GR_GETCHUNKINFO" fun nil (system) "Result = %s(ri_id, dim_length, flag)" ("HDF-routines70.html"))
-    ("HDF_GR_GETIMINFO" fun nil (system) "Result = %s(ri_id, gr_name, ncomp, data_type, interlace_mode, dim_sizes, num_attrs)" ("HDF-routines71.html"))
-    ("HDF_GR_GETLUTID" fun nil (system) "Result = %s(ri_id, pal_index)" ("HDF-routines72.html"))
-    ("HDF_GR_GETLUTINFO" fun nil (system) "Result = %s(pal_id, ncomp, data_type, interlace_mode, num_entries)" ("HDF-routines73.html"))
-    ("HDF_GR_IDTOREF" fun nil (system) "Result = %s(ri_id)" ("HDF-routines74.html"))
-    ("HDF_GR_LUTTOREF" fun nil (system) "Result = %s(pal_id)" ("HDF-routines75.html"))
-    ("HDF_GR_NAMETOINDEX" fun nil (system) "Result = %s(gr_id, gr_name)" ("HDF-routines76.html"))
-    ("HDF_GR_READIMAGE" fun nil (system) "Result = %s( ri_id, data)" ("HDF-routines77.html" ("EDGE" . 1057619) ("INTERLACE" . 1057617) ("START" . 1057607) ("STRIDE" . 1057609)))
-    ("HDF_GR_READLUT" fun nil (system) "Result = %s( pal_id, pal_data)" ("HDF-routines78.html" ("INTERLACE" . 1057387)))
-    ("HDF_GR_REFTOINDEX" fun nil (system) "Result = %s(gr_id, gr_ref)" ("HDF-routines79.html"))
-    ("HDF_GR_SELECT" fun nil (system) "Result = %s(gr_id, index)" ("HDF-routines80.html"))
-    ("HDF_GR_SETATTR" fun nil (system) "Result = %s(obj_id, attr_name, data_type, count, values)" ("HDF-routines81.html"))
-    ("HDF_GR_SETCHUNK" fun nil (system) "Result = %s(ri_id, dim_length, comp_type, comp_prm)" ("HDF-routines82.html"))
-    ("HDF_GR_SETCHUNKCACHE" fun nil (system) "Result = %s(ri_id, maxcache, flags)" ("HDF-routines83.html"))
-    ("HDF_GR_SETCOMPRESS" fun nil (system) "Result = %s(ri_id, comp_type, comp_prm)" ("HDF-routines84.html"))
-    ("HDF_GR_SETEXTERNALFILE" fun nil (system) "Result = %s(ri_id, filename, offset)" ("HDF-routines85.html"))
-    ("HDF_GR_START" fun nil (system) "Result = %s(file_id)" ("HDF-routines86.html"))
-    ("HDF_GR_WRITEIMAGE" fun nil (system) "Result = %s( ri_id, data)" ("HDF-routines87.html" ("EDGE" . 1057693) ("INTERLACE" . 1057699) ("START" . 1057691) ("STRIDE" . 1057681)))
-    ("HDF_GR_WRITELUT" fun nil (system) "Result = %s( pal_id, pal_data )" ("HDF-routines88.html"))
-    ("HDF_HDF2IDLTYPE" fun nil (system) "Result = %s( hdftypecode )" ("HDF-routines89.html"))
-    ("HDF_IDL2HDFTYPE" fun nil (system) "Result = %s( idltypecode )" ("HDF-routines90.html"))
-    ("HDF_ISHDF" fun nil (system) "Result = %s(Filename)" ("HDF-routines91.html"))
-    ("HDF_NEWREF" fun nil (system) "Result = %s(FileHandle)" ("HDF-routines93.html"))
-    ("HDF_NUMBER" fun nil (system) "Result = %s( FileHandle)" ("HDF-routines94.html" ("TAG" . 998362)))
-    ("HDF_OPEN" fun nil (system) "Result = %s( Filename)" ("HDF-routines95.html" ("ALL" . 998379) ("CREATE" . 998383) ("NUM_DD" . 998386) ("RDWR" . 998390) ("READ" . 998394) ("WRITE" . 998397)))
-    ("HDF_PACKDATA" fun nil (system) "Result = %s( data1 [, data2 [, data3 [, data4 [, data5 [, data6 [, data7 [, data8]]]]]]])" ("HDF-routines96.html" ("HDF_ORDER" . 1042936) ("HDF_TYPE" . 1042939) ("NREC" . 1042942)))
-    ("HDF_READ" fun nil (system) "Result = %s( [Filename])" ("H8.html" ("DF24" . 852278) ("DFR8" . 852275) ("PREFIX" . 871657) ("TEMPLATE" . 852281)))
-    ("HDF_SD_ATTRFIND" fun nil (system) "Result = %s(SD_id, Name)" ("HDF-routines98.html"))
-    ("HDF_SD_CREATE" fun nil (system) "Result = %s( SDinterface_id, Name, Dims)" ("HDF-routines101.html" ("BYTE" . 1053869) ("DFNT_CHAR88" . 1053872) ("DFNT_FLOAT32" . 1053875) ("DFNT_FLOAT64" . 1053878) ("DFNT_INT16" . 1053884) ("DFNT_INT32" . 1053887) ("DFNT_INT8" . 1053881) ("DFNT_UINT16" . 1053893) ("DFNT_UINT32" . 1053896) ("DFNT_UINT8" . 1053890) ("DOUBLE" . 1053899) ("FLOAT" . 1053902) ("HDF_TYPE" . 1106175) ("INT" . 1106171) ("LONG" . 1053908) ("SHORT" . 1053911) ("STRING" . 1053914)))
-    ("HDF_SD_DIMGETID" fun nil (system) "Result = %s(SDdataset_id, Dimension_Number)" ("HDF-routines103.html"))
-    ("HDF_SD_ISCOORDVAR" fun nil (system) "Result = %s(SDdataset_id)" ("HDF-routines111.html"))
-    ("HDF_SD_NAMETOINDEX" fun nil (system) "Result = %s(SDinterface_id, SDS_Name)" ("HDF-routines112.html"))
-    ("HDF_SD_REFTOINDEX" fun nil (system) "Result = %s(SDinterface_id, Reference_number)" ("HDF-routines113.html"))
-    ("HDF_SD_SELECT" fun nil (system) "Result = %s(SDinterface_id, Number)" ("HDF-routines114.html"))
-    ("HDF_SD_START" fun nil (system) "Result = %s( Filename)" ("HDF-routines118.html" ("CREATE" . 1054663) ("RDWR" . 1054661) ("READ" . 1054659)))
-    ("HDF_SDINTERFACE_IDTOREF" fun nil (system) "Result = %s(SDdataset_id)" ("HDF-routines110.html"))
-    ("HDF_VD_ATTACH" fun nil (system) "Result = %s( FileHandle, VData_id)" ("HDF-routines120.html" ("READ" . 999503) ("WRITE" . 999506)))
-    ("HDF_VD_ATTRFIND" fun nil (system) "Result = %s(VData, FieldID, Name)" ("HDF-routines121.html"))
-    ("HDF_VD_FEXIST" fun nil (system) "Result = %s(VData, Fieldnames)" ("HDF-routines126.html"))
-    ("HDF_VD_FIND" fun nil (system) "Result = %s(FileHandle, Name)" ("HDF-routines127.html"))
-    ("HDF_VD_GETID" fun nil (system) "Result = %s(FileHandle, VData_id)" ("HDF-routines129.html"))
-    ("HDF_VD_ISATTR" fun nil (system) "Result = %s(VData)" ("HDF-routines132.html"))
-    ("HDF_VD_ISVD" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines133.html"))
-    ("HDF_VD_LONE" fun nil (system) "Result = %s( FileHandle)" ("HDF-routines135.html" ("MAXSIZE" . 999761)))
-    ("HDF_VD_NATTRS" fun nil (system) "Result = %s( VData, FieldID )" ("HDF-routines136.html"))
-    ("HDF_VD_READ" fun nil (system) "Result = %s( VData, Data)" ("HDF-routines137.html" ("FIELDS" . 999788) ("FULL_INTERLACE" . 999791) ("NO_INTERLACE" . 999794) ("NRECORDS" . 999797)))
-    ("HDF_VG_ATTACH" fun nil (system) "Result = %s( FileHandle, VGroup_id)" ("HDF-routines142.html" ("READ" . 999942) ("WRITE" . 999945)))
-    ("HDF_VG_GETID" fun nil (system) "Result = %s(FileHandle, VGroup_id)" ("HDF-routines144.html"))
-    ("HDF_VG_GETNEXT" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines146.html"))
-    ("HDF_VG_INQTR" fun nil (system) "Result = %s(VGroup, Tag, Ref)" ("HDF-routines149.html"))
-    ("HDF_VG_ISVD" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines151.html"))
-    ("HDF_VG_ISVG" fun nil (system) "Result = %s(VGroup, Id)" ("HDF-routines152.html"))
-    ("HDF_VG_LONE" fun nil (system) "Result = %s( FileHandle)" ("HDF-routines153.html" ("MAXSIZE" . 1000150)))
-    ("HDF_VG_NUMBER" fun nil (system) "Result = %s(VGroup)" ("HDF-routines154.html"))
-    ("HILBERT" fun nil (system) "Result = %s(X [, D])" ("H12.html"))
-    ("HIST_2D" fun nil (system) "Result = %s( V1, V2)" ("H13.html" ("BIN1" . 832830) ("BIN2" . 832832) ("MAX1" . 832284) ("MAX2" . 832345) ("MIN1" . 832837) ("MIN2" . 832839)))
-    ("HIST_EQUAL" fun nil (system) "Result = %s( A)" ("H14.html" ("BINSIZE" . 871698) ("FCN" . 876498) ("HISTOGRAM_ONLY" . 874403) ("MAXV" . 874687) ("MINV" . 758160) ("OMAX" . 875087) ("OMIN" . 875100) ("PERCENT" . 874600) ("TOP" . 874602)))
-    ("HISTOGRAM" fun nil (system) "Result = %s( Array)" ("H15.html" ("BINSIZE" . 677175) ("INPUT" . 677177) ("L64" . 677180) ("LOCATIONS" . 886107) ("MAX" . 886113) ("MIN" . 677182) ("NAN" . 197674) ("NBINS" . 677184) ("OMAX" . 873903) ("OMIN" . 677186) ("REVERSE_INDICES" . 677188)))
-    ("HOUGH" fun nil (system) "Result = %s( Array)" ("H17.html" ("BACKPROJECT" . 875957) ("DOUBLE" . 875960) ("DRHO" . 875962) ("DX" . 875964) ("DY" . 875966) ("GRAY" . 875968) ("NRHO" . 875970) ("NTHETA" . 875972) ("NX" . 875974) ("NY" . 875976) ("RHO" . 875978) ("RMIN" . 875980) ("THETA" . 875982) ("XMIN" . 875984) ("YMIN" . 875986)))
-    ("HQR" fun nil (system) "Result = %s( A)" ("H18.html" ("COLUMN" . 871729) ("DOUBLE" . 50748)))
-    ("IBETA" fun nil (system) "Result = %s( A, B, Z)" ("I.html" ("DOUBLE" . 875616) ("EPS" . 875618) ("ITER" . 875967) ("ITMAX" . 875622)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("IDENTITY" fun nil (system) "Result = %s( N)" ("I3.html" ("DOUBLE" . 832664)))
-    ("IDL_VALIDNAME" fun nil (system) "Result = %s(String)" ("I4.html" ("CONVERT_ALL" . 937159) ("CONVERT_SPACES" . 937166)))
-    ("IDLITSYS_CREATETOOL" fun nil (system) "Result = %s(StrTool)" ("I5.html" ("DIMENSIONS" . 984612) ("IDENTIFIER" . 984573) ("INITIAL_DATA" . 939956) ("LOCATION" . 984462) ("MACRO_NAMES" . 964508) ("NO_SAVEPROMPT" . 982826) ("OVERPLOT" . 939958) ("STYLE_NAME" . 984522) ("USER_INTERFACE" . 983497) ("VIEW_GRID" . 939979) ("VIEW_NEXT" . 939981) ("VIEW_NUMBER" . 939984) ("VISUALIZATION_TYPE" . 939987)))
-    ("IGAMMA" fun nil (system) "Result = %s( A, Z)" ("I7.html" ("DOUBLE" . 875550) ("EPS" . 875548) ("ITER" . 875581) ("ITMAX" . 875579) ("METHOD" . 875520)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("IMAGINARY" fun nil (system) "Result = %s(Complex_Expression)" ("I11.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("INDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("I13.html" ("BYTE" . 862684) ("COMPLEX" . 862699) ("DCOMPLEX" . 862701) ("DOUBLE" . 862705) ("FLOAT" . 862707) ("L64" . 862711) ("LONG" . 862927) ("STRING" . 862930) ("TYPE" . 862752) ("UINT" . 862746) ("UL64" . 862748) ("ULONG" . 862750)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("INT_2D" fun nil (system) "Result = %s( Fxy, AB_Limits, PQ_Limits, Pts)" ("I14.html" ("DOUBLE" . 832191) ("ORDER" . 813280)))
-    ("INT_3D" fun nil (system) "Result = %s( Fxyz, AB_Limits, PQ_Limits, UV_Limits, Pts)" ("I15.html" ("DOUBLE" . 813293)))
-    ("INT_TABULATED" fun nil (system) "Result = %s( X, F)" ("I16.html" ("DOUBLE" . 875649) ("SORT" . 750310)))
-    ("INTARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("I17.html" ("NOZERO" . 677253)))
-    ("INTERPOL" fun nil (system) "Result = %s( V, N)" ("I18.html" ("LSQUADRATIC" . 872067) ("QUADRATIC" . 872072) ("SPLINE" . 872076)))
-    ("INTERPOLATE" fun nil (system) "Result = %s( P, X [, Y [, Z]])" ("I19.html" ("CUBIC" . 680782) ("GRID" . 680781) ("MISSING" . 677276)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("INVERT" fun nil (system) "Result = %s( Array [, Status])" ("I21.html" ("DOUBLE" . 50809)))
-    ("IOCTL" fun nil (system) "Result = %s( File_Unit [, Request, Arg])" ("I22.html" ("BY_VALUE" . 677325) ("MT_OFFLINE" . 677327) ("MT_REWIND" . 677329) ("MT_SKIP_FILE" . 677331) ("MT_SKIP_RECORD" . 677333) ("MT_WEOF" . 677335) ("SUPPRESS_ERROR" . 677337)))
-    ("ISHFT" fun nil (system) "Result = %s(P1, P2)" ("I24.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ITGETCURRENT" fun nil (system) "Result = %s()" ("I30.html" ("TOOL" . 941481)))
-    ("JULDAY" fun nil (system) "Result = %s(Month, Day, Year, Hour, Minute, Second)" ("J2.html"))
-    ("KEYWORD_SET" fun nil (system) "Result = %s(Expression)" ("K.html"))
-    ("KRIG2D" fun nil (system) "Result = %s( Z [, X, Y])" ("K2.html" ("BOUNDS" . 750620) ("EXPONENTIAL" . 750596) ("GS" . 930292) ("NX" . 750622) ("NY" . 750624) ("REGULAR" . 750607) ("SPHERICAL" . 750598) ("XGRID" . 750609) ("XVALUES" . 750611) ("YGRID" . 750613) ("YVALUES" . 750615)))
-    ("KURTOSIS" fun nil (system) "Result = %s(X)" ("K3.html" ("DOUBLE" . 859078) ("NAN" . 860892)))
-    ("KW_TEST" fun nil (system) "Result = %s( X)" ("K4.html" ("DF" . 53675) ("MISSING" . 53678)))
-    ("L64INDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("L.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LA_CHOLMPROVE" fun nil (system) "Result = %s( Array, Achol, B, X)" ("L3.html" ("BACKWARD_ERROR" . 969194) ("DOUBLE" . 969196) ("FORWARD_ERROR" . 969198) ("UPPER" . 969200)))
-    ("LA_CHOLSOL" fun nil (system) "Result = %s( A, B)" ("L4.html" ("DOUBLE" . 969317) ("UPPER" . 969319)))
-    ("LA_DETERM" fun nil (system) "Result = %s( A)" ("L5.html" ("CHECK" . 969400) ("DOUBLE" . 969402) ("ZERO" . 969404)))
-    ("LA_EIGENPROBLEM" fun nil (system) "Result = %s( A [, B])" ("L6.html" ("ALPHA" . 969502) ("BALANCE" . 969505) ("BETA" . 969512) ("DOUBLE" . 969515) ("EIGENVECTORS" . 969517) ("LEFT_EIGENVECTORS" . 969520) ("NORM_BALANCE" . 969523) ("PERMUTE_RESULT" . 969525) ("RCOND_VALUE" . 969527) ("RCOND_VECTOR" . 969529) ("SCALE_RESULT" . 969531) ("STATUS" . 969533)))
-    ("LA_EIGENQL" fun nil (system) "Result = %s( A [, B])" ("L7.html" ("DOUBLE" . 969688) ("EIGENVECTORS" . 969690) ("FAILED" . 969692) ("GENERALIZED" . 969695) ("METHOD" . 969701) ("RANGE" . 969707) ("SEARCH_RANGE" . 969709) ("STATUS" . 969712) ("TOLERANCE" . 969723)))
-    ("LA_EIGENVEC" fun nil (system) "Result = %s( T, QZ)" ("L8.html" ("BALANCE" . 969898) ("DOUBLE" . 969901) ("EIGENINDEX" . 969903) ("LEFT_EIGENVECTORS" . 969906) ("PERMUTE_RESULT" . 969908) ("RCOND_VALUE" . 969910) ("RCOND_VECTOR" . 969912) ("SCALE_RESULT" . 969914) ("SELECT" . 969916)))
-    ("LA_ELMHES" fun nil (system) "Result = %s( Array [, Q])" ("L9.html" ("BALANCE" . 970060) ("DOUBLE" . 970067) ("NORM_BALANCE" . 970069) ("PERMUTE_RESULT" . 970071) ("SCALE_RESULT" . 970073)))
-    ("LA_GM_LINEAR_MODEL" fun nil (system) "Result = %s( A, B, D, Y)" ("L10.html" ("DOUBLE" . 970161)))
-    ("LA_HQR" fun nil (system) "Result = %s(H [, Q])" ("L11.html" ("DOUBLE" . 970266) ("PERMUTE_RESULT" . 970268) ("STATUS" . 970270)))
-    ("LA_INVERT" fun nil (system) "Result = %s( A)" ("L12.html" ("DOUBLE" . 970351) ("STATUS" . 970353)))
-    ("LA_LEAST_SQUARE_EQUALITY" fun nil (system) "Result = %s( A, B, C, D)" ("L13.html" ("DOUBLE" . 970448) ("RESIDUAL" . 970450)))
-    ("LA_LEAST_SQUARES" fun nil (system) "Result = %s( A, B)" ("L14.html" ("DOUBLE" . 970563) ("METHOD" . 970565) ("RANK" . 970571) ("RCONDITION" . 970573) ("RESIDUAL" . 970575) ("STATUS" . 970577)))
-    ("LA_LINEAR_EQUATION" fun nil (system) "Result = %s( Array, B)" ("L15.html" ("BACKWARD_ERROR" . 970657) ("DOUBLE" . 970659) ("FORWARD_ERROR" . 970661) ("STATUS" . 970663)))
-    ("LA_LUMPROVE" fun nil (system) "Result = %s( Array, Aludc, Index, B, X)" ("L17.html" ("BACKWARD_ERROR" . 970892) ("DOUBLE" . 970894) ("FORWARD_ERROR" . 970896)))
-    ("LA_LUSOL" fun nil (system) "Result = %s( A, Index, B)" ("L18.html" ("DOUBLE" . 971007)))
-    ("LA_TRIMPROVE" fun nil (system) "Result = %s( AL, A, AU, DAL, DA, DAU, DU2, Index, B, X)" ("L21.html" ("BACKWARD_ERROR" . 971423) ("DOUBLE" . 971425) ("FORWARD_ERROR" . 971427)))
-    ("LA_TRISOL" fun nil (system) "Result = %s( AL, A, AU, U2, Index, B)" ("L24.html" ("DOUBLE" . 971725)))
-    ("LABEL_DATE" fun nil (system) "Result = %s()" ("L25.html" ("AM_PM" . 939222) ("DATE_FORMAT" . 939215) ("DAYS_OF_WEEK" . 939285) ("MONTHS" . 939288) ("OFFSET" . 939291) ("ROUND_UP" . 940951)))
-    ("LABEL_REGION" fun nil (system) "Result = %s( Data)" ("L26.html" ("ALL_NEIGHBORS" . 930484) ("EIGHT" . 828027) ("ULONG" . 677395)))
-    ("LADFIT" fun nil (system) "Result = %s( X, Y)" ("L27.html" ("ABSDEV" . 53730) ("DOUBLE" . 837069)))
-    ("LAGUERRE" fun nil (system) "Result = %s( X, N [, K])" ("L28.html" ("COEFFICIENTS" . 942495) ("DOUBLE" . 942497)))
-    ("LEEFILT" fun nil (system) "Result = %s( A [, N [, Sig]])" ("L29.html" ("DOUBLE" . 939800) ("EXACT" . 833703)))
-    ("LEGENDRE" fun nil (system) "Result = %s( X, L [, M])" ("L30.html" ("DOUBLE" . 942590)))
-    ("LINBCG" fun nil (system) "Result = %s( A, B, X)" ("L31.html" ("DOUBLE" . 50883) ("ITER" . 50896) ("ITMAX" . 50899) ("ITOL" . 50886) ("TOL" . 50893)))
-    ("LINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("L32.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LINFIT" fun nil (system) "Result = %s( X, Y)" ("L33.html" ("CHISQ" . 53778) ("COVAR" . 940616) ("DOUBLE" . 837073) ("MEASURE_ERRORS" . 53781) ("PROB" . 941301) ("SDEV" . 941420) ("SIGMA" . 941423) ("YFIT" . 941298)))
-    ("LL_ARC_DISTANCE" fun nil (system) "Result = %s( Lon_lat0, Arc_Dist, Az)" ("L35.html" ("DEGREES" . 758227)))
-    ("LMFIT" fun nil (system) "Result = %s( X, Y, A)" ("L36.html" ("ALPHA" . 849263) ("CHISQ" . 831462) ("CONVERGENCE" . 831464) ("COVAR" . 831689) ("DOUBLE" . 831466) ("FITA" . 831077) ("FUNCTION_NAME" . 831083) ("ITER" . 831471) ("ITMAX" . 831092) ("ITMIN" . 831094) ("MEASURE_ERRORS" . 941497) ("SIGMA" . 940586) ("TOL" . 940573) ("WEIGHTS" . 940578)))
-    ("LMGR" fun nil (system) "Result = %s()" ("L37.html" ("CLIENTSERVER" . 879327) ("DEMO" . 856060) ("EMBEDDED" . 856064) ("EXPIRE_DATE" . 932522) ("FORCE_DEMO" . 856072) ("INSTALL_NUM" . 932505) ("LMHOSTID" . 856081) ("RUNTIME" . 856085) ("SITE_NOTICE" . 932539) ("STUDENT" . 856089) ("TRIAL" . 856094) ("VM" . 996553)))
-    ("LNGAMMA" fun nil (system) "Result = %s(Z)" ("L38.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LNP_TEST" fun nil (system) "Result = %s( X, Y)" ("L39.html" ("DOUBLE" . 54544) ("HIFAC" . 941916) ("JMAX" . 54547) ("OFAC" . 54550) ("WK1" . 54553) ("WK2" . 54556)))
-    ("LOCALE_GET" fun nil (system) "Result = %s( )" ("L41.html"))
-    ("LOGICAL_AND" fun nil (system) "Result = %s(Arg1, Arg2)" ("L42.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LOGICAL_OR" fun nil (system) "Result = %s(Arg1, Arg2)" ("L43.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LOGICAL_TRUE" fun nil (system) "Result = %s(Arg)" ("L44.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LON64ARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("L45.html" ("NOZERO" . 918880)))
-    ("LONARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("L46.html" ("NOZERO" . 916558)))
-    ("LONG" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("L47.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LONG64" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("L48.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("LSODE" fun nil (system) "Result = %s( Y, X, H, Derivs[, Status])" ("L49.html" ("ATOL" . 904984) ("QUIET" . 1014877) ("RTOL" . 905036)))
-    ("LU_COMPLEX" fun nil (system) "Result = %s( A, B)" ("L50.html" ("DOUBLE" . 750791) ("INVERSE" . 48859) ("SPARSE" . 37275)))
-    ("LUMPROVE" fun nil (system) "Result = %s( A, Alud, Index, B, X)" ("L52.html" ("COLUMN" . 58736) ("DOUBLE" . 51323)))
-    ("LUSOL" fun nil (system) "Result = %s(A, Index, B)" ("L53.html" ("COLUMN" . 58727) ("DOUBLE" . 50997)))
-    ("M_CORRELATE" fun nil (system) "Result = %s( X, Y)" ("M.html" ("DOUBLE" . 956112)))
-    ("MACHAR" fun nil (system) "Result = %s()" ("M2.html" ("DOUBLE" . 928847)))
-    ("MAKE_ARRAY" fun nil (system) "Result = %s ( [D1 [, ..., D8]])" ("M3.html" ("BYTE" . 887432) ("COMPLEX" . 887435) ("DCOMPLEX" . 887438) ("DIMENSION" . 887441) ("DOUBLE" . 887444) ("FLOAT" . 887447) ("INDEX" . 887450) ("INTEGER" . 887453) ("L64" . 916074) ("LONG" . 887456) ("NOZERO" . 887459) ("OBJ" . 887462) ("PTR" . 887465) ("SIZE" . 887468) ("STRING" . 887471) ("TYPE" . 887474) ("UINT" . 918501) ("UL64" . 918504) ("ULONG" . 916082) ("VALUE" . 887480)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MAP_2POINTS" fun nil (system) "Result = %s( lon0, lat0, lon1, lat1)" ("M5.html" ("DPATH" . 960572) ("METERS" . 960574) ("MILES" . 960576) ("NPATH" . 960578) ("PARAMETERS" . 960581) ("RADIANS" . 960583) ("RADIUS" . 960585) ("RHUMB" . 960587)))
-    ("MAP_IMAGE" fun nil (system) "Result = %s( Image [, Startx, Starty [, Xsize, Ysize]])" ("M8.html" ("BILINEAR" . 903532) ("COMPRESS" . 887760) ("LATMAX" . 887748) ("LATMIN" . 887745) ("LONMAX" . 887754) ("LONMIN" . 887751) ("MAP_STRUCTURE" . 1060029) ("MASK" . 1061279) ("MAX_VALUE" . 887766) ("MIN_VALUE" . 887770) ("MISSING" . 887774) ("SCALE" . 887763)))
-    ("MAP_PATCH" fun nil (system) "Result = %s( Image_Orig [, Lons, Lats])" ("M9.html" ("LAT0" . 958167) ("LAT1" . 887838) ("LON0" . 887841) ("LON1" . 887844) ("MAX_VALUE" . 928019) ("MISSING" . 887847) ("TRIANGULATE" . 887853) ("XSIZE" . 887856) ("XSTART" . 887859) ("YSIZE" . 887862) ("YSTART" . 887865)))
-    ("MAP_PROJ_FORWARD" fun nil (system) "Result = %s(Longitude [, Latitude])" ("M10.html" ("CONNECTIVITY" . 999199) ("FILL" . 999209) ("MAP_STRUCTURE" . 1059849) ("POLYGONS" . 999214) ("POLYLINES" . 999218) ("RADIANS" . 999222)))
-    ("MAP_PROJ_IMAGE" fun nil (system) "Result = %s(Image [, Range])" ("M11.html" ("BILINEAR" . 1062551) ("DIMENSIONS" . 1062553) ("IMAGE_STRUCTURE" . 1062555) ("MAP_STRUCTURE" . 1062557) ("MASK" . 1062562) ("MAX_VALUE" . 1062565) ("MIN_VALUE" . 1062567) ("MISSING" . 1062569) ("UVRANGE" . 1062571)))
-    ("MAP_PROJ_INIT" fun nil (system) "Result = %s(Projection)" ("M13.html" ("CENTER_AZIMUTH" . 999986) ("CENTER_LATITUDE" . 999988) ("CENTER_LONGITUDE" . 999990) ("DATUM" . 999770) ("FALSE_EASTING" . 999992) ("FALSE_NORTHING" . 999994) ("GCTP" . 999952) ("HEIGHT" . 999996) ("HOM_AZIM_ANGLE" . 1000000) ("HOM_AZIM_LONGITUDE" . 999998) ("HOM_LATITUDE1" . 1000002) ("HOM_LATITUDE2" . 1000004) ("HOM_LONGITUDE1" . 1000006) ("HOM_LONGITUDE2" . 1000008) ("IS_JUSTIFY" . 1000012) ("IS_ZONES" . 1000010) ("LIMIT" . 999954) ("MERCATOR_SCALE" . 1000036) ("OEA_ANGLE" . 1000038) ("OEA_SHAPEM" . 1000040) ("OEA_SHAPEN" . 1000042) ("RADIANS" . 999959) ("RELAXED" . 999961) ("ROTATION" . 1000045) ("SAT_TILT" . 1000074) ("SEMIMAJOR_AXIS" . 1000048) ("SEMIMINOR_AXIS" . 1000050) ("SOM_FLAG" . 1000060) ("SOM_INCLINATION" . 1000052) ("SOM_LANDSAT_NUMBER" . 1000062) ("SOM_LANDSAT_PATH" . 1000064) ("SOM_LONGITUDE" . 1000054) ("SOM_PERIOD" . 1000056) ("SOM_RATIO" . 1000058) ("SPHERE_RADIUS" . 1000066) ("STANDARD_PAR1" . 1000070) ("STANDARD_PAR2" . 1000072) ("STANDARD_PARALLEL" . 1000068) ("TRUE_SCALE_LATITUDE" . 1000076) ("ZONE" . 1000078)))
-    ("MAP_PROJ_INVERSE" fun nil (system) "Result = %s (X [, Y])" ("M14.html" ("MAP_STRUCTURE" . 1000165) ("RADIANS" . 1000170)))
-    ("MATRIX_MULTIPLY" fun nil (system) "Result = %s( A, B)" ("M16.html" ("ATRANSPOSE" . 960661) ("BTRANSPOSE" . 960663)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MATRIX_POWER" fun nil (system) "Result = %s(Array, N)" ("M17.html" ("DOUBLE" . 1000204) ("STATUS" . 1000207)))
-    ("MAX" fun nil (system) "Result = %s( Array [, Max_Subscript])" ("M18.html" ("ABSOLUTE" . 1047888) ("DIMENSION" . 888204) ("MIN" . 963501) ("NAN" . 888207) ("SUBSCRIPT_MIN" . 929038)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MD_TEST" fun nil (system) "Result = %s( X)" ("M19.html" ("ABOVE" . 888251) ("BELOW" . 888254) ("MDC" . 888257)))
-    ("MEAN" fun nil (system) "Result = %s( X)" ("M20.html" ("DOUBLE" . 888313) ("NAN" . 888316)))
-    ("MEANABSDEV" fun nil (system) "Result = %s( X)" ("M21.html" ("DOUBLE" . 888362) ("MEDIAN" . 888365) ("NAN" . 888368)))
-    ("MEDIAN" fun nil (system) "Result = %s ( Array [, Width])" ("M22.html" ("DIMENSION" . 978207) ("DOUBLE" . 1047845) ("EVEN" . 978204)))
-    ("MEMORY" fun nil (system) "Result = %s()" ("M23.html" ("CURRENT" . 960747) ("HIGHWATER" . 960749) ("L64" . 960751) ("NUM_ALLOC" . 960754) ("NUM_FREE" . 960756) ("STRUCTURE" . 960758)))
-    ("MESH_CLIP" fun nil (system) "Result = %s (Plane, Vertsin, Connin, Vertsout, Connout)" ("M24.html" ("AUXDATA_IN" . 948402) ("AUXDATA_OUT" . 948404) ("CUT_VERTS" . 948406)))
-    ("MESH_DECIMATE" fun nil (system) "Result = %s (Verts, Conn, Connout)" ("M25.html" ("PERCENT_POLYGONS" . 948433) ("PERCENT_VERTICES" . 948431) ("PROGRESS_CALLBACK" . 1051741) ("PROGRESS_METHOD" . 1020618) ("PROGRESS_OBJECT" . 1020641) ("PROGRESS_PERCENT" . 1020654) ("PROGRESS_USERDATA" . 1020660) ("VERTICES" . 1020667)))
-    ("MESH_ISSOLID" fun nil (system) "Result = %s (Conn)" ("M26.html"))
-    ("MESH_MERGE" fun nil (system) "Result = %s (Verts, Conn, Verts1, Conn1)" ("M27.html" ("COMBINE_VERTICES" . 948474) ("TOLERANCE" . 948480)))
-    ("MESH_NUMTRIANGLES" fun nil (system) "Result = %s (Conn)" ("M28.html"))
-    ("MESH_SMOOTH" fun nil (system) "Result = %s (Verts, Conn)" ("M30.html" ("FIXED_EDGE_VERTICES" . 948537) ("FIXED_VERTICES" . 948535) ("ITERATIONS" . 948533) ("LAMBDA" . 948539)))
-    ("MESH_SURFACEAREA" fun nil (system) "Result = %s ( Verts, Conn)" ("M31.html" ("AUXDATA" . 948575) ("MOMENT" . 948577)))
-    ("MESH_VALIDATE" fun nil (system) "Result = %s ( Verts, Conn)" ("M32.html" ("COMBINE_VERTICES" . 948607) ("PACK_VERTICES" . 949513) ("REMOVE_NAN" . 948611) ("TOLERANCE" . 948613)))
-    ("MESH_VOLUME" fun nil (system) "Result = %s ( Verts, Conn)" ("M33.html" ("SIGNED" . 948632)))
-    ("MIN" fun nil (system) "Result = %s( Array [, Min_Subscript])" ("M35.html" ("ABSOLUTE" . 1047943) ("DIMENSION" . 965599) ("MAX" . 963567) ("NAN" . 888740) ("SUBSCRIPT_MAX" . 965815)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("MIN_CURVE_SURF" fun nil (system) "Result = %s(Z [, X, Y])" ("M36.html" ("BOUNDS" . 888798) ("CONST" . 956696) ("DOUBLE" . 929725) ("GS" . 888796) ("NX" . 888800) ("NY" . 888802) ("REGULAR" . 888785) ("SPHERE" . 956689) ("TPS" . 888782) ("XGRID" . 888787) ("XOUT" . 888804) ("XPOUT" . 888808) ("XVALUES" . 888789) ("YGRID" . 888791) ("YOUT" . 888806) ("YPOUT" . 888808) ("YVALUES" . 888793)))
-    ("MOMENT" fun nil (system) "Result = %s( X)" ("M39.html" ("DOUBLE" . 888958) ("MDEV" . 888961) ("NAN" . 888964) ("SDEV" . 888970)))
-    ("MORPH_CLOSE" fun nil (system) "Result = %s (Image, Structure)" ("M40.html" ("GRAY" . 948649) ("PRESERVE_TYPE" . 948651) ("UINT" . 948653) ("ULONG" . 948655) ("VALUES" . 948657)))
-    ("MORPH_DISTANCE" fun nil (system) "Result = %s (Data)" ("M41.html" ("BACKGROUND" . 948898) ("NEIGHBOR_SAMPLING" . 948900) ("NO_COPY" . 948943)))
-    ("MORPH_GRADIENT" fun nil (system) "Result = %s (Image, Structure)" ("M42.html" ("PRESERVE_TYPE" . 948983) ("UINT" . 948985) ("ULONG" . 948987) ("VALUES" . 948989)))
-    ("MORPH_HITORMISS" fun nil (system) "Result = %s (Image, HitStructure, MissStructure)" ("M43.html"))
-    ("MORPH_OPEN" fun nil (system) "Result = %s (Image, Structure)" ("M44.html" ("GRAY" . 949085) ("PRESERVE_TYPE" . 949087) ("UINT" . 949089) ("ULONG" . 949091) ("VALUES" . 949093)))
-    ("MORPH_THIN" fun nil (system) "Result = %s ( Image, HitStructure, MissStructure )" ("M45.html"))
-    ("MORPH_TOPHAT" fun nil (system) "Result = %s ( Image, Structure)" ("M46.html" ("PRESERVE_TYPE" . 949148) ("UINT" . 949150) ("ULONG" . 949152) ("VALUES" . 949154)))
-    ("MPEG_OPEN" fun nil (system) "mpegID = %s( Dimensions)" ("M48.html" ("BITRATE" . 958969) ("FILENAME" . 958930) ("IFRAME_GAP" . 958935) ("MOTION_VEC_LENGTH" . 958939) ("QUALITY" . 958887)))
-    ("N_ELEMENTS" fun nil (system) "Result = %s(Expression)" ("N.html"))
-    ("N_PARAMS" fun nil (system) "Result = %s()" ("N2.html"))
-    ("N_TAGS" fun nil (system) "Result = %s( Expression)" ("N3.html" ("DATA_LENGTH" . 889267) ("LENGTH" . 928988)))
-    ("NCDF_ATTCOPY" fun nil (system) "Result = %s( Incdf [, Invar])" ("NetCDF-routines11.html" ("IN_GLOBAL" . 996938) ("OUT_GLOBAL" . 996942)))
-    ("NCDF_ATTINQ" fun nil (system) "Result = %s( Cdfid [, Varid])" ("NetCDF-routines14.html" ("GLOBAL" . 997032)))
-    ("NCDF_ATTNAME" fun nil (system) "Result = %s( Cdfid [, Varid])" ("NetCDF-routines15.html" ("GLOBAL" . 997094)))
-    ("NCDF_CREATE" fun nil (system) "Result = %s( Filename)" ("NetCDF-routines20.html" ("CLOBBER" . 997292) ("NOCLOBBER" . 997295)))
-    ("NCDF_DIMDEF" fun nil (system) "Result = %s( Cdfid, DimName, Size)" ("NetCDF-routines21.html" ("UNLIMITED" . 997333)))
-    ("NCDF_DIMID" fun nil (system) "Result = %s( Cdfid, DimName )" ("NetCDF-routines22.html"))
-    ("NCDF_EXISTS" fun nil (system) "Result = %s( )" ("NetCDF-routines25.html"))
-    ("NCDF_INQUIRE" fun nil (system) "Result = %s(Cdfid)" ("NetCDF-routines26.html"))
-    ("NCDF_OPEN" fun nil (system) "Result = %s( Filename)" ("NetCDF-routines27.html" ("NOWRITE" . 997434) ("WRITE" . 997437)))
-    ("NCDF_VARDEF" fun nil (system) "Result = %s( Cdfid, Name [, Dim])" ("NetCDF-routines28.html" ("BYTE" . 997458) ("CHAR" . 997461) ("DOUBLE" . 997464) ("FLOAT" . 997467) ("LONG" . 997470) ("SHORT" . 997473)))
-    ("NCDF_VARID" fun nil (system) "Result = %s(Cdfid, Name)" ("NetCDF-routines31.html"))
-    ("NCDF_VARINQ" fun nil (system) "Result = %s(Cdfid, Varid)" ("NetCDF-routines32.html"))
-    ("NEWTON" fun nil (system) "Result = %s( X, Vecfunc)" ("N5.html" ("CHECK" . 889318) ("DOUBLE" . 889321) ("ITMAX" . 928608) ("STEPMAX" . 889327) ("TOLF" . 889330) ("TOLMIN" . 889334) ("TOLX" . 889337)))
-    ("NORM" fun nil (system) "Result = %s( A)" ("N6.html" ("DOUBLE" . 889381) ("LNORM" . 929047)))
-    ("OBJ" fun nil (system) "Result = %s->[IDLitManipulatorManager::][IDLitManipulatorManager::]->GetDefaultManipulator()" ("objects_it125.html" ("REFERENCE" . 1004397)))
-    ("OBJ_CLASS" fun nil (system) "Result = %s( [Arg])" ("O.html" ("COUNT" . 889415) ("SUPERCLASS" . 889418)))
-    ("OBJ_ISA" fun nil (system) "Result = %s(ObjectInstance, ClassName)" ("O3.html"))
-    ("OBJ_NEW" fun nil (system) "Result = %s( [ObjectClassName [, Arg1......Argn]] )" ("O4.html"))
-    ("OBJ_VALID" fun nil (system) "Result = %s( [Arg])" ("O5.html" ("CAST" . 889505) ("COUNT" . 889508)))
-    ("OBJARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("O6.html" ("NOZERO" . 889547)))
-    ("P_CORRELATE" fun nil (system) "Result = %s( X, Y, C)" ("P.html" ("DOUBLE" . 1073021)))
-    ("PATH_SEP" fun nil (system) "Result = %s()" ("P4.html" ("PARENT_DIRECTORY" . 1076856) ("SEARCH_PATH" . 1076858)))
-    ("PCOMP" fun nil (system) "Result = %s( A)" ("P5.html" ("COEFFICIENTS" . 844766) ("COVARIANCE" . 844768) ("DOUBLE" . 844770) ("EIGENVALUES" . 844772) ("NVARIABLES" . 844774) ("STANDARDIZE" . 844776) ("VARIANCES" . 844778)))
-    ("PNT_LINE" fun nil (system) "Result = %s( P0, L0, L1 [, Pl])" ("P11.html" ("INTERVAL" . 758337)))
-    ("POLAR_SURFACE" fun nil (system) "Result = %s( Z, R, Theta)" ("P14.html" ("BOUNDS" . 753641) ("GRID" . 753637) ("MISSING" . 753645) ("QUINTIC" . 753643) ("SPACING" . 753639)))
-    ("POLY" fun nil (system) "Result = %s(X, C)" ("P15.html"))
-    ("POLY_2D" fun nil (system) "Result = %s( Array, P, Q [, Interp [, Dimx, Dimy]])" ("P16.html" ("CUBIC" . 678217) ("MISSING" . 680892)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("POLY_AREA" fun nil (system) "Result = %s( X, Y)" ("P17.html" ("DOUBLE" . 1074988) ("SIGNED" . 1074986)))
-    ("POLY_FIT" fun nil (system) "Result = %s( X, Y, Degree)" ("P18.html" ("CHISQ" . 1073859) ("COVAR" . 1073862) ("DOUBLE" . 837040) ("MEASURE_ERRORS" . 1074498) ("SIGMA" . 1074050) ("STATUS" . 1073417) ("YBAND" . 1074058) ("YERROR" . 1074060) ("YFIT" . 1074062)))
-    ("POLYFILLV" fun nil (system) "Result = %s( X, Y, Sx, Sy [, Run_Length] )" ("P20.html"))
-    ("POLYSHADE" fun nil (system) "Result = %s( Vertices, Polygons) or Result = %s(X, Y, Z, Polygons)" ("P21.html" ("DATA" . 678323) ("NORMAL" . 678325) ("POLY_SHADES" . 678327) ("SHADES" . 678329) ("T3D" . 678331) ("TOP" . 678333) ("XSIZE" . 678335) ("YSIZE" . 678338)))
-    ("PRIMES" fun nil (system) "Result = %s(K)" ("P25.html"))
-    ("PRODUCT" fun nil (system) "Result = %s(Array [, Dimension])" ("P29.html" ("CUMULATIVE" . 1088999) ("INTEGER" . 1111663) ("NAN" . 1089001) ("PRESERVE_TYPE" . 1112722)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("PROFILE" fun nil (system) "Result = %s( Image [, XX, YY])" ("P30.html" ("NOMARK" . 757684) ("XSTART" . 757687) ("YSTART" . 757690)))
-    ("PROJECT_VOL" fun nil (system) "Result = %s( Vol, X_Sample, Y_Sample, Z_Sample)" ("P33.html" ("AVG_INTENSITY" . 786865) ("CUBIC" . 1105686) ("DEPTH_Q" . 1105735) ("OPAQUE" . 786868) ("TRANS" . 786871) ("XSIZE" . 1105761) ("YSIZE" . 1105822) ("Z_BUFFER" . 1105820)))
-    ("PTR_NEW" fun nil (system) "Result = %s( [InitExpr])" ("P38.html" ("ALLOCATE_HEAP" . 845063) ("NO_COPY" . 845065)))
-    ("PTR_VALID" fun nil (system) "Result = %s( [Arg])" ("P39.html" ("CAST" . 863586) ("COUNT" . 863622)))
-    ("PTRARR" fun nil (system) "Result = %s( D1, ... ..., D8)" ("P40.html" ("ALLOCATE_HEAP" . 845095) ("NOZERO" . 845097)))
-    ("QGRID3" fun nil (system) "Result = %s( XYZ, F, Tetrahedra)" ("Q.html" ("DELTA" . 1073303) ("DIMENSION" . 1073305) ("MISSING" . 1073307) ("START" . 1073309)))
-    ("QROMB" fun nil (system) "Result = %s( Func, A, B)" ("Q3.html" ("DOUBLE" . 51533) ("EPS" . 51536) ("JMAX" . 51539) ("K" . 51542)))
-    ("QROMO" fun nil (system) "Result = %s(Func, A [, B])" ("Q4.html" ("DOUBLE" . 51594) ("EPS" . 51597) ("JMAX" . 51600) ("K" . 51603) ("MIDEXP" . 51606) ("MIDINF" . 51609) ("MIDPNT" . 51612) ("MIDSQL" . 51615) ("MIDSQU" . 51618)))
-    ("QSIMP" fun nil (system) "Result = %s( Func, A, B)" ("Q5.html" ("DOUBLE" . 51671) ("EPS" . 51674) ("JMAX" . 51677)))
-    ("QUERY_BMP" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q7.html"))
-    ("QUERY_DICOM" fun nil (system) "Result = %s( Filename [, Info])" ("Q8.html" ("IMAGE_INDEX" . 1045358)))
-    ("QUERY_GIF" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q9.html"))
-    ("QUERY_IMAGE" fun nil (system) "Result = %s ( Filename[, Info])" ("Q10.html" ("CHANNELS" . 1070109) ("DIMENSIONS" . 1070111) ("HAS_PALETTE" . 1070113) ("IMAGE_INDEX" . 1070115) ("NUM_IMAGES" . 1070117) ("PIXEL_TYPE" . 1070119) ("SUPPORTED_READ" . 1070131) ("SUPPORTED_WRITE" . 1070133) ("TYPE" . 1104573)))
-    ("QUERY_JPEG" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q11.html"))
-    ("QUERY_JPEG2000" fun nil (system) "Result = %s(Filename [, Info] )" ("Q12.html"))
-    ("QUERY_MRSID" fun nil (system) "Result = %s( Filename [, Info])" ("Q13.html" ("LEVEL" . 1073601)))
-    ("QUERY_PICT" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q14.html"))
-    ("QUERY_PNG" fun nil (system) "Result = %s ( Filename [, Info] )" ("Q15.html"))
-    ("QUERY_PPM" fun nil (system) "Result = %s ( Filename [, Info])" ("Q16.html" ("MAXVAL" . 1045715)))
-    ("QUERY_SRF" fun nil (system) "Result = %s (Filename [, Info] )" ("Q17.html"))
-    ("QUERY_TIFF" fun nil (system) "Result = %s ( Filename [, Info])" ("Q18.html" ("GEOTIFF" . 1091493) ("IMAGE_INDEX" . 1045788)))
-    ("QUERY_WAV" fun nil (system) "Result = %s ( Filename[, Info] )" ("Q19.html"))
-    ("R_CORRELATE" fun nil (system) "Result = %s( X, Y)" ("R.html" ("D" . 54014) ("KENDALL" . 54017) ("PROBD" . 54020) ("ZD" . 54023)))
-    ("R_TEST" fun nil (system) "Result = %s( X)" ("R2.html" ("N0" . 54060) ("N1" . 54063) ("R" . 54066)))
-    ("RADON" fun nil (system) "Result = %s( Array)" ("R3.html" ("BACKPROJECT" . 1081929) ("DOUBLE" . 1081932) ("DRHO" . 1081934) ("DX" . 1081936) ("DY" . 1081938) ("GRAY" . 1081940) ("LINEAR" . 1081942) ("NRHO" . 1081944) ("NTHETA" . 1081946) ("NX" . 1081948) ("NY" . 1081950) ("RHO" . 1081952) ("RMIN" . 1081954) ("THETA" . 1081956) ("XMIN" . 1081958) ("YMIN" . 1081960)))
-    ("RANDOMN" fun nil (system) "Result = %s( Seed [, D1 [, ..., D8]])" ("R4.html" ("BINOMIAL" . 867947) ("DOUBLE" . 867736) ("GAMMA" . 1080709) ("LONG" . 1080819) ("NORMAL" . 867741) ("POISSON" . 867743) ("UNIFORM" . 867744)))
-    ("RANDOMU" fun nil (system) "Result = %s( Seed [, D1 [, ..., D8]])" ("R5.html" ("BINOMIAL" . 868252) ("DOUBLE" . 1080874) ("GAMMA" . 868213) ("LONG" . 1080854) ("NORMAL" . 868216) ("POISSON" . 868219) ("UNIFORM" . 868222)))
-    ("RANKS" fun nil (system) "Result = %s(X)" ("R6.html"))
-    ("READ_ASCII" fun nil (system) "Result = %s( [Filename])" ("R9.html" ("COMMENT_SYMBOL" . 864824) ("COUNT" . 864541) ("DATA_START" . 864606) ("DELIMITER" . 865250) ("HEADER" . 865253) ("MISSING_VALUE" . 864515) ("NUM_RECORDS" . 864373) ("RECORD_START" . 678426) ("TEMPLATE" . 863940) ("VERBOSE" . 863965)))
-    ("READ_BINARY" fun nil (system) "Result = %s ([Filename] | FileUnit)" ("R10.html" ("DATA_DIMS" . 1071927) ("DATA_START" . 1071929) ("DATA_TYPE" . 1071931) ("ENDIAN" . 1071933) ("TEMPLATE" . 1071937)))
-    ("READ_BMP" fun nil (system) "Result = %s( Filename, [, R, G, B] [, Ihdr])" ("R11.html" ("RGB" . 867600)))
-    ("READ_DICOM" fun nil (system) "Result = %s (Filename [, Red, Green, Blue])" ("R12.html" ("IMAGE_INDEX" . 1045423)))
-    ("READ_IMAGE" fun nil (system) "Result = %s (Filename [, Red, Green, Blue])" ("R14.html" ("IMAGE_INDEX" . 1071963)))
-    ("READ_JPEG2000" fun nil (system) "Result = %s(Filename [, Red, Green, Blue])" ("R17.html" ("DISCARD_LEVELS" . 1171494) ("MAX_LAYERS" . 1171497) ("ORDER" . 1171500) ("REGION" . 1171503)))
-    ("READ_MRSID" fun nil (system) "Result = %s ( Filename)" ("R18.html" ("LEVEL" . 1086317) ("SUB_RECT" . 1086319)))
-    ("READ_PNG" fun nil (system) "Result = %s ( Filename [, R, G, B])" ("R20.html" ("ORDER" . 1045842) ("TRANSPARENT" . 1045845) ("VERBOSE" . 1075225)))
-    ("READ_SPR" fun nil (system) "Result = %s(Filename)" ("R22.html"))
-    ("READ_SYLK" fun nil (system) "Result = %s( File)" ("R24.html" ("ARRAY" . 67837) ("COLMAJOR" . 67840) ("NCOLS" . 67844) ("NROWS" . 67847) ("STARTCOL" . 67850) ("STARTROW" . 67853) ("USEDOUBLES" . 67856) ("USELONGS" . 67859)))
-    ("READ_TIFF" fun nil (system) "Result = %s( Filename [, R, G, B])" ("R25.html" ("CHANNELS" . 1078044) ("DOT_RANGE" . 1134312) ("GEOTIFF" . 966463) ("ICC_PROFILE" . 1134317) ("IMAGE_INDEX" . 966504) ("INTERLEAVE" . 1077871) ("ORIENTATION" . 948922) ("PHOTOSHOP" . 1134329) ("PLANARCONFIG" . 1086578) ("SUB_RECT" . 966525) ("VERBOSE" . 966492)))
-    ("READ_WAV" fun nil (system) "Result = %s ( Filename [, Rate] )" ("R26.html"))
-    ("READ_XWD" fun nil (system) "Result = %s( Filename[, R, G, B] )" ("R29.html"))
-    ("REAL_PART" fun nil (system) "Result = %s(Z)" ("R32.html"))
-    ("REBIN" fun nil (system) "Result = %s( Array, D1 [, ..., D8])" ("R33.html" ("SAMPLE" . 678500)))
-    ("RECALL_COMMANDS" fun nil (system) "Result = %s()" ("R34.html"))
-    ("RECON3" fun nil (system) "Result = %s( Images, Obj_Rot, Obj_Pos, Focal, Dist,Vol_Pos, Img_Ref, Img_Mag, Vol_Size)" ("R35.html" ("CUBIC" . 1079063) ("MISSING" . 787003) ("MODE" . 787006) ("QUIET" . 1086709)))
-    ("REFORM" fun nil (system) "Result = %s( Array, D1 [, ..., D8])" ("R37.html" ("OVERWRITE" . 678529)))
-    ("REGION_GROW" fun nil (system) "Result = %s(Array, ROIPixels)" ("R38.html" ("ALL_NEIGHBORS" . 1086463) ("NAN" . 1168470) ("STDDEV_MULTIPLIER" . 1086465) ("THRESHOLD" . 1086469)))
-    ("REGRESS" fun nil (system) "Result = %s( X, Y)" ("R40.html" ("CHISQ" . 1078522) ("CONST" . 1078527) ("CORRELATION" . 1078530) ("DOUBLE" . 1078533) ("FTEST" . 1078535) ("MCORRELATION" . 1078538) ("MEASURE_ERRORS" . 1080427) ("RELATIVE_WEIGHT" . 1080465) ("SIGMA" . 1080460) ("STATUS" . 1078543) ("YFIT" . 1078803)))
-    ("REPLICATE" fun nil (system) "Result = %s( Value, D1 [, ..., D8] )" ("R42.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("REVERSE" fun nil (system) "Result = %s( Array [, Subscript_Index])" ("R49.html" ("OVERWRITE" . 1077839)))
-    ("RK4" fun nil (system) "Result = %s( Y, Dydx, X, H, Derivs)" ("R50.html" ("DOUBLE" . 51771)))
-    ("ROBERTS" fun nil (system) "Result = %s(Image)" ("R51.html"))
-    ("ROT" fun nil (system) "Result = %s( A, Angle, [Mag, X0, Y0])" ("R52.html" ("CUBIC" . 758912) ("INTERP" . 758909) ("MISSING" . 758915) ("PIVOT" . 758918)))
-    ("ROTATE" fun nil (system) "Result = %s(Array, Direction)" ("R53.html"))
-    ("ROUND" fun nil (system) "Result = %s(X)" ("R54.html" ("L64" . 1073244)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ROUTINE_INFO" fun nil (system) "Result = %s( [Routine])" ("R55.html" ("DISABLED" . 1068792) ("ENABLED" . 1068823) ("FUNCTIONS" . 1068790) ("PARAMETERS" . 845189) ("SOURCE" . 845200) ("SYSTEM" . 845207) ("UNRESOLVED" . 845209) ("VARIABLES" . 845211)))
-    ("RS_TEST" fun nil (system) "Result = %s( X, Y)" ("R56.html" ("UX" . 54144) ("UY" . 54147)))
-    ("S_TEST" fun nil (system) "Result = %s( X, Y)" ("S.html" ("ZDIFF" . 54194)))
-    ("SAVGOL" fun nil (system) "Result = %s( Nleft, Nright, Order, Degree)" ("S3.html" ("DOUBLE" . 1098051)))
-    ("SCOPE_LEVEL" fun nil (system) "Result = %s()" ("S6.html"))
-    ("SCOPE_VARFETCH" fun nil (system) "Result = %s(VarName)" ("S7.html" ("COMMON" . 1215122) ("ENTER" . 1215135) ("LEVEL" . 1215145) ("REF_EXTRA" . 1215173)))
-    ("SCOPE_VARNAME" fun nil (system) "Result = %s( [Var1[, ..., Varn]])" ("S8.html" ("COMMON" . 1215382) ("COUNT" . 1215393) ("LEVEL" . 1215399)))
-    ("SEARCH2D" fun nil (system) "Result = %s( Array, Xpos, Ypos, Min_Val, Max_Val)" ("S9.html" ("DECREASE" . 758963) ("DIAGONAL" . 758972) ("INCREASE" . 758966) ("LPF_BAND" . 758969)))
-    ("SEARCH3D" fun nil (system) "Result = %s( Array, Xpos, Ypos, Zpos, Min_Val, Max_Val)" ("S10.html" ("DECREASE" . 759017) ("DIAGONAL" . 759026) ("INCREASE" . 759020) ("LPF_BAND" . 759023)))
-    ("SFIT" fun nil (system) "Result = %s( Data, Degree)" ("S15.html" ("IRREGULAR" . 1198892) ("KX" . 1199079) ("MAX_DEGREE" . 1198955)))
-    ("SHIFT" fun nil (system) "Result = %s(Array, S1, ..., Sn)" ("S19.html"))
-    ("SHMDEBUG" fun nil (system) "Result = %s(Enable)" ("S20.html"))
-    ("SHMVAR" fun nil (system) "Result = %s(SegmentName [, D1, ..., D8])" ("S23.html" ("BYTE" . 1143650) ("COMPLEX" . 1143652) ("DCOMPLEX" . 1143654) ("DIMENSION" . 1143656) ("DOUBLE" . 1143658) ("FLOAT" . 1143660) ("INTEGER" . 1143662) ("L64" . 1143664) ("LONG" . 1143666) ("SIZE" . 1143668) ("TEMPLATE" . 1143673) ("TYPE" . 1143675) ("UINT" . 1143680) ("UL64" . 1143684) ("ULONG" . 1143682)))
-    ("SIMPLEX" fun nil (system) "Result = %s( Zequation, Constraints, M1, M2, M3 [, Tableau [, Izrov [, Iposv]]])" ("S26.html" ("DOUBLE" . 1103779) ("EPS" . 1103781) ("STATUS" . 1103783)))
-    ("SIN" fun nil (system) "Result = %s(X)" ("S27.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("SINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("S28.html"))
-    ("SINH" fun nil (system) "Result = %s(X)" ("S29.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("SIZE" fun nil (system) "Result = %s( Expression)" ("S30.html" ("DIMENSIONS" . 901281) ("FILE_LUN" . 901288) ("FILE_OFFSET" . 1199822) ("L64" . 1082592) ("N_DIMENSIONS" . 1082662) ("N_ELEMENTS" . 901298) ("SNAME" . 1199867) ("STRUCTURE" . 901301) ("TNAME" . 901328) ("TYPE" . 901331)))
-    ("SKEWNESS" fun nil (system) "Result = %s( X)" ("S31.html" ("DOUBLE" . 901912) ("NAN" . 903224)))
-    ("SMOOTH" fun nil (system) "Result = %s( Array, Width)" ("S35.html" ("EDGE_TRUNCATE" . 113915) ("MISSING" . 1101098) ("NAN" . 1101095)))
-    ("SOBEL" fun nil (system) "Result = %s(Image)" ("S36.html"))
-    ("SORT" fun nil (system) "Result = %s(Array)" ("S38.html" ("L64" . 1082892)))
-    ("SPH_SCAT" fun nil (system) "Result = %s( Lon, Lat, F)" ("S41.html" ("BOUNDS" . 126851) ("BOUT" . 126868) ("GOUT" . 126871) ("GS" . 126862) ("NLAT" . 126875) ("NLON" . 126858)))
-    ("SPHER_HARM" fun nil (system) "Result = %s( Theta, Phi, L, M)" ("S42.html" ("DOUBLE" . 1098257)))
-    ("SPL_INIT" fun nil (system) "Result = %s( X, Y)" ("S43.html" ("DOUBLE" . 51818) ("YP0" . 51822) ("YPN_1" . 1095878)))
-    ("SPL_INTERP" fun nil (system) "Result = %s( X, Y, Y2, X2)" ("S44.html" ("DOUBLE" . 51859)))
-    ("SPLINE" fun nil (system) "Result = %s( X, Y, T [, Sigma])" ("S45.html" ("DOUBLE" . 1134574)))
-    ("SPRSAB" fun nil (system) "Result = %s( A, B)" ("S47.html" ("DOUBLE" . 51917) ("THRESHOLD" . 51920)))
-    ("SPRSAX" fun nil (system) "Result = %s( A, X)" ("S48.html" ("DOUBLE" . 51985)))
-    ("SPRSIN" fun nil (system) "Result = %s( A)" ("S49.html" ("COLUMN" . 58754) ("DOUBLE" . 52033) ("THRESHOLD" . 52036)))
-    ("SPRSTP" fun nil (system) "Result = %s(A)" ("S50.html"))
-    ("SQRT" fun nil (system) "Result = %s(X)" ("S51.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("STANDARDIZE" fun nil (system) "Result = %s( A)" ("S52.html" ("DOUBLE" . 844918)))
-    ("STDDEV" fun nil (system) "Result = %s( X)" ("S53.html" ("DOUBLE" . 901885) ("NAN" . 903234)))
-    ("STRARR" fun nil (system) "Result = %s(D1 [, ..., D8])" ("S55.html"))
-    ("STRCMP" fun nil (system) "Result = %s( String1, String2 [, N])" ("S56.html" ("FOLD_CASE" . 1069071)))
-    ("STRCOMPRESS" fun nil (system) "Result = %s( String)" ("S57.html" ("REMOVE_ALL" . 679044)))
-    ("STREGEX" fun nil (system) "Result = %s( StringExpression, RegularExpression)" ("S59.html" ("BOOLEAN" . 1069164) ("EXTRACT" . 1069170) ("FOLD_CASE" . 1069177) ("LENGTH" . 1069182) ("SUBEXPR" . 1069190)))
-    ("STRING" fun nil (system) "Result = %s( Expression1, ..., Expressionn)" ("S61.html" ("AM_PM" . 1015738) ("DAYS_OF_WEEK" . 1015740) ("FORMAT" . 1015736) ("MONTHS" . 1015759) ("PRINT" . 679063)))
-    ("STRJOIN" fun nil (system) "Result = %s( String [, Delimiter])" ("S62.html" ("SINGLE" . 1070986)))
-    ("STRLEN" fun nil (system) "Result = %s(Expression)" ("S63.html"))
-    ("STRLOWCASE" fun nil (system) "Result = %s(String)" ("S64.html"))
-    ("STRMATCH" fun nil (system) "Result = %s( String, SearchString)" ("S65.html" ("FOLD_CASE" . 1071246)))
-    ("STRMESSAGE" fun nil (system) "Result = %s( Err)" ("S66.html" ("BLOCK" . 923971) ("CODE" . 923974) ("NAME" . 923979)))
-    ("STRMID" fun nil (system) "Result = %s(Expression, First_Character [, Length])" ("S67.html" ("REVERSE_OFFSET" . 1074174)))
-    ("STRPOS" fun nil (system) "Result = %s( Expression, Search_String [, Pos])" ("S68.html" ("REVERSE_OFFSET" . 1074185) ("REVERSE_SEARCH" . 1074254)))
-    ("STRSPLIT" fun nil (system) "Result = %s( String [, Pattern])" ("S70.html" ("COUNT" . 1071730) ("ESCAPE" . 1153687) ("EXTRACT" . 1071749) ("FOLD_CASE" . 1071757) ("LENGTH" . 1071761) ("PRESERVE_NULL" . 1071767) ("REGEX" . 1071772)))
-    ("STRTRIM" fun nil (system) "Result = %s( String [, Flag] )" ("S71.html"))
-    ("STRUPCASE" fun nil (system) "Result = %s(String)" ("S74.html"))
-    ("SVDFIT" fun nil (system) "Result = %s( X, Y [, M])" ("S78.html" ("A" . 845481) ("CHISQ" . 845501) ("COVAR" . 845503) ("DOUBLE" . 845488) ("FUNCTION_NAME" . 754160) ("LEGENDRE" . 1093586) ("MEASURE_ERRORS" . 1094756) ("SIGMA" . 1093549) ("SING_VALUES" . 1144017) ("SINGULAR" . 845513) ("STATUS" . 1143910) ("TOL" . 1144024) ("VARIANCE" . 845515) ("WEIGHTS" . 1093555) ("YFIT" . 754165)))
-    ("SVSOL" fun nil (system) "Result = %s( U, W, V, B)" ("S79.html" ("COLUMN" . 58776) ("DOUBLE" . 52150)))
-    ("SWAP_ENDIAN" fun nil (system) "Result = %s(Variable)" ("S80.html" ("SWAP_IF_BIG_ENDIAN" . 1110629) ("SWAP_IF_LITTLE_ENDIAN" . 1110632)))
-    ("SYSTIME" fun nil (system) "String = %s( [0 [, ElaspedSeconds]])" ("S83.html" ("JULIAN" . 1015505) ("SECONDS" . 1015507) ("UTC" . 1083080)))
-    ("T_CVF" fun nil (system) "Result = %s(P, Df)" ("T.html"))
-    ("T_PDF" fun nil (system) "Result = %s(V, Df)" ("T2.html"))
-    ("TAG_NAMES" fun nil (system) "Result = %s( Expression)" ("T4.html" ("STRUCTURE_NAME" . 679363)))
-    ("TAN" fun nil (system) "Result = %s(X)" ("T5.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("TANH" fun nil (system) "Result = %s(X)" ("T6.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("TEMPORARY" fun nil (system) "Result = %s(Variable)" ("T8.html"))
-    ("TETRA_CLIP" fun nil (system) "Result = %s ( Plane, Vertsin, Connin, Vertsout, Connout)" ("T9.html" ("AUXDATA_IN" . 1071827) ("AUXDATA_OUT" . 1071829) ("CUT_VERTS" . 1071831)))
-    ("TETRA_SURFACE" fun nil (system) "Result = %s (Verts, Connin)" ("T10.html"))
-    ("TETRA_VOLUME" fun nil (system) "Result = %s ( Verts, Conn)" ("T11.html" ("AUXDATA" . 1071864) ("MOMENT" . 1071866)))
-    ("THIN" fun nil (system) "Result = %s( Image)" ("T12.html" ("NEIGHBOR_COUNT" . 1069698) ("PRUNE" . 1069716)))
-    ("TIMEGEN" fun nil (system) "Result = %s( [D1,...,D8])" ("T15.html" ("DAYS" . 1077148) ("FINAL" . 1077151) ("HOURS" . 1077154) ("MINUTES" . 1077156) ("MONTHS" . 1077158) ("SECONDS" . 1077160) ("START" . 1077162) ("STEP_SIZE" . 1077166) ("UNITS" . 1077168) ("YEAR" . 1077211)))
-    ("TM_TEST" fun nil (system) "Result = %s( X, Y)" ("T16.html" ("PAIRED" . 54299) ("UNEQUAL" . 54302)))
-    ("TOTAL" fun nil (system) "Result = %s( Array [, Dimension])" ("T17.html" ("CUMULATIVE" . 1070565) ("DOUBLE" . 1070569) ("INTEGER" . 1115757) ("NAN" . 47220) ("PRESERVE_TYPE" . 1116699)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("TRACE" fun nil (system) "Result = %s( A)" ("T18.html" ("DOUBLE" . 845005)))
-    ("TRANSPOSE" fun nil (system) "Result = %s( Array [, P] )" ("T19.html"))
-    ("TRI_SURF" fun nil (system) "Result = %s( Z [, X, Y])" ("T20.html" ("BOUNDS" . 758634) ("EXTRAPOLATE" . 758607) ("GS" . 758631) ("LINEAR" . 758610) ("MISSING" . 949473) ("NX" . 758637) ("NY" . 758640) ("REGULAR" . 851712) ("XGRID" . 758617) ("XVALUES" . 758620) ("YGRID" . 758623) ("YVALUES" . 758626)))
-    ("TRIGRID" fun nil (system) "Result = %s( X, Y, Z, Triangles [, GS, Limits] ) or Result = %s( F , GS, Limits)" ("T22.html" ("DEGREES" . 679620) ("EXTRAPOLATE" . 126730) ("INPUT" . 128106) ("MAX_VALUE" . 128088) ("MIN_VALUE" . 128089) ("MISSING" . 679622) ("NX" . 1076987) ("NY" . 1076989) ("QUINTIC" . 679624) ("SPHERE" . 126737) ("XGRID" . 837019) ("XOUT" . 1075935) ("YGRID" . 837021) ("YOUT" . 1075879)))
-    ("TRISOL" fun nil (system) "Result = %s( A, B, C, R)" ("T25.html" ("DOUBLE" . 52330)))
-    ("TS_COEF" fun nil (system) "Result = %s( X, P)" ("T27.html" ("DOUBLE" . 1076434) ("MSE" . 54734)))
-    ("TS_DIFF" fun nil (system) "Result = %s( X, K)" ("T28.html" ("DOUBLE" . 861958)))
-    ("TS_FCAST" fun nil (system) "Result = %s( X, P, Nvalues)" ("T29.html" ("BACKCAST" . 223046) ("DOUBLE" . 223055)))
-    ("TS_SMOOTH" fun nil (system) "Result = %s( X, Nvalues)" ("T30.html" ("BACKWARD" . 223123) ("DOUBLE" . 223168) ("FORWARD" . 223093) ("ORDER" . 223094)))
-    ("TVRD" fun nil (system) "Result = %s( [X0 [, Y0 [, Nx [, Ny [, Channel]]]]])" ("T34.html" ("CHANNEL" . 679790) ("ORDER" . 679793) ("TRUE" . 679795) ("WORDS" . 679797)))
-    ("UINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("U.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("UINT" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("U2.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("UINTARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("U3.html" ("NOZERO" . 950261)))
-    ("UL64INDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("U4.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ULINDGEN" fun nil (system) "Result = %s(D1 [, ..., D8])" ("U5.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ULON64ARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("U6.html" ("NOZERO" . 950420)))
-    ("ULONARR" fun nil (system) "Result = %s( D1 [, ..., D8])" ("U7.html" ("NOZERO" . 950477)))
-    ("ULONG" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("U8.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("ULONG64" fun nil (system) "Result = %s( Expression[, Offset [, D1 [, ..., D8]]] )" ("U9.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("UNIQ" fun nil (system) "Result = %s( Array [, Index] )" ("U10.html"))
-    ("UNSHARP_MASK" fun nil (system) "Result = %s(Image)" ("U11.html" ("AMOUNT" . 968717) ("RADIUS" . 968720) ("THRESHOLD" . 968725) ("TRUE" . 968729)))
-    ("VALUE_LOCATE" fun nil (system) "Result = %s ( Vector, Value)" ("V.html" ("L64" . 957054)))
-    ("VARIANCE" fun nil (system) "Result = %s( X)" ("V2.html" ("DOUBLE" . 938748) ("NAN" . 938858)))
-    ("VERT_T3D" fun nil (system) "Result = %s( Vertex_List)" ("V6.html" ("DOUBLE" . 787625) ("MATRIX" . 957551) ("NO_COPY" . 787628) ("NO_DIVIDE" . 787631) ("SAVE_DIVIDE" . 787634)))
-    ("VOIGT" fun nil (system) "Result = %s(A, U)" ("V7.html") ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("VOXEL_PROJ" fun nil (system) "Result = %s( V [, RGBO])" ("V9.html" ("BACKGROUND" . 677308) ("CUTTING_PLANE" . 680823) ("INTERPOLATE" . 680824) ("MAXIMUM_INTENSITY" . 680825) ("STEP" . 680826) ("XSIZE" . 680827) ("YSIZE" . 680828) ("ZBUFFER" . 680829) ("ZPIXELS" . 680830)))
-    ("WARP_TRI" fun nil (system) "Result = %s( Xo, Yo, Xi, Yi, Image)" ("W2.html" ("EXTRAPOLATE" . 758734) ("OUTPUT_SIZE" . 758728) ("QUINTIC" . 758731) ("TPS" . 967342)))
-    ("WATERSHED" fun nil (system) "Result = %s ( Image)" ("W3.html" ("CONNECTIVITY" . 961172) ("LONG" . 1049951) ("NREGIONS" . 1049960)))
-    ("WHERE" fun nil (system) "Result = %s( Array_Expression [, Count])" ("W7.html" ("COMPLEMENT" . 964874) ("L64" . 964006) ("NCOMPLEMENT" . 964887)) ("tpoolkeyw2.html" ("TPOOL_MAX_ELTS" . 333417) ("TPOOL_MIN_ELTS" . 333286) ("TPOOL_NOTHREAD" . 333289)))
-    ("WIDGET_ACTIVEX" fun nil (system) "Result = %s( Parent, COM_ID)" ("W9.html" ("ALIGN_BOTTOM" . 970441) ("ALIGN_CENTER" . 970444) ("ALIGN_LEFT" . 970446) ("ALIGN_RIGHT" . 970448) ("ALIGN_TOP" . 970450) ("EVENT_FUNC" . 970453) ("EVENT_PRO" . 970455) ("FUNC_GET_VALUE" . 970458) ("ID_TYPE" . 970461) ("KILL_NOTIFY" . 970465) ("NO_COPY" . 970471) ("NOTIFY_REALIZE" . 970475) ("PRO_SET_VALUE" . 970479) ("SCR_XSIZE" . 970483) ("SCR_YSIZE" . 970486) ("SENSITIVE" . 970488) ("UNAME" . 1003671) ("UNITS" . 970503) ("UVALUE" . 970505) ("XOFFSET" . 970510) ("XSIZE" . 970513) ("YOFFSET" . 970515) ("YSIZE" . 970518)))
-    ("WIDGET_BASE" fun nil (system) "Result = %s( [Parent])" ("W10.html" ("ALIGN_BOTTOM" . 679920) ("ALIGN_CENTER" . 107036) ("ALIGN_LEFT" . 107030) ("ALIGN_RIGHT" . 107035) ("ALIGN_TOP" . 107037) ("BASE_ALIGN_BOTTOM" . 107046) ("BASE_ALIGN_CENTER" . 107047) ("BASE_ALIGN_LEFT" . 107048) ("BASE_ALIGN_RIGHT" . 107049) ("BASE_ALIGN_TOP" . 107050) ("COLUMN" . 107029) ("CONTEXT_EVENTS" . 917417) ("CONTEXT_MENU" . 970908) ("DISPLAY_NAME" . 970988) ("EVENT_FUNC" . 679923) ("EVENT_PRO" . 679925) ("EXCLUSIVE" . 679927) ("FLOATING" . 911154) ("FRAME" . 679931) ("FUNC_GET_VALUE" . 679933) ("GRID_LAYOUT" . 679935) ("GROUP_LEADER" . 895915) ("KBRD_FOCUS_EVENTS" . 912183) ("KILL_NOTIFY" . 679938) ("MAP" . 108526) ("MBAR" . 934563) ("MODAL" . 910174) ("NO_COPY" . 106818) ("NONEXCLUSIVE" . 679946) ("NOTIFY_REALIZE" . 67508) ("PRO_SET_VALUE" . 679949) ("RESOURCE_NAME" . 281150) ("RNAME_MBAR" . 72437) ("ROW" . 679951) ("SCR_XSIZE" . 948019) ("SCR_YSIZE" . 58070) ("SCROLL" . 679954) ("SENSITIVE" . 948204) ("SPACE" . 679957) ("TAB_MODE" . 1068884) ("TITLE" . 679959) ("TLB_FRAME_ATTR" . 977197) ("TLB_ICONIFY_EVENTS" . 984484) ("TLB_KILL_REQUEST_EVENTS" . 192742) ("TLB_MOVE_EVENTS" . 984511) ("TLB_SIZE_EVENTS" . 679965) ("TOOLBAR" . 978753) ("TRACKING_EVENTS" . 58059) ("UNAME" . 949220) ("UNITS" . 895507) ("UVALUE" . 679967) ("X_SCROLL_SIZE" . 679980) ("XOFFSET" . 679972) ("XPAD" . 679975) ("XSIZE" . 679977) ("Y_SCROLL_SIZE" . 679991) ("YOFFSET" . 679983) ("YPAD" . 679986) ("YSIZE" . 679988)))
-    ("WIDGET_BUTTON" fun nil (system) "Result = %s( Parent)" ("W11.html" ("ACCELERATOR" . 1069174) ("ALIGN_CENTER" . 680015) ("ALIGN_LEFT" . 57956) ("ALIGN_RIGHT" . 57957) ("BITMAP" . 192775) ("CHECKED_MENU" . 978512) ("DYNAMIC_RESIZE" . 978508) ("EVENT_FUNC" . 106419) ("EVENT_PRO" . 680017) ("FONT" . 680019) ("FRAME" . 680021) ("FUNC_GET_VALUE" . 108837) ("GROUP_LEADER" . 680025) ("HELP" . 57994) ("KILL_NOTIFY" . 680028) ("MENU" . 680031) ("NO_COPY" . 109087) ("NO_RELEASE" . 680036) ("NOTIFY_REALIZE" . 67569) ("PRO_SET_VALUE" . 680038) ("PUSHBUTTON_EVENTS" . 1019958) ("RESOURCE_NAME" . 724023) ("SCR_XSIZE" . 67277) ("SCR_YSIZE" . 67280) ("SENSITIVE" . 948118) ("SEPARATOR" . 58000) ("TAB_MODE" . 1069036) ("TOOLTIP" . 982062) ("TRACKING_EVENTS" . 982064) ("UNAME" . 949273) ("UNITS" . 895525) ("UVALUE" . 680040) ("VALUE" . 680044) ("X_BITMAP_EXTRA" . 680046) ("XOFFSET" . 680048) ("XSIZE" . 680051) ("YOFFSET" . 680054) ("YSIZE" . 680057)))
-    ("WIDGET_COMBOBOX" fun nil (system) "Result = %s( Parent)" ("W12.html" ("DYNAMIC_RESIZE" . 1011945) ("EDITABLE" . 1011949) ("EVENT_FUNC" . 1011951) ("EVENT_PRO" . 1011953) ("FONT" . 1011955) ("FRAME" . 1011964) ("FUNC_GET_VALUE" . 1011967) ("GROUP_LEADER" . 1011969) ("IGNORE_ACCELERATORS" . 1096967) ("KILL_NOTIFY" . 1011972) ("NO_COPY" . 1011975) ("NOTIFY_REALIZE" . 1011978) ("PRO_SET_VALUE" . 1011980) ("RESOURCE_NAME" . 1011983) ("SCR_XSIZE" . 1011991) ("SCR_YSIZE" . 1011993) ("SENSITIVE" . 1011995) ("TAB_MODE" . 1071311) ("TRACKING_EVENTS" . 1012005) ("UNAME" . 1012013) ("UNITS" . 1012019) ("UVALUE" . 1012021) ("VALUE" . 1012025) ("XOFFSET" . 1012027) ("XSIZE" . 1012030) ("YOFFSET" . 1012032) ("YSIZE" . 1012035)))
-    ("WIDGET_DRAW" fun nil (system) "Result = %s(Parent)" ("W15.html" ("APP_SCROLL" . 680227) ("BUTTON_EVENTS" . 941808) ("COLOR_MODEL" . 930114) ("COLORS" . 896380) ("EVENT_FUNC" . 680234) ("EVENT_PRO" . 680236) ("EXPOSE_EVENTS" . 907355) ("FRAME" . 680238) ("FUNC_GET_VALUE" . 680240) ("GRAPHICS_LEVEL" . 914743) ("GROUP_LEADER" . 680242) ("IGNORE_ACCELERATORS" . 1097640) ("KEYBOARD_EVENTS" . 1097628) ("KILL_NOTIFY" . 680245) ("MOTION_EVENTS" . 153791) ("NO_COPY" . 680251) ("NOTIFY_REALIZE" . 67601) ("PRO_SET_VALUE" . 680253) ("RENDERER" . 930656) ("RESOURCE_NAME" . 947866) ("RETAIN" . 680255) ("SCR_XSIZE" . 67289) ("SCR_YSIZE" . 67292) ("SCROLL" . 67286) ("SENSITIVE" . 948221) ("TOOLTIP" . 982084) ("TRACKING_EVENTS" . 67368) ("UNAME" . 949316) ("UNITS" . 895543) ("UVALUE" . 680259) ("VALUE" . 680263) ("VIEWPORT_EVENTS" . 279483) ("X_SCROLL_SIZE" . 680274) ("XOFFSET" . 680268) ("XSIZE" . 680271) ("Y_SCROLL_SIZE" . 680283) ("YOFFSET" . 680277) ("YSIZE" . 680280)))
-    ("WIDGET_DROPLIST" fun nil (system) "Result = %s( Parent)" ("W16.html" ("DYNAMIC_RESIZE" . 192790) ("EVENT_FUNC" . 192787) ("EVENT_PRO" . 58393) ("FONT" . 963245) ("FRAME" . 58399) ("FUNC_GET_VALUE" . 58404) ("GROUP_LEADER" . 58412) ("KILL_NOTIFY" . 58424) ("NO_COPY" . 67153) ("NOTIFY_REALIZE" . 67614) ("PRO_SET_VALUE" . 67133) ("RESOURCE_NAME" . 67140) ("SCR_XSIZE" . 67120) ("SCR_YSIZE" . 67123) ("SENSITIVE" . 948234) ("TAB_MODE" . 1071560) ("TITLE" . 888903) ("TRACKING_EVENTS" . 58334) ("UNAME" . 949326) ("UNITS" . 895561) ("UVALUE" . 67166) ("VALUE" . 67174) ("XOFFSET" . 67194) ("XSIZE" . 67198) ("YOFFSET" . 67201) ("YSIZE" . 67205)))
-    ("WIDGET_EVENT" fun nil (system) "Result = %s([Widget_ID])" ("W17.html" ("BAD_ID" . 680307) ("NOWAIT" . 680311) ("SAVE_HOURGLASS" . 680313) ("YIELD_TO_TTY" . 675439)))
-    ("WIDGET_INFO" fun nil (system) "Result = %s( [Widget_ID] )" ("W18.html" ("ACTIVE" . 680342) ("BUTTON_SET" . 978692) ("CHILD" . 978690) ("COLUMN_WIDTHS" . 895941) ("COMBOBOX_GETTEXT" . 981639) ("COMBOBOX_NUMBER" . 981602) ("COMPONENT" . 1018415) ("CONTEXT_EVENTS" . 1018413) ("DRAW_BUTTON_EVENTS" . 971032) ("DRAW_EXPOSE_EVENTS" . 909787) ("DRAW_KEYBOARD_EVENTS" . 985204) ("DRAW_MOTION_EVENTS" . 985200) ("DRAW_VIEWPORT_EVENTS" . 680350) ("DROPLIST_NUMBER" . 58164) ("DROPLIST_SELECT" . 58165) ("DYNAMIC_RESIZE" . 192872) ("EVENT_FUNC" . 680352) ("EVENT_PRO" . 680354) ("FIND_BY_UNAME" . 58144) ("FONTNAME" . 980336) ("GEOMETRY" . 980339) ("KBRD_FOCUS_EVENTS" . 1012790) ("LIST_MULTIPLE" . 934733) ("LIST_NUM_VISIBLE" . 680358) ("LIST_NUMBER" . 911616) ("LIST_SELECT" . 680360) ("LIST_TOP" . 680362) ("MANAGED" . 907337) ("MAP" . 982652) ("MODAL" . 910752) ("MULTIPLE_PROPERTIES" . 1100808) ("NAME" . 1100833) ("PARENT" . 680364) ("PROPERTY_VALID" . 1018429) ("PROPERTY_VALUE" . 1018452) ("PROPERTYSHEET_NSELECTED" . 1070799) ("PROPERTYSHEET_SELECTED" . 1082483) ("PUSHBUTTON_EVENTS" . 1020048) ("REALIZED" . 1018448) ("ROW_HEIGHTS" . 895972) ("SENSITIVE" . 982686) ("SIBLING" . 680368) ("SLIDER_MIN_MAX" . 680889) ("SYSTEM_COLORS" . 895977) ("TAB_CURRENT" . 976997) ("TAB_MODE" . 1069869) ("TAB_MULTILINE" . 977009) ("TAB_NUMBER" . 977045) ("TABLE_ALL_EVENTS" . 971069) ("TABLE_DISJOINT_SELECTION" . 987431) ("TABLE_EDIT_CELL" . 895981) ("TABLE_EDITABLE" . 895979) ("TABLE_SELECT" . 895983) ("TABLE_VIEW" . 895985) ("TEXT_ALL_EVENTS" . 680895) ("TEXT_EDITABLE" . 680899) ("TEXT_NUMBER" . 680370) ("TEXT_OFFSET_TO_XY" . 680903) ("TEXT_SELECT" . 680906) ("TEXT_TOP_LINE" . 680913) ("TEXT_XY_TO_OFFSET" . 899965) ("TLB_ICONIFY_EVENTS" . 984875) ("TLB_KILL_REQUEST_EVENTS" . 192881) ("TLB_MOVE_EVENTS" . 984854) ("TLB_SIZE_EVENTS" . 984889) ("TOOLTIP" . 982130) ("TRACKING_EVENTS" . 58086) ("TREE_EXPANDED" . 978324) ("TREE_ROOT" . 986723) ("TREE_SELECT" . 978331) ("TYPE" . 680072) ("UNAME" . 949465) ("UNITS" . 949467) ("UPDATE" . 680371) ("USE_TABLE_SELECT" . 896009) ("VALID_ID" . 891030) ("VERSION" . 680373) ("VISIBLE" . 984410)))
-    ("WIDGET_LABEL" fun nil (system) "Result = %s( Parent)" ("W19.html" ("ALIGN_CENTER" . 57967) ("ALIGN_LEFT" . 57970) ("ALIGN_RIGHT" . 57973) ("DYNAMIC_RESIZE" . 192801) ("FONT" . 680390) ("FRAME" . 680392) ("FUNC_GET_VALUE" . 680394) ("GROUP_LEADER" . 680396) ("KILL_NOTIFY" . 680399) ("NO_COPY" . 680402) ("NOTIFY_REALIZE" . 67628) ("PRO_SET_VALUE" . 680404) ("RESOURCE_NAME" . 724047) ("SCR_XSIZE" . 67301) ("SCR_YSIZE" . 67304) ("SENSITIVE" . 948248) ("SUNKEN_FRAME" . 978731) ("TRACKING_EVENTS" . 67390) ("UNAME" . 949494) ("UNITS" . 949487) ("UVALUE" . 680406) ("VALUE" . 680410) ("XOFFSET" . 680412) ("XSIZE" . 680415) ("YOFFSET" . 680418) ("YSIZE" . 680421)))
-    ("WIDGET_LIST" fun nil (system) "Result = %s( Parent)" ("W20.html" ("CONTEXT_EVENTS" . 970955) ("EVENT_FUNC" . 680433) ("EVENT_PRO" . 680435) ("FONT" . 680437) ("FRAME" . 680439) ("FUNC_GET_VALUE" . 680441) ("GROUP_LEADER" . 680443) ("KILL_NOTIFY" . 680446) ("MULTIPLE" . 934705) ("NO_COPY" . 680449) ("NOTIFY_REALIZE" . 67642) ("PRO_SET_VALUE" . 680451) ("RESOURCE_NAME" . 724057) ("SCR_XSIZE" . 67319) ("SCR_YSIZE" . 1001133) ("SENSITIVE" . 948262) ("TAB_MODE" . 1071684) ("TRACKING_EVENTS" . 1071674) ("UNAME" . 949504) ("UNITS" . 895619) ("UVALUE" . 680453) ("VALUE" . 680457) ("XOFFSET" . 680460) ("XSIZE" . 680463) ("YOFFSET" . 680466) ("YSIZE" . 58021)))
-    ("WIDGET_PROPERTYSHEET" fun nil (system) "Result = %s(Parent)" ("W21.html" ("ALIGN_BOTTOM" . 1036791) ("ALIGN_CENTER" . 1036794) ("ALIGN_LEFT" . 1036796) ("ALIGN_RIGHT" . 1036798) ("ALIGN_TOP" . 1036800) ("CONTEXT_EVENTS" . 1036802) ("EDITABLE" . 1078422) ("EVENT_FUNC" . 1036806) ("EVENT_PRO" . 1036808) ("FONT" . 1036810) ("FRAME" . 1070614) ("FUNC_GET_VALUE" . 1036813) ("IGNORE_ACCELERATORS" . 1097821) ("KILL_NOTIFY" . 1036815) ("MULTIPLE_PROPERTIES" . 1100848) ("NO_COPY" . 1036819) ("NOTIFY_REALIZE" . 1036822) ("PRO_SET_VALUE" . 1036824) ("SCR_XSIZE" . 1036826) ("SCR_YSIZE" . 1036828) ("SENSITIVE" . 1036830) ("SUNKEN_FRAME" . 1070660) ("TRACKING_EVENTS" . 1036836) ("UNAME" . 1036838) ("UNITS" . 1036841) ("UVALUE" . 1036843) ("VALUE" . 1036847) ("XOFFSET" . 1036853) ("XSIZE" . 1036856) ("YOFFSET" . 1036858) ("YSIZE" . 1036861)))
-    ("WIDGET_SLIDER" fun nil (system) "Result = %s( Parent)" ("W22.html" ("DRAG" . 680487) ("EVENT_FUNC" . 680490) ("EVENT_PRO" . 680492) ("FONT" . 680494) ("FRAME" . 680496) ("FUNC_GET_VALUE" . 680498) ("GROUP_LEADER" . 680500) ("KILL_NOTIFY" . 680503) ("MAXIMUM" . 680506) ("MINIMUM" . 680508) ("NO_COPY" . 680510) ("NOTIFY_REALIZE" . 67656) ("PRO_SET_VALUE" . 680512) ("RESOURCE_NAME" . 724067) ("SCR_XSIZE" . 67331) ("SCR_YSIZE" . 67334) ("SCROLL" . 680514) ("SENSITIVE" . 948276) ("SUPPRESS_VALUE" . 680516) ("TAB_MODE" . 1071832) ("TITLE" . 1071823) ("TRACKING_EVENTS" . 67418) ("UNAME" . 949514) ("UNITS" . 895638) ("UVALUE" . 680519) ("VALUE" . 680523) ("VERTICAL" . 680527) ("XOFFSET" . 680529) ("XSIZE" . 680532) ("YOFFSET" . 680535) ("YSIZE" . 680538)))
-    ("WIDGET_TAB" fun nil (system) "Result = %s( Parent)" ("W23.html" ("ALIGN_BOTTOM" . 1012200) ("ALIGN_CENTER" . 1012202) ("ALIGN_LEFT" . 1012204) ("ALIGN_RIGHT" . 1012206) ("ALIGN_TOP" . 1012208) ("EVENT_FUNC" . 1012210) ("EVENT_PRO" . 1012212) ("FUNC_GET_VALUE" . 1012214) ("GROUP_LEADER" . 1012216) ("KILL_NOTIFY" . 1012219) ("LOCATION" . 1012223) ("MULTILINE" . 1012253) ("NO_COPY" . 1012263) ("NOTIFY_REALIZE" . 1012266) ("PRO_SET_VALUE" . 1012268) ("SCR_XSIZE" . 1012270) ("SCR_YSIZE" . 1012272) ("SENSITIVE" . 1012274) ("TAB_MODE" . 1071955) ("TRACKING_EVENTS" . 1018541) ("UNAME" . 1012284) ("UNITS" . 1012290) ("UVALUE" . 1012292) ("XOFFSET" . 1012296) ("XSIZE" . 1012299) ("YOFFSET" . 1012301) ("YSIZE" . 1012304)))
-    ("WIDGET_TABLE" fun nil (system) "Result = %s( Parent)" ("W24.html" ("ALIGNMENT" . 896042) ("ALL_EVENTS" . 941688) ("AM_PM" . 1076926) ("COLUMN_LABELS" . 1076933) ("COLUMN_MAJOR" . 909845) ("COLUMN_WIDTHS" . 896114) ("CONTEXT_EVENTS" . 1074773) ("DAYS_OF_WEEK" . 949838) ("DISJOINT_SELECTION" . 987345) ("EDITABLE" . 987346) ("EVENT_FUNC" . 896120) ("EVENT_PRO" . 896123) ("FONT" . 896126) ("FORMAT" . 896130) ("FRAME" . 896133) ("FUNC_GET_VALUE" . 896136) ("GROUP_LEADER" . 896151) ("IGNORE_ACCELERATORS" . 1097865) ("KBRD_FOCUS_EVENTS" . 911525) ("KILL_NOTIFY" . 896155) ("MONTHS" . 949844) ("NO_COLUMN_HEADERS" . 1074713) ("NO_COPY" . 896163) ("NO_HEADERS" . 909873) ("NO_ROW_HEADERS" . 1074723) ("NOTIFY_REALIZE" . 896166) ("PRO_SET_VALUE" . 896169) ("RESIZEABLE_COLUMNS" . 896172) ("RESIZEABLE_ROWS" . 901244) ("RESOURCE_NAME" . 896175) ("ROW_HEIGHTS" . 909879) ("ROW_LABELS" . 896181) ("ROW_MAJOR" . 909886) ("SCR_XSIZE" . 896187) ("SCR_YSIZE" . 896190) ("SCROLL" . 896193) ("SENSITIVE" . 948291) ("TAB_MODE" . 1072083) ("TRACKING_EVENTS" . 896200) ("UNAME" . 949524) ("UNITS" . 896203) ("UVALUE" . 896207) ("VALUE" . 896212) ("X_SCROLL_SIZE" . 896223) ("XOFFSET" . 896215) ("XSIZE" . 896219) ("Y_SCROLL_SIZE" . 896235) ("YOFFSET" . 896227) ("YSIZE" . 896231)))
-    ("WIDGET_TEXT" fun nil (system) "Result = %s( Parent)" ("W25.html" ("ALL_EVENTS" . 680556) ("CONTEXT_EVENTS" . 970972) ("EDITABLE" . 886884) ("EVENT_FUNC" . 680561) ("EVENT_PRO" . 680563) ("FONT" . 680565) ("FRAME" . 680567) ("FUNC_GET_VALUE" . 680569) ("GROUP_LEADER" . 680571) ("IGNORE_ACCELERATORS" . 1097921) ("KBRD_FOCUS_EVENTS" . 911545) ("KILL_NOTIFY" . 680574) ("NO_COPY" . 680577) ("NO_NEWLINE" . 680579) ("NOTIFY_REALIZE" . 67670) ("PRO_SET_VALUE" . 680581) ("RESOURCE_NAME" . 724077) ("SCR_XSIZE" . 67343) ("SCR_YSIZE" . 67346) ("SCROLL" . 680583) ("SENSITIVE" . 948305) ("TAB_MODE" . 1072230) ("TRACKING_EVENTS" . 67432) ("UNAME" . 949534) ("UNITS" . 895656) ("UVALUE" . 680586) ("VALUE" . 680590) ("WRAP" . 58056) ("XOFFSET" . 680592) ("XSIZE" . 680595) ("YOFFSET" . 680598) ("YSIZE" . 680601)))
-    ("WIDGET_TREE" fun nil (system) "Result = %s( Parent)" ("W26.html" ("ALIGN_BOTTOM" . 1012440) ("ALIGN_CENTER" . 1012442) ("ALIGN_LEFT" . 1012444) ("ALIGN_RIGHT" . 1012446) ("ALIGN_TOP" . 1012448) ("BITMAP" . 1012450) ("CONTEXT_EVENTS" . 1012452) ("EVENT_FUNC" . 1012461) ("EVENT_PRO" . 1012463) ("EXPANDED" . 1012465) ("FOLDER" . 1012468) ("FUNC_GET_VALUE" . 1012472) ("GROUP_LEADER" . 1012474) ("KILL_NOTIFY" . 1012477) ("MULTIPLE" . 1012481) ("NO_COPY" . 1012484) ("NOTIFY_REALIZE" . 1012487) ("PRO_SET_VALUE" . 1012489) ("SCR_XSIZE" . 1012491) ("SCR_YSIZE" . 1012493) ("SENSITIVE" . 1012495) ("TAB_MODE" . 1072351) ("TOP" . 1012505) ("TRACKING_EVENTS" . 1018556) ("UNAME" . 1012508) ("UNITS" . 1012514) ("UVALUE" . 1012516) ("VALUE" . 1012520) ("XOFFSET" . 1012523) ("XSIZE" . 1012526) ("YOFFSET" . 1012528) ("YSIZE" . 1012531)))
-    ("WRITE_SYLK" fun nil (system) "Result = %s( File, Data)" ("W39.html" ("STARTCOL" . 67955) ("STARTROW" . 67958)))
-    ("WTN" fun nil (system) "Result = %s( A, Coef)" ("W46.html" ("COLUMN" . 58787) ("DOUBLE" . 52415) ("INVERSE" . 52418) ("OVERWRITE" . 52421)))
-    ("WV_CW_WAVELET" fun nil (system) "Result = %s( [Parent])" ("ref5.html" ("DISCRETE" . 1003928) ("NO_COLOR" . 1015397) ("NO_DRAW_WINDOW" . 1015435) ("TITLE" . 1015385) ("UNAME" . 1004532) ("UVALUE" . 1003932) ("VALUE" . 1015413) ("WAVELETS" . 1008397)))
-    ("WV_CWT" fun nil (system) "Result = %s(Array, Family, Order)" ("ref6.html" ("DOUBLE" . 1009356) ("DSCALE" . 1009358) ("NSCALE" . 1009484) ("PAD" . 1009489) ("SCALE" . 1009494) ("START_SCALE" . 1009568)))
-    ("WV_DENOISE" fun nil (system) "Result = %s(Array [, Family, Order])" ("ref7.html" ("COEFFICIENTS" . 1010533) ("CUTOFF" . 1010481) ("DENOISE_STATE" . 1010485) ("DOUBLE" . 1010505) ("DWT_FILTERED" . 1010508) ("PERCENT" . 1010511) ("THRESHOLD" . 1010517) ("WPS_FILTERED" . 1010522)))
-    ("WV_DWT" fun nil (system) "Result = %s(Array, Scaling, Wavelet, Ioff, Joff)" ("ref8.html" ("DOUBLE" . 1003349) ("INVERSE" . 1003353) ("N_LEVELS" . 1043639)))
-    ("WV_FN_COIFLET" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref9.html"))
-    ("WV_FN_DAUBECHIES" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref10.html"))
-    ("WV_FN_GAUSSIAN" fun nil (system) "Result = %s( [Order] [, Scale, N])" ("ref11.html" ("DOUBLE" . 1018338) ("FREQUENCY" . 1018340) ("SPATIAL" . 1018342) ("WAVELET" . 1018344)))
-    ("WV_FN_HAAR" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref12.html"))
-    ("WV_FN_MORLET" fun nil (system) "Result = %s( [Order] [, Scale, N])" ("ref13.html" ("DOUBLE" . 1009779) ("FREQUENCY" . 1015564) ("SPATIAL" . 1015558) ("WAVELET" . 1009789)))
-    ("WV_FN_PAUL" fun nil (system) "Result = %s( [Order] [, Scale, N])" ("ref14.html" ("DOUBLE" . 1010078) ("FREQUENCY" . 1015576) ("SPATIAL" . 1010080) ("WAVELET" . 1010082)))
-    ("WV_FN_SYMLET" fun nil (system) "Result = %s( [Order, Scaling, Wavelet, Ioff, Joff] )" ("ref15.html"))
-    ("WV_PLOT3D_WPS" fun nil (system) "Result = %s( Array [, X] [, Y])" ("ref18.html" ("GROUP_LEADER" . 1006236) ("SURFACE_STYLE" . 1015696) ("TITLE" . 1006239) ("UNITS" . 1006241) ("XTITLE" . 1006243) ("XUNITS" . 1006245) ("YTITLE" . 1006247) ("YUNITS" . 1006249)))
-    ("WV_PLOT_MULTIRES" fun nil (system) "Result = %s( Array [, X] [, Y])" ("ref19.html" ("GROUP_LEADER" . 1008291) ("TITLE" . 1008295) ("UNITS" . 1008298) ("XTITLE" . 1008301) ("XUNITS" . 1008304) ("YTITLE" . 1008307) ("YUNITS" . 1008310)))
-    ("WV_PWT" fun nil (system) "Result = %s( A, Scaling, Wavelet, Ioff, Joff)" ("ref20.html" ("DOUBLE" . 1006192) ("INVERSE" . 1006194)))
-    ("WV_TOOL_DENOISE" fun nil (system) "Result = %s( Array [, X] [, Y])" ("ref21.html" ("GROUP_LEADER" . 1008330) ("TITLE" . 1008334) ("UNITS" . 1008337) ("XTITLE" . 1008340) ("XUNITS" . 1008343) ("YTITLE" . 1008346) ("YUNITS" . 1008349)))
-    ("XFONT" fun nil (system) "Result = %s()" ("X4.html" ("GROUP" . 762100) ("PRESERVE_FONT_INFO" . 762103)))
-    ("XREGISTERED" fun nil (system) "Result = %s(Name)" ("X16.html" ("NOSHOW" . 762898)))
-    ("XSQ_TEST" fun nil (system) "Result = %s( Obfreq, Exfreq)" ("X18.html" ("EXCELL" . 137437) ("OBCELL" . 137440) ("RESIDUAL" . 137443)))
-    ("Add" pro "IDL_Container" (system) "Obj->[%s::]%s, Objects" ("objects_misc5.html" ("POSITION" . 1010605)))
-    ("Cleanup" pro "IDL_Container" (system) "Obj->[%s::]%s" ("objects_misc6.html"))
-    ("Move" pro "IDL_Container" (system) "Obj->[%s::]%s, Source, Destination" ("objects_misc11.html"))
-    ("Remove" pro "IDL_Container" (system) "Obj->[%s::]%s [, Child_object]" ("objects_misc12.html" ("ALL" . 1010855) ("POSITION" . 1010857)))
-    ("Count" fun "IDL_Container" (system) "Result = Obj->[%s::]%s()" ("objects_misc7.html"))
-    ("Get" fun "IDL_Container" (system) "Result = Obj->[%s::]%s ()" ("objects_misc8.html" ("ALL" . 1010708) ("COUNT" . 1010710) ("ISA" . 1010712) ("POSITION" . 1010715)))
-    ("Init" fun "IDL_Container" (system) "Result = Obj->[%s::]%s()" ("objects_misc9.html" ))
-    ("IsContained" fun "IDL_Container" (system) "Result = Obj->[%s::]%s( Object)" ("objects_misc10.html" ("POSITION" . 1010785)))
-    ("IDL" pro "IDL_Savefile" (system) "Obj->[IDL_Savefile::]IDL_Savefile::Cleanup" ("objects_misc15.html"))
-    ("Restore" pro "IDL_Savefile" (system) "Obj->[%s::]%s, SaveItem" ("objects_misc19.html" ("COMMON" . 1034877) ("FUNCTION" . 1034881) ("NEW_HEAPVAR" . 1034884) ("OBJECT_HEAPVAR" . 1034892) ("POINTER_HEAPVAR" . 1034898) ("PROCEDURE" . 1034904) ("RESTORED_OBJECTS" . 1034907) ("STRUCTURE_DEFINITION" . 1034910) ("VERBOSE" . 1034913)))
-    ("Contents" fun "IDL_Savefile" (system) "Result = Obj->[%s::]%s()" ("objects_misc16.html"))
-    ("IDL" fun "IDL_Savefile" (system) "Result = Obj->[IDL_Savefile::]IDL_Savefile::Init([, Filename])" ("objects_misc17.html" ("FILENAME" . 1034717) ("RELAXED_STRUCTURE_ASSIGNMENT" . 1034721)))
-    ("Names" fun "IDL_Savefile" (system) "Result = Obj->[%s::]%s()" ("objects_misc18.html" ("COMMON_BLOCK" . 1034777) ("COMMON_VARIABLE" . 1034780) ("COUNT" . 1034783) ("FUNCTION" . 1034786) ("OBJECT_HEAPVAR" . 1034789) ("POINTER_HEAPVAR" . 1034800) ("PROCEDURE" . 1034811) ("STRUCTURE_DEFINITION" . 1034814) ("SYSTEM_VARIABLE" . 1034817)))
-    ("Size" fun "IDL_Savefile" (system) "Result = Obj->[%s::]%s(SaveItem [, Keywords])" ("objects_misc20.html"))
-    ("AppendData" pro "IDLanROI" (system) "Obj->[%s::]%s, X [, Y] [, Z]" ("objects_an5.html" ("XRANGE" . 1003740) ("YRANGE" . 1003742) ("ZRANGE" . 1003744)))
-    ("Cleanup" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an6.html"))
-    ("GetProperty" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an10.html" ) ("objects_an4.html" ("ALL" . 1011351) ("BLOCK_SIZE" . 1011320) ("DATA" . 1011322) ("DOUBLE" . 1011324) ("INTERIOR" . 1011326) ("N_VERTS" . 1011660) ("ROI_XRANGE" . 1011699) ("ROI_YRANGE" . 1011726) ("ROI_ZRANGE" . 1011728) ("TYPE" . 1011328)))
-    ("RemoveData" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an12.html" ("COUNT" . 1004077) ("START" . 1004079) ("XRANGE" . 1004081) ("YRANGE" . 1004083) ("ZRANGE" . 1004085)))
-    ("ReplaceData" pro "IDLanROI" (system) "Obj->[%s::]%s, X[, Y[, Z]]" ("objects_an13.html" ("FINISH" . 1004123) ("START" . 1004130) ("XRANGE" . 1004136) ("YRANGE" . 1004138) ("ZRANGE" . 1004140)))
-    ("Rotate" pro "IDLanROI" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_an14.html" ("CENTER" . 1004176)))
-    ("Scale" pro "IDLanROI" (system) "Obj->[%s::]%s, Sx[, Sy[, Sz]]" ("objects_an15.html"))
-    ("SetProperty" pro "IDLanROI" (system) "Obj->[%s::]%s" ("objects_an16.html" ) ("objects_an4.html" ("BLOCK_SIZE" . 1011320) ("DATA" . 1011322) ("DOUBLE" . 1011324) ("INTERIOR" . 1011326)))
-    ("Translate" pro "IDLanROI" (system) "Obj->[%s::]%s, Tx[, Ty[, Tz]]" ("objects_an17.html"))
-    ("ComputeGeometry" fun "IDLanROI" (system) "Result = Obj->[%s::]%s()" ("objects_an7.html" ("AREA" . 1003819) ("CENTROID" . 1003821) ("PERIMETER" . 1003823) ("SPATIAL_OFFSET" . 1003825) ("SPATIAL_SCALE" . 1003827)))
-    ("ComputeMask" fun "IDLanROI" (system) "Result = Obj->[%s::]%s()" ("objects_an8.html" ("DIMENSIONS" . 1003872) ("INITIALIZE" . 1003874) ("LOCATION" . 1003879) ("MASK_IN" . 1003881) ("MASK_RULE" . 1003883) ("PIXEL_CENTER" . 1003888) ("PLANE_NORMAL" . 1011165) ("PLANE_XAXIS" . 1003890) ("RUN_LENGTH" . 1003892)))
-    ("ContainsPoints" fun "IDLanROI" (system) "Result = Obj->[%s::]%s( X [, Y [, Z]] )" ("objects_an9.html"))
-    ("Init" fun "IDLanROI" (system) "Result = Obj->[%s::]%s([, X [, Y [, Z]]])" ("objects_an11.html" ) ("objects_an4.html" ("BLOCK_SIZE" . 1011320) ("DATA" . 1011322) ("DOUBLE" . 1011324) ("INTERIOR" . 1011326) ("TYPE" . 1011328)))
-    ("Add" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, ROI" ("objects_an20.html"))
-    ("Cleanup" pro "IDLanROIGroup" (system) "Obj->[%s::]%s" ("objects_an21.html"))
-    ("GetProperty" pro "IDLanROIGroup" (system) "Obj->[%s::]%s" ("objects_an25.html" ) ("objects_an19.html" ("ALL" . 1011995) ("ROIGROUP_XRANGE" . 1011998) ("ROIGROUP_YRANGE" . 1012000) ("ROIGROUP_ZRANGE" . 1012002)))
-    ("Rotate" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_an27.html" ("CENTER" . 1004731)))
-    ("Scale" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, Sx[, Sy[, Sz]]" ("objects_an28.html"))
-    ("Translate" pro "IDLanROIGroup" (system) "Obj->[%s::]%s, Tx[, Ty[, Tz]]" ("objects_an29.html"))
-    ("ComputeMask" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s()" ("objects_an22.html" ("DIMENSIONS" . 1004482) ("INITIALIZE" . 1004484) ("LOCATION" . 1004489) ("MASK_IN" . 1004491) ("MASK_RULE" . 1004493) ("PLANE_NORMAL" . 1004498) ("PLANE_XAXIS" . 1004500) ("RUN_LENGTH" . 1004502)))
-    ("ComputeMesh" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s( Vertices, Conn)" ("objects_an23.html" ("CAPPED" . 1004551) ("SURFACE_AREA" . 1004556)))
-    ("ContainsPoints" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s( X[, Y[, Z]] )" ("objects_an24.html"))
-    ("Init" fun "IDLanROIGroup" (system) "Result = Obj->[%s::]%s()" ("objects_an26.html" ))
-    ("GetProperty" pro "IDLcomIDispatch" (system) "Obj->[%s::]%s" ("objects_misc25.html" ("KEYWORD")))
-    ("SetProperty" pro "IDLcomIDispatch" (system) "Obj->[%s::]%s" ("objects_misc27.html" ("KEYWORD")))
-    ("Init" fun "IDLcomIDispatchCLSID" (system) "Result = Obj -> [%s::]%s()" ("objects_misc26.html"))
-    ("Init" fun "IDLcomIDispatchPROGID" (system) "Result = Obj -> [%s::]%s()" ("objects_misc26.html"))
-    ("Connect" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s" ("api8.html" ("CONNECTION" . 998610) ("DATASOURCE" . 998682) ("PASSWORD" . 998786) ("USER_ID" . 998733)))
-    ("ExecuteSQL" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s, strSQL" ("api9.html"))
-    ("GetProperty" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s" ("api11.html" ) ("api7.html" ("CAN_GET_TABLES" . 1029718) ("DBMS_NAME" . 1029721) ("DBMS_VERSION" . 1029727) ("DRIVER_ODBC_LEVEL" . 1029724) ("DRIVER_VERSION" . 1029730) ("IS_CONNECTED" . 1029733) ("IS_READONLY" . 1029736) ("MAX_CONNECTIONS" . 1029739) ("MAX_RECORDSETS" . 1029742) ("ODBC_LEVEL" . 1029745) ("SQL_LEVEL" . 1029748) ("SQL_SERVER_NAME" . 1029751) ("USE_CURSOR_LIB" . 1029754) ("USER_NAME" . 1029760)))
-    ("SetProperty" pro "IDLdbDatabase" (system) "DBobj -> [%s::]%s" ("api13.html" ) ("api7.html" ("USE_CURSOR_LIB" . 1029754) ("VERBOSE" . 1029819)))
-    ("GetDatasources" fun "IDLdbDatabase" (system) "Datasources = DBobj -> [%s::]%s()" ("api10.html"))
-    ("GetTables" fun "IDLdbDatabase" (system) "Tables = DBobj -> [%s::]%s()" ("api12.html"))
-    ("AddRecord" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s[, field1[, field2[, ...[, fieldn]]]]" ("api16.html" ("SET_AUTOINCREMENT" . 1014791)))
-    ("DeleteRecord" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s" ("api18.html"))
-    ("GetProperty" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s" ("api20.html" ) ("api15.html" ("CAN_MOVE_ABSOLUTE" . 1030659) ("CAN_MOVE_FIRST" . 1030662) ("CAN_MOVE_LAST" . 1030665) ("CAN_MOVE_NEXT" . 1030668) ("CAN_MOVE_PRIOR" . 1030671) ("CAN_MOVE_RELATIVE" . 1030674) ("FIELD_INFO" . 1030677) ("GET_DATABASE" . 1030697) ("IS_READONLY" . 1030700) ("N_BUFFERS" . 1030703) ("RECORDSET_SOURCE" . 1030706)))
-    ("SetField" pro "IDLdbRecordset" (system) "RSobj -> [%s::]%s, iFieldNumber, Value" ("api24.html" ("NULL" . 1014812)))
-    ("CurrentRecord" fun "IDLdbRecordset" (system) "number = RSobj -> [%s::]%s()" ("api17.html"))
-    ("GetField" fun "IDLdbRecordset" (system) "value = RSobj -> [%s::]%s(iFieldNumber)" ("api19.html" ("IS_NULL" . 1013507) ("NULL_VALUE" . 1013559)))
-    ("GetRecord" fun "IDLdbRecordset" (system) "Result = RSobj -> [%s::]%s()" ("api21.html"))
-    ("MoveCursor" fun "IDLdbRecordset" (system) "Result = RSobj -> [%s::]%s()" ("api22.html" ("ABSOLUTE" . 1001009) ("FIRST" . 1001067) ("LAST" . 1001125) ("NEXT" . 1001187) ("PRIOR" . 1001255) ("RELATIVE" . 1001313)))
-    ("NFields" fun "IDLdbRecordset" (system) "status = RSobj -> [%s::]%s()" ("api23.html"))
-    ("Cleanup" pro "IDLffDICOM" (system) "Obj->[%s::]%s" ("objects_ff6.html"))
-    ("DumpElements" pro "IDLffDICOM" (system) "Obj->[%s::]%s [, Filename]" ("objects_ff7.html"))
-    ("Reset" pro "IDLffDICOM" (system) "Obj->[%s::]%s" ("objects_ff20.html"))
-    ("GetChildren" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s(Reference)" ("objects_ff8.html"))
-    ("GetDescription" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff9.html" ("REFERENCE" . 1004342)))
-    ("GetGroup" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group[, Element]])" ("objects_ff11.html" ("REFERENCE" . 1004455)))
-    ("GetLength" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff12.html" ("REFERENCE" . 1004513)))
-    ("GetParent" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s(ReferenceList)" ("objects_ff13.html"))
-    ("GetPreamble" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s()" ("objects_ff14.html"))
-    ("GetReference" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff15.html" ("DESCRIPTION" . 1004671) ("VR" . 1004673)))
-    ("GetValue" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([Group [, Element]])" ("objects_ff16.html" ("NO_COPY" . 1004738) ("REFERENCE" . 1004736)))
-    ("GetVR" fun "IDLffDICOM" (system) "array = Obj->[%s::]%s([Group [, Element]])" ("objects_ff17.html" ("REFERENCE" . 1004843)))
-    ("Init" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s([, Filename])" ("objects_ff18.html" ) ("objects_ff5.html" ("VERBOSE" . 1024027)))
-    ("Read" fun "IDLffDICOM" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_ff19.html" ("ENDIAN" . 1004946)))
-    ("Cleanup" pro "IDLffDXF" (system) "Obj->[%s::]%s" ("objects_ff23.html"))
-    ("GetPalette" pro "IDLffDXF" (system) "Obj->[%s::]%s, Red, Green, Blue" ("objects_ff26.html"))
-    ("PutEntity" pro "IDLffDXF" (system) "Obj->[%s::]%s, Data" ("objects_ff28.html"))
-    ("RemoveEntity" pro "IDLffDXF" (system) "Obj->[%s::]%s[, Type]" ("objects_ff30.html" ("INDEX" . 1006265)))
-    ("Reset" pro "IDLffDXF" (system) "Obj->[%s::]%s" ("objects_ff31.html"))
-    ("SetPalette" pro "IDLffDXF" (system) "Obj->[%s::]%s, Red, Green, Blue" ("objects_ff32.html"))
-    ("GetContents" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s( [Filter])" ("objects_ff24.html" ("BLOCK" . 1005307) ("COUNT" . 1005309) ("LAYER" . 1005311)))
-    ("GetEntity" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s(Type)" ("objects_ff25.html" ("BLOCK" . 1005352) ("INDEX" . 1005354) ("LAYER" . 1005356)))
-    ("Init" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s([, Filename] )" ("objects_ff27.html" ))
-    ("Read" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_ff29.html"))
-    ("Write" fun "IDLffDXF" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_ff33.html"))
-    ("SetData" pro "IDLffJPEG2000" (system) "Obj->[%s::]%s ([P1, ..., Pn])" ("objects_ff42.html" ("COMPONENT" . 1141582) ("ORDER" . 1141585) ("TILE_INDEX" . 1141588)))
-    ("GetData" fun "IDLffJPEG2000" (system) "Result = Obj->[%s::]%s()" ("objects_ff38.html" ("COMPONENT" . 1141336) ("DISCARD_LEVELS" . 1141339) ("MAX_LAYERS" . 1141342) ("N_COMPONENTS" . 1141345) ("ORDER" . 1141348) ("REGION" . 1141351) ("RGB" . 1141355) ("TILE_INDEX" . 1141363)))
-    ("Init" fun "IDLffJPEG2000" (system) "Result = Obj->[%s::]%s(, Filename)" ("objects_ff41.html" ) ("objects_ff36.html" ("BIT_DEPTH" . 1140492) ("COMMENT" . 1140557) ("DIMENSIONS" . 1140585) ("DISPLAY_RESOLUTION" . 1140613) ("FILENAME" . 1140643) ("N_COMPONENTS" . 1181381) ("N_LAYERS" . 1140729) ("N_LEVELS" . 1140758) ("OFFSET" . 1140815) ("PALETTE" . 1140843) ("PERSISTENT" . 1140875) ("PROGRESSION" . 1140903) ("QUIET" . 1140953) ("READ" . 1140981) ("REVERSIBLE" . 1141009) ("SIGNED" . 1141037) ("TILE_DIMENSIONS" . 1141095) ("TILE_OFFSET" . 1141123) ("WRITE" . 1141181) ("XML" . 1141209) ("YCC" . 1141237)))
-    ("Cleanup" pro "IDLffLangCat" (system) "Obj->[%s::]%s" ("objects_ff47.html"))
-    ("GetProperty" pro "IDLffLangCat" (system) "Obj->[%s::]%s" ("objects_ff48.html" ) ("objects_ff45.html" ("APP_NAME" . 1126713) ("APP_PATH" . 1126741) ("AVAILABLE_LANGUAGES" . 1126769) ("DEFAULT_KEYS" . 1126797) ("DEFAULT_LANGUAGE" . 1126825) ("DEFAULT_N_KEYS" . 1126853) ("FILENAME" . 1126881) ("KEYS" . 1126909) ("LANGUAGE" . 1126937) ("N_KEYS" . 1126965) ("VERBOSE" . 1126993)))
-    ("SetProperty" pro "IDLffLangCat" (system) "Obj->[%s::]%s" ("objects_ff51.html" ) ("objects_ff45.html" ("LANGUAGE" . 1126937) ("VERBOSE" . 1126993)))
-    ("AppendCatalog" fun "IDLffLangCat" (system) "Result = Obj->[%s::]%s()" ("objects_ff46.html" ("APP_NAME" . 1127041) ("APP_PATH" . 1127050) ("FILENAME" . 1127056)))
-    ("Init" fun "IDLffLangCat" (system) "Result = Obj->[%s::]%s" ("objects_ff49.html" ("CONTINUE_ON_ERROR" . 1127135)) ("objects_ff45.html" ("APP_NAME" . 1126713) ("APP_PATH" . 1126741) ("DEFAULT_LANGUAGE" . 1126825) ("FILENAME" . 1126881) ("LANGUAGE" . 1126937) ("VERBOSE" . 1126993)))
-    ("Query" fun "IDLffLangCat" (system) "Result = Obj->[%s::]%s( Key)" ("objects_ff50.html" ("DEFAULT_STRING" . 1127154)))
-    ("Cleanup" pro "IDLffMrSID" (system) "Obj->[%s::]%s" ("objects_ff54.html"))
-    ("GetProperty" pro "IDLffMrSID" (system) "Obj->[%s::]%s" ("objects_ff57.html" ("CHANNELS" . 1006873) ("DIMENSIONS" . 1006875) ("GEO_ORIGIN" . 1064441) ("GEO_PROJTYPE" . 1064460) ("GEO_RESOLUTION" . 1064466) ("GEO_VALID" . 1064449) ("LEVELS" . 1006877) ("PIXEL_TYPE" . 1006879) ("TYPE" . 1006884)))
-    ("GetDimsAtLevel" fun "IDLffMrSID" (system) "Result = Obj->[%s::]%s (Level)" ("objects_ff55.html"))
-    ("GetImageData" fun "IDLffMrSID" (system) "Result = Obj->[%s::]%s ()" ("objects_ff56.html" ("LEVEL" . 1006785) ("SUB_RECT" . 1006788)))
-    ("Init" fun "IDLffMrSID" (system) "Result = Obj->[%s::]%s(, Filename)" ("objects_ff58.html" ) ("objects_ff53.html" ("QUIET" . 1026758)))
-    ("AddAttribute" pro "IDLffShape" (system) "Obj->[%s::]%s, Name, Type, Width" ("objects_ff62.html" ("PRECISION" . 1007582)))
-    ("Cleanup" pro "IDLffShape" (system) "Obj->[%s::]%s" ("objects_ff63.html"))
-    ("Close" pro "IDLffShape" (system) "Obj->[%s::]%s" ("objects_ff64.html"))
-    ("DestroyEntity" pro "IDLffShape" (system) "Obj->[%s::]%s, Entity" ("objects_ff65.html"))
-    ("GetProperty" pro "IDLffShape" (system) "Obj->[%s::]%s" ("objects_ff68.html" ) ("objects_ff61.html" ("ATTRIBUTE_INFO" . 1027034) ("ATTRIBUTE_NAMES" . 1027309) ("ENTITY_TYPE" . 1027088) ("FILENAME" . 1027353) ("IS_OPEN" . 1027563) ("N_ATTRIBUTES" . 1027361) ("N_ENTITIES" . 1027330) ("N_RECORDS" . 1027328)))
-    ("PutEntity" pro "IDLffShape" (system) "Obj->[%s::]%s, Data" ("objects_ff71.html"))
-    ("SetAttributes" pro "IDLffShape" (system) "Obj->[%s::]%s, Index, Attribute_Num, Value or Obj->[%s::]%s, Index, Attributes" ("objects_ff72.html"))
-    ("GetAttributes" fun "IDLffShape" (system) "Result = Obj->[%s::]%s([Index])" ("objects_ff66.html" ("ALL" . 1007785) ("ATTRIBUTE_STUCTURE" . 1007787)))
-    ("GetEntity" fun "IDLffShape" (system) "Result = Obj->[%s::]%s([Index])" ("objects_ff67.html" ("ALL" . 1007853) ("ATTRIBUTES" . 1007855)))
-    ("Init" fun "IDLffShape" (system) "Result = Obj->[%s::]%s([, Filename])" ("objects_ff69.html" ) ("objects_ff61.html" ("DBF_ONLY" . 1027319) ("ENTITY_TYPE" . 1027088) ("UPDATE" . 1027071)))
-    ("Open" fun "IDLffShape" (system) "Result = Obj->[%s::]%s( `Filename')" ("objects_ff70.html" ("DBF_ONLY" . 1008149) ("ENTITY_TYPE" . 1008154) ("UPDATE" . 1054733)))
-    ("SetValue" pro "IDLffXMLDOMAttr" (system) "Obj->[%s::]%s, Value" ("objects_ff81.html"))
-    ("GetName" fun "IDLffXMLDOMAttr" (system) "Result = Obj->[%s::]%s()" ("objects_ff77.html"))
-    ("GetSpecified" fun "IDLffXMLDOMAttr" (system) "Result = Obj->[%s::]%s()" ("objects_ff78.html"))
-    ("GetValue" fun "IDLffXMLDOMAttr" (system) "Result = Obj->[%s::]%s()" ("objects_ff79.html"))
-    ("AppendData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, String" ("objects_ff88.html"))
-    ("DeleteData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, Offset, Count" ("objects_ff90.html"))
-    ("InsertData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, Offset, String" ("objects_ff94.html"))
-    ("ReplaceData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, Offset, Count, String" ("objects_ff95.html"))
-    ("SetData" pro "IDLffXMLDOMCharacterData" (system) "Obj->[%s::]%s, String" ("objects_ff96.html"))
-    ("GetData" fun "IDLffXMLDOMCharacterData" (system) "Result = Obj->[%s::]%s()" ("objects_ff91.html"))
-    ("GetLength" fun "IDLffXMLDOMCharacterData" (system) "Result = Obj->[%s::]%s()" ("objects_ff92.html"))
-    ("SubstringData" fun "IDLffXMLDOMCharacterData" (system) "Result = Obj->[%s::]%s( Offset, Count )" ("objects_ff97.html"))
-    ("Cleanup" pro "IDLffXMLDOMDocument" (system) "Obj->[%s::]%s" ("objects_ff104.html"))
-    ("Load" pro "IDLffXMLDOMDocument" (system) "Obj->[%s::]%s" ("objects_ff117.html" ("EXCLUDE_IGNORABLE_WHITESPACE" . 1128132) ("EXPAND_ENTITY_REFERENCES" . 1128141) ("FILENAME" . 1128144) ("MSG_ERROR" . 1128147) ("MSG_FATAL" . 1128154) ("MSG_WARNING" . 1128160) ("QUIET" . 1128166) ("VALIDATION_MODE" . 1128169)))
-    ("Save" pro "IDLffXMLDOMDocument" (system) "Obj->[%s::]%s" ("objects_ff118.html" ("EXPAND_ENTITY_REFERENCES" . 1128198) ("FILENAME" . 1128201) ("PRETTY_PRINT" . 1128204)))
-    ("CreateAttribute" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff105.html"))
-    ("CreateCDATASection" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( String )" ("objects_ff106.html"))
-    ("CreateComment" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( String )" ("objects_ff107.html"))
-    ("CreateDocumentFragment" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff108.html"))
-    ("CreateElement" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( TagName )" ("objects_ff109.html"))
-    ("CreateEntityReference" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff110.html"))
-    ("CreateProcessingInstruction" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( Target, Data )" ("objects_ff111.html"))
-    ("CreateTextNode" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( String )" ("objects_ff112.html"))
-    ("GetDoctype" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff113.html"))
-    ("GetDocumentElement" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff114.html"))
-    ("GetElementsByTagName" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s( TagName )" ("objects_ff115.html"))
-    ("Init" fun "IDLffXMLDOMDocument" (system) "Result = Obj->[%s::]%s()" ("objects_ff116.html" ("EXCLUDE_IGNORABLE_WHITESPACE" . 1128039) ("EXPAND_ENTITY_REFERENCES" . 1128048) ("FILENAME" . 1128051) ("MSG_ERROR" . 1128054) ("MSG_FATAL" . 1128061) ("MSG_WARNING" . 1128067) ("QUIET" . 1128073) ("VALIDATION_MODE" . 1128076)))
-    ("GetEntities" fun "IDLffXMLDOMDocumentType" (system) "Result = Obj->[%s::]%s()" ("objects_ff126.html"))
-    ("GetName" fun "IDLffXMLDOMDocumentType" (system) "Result = Obj->[%s::]%s()" ("objects_ff127.html"))
-    ("GetNotations" fun "IDLffXMLDOMDocumentType" (system) "Result = Obj->[%s::]%s()" ("objects_ff128.html"))
-    ("SetAttribute" pro "IDLffXMLDOMElement" (system) "Obj->[%s::]%s, Name, Value" ("objects_ff140.html"))
-    ("GetAttribute" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff133.html"))
-    ("GetAttributeNode" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff134.html"))
-    ("GetElementsByTagName" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( TagName )" ("objects_ff135.html"))
-    ("GetTagName" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s()" ("objects_ff136.html"))
-    ("RemoveAttribute" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff138.html"))
-    ("RemoveAttributeNode" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( OldAttr )" ("objects_ff139.html"))
-    ("SetAttributeNode" fun "IDLffXMLDOMElement" (system) "Result = Obj->[%s::]%s( NewAttr )" ("objects_ff141.html"))
-    ("GetNotationName" fun "IDLffXMLDOMEntity" (system) "Result = Obj->[%s::]%s()" ("objects_ff145.html"))
-    ("GetPublicId" fun "IDLffXMLDOMEntity" (system) "Result = Obj->[%s::]%s()" ("objects_ff146.html"))
-    ("GetSystemId" fun "IDLffXMLDOMEntity" (system) "Result = Obj->[%s::]%s()" ("objects_ff147.html"))
-    ("GetLength" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s()" ("objects_ff156.html"))
-    ("GetNamedItem" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff157.html"))
-    ("Item" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Index )" ("objects_ff159.html"))
-    ("RemoveNamedItem" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Name )" ("objects_ff160.html"))
-    ("SetNamedItem" fun "IDLffXMLDOMNamedNodeMap" (system) "Result = Obj->[%s::]%s( Node )" ("objects_ff161.html"))
-    ("SetNodeValue" pro "IDLffXMLDOMNode" (system) "Obj->[%s::]%s( NodeValue )" ("objects_ff183.html"))
-    ("AppendChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( NewChild )" ("objects_ff164.html"))
-    ("CloneNode" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff166.html" ("DEEP" . 1129314)))
-    ("GetAttributes" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff167.html"))
-    ("GetChildNodes" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff168.html"))
-    ("GetFirstChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff169.html"))
-    ("GetLastChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff170.html"))
-    ("GetNextSibling" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff171.html"))
-    ("GetNodeName" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff172.html"))
-    ("GetNodeType" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff173.html"))
-    ("GetNodeValue" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff174.html"))
-    ("GetOwnerDocument" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff175.html"))
-    ("GetParentNode" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff176.html"))
-    ("GetPreviousSibling" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff177.html"))
-    ("HasChildNodes" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s()" ("objects_ff178.html"))
-    ("InsertBefore" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( NewChild [, RefChild] )" ("objects_ff180.html"))
-    ("RemoveChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( OldChild )" ("objects_ff181.html"))
-    ("ReplaceChild" fun "IDLffXMLDOMNode" (system) "Result = Obj->[%s::]%s( NewChild, OldChild )" ("objects_ff182.html"))
-    ("GetLength" fun "IDLffXMLDOMNodeList" (system) "Result = Obj->[%s::]%s()" ("objects_ff187.html"))
-    ("Item" fun "IDLffXMLDOMNodeList" (system) "Result = Obj->[%s::]%s( Index )" ("objects_ff189.html"))
-    ("GetPublicId" fun "IDLffXMLDOMNotation" (system) "Result = Obj->[%s::]%s()" ("objects_ff193.html"))
-    ("GetSystemId" fun "IDLffXMLDOMNotation" (system) "Result = Obj->[%s::]%s()" ("objects_ff194.html"))
-    ("SetData" pro "IDLffXMLDOMProcessingInstruction" (system) "Obj->[%s::]%s, Content" ("objects_ff202.html"))
-    ("GetData" fun "IDLffXMLDOMProcessingInstruction" (system) "Result = Obj->[%s::]%s()" ("objects_ff199.html"))
-    ("GetTarget" fun "IDLffXMLDOMProcessingInstruction" (system) "Result = Obj->[%s::]%s()" ("objects_ff200.html"))
-    ("IsIgnorableWhitespace" fun "IDLffXMLDOMText" (system) "Result = Obj->[%s::]%s()" ("objects_ff207.html"))
-    ("SplitText" fun "IDLffXMLDOMText" (system) "Result = Obj->[%s::]%s( Offset )" ("objects_ff208.html"))
-    ("AttributeDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, eName, aName, Type, Mode, Value" ("objects_ff211.html"))
-    ("Characters" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Chars" ("objects_ff212.html"))
-    ("Cleanup" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff213.html"))
-    ("Comment" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Comment" ("objects_ff214.html"))
-    ("ElementDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, Model" ("objects_ff215.html"))
-    ("EndCDATA" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff216.html"))
-    ("EndDocument" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff217.html"))
-    ("EndDTD" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff218.html"))
-    ("EndElement" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, URI, Local, qName" ("objects_ff219.html"))
-    ("EndEntity" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name" ("objects_ff220.html"))
-    ("EndPrefixMapping" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Prefix" ("objects_ff221.html"))
-    ("Error" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, SystemID, LineNumber, ColumnNumber, Message" ("objects_ff222.html"))
-    ("ExternalEntityDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID" ("objects_ff223.html"))
-    ("FatalError" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, SystemID, LineNumber, ColumnNumber, Message" ("objects_ff224.html"))
-    ("GetProperty" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff225.html" ) ("objects_ff210.html" ("FILENAME" . 1027975) ("NAMESPACE_PREFIXES" . 1028045) ("PARSER_LOCATION" . 1028043) ("PARSER_PUBLICID" . 1027979) ("PARSER_URI" . 1027981) ("SCHEMA_CHECKING" . 1027990) ("VALIDATION_MODE" . 1028403)))
-    ("IgnorableWhitespace" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Chars" ("objects_ff226.html"))
-    ("InternalEntityDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, Value" ("objects_ff228.html"))
-    ("NotationDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID" ("objects_ff229.html"))
-    ("ParseFile" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Filename" ("objects_ff230.html"))
-    ("ProcessingInstruction" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Target, Data" ("objects_ff231.html"))
-    ("SetProperty" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff232.html" ) ("objects_ff210.html" ("NAMESPACE_PREFIXES" . 1028045) ("SCHEMA_CHECKING" . 1027990) ("VALIDATION_MODE" . 1028403)))
-    ("SkippedEntity" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name" ("objects_ff233.html"))
-    ("StartCDATA" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff234.html"))
-    ("StartDocument" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff235.html"))
-    ("StartDTD" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID" ("objects_ff236.html"))
-    ("StartElement" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, URI, Local, qName [, attName, attValue]" ("objects_ff237.html"))
-    ("StartEntity" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name" ("objects_ff238.html"))
-    ("StartPrefixmapping" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Prefix, URI" ("objects_ff239.html"))
-    ("StopParsing" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s" ("objects_ff240.html"))
-    ("UnparsedEntityDecl" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, Name, PublicID, SystemID, Notation" ("objects_ff241.html"))
-    ("Warning" pro "IDLffXMLSAX" (system) "Obj->[%s::]%s, SystemID, LineNumber, ColumnNumber, Message" ("objects_ff242.html"))
-    ("Init" fun "IDLffXMLSAX" (system) "Result = Obj->[%s::]%s()" ("objects_ff227.html" ) ("objects_ff210.html" ("NAMESPACE_PREFIXES" . 1028045) ("SCHEMA_CHECKING" . 1027990) ("VALIDATION_MODE" . 1028403)))
-    ("Cleanup" pro "IDLgrAxis" (system) "Obj->[%s::]%s" ("objects_gr5.html"))
-    ("GetProperty" pro "IDLgrAxis" (system) "Obj->[%s::]%s" ("objects_gr7.html" ) ("objects_gr4.html" ("ALL" . 1045686) ("ALPHA_CHANNEL" . 1486818) ("AM_PM" . 1045715) ("CLIP_PLANES" . 1045717) ("COLOR" . 1045723) ("CRANGE" . 1047485) ("DAYS_OF_WEEK" . 1045725) ("DEPTH_TEST_DISABLE" . 1045727) ("DEPTH_TEST_FUNCTION" . 1093233) ("DEPTH_WRITE_DISABLE" . 1093333) ("DIRECTION" . 1093366) ("EXACT" . 1045730) ("EXTEND" . 1045732) ("GRIDSTYLE" . 1045735) ("HIDE" . 1048340) ("LOCATION" . 1048266) ("LOG" . 1045756) ("MAJOR" . 1045758) ("MINOR" . 1045760) ("MONTHS" . 1045762) ("NOTEXT" . 1045766) ("PALETTE" . 1045768) ("PARENT" . 1047517) ("RANGE" . 1045770) ("SUBTICKLEN" . 1093445) ("TEXTALIGNMENTS" . 1045774) ("TEXTBASELINE" . 1048408) ("TEXTPOS" . 1045782) ("TEXTUPDIR" . 1045815) ("THICK" . 1045821) ("TICKDIR" . 1045823) ("TICKFORMAT" . 1565506) ("TICKFRMTDATA" . 1565556) ("TICKINTERVAL" . 1045845) ("TICKLAYOUT" . 1045848) ("TICKLEN" . 1045855) ("TICKTEXT" . 1362754) ("TICKUNITS" . 1362791) ("TICKVALUES" . 1281692) ("TITLE" . 1045882) ("USE_TEXT_COLOR" . 1045887) ("XCOORD_CONV" . 1045891) ("XRANGE" . 1047679) ("YCOORD_CONV" . 1045897) ("YRANGE" . 1047646) ("ZCOORD_CONV" . 1045903) ("ZRANGE" . 1047606)))
-    ("SetProperty" pro "IDLgrAxis" (system) "Obj->[%s::]%s" ("objects_gr9.html" ) ("objects_gr4.html" ("ALPHA_CHANNEL" . 1486818) ("AM_PM" . 1045715) ("CLIP_PLANES" . 1045717) ("COLOR" . 1045723) ("DAYS_OF_WEEK" . 1045725) ("DEPTH_TEST_DISABLE" . 1045727) ("DEPTH_TEST_FUNCTION" . 1093233) ("DEPTH_WRITE_DISABLE" . 1093333) ("DIRECTION" . 1093366) ("EXACT" . 1045730) ("EXTEND" . 1045732) ("GRIDSTYLE" . 1045735) ("HIDE" . 1048340) ("LOCATION" . 1048266) ("LOG" . 1045756) ("MAJOR" . 1045758) ("MINOR" . 1045760) ("MONTHS" . 1045762) ("NOTEXT" . 1045766) ("RANGE" . 1045770) ("SUBTICKLEN" . 1093445) ("TEXTALIGNMENTS" . 1045774) ("TEXTBASELINE" . 1048408) ("TEXTPOS" . 1045782) ("TEXTUPDIR" . 1045815) ("THICK" . 1045821) ("TICKDIR" . 1045823) ("TICKFORMAT" . 1565506) ("TICKFRMTDATA" . 1565556) ("TICKINTERVAL" . 1045845) ("TICKLAYOUT" . 1045848) ("TICKLEN" . 1045855) ("TICKTEXT" . 1362754) ("TICKUNITS" . 1362791) ("TICKVALUES" . 1281692) ("TITLE" . 1045882) ("USE_TEXT_COLOR" . 1045887) ("XCOORD_CONV" . 1045891) ("YCOORD_CONV" . 1045897) ("ZCOORD_CONV" . 1045903)))
-    ("GetCTM" fun "IDLgrAxis" (system) "Result = Obj->[%s::]%s()" ("objects_gr6.html" ("DESTINATION" . 1092556) ("PATH" . 1007341) ("TOP" . 1007347)))
-    ("Init" fun "IDLgrAxis" (system) "Result = Obj->[%s::]%s([, Direction])" ("objects_gr8.html" ) ("objects_gr4.html" ("ALPHA_CHANNEL" . 1486818) ("AM_PM" . 1045715) ("CLIP_PLANES" . 1045717) ("COLOR" . 1045723) ("DAYS_OF_WEEK" . 1045725) ("DEPTH_TEST_DISABLE" . 1045727) ("DEPTH_TEST_FUNCTION" . 1093233) ("DEPTH_WRITE_DISABLE" . 1093333) ("DIRECTION" . 1093366) ("EXACT" . 1045730) ("EXTEND" . 1045732) ("GRIDSTYLE" . 1045735) ("HIDE" . 1048340) ("LOCATION" . 1048266) ("LOG" . 1045756) ("MAJOR" . 1045758) ("MINOR" . 1045760) ("MONTHS" . 1045762) ("NOTEXT" . 1045766) ("RANGE" . 1045770) ("REGISTER_PROPERTIES" . 1045772) ("SUBTICKLEN" . 1093445) ("TEXTALIGNMENTS" . 1045774) ("TEXTBASELINE" . 1048408) ("TEXTPOS" . 1045782) ("TEXTUPDIR" . 1045815) ("THICK" . 1045821) ("TICKDIR" . 1045823) ("TICKFORMAT" . 1565506) ("TICKFRMTDATA" . 1565556) ("TICKINTERVAL" . 1045845) ("TICKLAYOUT" . 1045848) ("TICKLEN" . 1045855) ("TICKTEXT" . 1362754) ("TICKUNITS" . 1362791) ("TICKVALUES" . 1281692) ("TITLE" . 1045882) ("USE_TEXT_COLOR" . 1045887) ("XCOORD_CONV" . 1045891) ("YCOORD_CONV" . 1045897) ("ZCOORD_CONV" . 1045903)))
-    ("Cleanup" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr12.html"))
-    ("Draw" pro "IDLgrBuffer" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr13.html" ("CREATE_INSTANCE" . 1007844) ("DRAW_INSTANCE" . 1007846)))
-    ("Erase" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr14.html" ("COLOR" . 1007879)))
-    ("GetDeviceInfo" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr16.html" ("ALL" . 1007957) ("MAX_NUM_CLIP_PLANES" . 1007959) ("MAX_TEXTURE_DIMENSIONS" . 1007961) ("MAX_VIEWPORT_DIMENSIONS" . 1007963) ("NAME" . 1007965) ("NUM_CPUS" . 1007967) ("VENDOR" . 1007970) ("VERSION" . 1007972)))
-    ("GetProperty" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr18.html" ) ("objects_gr11.html" ("ALL" . 1050118) ("COLOR_MODEL" . 1050137) ("DIMENSIONS" . 1050141) ("GRAPHICS_TREE" . 1050143) ("IMAGE_DATA" . 1050202) ("N_COLORS" . 1092707) ("PALETTE" . 1050147) ("QUALITY" . 1050149) ("RESOLUTION" . 1093499) ("SCREEN_DIMENSIONS" . 1050191) ("UNITS" . 1050189) ("ZBUFFER_DATA" . 1050181)))
-    ("SetProperty" pro "IDLgrBuffer" (system) "Obj->[%s::]%s" ("objects_gr24.html" ) ("objects_gr11.html" ("COLOR_MODEL" . 1050137) ("DIMENSIONS" . 1050141) ("GRAPHICS_TREE" . 1050143) ("PALETTE" . 1050147) ("QUALITY" . 1050149) ("RESOLUTION" . 1093499) ("UNITS" . 1050189)))
-    ("GetContiguousPixels" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s()" ("objects_gr15.html"))
-    ("GetFontnames" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr17.html" ("IDL_FONTS" . 1008013) ("STYLES" . 1008015)))
-    ("GetTextDimensions" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr19.html" ("DESCENT" . 1008088) ("PATH" . 1008090)))
-    ("Init" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s()" ("objects_gr20.html" ) ("objects_gr11.html" ("COLOR_MODEL" . 1050137) ("DIMENSIONS" . 1050141) ("GRAPHICS_TREE" . 1050143) ("N_COLORS" . 1092707) ("PALETTE" . 1050147) ("QUALITY" . 1050149) ("REGISTER_PROPERTIES" . 1050154) ("RESOLUTION" . 1093499) ("UNITS" . 1050189)))
-    ("PickData" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s( View, Object, Location, XYZLocation)" ("objects_gr21.html" ("DIMENSIONS" . 1008204) ("PATH" . 1008208) ("PICK_STATUS" . 1008214)))
-    ("Read" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s()" ("objects_gr22.html"))
-    ("Select" fun "IDLgrBuffer" (system) "Result = Obj->[%s::]%s(Picture, XY)" ("objects_gr23.html" ("DIMENSIONS" . 1008316) ("ORDER" . 1008320) ("SUB_SELECTION" . 1343723) ("UNITS" . 1008323)))
-    ("Cleanup" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr27.html"))
-    ("Draw" pro "IDLgrClipboard" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr28.html" ("CMYK" . 1345463) ("FILENAME" . 1008514) ("POSTSCRIPT" . 1008516) ("VECT_SHADING" . 1340124) ("VECT_SORTING" . 1340189) ("VECT_TEXT_RENDER_METHOD" . 1340235) ("VECTOR" . 1008518)))
-    ("GetDeviceInfo" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr30.html" ("ALL" . 1008688) ("MAX_NUM_CLIP_PLANES" . 1008690) ("MAX_TEXTURE_DIMENSIONS" . 1008692) ("MAX_VIEWPORT_DIMENSIONS" . 1008694) ("NAME" . 1008696) ("NUM_CPUS" . 1008698) ("VENDOR" . 1008701) ("VERSION" . 1008703)))
-    ("GetProperty" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr32.html" ) ("objects_gr26.html" ("ALL" . 1050377) ("COLOR_MODEL" . 1050391) ("DIMENSIONS" . 1050395) ("GRAPHICS_TREE" . 1050397) ("N_COLORS" . 1050399) ("PALETTE" . 1050401) ("QUALITY" . 1050403) ("RESOLUTION" . 1093541) ("SCREEN_DIMENSIONS" . 1050442) ("UNITS" . 1050439)))
-    ("SetProperty" pro "IDLgrClipboard" (system) "Obj->[%s::]%s" ("objects_gr35.html" ) ("objects_gr26.html" ("DIMENSIONS" . 1050395) ("GRAPHICS_TREE" . 1050397) ("PALETTE" . 1050401) ("QUALITY" . 1050403) ("RESOLUTION" . 1093541) ("UNITS" . 1050439)))
-    ("GetContiguousPixels" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s()" ("objects_gr29.html"))
-    ("GetFontnames" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr31.html" ("IDL_FONTS" . 1008744) ("STYLES" . 1008746)))
-    ("GetTextDimensions" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr33.html" ("DESCENT" . 1008820) ("PATH" . 1008822)))
-    ("Init" fun "IDLgrClipboard" (system) "Result = Obj->[%s::]%s()" ("objects_gr34.html" ) ("objects_gr26.html" ("COLOR_MODEL" . 1050391) ("DIMENSIONS" . 1050395) ("GRAPHICS_TREE" . 1050397) ("N_COLORS" . 1050399) ("PALETTE" . 1050401) ("QUALITY" . 1050403) ("REGISTER_PROPERTIES" . 1050408) ("RESOLUTION" . 1093541) ("UNITS" . 1050439)))
-    ("Cleanup" pro "IDLgrColorbar" (system) "Obj->[%s::]%s" ("objects_gr38.html"))
-    ("GetProperty" pro "IDLgrColorbar" (system) "Obj->[%s::]%s" ("objects_gr40.html" ) ("objects_gr37.html" ("ALL" . 1050584) ("BLUE_VALUES" . 1050601) ("COLOR" . 1050603) ("DIMENSIONS" . 1050605) ("GREEN_VALUES" . 1050607) ("HIDE" . 1050609) ("MAJOR" . 1050613) ("MINOR" . 1050615) ("PALETTE" . 1050619) ("PARENT" . 1050728) ("RED_VALUES" . 1050726) ("SHOW_AXIS" . 1050623) ("SHOW_OUTLINE" . 1050628) ("SUBTICKLEN" . 1050632) ("THICK" . 1050634) ("THREED" . 1050636) ("TICKFORMAT" . 1050638) ("TICKFRMTDATA" . 1050643) ("TICKLEN" . 1050645) ("TICKTEXT" . 1050647) ("TICKVALUES" . 1050649) ("TITLE" . 1050651) ("XCOORD_CONV" . 1050655) ("XRANGE" . 1050718) ("YCOORD_CONV" . 1050716) ("YRANGE" . 1050708) ("ZCOORD_CONV" . 1050706) ("ZRANGE" . 1050697)))
-    ("SetProperty" pro "IDLgrColorbar" (system) "Obj->[%s::]%s" ("objects_gr42.html" ) ("objects_gr37.html" ("BLUE_VALUES" . 1050601) ("COLOR" . 1050603) ("DIMENSIONS" . 1050605) ("GREEN_VALUES" . 1050607) ("HIDE" . 1050609) ("MAJOR" . 1050613) ("MINOR" . 1050615) ("PALETTE" . 1050619) ("RED_VALUES" . 1050726) ("SHOW_AXIS" . 1050623) ("SHOW_OUTLINE" . 1050628) ("SUBTICKLEN" . 1050632) ("THICK" . 1050634) ("THREED" . 1050636) ("TICKFORMAT" . 1050638) ("TICKFRMTDATA" . 1050643) ("TICKLEN" . 1050645) ("TICKTEXT" . 1050647) ("TICKVALUES" . 1050649) ("TITLE" . 1050651) ("XCOORD_CONV" . 1050655) ("YCOORD_CONV" . 1050716) ("ZCOORD_CONV" . 1050706)))
-    ("ComputeDimensions" fun "IDLgrColorbar" (system) "Result = Obj->[%s::]%s( DestinationObj)" ("objects_gr39.html" ("PATH" . 1009084)))
-    ("Init" fun "IDLgrColorbar" (system) "Result = Obj->[%s::]%s([, aRed, aGreen, aBlue])" ("objects_gr41.html" ) ("objects_gr37.html" ("BLUE_VALUES" . 1050601) ("COLOR" . 1050603) ("DIMENSIONS" . 1050605) ("GREEN_VALUES" . 1050607) ("HIDE" . 1050609) ("MAJOR" . 1050613) ("MINOR" . 1050615) ("PALETTE" . 1050619) ("RED_VALUES" . 1050726) ("SHOW_AXIS" . 1050623) ("SHOW_OUTLINE" . 1050628) ("SUBTICKLEN" . 1050632) ("THICK" . 1050634) ("THREED" . 1050636) ("TICKFORMAT" . 1050638) ("TICKFRMTDATA" . 1050643) ("TICKLEN" . 1050645) ("TICKTEXT" . 1050647) ("TICKVALUES" . 1050649) ("TITLE" . 1050651) ("XCOORD_CONV" . 1050655) ("YCOORD_CONV" . 1050716) ("ZCOORD_CONV" . 1050706)))
-    ("AdjustLabelOffsets" pro "IDLgrContour" (system) "Obj->[%s::]%s, LevelIndex, LabelOffsets" ("objects_gr45.html"))
-    ("Cleanup" pro "IDLgrContour" (system) "Obj->[%s::]%s" ("objects_gr46.html"))
-    ("GetLabelInfo" pro "IDLgrContour" (system) "Obj->[%s::]%s, Destination, LevelIndex" ("objects_gr48.html" ("LABEL_OBJECTS" . 1009508) ("LABEL_OFFSETS" . 1009503) ("LABEL_POLYLINES" . 1009505)))
-    ("GetProperty" pro "IDLgrContour" (system) "Obj->[%s::]%s" ("objects_gr49.html" ) ("objects_gr44.html" ("ALL" . 1050990) ("ALPHA_CHANNEL" . 1312243) ("AM_PM" . 1051012) ("ANISOTROPY" . 1051014) ("C_COLOR" . 1051029) ("C_FILL_PATTERN" . 1051031) ("C_LABEL_INTERVAL" . 1051033) ("C_LABEL_NOGAPS" . 1051035) ("C_LABEL_OBJECTS" . 1051037) ("C_LABEL_SHOW" . 1051044) ("C_LINESTYLE" . 1051046) ("C_THICK" . 1051056) ("C_USE_LABEL_COLOR" . 1066031) ("C_USE_LABEL_ORIENTATION" . 1051060) ("C_VALUE" . 1051062) ("CLIP_PLANES" . 1051064) ("COLOR" . 1051069) ("DATA_VALUES" . 1051071) ("DAYS_OF_WEEK" . 1051073) ("DEPTH_OFFSET" . 1051075) ("DEPTH_TEST_DISABLE" . 1051081) ("DEPTH_TEST_FUNCTION" . 1093566) ("DEPTH_WRITE_DISABLE" . 1093567) ("DOUBLE_DATA" . 1093568) ("DOUBLE_GEOM" . 1051083) ("DOWNHILL" . 1051085) ("FILL" . 1051087) ("GEOM" . 1051284) ("HIDE" . 1051101) ("LABEL_FONT" . 1051105) ("LABEL_FORMAT" . 1051107) ("LABEL_UNITS" . 1051116) ("MAX_VALUE" . 1051130) ("MIN_VALUE" . 1051134) ("MONTHS" . 1051132) ("N_LEVELS" . 1051138) ("PARENT" . 1051274) ("PLANAR" . 1051272) ("POLYGONS" . 1051144) ("SHADE_RANGE" . 1094439) ("SHADING" . 1051149) ("TICKINTERVAL" . 1051154) ("TICKLEN" . 1051156) ("USE_TEXT_ALIGNMENTS" . 1051158) ("XCOORD_CONV" . 1051162) ("XRANGE" . 1051264) ("YCOORD_CONV" . 1051168) ("YRANGE" . 1051250) ("ZCOORD_CONV" . 1051174) ("ZRANGE" . 1051240)))
-    ("SetProperty" pro "IDLgrContour" (system) "Obj->[%s::]%s" ("objects_gr51.html" ) ("objects_gr44.html" ("ALPHA_CHANNEL" . 1312243) ("AM_PM" . 1051012) ("ANISOTROPY" . 1051014) ("C_COLOR" . 1051029) ("C_FILL_PATTERN" . 1051031) ("C_LABEL_INTERVAL" . 1051033) ("C_LABEL_NOGAPS" . 1051035) ("C_LABEL_OBJECTS" . 1051037) ("C_LABEL_SHOW" . 1051044) ("C_LINESTYLE" . 1051046) ("C_THICK" . 1051056) ("C_USE_LABEL_COLOR" . 1066031) ("C_USE_LABEL_ORIENTATION" . 1051060) ("C_VALUE" . 1051062) ("CLIP_PLANES" . 1051064) ("COLOR" . 1051069) ("DATA_VALUES" . 1051071) ("DAYS_OF_WEEK" . 1051073) ("DEPTH_OFFSET" . 1051075) ("DEPTH_TEST_DISABLE" . 1051081) ("DEPTH_TEST_FUNCTION" . 1093566) ("DEPTH_WRITE_DISABLE" . 1093567) ("DOUBLE_DATA" . 1093568) ("DOUBLE_GEOM" . 1051083) ("DOWNHILL" . 1051085) ("FILL" . 1051087) ("GEOMX" . 1051282) ("GEOMY" . 1051091) ("GEOMZ" . 1051093) ("HIDE" . 1051101) ("LABEL_FONT" . 1051105) ("LABEL_FORMAT" . 1051107) ("LABEL_UNITS" . 1051116) ("MAX_VALUE" . 1051130) ("MIN_VALUE" . 1051134) ("MONTHS" . 1051132) ("N_LEVELS" . 1051138) ("PLANAR" . 1051272) ("POLYGONS" . 1051144) ("SHADE_RANGE" . 1094439) ("SHADING" . 1051149) ("TICKINTERVAL" . 1051154) ("TICKLEN" . 1051156) ("USE_TEXT_ALIGNMENTS" . 1051158) ("XCOORD_CONV" . 1051162) ("YCOORD_CONV" . 1051168) ("ZCOORD_CONV" . 1051174)))
-    ("GetCTM" fun "IDLgrContour" (system) "Result = Obj->[%s::]%s()" ("objects_gr47.html" ("DESTINATION" . 1009456) ("PATH" . 1009458) ("TOP" . 1009464)))
-    ("Init" fun "IDLgrContour" (system) "Result = Obj->[%s::]%s([, Values])" ("objects_gr50.html" ) ("objects_gr44.html" ("ALPHA_CHANNEL" . 1312243) ("AM_PM" . 1051012) ("ANISOTROPY" . 1051014) ("C_COLOR" . 1051029) ("C_FILL_PATTERN" . 1051031) ("C_LABEL_INTERVAL" . 1051033) ("C_LABEL_NOGAPS" . 1051035) ("C_LABEL_OBJECTS" . 1051037) ("C_LABEL_SHOW" . 1051044) ("C_LINESTYLE" . 1051046) ("C_THICK" . 1051056) ("C_USE_LABEL_COLOR" . 1066031) ("C_USE_LABEL_ORIENTATION" . 1051060) ("C_VALUE" . 1051062) ("CLIP_PLANES" . 1051064) ("COLOR" . 1051069) ("DATA_VALUES" . 1051071) ("DAYS_OF_WEEK" . 1051073) ("DEPTH_OFFSET" . 1051075) ("DEPTH_TEST_DISABLE" . 1051081) ("DEPTH_TEST_FUNCTION" . 1093566) ("DEPTH_WRITE_DISABLE" . 1093567) ("DOUBLE_DATA" . 1093568) ("DOUBLE_GEOM" . 1051083) ("DOWNHILL" . 1051085) ("FILL" . 1051087) ("GEOMX" . 1051282) ("GEOMY" . 1051091) ("GEOMZ" . 1051093) ("HIDE" . 1051101) ("LABEL_FONT" . 1051105) ("LABEL_FORMAT" . 1051107) ("LABEL_FRMTDATA" . 1051113) ("LABEL_UNITS" . 1051116) ("MAX_VALUE" . 1051130) ("MIN_VALUE" . 1051134) ("MONTHS" . 1051132) ("N_LEVELS" . 1051138) ("PALETTE" . 1051140) ("PLANAR" . 1051272) ("POLYGONS" . 1051144) ("REGISTER_PROPERTIES" . 1051147) ("SHADE_RANGE" . 1094439) ("SHADING" . 1051149) ("TICKINTERVAL" . 1051154) ("TICKLEN" . 1051156) ("USE_TEXT_ALIGNMENTS" . 1051158) ("XCOORD_CONV" . 1051162) ("YCOORD_CONV" . 1051168) ("ZCOORD_CONV" . 1051174)))
-    ("Cleanup" pro "IDLgrFont" (system) "Obj->[%s::]%s" ("objects_gr54.html"))
-    ("GetProperty" pro "IDLgrFont" (system) "Obj->[%s::]%s" ("objects_gr55.html" ) ("objects_gr53.html" ("ALL" . 1051913) ("SIZE" . 1051936) ("SUBSTITUTE" . 1051938) ("THICK" . 1051940)))
-    ("SetProperty" pro "IDLgrFont" (system) "Obj->[%s::]%s" ("objects_gr57.html" ) ("objects_gr53.html" ("SIZE" . 1051936) ("SUBSTITUTE" . 1051938) ("THICK" . 1051940)))
-    ("Init" fun "IDLgrFont" (system) "Result = Obj->[%s::]%s([, Fontname])" ("objects_gr56.html" ) ("objects_gr53.html" ("SIZE" . 1051936) ("SUBSTITUTE" . 1051938) ("THICK" . 1051940)))
-    ("Cleanup" pro "IDLgrImage" (system) "Obj->[%s::]%s" ("objects_gr60.html"))
-    ("GetProperty" pro "IDLgrImage" (system) "Obj->[%s::]%s" ("objects_gr62.html" ) ("objects_gr59.html" ("ALL" . 1052050) ("BLEND_FUNCTION" . 1052068) ("CHANNEL" . 1052124) ("CLIP_PLANES" . 1287882) ("DATA" . 1052132) ("DEPTH_TEST_DISABLE" . 1095165) ("DEPTH_TEST_FUNCTION" . 1095212) ("DEPTH_WRITE_DISABLE" . 1095251) ("DIMENSIONS" . 1095169) ("GREYSCALE" . 1052136) ("HIDE" . 1052140) ("INTERLEAVE" . 1052144) ("INTERPOLATE" . 1052150) ("LOCATION" . 1052152) ("NO_COPY" . 1052156) ("ORDER" . 1052158) ("PALETTE" . 1052160) ("PARENT" . 1052253) ("SUB_RECT" . 1052171) ("XCOORD_CONV" . 1052175) ("XRANGE" . 1052243) ("YCOORD_CONV" . 1052181) ("YRANGE" . 1052233) ("ZCOORD_CONV" . 1052187) ("ZRANGE" . 1052223)))
-    ("SetProperty" pro "IDLgrImage" (system) "Obj->[%s::]%s" ("objects_gr64.html" ) ("objects_gr59.html" ("BLEND_FUNCTION" . 1052068) ("CHANNEL" . 1052124) ("CLIP_PLANES" . 1287882) ("DATA" . 1052132) ("DEPTH_TEST_DISABLE" . 1095165) ("DEPTH_TEST_FUNCTION" . 1095212) ("DEPTH_WRITE_DISABLE" . 1095251) ("DIMENSIONS" . 1095169) ("GREYSCALE" . 1052136) ("HIDE" . 1052140) ("INTERLEAVE" . 1052144) ("INTERPOLATE" . 1052150) ("LOCATION" . 1052152) ("NO_COPY" . 1052156) ("ORDER" . 1052158) ("PALETTE" . 1052160) ("RESET_DATA" . 1093772) ("SHARE_DATA" . 1052169) ("SUB_RECT" . 1052171) ("XCOORD_CONV" . 1052175) ("YCOORD_CONV" . 1052181) ("ZCOORD_CONV" . 1052187)))
-    ("GetCTM" fun "IDLgrImage" (system) "Result = Obj->[%s::]%s()" ("objects_gr61.html" ("DESTINATION" . 1010164) ("PATH" . 1010166) ("TOP" . 1010172)))
-    ("Init" fun "IDLgrImage" (system) "Result = Obj->[%s::]%s([, ImageData])" ("objects_gr63.html" ) ("objects_gr59.html" ("BLEND_FUNCTION" . 1052068) ("CHANNEL" . 1052124) ("CLIP_PLANES" . 1287882) ("DATA" . 1052132) ("DEPTH_TEST_DISABLE" . 1095165) ("DEPTH_TEST_FUNCTION" . 1095212) ("DEPTH_WRITE_DISABLE" . 1095251) ("DIMENSIONS" . 1095169) ("GREYSCALE" . 1052136) ("HIDE" . 1052140) ("INTERLEAVE" . 1052144) ("INTERPOLATE" . 1052150) ("LOCATION" . 1052152) ("NO_COPY" . 1052156) ("ORDER" . 1052158) ("PALETTE" . 1052160) ("REGISTER_PROPERTIES" . 1052251) ("RESET_DATA" . 1093772) ("SHARE_DATA" . 1052169) ("SUB_RECT" . 1052171) ("XCOORD_CONV" . 1052175) ("YCOORD_CONV" . 1052181) ("ZCOORD_CONV" . 1052187)))
-    ("Cleanup" pro "IDLgrLegend" (system) "Obj->[%s::]%s" ("objects_gr67.html"))
-    ("GetProperty" pro "IDLgrLegend" (system) "Obj->[%s::]%s" ("objects_gr69.html" ) ("objects_gr66.html" ("ALL" . 1053896) ("BORDER_GAP" . 1053903) ("COLUMNS" . 1053905) ("FILL_COLOR" . 1053907) ("FONT" . 1053909) ("GAP" . 1053912) ("GLYPH_WIDTH" . 1053914) ("HIDE" . 1053916) ("ITEM_COLOR" . 1069308) ("ITEM_LINESTYLE" . 1053922) ("ITEM_NAME" . 1053935) ("ITEM_OBJECT" . 1053937) ("ITEM_THICK" . 1053940) ("ITEM_TYPE" . 1053942) ("OUTLINE_COLOR" . 1053948) ("OUTLINE_THICK" . 1053950) ("PARENT" . 1055362) ("SHOW_FILL" . 1053952) ("SHOW_OUTLINE" . 1053956) ("TEXT_COLOR" . 1053960) ("TITLE" . 1053962) ("XCOORD_CONV" . 1053966) ("XRANGE" . 1055399) ("YCOORD_CONV" . 1053972) ("YRANGE" . 1055389) ("ZCOORD_CONV" . 1053978) ("ZRANGE" . 1070059)))
-    ("SetProperty" pro "IDLgrLegend" (system) "Obj->[%s::]%s" ("objects_gr71.html" ) ("objects_gr66.html" ("BORDER_GAP" . 1053903) ("COLUMNS" . 1053905) ("FILL_COLOR" . 1053907) ("FONT" . 1053909) ("GAP" . 1053912) ("GLYPH_WIDTH" . 1053914) ("HIDE" . 1053916) ("ITEM_COLOR" . 1069308) ("ITEM_LINESTYLE" . 1053922) ("ITEM_NAME" . 1053935) ("ITEM_OBJECT" . 1053937) ("ITEM_THICK" . 1053940) ("ITEM_TYPE" . 1053942) ("OUTLINE_COLOR" . 1053948) ("OUTLINE_THICK" . 1053950) ("RECOMPUTE" . 1055360) ("SHOW_FILL" . 1053952) ("SHOW_OUTLINE" . 1053956) ("TEXT_COLOR" . 1053960) ("TITLE" . 1053962) ("XCOORD_CONV" . 1053966) ("YCOORD_CONV" . 1053972) ("ZCOORD_CONV" . 1053978)))
-    ("ComputeDimensions" fun "IDLgrLegend" (system) "Result = Obj->[%s::]%s( DestinationObject)" ("objects_gr68.html" ("PATH" . 1010563)))
-    ("Init" fun "IDLgrLegend" (system) "Result = Obj->[%s::]%s([, aItemNames])" ("objects_gr70.html" ) ("objects_gr66.html" ("BORDER_GAP" . 1053903) ("COLUMNS" . 1053905) ("FILL_COLOR" . 1053907) ("FONT" . 1053909) ("GAP" . 1053912) ("GLYPH_WIDTH" . 1053914) ("HIDE" . 1053916) ("ITEM_COLOR" . 1069308) ("ITEM_LINESTYLE" . 1053922) ("ITEM_NAME" . 1053935) ("ITEM_OBJECT" . 1053937) ("ITEM_THICK" . 1053940) ("ITEM_TYPE" . 1053942) ("OUTLINE_COLOR" . 1053948) ("OUTLINE_THICK" . 1053950) ("SHOW_FILL" . 1053952) ("SHOW_OUTLINE" . 1053956) ("TEXT_COLOR" . 1053960) ("TITLE" . 1053962) ("XCOORD_CONV" . 1053966) ("YCOORD_CONV" . 1053972) ("ZCOORD_CONV" . 1053978)))
-    ("Cleanup" pro "IDLgrLight" (system) "Obj->[%s::]%s" ("objects_gr74.html"))
-    ("GetProperty" pro "IDLgrLight" (system) "Obj->[%s::]%s" ("objects_gr76.html" ) ("objects_gr73.html" ("ALL" . 1055555) ("ATTENUATION" . 1055572) ("COLOR" . 1055581) ("CONEANGLE" . 1055583) ("DIRECTION" . 1055585) ("FOCUS" . 1055588) ("HIDE" . 1055590) ("INTENSITY" . 1055595) ("LOCATION" . 1055597) ("PALETTE" . 1088211) ("PARENT" . 1055635) ("TYPE" . 1093801) ("XCOORD_CONV" . 1055609) ("YCOORD_CONV" . 1055615) ("ZCOORD_CONV" . 1055621)))
-    ("SetProperty" pro "IDLgrLight" (system) "Obj->[%s::]%s" ("objects_gr78.html" ) ("objects_gr73.html" ("ATTENUATION" . 1055572) ("COLOR" . 1055581) ("CONEANGLE" . 1055583) ("DIRECTION" . 1055585) ("FOCUS" . 1055588) ("HIDE" . 1055590) ("INTENSITY" . 1055595) ("LOCATION" . 1055597) ("PALETTE" . 1088211) ("TYPE" . 1093801) ("XCOORD_CONV" . 1055609) ("YCOORD_CONV" . 1055615) ("ZCOORD_CONV" . 1055621)))
-    ("GetCTM" fun "IDLgrLight" (system) "Result = Obj->[%s::]%s()" ("objects_gr75.html" ("DESTINATION" . 1010900) ("PATH" . 1010902) ("TOP" . 1010908)))
-    ("Init" fun "IDLgrLight" (system) "Result = Obj->[%s::]%s()" ("objects_gr77.html" ) ("objects_gr73.html" ("ATTENUATION" . 1055572) ("COLOR" . 1055581) ("CONEANGLE" . 1055583) ("DIRECTION" . 1055585) ("FOCUS" . 1055588) ("HIDE" . 1055590) ("INTENSITY" . 1055595) ("LOCATION" . 1055597) ("PALETTE" . 1088211) ("REGISTER_PROPERTIES" . 1088158) ("TYPE" . 1093801) ("XCOORD_CONV" . 1055609) ("YCOORD_CONV" . 1055615) ("ZCOORD_CONV" . 1055621)))
-    ("Add" pro "IDLgrModel" (system) "Obj->[%s::]%s, Object" ("objects_gr81.html" ("ALIAS" . 1011206) ("POSITION" . 1011208)))
-    ("Cleanup" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr82.html"))
-    ("Draw" pro "IDLgrModel" (system) "Obj->[%s::]%s, Destination, Picture" ("objects_gr83.html"))
-    ("GetProperty" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr86.html" ) ("objects_gr80.html" ("ALL" . 1055726) ("CLIP_PLANES" . 1055740) ("DEPTH_TEST_DISABLE" . 1094976) ("DEPTH_TEST_FUNCTION" . 1095322) ("DEPTH_WRITE_DISABLE" . 1095361) ("HIDE" . 1088312) ("LIGHTING" . 1055751) ("PARENT" . 1055781) ("SELECT_TARGET" . 1093831) ("TRANSFORM" . 1055764)))
-    ("Reset" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr88.html"))
-    ("Rotate" pro "IDLgrModel" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_gr89.html" ("PREMULTIPLY" . 1011584)))
-    ("Scale" pro "IDLgrModel" (system) "Obj->[%s::]%s, Sx, Sy, Sz" ("objects_gr90.html" ("PREMULTIPLY" . 1011618)))
-    ("SetProperty" pro "IDLgrModel" (system) "Obj->[%s::]%s" ("objects_gr91.html" ) ("objects_gr80.html" ("CLIP_PLANES" . 1055740) ("DEPTH_TEST_DISABLE" . 1094976) ("DEPTH_TEST_FUNCTION" . 1095322) ("DEPTH_WRITE_DISABLE" . 1095361) ("HIDE" . 1088312) ("LIGHTING" . 1055751) ("SELECT_TARGET" . 1093831) ("TRANSFORM" . 1055764)))
-    ("Translate" pro "IDLgrModel" (system) "Obj->[%s::]%s, Tx, Ty, Tz" ("objects_gr92.html" ("PREMULTIPLY" . 1011687)))
-    ("GetByName" fun "IDLgrModel" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr84.html"))
-    ("GetCTM" fun "IDLgrModel" (system) "Result = Obj->[%s::]%s()" ("objects_gr85.html" ("DESTINATION" . 1011369) ("PATH" . 1011371) ("TOP" . 1011377)))
-    ("Init" fun "IDLgrModel" (system) "Result = Obj->[%s::]%s()" ("objects_gr87.html" ) ("objects_gr80.html" ("CLIP_PLANES" . 1055740) ("DEPTH_TEST_DISABLE" . 1094976) ("DEPTH_TEST_FUNCTION" . 1095322) ("DEPTH_WRITE_DISABLE" . 1095361) ("HIDE" . 1088312) ("LIGHTING" . 1055751) ("REGISTER_PROPERTIES" . 1055779) ("SELECT_TARGET" . 1093831) ("TRANSFORM" . 1055764)))
-    ("Cleanup" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr95.html"))
-    ("GetProperty" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr96.html" ) ("objects_gr94.html" ("ALL" . 1055838) ("BITRATE" . 1055845) ("FILENAME" . 1055875) ("FORMAT" . 1055877) ("FRAME_RATE" . 1055881) ("IFRAME_GAP" . 1055927) ("INTERLACED" . 1055934) ("MOTION_VEC_LENGTH" . 1055936) ("QUALITY" . 1055964) ("SCALE" . 1055967) ("STATISTICS" . 1055969)))
-    ("Put" pro "IDLgrMPEG" (system) "Obj->[%s::]%s, Image[, Frame]" ("objects_gr98.html"))
-    ("Save" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr99.html" ("FILENAME" . 1012062)))
-    ("SetProperty" pro "IDLgrMPEG" (system) "Obj->[%s::]%s" ("objects_gr100.html" ) ("objects_gr94.html" ("BITRATE" . 1055845) ("FILENAME" . 1055875) ("FORMAT" . 1055877) ("FRAME_RATE" . 1055881) ("IFRAME_GAP" . 1055927) ("INTERLACED" . 1055934) ("MOTION_VEC_LENGTH" . 1055936) ("QUALITY" . 1055964) ("SCALE" . 1055967) ("STATISTICS" . 1055969)))
-    ("Init" fun "IDLgrMPEG" (system) "Result = Obj->[%s::]%s()" ("objects_gr97.html" ) ("objects_gr94.html" ("BITRATE" . 1055845) ("FILENAME" . 1055875) ("FORMAT" . 1055877) ("FRAME_RATE" . 1055881) ("IFRAME_GAP" . 1055927) ("INTERLACED" . 1055934) ("MOTION_VEC_LENGTH" . 1055936) ("QUALITY" . 1055964) ("SCALE" . 1055967) ("STATISTICS" . 1055969) ("TEMP_DIRECTORY" . 1055971)))
-    ("Cleanup" pro "IDLgrPalette" (system) "Obj->[%s::]%s" ("objects_gr103.html"))
-    ("GetProperty" pro "IDLgrPalette" (system) "Obj->[%s::]%s" ("objects_gr105.html" ) ("objects_gr102.html" ("ALL" . 1056048) ("BLUE_VALUES" . 1056069) ("BOTTOM_STRETCH" . 1056071) ("GAMMA" . 1056073) ("GREEN_VALUES" . 1056075) ("N_COLORS" . 1056093) ("RED_VALUES" . 1056079) ("TOP_STRETCH" . 1056081)))
-    ("LoadCT" pro "IDLgrPalette" (system) "Obj->[%s::]%s, TableNum" ("objects_gr107.html" ("FILE" . 1012379)))
-    ("SetProperty" pro "IDLgrPalette" (system) "Obj->[%s::]%s" ("objects_gr110.html" ) ("objects_gr102.html" ("BLUE_VALUES" . 1056069) ("BOTTOM_STRETCH" . 1056071) ("GAMMA" . 1056073) ("GREEN_VALUES" . 1056075) ("RED_VALUES" . 1056079) ("TOP_STRETCH" . 1056081)))
-    ("SetRGB" pro "IDLgrPalette" (system) "Obj->[%s::]%s, Index, Red, Green, Blue" ("objects_gr109.html"))
-    ("GetRGB" fun "IDLgrPalette" (system) "Result = Obj->[%s::]%s(Index)" ("objects_gr104.html"))
-    ("Init" fun "IDLgrPalette" (system) "Result = Obj->[%s::]%s(, aRed, aGreen, aBlue)" ("objects_gr106.html" ) ("objects_gr102.html" ("BLUE_VALUES" . 1056069) ("BOTTOM_STRETCH" . 1056071) ("GAMMA" . 1056073) ("GREEN_VALUES" . 1056075) ("RED_VALUES" . 1056079) ("TOP_STRETCH" . 1056081)))
-    ("NearestColor" fun "IDLgrPalette" (system) "Result = Obj->[%s::]%s(Red, Green, Blue)" ("objects_gr108.html"))
-    ("Cleanup" pro "IDLgrPattern" (system) "Obj->[%s::]%s" ("objects_gr113.html"))
-    ("GetProperty" pro "IDLgrPattern" (system) "Obj->[%s::]%s" ("objects_gr114.html" ) ("objects_gr112.html" ("ALL" . 1056154) ("ORIENTATION" . 1056165) ("PATTERN" . 1056169) ("SPACING" . 1056171) ("STYLE" . 1056173)))
-    ("SetProperty" pro "IDLgrPattern" (system) "Obj->[%s::]%s" ("objects_gr116.html" ) ("objects_gr112.html" ("ORIENTATION" . 1056165) ("PATTERN" . 1056169) ("SPACING" . 1056171) ("STYLE" . 1056173)))
-    ("Init" fun "IDLgrPattern" (system) "Result = Obj->[%s::]%s([, Style])" ("objects_gr115.html" ) ("objects_gr112.html" ("ORIENTATION" . 1056165) ("PATTERN" . 1056169) ("SPACING" . 1056171) ("STYLE" . 1056173) ("THICK" . 1056179)))
-    ("Cleanup" pro "IDLgrPlot" (system) "Obj->[%s::]%s" ("objects_gr119.html"))
-    ("GetProperty" pro "IDLgrPlot" (system) "Obj->[%s::]%s" ("objects_gr121.html" ) ("objects_gr118.html" ("ALL" . 1056243) ("ALPHA_CHANNEL" . 1056258) ("CLIP_PLANES" . 1314217) ("COLOR" . 1056263) ("DATA" . 1056381) ("DEPTH_TEST_DISABLE" . 1094982) ("DEPTH_TEST_FUNCTION" . 1095444) ("DEPTH_WRITE_DISABLE" . 1095483) ("DOUBLE" . 1056269) ("HIDE" . 1056271) ("HISTOGRAM" . 1092755) ("LINESTYLE" . 1056277) ("MAX_VALUE" . 1056290) ("MIN_VALUE" . 1056292) ("NSUM" . 1056296) ("PALETTE" . 1056298) ("PARENT" . 1056392) ("POLAR" . 1056389) ("SYMBOL" . 1056306) ("THICK" . 1056311) ("VERT_COLORS" . 1056317) ("XCOORD_CONV" . 1056319) ("XRANGE" . 1056325) ("YCOORD_CONV" . 1056327) ("YRANGE" . 1056333) ("ZCOORD_CONV" . 1056335) ("ZRANGE" . 1074286) ("ZVALUE" . 1056400)))
-    ("SetProperty" pro "IDLgrPlot" (system) "Obj->[%s::]%s" ("objects_gr123.html" ) ("objects_gr118.html" ("ALPHA_CHANNEL" . 1056258) ("CLIP_PLANES" . 1314217) ("COLOR" . 1056263) ("DATAX" . 1056378) ("DATAY" . 1056267) ("DEPTH_TEST_DISABLE" . 1094982) ("DEPTH_TEST_FUNCTION" . 1095444) ("DEPTH_WRITE_DISABLE" . 1095483) ("DOUBLE" . 1056269) ("HIDE" . 1056271) ("HISTOGRAM" . 1092755) ("LINESTYLE" . 1056277) ("MAX_VALUE" . 1056290) ("MIN_VALUE" . 1056292) ("NSUM" . 1056296) ("PALETTE" . 1056298) ("POLAR" . 1056389) ("RESET_DATA" . 1093845) ("SHARE_DATA" . 1056304) ("SYMBOL" . 1056306) ("THICK" . 1056311) ("VERT_COLORS" . 1056317) ("XCOORD_CONV" . 1056319) ("XRANGE" . 1056325) ("YCOORD_CONV" . 1056327) ("YRANGE" . 1056333) ("ZCOORD_CONV" . 1056335) ("ZVALUE" . 1056400)))
-    ("GetCTM" fun "IDLgrPlot" (system) "Result = Obj->[%s::]%s()" ("objects_gr120.html" ("DESTINATION" . 1012838) ("PATH" . 1012840) ("TOP" . 1012846)))
-    ("Init" fun "IDLgrPlot" (system) "Result = Obj->[%s::]%s([, [X,] Y])" ("objects_gr122.html" ) ("objects_gr118.html" ("ALPHA_CHANNEL" . 1056258) ("CLIP_PLANES" . 1314217) ("COLOR" . 1056263) ("DATAX" . 1056378) ("DATAY" . 1056267) ("DEPTH_TEST_DISABLE" . 1094982) ("DEPTH_TEST_FUNCTION" . 1095444) ("DEPTH_WRITE_DISABLE" . 1095483) ("DOUBLE" . 1056269) ("HIDE" . 1056271) ("HISTOGRAM" . 1092755) ("LINESTYLE" . 1056277) ("MAX_VALUE" . 1056290) ("MIN_VALUE" . 1056292) ("NSUM" . 1056296) ("PALETTE" . 1056298) ("POLAR" . 1056389) ("REGISTER_PROPERTIES" . 1056302) ("RESET_DATA" . 1093845) ("SHARE_DATA" . 1056304) ("SYMBOL" . 1056306) ("THICK" . 1056311) ("USE_ZVALUE" . 1056313) ("VERT_COLORS" . 1056317) ("XCOORD_CONV" . 1056319) ("XRANGE" . 1056325) ("YCOORD_CONV" . 1056327) ("YRANGE" . 1056333) ("ZCOORD_CONV" . 1056335) ("ZVALUE" . 1056400)))
-    ("Cleanup" pro "IDLgrPolygon" (system) "Obj->[%s::]%s" ("objects_gr126.html"))
-    ("GetProperty" pro "IDLgrPolygon" (system) "Obj->[%s::]%s" ("objects_gr128.html" ) ("objects_gr125.html" ("ALL" . 1056563) ("ALPHA_CHANNEL" . 1316054) ("AMBIENT" . 1309898) ("BOTTOM" . 1074388) ("CLIP_PLANES" . 1056581) ("COLOR" . 1056586) ("DATA" . 1309971) ("DEPTH_OFFSET" . 1056590) ("DEPTH_TEST_DISABLE" . 1094995) ("DEPTH_TEST_FUNCTION" . 1095559) ("DEPTH_WRITE_DISABLE" . 1095598) ("DIFFUSE" . 1310292) ("DOUBLE" . 1310286) ("EMISSION" . 1310032) ("FILL_PATTERN" . 1056598) ("HIDE" . 1056602) ("LINESTYLE" . 1056606) ("NORMALS" . 1056621) ("PARENT" . 1056792) ("POLYGONS" . 1056790) ("REJECT" . 1093870) ("SHADE_RANGE" . 1056643) ("SHADING" . 1056645) ("SHININESS" . 1310128) ("SPECULAR" . 1310225) ("STYLE" . 1310253) ("TEXTURE_COORD" . 1214343) ("TEXTURE_INTERP" . 1056664) ("TEXTURE_MAP" . 1056666) ("THICK" . 1056674) ("VERT_COLORS" . 1056679) ("XCOORD_CONV" . 1088401) ("XRANGE" . 1056808) ("YCOORD_CONV" . 1075980) ("YRANGE" . 1056822) ("ZCOORD_CONV" . 1056694) ("ZERO_OPACITY_SKIP" . 1056700) ("ZRANGE" . 1056834)))
-    ("SetProperty" pro "IDLgrPolygon" (system) "Obj->[%s::]%s" ("objects_gr130.html" ) ("objects_gr125.html" ("ALPHA_CHANNEL" . 1316054) ("AMBIENT" . 1309898) ("BOTTOM" . 1074388) ("CLIP_PLANES" . 1056581) ("COLOR" . 1056586) ("DATA" . 1309971) ("DEPTH_OFFSET" . 1056590) ("DEPTH_TEST_DISABLE" . 1094995) ("DEPTH_TEST_FUNCTION" . 1095559) ("DEPTH_WRITE_DISABLE" . 1095598) ("DIFFUSE" . 1310292) ("DOUBLE" . 1310286) ("EMISSION" . 1310032) ("FILL_PATTERN" . 1056598) ("HIDE" . 1056602) ("LINESTYLE" . 1056606) ("NORMALS" . 1056621) ("POLYGONS" . 1056790) ("REJECT" . 1093870) ("RESET_DATA" . 1056641) ("SHADE_RANGE" . 1056643) ("SHADING" . 1056645) ("SHARE_DATA" . 1056650) ("SHININESS" . 1310128) ("SPECULAR" . 1310225) ("STYLE" . 1310253) ("TEXTURE_COORD" . 1214343) ("TEXTURE_INTERP" . 1056664) ("TEXTURE_MAP" . 1056666) ("THICK" . 1056674) ("VERT_COLORS" . 1056679) ("XCOORD_CONV" . 1088401) ("YCOORD_CONV" . 1075980) ("ZCOORD_CONV" . 1056694) ("ZERO_OPACITY_SKIP" . 1056700)))
-    ("GetCTM" fun "IDLgrPolygon" (system) "Result = Obj->[%s::]%s()" ("objects_gr127.html" ("DESTINATION" . 1013188) ("PATH" . 1013190) ("TOP" . 1013196)))
-    ("Init" fun "IDLgrPolygon" (system) "Result = Obj->[%s::]%s([, X [, Y[, Z]]])" ("objects_gr129.html" ) ("objects_gr125.html" ("ALPHA_CHANNEL" . 1316054) ("AMBIENT" . 1309898) ("BOTTOM" . 1074388) ("CLIP_PLANES" . 1056581) ("COLOR" . 1056586) ("DATA" . 1309971) ("DEPTH_OFFSET" . 1056590) ("DEPTH_TEST_DISABLE" . 1094995) ("DEPTH_TEST_FUNCTION" . 1095559) ("DEPTH_WRITE_DISABLE" . 1095598) ("DIFFUSE" . 1310292) ("DOUBLE" . 1310286) ("EMISSION" . 1310032) ("FILL_PATTERN" . 1056598) ("HIDDEN_LINES" . 1056600) ("HIDE" . 1056602) ("LINESTYLE" . 1056606) ("NORMALS" . 1056621) ("PALETTE" . 1056629) ("POLYGONS" . 1056790) ("REGISTER_PROPERTIES" . 1327262) ("REJECT" . 1093870) ("RESET_DATA" . 1056641) ("SHADE_RANGE" . 1056643) ("SHADING" . 1056645) ("SHARE_DATA" . 1056650) ("SHININESS" . 1310128) ("SPECULAR" . 1310225) ("STYLE" . 1310253) ("TEXTURE_COORD" . 1214343) ("TEXTURE_INTERP" . 1056664) ("TEXTURE_MAP" . 1056666) ("THICK" . 1056674) ("VERT_COLORS" . 1056679) ("XCOORD_CONV" . 1088401) ("YCOORD_CONV" . 1075980) ("ZCOORD_CONV" . 1056694) ("ZERO_OPACITY_SKIP" . 1056700)))
-    ("Cleanup" pro "IDLgrPolyline" (system) "Obj->[%s::]%s" ("objects_gr133.html"))
-    ("GetProperty" pro "IDLgrPolyline" (system) "Obj->[%s::]%s" ("objects_gr135.html" ) ("objects_gr132.html" ("ALL" . 1056980) ("ALPHA_CHANNEL" . 1329463) ("CLIP_PLANES" . 1056996) ("COLOR" . 1057001) ("DATA" . 1057003) ("DEPTH_TEST_DISABLE" . 1095001) ("DEPTH_TEST_FUNCTION" . 1095681) ("DEPTH_WRITE_DISABLE" . 1095720) ("DOUBLE" . 1057005) ("HIDE" . 1057007) ("LABEL_NOGAPS" . 1057011) ("LABEL_OBJECTS" . 1057019) ("LABEL_OFFSETS" . 1057017) ("LABEL_POLYLINES" . 1057330) ("LABEL_USE_VERTEX_COLOR" . 1077987) ("LINESTYLE" . 1057029) ("PALETTE" . 1057044) ("PARENT" . 1057101) ("POLYLINES" . 1057099) ("SHADING" . 1057051) ("SYMBOL" . 1057058) ("THICK" . 1057063) ("USE_LABEL_COLOR" . 1057065) ("USE_LABEL_ORIENTATION" . 1057067) ("USE_TEXT_ALIGNMENTS" . 1057069) ("VERT_COLORS" . 1057073) ("XCOORD_CONV" . 1057075) ("XRANGE" . 1057143) ("YCOORD_CONV" . 1057081) ("YRANGE" . 1057133) ("ZCOORD_CONV" . 1077892) ("ZRANGE" . 1057121)))
-    ("SetProperty" pro "IDLgrPolyline" (system) "Obj->[%s::]%s" ("objects_gr137.html" ) ("objects_gr132.html" ("ALPHA_CHANNEL" . 1329463) ("CLIP_PLANES" . 1056996) ("COLOR" . 1057001) ("DATA" . 1057003) ("DEPTH_TEST_DISABLE" . 1095001) ("DEPTH_TEST_FUNCTION" . 1095681) ("DEPTH_WRITE_DISABLE" . 1095720) ("DOUBLE" . 1057005) ("HIDE" . 1057007) ("LABEL_NOGAPS" . 1057011) ("LABEL_OBJECTS" . 1057019) ("LABEL_OFFSETS" . 1057017) ("LABEL_POLYLINES" . 1057330) ("LABEL_USE_VERTEX_COLOR" . 1077987) ("LINESTYLE" . 1057029) ("PALETTE" . 1057044) ("POLYLINES" . 1057099) ("RESET_DATA" . 1093906) ("SHADING" . 1057051) ("SHARE_DATA" . 1057056) ("SYMBOL" . 1057058) ("THICK" . 1057063) ("USE_LABEL_COLOR" . 1057065) ("USE_LABEL_ORIENTATION" . 1057067) ("USE_TEXT_ALIGNMENTS" . 1057069) ("VERT_COLORS" . 1057073) ("XCOORD_CONV" . 1057075) ("YCOORD_CONV" . 1057081) ("ZCOORD_CONV" . 1077892)))
-    ("GetCTM" fun "IDLgrPolyline" (system) "Result = Obj->[%s::]%s()" ("objects_gr134.html" ("DESTINATION" . 1013579) ("PATH" . 1013581) ("TOP" . 1013587)))
-    ("Init" fun "IDLgrPolyline" (system) "Result = Obj->[%s::]%s([, X [, Y[, Z]]])" ("objects_gr136.html" ) ("objects_gr132.html" ("ALPHA_CHANNEL" . 1329463) ("CLIP_PLANES" . 1056996) ("COLOR" . 1057001) ("DATA" . 1057003) ("DEPTH_TEST_DISABLE" . 1095001) ("DEPTH_TEST_FUNCTION" . 1095681) ("DEPTH_WRITE_DISABLE" . 1095720) ("DOUBLE" . 1057005) ("HIDE" . 1057007) ("LABEL_NOGAPS" . 1057011) ("LABEL_OBJECTS" . 1057019) ("LABEL_OFFSETS" . 1057017) ("LABEL_POLYLINES" . 1057330) ("LABEL_USE_VERTEX_COLOR" . 1077987) ("LINESTYLE" . 1057029) ("PALETTE" . 1057044) ("POLYLINES" . 1057099) ("REGISTER_PROPERTIES" . 1057049) ("RESET_DATA" . 1093906) ("SHADING" . 1057051) ("SHARE_DATA" . 1057056) ("SYMBOL" . 1057058) ("THICK" . 1057063) ("USE_LABEL_COLOR" . 1057065) ("USE_LABEL_ORIENTATION" . 1057067) ("USE_TEXT_ALIGNMENTS" . 1057069) ("VERT_COLORS" . 1057073) ("XCOORD_CONV" . 1057075) ("YCOORD_CONV" . 1057081) ("ZCOORD_CONV" . 1077892)))
-    ("Cleanup" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr140.html"))
-    ("Draw" pro "IDLgrPrinter" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr141.html" ("VECT_SORTING" . 1340440) ("VECT_TEXT_RENDER_METHOD" . 1340452) ("VECTOR" . 1013979)))
-    ("GetProperty" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr144.html" ) ("objects_gr139.html" ("ALL" . 1057354) ("COLOR_MODEL" . 1057403) ("DIMENSIONS" . 1057476) ("GAMMA" . 1057474) ("GRAPHICS_TREE" . 1057413) ("LANDSCAPE" . 1057415) ("N_COLORS" . 1057418) ("N_COPIES" . 1057420) ("NAME" . 1344875) ("PALETTE" . 1057464) ("PRINT_QUALITY" . 1057428) ("QUALITY" . 1057435) ("RESOLUTION" . 1093938) ("UNITS" . 1057441)))
-    ("NewDocument" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr147.html"))
-    ("NewPage" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr148.html"))
-    ("SetProperty" pro "IDLgrPrinter" (system) "Obj->[%s::]%s" ("objects_gr149.html" ) ("objects_gr139.html" ("GAMMA" . 1057474) ("GRAPHICS_TREE" . 1057413) ("LANDSCAPE" . 1057415) ("N_COPIES" . 1057420) ("PALETTE" . 1057464) ("PRINT_QUALITY" . 1057428) ("QUALITY" . 1057435) ("UNITS" . 1057441)))
-    ("GetContiguousPixels" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s()" ("objects_gr142.html"))
-    ("GetFontnames" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr143.html" ("IDL_FONTS" . 1014147) ("STYLES" . 1014149)))
-    ("GetTextDimensions" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr145.html" ("DESCENT" . 1014231) ("PATH" . 1014233)))
-    ("Init" fun "IDLgrPrinter" (system) "Result = Obj->[%s::]%s()" ("objects_gr146.html" ) ("objects_gr139.html" ("COLOR_MODEL" . 1057403) ("GAMMA" . 1057474) ("GRAPHICS_TREE" . 1057413) ("LANDSCAPE" . 1057415) ("N_COLORS" . 1057418) ("N_COPIES" . 1057420) ("PALETTE" . 1057464) ("PRINT_QUALITY" . 1057428) ("QUALITY" . 1057435) ("REGISTER_PROPERTIES" . 1057456) ("UNITS" . 1057441)))
-    ("Cleanup" pro "IDLgrROI" (system) "Obj->[%s::]%s" ("objects_gr152.html"))
-    ("GetProperty" pro "IDLgrROI" (system) "Obj->[%s::]%s" ("objects_gr153.html" ) ("objects_gr151.html" ("ALL" . 1057567) ("ALPHA_CHANNEL" . 1315614) ("CLIP_PLANES" . 1057587) ("COLOR" . 1057592) ("DEPTH_TEST_DISABLE" . 1095007) ("DEPTH_TEST_FUNCTION" . 1095803) ("DEPTH_WRITE_DISABLE" . 1095842) ("DOUBLE" . 1078228) ("HIDE" . 1078231) ("LINESTYLE" . 1057600) ("PALETTE" . 1057611) ("PARENT" . 1345141) ("STYLE" . 1093956) ("SYMBOL" . 1057621) ("THICK" . 1057626) ("XCOORD_CONV" . 1057630) ("XRANGE" . 1057656) ("YCOORD_CONV" . 1057636) ("YRANGE" . 1057668) ("ZCOORD_CONV" . 1057666) ("ZRANGE" . 1057574)))
-    ("SetProperty" pro "IDLgrROI" (system) "Obj->[%s::]%s" ("objects_gr156.html" ) ("objects_gr151.html" ("ALPHA_CHANNEL" . 1315614) ("CLIP_PLANES" . 1057587) ("COLOR" . 1057592) ("DEPTH_TEST_DISABLE" . 1095007) ("DEPTH_TEST_FUNCTION" . 1095803) ("DEPTH_WRITE_DISABLE" . 1095842) ("DOUBLE" . 1078228) ("HIDE" . 1078231) ("LINESTYLE" . 1057600) ("PALETTE" . 1057611) ("STYLE" . 1093956) ("SYMBOL" . 1057621) ("THICK" . 1057626) ("XCOORD_CONV" . 1057630) ("YCOORD_CONV" . 1057636) ("ZCOORD_CONV" . 1057666)))
-    ("Init" fun "IDLgrROI" (system) "Result = Obj->[%s::]%s([, X[, Y[, Z]]])" ("objects_gr154.html" ) ("objects_gr151.html" ("ALPHA_CHANNEL" . 1315614) ("CLIP_PLANES" . 1057587) ("COLOR" . 1057592) ("DEPTH_TEST_DISABLE" . 1095007) ("DEPTH_TEST_FUNCTION" . 1095803) ("DEPTH_WRITE_DISABLE" . 1095842) ("DOUBLE" . 1078228) ("HIDE" . 1078231) ("LINESTYLE" . 1057600) ("PALETTE" . 1057611) ("REGISTER_PROPERTIES" . 1057616) ("STYLE" . 1093956) ("SYMBOL" . 1057621) ("THICK" . 1057626) ("XCOORD_CONV" . 1057630) ("YCOORD_CONV" . 1057636) ("ZCOORD_CONV" . 1057666)))
-    ("PickVertex" fun "IDLgrROI" (system) "Result = Obj->[%s::]%s( Dest, View, Point)" ("objects_gr155.html" ("PATH" . 1014753)))
-    ("Add" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s, ROI" ("objects_gr159.html"))
-    ("Cleanup" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s" ("objects_gr160.html"))
-    ("GetProperty" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s" ("objects_gr161.html" ) ("objects_gr158.html" ("ALL" . 1057772) ("CLIP_PLANES" . 1057798) ("COLOR" . 1057803) ("DEPTH_TEST_DISABLE" . 1095013) ("DEPTH_TEST_FUNCTION" . 1095918) ("DEPTH_WRITE_DISABLE" . 1095957) ("HIDE" . 1057805) ("PARENT" . 1057863) ("XCOORD_CONV" . 1057861) ("XRANGE" . 1057853) ("YCOORD_CONV" . 1057851) ("YRANGE" . 1080305) ("ZCOORD_CONV" . 1057839) ("ZRANGE" . 1057781)))
-    ("SetProperty" pro "IDLgrROIGroup" (system) "Obj->[%s::]%s" ("objects_gr164.html" ) ("objects_gr158.html" ("CLIP_PLANES" . 1057798) ("COLOR" . 1057803) ("DEPTH_TEST_DISABLE" . 1095013) ("DEPTH_TEST_FUNCTION" . 1095918) ("DEPTH_WRITE_DISABLE" . 1095957) ("HIDE" . 1057805) ("XCOORD_CONV" . 1057861) ("YCOORD_CONV" . 1057851) ("ZCOORD_CONV" . 1057839)))
-    ("Init" fun "IDLgrROIGroup" (system) "Result = Obj->[%s::]%s()" ("objects_gr162.html" ) ("objects_gr158.html" ("CLIP_PLANES" . 1057798) ("COLOR" . 1057803) ("DEPTH_TEST_DISABLE" . 1095013) ("DEPTH_TEST_FUNCTION" . 1095918) ("DEPTH_WRITE_DISABLE" . 1095957) ("HIDE" . 1057805) ("XCOORD_CONV" . 1057861) ("YCOORD_CONV" . 1057851) ("ZCOORD_CONV" . 1057839)))
-    ("PickRegion" fun "IDLgrROIGroup" (system) "Result = Obj->[%s::]%s( Dest, View, Point)" ("objects_gr163.html" ("PATH" . 1015096)))
-    ("Add" pro "IDLgrScene" (system) "Obj->[%s::]%s, View" ("objects_gr167.html" ("POSITION" . 1015243)))
-    ("Cleanup" pro "IDLgrScene" (system) "Obj->[%s::]%s" ("objects_gr168.html"))
-    ("GetProperty" pro "IDLgrScene" (system) "Obj->[%s::]%s" ("objects_gr170.html" ) ("objects_gr166.html" ("ALL" . 1057953) ("COLOR" . 1080480) ("TRANSPARENT" . 1093982)))
-    ("SetProperty" pro "IDLgrScene" (system) "Obj->[%s::]%s" ("objects_gr172.html" ) ("objects_gr166.html" ("COLOR" . 1080480) ("TRANSPARENT" . 1093982)))
-    ("GetByName" fun "IDLgrScene" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr169.html"))
-    ("Init" fun "IDLgrScene" (system) "Result = Obj->[%s::]%s()" ("objects_gr171.html" ) ("objects_gr166.html" ("COLOR" . 1080480) ("HIDE" . 1057961) ("REGISTER_PROPERTIES" . 1057969)))
-    ("Cleanup" pro "IDLgrSurface" (system) "Obj->[%s::]%s" ("objects_gr175.html"))
-    ("GetProperty" pro "IDLgrSurface" (system) "Obj->[%s::]%s" ("objects_gr177.html" ) ("objects_gr174.html" ("ALL" . 1058014) ("ALPHA_CHANNEL" . 1314657) ("AMBIENT" . 1310692) ("BOTTOM" . 1058035) ("CLIP_PLANES" . 1058037) ("COLOR" . 1058042) ("DATA" . 1339889) ("DEPTH_OFFSET" . 1058050) ("DEPTH_TEST_DISABLE" . 1095019) ("DEPTH_TEST_FUNCTION" . 1096040) ("DEPTH_WRITE_DISABLE" . 1096079) ("DIFFUSE" . 1310743) ("DOUBLE" . 1058056) ("EMISSION" . 1310780) ("EXTENDED_LEGO" . 1058059) ("HIDDEN_LINES" . 1058061) ("HIDE" . 1058063) ("LINESTYLE" . 1058067) ("MAX_VALUE" . 1058080) ("MIN_VALUE" . 1058082) ("PALETTE" . 1058086) ("PARENT" . 1058283) ("SHADE_RANGE" . 1058090) ("SHADING" . 1058092) ("SHININESS" . 1310817) ("SHOW_SKIRT" . 1058099) ("SKIRT" . 1058101) ("SPECULAR" . 1310884) ("STYLE" . 1058103) ("TEXTURE_COORD" . 1604848) ("TEXTURE_HIGHRES" . 1058120) ("TEXTURE_INTERP" . 1058123) ("TEXTURE_MAP" . 1058125) ("THICK" . 1058136) ("USE_TRIANGLES" . 1058140) ("VERT_COLORS" . 1058142) ("XCOORD_CONV" . 1058145) ("XRANGE" . 1058297) ("YCOORD_CONV" . 1058295) ("YRANGE" . 1058309) ("ZCOORD_CONV" . 1058307) ("ZERO_OPACITY_SKIP" . 1058163) ("ZRANGE" . 1082521)))
-    ("SetProperty" pro "IDLgrSurface" (system) "Obj->[%s::]%s" ("objects_gr179.html" ) ("objects_gr174.html" ("ALPHA_CHANNEL" . 1314657) ("AMBIENT" . 1310692) ("BOTTOM" . 1058035) ("CLIP_PLANES" . 1058037) ("COLOR" . 1058042) ("DATAX" . 1339826) ("DATAY" . 1058046) ("DATAZ" . 1058048) ("DEPTH_OFFSET" . 1058050) ("DEPTH_TEST_DISABLE" . 1095019) ("DEPTH_TEST_FUNCTION" . 1096040) ("DEPTH_WRITE_DISABLE" . 1096079) ("DIFFUSE" . 1310743) ("DOUBLE" . 1058056) ("EMISSION" . 1310780) ("EXTENDED_LEGO" . 1058059) ("HIDDEN_LINES" . 1058061) ("HIDE" . 1058063) ("LINESTYLE" . 1058067) ("MAX_VALUE" . 1058080) ("MIN_VALUE" . 1058082) ("PALETTE" . 1058086) ("RESET_DATA" . 1094044) ("SHADE_RANGE" . 1058090) ("SHADING" . 1058092) ("SHARE_DATA" . 1082385) ("SHININESS" . 1310817) ("SHOW_SKIRT" . 1058099) ("SKIRT" . 1058101) ("SPECULAR" . 1310884) ("STYLE" . 1058103) ("TEXTURE_COORD" . 1604848) ("TEXTURE_HIGHRES" . 1058120) ("TEXTURE_INTERP" . 1058123) ("TEXTURE_MAP" . 1058125) ("THICK" . 1058136) ("USE_TRIANGLES" . 1058140) ("VERT_COLORS" . 1058142) ("XCOORD_CONV" . 1058145) ("YCOORD_CONV" . 1058295) ("ZCOORD_CONV" . 1058307) ("ZERO_OPACITY_SKIP" . 1058163)))
-    ("GetCTM" fun "IDLgrSurface" (system) "Result = Obj->[%s::]%s()" ("objects_gr176.html" ("DESTINATION" . 1015591) ("PATH" . 1015593) ("TOP" . 1015599)))
-    ("Init" fun "IDLgrSurface" (system) "Result = Obj->[%s::]%s([, Z [, X, Y]])" ("objects_gr178.html" ) ("objects_gr174.html" ("ALPHA_CHANNEL" . 1314657) ("AMBIENT" . 1310692) ("BOTTOM" . 1058035) ("CLIP_PLANES" . 1058037) ("COLOR" . 1058042) ("DATAX" . 1339826) ("DATAY" . 1058046) ("DATAZ" . 1058048) ("DEPTH_OFFSET" . 1058050) ("DEPTH_TEST_DISABLE" . 1095019) ("DEPTH_TEST_FUNCTION" . 1096040) ("DEPTH_WRITE_DISABLE" . 1096079) ("DIFFUSE" . 1310743) ("DOUBLE" . 1058056) ("EMISSION" . 1310780) ("EXTENDED_LEGO" . 1058059) ("HIDDEN_LINES" . 1058061) ("HIDE" . 1058063) ("LINESTYLE" . 1058067) ("MAX_VALUE" . 1058080) ("MIN_VALUE" . 1058082) ("PALETTE" . 1058086) ("REGISTER_PROPERTIES" . 1094041) ("RESET_DATA" . 1094044) ("SHADE_RANGE" . 1058090) ("SHADING" . 1058092) ("SHARE_DATA" . 1082385) ("SHININESS" . 1310817) ("SHOW_SKIRT" . 1058099) ("SKIRT" . 1058101) ("SPECULAR" . 1310884) ("STYLE" . 1058103) ("TEXTURE_COORD" . 1604848) ("TEXTURE_HIGHRES" . 1058120) ("TEXTURE_INTERP" . 1058123) ("TEXTURE_MAP" . 1058125) ("THICK" . 1058136) ("USE_TRIANGLES" . 1058140) ("VERT_COLORS" . 1058142) ("XCOORD_CONV" . 1058145) ("YCOORD_CONV" . 1058295) ("ZCOORD_CONV" . 1058307) ("ZERO_OPACITY_SKIP" . 1058163)))
-    ("Cleanup" pro "IDLgrSymbol" (system) "Obj->[%s::]%s" ("objects_gr182.html"))
-    ("GetProperty" pro "IDLgrSymbol" (system) "Obj->[%s::]%s" ("objects_gr183.html" ) ("objects_gr181.html" ("ALL" . 1058799) ("ALPHA_CHANNEL" . 1315142) ("COLOR" . 1058811) ("DATA" . 1058813) ("SIZE" . 1058817) ("THICK" . 1058823)))
-    ("SetProperty" pro "IDLgrSymbol" (system) "Obj->[%s::]%s" ("objects_gr185.html" ) ("objects_gr181.html" ("ALPHA_CHANNEL" . 1315142) ("COLOR" . 1058811) ("DATA" . 1058813) ("SIZE" . 1058817) ("THICK" . 1058823)))
-    ("Init" fun "IDLgrSymbol" (system) "Result = Obj->[%s::]%s([, Data])" ("objects_gr184.html" ) ("objects_gr181.html" ("ALPHA_CHANNEL" . 1315142) ("COLOR" . 1058811) ("DATA" . 1058813) ("SIZE" . 1058817) ("THICK" . 1058823)))
-    ("AddPolygon" pro "IDLgrTessellator" (system) "Obj->[%s::]%s, X [, Y[, Z]]" ("objects_gr188.html" ("AUXDATA" . 1016227) ("INTERIOR" . 1016232) ("POLYGON" . 1308631)))
-    ("Cleanup" pro "IDLgrTessellator" (system) "Obj->[%s::]%s" ("objects_gr189.html"))
-    ("Reset" pro "IDLgrTessellator" (system) "Obj->[%s::]%s" ("objects_gr191.html"))
-    ("Init" fun "IDLgrTessellator" (system) "Result = Obj->[%s::]%s()" ("objects_gr190.html" ))
-    ("Tessellate" fun "IDLgrTessellator" (system) "Result = Obj->[%s::]%s( Vertices, Poly)" ("objects_gr192.html" ("AUXDATA" . 1016374) ("QUIET" . 1016376)))
-    ("Cleanup" pro "IDLgrText" (system) "Obj->[%s::]%s" ("objects_gr195.html"))
-    ("GetProperty" pro "IDLgrText" (system) "Obj->[%s::]%s" ("objects_gr197.html" ) ("objects_gr194.html" ("ALIGNMENT" . 1058986) ("ALL" . 1058984) ("ALPHA_CHANNEL" . 1096721) ("BASELINE" . 1096723) ("CHAR_DIMENSIONS" . 1058905) ("CLIP_PLANES" . 1058910) ("COLOR" . 1058915) ("DEPTH_TEST_DISABLE" . 1095025) ("DEPTH_TEST_FUNCTION" . 1096162) ("DEPTH_WRITE_DISABLE" . 1096201) ("ENABLE_FORMATTING" . 1058917) ("FILL_BACKGROUND" . 1058922) ("FILL_COLOR" . 1090549) ("FONT" . 1090557) ("HIDE" . 1058929) ("KERNING" . 1058933) ("LOCATIONS" . 1090561) ("ONGLASS" . 1058937) ("PALETTE" . 1058939) ("PARENT" . 1058996) ("RECOMPUTE_DIMENSIONS" . 1058994) ("RENDER_METHOD" . 1096891) ("STRINGS" . 1096894) ("UPDIR" . 1058950) ("VERTICAL_ALIGNMENT" . 1058954) ("XCOORD_CONV" . 1058956) ("XRANGE" . 1059010) ("YCOORD_CONV" . 1059008) ("YRANGE" . 1059022) ("ZCOORD_CONV" . 1058968) ("ZRANGE" . 1058890)))
-    ("SetProperty" pro "IDLgrText" (system) "Obj->[%s::]%s" ("objects_gr199.html" ) ("objects_gr194.html" ("ALIGNMENT" . 1058986) ("ALPHA_CHANNEL" . 1096721) ("BASELINE" . 1096723) ("CHAR_DIMENSIONS" . 1058905) ("CLIP_PLANES" . 1058910) ("COLOR" . 1058915) ("DEPTH_TEST_DISABLE" . 1095025) ("DEPTH_TEST_FUNCTION" . 1096162) ("DEPTH_WRITE_DISABLE" . 1096201) ("ENABLE_FORMATTING" . 1058917) ("FILL_BACKGROUND" . 1058922) ("FILL_COLOR" . 1090549) ("FONT" . 1090557) ("HIDE" . 1058929) ("KERNING" . 1058933) ("LOCATIONS" . 1090561) ("ONGLASS" . 1058937) ("PALETTE" . 1058939) ("RECOMPUTE_DIMENSIONS" . 1058994) ("RENDER_METHOD" . 1096891) ("STRINGS" . 1096894) ("UPDIR" . 1058950) ("VERTICAL_ALIGNMENT" . 1058954) ("XCOORD_CONV" . 1058956) ("YCOORD_CONV" . 1059008) ("ZCOORD_CONV" . 1058968)))
-    ("GetCTM" fun "IDLgrText" (system) "Result = Obj->[%s::]%s()" ("objects_gr196.html" ("DESTINATION" . 1016508) ("PATH" . 1016510) ("TOP" . 1016516)))
-    ("Init" fun "IDLgrText" (system) "Result = Obj->[%s::]%s([, String or vector of strings])" ("objects_gr198.html" ) ("objects_gr194.html" ("ALIGNMENT" . 1058986) ("ALPHA_CHANNEL" . 1096721) ("BASELINE" . 1096723) ("CHAR_DIMENSIONS" . 1058905) ("CLIP_PLANES" . 1058910) ("COLOR" . 1058915) ("DEPTH_TEST_DISABLE" . 1095025) ("DEPTH_TEST_FUNCTION" . 1096162) ("DEPTH_WRITE_DISABLE" . 1096201) ("ENABLE_FORMATTING" . 1058917) ("FILL_BACKGROUND" . 1058922) ("FILL_COLOR" . 1090549) ("FONT" . 1090557) ("HIDE" . 1058929) ("KERNING" . 1058933) ("LOCATIONS" . 1090561) ("ONGLASS" . 1058937) ("PALETTE" . 1058939) ("RECOMPUTE_DIMENSIONS" . 1058994) ("REGISTER_PROPERTIES" . 1058946) ("RENDER_METHOD" . 1096891) ("STRINGS" . 1096894) ("UPDIR" . 1058950) ("VERTICAL_ALIGNMENT" . 1058954) ("XCOORD_CONV" . 1058956) ("YCOORD_CONV" . 1059008) ("ZCOORD_CONV" . 1058968)))
-    ("Add" pro "IDLgrView" (system) "Obj->[%s::]%s, Model" ("objects_gr202.html" ("POSITION" . 1016823)))
-    ("Cleanup" pro "IDLgrView" (system) "Obj->[%s::]%s" ("objects_gr203.html"))
-    ("GetProperty" pro "IDLgrView" (system) "Obj->[%s::]%s" ("objects_gr205.html" ) ("objects_gr201.html" ("ALL" . 1059162) ("COLOR" . 1059182) ("DEPTH_CUE" . 1059184) ("DIMENSIONS" . 1059192) ("DOUBLE" . 1059194) ("EYE" . 1059197) ("HIDE" . 1059199) ("LOCATION" . 1090641) ("PARENT" . 1092817) ("PROJECTION" . 1059231) ("TRANSPARENT" . 1094108) ("UNITS" . 1059207) ("VIEWPLANE_RECT" . 1059216) ("ZCLIP" . 1059219)))
-    ("SetProperty" pro "IDLgrView" (system) "Obj->[%s::]%s" ("objects_gr207.html" ) ("objects_gr201.html" ("COLOR" . 1059182) ("DEPTH_CUE" . 1059184) ("DIMENSIONS" . 1059192) ("DOUBLE" . 1059194) ("EYE" . 1059197) ("HIDE" . 1059199) ("LOCATION" . 1090641) ("PROJECTION" . 1059231) ("TRANSPARENT" . 1094108) ("UNITS" . 1059207) ("VIEWPLANE_RECT" . 1059216) ("ZCLIP" . 1059219)))
-    ("GetByName" fun "IDLgrView" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr204.html"))
-    ("Init" fun "IDLgrView" (system) "Result = Obj->[%s::]%s()" ("objects_gr206.html" ) ("objects_gr201.html" ("COLOR" . 1059182) ("DEPTH_CUE" . 1059184) ("DIMENSIONS" . 1059192) ("DOUBLE" . 1059194) ("EYE" . 1059197) ("HIDE" . 1059199) ("LOCATION" . 1090641) ("PROJECTION" . 1059231) ("REGISTER_PROPERTIES" . 1059205) ("TRANSPARENT" . 1094108) ("UNITS" . 1059207) ("VIEWPLANE_RECT" . 1059216) ("ZCLIP" . 1059219)))
-    ("Add" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s, Object" ("objects_gr210.html" ("POSITION" . 1017170)))
-    ("Cleanup" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s" ("objects_gr211.html"))
-    ("GetProperty" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s" ("objects_gr213.html" ) ("objects_gr209.html" ("ALL" . 1077311) ("HIDE" . 1059327) ("PARENT" . 1084394)))
-    ("SetProperty" pro "IDLgrViewgroup" (system) "Obj->[%s::]%s" ("objects_gr215.html" ) ("objects_gr209.html" ("HIDE" . 1059327)))
-    ("GetByName" fun "IDLgrViewgroup" (system) "Result = Obj->[%s::]%s(Name)" ("objects_gr212.html"))
-    ("Init" fun "IDLgrViewgroup" (system) "Result = Obj->[%s::]%s()" ("objects_gr214.html" ) ("objects_gr209.html" ("HIDE" . 1059327) ("REGISTER_PROPERTIES" . 1059341)))
-    ("Cleanup" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr218.html"))
-    ("ComputeBounds" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr219.html" ("OPACITY" . 1017518) ("RESET" . 1017520) ("VOLUMES" . 1017522)))
-    ("GetProperty" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr221.html" ) ("objects_gr217.html" ("ALL" . 1059382) ("ALPHA_CHANNEL" . 1315212) ("AMBIENT" . 1059403) ("BOUNDS" . 1059406) ("CLIP_PLANES" . 1059408) ("COMPOSITE_FUNCTION" . 1092822) ("DATA0" . 1059427) ("DATA1" . 1059429) ("DATA2" . 1059431) ("DATA3" . 1059433) ("DEPTH_CUE" . 1059436) ("DEPTH_TEST_DISABLE" . 1095038) ("DEPTH_TEST_FUNCTION" . 1096277) ("DEPTH_WRITE_DISABLE" . 1096316) ("HIDE" . 1059445) ("HINTS" . 1059449) ("INTERPOLATE" . 1059455) ("LIGHTING_MODEL" . 1059457) ("NO_COPY" . 1059462) ("OPACITY_TABLE0" . 1086135) ("OPACITY_TABLE1" . 1059466) ("PARENT" . 1088485) ("RENDER_STEP" . 1096662) ("RGB_TABLE0" . 1088582) ("RGB_TABLE1" . 1059472) ("TWO_SIDED" . 1059474) ("VALID_DATA" . 1059634) ("VOLUME_SELECT" . 1059632) ("XCOORD_CONV" . 1059489) ("XRANGE" . 1059648) ("YCOORD_CONV" . 1059495) ("YRANGE" . 1059660) ("ZBUFFER" . 1059501) ("ZCOORD_CONV" . 1059503) ("ZERO_OPACITY_SKIP" . 1059509) ("ZRANGE" . 1059393)))
-    ("SetProperty" pro "IDLgrVolume" (system) "Obj->[%s::]%s" ("objects_gr224.html" ) ("objects_gr217.html" ("ALPHA_CHANNEL" . 1315212) ("AMBIENT" . 1059403) ("BOUNDS" . 1059406) ("CLIP_PLANES" . 1059408) ("COMPOSITE_FUNCTION" . 1092822) ("DATA0" . 1059427) ("DATA1" . 1059429) ("DATA2" . 1059431) ("DATA3" . 1059433) ("DEPTH_CUE" . 1059436) ("DEPTH_TEST_DISABLE" . 1095038) ("DEPTH_TEST_FUNCTION" . 1096277) ("DEPTH_WRITE_DISABLE" . 1096316) ("HIDE" . 1059445) ("HINTS" . 1059449) ("INTERPOLATE" . 1059455) ("LIGHTING_MODEL" . 1059457) ("NO_COPY" . 1059462) ("OPACITY_TABLE0" . 1086135) ("OPACITY_TABLE1" . 1059466) ("RENDER_STEP" . 1096662) ("RGB_TABLE0" . 1088582) ("RGB_TABLE1" . 1059472) ("TWO_SIDED" . 1059474) ("VOLUME_SELECT" . 1059632) ("XCOORD_CONV" . 1059489) ("YCOORD_CONV" . 1059495) ("ZBUFFER" . 1059501) ("ZCOORD_CONV" . 1059503) ("ZERO_OPACITY_SKIP" . 1059509)))
-    ("GetCTM" fun "IDLgrVolume" (system) "Result = Obj->[%s::]%s()" ("objects_gr220.html" ("DESTINATION" . 1017555) ("PATH" . 1017557) ("TOP" . 1017563)))
-    ("Init" fun "IDLgrVolume" (system) "Result = Obj->[%s::]%s([, vol0 [, vol1 [, vol2 [, vol3]]]])" ("objects_gr222.html" ) ("objects_gr217.html" ("ALPHA_CHANNEL" . 1315212) ("AMBIENT" . 1059403) ("BOUNDS" . 1059406) ("CLIP_PLANES" . 1059408) ("COMPOSITE_FUNCTION" . 1092822) ("DATA0" . 1059427) ("DATA1" . 1059429) ("DATA2" . 1059431) ("DATA3" . 1059433) ("DEPTH_CUE" . 1059436) ("DEPTH_TEST_DISABLE" . 1095038) ("DEPTH_TEST_FUNCTION" . 1096277) ("DEPTH_WRITE_DISABLE" . 1096316) ("HIDE" . 1059445) ("HINTS" . 1059449) ("INTERPOLATE" . 1059455) ("LIGHTING_MODEL" . 1059457) ("NO_COPY" . 1059462) ("OPACITY_TABLE0" . 1086135) ("OPACITY_TABLE1" . 1059466) ("REGISTER_PROPERTIES" . 1059616) ("RENDER_STEP" . 1096662) ("RGB_TABLE0" . 1088582) ("RGB_TABLE1" . 1059472) ("TWO_SIDED" . 1059474) ("VOLUME_SELECT" . 1059632) ("XCOORD_CONV" . 1059489) ("YCOORD_CONV" . 1059495) ("ZBUFFER" . 1059501) ("ZCOORD_CONV" . 1059503) ("ZERO_OPACITY_SKIP" . 1059509)))
-    ("PickVoxel" fun "IDLgrVolume" (system) "Result = Obj->[%s::]%s ( Win, View, Point)" ("objects_gr223.html" ("PATH" . 1017818)))
-    ("Cleanup" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr227.html"))
-    ("Draw" pro "IDLgrVRML" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr228.html"))
-    ("GetDeviceInfo" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr229.html" ("ALL" . 1018053) ("MAX_NUM_CLIP_PLANES" . 1018055) ("MAX_TEXTURE_DIMENSIONS" . 1018057) ("MAX_VIEWPORT_DIMENSIONS" . 1018059) ("NAME" . 1018061) ("NUM_CPUS" . 1018063) ("VENDOR" . 1018066) ("VERSION" . 1018068)))
-    ("GetProperty" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr231.html" ) ("objects_gr226.html" ("ALL" . 1059804) ("COLOR_MODEL" . 1059817) ("DIMENSIONS" . 1059821) ("FILENAME" . 1059824) ("GRAPHICS_TREE" . 1059826) ("N_COLORS" . 1059828) ("PALETTE" . 1059830) ("QUALITY" . 1059832) ("RESOLUTION" . 1094159) ("SCREEN_DIMENSIONS" . 1059862) ("UNITS" . 1059860)))
-    ("SetProperty" pro "IDLgrVRML" (system) "Obj->[%s::]%s" ("objects_gr234.html" ) ("objects_gr226.html" ("DIMENSIONS" . 1059821) ("FILENAME" . 1059824) ("GRAPHICS_TREE" . 1059826) ("PALETTE" . 1059830) ("QUALITY" . 1059832) ("RESOLUTION" . 1094159) ("UNITS" . 1059860)))
-    ("GetFontnames" fun "IDLgrVRML" (system) "Result = Obj->[%s::]%s( FamilyName)" ("objects_gr230.html" ("IDL_FONTS" . 1018109) ("STYLES" . 1018111)))
-    ("GetTextDimensions" fun "IDLgrVRML" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr232.html" ("DESCENT" . 1018185) ("PATH" . 1018187)))
-    ("Init" fun "IDLgrVRML" (system) "Result = Obj->[%s::]%s()" ("objects_gr233.html" ) ("objects_gr226.html" ("COLOR_MODEL" . 1059817) ("DIMENSIONS" . 1059821) ("FILENAME" . 1059824) ("GRAPHICS_TREE" . 1059826) ("N_COLORS" . 1059828) ("PALETTE" . 1059830) ("QUALITY" . 1059832) ("REGISTER_PROPERTIES" . 1059837) ("RESOLUTION" . 1094159) ("UNITS" . 1059860) ("WORLDINFO" . 1059848) ("WORLDTITLE" . 1059850)))
-    ("Cleanup" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr237.html"))
-    ("Draw" pro "IDLgrWindow" (system) "Obj->[%s::]%s [, Picture]" ("objects_gr238.html" ("CREATE_INSTANCE" . 1018509) ("DRAW_INSTANCE" . 1018511)))
-    ("Erase" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr239.html" ("COLOR" . 1018544)))
-    ("GetDeviceInfo" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr241.html" ("ALL" . 1018622) ("MAX_NUM_CLIP_PLANES" . 1018624) ("MAX_TEXTURE_DIMENSIONS" . 1018626) ("MAX_VIEWPORT_DIMENSIONS" . 1018628) ("NAME" . 1018630) ("NUM_CPUS" . 1018632) ("VENDOR" . 1018635) ("VERSION" . 1018637)))
-    ("GetProperty" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr244.html" ) ("objects_gr236.html" ("ALL" . 1059951) ("COLOR_MODEL" . 1059974) ("CURRENT_ZOOM" . 1249228) ("DIMENSIONS" . 1249231) ("DISPLAY_NAME (X Only)" . 1059985) ("GRAPHICS_TREE" . 1059987) ("IMAGE_DATA" . 1060084) ("LOCATION" . 1060082) ("MINIMUM_VIRTUAL_DIMENSIONS" . 1343479) ("N_COLORS" . 1059992) ("PALETTE" . 1059998) ("QUALITY" . 1060003) ("RENDERER" . 1094184) ("RESOLUTION" . 1060060) ("RETAIN" . 1060058) ("SCREEN_DIMENSIONS" . 1060073) ("TITLE" . 1060071) ("UNITS" . 1060033) ("VIRTUAL_DIMENSIONS" . 1060050) ("VISIBLE_LOCATION" . 1097046) ("ZBUFFER_DATA" . 1091007) ("ZOOM_BASE" . 1342797) ("ZOOM_NSTEP" . 1342953)))
-    ("Iconify" pro "IDLgrWindow" (system) "Obj->[%s::]%s, IconFlag" ("objects_gr246.html"))
-    ("SetCurrentCursor" pro "IDLgrWindow" (system) "Obj->[%s::]%s [, CursorName]" ("objects_gr251.html" ("HOTSPOT" . 1019148) ("IMAGE" . 1019144) ("MASK" . 1019146) ("STANDARD" . 1019150)))
-    ("SetCurrentZoom" pro "IDLgrWindow" (system) "Obj-> [%s::]%s, ZoomFactor" ("objects_gr252.html" ("RESET" . 1360383)))
-    ("SetProperty" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr253.html" ) ("objects_gr236.html" ("DIMENSIONS" . 1249231) ("DISPLAY_NAME (X Only)" . 1059985) ("GRAPHICS_TREE" . 1059987) ("LOCATION" . 1060082) ("MINIMUM_VIRTUAL_DIMENSIONS" . 1343479) ("PALETTE" . 1059998) ("QUALITY" . 1060003) ("TITLE" . 1060071) ("UNITS" . 1060033) ("VIRTUAL_DIMENSIONS" . 1060050) ("VISIBLE_LOCATION" . 1097046) ("ZOOM_BASE" . 1342797)))
-    ("Show" pro "IDLgrWindow" (system) "Obj->[%s::]%s, Position" ("objects_gr254.html"))
-    ("ZoomIn" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr255.html"))
-    ("ZoomOut" pro "IDLgrWindow" (system) "Obj->[%s::]%s" ("objects_gr256.html"))
-    ("GetContiguousPixels" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s()" ("objects_gr240.html"))
-    ("GetDimensions" fun "IDLgrWindow" (system) "Result = Obj -> [%s::]%s ()" ("objects_gr242.html" ("MINIMUM_VIRTUAL_DIMENSIONS" . 1360348) ("ORIGINAL_VIRTUAL_DIMENSIONS" . 1360355) ("VIRTUAL_DIMENSIONS" . 1360358) ("VISIBLE_LOCATION" . 1360361)))
-    ("GetFontnames" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s(FamilyName)" ("objects_gr243.html" ("IDL_FONTS" . 1018678) ("STYLES" . 1018680)))
-    ("GetTextDimensions" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s( TextObj)" ("objects_gr245.html" ("DESCENT" . 1018765) ("PATH" . 1018767)))
-    ("Init" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s()" ("objects_gr247.html" ) ("objects_gr236.html" ("COLOR_MODEL" . 1059974) ("DIMENSIONS" . 1249231) ("GRAPHICS_TREE" . 1059987) ("LOCATION" . 1060082) ("MINIMUM_VIRTUAL_DIMENSIONS" . 1343479) ("N_COLORS" . 1059992) ("PALETTE" . 1059998) ("QUALITY" . 1060003) ("REGISTER_PROPERTIES" . 1060008) ("RENDERER" . 1094184) ("RETAIN" . 1060058) ("TITLE" . 1060071) ("UNITS" . 1060033) ("VIRTUAL_DIMENSIONS" . 1060050) ("VISIBLE_LOCATION" . 1097046) ("ZOOM_BASE" . 1342797)))
-    ("PickData" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s( View, Object, Location, XYZLocation)" ("objects_gr248.html" ("DIMENSIONS" . 1018957) ("PATH" . 1018961) ("PICK_STATUS" . 1018967)))
-    ("Read" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s()" ("objects_gr249.html"))
-    ("Select" fun "IDLgrWindow" (system) "Result = Obj->[%s::]%s( Picture, XY)" ("objects_gr250.html" ("DIMENSIONS" . 1019069) ("ORDER" . 1019073) ("SUB_SELECTION" . 1343670) ("UNITS" . 1019076)))
-    ("Cleanup" pro "IDLitCommand" (system) "Obj->[%s::]%s" ("objects_it6.html"))
-    ("GetProperty" pro "IDLitCommand" (system) "Obj->[%s::]%s" ("objects_it8.html" ) ("objects_it4.html" ("OPERATION_IDENTIFIER" . 1042072) ("TARGET_IDENTIFIER" . 1042044)))
-    ("SetProperty" pro "IDLitCommand" (system) "Obj->[%s::]%s" ("objects_it11.html" ) ("objects_it4.html" ("OPERATION_IDENTIFIER" . 1042072) ("TARGET_IDENTIFIER" . 1042044)))
-    ("AddItem" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s(StrItem, Item)" ("objects_it5.html" ("OVERWRITE" . 1042134)))
-    ("GetItem" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s(StrItem, Item)" ("objects_it7.html"))
-    ("GetSize" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s()" ("objects_it9.html" ("KILOBYTES" . 1042275)))
-    ("Init" fun "IDLitCommand" (system) "Result = Obj->[%s::]%s()" ("objects_it10.html" ) ("objects_it4.html" ("OPERATION_IDENTIFIER" . 1042072) ("TARGET_IDENTIFIER" . 1042044)))
-    ("Cleanup" pro "IDLitCommandSet" (system) "Obj->[%s::]%s" ("objects_it14.html"))
-    ("Init" fun "IDLitCommandSet" (system) "Result = Obj->[%s::]%s()" ("objects_it16.html" ))
-    ("Cleanup" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it19.html"))
-    ("GetProperty" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it22.html" ) ("objects_it18.html" ("COMPONENT_VERSION" . 1068963) ("DESCRIPTION" . 1286379) ("HELP" . 1069022) ("ICON" . 1281308) ("IDENTIFIER" . 1069050) ("NAME" . 1069084) ("PRIVATE" . 1069111) ("UVALUE" . 1069139)))
-    ("GetPropertyAttribute" pro "IDLitComponent" (system) "Obj->[%s::]%s, PropertyIdentifier" ("objects_it23.html" ("TYPE" . 1069368)))
-    ("RegisterProperty" pro "IDLitComponent" (system) "Obj->[%s::]%s, PropertyIdentifier[, Type]" ("objects_it27.html" ("BOOLEAN" . 1069541) ("COLOR" . 1069543) ("DESCRIPTION" . 1069545) ("ENUMLIST" . 1069547) ("FLOAT" . 1069549) ("HIDE" . 1069551) ("INTEGER" . 1069553) ("LINESTYLE" . 1069555) ("NAME" . 1069563) ("SENSITIVE" . 1069565) ("STRING" . 1069567) ("SYMBOL" . 1069569) ("THICKNESS" . 1069574) ("UNDEFINED" . 1069576) ("USERDEF" . 1069579) ("VALID_RANGE" . 1069581)))
-    ("Restore" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it28.html"))
-    ("SetProperty" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it29.html" ) ("objects_it18.html" ("DESCRIPTION" . 1286379) ("HELP" . 1069022) ("ICON" . 1281308) ("IDENTIFIER" . 1069050) ("NAME" . 1069084) ("PRIVATE" . 1069111) ("UVALUE" . 1069139)))
-    ("SetPropertyAttribute" pro "IDLitComponent" (system) "Obj->[%s::]%s , PropertyIdentifier" ("objects_it30.html"))
-    ("SetPropertyByIdentifier" pro "IDLitComponent" (system) "Obj->[%s::]%s, PropertyIdentifier, Value" ("objects_it31.html"))
-    ("UpdateComponentVersion" pro "IDLitComponent" (system) "Obj->[%s::]%s" ("objects_it32.html"))
-    ("EditUserDefProperty" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s(iTool, PropertyIdentifier)" ("objects_it20.html"))
-    ("GetFullIdentifier" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s([Objref])" ("objects_it21.html"))
-    ("GetPropertyByIdentifier" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s(PropertyIdentifier, Value)" ("objects_it24.html"))
-    ("Init" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s()" ("objects_it25.html" ) ("objects_it18.html" ("DESCRIPTION" . 1286379) ("HELP" . 1069022) ("ICON" . 1281308) ("IDENTIFIER" . 1069050) ("NAME" . 1069084) ("PRIVATE" . 1069111) ("UVALUE" . 1069139)))
-    ("QueryProperty" fun "IDLitComponent" (system) "Result = Obj->[%s::]%s([PropertyIdentifier])" ("objects_it26.html"))
-    ("Add" pro "IDLitContainer" (system) "Obj->[%s::]%s, Components" ("objects_it35.html" ("NO_NOTIFY" . 1070004)))
-    ("AddByIdentifier" pro "IDLitContainer" (system) "Obj->[%s::]%s, Identifier, Item" ("objects_it36.html"))
-    ("Cleanup" pro "IDLitContainer" (system) "Obj->[%s::]%s" ("objects_it37.html"))
-    ("Remove" pro "IDLitContainer" (system) "Obj->[%s::]%s, Components" ("objects_it42.html" ("NO_NOTIFY" . 1070225)))
-    ("Get" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it39.html" ("ALL" . 1070110) ("COUNT" . 1070112) ("ISA" . 1070114) ("POSITION" . 1070117) ("SKIP_PRIVATE" . 1070119)))
-    ("GetByIdentifier" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it40.html"))
-    ("IDLitContainer" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s::FindIdentifiers([Pattern])" ("objects_it38.html" ("COUNT" . 1297331) ("LEAF_NODES" . 1297334)))
-    ("Init" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it41.html" ))
-    ("RemoveByIdentifier" fun "IDLitContainer" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it43.html"))
-    ("AddDataObserver" pro "IDLitData" (system) "Obj->[%s::]%s, Observer" ("objects_it46.html"))
-    ("Cleanup" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it47.html"))
-    ("GetProperty" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it51.html" ) ("objects_it45.html" ("HIDE" . 1070552) ("READ_ONLY" . 1070608) ("TYPE" . 1070636)))
-    ("NotifyDataChange" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it54.html"))
-    ("NotifyDataComplete" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it55.html"))
-    ("RemoveDataObserver" pro "IDLitData" (system) "Obj->[%s::]%s, Observer" ("objects_it56.html"))
-    ("SetProperty" pro "IDLitData" (system) "Obj->[%s::]%s" ("objects_it58.html" ) ("objects_it45.html" ("HIDE" . 1070552) ("READ_ONLY" . 1070608)))
-    ("Copy" fun "IDLitData" (system) "Result = Obj->[%s::]%s()" ("objects_it48.html"))
-    ("GetByType" fun "IDLitData" (system) "Result = Obj->[%s::]%s(Type)" ("objects_it49.html" ("COUNT" . 1070828)))
-    ("GetData" fun "IDLitData" (system) "Result = Obj->[%s::]%s(Data[, Identifier])" ("objects_it50.html" ("NAN" . 1070867) ("NO_COPY" . 1154511)))
-    ("GetSize" fun "IDLitData" (system) "Result = Obj->[%s::]%s()" ("objects_it52.html"))
-    ("Init" fun "IDLitData" (system) "Result = Obj->[%s::]%s([, Data])" ("objects_it53.html" ) ("objects_it45.html" ("HIDE" . 1070552) ("NO_COPY" . 1070580) ("READ_ONLY" . 1070608) ("TYPE" . 1070636)))
-    ("SetData" fun "IDLitData" (system) "Result = Obj->[%s::]%s(Data[, Identifier])" ("objects_it57.html" ("NO_COPY" . 1071158) ("NULL" . 1071160)))
-    ("Add" pro "IDLitDataContainer" (system) "Obj->[%s::]%s, Data" ("objects_it61.html" ("NO_NOTIFY" . 1275026)))
-    ("Cleanup" pro "IDLitDataContainer" (system) "Obj->[%s::]%s" ("objects_it62.html"))
-    ("GetProperty" pro "IDLitDataContainer" (system) "Obj->[%s::]%s" ("objects_it65.html" ))
-    ("SetProperty" pro "IDLitDataContainer" (system) "Obj->[%s::]%s" ("objects_it68.html" ))
-    ("GetData" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s(Data [, Identifier])" ("objects_it63.html" ("NO_COPY" . 1071642)))
-    ("GetIdentifiers" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s([Pattern])" ("objects_it64.html" ("LEAF" . 1071682)))
-    ("Init" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s([, Data])" ("objects_it66.html" ))
-    ("SetData" fun "IDLitDataContainer" (system) "Result = Obj->[%s::]%s(Data, Identifier)" ("objects_it67.html" ("NO_COPY" . 1071799) ("NULL" . 1071801)))
-    ("GetProperty" pro "IDLitDataOperation" (system) "Obj->[%s::]%s" ("objects_it74.html" ))
-    ("SetProperty" pro "IDLitDataOperation" (system) "Obj->[%s::]%s" ("objects_it76.html" ))
-    ("DoExecuteUI" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s()" ("objects_it72.html"))
-    ("Execute" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it73.html"))
-    ("Init" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s()" ("objects_it75.html" ))
-    ("UndoExecute" fun "IDLitDataOperation" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it77.html"))
-    ("AddOnNotifyObserver" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it80.html"))
-    ("DoOnNotify" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, IdOriginator, IdMessage, Value" ("objects_it81.html"))
-    ("ErrorMessage" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it82.html" ("SEVERITY" . 1079859) ("TITLE" . 1079864) ("USE_LAST_ERROR" . 1079866)))
-    ("ProbeStatusMessage" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it84.html"))
-    ("RemoveOnNotifyObserver" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it88.html"))
-    ("SignalError" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it89.html" ("CODE" . 1080072) ("SEVERITY" . 1080074)))
-    ("StatusMessage" pro "IDLitIMessaging" (system) "Obj->[%s::]%s, StrMessage" ("objects_it90.html" ("SEGMENT_IDENTIFIER" . 1287131)))
-    ("GetTool" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s()" ("objects_it83.html"))
-    ("ProgressBar" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s(StrMessage)" ("objects_it85.html" ("CANCEL" . 1270494) ("PERCENT" . 1079974) ("SHUTDOWN" . 1079976)))
-    ("PromptUserText" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s(StrPrompt, Answer)" ("objects_it86.html" ("TITLE" . 1080016)))
-    ("PromptUserYesNo" fun "IDLitIMessaging" (system) "Result = Obj->[%s::]%s(StrPrompt, Answer)" ("objects_it87.html" ("TITLE" . 1080036)))
-    ("Cleanup" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it93.html"))
-    ("GetProperty" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it96.html" ) ("objects_it92.html" ("BUTTON_EVENTS" . 1080361) ("DESCRIPTION" . 1080417) ("KEYBOARD_EVENTS" . 1080504) ("MOTION_EVENTS" . 1080532) ("OPERATION_IDENTIFIER" . 1080560) ("PARAMETER_IDENTIFIER" . 1080588) ("TRANSIENT_DEFAULT" . 1080617) ("TRANSIENT_MOTION" . 1080650) ("TYPES" . 1080678) ("VISUAL_TYPE" . 1080735)))
-    ("OnKeyboard" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, IsASCII, Character, KeyValue, X, Y, Press, Release, KeyMods" ("objects_it98.html"))
-    ("OnLoseCurrentManipulator" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it99.html"))
-    ("OnMouseDown" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, X, Y, IButton, KeyMods, NClicks" ("objects_it100.html"))
-    ("OnMouseMotion" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, X, Y, KeyMods" ("objects_it101.html"))
-    ("OnMouseUp" pro "IDLitManipulator" (system) "Obj->[%s::]%s, Win, X, Y, IButton" ("objects_it102.html"))
-    ("RegisterCursor" pro "IDLitManipulator" (system) "Obj->[%s::]%s, ArrCursor, Name" ("objects_it104.html" ("DEFAULT" . 1281810)))
-    ("SetCurrentManipulator" pro "IDLitManipulator" (system) "Obj->[%s::]%s [, Item]" ("objects_it105.html"))
-    ("SetProperty" pro "IDLitManipulator" (system) "Obj->[%s::]%s" ("objects_it120.html" ) ("objects_it92.html" ("BUTTON_EVENTS" . 1080361) ("DESCRIPTION" . 1080417) ("DISABLE" . 1080445) ("KEYBOARD_EVENTS" . 1080504) ("MOTION_EVENTS" . 1080532) ("OPERATION_IDENTIFIER" . 1080560) ("PARAMETER_IDENTIFIER" . 1080588) ("TRANSIENT_DEFAULT" . 1080617) ("TRANSIENT_MOTION" . 1080650) ("VISUAL_TYPE" . 1080735)))
-    ("CommitUndoValues" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s()" ("objects_it94.html" ("UNCOMMIT" . 1080828)))
-    ("GetCursorType" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s(TypeIn, KeyMods)" ("objects_it95.html"))
-    ("Init" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s()" ("objects_it97.html" ) ("objects_it92.html" ("BUTTON_EVENTS" . 1080361) ("DEFAULT_CURSOR" . 1080389) ("DESCRIPTION" . 1080417) ("DISABLE" . 1080445) ("KEYBOARD_EVENTS" . 1080504) ("MOTION_EVENTS" . 1080532) ("OPERATION_IDENTIFIER" . 1080560) ("PARAMETER_IDENTIFIER" . 1080588) ("TRANSIENT_DEFAULT" . 1080617) ("TRANSIENT_MOTION" . 1080650) ("TYPES" . 1080678) ("VIEWS_ONLY" . 1080706) ("VISUAL_TYPE" . 1080735)))
-    ("RecordUndoValues" fun "IDLitManipulator" (system) "Result = Obj->[%s::]%s()" ("objects_it103.html"))
-    ("Add" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Manipulator" ("objects_it109.html"))
-    ("GetProperty" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s" ("objects_it112.html" ))
-    ("OnMouseDown" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Win, X, Y, IButton, KeyMods, NClicks" ("objects_it115.html"))
-    ("OnMouseMotion" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Win, X, Y, KeyMods" ("objects_it116.html"))
-    ("OnMouseUp" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Win, X, Y, IButton" ("objects_it117.html"))
-    ("SetCurrent" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Manipulator" ("objects_it118.html"))
-    ("SetCurrentManipulator" pro "IDLitManipulatorContainer" (system) "Obj->[%s::]%s, Identifier" ("objects_it119.html"))
-    ("GetCurrent" fun "IDLitManipulatorContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it110.html"))
-    ("GetCurrentManipulator" fun "IDLitManipulatorContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it111.html" ("IDENTIFIER" . 1081635)))
-    ("Init" fun "IDLitManipulatorContainer" (system) "Result = Obj->[%s::]%s()" ("objects_it113.html" ) ("objects_it108.html" ("AUTO_SWITCH" . 1081512)))
-    ("Add" pro "IDLitManipulatorManager" (system) "Obj->[%s::]%s, Manipulator" ("objects_it123.html" ("DEFAULT" . 1082187)))
-    ("AddManipulatorObserver" pro "IDLitManipulatorManager" (system) "Obj->[%s::]%s, Observer" ("objects_it124.html"))
-    ("RemoveManipulatorObserver" pro "IDLitManipulatorManager" (system) "Obj->[%s::]%s, Observer" ("objects_it127.html"))
-    ("Init" fun "IDLitManipulatorManager" (system) "Result = Obj->[%s::]%s()" ("objects_it126.html" ))
-    ("Cleanup" pro "IDLitManipulatorVisual" (system) "Obj->[%s::]%s" ("objects_it130.html"))
-    ("GetProperty" pro "IDLitManipulatorVisual" (system) "Obj->[%s::]%s" ("objects_it131.html" ) ("objects_it129.html" ("UNIFORM_SCALE" . 1082429) ("VISUAL_TYPE" . 1082457)))
-    ("SetProperty" pro "IDLitManipulatorVisual" (system) "Obj->[%s::]%s" ("objects_it133.html" ) ("objects_it129.html" ("UNIFORM_SCALE" . 1082429) ("VISUAL_TYPE" . 1082457)))
-    ("Init" fun "IDLitManipulatorVisual" (system) "Result = Obj->[%s::]%s()" ("objects_it132.html" ) ("objects_it129.html" ("UNIFORM_SCALE" . 1082429) ("VISUAL_TYPE" . 1082457)))
-    ("Cleanup" pro "IDLitOperation" (system) "Obj->[%s::]%s" ("objects_it71.html"))
-    ("GetProperty" pro "IDLitOperation" (system) "Obj->[%s::]%s" ("objects_it138.html" ) ("objects_it135.html" ("EXPENSIVE_COMPUTATION" . 1072559) ("REVERSIBLE_OPERATION" . 1072587) ("SHOW_EXECUTION_UI" . 1072615) ("TYPES" . 1072643)))
-    ("SetProperty" pro "IDLitOperation" (system) "Obj->[%s::]%s" ("objects_it143.html" ))
-    ("DoAction" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(Tool)" ("objects_it137.html"))
-    ("Init" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s()" ("objects_it139.html" ) ("objects_it135.html" ("EXPENSIVE_COMPUTATION" . 1072559) ("REVERSIBLE_OPERATION" . 1072587) ("SHOW_EXECUTION_UI" . 1072615) ("TYPES" . 1072643)))
-    ("RecordFinalValues" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet, Targets [, IdProperty] )" ("objects_it140.html"))
-    ("RecordInitialValues" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet, Targets [, IdProperty])" ("objects_it141.html"))
-    ("RedoOperation" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet)" ("objects_it142.html"))
-    ("UndoOperation" fun "IDLitOperation" (system) "Result = Obj->[%s::]%s(CommandSet)" ("objects_it144.html"))
-    ("Cleanup" pro "IDLitParameter" (system) "Obj->[%s::]%s" ("objects_it147.html"))
-    ("IDLitParameter" pro "IDLitParameter" (system) "Obj->[%s::]%s::SetParameterAttribute(ParamName)" ("objects_it157.html" ("KEYWORD")))
-    ("OnDataChangeUpdate" pro "IDLitParameter" (system) "Obj->[%s::]%s, Data, ParameterName" ("objects_it152.html"))
-    ("OnDataDisconnect" pro "IDLitParameter" (system) "Obj->[%s::]%s, ParameterName" ("objects_it153.html"))
-    ("RegisterParameter" pro "IDLitParameter" (system) "Obj->[%s::]%s, Name" ("objects_it155.html" ("BY_VALUE" . 1083371) ("DESCRIPTION" . 1083373) ("INPUT" . 1083375) ("OPTARGET" . 1083377) ("OPTIONAL" . 1083379) ("OUTPUT" . 1083381) ("TYPES" . 1083383)))
-    ("GetParameter" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s(Name)" ("objects_it148.html" ("ALL" . 1083021) ("COUNT" . 1083023)))
-    ("GetParameterSet" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s()" ("objects_it150.html" ("DEEP_COPY" . 1083153)))
-    ("IDLitParameter" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s::QueryParameter([ParamName])" ("objects_it154.html" ("COUNT" . 1297407)))
-    ("Init" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s()" ("objects_it151.html" ))
-    ("SetData" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it156.html" ("BY_VALUE" . 1083428) ("NO_UPDATE" . 1083430) ("PARAMETER_NAME" . 1083433)))
-    ("SetParameterSet" fun "IDLitParameter" (system) "Result = Obj->[%s::]%s(ParamSet)" ("objects_it158.html"))
-    ("Add" pro "IDLitParameterSet" (system) "Obj->[%s::]%s, Data" ("objects_it161.html" ("PARAMETER_NAME" . 1083838) ("PRESERVE_LOCATION" . 1083840)))
-    ("Cleanup" pro "IDLitParameterSet" (system) "Obj->[%s::]%s" ("objects_it162.html"))
-    ("Remove" pro "IDLitParameterSet" (system) "Obj->[%s::]%s [, Items]" ("objects_it168.html" ("ALL" . 1084212) ("POSITION" . 1084214)))
-    ("Copy" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s()" ("objects_it163.html"))
-    ("Get" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s()" ("objects_it164.html" ("ALL" . 1083998) ("COUNT" . 1084000) ("NAME" . 1084002) ("POSITION" . 1084004)))
-    ("GetByName" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s( Names)" ("objects_it165.html" ("COUNT" . 1228440) ("NAME" . 1084087)))
-    ("GetParameterName" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s(Data, Name)" ("objects_it166.html"))
-    ("Init" fun "IDLitParameterSet" (system) "Result = Obj->[%s::]%s()" ("objects_it167.html" ))
-    ("Cleanup" pro "IDLitReader" (system) "Obj->[%s::]%s" ("objects_it171.html"))
-    ("GetProperty" pro "IDLitReader" (system) "Obj->[%s::]%s" ("objects_it175.html" ))
-    ("SetFilename" pro "IDLitReader" (system) "Obj->[%s::]%s, Filename" ("objects_it178.html"))
-    ("SetProperty" pro "IDLitReader" (system) "Obj->[%s::]%s" ("objects_it179.html" ))
-    ("GetData" fun "IDLitReader" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it172.html"))
-    ("GetFileExtensions" fun "IDLitReader" (system) "Result = Obj->[%s::]%s()" ("objects_it173.html" ("COUNT" . 1084646)))
-    ("GetFilename" fun "IDLitReader" (system) "Result = Obj->[%s::]%s()" ("objects_it174.html"))
-    ("Init" fun "IDLitReader" (system) "Result = Obj->[%s::]%s(, Extensions)" ("objects_it176.html" ))
-    ("IsA" fun "IDLitReader" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_it177.html"))
-    ("ActivateManipulator" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it182.html" ("DEFAULT" . 1265856)))
-    ("Add" pro "IDLitTool" (system) "Obj->[%s::]%s, Item" ("objects_it183.html"))
-    ("AddService" pro "IDLitTool" (system) "Obj->[%s::]%s, Service" ("objects_it184.html"))
-    ("Cleanup" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it185.html"))
-    ("CommitActions" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it186.html"))
-    ("DisableUpdates" pro "IDLitTool" (system) "Obj->[%s::]%s ()" ("objects_it187.html" ("PREVIOUSLY_DISABLED" . 1078152)))
-    ("EnableUpdates" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it191.html"))
-    ("GetProperty" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it198.html" ) ("objects_it181.html" ("DESCRIPTION" . 1123541) ("ICON" . 1077825) ("NAME" . 1077853) ("VERBOSE" . 1077937) ("VERSION" . 1077965)))
-    ("RefreshCurrentWindow" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it203.html"))
-    ("Register" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it204.html" ("DEFAULT" . 1363277) ("DESCRIPTION" . 1078812) ("ICON" . 1078814) ("IDENTIFIER" . 1078816) ("PROXY" . 1078824)))
-    ("RegisterCustomization" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it205.html"))
-    ("RegisterFileReader" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it206.html" ("DEFAULT" . 1363382) ("DESCRIPTION" . 1078859) ("ICON" . 1078861) ("IDENTIFIER" . 1078863) ("PROXY" . 1078866)))
-    ("RegisterFileWriter" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it207.html" ("DEFAULT" . 1363460) ("DESCRIPTION" . 1078901) ("ICON" . 1078903) ("IDENTIFIER" . 1078905) ("PROXY" . 1078908)))
-    ("RegisterManipulator" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it208.html" ("DEFAULT" . 1078943) ("DESCRIPTION" . 1078945) ("ICON" . 1078947) ("IDENTIFIER" . 1078949)))
-    ("RegisterOperation" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it209.html" ("ACCELERATOR" . 1247195) ("CHECKED" . 1247213) ("DESCRIPTION" . 1078985) ("DISABLE" . 1247231) ("DROPLIST_EDIT" . 1292076) ("DROPLIST_INDEX" . 1292079) ("DROPLIST_ITEMS" . 1292082) ("ICON" . 1078987) ("IDENTIFIER" . 1078989) ("PROXY" . 1078992) ("SEPARATOR" . 1247249)))
-    ("RegisterStatusBarSegment" pro "IDLitTool" (system) "Obj->[%s::]%s, Name" ("objects_it210.html" ("IDENTIFIER" . 1286948) ("NORMALIZED_WIDTH" . 1286951)))
-    ("RegisterVisualization" pro "IDLitTool" (system) "Obj->[%s::]%s, Name, ClassName" ("objects_it211.html" ("DEFAULT" . 1079028) ("DESCRIPTION" . 1079030) ("ICON" . 1079032) ("IDENTIFIER" . 1079034) ("PROXY" . 1079037)))
-    ("SetProperty" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it212.html" ) ("objects_it181.html" ("DESCRIPTION" . 1123541) ("ICON" . 1077825) ("NAME" . 1077853) ("TYPE" . 1077881) ("UPDATE_BYTYPE" . 1077909) ("VERBOSE" . 1077937)))
-    ("UnRegister" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it213.html"))
-    ("UnRegisterCustomization" pro "IDLitTool" (system) "Obj->[%s::]%s" ("objects_it214.html"))
-    ("UnRegisterFileReader" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it215.html"))
-    ("UnRegisterFileWriter" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it216.html"))
-    ("UnRegisterManipulator" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it217.html"))
-    ("UnRegisterOperation" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it218.html"))
-    ("UnRegisterStatusBarSegment" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it219.html"))
-    ("UnRegisterVisualization" pro "IDLitTool" (system) "Obj->[%s::]%s, Identifier" ("objects_it220.html"))
-    ("DoAction" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it188.html"))
-    ("DoSetProperty" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(TargetIdentifier, PropertyIdentifier, Value)" ("objects_it189.html"))
-    ("DoUIService" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(ServiceIdentifier, Requestor)" ("objects_it190.html"))
-    ("GetCurrentManipulator" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it193.html"))
-    ("GetFileReaders" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it194.html" ("ALL" . 1078392) ("COUNT" . 1078394)))
-    ("GetFileWriters" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it195.html" ("ALL" . 1078432) ("COUNT" . 1078434)))
-    ("GetManipulators" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it196.html" ("COUNT" . 1078470)))
-    ("GetOperations" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it197.html" ("COUNT" . 1228547) ("IDENTIFIER" . 1078507)))
-    ("GetSelectedItems" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it199.html" ("COUNT" . 1078577)))
-    ("GetService" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(IdService)" ("objects_it200.html"))
-    ("GetVisualizations" fun "IDLitTool" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it201.html" ("ALL" . 1078651) ("COUNT" . 1078653)))
-    ("IDLitTool" fun "IDLitTool" (system) "Result = Obj->[%s::]%s::FindIdentifiers([Pattern])" ("objects_it192.html" ("ANNOTATIONS" . 1297756) ("COUNT" . 1297759) ("DATA_MANAGER" . 1297762) ("FILE_READERS" . 1297765) ("FILE_WRITERS" . 1297768) ("LEAF_NODES" . 1297771) ("MANIPULATORS" . 1297775) ("OPERATIONS" . 1297778) ("VISUALIZATIONS" . 1297781)))
-    ("Init" fun "IDLitTool" (system) "Result = Obj->[%s::]%s()" ("objects_it202.html" ) ("objects_it181.html" ("DESCRIPTION" . 1123541) ("ICON" . 1077825) ("NAME" . 1077853) ("TYPE" . 1077881) ("UPDATE_BYTYPE" . 1077909) ("VERBOSE" . 1077937) ("VERSION" . 1077965)))
-    ("AddOnNotifyObserver" pro "IDLitUI" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it224.html"))
-    ("Cleanup" pro "IDLitUI" (system) "Obj->[%s::]%s" ("objects_it225.html"))
-    ("GetProperty" pro "IDLitUI" (system) "Obj->[%s::]%s" ("objects_it227.html" ) ("objects_it223.html" ("GROUP_LEADER" . 1085364)))
-    ("RemoveOnNotifyObserver" pro "IDLitUI" (system) "Obj->[%s::]%s, IdObserver, IdSubject" ("objects_it233.html"))
-    ("SetProperty" pro "IDLitUI" (system) "Obj->[%s::]%s" ("objects_it234.html" ))
-    ("UnRegisterUIService" pro "IDLitUI" (system) "Obj->[%s::]%s, Name" ("objects_it235.html"))
-    ("UnRegisterWidget" pro "IDLitUI" (system) "Obj->[%s::]%s, Name" ("objects_it236.html"))
-    ("DoAction" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(Identifier)" ("objects_it226.html"))
-    ("GetTool" fun "IDLitUI" (system) "Result = Obj->[%s::]%s()" ("objects_it228.html"))
-    ("GetWidgetByName" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(Name)" ("objects_it229.html"))
-    ("Init" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(, oTool)" ("objects_it230.html" ))
-    ("RegisterUIService" fun "IDLitUI" (system) "Restult = Obj->[%s::]%s(Name, Callback)" ("objects_it231.html"))
-    ("RegisterWidget" fun "IDLitUI" (system) "Result = Obj->[%s::]%s(wID, Name, Callback)" ("objects_it232.html" ("FLOATING" . 1085752)))
-    ("Add" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Objects" ("objects_it239.html" ("AGGREGATE" . 1086521) ("NO_UPDATE" . 1086525) ("POSITION" . 1086527)))
-    ("Aggregate" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Objects" ("objects_it240.html"))
-    ("BeginManipulation" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Manipulator" ("objects_it241.html"))
-    ("Cleanup" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it242.html"))
-    ("EndManipulation" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Manipulator" ("objects_it243.html"))
-    ("GetProperty" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it251.html" ) ("objects_it238.html" ("CENTER_OF_ROTATION" . 1086295) ("IMPACTS_RANGE" . 1255230) ("ISOTROPIC" . 1086379) ("MANIPULATOR_TARGET" . 1086407) ("PROPERTY_INTERSECTION" . 1153078)))
-    ("Move" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Source, Destination" ("objects_it261.html"))
-    ("On2DRotate" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, IsRotated" ("objects_it262.html"))
-    ("OnAxesRequestChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, AxesRequest" ("objects_it263.html"))
-    ("OnAxesStyleRequestChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, StyleRequest" ("objects_it264.html"))
-    ("OnDataChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier" ("objects_it265.html"))
-    ("OnDataComplete" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier" ("objects_it266.html"))
-    ("OnDataRangeChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, XRange, YRange, Zrange" ("objects_it267.html"))
-    ("OnDimensionChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, Is3D" ("objects_it268.html"))
-    ("OnWorldDimensionChange" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Notifier, Is3D" ("objects_it269.html"))
-    ("Remove" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Object" ("objects_it270.html" ("NO_UPDATE" . 1087640)))
-    ("Restore" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it272.html"))
-    ("Rotate" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Axis, Angle" ("objects_it273.html" ("CENTER_OF_ROTATION" . 1257870) ("PREMULTIPLY" . 1257943)))
-    ("Scale" pro "IDLitVisualization" (system) "Obj->[%s::]%s, SX, SY, SZ" ("objects_it274.html" ("CENTER_OF_ROTATION" . 1087711) ("PREMULTIPLY" . 1087713)))
-    ("Select" pro "IDLitVisualization" (system) "Obj->[%s::]%s[, Mode]" ("objects_it275.html" ("ADDITIVE" . 1087748) ("NO_NOTIFY" . 1087750) ("SELECT" . 1087752) ("TOGGLE" . 1087754) ("UNSELECT" . 1087756)))
-    ("Set3D" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Is3D" ("objects_it276.html" ("ALWAYS" . 1087787) ("AUTO_COMPUTE" . 1087789)))
-    ("SetAxesRequest" pro "IDLitVisualization" (system) "Obj->[%s::]%s [, AxesRequest]" ("objects_it277.html" ("ALWAYS" . 1264542) ("AUTO_COMPUTE" . 1264612) ("NO_NOTIFY" . 1264617)))
-    ("SetAxesStyleRequest" pro "IDLitVisualization" (system) "Obj->[%s::]%s, StyleRequest" ("objects_it278.html" ("NO_NOTIFY" . 1264441)))
-    ("SetCurrentSelectionVisual" pro "IDLitVisualization" (system) "Obj->[%s::]%s, Manipulator" ("objects_it279.html"))
-    ("SetDefaultSelectionVisual" pro "IDLitVisualization" (system) "Obj->[%s::]%s, SelectionVisual" ("objects_it281.html" ("POSITION" . 1087891)))
-    ("SetProperty" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it283.html" ) ("objects_it238.html" ("CENTER_OF_ROTATION" . 1086295) ("IMPACTS_RANGE" . 1255230) ("ISOTROPIC" . 1086379) ("MANIPULATOR_TARGET" . 1086407) ("TYPE" . 1086465)))
-    ("UpdateSelectionVisual" pro "IDLitVisualization" (system) "Obj->[%s::]%s" ("objects_it284.html"))
-    ("VisToWindow" pro "IDLitVisualization" (system) "Obj->[%s::]%s, InX, InY, InZ, OutX, OutY, OutZ" ("objects_it285.html" ("NO_TRANSFORM" . 1157092)))
-    ("WindowToVis" pro "IDLitVisualization" (system) "Obj->[%s::]%s, InX, InY, InZ, OutX, OutY, OutZ or Obj->[%s::]%s, InX, InY, OutX, OutY or Obj->[%s::]%s, InVerts, OutVerts" ("objects_it286.html"))
-    ("Get" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it244.html" ("ALL" . 1086723) ("COUNT" . 1086725) ("ISA" . 1086727) ("POSITION" . 1086730) ("SKIP_PRIVATE" . 1086732)))
-    ("GetCenterRotation" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it245.html" ("NO_TRANSFORM" . 1086773) ("XRANGE" . 1086775) ("YRANGE" . 1086777) ("ZRANGE" . 1086779)))
-    ("GetCurrentSelectionVisual" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it246.html"))
-    ("GetDataSpace" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it247.html" ("UNNORMALIZED" . 1154562)))
-    ("GetDataString" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(XYZLocation)" ("objects_it248.html"))
-    ("GetDefaultSelectionVisual" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it249.html"))
-    ("GetManipulatorTarget" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it250.html"))
-    ("GetRequestedAxesStyle" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s( )" ("objects_it252.html"))
-    ("GetSelectionVisual" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(Manipulator)" ("objects_it253.html"))
-    ("GetTypes" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it254.html"))
-    ("GetXYZRange" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(XRange,YRange, ZRange)" ("objects_it255.html" ("DATA" . 1087296) ("NO_TRANSFORM" . 1087298)))
-    ("Init" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it256.html" ) ("objects_it238.html" ("CENTER_OF_ROTATION" . 1086295) ("IMPACTS_RANGE" . 1255230) ("ISOTROPIC" . 1086379) ("MANIPULATOR_TARGET" . 1086407) ("PROPERTY_INTERSECTION" . 1153078) ("TYPE" . 1086465)))
-    ("Is3D" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it257.html"))
-    ("IsIsotropic" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it258.html"))
-    ("IsManipulatorTarget" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it259.html"))
-    ("IsSelected" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s()" ("objects_it260.html"))
-    ("RequestsAxes" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s( )" ("objects_it271.html"))
-    ("SetData" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it280.html"))
-    ("SetParameterSet" fun "IDLitVisualization" (system) "Result = Obj->[%s::]%s(ParameterSet)" ("objects_it282.html"))
-    ("Add" pro "IDLitWindow" (system) "Obj->[%s::]%s, Objects" ("objects_it289.html" ("POSITION" . 1092060)))
-    ("AddWindowEventObserver" pro "IDLitWindow" (system) "Obj->[%s::]%s, Objects" ("objects_it290.html"))
-    ("Cleanup" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it291.html"))
-    ("ClearSelections" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it292.html"))
-    ("OnKeyboard" pro "IDLitWindow" (system) "Obj->[%s::]%s, IsASCII, Character, KeySymbol, X, Y, Press, Release, Modifiers" ("objects_it298.html"))
-    ("OnMouseDown" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y, ButtonMask, Modifiers, NumClicks" ("objects_it299.html"))
-    ("OnMouseMotion" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y, Modifiers" ("objects_it300.html"))
-    ("OnMouseUp" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y, ButtonMask" ("objects_it301.html"))
-    ("OnScroll" pro "IDLitWindow" (system) "Obj->[%s::]%s, X, Y" ("objects_it302.html"))
-    ("Remove" pro "IDLitWindow" (system) "Obj->[%s::]%s, Object" ("objects_it303.html" ("ALL" . 1092903) ("POSITION" . 1092905)))
-    ("RemoveWindowEventObserver" pro "IDLitWindow" (system) "Obj->[%s::]%s, Objects" ("objects_it304.html"))
-    ("SetCurrentZoom" pro "IDLitWindow" (system) "Obj->[%s::]%s, ZoomFactor" ("objects_it305.html" ("RESET" . 1092996)))
-    ("SetEventMask" pro "IDLitWindow" (system) "Obj->[%s::]%s([EventMask])" ("objects_it306.html" ("BUTTON_EVENTS" . 1093069) ("KEYBOARD_EVENTS" . 1093071) ("MOTION_EVENTS" . 1093073) ("TRACKING_EVENTS" . 1093075)))
-    ("SetManipulatorManager" pro "IDLitWindow" (system) "Obj->[%s::]%s, Manager" ("objects_it307.html"))
-    ("SetProperty" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it308.html" ))
-    ("ZoomIn" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it309.html"))
-    ("ZoomOut" pro "IDLitWindow" (system) "Obj->[%s::]%s" ("objects_it310.html"))
-    ("DoHitTest" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s(X, Y)" ("objects_it293.html" ("DIMENSIONS" . 1092195) ("ORDER" . 1247287) ("SUB_HIT" . 1092197) ("UNITS" . 1092202)))
-    ("GetEventMask" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s()" ("objects_it294.html" ("BUTTON_EVENTS" . 1092316) ("KEYBOARD_EVENTS" . 1092318) ("MOTION_EVENTS" . 1092320) ("TRACKING_EVENTS" . 1092322)))
-    ("GetSelectedItems" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s()" ("objects_it296.html" ("ALL" . 1247360) ("COUNT" . 1154724)))
-    ("Init" fun "IDLitWindow" (system) "Result = Obj->[%s::]%s()" ("objects_it297.html" ))
-    ("Cleanup" pro "IDLitWriter" (system) "Obj->[%s::]%s" ("objects_it313.html"))
-    ("GetProperty" pro "IDLitWriter" (system) "Obj->[%s::]%s" ("objects_it316.html" ) ("objects_it312.html" ("TYPES" . 1394697)))
-    ("SetFilename" pro "IDLitWriter" (system) "Obj->[%s::]%s, Filename" ("objects_it320.html"))
-    ("SetProperty" pro "IDLitWriter" (system) "Obj->[%s::]%s" ("objects_it321.html" ))
-    ("GetFileExtensions" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s()" ("objects_it314.html" ("COUNT" . 1093562)))
-    ("GetFilename" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s()" ("objects_it315.html"))
-    ("Init" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s(, Extensions)" ("objects_it317.html" ) ("objects_it312.html" ("TYPES" . 1394697)))
-    ("IsA" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s(Filename)" ("objects_it318.html"))
-    ("SetData" fun "IDLitWriter" (system) "Result = Obj->[%s::]%s(Data)" ("objects_it319.html"))
-    ("GetProperty" pro "IDLjavaObject" (system) "Obj->[%s::]%s" ("objects_misc30.html" ))
-    ("SetProperty" pro "IDLjavaObject" (system) "Obj->[%s::]%s" ("objects_misc32.html" ))
-    ("Init" fun "IDLjavaObject" (system) "Result = Obj -> [%s::]%s(, JavaClassName[, Arg1, ...])" ("objects_misc31.html" ))
-    ("Reset" pro "TrackBall" (system) "Obj->[%s::]%s, Center, Radius" ("objects_misc36.html" ("AXIS" . 1004145) ("CONSTRAIN" . 1004150) ("MOUSE" . 1004152)))
-    ("Init" fun "TrackBall" (system) "Result = Obj->[%s::]%s(, Center, Radius)" ("objects_misc35.html" ("AXIS") ("CONSTRAIN") ("MOUSE")) ("objects_misc34.html" ("AXIS" . 1010189) ("CONSTRAIN" . 1010194) ("MOUSE" . 1010196)))
-    ("Update" fun "TrackBall" (system) "Result = Obj->[%s::]%s( sEvent)" ("objects_misc37.html" ("MOUSE" . 1004192) ("TRANSFORM" . 1004197) ("TRANSLATE" . 1004199)))
-   )
-  "1850 builtin routines with 7685 keywords for IDL version 6.1.")
-
-(defvar idlwave-system-variables-alist
-  '(
-    ("C" (link "sysvars7.html#wp997337"))
-    ("CPU" (tags ("HW_VECTOR") ("VECTOR_ENABLE") ("HW_NCPU") ("TPOOL_NTHREADS") ("TPOOL_MIN_ELTS") ("TPOOL_MAX_ELTS")) (link "sysvars6.html#wp1014201"))
-    ("D" (tags ("NAME" . 997486) ("X_SIZE" . 997529) ("Y_SIZE" . 997529) ("X_VSIZE" . 997534) ("Y_VSIZE" . 997534) ("X_CH_SIZE" . 997518) ("Y_CH_SIZE" . 997518) ("X_PX_CM" . 997524) ("Y_PX_CM" . 997524) ("N_COLORS" . 997482) ("TABLE_SIZE" . 997494) ("FILL_DIST" . 997350) ("WINDOW" . 997514) ("UNIT" . 1008156) ("FLAGS" . 997354) ("ORIGIN" . 997490) ("ZOOM" . 997538)) (link "sysvars7.html#wp997347"))
-    ("DIR" (link "sysvars6.html#wp997072"))
-    ("DLM_PATH" (link "sysvars6.html#wp1004032"))
-    ("DPI" (link "sysvars4.html#wp996942"))
-    ("DTOR" (link "sysvars4.html#wp996946"))
-    ("EDIT_INPUT" (link "sysvars6.html#wp1004047"))
-    ("ERROR_STATE" (tags ("NAME") ("BLOCK") ("CODE") ("SYS_CODE") ("SYS_CODE_TYPE") ("MSG") ("SYS_MSG") ("MSG_PREFIX")) (link "sysvars5.html#wp1003013"))
-    ("EXCEPT" (link "sysvars5.html#wp1002623"))
-    ("HELP_PATH" (link "sysvars6.html#wp1000204"))
-    ("JOURNAL" (link "sysvars6.html#wp997085"))
-    ("MAKE_DLL" (tags ("COMPILE_DIRECTORY") ("COMPILER_NAME") ("CC") ("LD")) (link "sysvars6.html#wp1009307"))
-    ("MAP" (tags ("PROJECTION") ("SIMPLE") ("FILL_METHOD") ("UP_FLAGS") ("UP_NAME") ("P0LON") ("P0LAT") ("U0") ("V0") ("SINO") ("COSO") ("ROTATION") ("SINR") ("COSR") ("A") ("E2") ("UV") ("POLE") ("UV_BOX") ("LL_BOX") ("SEGMENT_LENGTH") ("P") ("PIPELINE")) (link "sysvars4.html#wp996950"))
-    ("MORE" (link "sysvars6.html#wp997090"))
-    ("MOUSE" (tags ("X") ("Y") ("BUTTON") ("TIME")) (link "sysvars5.html#wp1000051"))
-    ("ORDER" (link "sysvars7.html#wp997544"))
-    ("P" (tags ("BACKGROUND" . 997554) ("CHARSIZE" . 997560) ("CHARTHICK" . 997563) ("CLIP" . 997566) ("COLOR" . 997569) ("FONT" . 997572) ("LINESTYLE" . 997575) ("MULTI" . 1004014) ("NOCLIP" . 997613) ("NOERASE" . 997616) ("NSUM" . 997619) ("POSITION" . 1006945) ("PSYM" . 997627) ("REGION" . 997633) ("SUBTITLE" . 997636) ("SYMSIZE") ("T" . 997639) ("T3D" . 997642) ("THICK" . 997645) ("TITLE" . 997648) ("TICKLEN" . 997651) ("CHANNEL" . 997557)) (link "sysvars7.html#wp997551"))
-    ("PATH" (link "sysvars6.html#wp997094"))
-    ("PI" (link "sysvars4.html#wp996954"))
-    ("PROMPT" (link "sysvars6.html#wp997101"))
-    ("QUIET" (link "sysvars6.html#wp997106"))
-    ("RADEG" (link "sysvars4.html#wp996958"))
-    ("VALUES" (tags ("F_INFINITY") ("F_NAN") ("D_INFINITY") ("D_NAN")) (link "sysvars4.html#wp996962"))
-    ("VERSION" (tags ("ARCH") ("OS") ("OS_FAMILY") ("OS_NAME") ("RELEASE") ("BUILD_DATE") ("MEMORY_BITS") ("FILE_OFFSET_BITS")) (link "sysvars6.html#wp997111"))
-    ("WARN" (tags ("OBS_ROUTINES") ("OBS_SYSVARS") ("PARENS")) (link "sysvars5.html#wp1000387"))
-    ("X" (tags ("TITLE" . 997839) ("TYPE" . 997842) ("STYLE" . 997742) ("TICKS" . 999577) ("TICKLEN" . 1012793) ("THICK" . 997798) ("RANGE" . 997713) ("CRANGE" . 997670) ("S" . 997736) ("MARGIN" . 997689) ("OMARGIN" . 997702) ("WINDOW" . 997845) ("REGION" . 997724) ("CHARSIZE" . 1012787) ("MINOR" . 997699) ("TICKV" . 997833) ("TICKNAME" . 997811) ("GRIDSTYLE" . 998134) ("TICKFORMAT" . 997801) ("TICKINTERVAL" . 997808) ("TICKLAYOUT" . 1012924) ("TICKUNITS" . 1012962)) (link "sysvars7.html#wp997657"))
-    ("Y" (tags ("TITLE" . 997839) ("TYPE" . 997842) ("STYLE" . 997742) ("TICKS" . 999577) ("TICKLEN" . 1012793) ("THICK" . 997798) ("RANGE" . 997713) ("CRANGE" . 997670) ("S" . 997736) ("MARGIN" . 997689) ("OMARGIN" . 997702) ("WINDOW" . 997845) ("REGION" . 997724) ("CHARSIZE" . 1012787) ("MINOR" . 997699) ("TICKV" . 997833) ("TICKNAME" . 997811) ("GRIDSTYLE" . 998134) ("TICKFORMAT" . 997801) ("TICKINTERVAL" . 997808) ("TICKLAYOUT" . 1012924) ("TICKUNITS" . 1012962)) (link "sysvars7.html#wp997657"))
-    ("Z" (tags ("TITLE" . 997839) ("TYPE" . 997842) ("STYLE" . 997742) ("TICKS" . 999577) ("TICKLEN" . 1012793) ("THICK" . 997798) ("RANGE" . 997713) ("CRANGE" . 997670) ("S" . 997736) ("MARGIN" . 997689) ("OMARGIN" . 997702) ("WINDOW" . 997845) ("REGION" . 997724) ("CHARSIZE" . 1012787) ("MINOR" . 997699) ("TICKV" . 997833) ("TICKNAME" . 997811) ("GRIDSTYLE" . 998134) ("TICKFORMAT" . 997801) ("TICKINTERVAL" . 997808) ("TICKLAYOUT" . 1012924) ("TICKUNITS" . 1012962)) (link "sysvars7.html#wp997657"))))
-
-
-(defvar idlwave-system-class-info
-  '(
-    ("IDLgrContour" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRCONTOUR_TOP" "IDLGRCONTOURVERSION" "AM_PM" "ANISOTROPY" "DATA_FORMAT" "DATA" "DAYS_OF_WEEK" "GEOM_FORMAT" "GEOM" "CONTOURFLAGS" "C_COLOR" "C_FILLPATTERN" "C_LABEL_INTERVAL" "C_LABEL_NOGAPS" "C_LABEL_OBJECTS" "C_LABEL_SHOW" "C_LINESTYLE" "C_THICK" "C_USE_LABEL_COLOR" "C_USE_LABEL_ORIENTATION" "C_VALUE" "LABEL_DEFAULTS" "LABEL_FONT" "LABEL_FORMAT" "LABEL_FRMTDATA" "LABEL_UNITS" "LABEL_UNIT_CODE" "MAXVAL" "MINVAL" "MONTHS" "NLEVELS" "POLYGONS" "SHADERANGE" "SHADING" "TICKINTERVAL" "TICKLEN" "PRECISIONDATA" "PRECISIONGEOM" "PRECISIONGRAPH" "LEVELINFO" "CFILL1" "DEPTHOFFSET" "MAPINFO" "IDLGRCONTOUR_BOTTOM") (inherits "IDLitComponent") (link "objects_gr43.html"))
-    ("IDLgrAxis" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRAXIS_TOP" "IDLGRAXISVERSION" "AM_PM" "AXIS_TYPE" "CALCFLAGS" "DAYS_OF_WEEK" "DIRECTION" "AXISFLAGS" "GRIDSTYLE" "LOCATION" "MAJOR" "MINOR" "MONTHS" "OUTRANGE" "RANGE" "SUBTICKLEN" "TEXTALIGNMENTS" "TEXTBASELINE" "TEXTUPDIR" "THICK" "TICKDIR" "TICKFORMAT" "ARRAY_TICKFORMAT" "TICKFRMTDATA" "TICKINTERVAL" "TICKLAYOUT" "TICKLEN" "TICKTEXT" "TICKUNITCODES" "TICKUNITS" "TICKVALUES" "TITLE" "CURRENT_LEVEL" "LEVEL_DATA" "STEPRANGEUNITS" "STEPRANGE" "IDLGRAXIS_BOTTOM") (inherits "IDLitComponent") (link "objects_gr3.html"))
-    ("IDLitWindow" (tags "IDLITWINDOW_TOP" "IDLITWINDOWFLAGS" "EVENTMASK" "EVENTNOTIFIER" "SCENE" "PEVENTS" "IDLITWIN_FILL1" "PEVENTTAIL" "IDLITWIN_FILL2" "IDLITWINDOW_BOTTOM") (inherits "IDLgrWindow") (link "objects_it287.html"))
-    ("IDLitVisualization" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN" "_OPROPINTERSECTION" "_OAGGCHILDREN" "__$$__" "GEOMREFCOUNT" "CENTERROTATION" "IHAVECENTERROTATION" "IMPACTSRANGE" "ISSELECTED" "IS3D" "DIMMETHOD" "ISOTROPIC" "ISMANIPULATORTARGET" "_SELECTIONPAD" "OGROUPPARENT" "OCURRSELECTIONVISUAL" "_CREATEDDURINGINIT" "_OSELECTIONVISUAL" "_PSTRTYPE" "AXESREQUEST" "AXESMETHOD" "AXESSTYLEREQUEST" "DOREQUESTAXESSTYLE" "_BISDELETED") (inherits "IDLgrModel" "IDLitParameter" "IDLitIMessaging") (link "objects_it237.html"))
-    ("IDLitManipulatorVisual" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN" "_OPROPINTERSECTION" "_OAGGCHILDREN" "__$$__" "GEOMREFCOUNT" "CENTERROTATION" "IHAVECENTERROTATION" "IMPACTSRANGE" "ISSELECTED" "IS3D" "DIMMETHOD" "ISOTROPIC" "ISMANIPULATORTARGET" "_SELECTIONPAD" "OGROUPPARENT" "OCURRSELECTIONVISUAL" "_CREATEDDURINGINIT" "_OSELECTIONVISUAL" "_PSTRTYPE" "AXESREQUEST" "AXESMETHOD" "AXESSTYLEREQUEST" "DOREQUESTAXESSTYLE" "_STRVISUALTYPE" "_UNIFORMSCALE") (inherits "IDLgrModel" "IDLitIMessaging") (link "objects_it128.html"))
-    ("IDLgrSurface" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRSURFACE_TOP" "IDLGRSURFACEVERSION" "DATA" "PRECISION" "SKIRT" "VERTCOLORS" "BTMCOLOR" "AMBIENT" "DIFFUSE" "SPECULAR" "EMISSION" "SHININESS" "SURFACEFLAGS" "LINESTYLE" "MAXVALUE" "MINVALUE" "SHADING" "SHADERANGE" "STYLE" "NORMALS" "TXTRCOORD" "TXTRMAP" "TXTRHIGHRES" "THICK" "DEPTHOFFSET" "IDLGRSURFACE_BOTTOM") (inherits "IDLitComponent") (link "objects_gr173.html"))
-    ("IDLgrLegend" (tags "OSCALENODE" "BORDER_GAP" "COLUMNS" "OOUTLINE" "OFILL" "OFONT" "GAP" "GLYPHWIDTH" "PITEM_COLOR" "PITEM_LINESTYLE" "PITEM_NAME" "PITEM_OBJECT" "PITEM_THICK" "PITEM_TYPE" "OTITLE" "PTEXT_COLOR" "BRECOMPUTE" "PGLYPHS" "PTEXTS" "HGLYPHWIDTH" "VGLYPHWIDTH" "COLORMODE" "CLEANLEAVE" "CLEANGLYPHS" "IDLGRLEGENDVERSION") (inherits "IDLgrModel") (link "objects_gr65.html"))
-    ("IDLgrPolygon" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYGON_TOP" "IDLGRPOLYGONVERSION" "DATA" "PRECISION" "FILLPATTERN" "POLYGONS" "NORMALS" "POLYGONFLAGS" "SHADING" "SHADERANGE" "STYLE" "TXTRCOORD" "TXTRMAP" "VERTCOLORS" "BTMCOLOR" "AMBIENT" "DIFFUSE" "SPECULAR" "EMISSION" "SHININESS" "LINESTYLE" "THICK" "DEPTHOFFSET" "IDLGRPOLYGON_BOTTOM") (inherits "IDLitComponent") (link "objects_gr124.html"))
-    ("IDLgrWindow" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRWINDOW_TOP" "IDLGRWINDOWVERSION" "WINDOWFLAGS" "CURRENT_ZOOM" "DIMENSIONS" "DISPLAYNAME" "INDEX" "LOCATION" "MINIMUM_VIRTUAL_DIMENSIONS" "ORIGINAL_VIRTUAL_DIMENSIONS" "RENDERER" "RETAIN" "SCREENDIMENSIONS" "SELF" "TITLE" "UNITS" "VIRTUAL_DIMENSIONS" "VISIBLE_LOCATION" "ZOOM_BASE" "ZOOM_NSTEP" "EXTERNAL_WINDOW" "NEXT" "WFILL1" "PARENT" "WFILL2" "IDLGRWINDOW_BOTTOM") (inherits "IDLitComponent") (link "objects_gr235.html"))
-    ("IDLgrPolyline" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYLINE_TOP" "IDLGRPOLYLINEVERSION" "POLYLINEFLAGS" "DATA" "PRECISION" "LABEL_NOGAPS" "LABEL_OBJECTS" "LABEL_OFFSETS" "LABEL_POLYLINES" "LINESTYLE" "POLYLINES" "SYMBOL" "PSYMBOL" "THICK" "SHADING" "USE_LABEL_COLOR" "USE_LABEL_ORIENTATION" "VERTCOLORS" "LABEL_INFO" "FILL1" "IDLGRPOLYLINE_BOTTOM") (inherits "IDLitComponent") (link "objects_gr131.html"))
-    ("IDLgrROI" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRROI_TOP" "IDLGRROIVERSION" "LINESTYLE" "STYLE" "SYMBOL" "THICK" "IDLGRROI_BOTTOM") (inherits "IDLanROI" "IDLitComponent") (link "objects_gr150.html"))
-    ("IDLitManipulatorManager" (tags "_OOLDCURR" "_ODEFAULT" "_OWINCURR" "_CURROBS") (inherits "IDLitManipulatorContainer") (link "objects_it121.html"))
-    ("IDLgrVolume" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRVOLUME_TOP" "IDLGRVOLUMEVERSION" "AMBIENT" "BOUNDS" "LIMITS" "DIMENSIONS" "COLORTABLE" "COMPOSITEFUNC" "CUTPLANES" "NUMCUTPLANES" "DEPTH_CUE" "OPACITYTABLE" "RENDERSTEP" "DATA" "EDM_VOLUME" "VOLUMEFLAGS" "IDLGRVOLUME_BOTTOM") (inherits "IDLitComponent") (link "objects_gr216.html"))
-    ("IDLgrPlot" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPLOT_TOP" "IDLGRPLOTVERSION" "DATA" "PLOTFLAGS" "LINESTYLE" "PRECISION" "MAXVAL" "MINVAL" "NSUM" "SYMBOL" "PSYMBOL" "THICK" "VERTCOLORS" "ZVALUE" "LINEDATA" "PFILL1" "IDLGRPLOT_BOTTOM") (inherits "IDLitComponent") (link "objects_gr117.html"))
-    ("IDLgrROIGroup" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRROIGROUP_TOP" "IDLGRROIGROUPVERSION" "IDLGRROIGROUP_BOTTOM") (inherits "IDLanROIGroup" "IDLitComponent") (link "objects_gr157.html"))
-    ("IDLgrText" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRTEXT_TOP" "IDLGRTEXTVERSION" "TEXTFLAGS" "ALIGNMENT" "BASELINE" "CHAR_DIMENSIONS" "RECOMP_CTM" "FONT" "LOCATIONS" "STRINGS" "SUBPARENT" "UPDIR" "VERTICAL_ALIGNMENT" "FILL_COLOR" "RENDER_MODE" "IDLGRTEXT_BOTTOM") (inherits "IDLitComponent") (link "objects_gr193.html"))
-    ("IDLitManipulatorContainer" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN" "M_BAUTOSWITCH" "M_CURRMANIP") (inherits "IDLitManipulator" "IDL_Container") (link "objects_it107.html"))
-    ("IDLgrColorbar" (tags "OCOORDCONVNODE" "OSCALENODE" "MAXDIM" "DIMENSIONS" "OAXIS" "OPOLY" "OSURF" "OIMAGE" "OPALETTE" "FREE_PALETTE" "SHOW_AXIS" "IDLGRCOLORBARVERSION") (inherits "IDLgrModel") (link "objects_gr36.html"))
-    ("IDLitTool" (tags "__VOID" "_STRTOOLNAME" "_STRFILENAME" "_IDCURRENT" "_STRVERSION" "_STRWORKINGDIRECTORY" "_OSYSTEM" "_MANIPULATORS" "_OUISERVICECONN" "_OUICONNECTION" "_OWINDOW" "_COMMANDBUFFER" "_OLASTERROR" "_PDISPATCHTABLE" "_TYPES" "_STATUSBAR" "_IBUFFERLOCATION" "_IDISABLEUPDATES" "_NSELCHANGE" "_CURRSTATUSSEGMENTID" "_BNOREDRAW" "_BDIRTY" "_NOSAVEPROMPT" "_BUPDATEBYTYPE" "_BCHANGEDIRECTORY") (inherits "IDLitContainer" "IDLitIMessaging") (link "objects_it180.html"))
-    ("IDLgrImage" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRIMAGE_TOP" "IDLGRIMAGEVERSION" "CHANNEL" "DATA" "DIMENSIONS" "SUB_RECT" "IMAGEFLAGS" "LOCATION" "INTERLEAVE" "INTERPOLATE" "BLEND_FUNCTIONS" "IDLGRIMAGE_BOTTOM") (inherits "IDLitComponent") (link "objects_gr58.html"))
-    ("IDLgrLight" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "ALPHACHANNEL" "CLIP_PLANES" "COLOR" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRLIGHT_TOP" "IDLGRLIGHTVERSION" "ATTENUATION" "CONEANGLE" "DIRECTION" "FOCUS" "INTENSITY" "LOCATION" "TYPE" "IDLGRLIGHT_BOTTOM") (inherits "IDLitComponent") (link "objects_gr72.html"))
-    ("IDLgrView" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRVIEW_TOP" "IDLGRVIEWVERSION" "VIEWFLAGS" "COLOR" "DEPTH_CUE" "DIMENSIONS" "PRECISION" "EYE" "LOCATION" "OBLIQUE" "PROJECTION" "TRANSPARENT" "UNITS" "VIEW" "ZCLIP" "IDLGRVIEW_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr200.html"))
-    ("IDLgrVRML" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRVRML_TOP" "IDLGRVRMLVERSION" "UNITS" "DIMENSIONS" "FILENAME" "WORLDINFO" "WORLDTITLE" "IDLGRVRML_BOTTOM") (inherits "IDLitComponent") (link "objects_gr225.html"))
-    ("IDLgrClipboard" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRCLIPBOARD_TOP" "IDLGRCLIPBOARDVERSION" "UNITS" "DIMENSIONS" "FILENAME" "VECTOR" "POSTSCRIPT" "IDLGRCLIPBOARD_BOTTOM") (inherits "IDLitComponent") (link "objects_gr25.html"))
-    ("IDLgrPrinter" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRPRINTER_TOP" "IDLGRPRINTERVERSION" "PRINTERFLAGS" "NCOPIES" "UNITS" "GAMMA" "IDLGRPRINTER_BOTTOM") (inherits "IDLitComponent") (link "objects_gr138.html"))
-    ("IDLitManipulator" (tags "PSELECTIONLIST" "NSELECTIONLIST" "BUTTONPRESS" "_OCMDSET" "_TYPES" "_OHITVIS" "_OHITVIEWGROUP" "_PSUBHITLIST" "_STRVISUALTYPE" "_IDOPERATION" "_IDPARAMETER" "_DEFAULTCURSOR" "_SUBTYPE" "_STRTMPMSG" "_SKIPMACROHISTORY" "_TRANSMOTION" "_INTRANSMOTION" "_TRANSIENT" "_KEYTRANSIENT" "_DISABLE" "_VIEWMODE" "_UIEVENTMASK" "_OLDQUALITY" "_DRAQQUAL" "_NORMALIZEDZ") (inherits "IDLitComponent" "IDLitIMessaging") (link "objects_it91.html"))
-    ("IDLgrModel" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRMODEL_TOP" "IDLGRMODELVERSION" "MODELFLAGS" "CLIP_PLANES" "DEPTH_TEST_DISABLE" "DEPTH_TEST_FUNCTION" "DEPTH_WRITE_DISABLE" "TRANSFORM" "IDLGRMODEL_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr79.html"))
-    ("IDLgrBuffer" (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRBUFFER_TOP" "IDLGRBUFFERVERSION" "UNITS" "DIMENSIONS" "IDLGRBUFFER_BOTTOM") (inherits "IDLitComponent") (link "objects_gr10.html"))
-    ("IDLitParameterSet" (tags "_PNAMES") (inherits "IDLitDataContainer") (link "objects_it159.html"))
-    ("IDLitDataContainer" (tags "_ONOTIFIER" "_PDATA" "_PMETADATA" "_TYPE" "_AUTODELETE" "_NREF" "_PDESTRUCT" "_HIDE" "_READ_ONLY" "_IDISABLE" "_IUPDATES" "_BINSEARCH") (inherits "IDLitContainer") (link "objects_it59.html"))
-    ("IDLgrScene" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRSCENE_TOP" "IDLGRSCENEVERSION" "COLOR" "TRANSPARENT" "IDLGRSCENE_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr165.html"))
-    ("IDLgrViewgroup" (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "PARENT" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRVIEWGROUP_TOP" "IDLGRVIEWGROUPVERSION" "IDLGRVIEWGROUP_BOTTOM") (inherits "IDLitComponent" "IDL_Container") (link "objects_gr208.html"))
-    ("IDLitUI" (tags "_MENUBARS" "_TOOLBARS" "_STATUSBAR" "_UISERVICES" "_PDISPATCHSUBJECT" "_PDISPATCHOBSERVER" "_OTOOL" "_IDISPATCH" "_WBASE") (inherits "IDLitContainer") (link "objects_it222.html"))
-    ("IDLitDataOperation" (tags "_NAN" "_WITHINUI" "_RECORDPROPERTIES") (inherits "IDLitOperation") (link "objects_it69.html"))
-    ("IDLgrMPEG" (tags "IDLGRMPEG_TOP" "IDLGRMPEGVERSION" "DIMENSIONS" "FILENAME" "FORMAT" "FRAMERATE" "INTERLACED" "QUALITY" "SCALE" "STATISTICS" "DISPLAYDIMS" "FIRSTFRAME" "LASTFRAME" "MPEGID" "TEMPNODE" "TEMPNODEFILLER" "TEMP_DIRECTORY" "BITRATE" "IFRAME_GAP" "MOTION_LENGTH" "FLAGS" "IDLGRMPEG_BOTTOM") (link "objects_gr93.html"))
-    ("IDLitCommandSet" (inherits "IDLitCommand" "IDL_Container") (link "objects_it12.html"))
-    ("IDLitContainer" (tags "_BISMESSAGER" "_CLASSNAME" "_OCHILDREN") (inherits "IDLitComponent" "IDL_Container") (link "objects_it33.html"))
-    ("IDLitOperation" (tags "_BEXPENSIVE" "_REVERSIBLE" "_BSHOWEXECUTIONUI" "_BSKIPHISTORY" "_BSKIPMACRO" "_BMACROSHOWUIIFNULLCMD" "_BMACROSUPPRESSREFRESH" "_TYPES") (inherits "IDLitComponent" "IDLitIMessaging") (link "objects_it134.html"))
-    ("IDLitData" (tags "_ONOTIFIER" "_PDATA" "_PMETADATA" "_TYPE" "_AUTODELETE" "_NREF" "_PDESTRUCT" "_HIDE" "_READ_ONLY") (inherits "IDLitComponent") (link "objects_it44.html"))
-    ("IDLitWriter" (tags "_TYPES" "_BITDEPTH" "_GRAPHICSFORMAT" "_SCALEFACTOR") (inherits "IDLitReader") (link "objects_it311.html"))
-    ("IDLdbRecordset" (tags "IDLDBRECORDSET_TOP" "IDLDBRECORDSETVERSION" "ISTABLE" "PDBOBJ" "ISREADONLY" "NFIELDS" "CURROW" "SOURCE" "CURSORTYPE" "PFIELDS" "PSDEF" "ROWSTATUS" "ROWSET" "ROWPOS" "HSTMT" "HDBC" "IDLDBRECORDSET_BOTTOM") (link "api14.html"))
-    ("IDLffLangCat" (tags "FILENAMES" "_AVAILABLE_FILES" "LANGUAGE" "DEFAULT_LANGUAGE" "APPLICATIONS" "APPLICATION_PATH" "KEYS" "N_KEYS" "STRINGS" "DEF_KEYS" "N_DEF_KEYS" "DEF_STRINGS" "AVAILABLE_LANGUAGES" "VERBOSE" "STRICT" "IDLFFLANGCATVERSION") (link "objects_ff44.html"))
-    ("IDLitCommand" (tags "_PDATADICTIONARY" "_SIZEITEMS" "_STRIDTARGET" "_STRIDOPERATION") (inherits "IDLitComponent") (link "objects_it3.html"))
-    ("IDLdbDatabase" (tags "IDLDBDATABASE_TOP" "IDLDBDATABASEVERSION" "READONLY" "ISCONNECTED" "FETCHDIR" "POSOPS" "POSSTATEMENTS" "SCROLLCONCUR" "SCROLLOPTIONS" "STATICSENSE" "GETDATAEXT" "USINGCURSOR" "NSTATEMENTS" "P_RECOBJS" "HDBC" "IDLDBDATABASE_BOTTOM") (link "api6.html"))
-    ("IDLitReader" (tags "_STRFILENAME" "_PEXTENSIONS") (inherits "IDLitComponent" "IDLitIMessaging") (link "objects_it169.html"))
-    ("IDLanROI" (tags "IDLANROI_TOP" "IDLANROIVERSION" "IDLANROIFLAGS" "NALLOCVERTS" "NUSEDVERTS" "BLOCKSIZE" "DATA" "TYPE" "PRECISION" "PLANE" "ROI_XRANGE" "ROI_YRANGE" "ROI_ZRANGE" "IDLANROI_BOTTOM") (link "objects_an3.html"))
-    ("IDLanROIGroup" (tags "IDLANROIGROUP_TOP" "IDLANROIGROUPVERSION" "IDLANROIGROUPFLAGS" "ROIGROUP_XRANGE" "ROIGROUP_YRANGE" "ROIGROUP_ZRANGE" "IDLANROIGROUP_BOTTOM") (inherits "IDL_Container") (link "objects_an18.html"))
-    ("IDLffXMLDOMDocument" (tags "IDLFFXMLDOMDOCUMENT_TOP" "_DOM_IMPLEMENTATION" "_DOM_PARSER" "_DOM_ERROR_REPORTER" "_DOM_MEMORY_MANAGER" "IDLFFXMLDOMDOCUMENT_BOTTOM") (inherits "IDLffXMLDOMText") (link "objects_ff102.html"))
-    ("IDLgrPalette" (tags "IDLGRPALETTE_TOP" "IDLGRPALETTE_SERIALNUM" "IDLGRPALETTEVERSION" "GAMMA" "BOTTOMSTRETCH" "TOPSTRETCH" "NENTRIES" "ORIGLUT" "CURRLUT" "INVTABLE" "UVALUE" "NAME" "IDLGRPALETTE_BOTTOM") (link "objects_gr101.html"))
-    ("IDLitComponent" (tags "IDLITCOMPONENT_TOP" "IDLITCOMPONENTVERSION" "DESCRIPTION" "NAME" "ICON" "IDENTIFIER" "HELP" "UVALUE" "_PARENT" "PROPERTYDESCRIPTORS" "_FLAGS" "IDLITCOMPONENT_BOTTOM") (link "objects_it17.html"))
-    ("IDLgrSymbol" (tags "IDLGRSYMBOL_TOP" "IDLGRSYMBOLVERSION" "COLOR" "DATA" "SIZE" "THICK" "FLAGS" "UVALUE" "NAME" "ALPHA_CHANNEL" "IDLGRSYMBOL_BOTTOM") (link "objects_gr180.html"))
-    ("IDLgrFont" (tags "IDLGRFONT_TOP" "IDLGRFONTVERSION" "FONTFLAGS" "HERSHEY" "NAME" "SIZE" "SUBSTITUTE" "THICK" "ID" "UVALUE" "IDLGRFONT_BOTTOM") (link "objects_gr52.html"))
-    ("IDLgrPattern" (tags "IDLGRPATTERN_TOP" "IDLGRPATTERNVERSION" "ORIENTATION" "PATTERN" "SPACING" "STYLE" "THICK" "UVALUE" "NAME" "IDLGRPATTERN_BOTTOM") (link "objects_gr111.html"))
-    ("IDLffDXF" (tags "IDLFFDXF_TOP" "IDLFFDXFVERSION" "DXFREADVALID" "DXFHANDLEVALID" "DXFLUT" "SERIAL" "DXFHANDLE" "DXFHANDLEFILLER" "IDLFFDXF_BOTTOM") (link "objects_ff21.html"))
-    ("IDLffShape" (tags "IDLFFSHAPE_TOP" "IDLFFSHAPEVERSION" "FILENAME" "ISOPEN" "SHPTYPE" "PATTRIBUTE" "SHAPEHANDLE" "DBFHANDLE" "IDLFFSHAPE_BOTTOM") (link "objects_ff59.html"))
-    ("IDLffXMLSAX" (tags "IDLFFXMLSAX_TOP" "IDLFFXMLSAXVERSION" "VALIDATION_MODE" "HALT_PROCESSING" "FILENAME" "_XML_PARSER" "_XML_LOCATOR" "IDLFFXMLSAX_BOTTOM") (link "objects_ff209.html"))
-    ("TrackBall" (tags "BTNDOWN" "AXIS" "CONSTRAIN" "MOUSE" "CENTER" "RADIUS" "PT0" "PT1") (link "objects_misc33.html"))
-    ("IDLgrTessellator" (tags "IDLGRTESSELLATOR_TOP" "IDLGRTESSELLATORVERSION" "ITESSFLAGS" "IVERTS" "HVIDLIST" "IAUXSIZE" "IAUXTYPE" "IDLGRTESSELLATOR_BOTTOM") (link "objects_gr186.html"))
-    ("IDLffDICOM" (tags "IDLFFDICOM_TOP" "IDLFFDICOMVERSION" "DICOMFLAGS" "DICOMELEMENTS" "DICOMPREAMBLE" "DICOMHANDLE" "DICOMHANDLEFILLER" "IDLFFDICOM_BOTTOM") (link "objects_ff3.html"))
-    ("IDLffXMLDOMText" (inherits "IDLffXMLDOMProcessingInstruction") (link "objects_ff203.html"))
-    ("IDLffXMLDOMProcessingInstruction" (inherits "IDLffXMLDOMAttr") (link "objects_ff196.html"))
-    ("IDLffXMLDOMAttr" (inherits "IDLffXMLDOMElement") (link "objects_ff74.html"))
-    ("IDLffXMLDOMElement" (inherits "IDLffXMLDOMNode") (link "objects_ff130.html"))
-    ("IDLffXMLDOMNamedNodeMap" (tags "IDLFFXMLDOMNAMEDNODEMAP_TOP" "IDLFFXMLDOMNAMEDNODEMAPVERSION" "_IDLFFXMLDOMNAMEDNODEMAPNODE" "_IDLFFXMLDOMNAMEDNODEMAPOWNEDNODES" "_IDLFFXMLDOMNAMEDNODEMAPOWNER" "_IDLFFXMLDOMNAMEDNODEMAPDOCUMENT" "IDLFFXMLDOMNAMEDNODEMAP_BOTTOM") (link "objects_ff153.html"))
-    ("IDLffXMLDOMNode" (inherits "IDLffXMLDOMNotation") (link "objects_ff162.html"))
-    ("IDLffXMLDOMNotation" (inherits "IDLffXMLDOMCharacterData") (link "objects_ff190.html"))
-    ("IDLffXMLDOMNodeList" (tags "IDLFFXMLDOMNODELIST_TOP" "IDLFFXMLDOMNODELISTVERSION" "_IDLFFXMLDOMNODELISTNODE" "_IDLFFXMLDOMNODELISTOWNEDNODES" "_IDLFFXMLDOMNODELISTOWNER" "_IDLFFXMLDOMNODELISTDOCUMENT" "IDLFFXMLDOMNODELIST_BOTTOM") (link "objects_ff184.html"))
-    ("IDLffXMLDOMCharacterData" (inherits "IDLffXMLDOMEntity") (link "objects_ff86.html"))
-    ("IDLffXMLDOMEntity" (inherits "IDLffXMLDOMDocumentType") (link "objects_ff142.html"))
-    ("IDLffXMLDOMDocumentType" (tags "IDLFFXMLDOMNODE_TOP" "IDLFFXMLDOMNODEVERSION" "_IDLFFXMLDOMNODEDOMNODE" "_IDLFFXMLDOMNODEOWNEDNODES" "_IDLFFXMLDOMNODEOWNER" "_IDLFFXMLDOMNODEDOCUMENT" "IDLFFXMLDOMNODE_BOTTOM") (link "objects_ff123.html"))
-    ("IDL_Container" (tags "IDL_CONTAINER_TOP" "IDLCONTAINERVERSION" "PHEAD" "PTAIL" "NLIST" "IDL_CONTAINER_BOTTOM") (link "objects_misc3.html"))
-    ("IDLffJPEG2000" (tags "IDLFFJPEG2000_TOP" "CJPEG2000PTR" "IDLFFJPEG2000_BOTTOM") (link "objects_ff34.html"))
-    ("IDLitParameter" (tags "_OPARAMETERDESCRIPTORS" "_OPARAMETERSET" "_PPARAMNAMES") (link "objects_it145.html"))
-    ("IDL_Savefile" (tags "IDL_SAVEFILE_FILENAME" "IDL_SAVEFILE_RELAXED_STRUCTURE_ASSIGNMENT") (link "objects_misc13.html"))
-    ("IDLitIMessaging" (tags "__OTOOL") (link "objects_it78.html"))
-    ("IDLcomIDispatch" (link "objects_misc23.html"))
-    ("IDLffMrSID" (link "objects_ff52.html"))
-    ("IDLjavaObject" (link "objects_misc28.html"))))
-
-
-(defvar idlwave-executive-commands-alist '(
-    ("RESET_SESSION" . "symbols8.html")
-    ("TRACE" . "symbols15.html")
-    ("RNEW" . "symbols10.html")
-    ("EDIT" . "symbols4.html")
-    ("STEPOVER" . "symbols14.html")
-    ("OUT" . "symbols7.html")
-    ("RUN" . "symbols11.html")
-    ("CONTINUE" . "symbols3.html")
-    ("STEP" . "symbols13.html")
-    ("RETURN" . "symbols9.html")
-    ("GO" . "symbols6.html")
-    ("SKIP" . "symbols12.html")
-    ("FULL_RESET_SESSION" . "symbols5.html")
-    ("COMPILE" . "symbols2.html")
-))
-
-;; Special words with associated help topic files
-(defconst idlwave-help-special-topic-words
-  '(
-    ("begin" . "B2.html")
-    ("case" . "C8.html")
-    ("endcase" . "C8.html")
-    ("of" . "C8.html")
-    ("common" . "C29.html")
-    ("compile_opt" . "C30.html")
-    ("continue" . "C39.html")
-    ("endfor" . "F31.html")
-    ("for" . "F31.html")
-    ("else" . "I6.html")
-    ("endelse" . "I6.html")
-    ("endif" . "I6.html")
-    ("if" . "I6.html")
-    ("then" . "I6.html")
-    ("end" . "P28.html")
-    ("pro" . "P28.html")
-    ("endrep" . "R41.html")
-    ("repeat" . "R41.html")
-    ("until" . "R41.html")
-    ("return" . "R48.html")
-    ("endswitch" . "S82.html")
-    ("switch" . "S82.html")
-    ("do" . "W8.html")
-    ("endwhile" . "W8.html")
-    ("while" . "W8.html")
-)
-  "Association list of help files for special context words.")
-
-(provide 'idlw-rinfo)
-(provide 'idlwave-rinfo)
-
-;; arch-tag: d0b65da3-7f5e-4992-b8dd-885800b5cd6b
-;;; idlw-rinfo.el ends here
--- a/lisp/progmodes/idlw-shell.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/progmodes/idlw-shell.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1,12 +1,12 @@
 ;; idlw-shell.el --- run IDL as an inferior process of Emacs.
 ;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
+;;    Free Software Foundation
 
 ;; Authors: J.D. Smith <jdsmith@as.arizona.edu>
 ;;          Carsten Dominik <dominik@astro.uva.nl>
 ;;          Chris Chase <chase@att.com>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 ;; Keywords: processes
 
 ;; This file is part of GNU Emacs.
@@ -138,6 +138,11 @@
 
 ;; (defcustom idlwave-shell-automatic-start...)  See idlwave.el
 
+(defcustom idlwave-shell-use-dedicated-window nil
+  "*Non-nil means, never replace the shell frame with another buffer."
+  :group 'idlwave-shell-general-setup
+  :type 'boolean) 
+
 (defcustom idlwave-shell-use-dedicated-frame nil
   "*Non-nil means, IDLWAVE should use a special frame to display shell buffer."
   :group 'idlwave-shell-general-setup
@@ -313,8 +318,15 @@
 	       (const :tag "All debug and stepping commands" 	   debug)
 	       (const :tag "Close, window, retall, etc. commands"  misc))))
 
+(defcustom idlwave-shell-max-print-length 200
+  "Maximum number of array elements to print when examining."
+  :group 'idlwave-shell-command-setup
+  :type 'integer)
+
 (defcustom idlwave-shell-examine-alist 
-  '(("Print"          	. "print,___")
+  `(("Print"          	. ,(concat "idlwave_print_safe,___," 
+				   (number-to-string 
+				    idlwave-shell-max-print-length)))
     ("Help"           	. "help,___")
     ("Structure Help"  	. "help,___,/STRUCTURE")
     ("Dimensions"     	. "print,size(___,/DIMENSIONS)")
@@ -322,6 +334,7 @@
     ("N_Elements"     	. "print,n_elements(___)")
     ("All Size Info"  	. "help,(__IWsz__=size(___,/STRUCTURE)),/STRUCTURE & print,__IWsz__.DIMENSIONS")
     ("Ptr Valid"      	. "print,ptr_valid(___)")
+    ("Arg Present"      . "print,arg_present(___)")
     ("Widget Valid"     . "print,widget_info(___,/VALID)")
     ("Widget Geometry"  . "help,widget_info(___,/GEOMETRY)"))
   "Alist of special examine commands for popup selection.  
@@ -437,6 +450,11 @@
   :group 'idlwave-shell-command-setup
   :type 'boolean)
 
+(defcustom idlwave-shell-reset-no-prompt nil
+  "If non-nil, skip the yes/no prompt when resetting the IDL session."
+  :group 'idlwave-shell-command-setup
+  :type 'boolean)
+
 ;; Breakpoint Overlays etc
 (defgroup idlwave-shell-highlighting-and-faces nil
   "Highlighting and Faces used by the IDLWAVE Shell mode."
@@ -488,11 +506,11 @@
 
 (defcustom idlwave-shell-electric-stop-line-face 
   (prog1
-      (copy-face 'modeline 'idlwave-shell-electric-stop-line-face)
-    (set-face-background 'idlwave-shell-electric-stop-line-face 
+      (copy-face 'modeline 'idlwave-shell-electric-stop-line)
+    (set-face-background 'idlwave-shell-electric-stop-line 
 			 idlwave-shell-electric-stop-color)
     (condition-case nil
-	(set-face-foreground 'idlwave-shell-electric-stop-line-face nil)
+	(set-face-foreground 'idlwave-shell-electric-stop-line nil)
       (error nil)))
   "*The face for `idlwave-shell-stop-line-overlay' when in electric debug mode.
 Allows you to choose the font, color and other properties for the line
@@ -553,6 +571,7 @@
     "Face for highlighting lines with breakpoints."
     :group 'idlwave-shell-highlighting-and-faces))
 
+
 (defcustom idlwave-shell-expression-face 'secondary-selection
   "*The face for `idlwave-shell-expression-overlay'.
 Allows you to choose the font, color and other properties for
@@ -652,7 +671,7 @@
   "The overlay for where IDL is currently stopped.")
 (defvar idlwave-shell-is-stopped nil)
 (defvar idlwave-shell-expression-overlay nil
-  "The overlay for where IDL is currently stopped.")
+  "The overlay for the examined expression.")
 (defvar idlwave-shell-output-overlay nil
   "The overlay for the last IDL output.")
 
@@ -700,10 +719,21 @@
 (setq idlwave-shell-expression-overlay (make-overlay 1 1))
 (overlay-put idlwave-shell-expression-overlay
 	     'face idlwave-shell-expression-face)
+(overlay-put idlwave-shell-expression-overlay
+	     'priority 1)
 (setq idlwave-shell-output-overlay (make-overlay 1 1))
 (overlay-put idlwave-shell-output-overlay
 	     'face idlwave-shell-output-face)
 
+(copy-face idlwave-shell-stop-line-face 
+	   'idlwave-shell-pending-stop)
+(copy-face idlwave-shell-electric-stop-line-face 
+	   'idlwave-shell-pending-electric-stop)
+(set-face-background 'idlwave-shell-pending-stop "gray70")
+(set-face-background 'idlwave-shell-pending-electric-stop "gray70")
+
+
+
 (defvar idlwave-shell-bp-query "help,/breakpoints"
   "Command to obtain list of breakpoints")
 
@@ -823,6 +853,7 @@
   ?          Help on expression near point or in region ([C-u ?]).
   x          Examine expression near point or in region ([C-u x]) with 
              letter completion of the examine type.
+  e          Prompt for an expression to print.
 
  Miscellaneous:
   q   	     Quit - end debugging session and return to the Shell's main level.
@@ -998,6 +1029,8 @@
   (setq idlwave-shell-default-directory default-directory)
   (setq idlwave-shell-hide-output nil)
 
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; (make-local-hook 'kill-buffer-hook)
   (add-hook 'kill-buffer-hook 'idlwave-shell-kill-shell-buffer-confirm
 	    nil 'local)
   (add-hook 'kill-buffer-hook 'idlwave-shell-delete-temp-files nil 'local)
@@ -1040,6 +1073,8 @@
   (set (make-local-variable 'comment-start) ";")
   (setq abbrev-mode t)
 
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; make-local-hook 'post-command-hook)
   (add-hook 'post-command-hook 'idlwave-command-hook nil t)
 
   ;; Read the command history?
@@ -1061,23 +1096,25 @@
   (idlwave-shell-send-command 
    (format "defsysv,'!idlwave_version','%s',1" idlwave-mode-version)
    nil 'hide)
-  ;; Get the paths if they weren't read in from file
-  (if (and (not idlwave-path-alist)
-	   (or (not (stringp idlwave-system-directory))
-	       (eq (length idlwave-system-directory) 0)))
-      (idlwave-shell-send-command idlwave-shell-path-query
-				  'idlwave-shell-get-path-info
-				  'hide)))
-
+  ;; Read the paths, and save if they changed
+  (idlwave-shell-send-command idlwave-shell-path-query
+			      'idlwave-shell-get-path-info
+			      'hide))
+
+(defvar idlwave-system-directory)
 (defun idlwave-shell-get-path-info (&optional no-write)
   "Get the path lists, writing to file unless NO-WRITE is set."
   (let* ((rpl (idlwave-shell-path-filter))
 	 (sysdir (car rpl))
 	 (dirs (cdr rpl))
-	 (old-path-alist idlwave-path-alist))
+	 (old-path-alist idlwave-path-alist)
+	 (old-sys-dir idlwave-system-directory)
+	 path-changed sysdir-changed)
     (when sysdir
       (setq idlwave-system-directory sysdir)
-      (put 'idlwave-system-directory 'from-shell t))
+      (if (setq sysdir-changed 
+		(not (string= idlwave-system-directory old-sys-dir)))
+	  (put 'idlwave-system-directory 'from-shell t)))
     ;; Preserve any existing flags
     (setq idlwave-path-alist 
 	  (mapcar (lambda (x)
@@ -1086,11 +1123,13 @@
 			  (cons x (cdr old-entry))
 			(list x))))
 		  dirs))
-    (put 'idlwave-path-alist 'from-shell t)
+    (if (setq path-changed (not (equal idlwave-path-alist old-path-alist)))
+	(put 'idlwave-path-alist 'from-shell t))
     (if idlwave-path-alist 
-	(if (and idlwave-auto-write-paths
-		 (not idlwave-library-path)
-		 (not no-write) )
+	(if (and (not no-write)
+		 idlwave-auto-write-paths
+		 (or sysdir-changed path-changed)
+		 (not idlwave-library-path))
 	    (idlwave-write-paths))
       ;; Fall back
       (setq idlwave-path-alist old-path-alist))))
@@ -1199,12 +1238,14 @@
 	  (current-window (selected-window)))
       (select-window window)
       (goto-char (point-max))
+      (if idlwave-shell-use-dedicated-window
+	  (set-window-dedicated-p window t))
       (select-window current-window)
       (if idlwave-shell-ready
 	  (raise-frame (window-frame window)))
       (if (eq (selected-frame) (window-frame window))
 	  (select-window window))))
-  ;; Save the paths at the end
+  ;; Save the paths at the end, if they are from the Shell and new.
   (add-hook 'idlwave-shell-sentinel-hook 
 	    (lambda ()
 	      (if (and 
@@ -1518,10 +1559,10 @@
 	    
 	    
 ;;; Test/Debug code
-;	      (save-excursion (set-buffer
-;			       (get-buffer-create "*idlwave-shell-output*"))
-;			      (goto-char (point-max))
-;			      (insert "\nSTRING===>\n" string "\n<====\n"))
+	      ;(with-current-buffer
+	      ;	  (get-buffer-create "*idlwave-shell-output*")
+	      ;	(goto-char (point-max))
+	      ;	(insert "\nReceived STRING\n===>\n" string "\n<====\n"))
 	    
 	      ;; Check for prompt in current accumulating output
 	      (when (setq idlwave-shell-ready
@@ -1536,14 +1577,14 @@
 		      (re-search-backward idlwave-shell-prompt-pattern nil t)
 		      (goto-char (match-end 0))
 		      (setq idlwave-shell-command-output
-		      (buffer-substring (point-min) (point)))
+		      (buffer-substring-no-properties (point-min) (point)))
 		      (delete-region (point-min) (point)))
 		  (setq idlwave-shell-command-output
 			(with-current-buffer (process-buffer proc)
-			(buffer-substring
+			(buffer-substring-no-properties
 			 (save-excursion
 			   (goto-char (process-mark proc))
-			   (forward-line 0)
+			   (forward-line 0) ; Emacs 21 (beginning-of-line nil)
 			   (point))
 			 comint-last-input-end))))
 
@@ -1570,10 +1611,10 @@
 		  ;; Call the post-command hook
 		  (if (listp idlwave-shell-post-command-hook)
 		      (progn
-					;(message "Calling list")
-					;(prin1 idlwave-shell-post-command-hook)
+			;;(message "Calling list")
+			;;(prin1 idlwave-shell-post-command-hook)
 			(eval idlwave-shell-post-command-hook))
-					;(message "Calling command function")
+		    ;;(message "Calling command function")
 		    (funcall idlwave-shell-post-command-hook))
 
 		  ;; Reset to default state for next command.
@@ -1668,6 +1709,8 @@
 All parts may contain linebreaks surrounded by spaces.  This is important
 in IDL5 which inserts random linebreaks in long module and file names.")
 
+(defvar idlwave-shell-electric-debug-mode) ; defined by easy-mmode
+
 (defun idlwave-shell-scan-for-state ()
   "Scan for state info.  Looks for messages in output from last IDL
 command indicating where IDL has stopped. The types of messages we are
@@ -1688,9 +1731,8 @@
 		     idlwave-shell-command-output)
        (string-match idlwave-shell-other-error
 		     idlwave-shell-command-output))
-      (save-excursion
-	(set-buffer
-	 (get-buffer-create idlwave-shell-error-buffer))
+      (with-current-buffer
+	  (get-buffer-create idlwave-shell-error-buffer)
 	(erase-buffer)
 	(insert idlwave-shell-command-output)
 	(goto-char (point-min))
@@ -1723,8 +1765,10 @@
 	     (substring idlwave-shell-command-output (match-end 0))))
       (setq idlwave-shell-current-state 'halt)
       ;; Don't debug trace messages
-      (idlwave-shell-display-line (idlwave-shell-pc-frame) nil
-				  (if trace 'no-debug)))
+      (idlwave-shell-display-line 
+       (idlwave-shell-pc-frame) nil
+       (if trace 'disable
+	 (if idlwave-shell-electric-debug-mode 'force))))
      
      ;; Fourth Priority: Breakpoints 
      ((string-match idlwave-shell-break-message
@@ -1763,29 +1807,29 @@
 
 
 (defun idlwave-shell-parse-line (string &optional skip-main)
-  "Parse IDL message for the subroutine, file name and line number.
-We need to work hard here to remove the stupid line breaks inserted by
-IDL5.  These line breaks can be right in the middle of procedure
-or file names.
-It is very difficult to come up with a robust solution.  This one seems
-to be pretty good though.  
-
-Here is in what ways it improves over the previous solution:
-
-1. The procedure name can be split and will be restored.
-2. The number can be split.  I have never seen this, but who knows.
-3. We do not require the `.pro' extension for files.
-
-This function can still break when the file name ends on a end line
-and the message line contains an additional line with garbage.  Then
-the first part of that garbage will be added to the file name.
-However, the function checks the existence of the files with and
-without this last part - thus the function only breaks if file name
-plus garbage match an existing regular file.  This is hopefully very
-unlikely.
-
-If optional arg SKIP-MAIN is non-nil, don't parse $MAIN$ routine stop
-statements."
+  "Parse IDL message for the subroutine, file name and line number."
+;We need to work hard here to remove the stupid line breaks inserted by
+;IDL5.  These line breaks can be right in the middle of procedure
+;or file names.
+;It is very difficult to come up with a robust solution.  This one seems
+;to be pretty good though.  
+;
+;Here is in what ways it improves over the previous solution:
+;
+;1. The procedure name can be split and will be restored.
+;2. The number can be split.  I have never seen this, but who knows.
+;3. We do not require the `.pro' extension for files.
+;
+;This function can still break when the file name ends on an end line
+;and the message line contains an additional line with garbage.  Then
+;the first part of that garbage will be added to the file name.
+;However, the function checks the existence of the files with and
+;without this last part - thus the function only breaks if file name
+;plus garbage match an existing regular file.  This is hopefully very
+;unlikely.
+;
+;If optional arg SKIP-MAIN is non-nil, don't parse $MAIN$ routine stop
+;statements.
 
   (let (number procedure file)
     (when (and (not (if skip-main (string-match ":\\s-*\\$MAIN" string)))
@@ -1926,14 +1970,17 @@
 HEAP_GC, /VERBOSE"
   ;; OBJ_DESTROY, OBJ_VALID()  FIXME: should this be added?
   (interactive "P")
-  (message "Resetting IDL")
-  (setq idlwave-shell-calling-stack-index 0)
-  (idlwave-shell-send-command "retall" nil hidden)
-  (idlwave-shell-send-command "widget_control,/reset" nil hidden)
-  (idlwave-shell-send-command "close,/all" nil hidden)
-  ;; (idlwave-shell-send-command "obj_destroy, obj_valid()" nil hidden)
-  (idlwave-shell-send-command "heap_gc,/verbose" nil hidden)
-  (idlwave-shell-display-line nil))
+  (when (or idlwave-shell-reset-no-prompt 
+	    (yes-or-no-p "Really Reset IDL and discard current session? "))
+    (message "Resetting IDL")
+    (setq idlwave-shell-calling-stack-index 0)
+    ;; Give widget exit handlers a chance
+    (idlwave-shell-send-command "retall" nil hidden)
+    (idlwave-shell-send-command "widget_control,/reset" nil hidden)
+    (idlwave-shell-send-command "close,/all" nil hidden)
+    ;; (idlwave-shell-send-command "obj_destroy, obj_valid()" nil hidden)
+    (idlwave-shell-send-command "heap_gc,/verbose" nil hidden)
+    (idlwave-shell-display-line nil)))
 
 (defun idlwave-shell-path-filter ()
   ;; Convert the output of the path query into a list of directories
@@ -1978,9 +2025,6 @@
 	  (message 
 	   "Routine Info warning: No match for END line in \n>>>\n%s\n<<<\n" 
 	   idlwave-shell-command-output)))
-    (if (string-match "\\S-" text)
-	;; Obviously, the pro worked.  Make a note that we have it now.
-	(setq idlwave-idlwave_routine_info-compiled t))
     ;; Match the output lines
     (while (string-match "^IDLWAVE-\\(PRO\\|FUN\\): \\(.*\\)" text start)
       (setq start (match-end 0))
@@ -2208,7 +2252,6 @@
     (looking-at "\\$")))
 
 ;; Debugging Commands ------------------------------------------------------
-(defvar idlwave-shell-electric-debug-mode) ; defined by easy-mmode
 
 (defun idlwave-shell-redisplay (&optional hide)
   "Tries to resync the display with where execution has stopped.
@@ -2259,14 +2302,14 @@
     (setq idlwave-shell-calling-stack-routine 
 	  (nth 2 (nth idlwave-shell-calling-stack-index stack)))
 
-    ;; only edebug if in that mode already
+    ;; force edebug for this frame if we're in that mode already
     (idlwave-shell-display-line 
      (nth idlwave-shell-calling-stack-index stack) nil
-     (unless idlwave-shell-electric-debug-mode 'no-debug)) 
+     (if idlwave-shell-electric-debug-mode 'force))
     (message "%s" (or message 
-		 (format "In routine %s (stack level %d)"
-			 idlwave-shell-calling-stack-routine
-			 (- idlwave-shell-calling-stack-index))))))
+		      (format "In routine %s (stack level %d)"
+			      idlwave-shell-calling-stack-routine
+			      (- idlwave-shell-calling-stack-index))))))
 
 (defun idlwave-shell-stack-up ()
   "Display the source code one step up the calling stack."
@@ -2302,30 +2345,38 @@
   "Check that frame is for an existing file."
   (file-readable-p (car frame)))
 
+(defun idlwave-shell-stop-line-pending ()
+  ;; Temporarily change the color of the stop line overlay
+  (if idlwave-shell-stop-line-overlay
+      (overlay-put idlwave-shell-stop-line-overlay 'face
+		   (if idlwave-shell-electric-debug-mode
+		       'idlwave-shell-pending-electric-stop
+		     'idlwave-shell-pending-stop))))
+
 (defvar idlwave-shell-suppress-electric-debug nil)
-(defun idlwave-shell-display-line (frame &optional col no-debug)
-  "Display FRAME file in other window with overlay arrow.
-
-FRAME is a list of file name, line number, and subroutine name.  If
-FRAME is nil then remove overlay.  If COL is set, move point to that
-column in the line.  If NO-DEBUG is non-nil, do *not* toggle the electric
-debug mode."
+(defun idlwave-shell-display-line (frame &optional col debug)
+  "display frame file in other window with overlay arrow.
+
+frame is a list of file name, line number, and subroutine name.  if
+frame is nil then remove overlay.  if col is set, move point to that
+column in the line.  if debug is non-nil, enable the electric debug
+mode.  if it is 'disable, do not enable no matter what the setting of
+'idlwave-shell-automatic-electric-debug'.  if it is 'force, enable no
+matter what the settings of that variable."
   (if (not frame)
-      ;; Remove stop-line overlay from old position
+      ;; remove stop-line overlay from old position
       (progn 
         (setq overlay-arrow-string nil)
 	(setq idlwave-shell-mode-line-info nil)
 	(setq idlwave-shell-is-stopped nil)
         (if idlwave-shell-stop-line-overlay
             (delete-overlay idlwave-shell-stop-line-overlay))
-	;; Turn off electric debug everywhere, if it's on
-	(if (and (not no-debug)
-		 idlwave-shell-automatic-electric-debug)
-	    (idlwave-shell-electric-debug-all-off)))
+	;; turn off electric debug everywhere, if it's on
+	(idlwave-shell-electric-debug-all-off))
     (if (not (idlwave-shell-valid-frame frame))
-	;; FIXME: errors are dangerous in shell filters.  But I think I
+	;; fixme: errors are dangerous in shell filters.  but i think i
 	;; have never encountered this one.
-        (error (concat "Invalid frame - unable to access file: " (car frame)))
+        (error (concat "invalid frame - unable to access file: " (car frame)))
 ;;;
 ;;; buffer : the buffer to display a line in.
 ;;; select-shell: current buffer is the shell.
@@ -2339,15 +2390,15 @@
              (select-shell (equal (buffer-name) (idlwave-shell-buffer)))
              window pos electric)
 
-	;; First make sure the shell window is visible
+	;; first make sure the shell window is visible
 	(idlwave-display-buffer (idlwave-shell-buffer)
 				nil (idlwave-shell-shell-frame))
 
-	;; Now display the buffer and remember which window it is.
+	;; now display the buffer and remember which window it is.
 	(setq window (idlwave-display-buffer buffer
 					     nil (idlwave-shell-source-frame)))
 
-	;; Enter the buffer and mark the line
+	;; enter the buffer and mark the line
         (save-excursion
           (set-buffer buffer)
           (save-restriction
@@ -2358,45 +2409,53 @@
 	    (setq idlwave-shell-is-stopped t)
 	    
             (if idlwave-shell-stop-line-overlay
-                ;; Move overlay
-		(move-overlay idlwave-shell-stop-line-overlay
-			      (point) (save-excursion (end-of-line) (point))
-			      (current-buffer))
-	      ;; Use the arrow instead, but only if marking is wanted.
+                (progn
+		  ;; restore face and move overlay 
+		  (overlay-put idlwave-shell-stop-line-overlay 'face
+			       (if idlwave-shell-electric-debug-mode
+                                   idlwave-shell-electric-stop-line-face 
+                                 idlwave-shell-stop-line-face))
+		  (move-overlay idlwave-shell-stop-line-overlay
+				(point) (save-excursion (end-of-line) (point))
+				(current-buffer)))
+	      ;; use the arrow instead, but only if marking is wanted.
 	      (if idlwave-shell-mark-stop-line
 		  (setq overlay-arrow-string idlwave-shell-overlay-arrow))
               (or overlay-arrow-position  ; create the marker if necessary
                   (setq overlay-arrow-position (make-marker)))
 	      (set-marker overlay-arrow-position (point) buffer)))
 
-	  ;; If the point is outside the restriction, widen the buffer.
+	  ;; if the point is outside the restriction, widen the buffer.
           (if (or (< pos (point-min)) (> pos (point-max)))
 	      (progn
 		(widen)
 		(goto-char pos)))
 
-	  ;; If we have the column of the error, move the cursor there.
+	  ;; if we have the column of the error, move the cursor there.
           (if col (move-to-column col))
           (setq pos (point))
 	  
-	  ;; Enter electric debug mode, if not prohibited and not in
+	  ;; enter electric debug mode, if not prohibited and not in
 	  ;; it already
-	  (when (and (or 
-		      (eq idlwave-shell-automatic-electric-debug t)
-		      (and 
-		       (eq idlwave-shell-automatic-electric-debug 'breakpoint)
-		       (not (eq idlwave-shell-current-state 'error))))
-		     (not no-debug)
-		     (not idlwave-shell-suppress-electric-debug)
-		     (not idlwave-shell-electric-debug-mode))
-	    (idlwave-shell-electric-debug-mode)
-	    (setq electric t)))
+	  (when  (and (not idlwave-shell-electric-debug-mode)
+		      (or (eq debug 'force)
+			  (and 
+			   (not (eq debug 'disable)) ;; explicitly disabled
+			   (or 
+			    (eq idlwave-shell-automatic-electric-debug t)
+			    (and 
+			     (eq idlwave-shell-automatic-electric-debug 
+				 'breakpoint)
+			     (not (eq idlwave-shell-current-state 'error))))
+			   (not idlwave-shell-suppress-electric-debug))))
+	    (idlwave-shell-electric-debug-mode t))
+	  (setq electric idlwave-shell-electric-debug-mode))
 	
 	;; Make sure pos is really displayed in the window.
 	(set-window-point window pos)
 	
 	;; If we came from the shell, go back there.  Otherwise select 
-	;; the window where the error is displayed.
+	;; the window where the error/halt is displayed.
         (if (or (and idlwave-shell-electric-zap-to-file electric)
 		(and (equal (buffer-name) (idlwave-shell-buffer)) 
 		     (not select-shell)))
@@ -2408,6 +2467,7 @@
   (interactive "p")
   (or (not arg) (< arg 1)
       (setq arg 1))
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command 
    (concat ".s " (if (integerp arg) (int-to-string arg) arg))
    nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t))
@@ -2419,6 +2479,7 @@
   (interactive "p")
   (or (not arg) (< arg 1)
       (setq arg 1))
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command 
    (concat ".so " (if (integerp arg) (int-to-string arg) arg))
    nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t))
@@ -2462,13 +2523,13 @@
               (beep)
               (y-or-n-p 
                (concat "Okay to recompile file "
-                       (idlwave-shell-bp-get bp 'file) "? ")))
+                       (idlwave-shell-bp-get bp 'file) "?")))
             ;; Recompile
             (progn
               ;; Clean up before retrying
               (idlwave-shell-command-failure)
               (idlwave-shell-send-command
-               (concat ".run " (idlwave-shell-bp-get bp 'file)) nil 
+               (concat ".run \"" (idlwave-shell-bp-get bp 'file) "\"") nil 
 	       (if (idlwave-shell-hide-p 'run) 'mostly) nil t)
               ;; Try setting breakpoint again
               (idlwave-shell-set-bp bp))
@@ -2496,6 +2557,7 @@
 (defun idlwave-shell-cont (&optional no-show)
   "Continue executing."
   (interactive)
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command ".c" (unless no-show 
 				     '(idlwave-shell-redisplay 'hide))
 			      (if (idlwave-shell-hide-p 'debug) 'mostly) 
@@ -2504,6 +2566,7 @@
 (defun idlwave-shell-go ()
   "Run .GO.  This starts the main program of the last compiled file."
   (interactive)
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command ".go" '(idlwave-shell-redisplay 'hide)
 			      (if (idlwave-shell-hide-p 'debug) 'mostly)
 			      nil t))
@@ -2511,6 +2574,7 @@
 (defun idlwave-shell-return ()
   "Run .RETURN (continue to next return, but stay in subprogram)."
   (interactive)
+  (idlwave-shell-stop-line-pending)
   (idlwave-shell-send-command ".return" '(idlwave-shell-redisplay 'hide)
 			      (if (idlwave-shell-hide-p 'debug) 'mostly)
 			      nil t))
@@ -2518,6 +2582,7 @@
 (defun idlwave-shell-skip ()
   "Run .SKIP (skip one line, then step)."
   (interactive)
+  (idlwave-shell-stop-line-pending)  
   (idlwave-shell-send-command ".skip" '(idlwave-shell-redisplay 'hide)
 			      (if (idlwave-shell-hide-p 'debug) 'mostly)
 			      nil t))
@@ -2603,6 +2668,7 @@
 (defun idlwave-shell-to-here ()
   "Set a breakpoint with count 1 then continue."
   (interactive)
+  ;; temporarily disable all other breakpoints
   (let ((disabled (idlwave-shell-enable-all-bp 'disable 'no-update)))
     (idlwave-shell-break-here 1 nil nil nil 'no-show)
     (idlwave-shell-cont 'no-show)
@@ -2739,13 +2805,18 @@
   `(lambda (event)
      "Expansion function for expression examination."
      (interactive "e")
-     (let ((transient-mark-mode t)
-	   (zmacs-regions t)
-	   (tracker (if (featurep 'xemacs) 
-			(if (fboundp 'default-mouse-track-event-is-with-button)
-			    'idlwave-xemacs-hack-mouse-track
-			  'mouse-track)
-		      'mouse-drag-region)))
+     (let* ((drag-track (fboundp 'mouse-drag-track))
+	    (transient-mark-mode t)
+	    (zmacs-regions t)
+	    (tracker (if (featurep 'xemacs) 
+			 (if (fboundp 
+			      'default-mouse-track-event-is-with-button)
+			     'idlwave-xemacs-hack-mouse-track
+			   'mouse-track)
+		       ;; Emacs 22 no longer completes the drag with
+		       ;; mouse-drag-region, without an additional
+		       ;; event.  mouse-drag-track does so.
+		       (if drag-track 'mouse-drag-track 'mouse-drag-region))))
        (funcall tracker event)
        (idlwave-shell-print (if (idlwave-region-active-p) '(4) nil)
 			    ,help ,ev))))
@@ -2756,8 +2827,9 @@
   t)
 
 (defun idlwave-xemacs-hack-mouse-track (event)
-  (if (featurep 'xemacs) 
-      (let ((oldfunc (symbol-function 'default-mouse-track-event-is-with-button)))
+  (if (featurep 'xemacs)
+      (let ((oldfunc (symbol-function 
+		      'default-mouse-track-event-is-with-button)))
 	(unwind-protect
 	    (progn
 	      (fset 'default-mouse-track-event-is-with-button 
@@ -2822,6 +2894,11 @@
 If instead COMPLETE-HELP-TYPE is non-nil, choose from
 idlw-shell-examine-alist via mini-buffer shortcut key."
   (interactive "P")
+
+  ;; For speed: assume the helper routine hasn't been lost, e.g. with
+  ;; .FULL_RESET_SESSION.  We'll recover if necessary
+  (unless idlwave-idlwave_routine_info-compiled
+    (idlwave-shell-compile-helper-routines))
   (save-excursion
     (let* ((process (get-buffer-process (current-buffer)))
 	   (process-mark (if process (process-mark process)))
@@ -2831,7 +2908,7 @@
 		(format "  [-%d:%s]" 
 			idlwave-shell-calling-stack-index 
 			idlwave-shell-calling-stack-routine)))
-	   expr beg end cmd examine-hook)
+	   expr beg end cmd)
       (cond
        ((equal arg '(16))
 	(setq expr (read-string "Expression: ")))
@@ -2874,10 +2951,6 @@
 		      (current-buffer))
 	(add-hook 'pre-command-hook 
 		  'idlwave-shell-delete-expression-overlay))
-      (setq examine-hook 
-	    (if idlwave-shell-separate-examine-output
-		'idlwave-shell-examine-display
-	      'idlwave-shell-examine-highlight))
       (add-hook 'pre-command-hook
 		'idlwave-shell-delete-output-overlay)
       
@@ -2939,7 +3012,7 @@
 	;;(idlwave-shell-recenter-shell-window)
 	(idlwave-shell-send-command 
 	 cmd 
-	 examine-hook 
+	 'idlwave-shell-check-compiled-and-display
 	 (if idlwave-shell-separate-examine-output 'hide))))))
 
 (defvar idlwave-shell-examine-window-alist nil
@@ -2949,6 +3022,15 @@
 (define-key idlwave-shell-examine-map "q" 'idlwave-shell-examine-display-quit)
 (define-key idlwave-shell-examine-map "c" 'idlwave-shell-examine-display-clear)
 
+
+(defun idlwave-shell-check-compiled-and-display ()
+  "Check examine output for warning about undefined procedure/function."
+  (if (string-match "% Attempt to call undefined" idlwave-shell-command-output)
+      (idlwave-shell-compile-helper-routines))
+  (if idlwave-shell-separate-examine-output
+      (idlwave-shell-examine-display)
+    (idlwave-shell-examine-highlight)))
+
 (defun idlwave-shell-examine-display ()
   "View the examine command output in a separate buffer."
   (let (win cur-beg cur-end)
@@ -3121,13 +3203,16 @@
 to insert expression in place of the marker ___, e.g.: print,
 size(___,/DIMENSIONS)"
   (cond
-   ((null help) (concat "print, " expr))
+   ((null help)
+    (concat "idlwave_print_safe, " expr "," 
+	    (number-to-string idlwave-shell-max-print-length)))
    ((stringp help) 
     (if (string-match "\\(^\\|[^_]\\)\\(___\\)\\([^_]\\|$\\)" help)
 	(concat (substring help 0 (match-beginning 2))
 		expr
 		(substring help (match-end 2)))))
-   (t (concat "help, " expr))))
+   (t 
+    (concat "help, " expr))))
    
 
 (defun idlwave-shell-examine-highlight ()
@@ -3221,7 +3306,8 @@
                  (idlwave-look-at "\\<end\\>")))
           (insert "\nend\n"))
       (save-buffer 0)))
-  (idlwave-shell-send-command (concat ".run " idlwave-shell-temp-pro-file)
+  (idlwave-shell-send-command (concat ".run \"" 
+				      idlwave-shell-temp-pro-file "\"")
 			      nil 
 			      (if (idlwave-shell-hide-p 'run) 'mostly)
 			      nil t)
@@ -3822,8 +3908,11 @@
 		       ((eq action 'compile) ".compile ")
 		       ((eq action 'batch)   "@")
 		       (t (error "Unknown action %s" action)))
-		 idlwave-shell-last-save-and-action-file)
-	 'idlwave-shell-maybe-update-routine-info
+		 "\""
+		 idlwave-shell-last-save-and-action-file
+		 "\"")
+	 `(idlwave-shell-maybe-update-routine-info nil
+	   ,idlwave-shell-last-save-and-action-file)
 	 (if (idlwave-shell-hide-p 'run) 'mostly) nil t)
 	(idlwave-shell-bp-query))
     (let ((msg (format "No such file %s" 
@@ -3831,14 +3920,14 @@
       (setq idlwave-shell-last-save-and-action-file nil)
       (error msg))))
 
-(defun idlwave-shell-maybe-update-routine-info (&optional wait)
+(defun idlwave-shell-maybe-update-routine-info (&optional wait file)
   "Update the routine info if the shell is not stopped at an error."
   (if (and (not idlwave-shell-is-stopped)
 	   (or (eq t idlwave-auto-routine-info-updates)
 	       (memq 'compile-buffer idlwave-auto-routine-info-updates))
 	   idlwave-query-shell-for-routine-info
 	   idlwave-routines)
-      (idlwave-shell-update-routine-info t nil wait)))
+      (idlwave-shell-update-routine-info t nil wait file)))
 
 (defvar idlwave-shell-sources-query "help,/source,/full"
   "IDL command to obtain source files for compiled procedures.")
@@ -3983,7 +4072,7 @@
       (setq idlwave-shell-error-last (point)))
     (if frame
         (progn
-          (idlwave-shell-display-line frame col 'no-debug))
+          (idlwave-shell-display-line frame col 'disable))
       (beep)
       (message "No more errors."))))
 
@@ -4158,6 +4247,8 @@
   'idlwave-shell-stack-down)
 (define-key idlwave-shell-electric-debug-mode-map "_" 
   'idlwave-shell-stack-down)
+(define-key idlwave-shell-electric-debug-mode-map "e" 
+  '(lambda () (interactive) (idlwave-shell-print '(16))))
 (define-key idlwave-shell-electric-debug-mode-map "q" 'idlwave-shell-retall)
 (define-key idlwave-shell-electric-debug-mode-map "t" 
   '(lambda () (interactive) (idlwave-shell-send-command "help,/TRACE")))
@@ -4181,9 +4272,11 @@
   ;; session until we return or hit $MAIN$.  Cancel this suppression
   ;; if it's explicitly turned on.
   (if idlwave-shell-electric-debug-mode
-      (setq idlwave-shell-suppress-electric-debug t)
-    (setq idlwave-shell-suppress-electric-debug nil))
-  (idlwave-shell-electric-debug-mode))
+      (progn ;; Turn it off, and make sure it stays off.
+	(setq idlwave-shell-suppress-electric-debug t)
+	(idlwave-shell-electric-debug-mode 0))
+    (setq idlwave-shell-suppress-electric-debug nil)
+    (idlwave-shell-electric-debug-mode t)))
 
 (defvar idlwave-shell-electric-debug-read-only) 
 (defvar idlwave-shell-electric-debug-buffers nil)
@@ -4196,9 +4289,9 @@
 
 When Electric Debug mode is enabled, the many debugging commands are
 available as single key sequences."
-  nil
-  " *Debugging*"
-  idlwave-shell-electric-debug-mode-map)
+nil
+" *Debugging*"
+idlwave-shell-electric-debug-mode-map)
 
 (add-hook 
  'idlwave-shell-electric-debug-mode-on-hook
@@ -4249,7 +4342,7 @@
 	  (when (and (eq major-mode 'idlwave-mode)
 		     buffer-file-name
 		     idlwave-shell-electric-debug-mode)
-	    (idlwave-shell-electric-debug-mode))))))
+	    (idlwave-shell-electric-debug-mode 0))))))
   (setq idlwave-shell-electric-debug-buffers nil))
 
 ;; Show the help text
--- a/lisp/progmodes/idlw-toolbar.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/progmodes/idlw-toolbar.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1,10 +1,10 @@
 ;;; idlw-toolbar.el --- a debugging toolbar for IDLWAVE
 ;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;; Free Software Foundation, Inc.
+;; Free Software Foundation
 
 ;; Author: Carsten Dominik <dominik@astro.uva.nl>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 ;; Keywords: processes
 
 ;; This file is part of GNU Emacs.
@@ -43,8 +43,8 @@
       (toolbar-make-button-list image)
     (list 'image :type 'xpm :data image)))
 
+(defvar idlwave-toolbar)
 (defvar default-toolbar)
-(defvar idlwave-toolbar)
 (defvar idlwave-toolbar-is-possible)
 
 (if (not (or (and (featurep 'xemacs)                ; This is XEmacs
--- a/lisp/progmodes/idlwave.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/progmodes/idlwave.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1,12 +1,12 @@
 ;; idlwave.el --- IDL editing mode for GNU Emacs
 ;; Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-;;    Free Software Foundation, Inc.
+;;    Free Software Foundation
 
 ;; Authors: J.D. Smith <jdsmith@as.arizona.edu>
 ;;          Carsten Dominik <dominik@science.uva.nl>
 ;;          Chris Chase <chase@att.com>
 ;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
-;; Version: 5.7_22
+;; Version: 6.0_em22
 ;; Keywords: languages
 
 ;; This file is part of GNU Emacs.
@@ -28,7 +28,10 @@
 
 ;;; Commentary:
 
-;; IDLWAVE enables feature-rich development and interaction with IDL.
+;; IDLWAVE enables feature-rich development and interaction with IDL,
+;; the Interactive Data Language. It provides a compelling,
+;; full-featured alternative to the IDLDE development environment
+;; bundled with IDL.
 
 ;; In the remotely distant past, based on pascal.el, though bears
 ;; little resemblance to it now.
@@ -72,7 +75,7 @@
 ;; of the documentation is available from the maintainers webpage (see
 ;; SOURCE).
 ;;
-;;
+;; 
 ;; ACKNOWLEDGMENTS
 ;; ===============
 ;;
@@ -122,7 +125,7 @@
 ;;   up inserting the character that expanded the abbrev after moving
 ;;   point backward, e.g., "\cl" expanded with a space becomes
 ;;   "LONG( )" with point before the close paren.  This is solved by
-;;   using a temporary function in `post-command-hook' - not pretty,
+;;   using a temporary function in `post-command-hook' - not pretty, 
 ;;   but it works.
 ;;
 ;;   Tabs and spaces are treated equally as whitespace when filling a
@@ -160,6 +163,8 @@
   (defalias 'line-end-position 'point-at-eol))
 (unless (fboundp 'char-valid-p)
   (defalias 'char-valid-p 'characterp))
+(unless (fboundp 'match-string-no-properties)
+  (defalias 'match-string-no-properties 'match-string))
 
 (if (not (fboundp 'cancel-timer))
     (condition-case nil
@@ -173,13 +178,13 @@
       nil ;; We've got what we needed
     ;; We have the old or no custom-library, hack around it!
     (defmacro defgroup (&rest args) nil)
-    (defmacro defcustom (var value doc &rest args)
+    (defmacro defcustom (var value doc &rest args) 
       `(defvar ,var ,value ,doc))))
 
 (defgroup idlwave nil
   "Major mode for editing IDL .pro files."
   :tag "IDLWAVE"
-  :link '(url-link :tag "Home Page"
+  :link '(url-link :tag "Home Page" 
 		   "http://idlwave.org")
   :link '(emacs-commentary-link :tag "Commentary in idlw-shell.el"
 				"idlw-shell.el")
@@ -195,34 +200,34 @@
   "Indentation and formatting options for IDLWAVE mode."
   :group 'idlwave)
 
-(defcustom idlwave-main-block-indent 0
+(defcustom idlwave-main-block-indent 2
   "*Extra indentation for the main block of code.
 That is the block between the FUNCTION/PRO statement and the END
 statement for that program unit."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-block-indent 4
+(defcustom idlwave-block-indent 3
   "*Extra indentation applied to block lines.
 If you change this, you probably also want to change `idlwave-end-offset'."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-end-offset -4
+(defcustom idlwave-end-offset -3
   "*Extra indentation applied to block END lines.
 A value equal to negative `idlwave-block-indent' will make END lines
 line up with the block BEGIN lines."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-continuation-indent 2
+(defcustom idlwave-continuation-indent 3
   "*Extra indentation applied to continuation lines.
 This extra offset applies to the first of a set of continuation lines.
 The following lines receive the same indentation as the first."
   :group 'idlwave-code-formatting
   :type 'integer)
 
-(defcustom idlwave-max-extra-continuation-indent 20
+(defcustom idlwave-max-extra-continuation-indent 40
   "*Maximum additional indentation for special continuation indent.
 Several special indentations are tried to help line up continuation
 lines in routine calls or definitions, other statements with
@@ -293,8 +298,8 @@
 
 (defcustom idlwave-auto-fill-split-string t
   "*If non-nil then auto fill will split strings with the IDL `+' operator.
-When the line end falls within a string, string concatenation with the
-'+' operator will be used to distribute a long string over lines.
+When the line end falls within a string, string concatenation with the 
+'+' operator will be used to distribute a long string over lines.  
 If nil and a string is split then a terminal beep and warning are issued.
 
 This variable is ignored when `idlwave-fill-comment-line-only' is
@@ -354,17 +359,20 @@
   :type 'boolean)
 
 (defcustom idlwave-init-rinfo-when-idle-after 10
-  "*Seconds of idle time before routine info is automatically initialized.
-Initializing the routine info can take long, in particular if a large
-library catalog is involved.  When Emacs is idle for more than the number
-of seconds specified by this variable, it starts the initialization.
-The process is split into five steps, in order to keep possible work
-interruption as short as possible.  If one of the steps finishes, and no
-user input has arrived in the mean time, initialization proceeds immediately
-to the next step.
-A good value for this variable is about 1/3 of the time initialization
-take in you setup.  So if you have a fast machine and no problems with a slow network connection, don't hesitate to set this to 2 seconds.
-A Value of 0 means, don't initialize automatically."
+  "*Seconds of idle time before routine info is automatically
+initialized.  Initializing the routine info can take a long time, in
+particular if a large number of library catalogs are involved.  When
+Emacs is idle for more than the number of seconds specified by this
+variable, it starts the initialization.  The process is split into
+five steps, in order to keep work interruption as short as possible.
+If one of the steps finishes, and no user input has arrived in the
+mean time, initialization proceeds immediately to the next step.  A
+good value for this variable is about 1/3 of the time initialization
+take in your setup.  So if you have a fast machine and no problems
+with a slow network connection, don't hesitate to set this to 2
+seconds.  A Value of 0 means, don't initialize automatically, but
+instead wait until routine information is needed, and initialize
+then."
   :group 'idlwave-routine-info
   :type 'number)
 
@@ -410,7 +418,7 @@
 	       (const :tag "When saving a buffer" save-buffer)
 	       (const :tag "After a buffer was killed" kill-buffer)
 	       (const :tag "After a buffer was compiled successfully, update shell info" compile-buffer))))
-
+	       
 (defcustom idlwave-rinfo-max-source-lines 5
   "*Maximum number of source files displayed in the Routine Info window.
 When an integer, it is the maximum number of source files displayed.
@@ -419,16 +427,17 @@
   :type 'integer)
 
 (defcustom idlwave-library-path nil
-  "Library path for Windows and MacOS.  Not needed under Unix.  When
-selecting the directories to scan for IDL user catalog routine info,
-IDLWAVE can, under UNIX, query the shell for the exact search path
-\(the value of !PATH).  However, under Windows and MacOS (pre-OSX),
-the IDLWAVE shell does not work.  In this case, this variable can be
-set to specify the paths where IDLWAVE can find PRO files.  The shell
-will only be asked for a list of paths when this variable is nil.  The
-value is a list of directories.  A directory preceeded by a `+' will
-be searched recursively.  If you set this variable on a UNIX system,
-the shell will not be queried.  See also `idlwave-system-directory'."
+  "Library path for Windows and MacOS (OS9).  Not needed under Unix.
+When selecting the directories to scan for IDL user catalog routine
+info, IDLWAVE can, under UNIX, query the shell for the exact search
+path \(the value of !PATH).  However, under Windows and MacOS
+(pre-OSX), the IDLWAVE shell does not work.  In this case, this
+variable can be set to specify the paths where IDLWAVE can find PRO
+files.  The shell will only be asked for a list of paths when this
+variable is nil.  The value is a list of directories.  A directory
+preceeded by a `+' will be searched recursively.  If you set this
+variable on a UNIX system, the shell will not be queried.  See also
+`idlwave-system-directory'."
   :group 'idlwave-routine-info
   :type '(repeat (directory)))
 
@@ -443,13 +452,15 @@
   :group 'idlwave-routine-info
   :type 'directory)
 
-(defcustom idlwave-config-directory
+;; Configuration files
+(defcustom idlwave-config-directory 
   (convert-standard-filename "~/.idlwave")
   "*Directory for configuration files and user-library catalog."
   :group 'idlwave-routine-info
   :type 'file)
 
 (defvar idlwave-user-catalog-file "idlusercat.el")
+(defvar idlwave-xml-system-rinfo-converted-file "idl_xml_rinfo.el")
 (defvar idlwave-path-file "idlpath.el")
 
 (defvar idlwave-libinfo-file nil
@@ -458,7 +469,7 @@
 (defcustom idlwave-special-lib-alist nil
   "Alist of regular expressions matching special library directories.
 When listing routine source locations, IDLWAVE gives a short hint where
-the file defining the routine is located.  By default it lists `SystemLib'
+the file defining the routine is located.  By default it lists `SystemLib' 
 for routines in the system library `!DIR/lib' and `Library' for anything
 else.  This variable can define additional types.  The car of each entry
 is a regular expression matching the file name (they normally will match
@@ -469,7 +480,7 @@
 	  (cons regexp string)))
 
 (defcustom idlwave-auto-write-paths t
-  "Write out path (!PATH) and system directory (!DIR) info automatically.
+  "Write out path (!PATH) and system directory (!DIR) info automatically.  
 Path info is needed to locate library catalog files.  If non-nil,
 whenever the path-list changes as a result of shell-query, etc., it is
 written to file.  Otherwise, the menu option \"Write Paths\" can be
@@ -500,7 +511,7 @@
 This variable determines the case (UPPER/lower/Capitalized...) of
 words inserted into the buffer by completion.  The preferred case can
 be specified separately for routine names, keywords, classes and
-methods.
+methods. 
 This alist should therefore have entries for `routine' (normal
 functions and procedures, i.e. non-methods), `keyword', `class', and
 `method'.  Plausible values are
@@ -587,7 +598,7 @@
 for which to assume this can be set here."
   :group 'idlwave-routine-info
   :type '(repeat (regexp :tag "Match method:")))
-
+  
 
 (defcustom idlwave-completion-show-classes 1
   "*Number of classes to show when completing object methods and keywords.
@@ -652,7 +663,7 @@
 specify if the class should be found during method and keyword
 completion, respectively.
 
-The alist may have additional entries specifying exceptions from the
+The alist may have additional entries specifying exceptions from the 
 keyword completion rule for specific methods, like INIT or
 GETPROPERTY.  In order to turn on class specification for the INIT
 method, add an entry (\"INIT\" . t).  The method name must be ALL-CAPS."
@@ -668,7 +679,7 @@
 	   (cons (string  :tag "MODULE" :value "")
 		 (boolean :tag "Determine class for this method")))))
 
-(defcustom idlwave-store-inquired-class nil
+(defcustom idlwave-store-inquired-class t
   "*Non-nil means, store class of a method call as text property on `->'.
 IDLWAVE sometimes has to ask the user for the class associated with a
 particular object method call.  This happens during the commands
@@ -676,7 +687,7 @@
 value of the variable `idlwave-query-class'.
 
 When you specify a class, this information can be stored as a text
-property on the `->' arrow in the source code, so that during the same
+property on the `->' arrow in the source code, so that during the same 
 editing session, IDLWAVE will not have to ask again.  When this
 variable is non-nil, IDLWAVE will store and reuse the class information.
 The class stored can be checked and removed with `\\[idlwave-routine-info]'
@@ -950,7 +961,7 @@
 For example you might set PATHNAME to the path for the
 lib_template.pro file included in the IDL distribution.")
 
-(defcustom idlwave-header-to-beginning-of-file nil
+(defcustom idlwave-header-to-beginning-of-file t
   "*Non-nil means, the documentation header will always be at start of file.
 When nil, the header is positioned between the PRO/FUNCTION line of
 the current routine and the code, allowing several routine headers in
@@ -987,10 +998,6 @@
   "Path locations of external commands used by IDLWAVE."
   :group 'idlwave)
 
-;; WARNING: The following variable has recently been moved from
-;; idlw-shell.el to this file.  I hope this does not break
-;; anything.
-
 (defcustom idlwave-shell-explicit-file-name "idl"
   "*If non-nil, this is the command to run IDL.
 Should be an absolute file path or path relative to the current environment
@@ -1015,7 +1022,8 @@
   :group 'idlwave-external-programs)
 
 (defcustom idlwave-help-application "idlhelp"
-  "*The external application providing reference help for programming."
+  "*The external application providing reference help for programming.
+Obsolete, if the IDL Assistant is being used for help."
   :group 'idlwave-external-programs
   :type 'string)
 
@@ -1057,7 +1065,7 @@
   :group 'idlwave-misc
   :type 'boolean)
 
-(defcustom idlwave-default-font-lock-items
+(defcustom idlwave-default-font-lock-items 
   '(pros-and-functions batch-files idlwave-idl-keywords label goto
 		       common-blocks class-arrows)
   "Items which should be fontified on the default fontification level 2.
@@ -1119,25 +1127,25 @@
 ;;; and Carsten Dominik...
 
 ;; The following are the reserved words in IDL.  Maybe we should
-;; highlight some more stuff as well?
+;; highlight some more stuff as well?       
 ;; Procedure declarations.  Fontify keyword plus procedure name.
 (defvar idlwave-idl-keywords
-  ;; To update this regexp, update the list of keywords and
+  ;; To update this regexp, update the list of keywords and 
   ;; evaluate the form.
-  ;;	(insert
+  ;;	(insert 
   ;;	 (prin1-to-string
-  ;;	  (concat
+  ;;	  (concat 
   ;;	   "\\<\\("
-  ;;	   (regexp-opt
+  ;;	   (regexp-opt 
   ;;	    '("||" "&&" "and" "or" "xor" "not"
-  ;;	      "eq" "ge" "gt" "le" "lt" "ne"
+  ;;	      "eq" "ge" "gt" "le" "lt" "ne" 
   ;;	      "for" "do" "endfor"
-  ;;	      "if" "then" "endif" "else" "endelse"
+  ;;	      "if" "then" "endif" "else" "endelse" 
   ;;	      "case" "of" "endcase"
   ;;	      "switch" "break" "continue" "endswitch"
   ;;	      "begin" "end"
   ;;	      "repeat" "until" "endrep"
-  ;;	      "while" "endwhile"
+  ;;	      "while" "endwhile" 
   ;;	      "goto" "return"
   ;;	      "inherits" "mod"
   ;;	      "compile_opt" "forward_function"
@@ -1158,9 +1166,9 @@
 	'("\\<\\(common\\)\\>[ \t]*\\(\\sw+\\)?[ \t]*,?"
 	  (1 font-lock-keyword-face)	          ; "common"
 	  (2 font-lock-reference-face nil t)      ; block name
-	  (font-lock-match-c++-style-declaration-item-and-skip-to-next
+	  ("[ \t]*\\(\\sw+\\)[ ,]*"
 	   ;; Start with point after block name and comma
-	   (goto-char (match-end 0))  ; needed for XEmacs, could be nil
+	   (goto-char (match-end 0))  ; needed for XEmacs, could be nil 
 	   nil
 	   (1 font-lock-variable-name-face)       ; variable names
 	   )))
@@ -1215,7 +1223,7 @@
        ;; All operators (not used because too noisy)
        (all-operators
 	'("[-*^#+<>/]" (0 font-lock-keyword-face)))
-
+	
        ;; Arrows with text property `idlwave-class'
        (class-arrows
 	'(idlwave-match-class-arrows (0 idlwave-class-arrow-face))))
@@ -1252,14 +1260,14 @@
 
 (defvar idlwave-font-lock-defaults
   '((idlwave-font-lock-keywords
-     idlwave-font-lock-keywords-1
+     idlwave-font-lock-keywords-1 
      idlwave-font-lock-keywords-2
      idlwave-font-lock-keywords-3)
-    nil t
-    ((?$ . "w") (?_ . "w") (?. . "w") (?| . "w") (?& . "w"))
+    nil t 
+    ((?$ . "w") (?_ . "w") (?. . "w") (?| . "w") (?& . "w")) 
     beginning-of-line))
 
-(put 'idlwave-mode 'font-lock-defaults
+(put 'idlwave-mode 'font-lock-defaults 
      idlwave-font-lock-defaults) ; XEmacs
 
 (defconst idlwave-comment-line-start-skip "^[ \t]*;"
@@ -1267,7 +1275,7 @@
 That is the _beginning_ of a line containing a comment delimiter `;' preceded
 only by whitespace.")
 
-(defconst idlwave-begin-block-reg
+(defconst idlwave-begin-block-reg 
   "\\<\\(pro\\|function\\|begin\\|case\\|switch\\)\\>"
   "Regular expression to find the beginning of a block. The case does
 not matter. The search skips matches in comments.")
@@ -1344,17 +1352,17 @@
    '(goto . ("goto\\>" nil))
    '(case . ("case\\>" nil))
    '(switch . ("switch\\>" nil))
-   (cons 'call (list (concat "\\(" idlwave-variable "\\) *= *"
+   (cons 'call (list (concat "\\(" idlwave-variable "\\) *= *" 
 			     "\\(" idlwave-method-call "\\s *\\)?"
 			     idlwave-identifier
 			     "\\s *(") nil))
-   (cons 'call (list (concat
+   (cons 'call (list (concat 
 		      "\\(" idlwave-method-call "\\s *\\)?"
-		      idlwave-identifier
+		      idlwave-identifier 
 		      "\\( *\\($\\|\\$\\)\\|\\s *,\\)") nil))
-   (cons 'assign (list (concat
+   (cons 'assign (list (concat 
 			"\\(" idlwave-variable "\\) *=") nil)))
-
+  
   "Associated list of statement matching regular expressions.
 Each regular expression matches the start of an IDL statement.  The
 first element of each association is a symbol giving the statement
@@ -1377,7 +1385,7 @@
 ;; Note that this is documented in the v18 manuals as being a string
 ;; of length one rather than a single character.
 ;; The code in this file accepts either format for compatibility.
-(defvar idlwave-comment-indent-char ?\
+(defvar idlwave-comment-indent-char ?\ 
   "Character to be inserted for IDL comment indentation.
 Normally a space.")
 
@@ -1385,7 +1393,7 @@
   "Character which is inserted as a last character on previous line by
    \\[idlwave-split-line] to begin a continuation line.  Normally $.")
 
-(defconst idlwave-mode-version "5.7_22")
+(defconst idlwave-mode-version "6.0_em22")
 
 (defmacro idlwave-keyword-abbrev (&rest args)
   "Creates a function for abbrev hooks to call `idlwave-check-abbrev' with args."
@@ -1536,7 +1544,7 @@
 (define-key idlwave-mode-map "\C-c\C-n" 'idlwave-next-statement)
 ;; (define-key idlwave-mode-map "\r"       'idlwave-newline)
 ;; (define-key idlwave-mode-map "\t"       'idlwave-indent-line)
-(define-key idlwave-mode-map [(shift tab)] 'idlwave-indent-statement)
+(define-key idlwave-mode-map [(shift iso-lefttab)] 'idlwave-indent-statement)
 (define-key idlwave-mode-map "\C-c\C-a" 'idlwave-auto-fill-mode)
 (define-key idlwave-mode-map "\M-q"     'idlwave-fill-paragraph)
 (define-key idlwave-mode-map "\M-s"     'idlwave-edit-in-idlde)
@@ -1549,15 +1557,15 @@
 	 (not (equal idlwave-shell-debug-modifiers '())))
   ;; Bind the debug commands also with the special modifiers.
   (let ((shift (memq 'shift idlwave-shell-debug-modifiers))
-	(mods-noshift (delq 'shift
+	(mods-noshift (delq 'shift 
 			    (copy-sequence idlwave-shell-debug-modifiers))))
-    (define-key idlwave-mode-map
+    (define-key idlwave-mode-map 
       (vector (append mods-noshift (list (if shift ?C ?c))))
       'idlwave-shell-save-and-run)
-    (define-key idlwave-mode-map
+    (define-key idlwave-mode-map 
       (vector (append mods-noshift (list (if shift ?B ?b))))
       'idlwave-shell-break-here)
-    (define-key idlwave-mode-map
+    (define-key idlwave-mode-map 
       (vector (append mods-noshift (list (if shift ?E ?e))))
       'idlwave-shell-run-region)))
 (define-key idlwave-mode-map "\C-c\C-d\C-c" 'idlwave-shell-save-and-run)
@@ -1594,25 +1602,28 @@
 (define-key idlwave-mode-map "\M-\C-i" 'idlwave-complete)
 (define-key idlwave-mode-map "\C-c\C-i" 'idlwave-update-routine-info)
 (define-key idlwave-mode-map "\C-c="    'idlwave-resolve)
-(define-key idlwave-mode-map
+(define-key idlwave-mode-map 
   (if (featurep 'xemacs) [(shift button3)] [(shift mouse-3)])
   'idlwave-mouse-context-help)
 
 ;; Set action and key bindings.
 ;; See description of the function `idlwave-action-and-binding'.
 ;; Automatically add spaces for the following characters
-;(idlwave-action-and-binding "&"  '(idlwave-surround -1 -1 '(?&) 1
-;						    (lambda (char) 0)))
-(idlwave-action-and-binding "<"  '(idlwave-surround -1 -1))
-;; Binding works for both > and ->, by changing the length of the token.
-(idlwave-action-and-binding ">"  '(idlwave-surround -1 -1 '(?-) 1
-						    'idlwave-gtr-pad-hook))
-(idlwave-action-and-binding "->" '(idlwave-surround -1 -1 nil 2) t)
-(idlwave-action-and-binding ","  '(idlwave-surround 0 -1))
-
-;; Automatically add spaces to equal sign if not keyword
+
+;; Actions for & are complicated by &&
+(idlwave-action-and-binding "&"  'idlwave-custom-ampersand-surround)
+
+;; Automatically add spaces to equal sign if not keyword.  This needs
+;; to go ahead of > and <, so >= and <= will be treated correctly
 (idlwave-action-and-binding "="  '(idlwave-expand-equal -1 -1))
 
+;; Actions for > and < are complicated by >=, <=, and ->... 
+(idlwave-action-and-binding "<"  '(idlwave-custom-ltgtr-surround nil))
+(idlwave-action-and-binding ">"  '(idlwave-custom-ltgtr-surround 'gtr))
+
+(idlwave-action-and-binding ","  '(idlwave-surround 0 -1 1))
+
+
 ;;;
 ;;; Abbrev Section
 ;;;
@@ -1639,7 +1650,7 @@
       (error (apply 'define-abbrev args)))))
 
 (condition-case nil
-    (modify-syntax-entry (string-to-char idlwave-abbrev-start-char)
+    (modify-syntax-entry (string-to-char idlwave-abbrev-start-char) 
 			 "w" idlwave-mode-syntax-table)
   (error nil))
 
@@ -1763,12 +1774,12 @@
 (defvar imenu-extract-index-name-function)
 (defvar imenu-prev-index-position-function)
 ;; defined later - so just make the compiler hush
-(defvar idlwave-mode-menu)
+(defvar idlwave-mode-menu)  
 (defvar idlwave-mode-debug-menu)
 
 ;;;###autoload
 (defun idlwave-mode ()
-  "Major mode for editing IDL source files (version 5.7_22).
+  "Major mode for editing IDL source files (version 6.0_em22).
 
 The main features of this mode are
 
@@ -1817,11 +1828,10 @@
 
 3. Online IDL Help
    ---------------
+
    \\[idlwave-context-help] displays the IDL documentation relevant
-   for the system variable, keyword, or routine at point.  A single
-   key stroke gets you directly to the right place in the docs.  The
-   HTML help files package must be installed for this to work -- check
-   the IDLWAVE webpage for the correct package for your version.  See
+   for the system variable, keyword, or routines at point.  A single
+   key stroke gets you directly to the right place in the docs.  See
    the manual to configure where and how the HTML help is displayed.
 
 4. Completion
@@ -1848,7 +1858,7 @@
    \\i         IF statement template
    \\elif      IF-ELSE statement template
    \\b         BEGIN
-
+   
    For a full list, use \\[idlwave-list-abbrevs].  Some templates also
    have direct keybindings - see the list of keybindings below.
 
@@ -1890,26 +1900,26 @@
 
   (interactive)
   (kill-all-local-variables)
-
+  
   (if idlwave-startup-message
       (message "Emacs IDLWAVE mode version %s." idlwave-mode-version))
   (setq idlwave-startup-message nil)
-
+  
   (setq local-abbrev-table idlwave-mode-abbrev-table)
   (set-syntax-table idlwave-mode-syntax-table)
-
+  
   (set (make-local-variable 'indent-line-function) 'idlwave-indent-and-action)
-
+  
   (make-local-variable idlwave-comment-indent-function)
   (set idlwave-comment-indent-function 'idlwave-comment-hook)
-
+  
   (set (make-local-variable 'comment-start-skip) ";+[ \t]*")
   (set (make-local-variable 'comment-start) ";")
-  (set (make-local-variable 'require-final-newline) mode-require-final-newline)
+  (set (make-local-variable 'require-final-newline) t)
   (set (make-local-variable 'abbrev-all-caps) t)
   (set (make-local-variable 'indent-tabs-mode) nil)
   (set (make-local-variable 'completion-ignore-case) t)
-
+  
   (use-local-map idlwave-mode-map)
 
   (when (featurep 'easymenu)
@@ -1919,11 +1929,11 @@
   (setq mode-name "IDLWAVE")
   (setq major-mode 'idlwave-mode)
   (setq abbrev-mode t)
-
+  
   (set (make-local-variable idlwave-fill-function) 'idlwave-auto-fill)
   (setq comment-end "")
   (set (make-local-variable 'comment-multi-line) nil)
-  (set (make-local-variable 'paragraph-separate)
+  (set (make-local-variable 'paragraph-separate) 
        "[ \t\f]*$\\|[ \t]*;+[ \t]*$\\|;+[+=-_*]+$")
   (set (make-local-variable 'paragraph-start) "[ \t\f]\\|[ \t]*;+[ \t]")
   (set (make-local-variable 'paragraph-ignore-fill-prefix) nil)
@@ -1932,7 +1942,7 @@
   ;; Set tag table list to use IDLTAGS as file name.
   (if (boundp 'tag-table-alist)
       (add-to-list 'tag-table-alist '("\\.pro$" . "IDLTAGS")))
-
+  
   ;; Font-lock additions - originally Phil Williams, then Ulrik Dickow
   ;; Following line is for Emacs - XEmacs uses the corresponding property
   ;; on the `idlwave-mode' symbol.
@@ -1947,11 +1957,16 @@
        'idlwave-prev-index-position)
 
   ;; Make a local post-command-hook and add our hook to it
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; (make-local-hook 'post-command-hook)
   (add-hook 'post-command-hook 'idlwave-command-hook nil 'local)
 
   ;; Make local hooks for buffer updates
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  ;; (make-local-hook 'kill-buffer-hook)
   (add-hook 'kill-buffer-hook 'idlwave-kill-buffer-update nil 'local)
-  (add-hook 'after-save-hook 'idlwave-save-buffer-update nil 'local)
+  ;; (make-local-hook 'after-save-hook)
+  ;; (add-hook 'after-save-hook 'idlwave-save-buffer-update nil 'local)
   (add-hook 'after-save-hook 'idlwave-revoke-license-to-kill nil 'local)
 
   ;; Setup directories and file, if necessary
@@ -1960,6 +1975,9 @@
   ;; Update the routine info with info about current buffer?
   (idlwave-new-buffer-update)
 
+  ;; Check help location
+  (idlwave-help-check-locations)
+
   ;; Run the mode hook
   (run-mode-hooks 'idlwave-mode-hook))
 
@@ -1968,18 +1986,23 @@
   (unless idlwave-setup-done
     (if (not (file-directory-p idlwave-config-directory))
 	(make-directory idlwave-config-directory))
-    (setq idlwave-user-catalog-file (expand-file-name
-				     idlwave-user-catalog-file
-				     idlwave-config-directory)
-	idlwave-path-file (expand-file-name
-			   idlwave-path-file
-			   idlwave-config-directory))
+    (setq 
+     idlwave-user-catalog-file (expand-file-name 
+				idlwave-user-catalog-file 
+				idlwave-config-directory)
+     idlwave-xml-system-rinfo-converted-file 
+     (expand-file-name 
+      idlwave-xml-system-rinfo-converted-file
+      idlwave-config-directory)
+     idlwave-path-file (expand-file-name 
+			idlwave-path-file 
+			idlwave-config-directory))
     (idlwave-read-paths)  ; we may need these early
     (setq idlwave-setup-done t)))
 
 ;;
 ;; Code Formatting ----------------------------------------------------
-;;
+;; 
 
 (defun idlwave-push-mark (&rest rest)
   "Push mark for compatibility with Emacs 18/19."
@@ -2128,7 +2151,7 @@
 	(if (> end-pos eol-pos)
 	    (setq end-pos pos))
 	(goto-char end-pos)
-	(setq end (buffer-substring
+	(setq end (buffer-substring 
 		   (progn
 		     (skip-chars-backward "a-zA-Z")
 		     (point))
@@ -2150,7 +2173,7 @@
 	    (sit-for 1))
 	   (t
 	    (beep)
-	    (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?"
+	    (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?" 
 		     end1 end)
 	    (sit-for 1))))))))
   ;;(delete-char 1))
@@ -2162,8 +2185,8 @@
        ((looking-at "pro\\|case\\|switch\\|function\\>")
 	(assoc (downcase (match-string 0)) idlwave-block-matches))
        ((looking-at "begin\\>")
-	(let ((limit (save-excursion
-		       (idlwave-beginning-of-statement)
+	(let ((limit (save-excursion 
+		       (idlwave-beginning-of-statement) 
 		       (point))))
 	  (cond
 	   ((re-search-backward ":[ \t]*\\=" limit t)
@@ -2180,7 +2203,6 @@
 (defun idlwave-close-block ()
   "Terminate the current block with the correct END statement."
   (interactive)
-
   ;; Start new line if we are not in a new line
   (unless (save-excursion
 	    (skip-chars-backward " \t")
@@ -2191,12 +2213,27 @@
     (insert "end")
     (idlwave-show-begin)))
 
-(defun idlwave-gtr-pad-hook (char)
-  "Let the > symbol expand around -> if present.  The new token length
-is returned."
-  2)
-
-(defun idlwave-surround (&optional before after escape-chars length ec-hook)
+(defun idlwave-custom-ampersand-surround (&optional is-action)
+  "Surround &, leaving room for && (which surrround as well)."
+  (let* ((prev-char (char-after (- (point) 2)))
+	 (next-char (char-after (point)))
+	 (amp-left (eq prev-char ?&))
+	 (amp-right (eq next-char ?&))
+	 (len (if amp-left 2 1)))
+    (unless amp-right ;no need to do it twice, amp-left will catch it.
+      (idlwave-surround -1 (if (or is-action amp-left) -1) len))))
+
+(defun idlwave-custom-ltgtr-surround (gtr &optional is-action)
+  "Surround > and < by blanks, leaving room for >= and <=, and considering ->."
+  (let* ((prev-char (char-after (- (point) 2)))
+	(next-char (char-after (point)))
+	(method-invoke (and gtr (eq prev-char ?-)))
+	(len (if method-invoke 2 1)))
+    (unless  (eq next-char ?=)
+      ;; Key binding: pad only on left, to save for possible >=/<=
+      (idlwave-surround -1 (if (or is-action method-invoke) -1) len))))
+
+(defun idlwave-surround (&optional before after length is-action)
   "Surround the LENGTH characters before point with blanks.
 LENGTH defaults to 1.
 Optional arguments BEFORE and AFTER affect the behavior before and
@@ -2209,42 +2246,28 @@
 
 The function does nothing if any of the following conditions is true:
 - `idlwave-surround-by-blank' is nil
-- the character before point is inside a string or comment
-- the char preceeding the string to be surrounded is a member of ESCAPE-CHARS.
-  This hack is used to avoid padding of `>' when it is part of
-  the '->' operator.  In this case, ESCAPE-CHARS would be '(?-).
-
-If a function is passed in EC-HOOK, and an ESCAPE-CHARS match occurs,
-the named function will be called with a single argument of the
-preceeding character.  Then idlwave-surround will run as usual if
-EC-HOOK returns non-nil, and a new length will be taken from the
-return value."
+- the character before point is inside a string or comment"
   (when (and idlwave-surround-by-blank (not (idlwave-quoted)))
-    (let* ((length (or length 1)) ; establish a default for LENGTH
-	   (prev-char (char-after (- (point) (1+ length)))))
-      (when (or (not (memq prev-char escape-chars))
-		(and (fboundp ec-hook)
-		     (setq length
-			   (save-excursion (funcall ec-hook prev-char)))))
-	(backward-char length)
-	(save-restriction
-	  (let ((here (point)))
-	    (skip-chars-backward " \t")
-	    (if (bolp)
-		;; avoid clobbering indent
-		(progn
-		  (move-to-column (idlwave-calculate-indent))
-		  (if (<= (point) here)
-		      (narrow-to-region (point) here))
-		  (goto-char here)))
-	    (idlwave-make-space before))
-	  (skip-chars-forward " \t"))
-	(forward-char length)
-	(idlwave-make-space after)
-	;; Check to see if the line should auto wrap
-	(if (and (equal (char-after (1- (point))) ?\ )
-		 (> (current-column) fill-column))
-	    (funcall auto-fill-function))))))
+    (let ((length (or length 1))) ; establish a default for LENGTH
+      (backward-char length)
+      (save-restriction
+	(let ((here (point)))
+	  (skip-chars-backward " \t")
+	  (if (bolp)
+	      ;; avoid clobbering indent
+	      (progn
+		(move-to-column (idlwave-calculate-indent))
+		(if (<= (point) here)
+		    (narrow-to-region (point) here))
+		(goto-char here)))
+	  (idlwave-make-space before))
+	(skip-chars-forward " \t"))
+      (forward-char length)
+      (idlwave-make-space after)
+      ;; Check to see if the line should auto wrap
+      (if (and (equal (char-after (1- (point))) ?\ )
+	       (> (current-column) fill-column))
+	  (funcall auto-fill-function)))))
 
 (defun idlwave-make-space (n)
   "Make space at point.
@@ -2446,7 +2469,7 @@
         (let ((eos (save-excursion
                      (idlwave-block-jump-out -1 'nomark)
                      (point))))
-          (if (setq status (idlwave-find-key
+          (if (setq status (idlwave-find-key 
 			    idlwave-end-block-reg -1 'nomark eos))
               (idlwave-beginning-of-statement)
             (message "No nested block before beginning of containing block.")))
@@ -2454,7 +2477,7 @@
       (let ((eos (save-excursion
                    (idlwave-block-jump-out 1 'nomark)
                    (point))))
-        (if (setq status (idlwave-find-key
+        (if (setq status (idlwave-find-key 
 			  idlwave-begin-block-reg 1 'nomark eos))
             (idlwave-end-of-statement)
           (message "No nested block before end of containing block."))))
@@ -2468,7 +2491,7 @@
         (here (point)))
     (goto-char (point-max))
     (if (re-search-backward idlwave-doclib-start nil t)
-        (progn
+        (progn 
 	  (setq beg (progn (beginning-of-line) (point)))
 	  (if (re-search-forward idlwave-doclib-end nil t)
 	      (progn
@@ -2502,7 +2525,7 @@
    ((eq major-mode 'idlwave-shell-mode)
     (if (re-search-backward idlwave-shell-prompt-pattern nil t)
 	(goto-char (match-end 0))))
-   (t
+   (t	
     (if (save-excursion (forward-line -1) (idlwave-is-continuation-line))
 	(idlwave-previous-statement)
       (beginning-of-line)))))
@@ -2579,7 +2602,7 @@
   (let ((save-point (point)))
     (when (re-search-forward ".*&" lim t)
       (goto-char (match-end 0))
-      (if (idlwave-quoted)
+      (if (idlwave-quoted) 
 	  (goto-char save-point)
 	(if (eq (char-after (- (point) 2)) ?&) (goto-char save-point))))
     (point)))
@@ -2596,7 +2619,7 @@
   ;; - not in parenthesis (like a[0:3])
   ;; - not followed by another ":" in explicit class, ala a->b::c
   ;; As many in this mode, this function is heuristic and not an exact
-  ;; parser.
+  ;; parser. 
   (let* ((start (point))
 	 (eos (save-excursion (idlwave-end-of-statement) (point)))
 	 (end (idlwave-find-key ":" 1 'nomark eos)))
@@ -2665,7 +2688,7 @@
       (if st
           (append st (match-end 0))))))
 
-(defun idlwave-expand-equal (&optional before after)
+(defun idlwave-expand-equal (&optional before after is-action)
   "Pad '=' with spaces.  Two cases: Assignment statement, and keyword
 assignment.  Which case is determined using
 `idlwave-start-of-substatement' and `idlwave-statement-type'.  The
@@ -2673,7 +2696,7 @@
 `idlwave-pad-keyword' is t then keyword assignment is treated just
 like assignment statements.  When nil, spaces are removed for keyword
 assignment.  Any other value keeps the current space around the `='.
-Limits in for loops are treated as keyword assignment.
+Limits in for loops are treated as keyword assignment.  
 
 Starting with IDL 6.0, a number of op= assignments are available.
 Since ambiguities of the form:
@@ -2686,29 +2709,31 @@
 \(not just for padding, but for proper parsing by IDL too!).  Other
 operators, such as ##=, ^=, etc., will be pre-padded.
 
+IS-ACTION is ignored.
+
 See `idlwave-surround'."
   (if idlwave-surround-by-blank
-      (let
+      (let 
 	  ((non-an-ops "\\(##\\|\\*\\|\\+\\|-\\|/\\|<\\|>\\|\\^\\)\\=")
-	   (an-ops
+	   (an-ops 
 	    "\\s-\\(AND\\|EQ\\|GE\\|GT\\|LE\\|LT\\|MOD\\|NE\\|OR\\|XOR\\)\\=")
 	   (len 1))
-
-	(save-excursion
+	
+	(save-excursion 
 	  (let ((case-fold-search t))
 	    (backward-char)
-	    (if (or
+	    (if (or 
 		 (re-search-backward non-an-ops nil t)
 		 ;; Why doesn't ##? work for both?
-		 (re-search-backward "\\(#\\)\\=" nil t))
+		 (re-search-backward "\\(#\\)\\=" nil t)) 
 		(setq len (1+ (length (match-string 1))))
 	      (when (re-search-backward an-ops nil t)
 		;(setq begin nil) ; won't modify begin
 		(setq len (1+ (length (match-string 1))))))))
-
-	(if (eq t idlwave-pad-keyword)
+	
+	(if (eq t idlwave-pad-keyword)  
 	    ;; Everything gets padded equally
-	    (idlwave-surround before after nil len)
+	    (idlwave-surround before after len)
 	  ;; Treating keywords/for variables specially...
 	  (let ((st (save-excursion   ; To catch "for" variables
 		      (idlwave-start-of-substatement t)
@@ -2717,22 +2742,22 @@
 			(skip-chars-backward "= \t")
 			(nth 2 (idlwave-where)))))
 	    (cond ((or (memq what '(function-keyword procedure-keyword))
-		       (memq (caar st) '(for pdef)))
-		   (cond
+		       (memq (caar st) '(for pdef))) 
+		   (cond 
 		    ((null idlwave-pad-keyword)
 		     (idlwave-surround 0 0)
 		     ) ; remove space
 		    (t))) ; leave any spaces alone
-		  (t (idlwave-surround before after nil len))))))))
-
+		  (t (idlwave-surround before after len))))))))
+	      
 
 (defun idlwave-indent-and-action (&optional arg)
   "Call `idlwave-indent-line' and do expand actions.
 With prefix ARG non-nil, indent the entire sub-statement."
   (interactive "p")
   (save-excursion
-    (if	(and idlwave-expand-generic-end
-	     (re-search-backward "\\<\\(end\\)\\s-*\\="
+    (if	(and idlwave-expand-generic-end 
+	     (re-search-backward "\\<\\(end\\)\\s-*\\=" 
 				 (max 0 (- (point) 10)) t)
 	     (looking-at "\\(end\\)\\([ \n\t]\\|\\'\\)"))
 	(progn (goto-char (match-end 1))
@@ -2742,7 +2767,7 @@
   (when (and (not arg) current-prefix-arg)
     (setq arg current-prefix-arg)
     (setq current-prefix-arg nil))
-  (if arg
+  (if arg 
       (idlwave-indent-statement)
     (idlwave-indent-line t)))
 
@@ -2804,18 +2829,20 @@
     (set-marker mloc nil)))
 
 (defun idlwave-do-action (action)
-  "Perform an action repeatedly on a line.
-ACTION is a list (REG . FUNC).  REG is a regular expression.  FUNC is
-either a function name to be called with `funcall' or a list to be
-evaluated with `eval'.  The action performed by FUNC should leave point
-after the match for REG - otherwise an infinite loop may be entered."
+  "Perform an action repeatedly on a line.  ACTION is a list (REG
+. FUNC).  REG is a regular expression.  FUNC is either a function name
+to be called with `funcall' or a list to be evaluated with `eval'.
+The action performed by FUNC should leave point after the match for
+REG - otherwise an infinite loop may be entered.  FUNC is always
+passed a final argument of 'is-action, so it can discriminate between
+being run as an action, or a key binding"
   (let ((action-key (car action))
         (action-routine (cdr action)))
     (beginning-of-line)
     (while (idlwave-look-at action-key)
       (if (listp action-routine)
-          (eval action-routine)
-        (funcall action-routine)))))
+          (eval (append action-routine '('is-action)))
+        (funcall action-routine 'is-action)))))
 
 (defun idlwave-indent-to (col &optional min)
   "Indent from point with spaces until column COL.
@@ -2875,7 +2902,7 @@
 		(save-excursion
 		  (cond
 		   ;; Beginning of file
-		   ((prog1
+		   ((prog1 
 			(idlwave-previous-statement)
 		      (setq beg-prev-pos (point)))
 		    0)
@@ -2885,7 +2912,7 @@
 		       idlwave-main-block-indent))
 		   ;; Begin block
 		   ((idlwave-look-at idlwave-begin-block-reg t)
-		    (+ (idlwave-min-current-statement-indent)
+		    (+ (idlwave-min-current-statement-indent) 
 		       idlwave-block-indent))
 		   ;; End Block
 		   ((idlwave-look-at idlwave-end-block-reg t)
@@ -2896,7 +2923,7 @@
 		      (idlwave-min-current-statement-indent)))
 		      ;;		      idlwave-end-offset
 		      ;;		      idlwave-block-indent))
-
+		   
 		   ;; Default to current indent
 		   ((idlwave-current-statement-indent))))))
           ;; adjust the indentation based on the current statement
@@ -2912,7 +2939,7 @@
 
 (defun idlwave-calculate-paren-indent (beg-reg end-reg close-exp)
   "Calculate the continuation indent inside a paren group.
-Returns a cons-cell with (open . indent), where open is the
+Returns a cons-cell with (open . indent), where open is the 
 location of the open paren"
   (let ((open (nth 1 (parse-partial-sexp beg-reg end-reg))))
     ;; Found an innermost open paren.
@@ -2953,24 +2980,24 @@
            (end-reg (progn (beginning-of-line) (point)))
 	   (beg-last-statement (save-excursion (idlwave-previous-statement)
 					       (point)))
-           (beg-reg (progn (idlwave-start-of-substatement 'pre)
+           (beg-reg (progn (idlwave-start-of-substatement 'pre) 
 			   (if (eq (line-beginning-position) end-reg)
 			       (goto-char beg-last-statement)
 			     (point))))
 	   (basic-indent (+ (idlwave-min-current-statement-indent end-reg)
 			    idlwave-continuation-indent))
 	   fancy-nonparen-indent fancy-paren-indent)
-      (cond
+      (cond 
        ;; Align then with its matching if, etc.
        ((let ((matchers '(("\\<if\\>" . "[ \t]*then")
 			  ("\\<\\(if\\|end\\(if\\)?\\)\\>" . "[ \t]*else")
 			  ("\\<\\(for\\|while\\)\\>" . "[ \t]*do")
-			  ("\\<\\(repeat\\|end\\(rep\\)?\\)\\>" .
+			  ("\\<\\(repeat\\|end\\(rep\\)?\\)\\>" . 
 			   "[ \t]*until")
 			  ("\\<case\\>" . "[ \t]*of")))
 	      match cont-re)
 	  (goto-char end-reg)
-	  (and
+	  (and 
 	   (setq cont-re
 		 (catch 'exit
 		   (while (setq match (car matchers))
@@ -2979,7 +3006,7 @@
 		     (setq matchers (cdr matchers)))))
 	   (idlwave-find-key cont-re -1 'nomark beg-last-statement)))
 	(if (looking-at "end") ;; that one's special
-	    (- (idlwave-current-indent)
+	    (- (idlwave-current-indent) 
 	       (+ idlwave-block-indent idlwave-end-offset))
 	  (idlwave-current-indent)))
 
@@ -3005,7 +3032,7 @@
 	      (let* ((end-reg end-reg)
 		    (close-exp (progn
 				 (goto-char end-reg)
-				 (skip-chars-forward " \t")
+				 (skip-chars-forward " \t") 
 				 (looking-at "\\s)")))
 		    indent-cons)
 		(catch 'loop
@@ -3039,12 +3066,12 @@
 		   (if (save-match-data (looking-at "[ \t$]*\\(;.*\\)?$"))
 		       nil
 		     (current-column)))
-
+		  
 		  ;; Continued assignment (with =):
 		  ((catch 'assign ;
 		     (while (looking-at "[^=\n\r]*\\(=\\)[ \t]*")
 		       (goto-char (match-end 0))
-		       (if (null (idlwave-what-function beg-reg))
+		       (if (null (idlwave-what-function beg-reg)) 
 			   (throw 'assign t))))
 		   (unless (or
 			    (idlwave-in-quote)
@@ -3106,7 +3133,7 @@
   (let* ((here (point))
          (case-fold-search t)
          (limit (if (>= dir 0) (point-max) (point-min)))
-         (block-limit (if (>= dir 0)
+         (block-limit (if (>= dir 0) 
 			  idlwave-begin-block-reg
 			idlwave-end-block-reg))
          found
@@ -3117,7 +3144,7 @@
 			       (idlwave-find-key
 				idlwave-begin-unit-reg dir t limit)
 			     (end-of-line)
-			     (idlwave-find-key
+			     (idlwave-find-key 
 			      idlwave-end-unit-reg dir t limit)))
 			 limit)))
     (if (>= dir 0) (end-of-line)) ;Make sure we are in current block
@@ -3142,7 +3169,7 @@
 		  (or (null end-reg) (< (point) end-reg)))
 	(unless comm-or-empty (setq min (min min (idlwave-current-indent)))))
       (if (or comm-or-empty (and end-reg (>= (point) end-reg)))
-	  min
+	  min 
 	(min min (idlwave-current-indent))))))
 
 (defun idlwave-current-statement-indent (&optional last-line)
@@ -3168,10 +3195,10 @@
 Blank or comment-only lines following regular continuation lines (with
 `$') count as continuations too."
   (save-excursion
-    (or
+    (or 
      (idlwave-look-at "\\<\\$")
      (catch 'loop
-       (while (and (looking-at "^[ \t]*\\(;.*\\)?$")
+       (while (and (looking-at "^[ \t]*\\(;.*\\)?$") 
 		   (eq (forward-line -1) 0))
 	 (if (idlwave-look-at "\\<\\$") (throw 'loop t)))))))
 
@@ -3269,7 +3296,7 @@
                                           (beginning-of-line) (point))
                                         (point))))
                "[^;]"))
-
+	
         ;; Mark the beginning and end of the paragraph
         (goto-char bcl)
         (while (and (looking-at fill-prefix-reg)
@@ -3333,7 +3360,7 @@
                       (insert (make-string diff ?\ ))))
                 (forward-line -1))
               )
-
+	  
           ;; No hang. Instead find minimum indentation of paragraph
           ;; after first line.
           ;; For the following while statement, since START is at the
@@ -3365,7 +3392,7 @@
                   t)
                  (current-column))
                indent))
-
+	
         ;; try to keep point at its original place
         (goto-char here)
 
@@ -3414,7 +3441,7 @@
           (current-column)))))
 
 (defun idlwave-auto-fill ()
-  "Called to break lines in auto fill mode.
+  "Called to break lines in auto fill mode.  
 Only fills non-comment lines if `idlwave-fill-comment-line-only' is
 non-nil.  Places a continuation character at the end of the line if
 not in a comment.  Splits strings with IDL concatenation operator `+'
@@ -3565,7 +3592,7 @@
   (insert (current-time-string))
   (insert ", " (user-full-name))
   (if (boundp 'user-mail-address)
-      (insert " <" user-mail-address ">")
+      (insert " <" user-mail-address ">") 
     (insert " <" (user-login-name) "@" (system-name) ">"))
   ;; Remove extra spaces from line
   (idlwave-fill-paragraph)
@@ -3591,7 +3618,7 @@
 	     (setq end (match-end 0)))
 	(progn
 	  (goto-char beg)
-	  (if (re-search-forward
+	  (if (re-search-forward 
 	       (concat idlwave-doc-modifications-keyword ":")
 	       end t)
 	      (end-of-line)
@@ -3689,7 +3716,7 @@
      (not (idlwave-in-quote))
      (save-excursion
        (forward-char)
-       (re-search-backward (concat "\\(" idlwave-idl-keywords
+       (re-search-backward (concat "\\(" idlwave-idl-keywords 
 				   "\\|[[(*+-/=,^><]\\)\\s-*\\*") limit t)))))
 
 
@@ -3735,7 +3762,7 @@
 	  (indent-region beg end nil))
       (if (stringp prompt)
 	  (message prompt)))))
-
+  
 (defun idlwave-rw-case (string)
   "Make STRING have the case required by `idlwave-reserved-word-upcase'."
   (if idlwave-reserved-word-upcase
@@ -3753,7 +3780,7 @@
 (defun idlwave-case ()
   "Build skeleton IDL case statement."
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "case")
    (idlwave-rw-case " of\n\nendcase")
    "Selector expression"))
@@ -3761,7 +3788,7 @@
 (defun idlwave-switch ()
   "Build skeleton IDL switch statement."
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "switch")
    (idlwave-rw-case " of\n\nendswitch")
    "Selector expression"))
@@ -3769,7 +3796,7 @@
 (defun idlwave-for ()
   "Build skeleton for loop statment."
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "for")
    (idlwave-rw-case " do begin\n\nendfor")
    "Loop expression"))
@@ -3784,14 +3811,14 @@
 
 (defun idlwave-procedure ()
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "pro")
    (idlwave-rw-case "\n\nreturn\nend")
    "Procedure name"))
 
 (defun idlwave-function ()
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "function")
    (idlwave-rw-case "\n\nreturn\nend")
    "Function name"))
@@ -3805,7 +3832,7 @@
 
 (defun idlwave-while ()
   (interactive)
-  (idlwave-template
+  (idlwave-template 
    (idlwave-rw-case "while")
    (idlwave-rw-case " do begin\n\nendwhile")
    "Entry condition"))
@@ -3884,8 +3911,8 @@
 (defun idlwave-count-outlawed-buffers (tag)
   "How many outlawed buffers have tag TAG?"
   (length (delq nil
-		(mapcar
-		 (lambda (x) (eq (cdr x) tag))
+		(mapcar 
+		 (lambda (x) (eq (cdr x) tag)) 
 		 idlwave-outlawed-buffers))))
 
 (defun idlwave-do-kill-autoloaded-buffers (&rest reasons)
@@ -3899,9 +3926,9 @@
 		   (memq (cdr entry) reasons))
 	       (kill-buffer (car entry))
 	       (incf cnt)
-	       (setq idlwave-outlawed-buffers
+	       (setq idlwave-outlawed-buffers 
 		     (delq entry idlwave-outlawed-buffers)))
-	(setq idlwave-outlawed-buffers
+	(setq idlwave-outlawed-buffers 
 	      (delq entry idlwave-outlawed-buffers))))
     (message "%d buffer%s killed" cnt (if (= cnt 1) "" "s"))))
 
@@ -3913,7 +3940,7 @@
 	 (entry (assq buf idlwave-outlawed-buffers)))
     ;; Revoke license
     (if entry
-	(setq idlwave-outlawed-buffers
+	(setq idlwave-outlawed-buffers 
 	      (delq entry idlwave-outlawed-buffers)))
     ;; Remove this function from the hook.
     (remove-hook 'after-save-hook 'idlwave-revoke-license-to-kill 'local)))
@@ -3932,7 +3959,7 @@
 (defun idlwave-expand-lib-file-name (file)
   ;; Find FILE on the scanned lib path and return a buffer visiting it
   ;; This is for, e.g., finding source with no user catalog
-  (cond
+  (cond 
    ((null file) nil)
    ((file-name-absolute-p file) file)
    (t (idlwave-locate-lib-file file))))
@@ -3947,7 +3974,7 @@
   (interactive)
   (let (directory directories cmd append status numdirs dir getsubdirs
 		  buffer save_buffer files numfiles item errbuf)
-
+    
     ;;
     ;; Read list of directories
     (setq directory (read-string "Tag Directories: " "."))
@@ -3999,7 +4026,7 @@
 		    (message "%s" (concat "Tagging " item "..."))
 		    (setq errbuf (get-buffer-create "*idltags-error*"))
 		    (setq status (+ status
-				    (if (eq 0 (call-process
+				    (if (eq 0 (call-process 
 					       "sh" nil errbuf nil "-c"
 					       (concat cmd append item)))
 					0
@@ -4013,13 +4040,13 @@
 		  (setq numfiles (1+ numfiles))
 		  (setq item (nth numfiles files))
 		  )))
-
+	    
 	    (setq numdirs (1+ numdirs))
 	    (setq dir (nth numdirs directories)))
 	(progn
 	  (setq numdirs (1+ numdirs))
 	  (setq dir (nth numdirs directories)))))
-
+    
     (setq errbuf (get-buffer-create "*idltags-error*"))
     (if (= status 0)
 	(kill-buffer errbuf))
@@ -4095,7 +4122,7 @@
   ;; Make sure the hash functions are accessible.
   (if (or (not (fboundp 'gethash))
 	  (not (fboundp 'puthash)))
-      (progn
+      (progn 
 	(require 'cl)
 	(or (fboundp 'puthash)
 	    (defalias 'puthash 'cl-puthash))))
@@ -4109,22 +4136,22 @@
       for var = (car entry)
       do (if (not (consp (symbol-value var))) (set var (list nil))))
 
+    ;; Reset the system & library hash
     (when (or (eq what t) (eq what 'syslib)
 	      (null (cdr idlwave-sint-routines)))
-      ;; Reset the system & library hash
       (loop for entry in entries
 	for var = (car entry) for size = (nth 1 entry)
-	do (setcdr (symbol-value var)
+	do (setcdr (symbol-value var) 
 		   (make-hash-table ':size size ':test 'equal)))
       (setq idlwave-sint-dirs nil
 	    idlwave-sint-libnames nil))
 
+    ;; Reset the buffer & shell hash
     (when (or (eq what t) (eq what 'bufsh)
 	      (null (car idlwave-sint-routines)))
-      ;; Reset the buffer & shell hash
       (loop for entry in entries
 	for var = (car entry) for size = (nth 1 entry)
-	do (setcar (symbol-value var)
+	do (setcar (symbol-value var) 
 		   (make-hash-table ':size size ':test 'equal))))))
 
 (defun idlwave-sintern-routine-or-method (name &optional class set)
@@ -4211,11 +4238,11 @@
 	    (setq class (idlwave-sintern-class class set))
 	    (setq name (idlwave-sintern-method name set)))
 	(setq name (idlwave-sintern-routine name set)))
-
+      
       ;; The source
       (let ((source-type (car source))
 	    (source-file  (nth 1 source))
-	    (source-dir  (if default-dir
+	    (source-dir  (if default-dir  
 			     (file-name-as-directory default-dir)
 			   (nth 2 source)))
 	    (source-lib (nth 3 source)))
@@ -4224,7 +4251,7 @@
 	(if (stringp source-lib)
 	    (setq source-lib (idlwave-sintern-libname source-lib set)))
 	(setq source (list source-type source-file source-dir source-lib)))
-
+      
       ;; The keywords
       (setq kwds (mapcar (lambda (x)
 			   (idlwave-sintern-keyword-list x set))
@@ -4364,10 +4391,10 @@
 		     "-l" (expand-file-name "~/.emacs")
 		     "-l" "idlwave"
 		     "-f" "idlwave-rescan-catalog-directories"))
-	 (process (apply 'start-process "idlcat"
+	 (process (apply 'start-process "idlcat" 
 			 nil emacs args)))
     (setq idlwave-catalog-process process)
-    (set-process-sentinel
+    (set-process-sentinel 
      process
      (lambda (pro why)
        (when (string-match "finished" why)
@@ -4384,7 +4411,8 @@
 ;; ("ROUTINE" type class
 ;;  (system) | (lib pro_file dir "LIBNAME") | (user pro_file dir "USERLIB") |
 ;;  (buffer pro_file dir) | (compiled pro_file dir)
-;;   "calling_string" ("HELPFILE" (("KWD1" . link1) ...)))
+;;   "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) 
+;;                    ("HELPFILE2" (("KWD2" . link) ...)) ...)
 ;;
 ;; DIR will be supplied dynamically while loading library catalogs,
 ;; and is sinterned to save space, as is LIBNAME.  PRO_FILE can be a
@@ -4442,7 +4470,7 @@
 	   ;; The override-idle means, even if the idle timer has done some
 	   ;; preparing work, load and renormalize everything anyway.
 	   (override-idle (or arg idlwave-buffer-case-takes-precedence)))
-
+      
       (setq idlwave-buffer-routines nil
 	    idlwave-compiled-routines nil
 	    idlwave-unresolved-routines nil)
@@ -4453,14 +4481,14 @@
 	(idlwave-reset-sintern (cond (load t)
 				     ((null idlwave-system-routines) t)
 				     (t 'bufsh))))
-
+      
       (if idlwave-buffer-case-takes-precedence
 	  ;; We can safely scan the buffer stuff first
 	  (progn
 	    (idlwave-update-buffer-routine-info)
-	    (and load (idlwave-load-system-rinfo override-idle)))
+	    (and load (idlwave-load-all-rinfo override-idle)))
 	;; We first do the system info, and then the buffers
-	(and load (idlwave-load-system-rinfo override-idle))
+	(and load (idlwave-load-all-rinfo override-idle))
 	(idlwave-update-buffer-routine-info))
 
       ;; Let's see if there is a shell
@@ -4468,9 +4496,9 @@
 				    (idlwave-shell-is-running)))
 	     (ask-shell (and shell-is-running
 			     idlwave-query-shell-for-routine-info)))
-
+      
 	;; Load the library catalogs again, first re-scanning the path
-	(when arg
+	(when arg 
 	  (if shell-is-running
 	      (idlwave-shell-send-command idlwave-shell-path-query
 					  '(progn
@@ -4490,7 +4518,7 @@
 	    ;;    Therefore, we do a concatenation now, even though
 	    ;;    the shell might do it again.
 	    (idlwave-concatenate-rinfo-lists nil 'run-hooks))
-
+      
 	(when ask-shell
 	  ;; Ask the shell about the routines it knows of.
 	  (message "Querying the shell")
@@ -4521,16 +4549,433 @@
 
 (defvar idlwave-library-routines nil "Obsolete variable.")
 
+;;------ XML Help routine info system
+(defun idlwave-load-system-routine-info ()
+  ;; Load the system routine info from the cached routine info file,
+  ;; which, if necessary, will be re-created from the XML file on
+  ;; disk.  As a last fallback, load the (likely outdated) idlw-rinfo
+  ;; file distributed with older IDLWAVE versions (<6.0)
+  (unless (and (load idlwave-xml-system-rinfo-converted-file 
+		     'noerror 'nomessage)
+	       (idlwave-xml-system-routine-info-up-to-date))
+    ;; See if we can create it from XML source
+    (condition-case nil
+	(idlwave-convert-xml-system-routine-info)
+      (error 
+       (unless (load idlwave-xml-system-rinfo-converted-file 
+		     'noerror 'nomessage)
+	 (if idlwave-system-routines
+	     (message 
+	      "Failed to load converted routine info, using old conversion.")
+	   (message 
+	    "Failed to convert XML routine info, falling back on idlw-rinfo.")
+	   (if (not (load "idlw-rinfo" 'noerror 'nomessage))
+	       (message 
+		"Could not locate any system routine information."))))))))
+
+(defun idlwave-xml-system-routine-info-up-to-date()
+  (let* ((dir (file-name-as-directory 
+	       (expand-file-name "help/online_help" (idlwave-sys-dir))))
+	 (catalog-file (expand-file-name "idl_catalog.xml" dir)))
+    (file-newer-than-file-p ;converted file is newer than catalog
+     idlwave-xml-system-rinfo-converted-file
+     catalog-file)))
+
+(defvar idlwave-system-class-info nil) ; Gathered from idlw-rinfo
+(defvar idlwave-system-variables-alist nil
+  "Alist of system variables and the associated structure tags.
+Gets set in cached XML rinfo, or `idlw-rinfo.el'.")
+(defvar idlwave-executive-commands-alist nil
+  "Alist of system variables and their help files.")
+(defvar idlwave-help-special-topic-words nil)
+
+		
+(defun idlwave-shorten-syntax (syntax name &optional class)
+  ;; From a list of syntax statments, shorten with %s and group with "or"
+  (let ((case-fold-search t))
+    (mapconcat 
+     (lambda (x)
+       (while (string-match name x)
+	 (setq x (replace-match "%s" t t x)))
+       (if class 
+	   (while (string-match class x)
+	     (setq x (replace-match "%s" t t x))))
+       x)
+     (nreverse syntax)
+     " or ")))
+
+(defun idlwave-xml-create-class-method-lists (xml-entry)
+  ;; Create a class list entry from the xml parsed list., returning a
+  ;; cons of form (class-entry method-entries).
+  (let* ((nameblock (nth 1 xml-entry))
+	 (class (cdr (assq 'name nameblock)))
+	 (link (cdr (assq 'link nameblock)))
+	 (params (cddr xml-entry))
+	 (case-fold-search t)
+	 class-entry
+	 method methods-entry extra-kwds
+	 props get-props set-props init-props inherits
+	 pelem ptype)
+    (while params
+      (setq pelem (car params))
+      (when (listp pelem)
+	(setq ptype (car pelem)
+	      props (car (cdr pelem)))
+	(cond
+	 ((eq ptype 'SUPERCLASS)
+	  (push (cdr (assq 'name props)) inherits))
+
+	 ((eq ptype 'PROPERTY)
+	  (let ((pname (cdr (assq 'name props)))
+		(plink (cdr (assq 'link props)))
+		(get (string= (cdr (assq 'get props)) "Yes"))
+		(set (string= (cdr (assq 'set props)) "Yes"))
+		(init (string= (cdr (assq 'init props)) "Yes")))
+	    (if get (push (list pname plink) get-props))
+	    (if set (push (list pname plink) set-props))
+	    (if init (push (list pname plink) init-props))))
+
+	 ((eq ptype 'METHOD)
+	  (setq method (cdr (assq 'name props)))
+	  (setq extra-kwds ;;Assume all property keywords are gathered already
+		(cond
+		 ((string-match (concat class "::Init") method)
+		  (put 'init-props 'matched t)
+		  init-props)
+		 ((string-match (concat class "::GetProperty") method)
+		  (put 'get-props 'matched t)
+		  get-props)
+		 ((string-match (concat class "::SetProperty") method)
+		  (put 'set-props 'matched t)
+		  set-props)
+		 (t nil)))
+	  (setq methods-entry 
+		(nconc (idlwave-xml-create-rinfo-list pelem class extra-kwds) 
+		       methods-entry)))
+	 (t)))
+      (setq params (cdr params)))
+    ;(unless (get 'init-props 'matched)
+    ;  (message "Failed to match Init in class %s" class))
+    ;(unless (get 'get-props 'matched)
+    ;  (message "Failed to match GetProperty in class %s" class))
+    ;(unless (get 'set-props 'matched)
+    ;  (message "Failed to match SetProperty in class %s" class))
+    (setq class-entry 
+	  (if inherits 
+	      (list class (append '(inherits) inherits) (list 'link link))
+	    (list class (list 'link link))))
+    (cons class-entry methods-entry)))
+    
+(defun idlwave-xml-create-rinfo-list (xml-entry &optional class extra-kws)
+  ;; Create correctly structured list elements from ROUTINE or METHOD
+  ;; XML list structures.  Return a list of list elements, with more
+  ;; than one sub-list possible if a routine can serve as both
+  ;; procedure and function (e.g. call_method).
+  (let* ((nameblock (nth 1 xml-entry))
+	 (name (cdr (assq 'name nameblock)))
+	 (link (cdr (assq 'link nameblock)))
+	 (params (cddr xml-entry))
+	 (syntax-vec (make-vector 3 nil)) ; procedure, function, exec command
+	 (case-fold-search t)
+	 syntax kwd klink pref-list kwds pelem ptype entry props result type)
+    (if class ;; strip out class name from class method name string
+	(if (string-match (concat class "::") name)
+	    (setq name (substring name (match-end 0)))))
+    (while params
+      (setq pelem (car params))
+      (when (listp pelem)
+	(setq ptype (car pelem)
+	      props (car (cdr pelem)))
+	(cond
+	 ((eq ptype 'SYNTAX)
+	  (setq syntax (cdr (assq 'name props)))
+	  (if (string-match "-&gt;" syntax)
+	      (setq syntax (replace-match "->" t nil syntax)))
+	  (setq type (cdr (assq 'type props)))
+	  (push syntax
+		(aref syntax-vec (cond
+				  ((string-match "^pro" type) 0)
+				  ((string-match "^fun" type) 1)
+				  ((string-match "^exec" type) 2)))))
+	 ((eq ptype 'KEYWORD)
+	  (setq kwd (cdr (assq 'name props))
+		klink (cdr (assq 'link props)))
+	  (if (string-match "^\\[XY\\(Z?\\)\\]" kwd)
+	      (progn 
+		(setq pref-list 
+		      (if (match-string 1 kwd) '("X" "Y" "Z") '("X" "Y"))
+		      kwd (substring kwd (match-end 0)))
+		(loop for x in pref-list do
+		      (push (list (concat x kwd) klink) kwds)))
+	    (push (list kwd klink) kwds)))
+
+	 (t))); Do nothing for the others
+      (setq params (cdr params)))
+    
+    ;; Debug
+;    (if (and (null (aref syntax-vec 0))
+;	     (null (aref syntax-vec 1))
+;	     (null (aref syntax-vec 2)))
+;	(with-current-buffer (get-buffer-create "IDL_XML_catalog_complaints")
+;	  (if class
+;	      (insert (format "Missing SYNTAX entry for %s::%s\n" class name))
+;	    (insert (message "Missing SYNTAX entry for %s\n" name)))))
+
+    ;; Executive commands are treated specially
+    (if (aref syntax-vec 2)
+	(cons (substring name 1) link)
+      (if extra-kws (setq kwds (nconc kwds extra-kws)))
+      (setq kwds (idlwave-rinfo-group-keywords kwds link))
+      (loop for idx from 0 to 1 do
+	    (if (aref syntax-vec idx)
+		(push (append (list name (if (eq idx 0) 'pro 'fun) 
+				    class '(system)
+				    (idlwave-shorten-syntax 
+				     (aref syntax-vec idx) name class))
+			      kwds) result)))
+      result)))
+
+
+(defun idlwave-rinfo-group-keywords (kwds master-link)
+  ;; Group keywords by link file, as a list with elements 
+  ;; (linkfile ( ("KWD1" . link1) ("KWD2" . link2))
+  (let (kwd link anchor linkfiles block master-elt)
+    (while kwds
+      (setq kwd (car kwds)
+	    link (idlwave-split-link-target (nth 1 kwd))
+	    anchor (cdr link)
+	    link (car link)
+	    kwd (car kwd))
+      (if (setq block (assoc link linkfiles))
+	  (push (cons kwd anchor) (cdr block))
+	(push (list link (cons kwd anchor)) linkfiles))
+      (setq kwds (cdr kwds)))
+    ;; Ensure the master link is there
+    (if (setq master-elt (assoc master-link linkfiles))
+	(if (eq (car linkfiles) master-elt)
+	    linkfiles
+ 	  (cons master-elt (delq master-elt linkfiles)))
+      (push (list master-link) linkfiles))))
+      
+(defun idlwave-convert-xml-clean-statement-aliases (aliases)
+  ;; Clean up the syntax of routines which are actually aliases by
+  ;; removing the "OR" from the statements
+  (let (syntax entry)
+    (loop for x in aliases do
+	  (setq entry (assoc x idlwave-system-routines))
+	  (when entry
+	    (while (string-match " +or +" (setq syntax (nth 4 entry)))
+	      (setf (nth 4 entry) (replace-match ", " t t syntax)))))))
+
+(defun idlwave-convert-xml-clean-routine-aliases (aliases)
+  ;; Duplicate and trim original routine aliases from rinfo list
+  ;; This if for, e.g. OPENR/OPENW/OPENU 
+  (let (alias remove-list new parts all-parts)
+    (loop for x in aliases do
+	  (when (setq parts (split-string (cdr x) "/"))
+	    (setq new (assoc (cdr x) all-parts))
+	    (unless new
+	      (setq new (cons (cdr x) parts))
+	      (push new all-parts))
+	    (setcdr new (delete (car x) (cdr new)))))
+    
+    ;; Add any missing aliases (separate by slashes)
+    (loop for x in all-parts do
+	  (if (cdr x)
+	      (push (cons (nth 1 x) (car x)) aliases)))
+
+    (loop for x in aliases do
+	  (when (setq alias (assoc (cdr x) idlwave-system-routines))
+	    (unless (memq alias remove-list) (push alias remove-list))
+	    (setq alias (copy-sequence alias))
+	    (setcar alias (car x))
+	    (push alias idlwave-system-routines)))
+    (loop for x in remove-list do
+	  (delq x idlwave-system-routines))))
+
+(defun idlwave-convert-xml-clean-sysvar-aliases (aliases)
+  ;; Duplicate and trim original routine aliases from rinfo list
+  ;; This if for, e.g. !X, !Y, !Z.
+  (let (alias remove-list new parts all-parts)
+    (loop for x in aliases do
+	  (when (setq alias (assoc (cdr x) idlwave-system-variables-alist))
+	    (unless (memq alias remove-list) (push alias remove-list))
+	    (setq alias (copy-sequence alias))
+	    (setcar alias (car x))
+	    (push alias idlwave-system-variables-alist)))
+    (loop for x in remove-list do
+	  (delq x idlwave-system-variables-alist))))
+
+
+(defun idlwave-xml-create-sysvar-alist (xml-entry)
+  ;; Create a sysvar list entry from the xml parsed list.
+  (let* ((nameblock (nth 1 xml-entry))
+	 (sysvar (substring (cdr (assq 'name nameblock)) 1))
+	 (link (cdr (assq 'link nameblock)))
+	 (params (cddr xml-entry))
+	 (case-fold-search t)
+	 pelem ptype props fields tags)
+    (while params
+      (setq pelem (car params))
+      (when (listp pelem)
+	(setq ptype (car pelem)
+	      props (car (cdr pelem)))
+	(cond
+	 ((eq ptype 'FIELD)
+	  (push (cons (cdr (assq 'name props)) 
+		      (cdr
+		       (idlwave-split-link-target (cdr (assq 'link props)))))
+		tags))))
+	(setq params (cdr params)))
+    (delq nil
+	  (list sysvar (if tags (cons 'tags tags)) (list 'link link)))))
+
+
+(defvar idlwave-xml-routine-info-file nil)
+
+(defun idlwave-save-routine-info ()
+  (if idlwave-xml-routine-info-file
+      (with-temp-file idlwave-xml-system-rinfo-converted-file
+	(insert 
+	 (concat ";; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+;; IDLWAVE Routine Information File (IDLWAVE version " idlwave-mode-version ") 
+;; Automatically generated from source file: 
+;;  " idlwave-xml-routine-info-file "
+;; on " (current-time-string) "
+;; Do not edit."))
+	(insert (format "\n(setq idlwave-xml-routine-info-file \n    \"%s\")"
+			idlwave-xml-routine-info-file))
+	(insert "\n(setq idlwave-system-routines\n    '")
+	(prin1 idlwave-system-routines (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-system-variables-alist\n    '")
+	(prin1 idlwave-system-variables-alist (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-system-class-info\n    '")
+	(prin1 idlwave-system-class-info (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-executive-commands-alist\n    '")
+	(prin1 idlwave-executive-commands-alist (current-buffer))
+	(insert ")")
+	(insert "\n(setq idlwave-help-special-topic-words\n    '")
+	(prin1 idlwave-help-special-topic-words (current-buffer))
+	(insert ")"))))
+
+(defun idlwave-convert-xml-system-routine-info ()
+  "Convert XML supplied IDL routine info into internal form.
+Cache to disk for quick recovery."
+  (interactive)
+  (let* ((dir (file-name-as-directory 
+	       (expand-file-name "help/online_help" (idlwave-sys-dir))))
+	 (catalog-file (expand-file-name "idl_catalog.xml" dir))
+	 (elem-cnt 0)
+	 props rinfo msg-cnt elem type nelem class-result alias 
+	 routines routine-aliases statement-aliases sysvar-aliases
+	 buf version-string)
+    (if (not (file-exists-p catalog-file))
+	(error "No such XML routine info file: %s" catalog-file)
+      (if (not (file-readable-p catalog-file))
+	  (error "Cannot read XML routine info file: %s" catalog-file)))
+    (require 'xml)
+    (message "Reading XML routine info...")   
+    (unwind-protect
+	(progn
+	  ;; avoid warnings about read-only files
+	  (setq buf (find-file-noselect catalog-file 'nowarn))
+	  (setq rinfo (xml-parse-file catalog-file)))
+      (if (bufferp buf) (kill-buffer buf)))
+    (message "Reading XML routine info...done")
+    (setq rinfo (assq 'CATALOG rinfo))
+    (unless rinfo (error "Failed to parse XML routine info"))
+    ;;(setq rinfo (car rinfo)) ; Skip the catalog stuff.
+    
+    (setq version-string (cdr (assq 'version (nth 1 rinfo)))
+	  rinfo (cddr rinfo))
+
+    (setq nelem (length rinfo)
+	  msg-cnt (/ nelem 20))
+    
+    (setq idlwave-xml-routine-info-file nil)
+    (message "Converting XML routine info...")
+    (setq idlwave-system-routines nil
+	  idlwave-system-variables-alist nil
+	  idlwave-system-class-info nil
+	  idlwave-executive-commands-alist nil
+	  idlwave-help-special-topic-words nil)
+
+    (while rinfo
+      (setq elem (car rinfo)
+	    rinfo (cdr rinfo))
+      (incf elem-cnt)
+      (when (listp elem)
+	(setq type (car elem)
+	      props (car (cdr elem)))
+	(if (= (mod elem-cnt msg-cnt) 0)
+	    (message "Converting XML routine info...%2d%%" 
+		     (/ (* elem-cnt 100) nelem)))
+	(cond 
+	 ((eq type 'ROUTINE)
+	  (if (setq alias (assq 'alias_to props))
+	      (push (cons (cdr (assq 'name props)) (cdr alias)) 
+		    routine-aliases)
+	    (setq routines (idlwave-xml-create-rinfo-list elem))
+	    (if (listp (cdr routines))
+		(setq idlwave-system-routines
+		      (nconc idlwave-system-routines routines))
+	      ;; a cons cell is an executive commands
+	      (push routines idlwave-executive-commands-alist))))
+	 
+	 ((eq type 'CLASS)
+	  (setq class-result (idlwave-xml-create-class-method-lists elem))
+	  (push (car class-result) idlwave-system-class-info)
+	  (setq idlwave-system-routines
+	  (nconc idlwave-system-routines (cdr class-result))))
+
+	 ((eq type 'STATEMENT)
+	  (push (cons (cdr (assq 'name props))
+		      (cdr (assq 'link props)))
+	  idlwave-help-special-topic-words)
+	  ;; Save the links to those which are statement aliases (not routines)
+	  (if (setq alias (assq 'alias_to props))
+	      (unless (member (cdr alias) statement-aliases)
+		(push (cdr alias) statement-aliases))))
+
+	 ((eq type 'SYSVAR)
+	  (if (setq alias (cdr (assq 'alias_to props)))
+	      (push (cons (substring (cdr (assq 'name props)) 1) 
+			  (substring alias 1))
+		    sysvar-aliases)
+	    (push (idlwave-xml-create-sysvar-alist elem) 
+		  idlwave-system-variables-alist)))
+	 (t))))
+    (idlwave-convert-xml-clean-routine-aliases routine-aliases)
+    (idlwave-convert-xml-clean-statement-aliases statement-aliases)
+    (idlwave-convert-xml-clean-sysvar-aliases sysvar-aliases)
+
+    (setq idlwave-xml-routine-info-file catalog-file)
+    (idlwave-save-routine-info)
+    (message "Converting XML routine info...done")))
+      
+    
+;; ("ROUTINE" type class
+;;  (system) | (lib pro_file dir "LIBNAME") | (user pro_file dir "USERLIB") |
+;;  (buffer pro_file dir) | (compiled pro_file dir)
+;;   "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) 
+;;                    ("HELPFILE2" (("KWD2" . link) ...)) ...)
+
+
 (defun idlwave-load-rinfo-next-step ()
   (let ((inhibit-quit t)
 	(arr idlwave-load-rinfo-steps-done))
-    (when (catch 'exit
+    (if (catch 'exit
 	  (when (not (aref arr 0))
-	    (message "Loading idlw-rinfo.el in idle time...")
-	    (load "idlw-rinfo" 'noerror 'nomessage)
-	    (message "Loading idlw-rinfo.el in idle time...done")
+	    (message "Loading system routine info in idle time...")
+	    (idlwave-load-system-routine-info)
+	    ;;(load "idlw-rinfo" 'noerror 'nomessage)
+	    (message "Loading system routine info in idle time...done")
 	    (aset arr 0 t)
 	    (throw 'exit t))
+	  
 	  (when (not (aref arr 1))
 	    (message "Normalizing idlwave-system-routines in idle time...")
 	    (idlwave-reset-sintern t)
@@ -4540,6 +4985,7 @@
 	    (message "Normalizing idlwave-system-routines in idle time...done")
 	    (aset arr 1 t)
 	    (throw 'exit t))
+
 	  (when (not (aref arr 2))
 	    (when (and (stringp idlwave-user-catalog-file)
 		       (file-regular-p idlwave-user-catalog-file))
@@ -4554,23 +5000,25 @@
 		  (progn
 		    (setq idlwave-library-routines nil)
 		    (ding)
-		    (message "Outdated user catalog: %s... recreate"
+		    (message "Outdated user catalog: %s... recreate" 
 			     idlwave-user-catalog-file))
-		(message "Loading user catalog in idle time...done"))
-	      (aset arr 2 t)
-	      (throw 'exit t)))
+		(message "Loading user catalog in idle time...done")))
+	    (aset arr 2 t)
+	    (throw 'exit t))
+
 	  (when (not (aref arr 3))
 	    (when idlwave-user-catalog-routines
 	      (message "Normalizing user catalog routines in idle time...")
-	      (setq idlwave-user-catalog-routines
+	      (setq idlwave-user-catalog-routines 
 		    (idlwave-sintern-rinfo-list
 		     idlwave-user-catalog-routines 'sys))
-	      (message
+	      (message 
 	       "Normalizing user catalog routines in idle time...done"))
 	    (aset arr 3 t)
 	    (throw 'exit t))
+
 	  (when (not (aref arr 4))
-	    (idlwave-scan-library-catalogs
+	    (idlwave-scan-library-catalogs 
 	     "Loading and normalizing library catalogs in idle time...")
 	    (aset arr 4 t)
 	    (throw 'exit t))
@@ -4578,6 +5026,7 @@
 	    (message "Finishing initialization in idle time...")
 	    (idlwave-routines)
 	    (message "Finishing initialization in idle time...done")
+	    (aset arr 5 t)	    
 	    (throw 'exit nil)))
 	;; restart the timer
 	(if (sit-for 1)
@@ -4587,34 +5036,46 @@
 		 idlwave-init-rinfo-when-idle-after
 		 nil 'idlwave-load-rinfo-next-step))))))
 
-(defun idlwave-load-system-rinfo (&optional force)
-  ;; Load and case-treat the system and catalog files.
+(defun idlwave-load-all-rinfo (&optional force)
+  ;; Load and case-treat the system, user catalog, and library routine
+  ;; info files.
+
+  ;; System
   (when (or force (not (aref idlwave-load-rinfo-steps-done 0)))
-    (load "idlw-rinfo" 'noerror 'nomessage))
+    ;;(load "idlw-rinfo" 'noerror 'nomessage))
+    (idlwave-load-system-routine-info))
   (when (or force (not (aref idlwave-load-rinfo-steps-done 1)))
     (message "Normalizing idlwave-system-routines...")
     (setq idlwave-system-routines
 	  (idlwave-sintern-rinfo-list idlwave-system-routines 'sys))
     (message "Normalizing idlwave-system-routines...done"))
-  (setq idlwave-routines (copy-sequence idlwave-system-routines))
-  (setq idlwave-last-system-routine-info-cons-cell
-	(nthcdr (1- (length idlwave-routines)) idlwave-routines))
+  (when idlwave-system-routines
+    (setq idlwave-routines (copy-sequence idlwave-system-routines))
+    (setq idlwave-last-system-routine-info-cons-cell
+	  (nthcdr (1- (length idlwave-routines)) idlwave-routines)))
+
+  ;; User catalog
   (when (and (stringp idlwave-user-catalog-file)
 	     (file-regular-p idlwave-user-catalog-file))
     (condition-case nil
 	(when (or force (not (aref idlwave-load-rinfo-steps-done 2)))
 	  (load-file idlwave-user-catalog-file))
       (error nil))
-    (when (boundp 'idlwave-library-routines)
+    (when (and 
+	   (boundp 'idlwave-library-routines)
+	   idlwave-library-routines)
       (setq idlwave-library-routines nil)
-      (error "Outdated user catalog: %s... recreate" idlwave-user-catalog-file))
+      (error "Outdated user catalog: %s... recreate" 
+	     idlwave-user-catalog-file))
     (setq idlwave-true-path-alist nil)
     (when (or force (not (aref idlwave-load-rinfo-steps-done 3)))
       (message "Normalizing user catalog routines...")
-      (setq idlwave-user-catalog-routines
-	    (idlwave-sintern-rinfo-list
+      (setq idlwave-user-catalog-routines 
+	    (idlwave-sintern-rinfo-list 
 	     idlwave-user-catalog-routines 'sys))
       (message "Normalizing user catalog routines...done")))
+
+  ;; Library catalog
   (when (or force (not (aref idlwave-load-rinfo-steps-done 4)))
     (idlwave-scan-library-catalogs
      "Loading and normalizing library catalogs..."))
@@ -4623,11 +5084,11 @@
 
 (defun idlwave-update-buffer-routine-info ()
   (let (res)
-    (cond
+    (cond 
      ((eq idlwave-scan-all-buffers-for-routine-info t)
       ;; Scan all buffers, current buffer last
       (message "Scanning all buffers...")
-      (setq res (idlwave-get-routine-info-from-buffers
+      (setq res (idlwave-get-routine-info-from-buffers 
 		 (reverse (buffer-list)))))
      ((null idlwave-scan-all-buffers-for-routine-info)
       ;; Don't scan any buffers
@@ -4640,12 +5101,12 @@
 	    (setq res (idlwave-get-routine-info-from-buffers
 		       (list (current-buffer))))))))
     ;; Put the result into the correct variable
-    (setq idlwave-buffer-routines
+    (setq idlwave-buffer-routines 
 	  (idlwave-sintern-rinfo-list res 'set))))
 
 (defun idlwave-concatenate-rinfo-lists (&optional quiet run-hook)
   "Put the different sources for routine information together."
-  ;; The sequence here is important because earlier definitions shadow
+  ;; The sequence here is important because earlier definitions shadow 
   ;; later ones.  We assume that if things in the buffers are newer
   ;; then in the shell of the system, they are meant to be different.
   (setcdr idlwave-last-system-routine-info-cons-cell
@@ -4657,7 +5118,7 @@
 
   ;; Give a message with information about the number of routines we have.
   (unless quiet
-    (message
+    (message 
      "Routines Found: buffer(%d) compiled(%d) library(%d) user(%d) system(%d)"
      (length idlwave-buffer-routines)
      (length idlwave-compiled-routines)
@@ -4675,7 +5136,7 @@
 	  (when (and (setq class (nth 2 x))
 		     (not (assq class idlwave-class-alist)))
 	    (push (list class) idlwave-class-alist)))
-	idlwave-class-alist)))
+	idlwave-class-alist)))      
 
 ;; Three functions for the hooks
 (defun idlwave-save-buffer-update ()
@@ -4708,7 +5169,7 @@
 
 (defun idlwave-replace-buffer-routine-info (file new)
   "Cut the part from FILE out of `idlwave-buffer-routines' and add NEW."
-  (let ((list idlwave-buffer-routines)
+  (let ((list idlwave-buffer-routines) 
 	found)
     (while list
       ;; The following test uses eq to make sure it works correctly
@@ -4719,7 +5180,7 @@
 	    (setcar list nil)
 	    (setq found t))
 	(if found
-	    ;; End of that section reached. Jump.
+	    ;; End of that section reached. Jump. 
 	    (setq list nil)))
       (setq list (cdr list)))
     (setq idlwave-buffer-routines
@@ -4751,11 +5212,11 @@
       (save-restriction
 	(widen)
 	(goto-char (point-min))
-	(while (re-search-forward
+	(while (re-search-forward 
 		"^[ \t]*\\(pro\\|function\\)[ \t]" nil t)
 	  (setq string (buffer-substring-no-properties
 			(match-beginning 0)
-			(progn
+			(progn 
 			  (idlwave-end-of-statement)
 			  (point))))
 	  (setq entry (idlwave-parse-definition string))
@@ -4793,7 +5254,7 @@
 	(push (match-string 1 string) args)))
     ;; Normalize and sort.
     (setq args (nreverse args))
-    (setq keywords (sort keywords (lambda (a b)
+    (setq keywords (sort keywords (lambda (a b) 
 				    (string< (downcase a) (downcase b)))))
     ;; Make and return the entry
     ;; We don't know which argument are optional, so this information
@@ -4803,7 +5264,7 @@
 	  class
 	  (cond ((not (boundp 'idlwave-scanning-lib))
 		 (list  'buffer (buffer-file-name)))
-;		((string= (downcase
+;		((string= (downcase 
 ;			   (file-name-sans-extension
 ;			    (file-name-nondirectory (buffer-file-name))))
 ;			  (downcase name))
@@ -4811,7 +5272,7 @@
 ;		(t (cons 'lib (file-name-nondirectory (buffer-file-name))))
 		(t (list 'user (file-name-nondirectory (buffer-file-name))
 			 idlwave-scanning-lib-dir "UserLib")))
-	  (concat
+	  (concat 
 	   (if (string= type "function") "Result = " "")
 	   (if class "Obj ->[%s::]" "")
 	   "%s"
@@ -4837,7 +5298,6 @@
    (t "@@@@@@@@")))
 
 
-
 (defun idlwave-create-user-catalog-file (&optional arg)
   "Scan all files on selected dirs of IDL search path for routine information.
 
@@ -4858,10 +5318,10 @@
 	       (> (length idlwave-user-catalog-file) 0)
 	       (file-accessible-directory-p
 		(file-name-directory idlwave-user-catalog-file))
-	       (not (string= "" (file-name-nondirectory
+	       (not (string= "" (file-name-nondirectory 
 				 idlwave-user-catalog-file))))
     (error "`idlwave-user-catalog-file' does not point to a file in an accessible directory"))
-
+  
   (cond
     ;; Rescan the known directories
    ((and arg idlwave-path-alist
@@ -4871,13 +5331,13 @@
    ;; Expand the directories from library-path and run the widget
    (idlwave-library-path
     (idlwave-display-user-catalog-widget
-     (if idlwave-true-path-alist
+     (if idlwave-true-path-alist 
 	 ;; Propagate any flags on the existing path-alist
 	 (mapcar (lambda (x)
 		   (let ((path-entry (assoc (file-truename x)
 					    idlwave-true-path-alist)))
 		     (if path-entry
-			 (cons x (cdr path-entry))
+			 (cons x (cdr path-entry)) 
 		       (list x))))
 		 (idlwave-expand-path idlwave-library-path))
        (mapcar 'list (idlwave-expand-path idlwave-library-path)))))
@@ -4902,7 +5362,7 @@
     (idlwave-scan-library-catalogs "Locating library catalogs..." 'no-load)
     (idlwave-display-user-catalog-widget idlwave-path-alist)))
 
-(defconst idlwave-user-catalog-widget-help-string
+(defconst idlwave-user-catalog-widget-help-string 
   "This is the front-end to the creation of the IDLWAVE user catalog.
 Please select the directories on IDL's search path from which you
 would like to extract routine information, to be stored in the file:
@@ -4937,7 +5397,7 @@
   (make-local-variable 'idlwave-widget)
   (widget-insert (format idlwave-user-catalog-widget-help-string
 			 idlwave-user-catalog-file))
-
+  
   (widget-create 'push-button
 		 :notify 'idlwave-widget-scan-user-lib-files
 		 "Scan & Save")
@@ -4947,7 +5407,7 @@
 		 "Delete File")
   (widget-insert "  ")
   (widget-create 'push-button
-		 :notify
+		 :notify 
 		 '(lambda (&rest ignore)
 		    (let ((path-list (widget-get idlwave-widget :path-dirs)))
 		      (mapcar (lambda (x)
@@ -4958,7 +5418,7 @@
 		 "Select All Non-Lib")
   (widget-insert "  ")
   (widget-create 'push-button
-		 :notify
+		 :notify 
 		 '(lambda (&rest ignore)
 		    (let ((path-list (widget-get idlwave-widget :path-dirs)))
 		      (mapcar (lambda (x)
@@ -4974,18 +5434,18 @@
   (widget-insert "\n\n")
 
   (widget-insert "Select Directories: \n")
-
+  
   (setq idlwave-widget
 	(apply 'widget-create
 	       'checklist
-	       :value  (delq nil (mapcar (lambda (x)
-					   (if (memq 'user (cdr x))
+	       :value  (delq nil (mapcar (lambda (x) 
+					   (if (memq 'user (cdr x)) 
 					       (car x)))
 					 dirs-list))
 	       :greedy t
 	       :tag "List of directories"
-	       (mapcar (lambda (x)
-			 (list 'item
+	       (mapcar (lambda (x) 
+			 (list 'item 
 			       (if (memq 'lib (cdr x))
 				   (concat "[LIB] " (car x) )
 				 (car x)))) dirs-list)))
@@ -4995,7 +5455,7 @@
   (widget-setup)
   (goto-char (point-min))
   (delete-other-windows))
-
+  
 (defun idlwave-delete-user-catalog-file (&rest ignore)
   (if (yes-or-no-p
        (format "Delete file %s " idlwave-user-catalog-file))
@@ -5011,7 +5471,7 @@
 	 (this-path-alist path-alist)
 	 dir-entry)
     (while (setq dir-entry (pop this-path-alist))
-      (if (member
+      (if (member 
 	   (if (memq 'lib (cdr dir-entry))
 	       (concat "[LIB] " (car dir-entry))
 	     (car dir-entry))
@@ -5108,7 +5568,7 @@
     ;; Define the variable which knows the value of "!DIR"
     (insert (format "\n(setq idlwave-system-directory \"%s\")\n"
 		    idlwave-system-directory))
-
+  
     ;; Define the variable which contains a list of all scanned directories
     (insert "\n(setq idlwave-path-alist\n    '(")
     (let ((standard-output (current-buffer)))
@@ -5148,7 +5608,7 @@
       (when (file-directory-p dir)
 	(setq files (nreverse (directory-files dir t "[^.]")))
 	(while (setq file (pop files))
-	  (if (file-directory-p file)
+	  (if (file-directory-p file) 
 	      (push (file-name-as-directory file) path)))
 	(push dir path1)))
     path1))
@@ -5160,7 +5620,7 @@
 
 
 (defun idlwave-scan-library-catalogs (&optional message-base no-load)
-  "Scan for library catalog files (.idlwave_catalog) and ingest.
+  "Scan for library catalog files (.idlwave_catalog) and ingest.  
 
 All directories on `idlwave-path-alist' (or `idlwave-library-path'
 instead, if present) are searched.  Print MESSAGE-BASE along with the
@@ -5168,7 +5628,7 @@
 NO-LOAD is non-nil.  The variable `idlwave-use-library-catalogs' can
 be set to nil to disable library catalog scanning."
   (when idlwave-use-library-catalogs
-    (let ((dirs
+    (let ((dirs 
 	   (if idlwave-library-path
 	       (idlwave-expand-path idlwave-library-path)
 	     (mapcar 'car idlwave-path-alist)))
@@ -5177,7 +5637,7 @@
       (if message-base (message message-base))
       (while (setq dir (pop dirs))
 	(catch 'continue
-	  (when (file-readable-p
+	  (when (file-readable-p 
 		 (setq catalog (expand-file-name ".idlwave_catalog" dir)))
 	    (unless no-load
 	      (setq idlwave-library-catalog-routines nil)
@@ -5185,20 +5645,20 @@
 	      (condition-case nil
 		  (load catalog t t t)
 		(error (throw 'continue t)))
-	      (when (and
-		     message-base
-		     (not (string= idlwave-library-catalog-libname
+	      (when (and 
+		     message-base 
+		     (not (string= idlwave-library-catalog-libname 
 				   old-libname)))
-		(message "%s" (concat message-base
-				 idlwave-library-catalog-libname))
+		(message "%s" (concat message-base 
+				      idlwave-library-catalog-libname))
 		(setq old-libname idlwave-library-catalog-libname))
 	      (when idlwave-library-catalog-routines
 		(setq all-routines
-		      (append
+		      (append 
 		       (idlwave-sintern-rinfo-list
 			idlwave-library-catalog-routines 'sys dir)
 		       all-routines))))
-
+	    
 	    ;;  Add a 'lib flag if on path-alist
 	    (when (and idlwave-path-alist
 		       (setq dir-entry (assoc dir idlwave-path-alist)))
@@ -5209,17 +5669,28 @@
 ;;----- Communicating with the Shell -------------------
 
 ;; First, here is the idl program which can be used to query IDL for
-;; defined routines.
+;; defined routines. 
 (defconst idlwave-routine-info.pro
   "
 ;; START OF IDLWAVE SUPPORT ROUTINES
+pro idlwave_print_safe,item,limit
+  catch,err
+  if err ne 0 then begin
+     print,'Could not print item.'
+     return
+  endif
+  if n_elements(item) gt limit then $
+     print,item[0:limit-1],'<... truncated at ',strtrim(limit,2),' elements>' $
+  else print,item
+end
+
 pro idlwave_print_info_entry,name,func=func,separator=sep
   ;; See if it's an object method
   if name eq '' then return
-  func    = keyword_set(func)
+  func    = keyword_set(func) 
   methsep = strpos(name,'::')
   meth    = methsep ne -1
-
+  
   ;; Get routine info
   pars   = routine_info(name,/parameters,functions=func)
   source = routine_info(name,/source,functions=func)
@@ -5227,12 +5698,12 @@
   nkw    = pars.num_kw_args
   if nargs gt 0 then args = pars.args
   if nkw   gt 0 then kwargs = pars.kw_args
-
+  
   ;; Trim the class, and make the name
-  if meth then begin
+  if meth then begin 
       class = strmid(name,0,methsep)
       name  = strmid(name,methsep+2,strlen(name)-1)
-      if nargs gt 0 then begin
+      if nargs gt 0 then begin 
           ;; remove the self argument
           wh = where(args ne 'SELF',nargs)
           if nargs gt 0 then args = args[wh]
@@ -5241,7 +5712,7 @@
       ;; No class, just a normal routine.
       class = \"\"
   endelse
-
+   
   ;; Calling sequence
   cs = \"\"
   if func then cs = 'Result = '
@@ -5262,23 +5733,33 @@
           kwstring = kwstring + ' ' + kwargs[j]
       endfor
   endif
-
+  
   ret=(['IDLWAVE-PRO','IDLWAVE-FUN'])[func]
-
+  
   print,ret + ': ' + name + sep + class + sep + source[0].path  $
     + sep + cs + sep + kwstring
 end
 
-pro idlwave_routine_info
+pro idlwave_routine_info,file
   on_error,1
   sep = '<@>'
   print,'>>>BEGIN OF IDLWAVE ROUTINE INFO (\"' + sep + '\" IS THE SEPARATOR)'
   all = routine_info()
-  for i=0,n_elements(all)-1 do $
-    idlwave_print_info_entry,all[i],separator=sep
+  fileQ=n_elements(file) ne 0
+  if fileQ then file=strtrim(file,2)
+  for i=0L,n_elements(all)-1L do begin 
+     if fileQ then begin 
+        if (routine_info(all[i],/SOURCE)).path eq file then $
+           idlwave_print_info_entry,all[i],separator=sep
+     endif else idlwave_print_info_entry,all[i],separator=sep
+  endfor 
   all = routine_info(/functions)
-  for i=0,n_elements(all)-1 do $
-    idlwave_print_info_entry,all[i],/func,separator=sep
+  for i=0L,n_elements(all)-1L do begin 
+     if fileQ then begin 
+        if (routine_info(all[i],/FUNCTIONS,/SOURCE)).path eq file then $
+           idlwave_print_info_entry,all[i],separator=sep,/FUNC
+     endif else idlwave_print_info_entry,all[i],separator=sep,/FUNC
+  endfor 
   print,'>>>END OF IDLWAVE ROUTINE INFO'
 end
 
@@ -5291,7 +5772,7 @@
       help,/brief,output=s,/system_variables  ; ? unsafe use of OUTPUT=
       s = strtrim(strjoin(s,' ',/single),2)   ; make one line
       v = strsplit(s,' +',/regex,/extract)    ; get variables
-      for i=0,n_elements(v)-1 do begin
+      for i=0L,n_elements(v)-1 do begin
           t = ['']                            ; get tag list
           a=execute('if n_tags('+v[i]+') gt 0 then t=tag_names('+v[i]+')')
           print, 'IDLWAVE-SYSVAR: '+v[i]+' '+strjoin(t,' ',/single)
@@ -5304,7 +5785,7 @@
   if res then print,'IDLWAVE-CLASS-TAGS: '+class+' '+strjoin(tags,' ',/single)
 end
 ;; END OF IDLWAVE SUPPORT ROUTINES
-"
+" 
   "The idl programs to get info from the shell.")
 
 (defvar idlwave-idlwave_routine_info-compiled nil
@@ -5312,13 +5793,8 @@
 
 (defvar idlwave-shell-temp-pro-file)
 (defvar idlwave-shell-temp-rinfo-save-file)
-(defun idlwave-shell-update-routine-info (&optional quiet run-hooks wait)
-  "Query the shell for routine_info of compiled modules and update the lists."
-  ;; Save and compile the procedure.  The compiled procedure is then
-  ;; saved into an IDL SAVE file, to allow for fast RESTORE.
-  ;; We need to RESTORE the procedure each time we use it, since
-  ;; the user may have killed or redefined it.  In particular,
-  ;; .RESET_SESSION will kill all user procedures.
+
+(defun idlwave-shell-compile-helper-routines (&optional wait)
   (unless (and idlwave-idlwave_routine_info-compiled
 	       (file-readable-p (idlwave-shell-temp-file 'rinfo)))
     (save-excursion
@@ -5327,20 +5803,37 @@
       (erase-buffer)
       (insert idlwave-routine-info.pro)
       (save-buffer 0))
-    (idlwave-shell-send-command
-     (concat ".run " idlwave-shell-temp-pro-file)
+    (idlwave-shell-send-command 
+     (concat ".run \"" idlwave-shell-temp-pro-file "\"")
      nil 'hide wait)
-;    (message "SENDING SAVE") ; ????????????????????????
     (idlwave-shell-send-command
-     (format "save,'idlwave_routine_info','idlwave_print_info_entry','idlwave_get_class_tags','idlwave_get_sysvars',FILE='%s',/ROUTINES"
+     (format "save,'idlwave_print_safe','idlwave_routine_info','idlwave_print_info_entry','idlwave_get_class_tags','idlwave_get_sysvars',FILE='%s',/ROUTINES" 
 	     (idlwave-shell-temp-file 'rinfo))
-     nil 'hide wait))
-
-  ;; Restore and execute the procedure, analyze the output
-;  (message "SENDING RESTORE & EXECUTE") ; ????????????????????????
+     nil 'hide)
+    (setq idlwave-idlwave_routine_info-compiled t))
+
+  ;; Restore if necessary.  Must use execute to hide lame routine_info
+  ;; errors on undefinded routine
   (idlwave-shell-send-command
-   (format "RESTORE, '%s' & idlwave_routine_info"
+   (format "if execute(\"_v=routine_info('idlwave_routine_info',/SOURCE)\") eq 0 then restore,'%s' else if _v.path eq '' then restore,'%s'"
+	   idlwave-shell-temp-rinfo-save-file
 	   idlwave-shell-temp-rinfo-save-file)
+   nil 'hide))
+
+
+(defun idlwave-shell-update-routine-info (&optional quiet run-hooks wait file)
+  "Query the shell for routine_info of compiled modules and update the lists."
+  ;; Save and compile the procedure.  The compiled procedure is then
+  ;; saved into an IDL SAVE file, to allow for fast RESTORE.  We may
+  ;; need to test for and possibly RESTORE the procedure each time we
+  ;; use it, since the user may have killed or redefined it.  In
+  ;; particular, .RESET_SESSION will kill all user procedures.  If
+  ;; FILE is set, only update routine info for routines in that file.
+
+  (idlwave-shell-compile-helper-routines wait)
+  ; execute the routine_info procedure, and analyze the output
+  (idlwave-shell-send-command
+   (format "idlwave_routine_info%s" (if file (concat ",'" file "'") ""))
    `(progn
       (idlwave-shell-routine-info-filter)
       (idlwave-concatenate-rinfo-lists ,quiet ,run-hooks))
@@ -5415,7 +5908,7 @@
 	 (completion-regexp-list
 	  (if (equal arg '(16))
 	      (list (read-string (concat "Completion Regexp: "))))))
-
+    
     (if (and module (string-match "::" module))
 	(setq class (substring module 0 (match-beginning 0))
 	      module (substring module (match-end 0))))
@@ -5436,7 +5929,7 @@
      ;; Check for any special completion functions
      ((and idlwave-complete-special
 	   (idlwave-call-special idlwave-complete-special)))
-
+     
      ((null what)
       (error "Nothing to complete here"))
 
@@ -5453,7 +5946,7 @@
 			      (idlwave-all-class-inherits class-selector)))
 	     (isa (concat "procedure" (if class-selector "-method" "")))
 	     (type-selector 'pro))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'routine nil type-selector class-selector nil super-classes))
 	(idlwave-complete-in-buffer
 	 'procedure (if class-selector 'method 'routine)
@@ -5461,8 +5954,8 @@
 	 (format "Select a %s name%s"
 		 isa
 		 (if class-selector
-		     (format " (class is %s)"
-			     (if (eq class-selector t)
+		     (format " (class is %s)" 
+			     (if (eq class-selector t) 
 				 "unknown" class-selector))
 		   ""))
 	 isa
@@ -5476,7 +5969,7 @@
 			      (idlwave-all-class-inherits class-selector)))
 	     (isa (concat "function" (if class-selector "-method" "")))
 	     (type-selector 'fun))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'routine nil type-selector class-selector nil super-classes))
 	(idlwave-complete-in-buffer
 	 'function (if class-selector 'method 'routine)
@@ -5484,7 +5977,7 @@
 	 (format "Select a %s name%s"
 		 isa
 		 (if class-selector
-		     (format " (class is %s)"
+		     (format " (class is %s)" 
 			     (if (eq class-selector t)
 				 "unknown" class-selector))
 		   ""))
@@ -5512,18 +6005,18 @@
 	(unless (or entry (eq class t))
 	  (error "Nothing known about procedure %s"
 		 (idlwave-make-full-name class name)))
-	(setq list (idlwave-fix-keywords name 'pro class list
+	(setq list (idlwave-fix-keywords name 'pro class list 
 					 super-classes system))
 	(unless list (error "No keywords available for procedure %s"
 			    (idlwave-make-full-name class name)))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'keyword name type-selector class-selector entry super-classes))
 	(idlwave-complete-in-buffer
 	 'keyword 'keyword list nil
 	 (format "Select keyword for procedure %s%s"
 		 (idlwave-make-full-name class name)
 		 (if (or (member '("_EXTRA") list)
-			 (member '("_REF_EXTRA") list))
+			 (member '("_REF_EXTRA") list))			 
 		     " (note _EXTRA)" ""))
 	 isa
 	 'idlwave-attach-keyword-classes)))
@@ -5546,7 +6039,7 @@
 	(unless (or entry (eq class t))
 	  (error "Nothing known about function %s"
 		 (idlwave-make-full-name class name)))
-	(setq list (idlwave-fix-keywords name 'fun class list
+	(setq list (idlwave-fix-keywords name 'fun class list 
 					 super-classes system))
 	;; OBJ_NEW: Messages mention the proper Init method
 	(setq msg-name (if (and (null class)
@@ -5556,13 +6049,13 @@
 			 (idlwave-make-full-name class name)))
 	(unless list (error "No keywords available for function %s"
 			    msg-name))
-	(setq idlwave-completion-help-info
+	(setq idlwave-completion-help-info 
 	      (list 'keyword name type-selector class-selector nil super-classes))
 	(idlwave-complete-in-buffer
 	 'keyword 'keyword list nil
 	 (format "Select keyword for function %s%s" msg-name
 		 (if (or (member '("_EXTRA") list)
-			 (member '("_REF_EXTRA") list))
+			 (member '("_REF_EXTRA") list))			 
 		     " (note _EXTRA)" ""))
 	 isa
 	 'idlwave-attach-keyword-classes)))
@@ -5600,10 +6093,10 @@
 		      ("class")))
 	 (module (idlwave-sintern-routine-or-method module class))
 	 (class (idlwave-sintern-class class))
-	 (what (cond
+	 (what (cond 
 		((equal what 0)
 		 (setq what
-		       (intern (completing-read
+		       (intern (completing-read 
 				"Complete what? " what-list nil t))))
 		((integerp what)
 		 (setq what (intern (car (nth (1- what) what-list)))))
@@ -5625,7 +6118,7 @@
 	     (super-classes nil)
 	     (type-selector 'pro)
 	     (pro (or module
-		      (idlwave-completing-read
+		      (idlwave-completing-read 
 		       "Procedure: " (idlwave-routines) 'idlwave-selector))))
 	(setq pro (idlwave-sintern-routine pro))
 	(list nil-list nil-list 'procedure-keyword
@@ -5639,7 +6132,7 @@
 	     (super-classes nil)
 	     (type-selector 'fun)
 	     (func (or module
-		       (idlwave-completing-read
+		       (idlwave-completing-read 
 			"Function: " (idlwave-routines) 'idlwave-selector))))
 	(setq func (idlwave-sintern-routine func))
 	(list nil-list nil-list 'function-keyword
@@ -5679,7 +6172,7 @@
 
      ((eq what 'class)
       (list nil-list nil-list 'class nil-list nil))
-
+     
      (t (error "Invalid value for WHAT")))))
 
 (defun idlwave-completing-read (&rest args)
@@ -5702,7 +6195,7 @@
 		    (stringp idlwave-shell-default-directory)
 		    (file-directory-p idlwave-shell-default-directory))
 	       idlwave-shell-default-directory
-	     default-directory)))
+	     default-directory)))	   
     (comint-dynamic-complete-filename)))
 
 (defun idlwave-make-full-name (class name)
@@ -5711,7 +6204,7 @@
 
 (defun idlwave-rinfo-assoc (name type class list)
   "Like `idlwave-rinfo-assq', but sintern strings first."
-  (idlwave-rinfo-assq
+  (idlwave-rinfo-assq 
    (idlwave-sintern-routine-or-method name class)
    type (idlwave-sintern-class class) list))
 
@@ -5735,7 +6228,7 @@
 	  (setq classes nil)))
     rtn))
 
-(defun idlwave-best-rinfo-assq (name type class list &optional with-file
+(defun idlwave-best-rinfo-assq (name type class list &optional with-file 
 				     keep-system)
   "Like `idlwave-rinfo-assq', but get all twins and sort, then return first.
 If WITH-FILE is passed, find the best rinfo entry with a file
@@ -5760,7 +6253,7 @@
 				    twins)))))
     (car twins)))
 
-(defun idlwave-best-rinfo-assoc (name type class list &optional with-file
+(defun idlwave-best-rinfo-assoc (name type class list &optional with-file 
 				     keep-system)
   "Like `idlwave-best-rinfo-assq', but sintern strings first."
   (idlwave-best-rinfo-assq
@@ -5851,7 +6344,7 @@
 Must accept two arguments: `apos' and `info'")
 
 (defun idlwave-determine-class (info type)
-  ;; Determine the class of a routine call.
+  ;; Determine the class of a routine call.  
   ;; INFO is the `cw-list' structure as returned by idlwave-where.
   ;; The second element in this structure is the class.  When nil, we
   ;; return nil.  When t, try to get the class from text properties at
@@ -5871,7 +6364,7 @@
 		      (dassoc (cdr dassoc))
 		      (t t)))
 	 (arrow (and apos (string= (buffer-substring apos (+ 2 apos)) "->")))
-	 (is-self
+	 (is-self 
 	  (and arrow
 	       (save-excursion (goto-char apos)
 			       (forward-word -1)
@@ -5892,19 +6385,19 @@
 	  (setq class (or (nth 2 (idlwave-current-routine)) class)))
 
       ;; Before prompting, try any special class determination routines
-      (when (and (eq t class)
+      (when (and (eq t class) 
 		 idlwave-determine-class-special
 		 (not force-query))
-	(setq special-class
+	(setq special-class 
 	      (idlwave-call-special idlwave-determine-class-special apos))
-	(if special-class
+	(if special-class 
 	    (setq class (idlwave-sintern-class special-class)
 		  store idlwave-store-inquired-class)))
-
+      
       ;; Prompt for a class, if we need to
       (when (and (eq class t)
 		 (or force-query query))
-	(setq class-alist
+	(setq class-alist 
 	      (mapcar 'list (idlwave-all-method-classes (car info) type)))
 	(setq class
 	      (idlwave-sintern-class
@@ -5913,9 +6406,9 @@
 		 (error "No classes available with method %s" (car info)))
 		((and (= (length class-alist) 1) (not force-query))
 		 (car (car class-alist)))
-		(t
+		(t 
 		 (setq store idlwave-store-inquired-class)
-		 (idlwave-completing-read
+		 (idlwave-completing-read 
 		  (format "Class%s: " (if (stringp (car info))
 					  (format " for %s method %s"
 						  type (car info))
@@ -5927,9 +6420,9 @@
 	;; We have a real class here
 	(when (and store arrow)
 	  (condition-case ()
-	      (add-text-properties
-	       apos (+ apos 2)
-	       `(idlwave-class ,class face ,idlwave-class-arrow-face
+	      (add-text-properties 
+	       apos (+ apos 2) 
+	       `(idlwave-class ,class face ,idlwave-class-arrow-face 
 			       rear-nonsticky t))
 	    (error nil)))
 	(setf (nth 2 info) class))
@@ -5957,14 +6450,14 @@
 
 
 (defun idlwave-where ()
-  "Find out where we are.
+  "Find out where we are. 
 The return value is a list with the following stuff:
 \(PRO-LIST FUNC-LIST COMPLETE-WHAT CW-LIST LAST-CHAR)
 
 PRO-LIST       (PRO POINT CLASS ARROW)
 FUNC-LIST      (FUNC POINT CLASS ARROW)
 COMPLETE-WHAT  a symbol indicating what kind of completion makes sense here
-CW-LIST        (PRO-OR-FUNC POINT CLASS ARROW)  Like PRO-LIST, for what can
+CW-LIST        (PRO-OR-FUNC POINT CLASS ARROW)  Like PRO-LIST, for what can 
                be completed here.
 LAST-CHAR      last relevant character before point (non-white non-comment,
                not part of current identifier or leading slash).
@@ -5976,7 +6469,7 @@
 CLASS:  What class has the routine (nil=no, t=is method, but class unknown)
 ARROW:  Location of the arrow"
   (idlwave-routines)
-  (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point)))
+  (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point))) 
          (bos (save-excursion (idlwave-start-of-substatement 'pre) (point)))
  	 (func-entry (idlwave-what-function bos))
          (func (car func-entry))
@@ -5998,8 +6491,8 @@
      ((string-match "\\`[ \t]*\\(pro\\|function\\)[ \t]+[a-zA-Z0-9_]*\\'"
                     match-string)
       (setq cw 'class))
-     ((string-match
-       "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)?\\'"
+     ((string-match 
+       "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)?\\'" 
        (if (> pro-point 0)
 	   (buffer-substring pro-point (point))
 	 match-string))
@@ -6010,11 +6503,11 @@
       nil)
      ((string-match "OBJ_NEW([ \t]*['\"]\\([a-zA-Z0-9$_]*\\)?\\'"
 		    match-string)
-      (setq cw 'class))
+      (setq cw 'class))                    
      ((string-match "\\<inherits\\s-+\\([a-zA-Z0-9$_]*\\)?\\'"
 		    match-string)
-      (setq cw 'class))
-     ((and func
+      (setq cw 'class))                    
+     ((and func 
 	   (> func-point pro-point)
 	   (= func-level 1)
 	   (memq last-char '(?\( ?,)))
@@ -6060,7 +6553,7 @@
   ;;    searches to this point.
 
   (catch 'exit
-    (let (pos
+    (let (pos 
 	  func-point
 	  (cnt 0)
 	  func arrow-start class)
@@ -6075,18 +6568,18 @@
 	     (setq pos (point))
 	     (incf cnt)
 	     (when (and (= (following-char) ?\()
-			(re-search-backward
+			(re-search-backward 
 			 "\\(::\\|\\<\\)\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\="
 			 bound t))
 	       (setq func (match-string 2)
 		     func-point (goto-char (match-beginning 2))
 		     pos func-point)
-	       (if (re-search-backward
+	       (if (re-search-backward 
 		    "->[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\=" bound t)
 		   (setq arrow-start (copy-marker (match-beginning 0))
 			 class (or (match-string 2) t)))
-	       (throw
-		'exit
+	       (throw 
+		'exit 
 		(list
 		 (idlwave-sintern-routine-or-method func class)
 		 (idlwave-sintern-class class)
@@ -6102,18 +6595,18 @@
   ;;    searches to this point.
   (let ((pos (point)) pro-point
 	pro class arrow-start string)
-    (save-excursion
+    (save-excursion 
       ;;(idlwave-beginning-of-statement)
       (idlwave-start-of-substatement 'pre)
       (setq string (buffer-substring (point) pos))
-      (if (string-match
+      (if (string-match 
 	   "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\(,\\|\\'\\)" string)
 	  (setq pro (match-string 1 string)
 		pro-point (+ (point) (match-beginning 1)))
 	(if (and (idlwave-skip-object)
 		 (setq string (buffer-substring (point) pos))
-		 (string-match
-		  "\\`[ \t]*\\(->\\)[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\([a-zA-Z][a-zA-Z0-9$_]*\\)?[ \t]*\\(,\\|\\(\\$\\s *\\(;.*\\)?\\)?$\\)"
+		 (string-match 
+		  "\\`[ \t]*\\(->\\)[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\([a-zA-Z][a-zA-Z0-9$_]*\\)?[ \t]*\\(,\\|\\(\\$\\s *\\(;.*\\)?\\)?$\\)" 
 		  string))
 	    (setq pro (if (match-beginning 4)
 			  (match-string 4 string))
@@ -6157,7 +6650,7 @@
 	      (throw 'exit nil))))
 	(goto-char pos)
       nil)))
-
+  
 (defun idlwave-last-valid-char ()
   "Return the last character before point which is not white or a comment
 and also not part of the current identifier.  Since we do this in
@@ -6247,23 +6740,23 @@
      ((or (eq completion t)
 	  (and (= 1 (length (setq all-completions
 				  (idlwave-uniquify
-				   (all-completions part list
-						    (or special-selector
+				   (all-completions part list 
+						    (or special-selector 
 							selector))))))
 	       (equal dpart dcompletion)))
       ;; This is already complete
       (idlwave-after-successful-completion type slash beg)
       (message "%s is already the complete %s" part isa)
       nil)
-     (t
+     (t        
       ;; We cannot add something - offer a list.
       (message "Making completion list...")
-
+      
       (unless idlwave-completion-help-links ; already set somewhere?
 	(mapcar (lambda (x)  ; Pass link prop through to highlight-linked
 		  (let ((link (get-text-property 0 'link (car x))))
 		    (if link
-			(push (cons (car x) link)
+			(push (cons (car x) link) 
 			      idlwave-completion-help-links))))
 		list))
       (let* ((list all-completions)
@@ -6273,7 +6766,7 @@
 ;	     (completion-fixup-function               ; Emacs
 ;	      (lambda () (and (eq (preceding-char) ?>)
 ;			      (re-search-backward " <" beg t)))))
-
+	     
 	(setq list (sort list (lambda (a b)
 				(string< (downcase a) (downcase b)))))
 	(if prepare-display-function
@@ -6283,7 +6776,7 @@
 		     idlwave-complete-empty-string-as-lower-case)
 		 (not idlwave-completion-force-default-case))
 	    (setq list (mapcar (lambda (x)
-				 (if (listp x)
+				 (if (listp x) 
 				     (setcar x (downcase (car x)))
 				   (setq x (downcase x)))
 				 x)
@@ -6303,19 +6796,19 @@
 	   (re-search-backward "\\<\\(pro\\|function\\)[ \t]+\\="
 			       (- (point) 15) t)
 	   (goto-char (point-min))
-	   (re-search-forward
+	   (re-search-forward 
 	    "^[ \t]*\\(pro\\|function\\)[ \t]+\\([a-zA-Z0-9_]+::\\)" nil t))))
       ;; Yank the full class specification
       (insert (match-string 2))
     ;; Do the completion, using list gathered from `idlwave-routines'
-    (idlwave-complete-in-buffer
-     'class 'class (idlwave-class-alist) nil
+    (idlwave-complete-in-buffer 
+     'class 'class (idlwave-class-alist) nil 
      "Select a class" "class"
      '(lambda (list)  ;; Push it to help-links if system help available
 	(mapcar (lambda (x)
 		  (let* ((entry (idlwave-class-info x))
 			 (link (nth 1 (assq 'link entry))))
-		    (if link (push (cons x link)
+		    (if link (push (cons x link) 
 				   idlwave-completion-help-links))
 		    x))
 		list)))))
@@ -6327,7 +6820,7 @@
   ;; SHOW-CLASSES is the value of `idlwave-completion-show-classes'.
   (if (or (null show-classes)           ; don't want to see classes
 	  (null class-selector)         ; not a method call
-	  (and
+	  (and 
 	   (stringp class-selector) ; the class is already known
 	   (not super-classes)))    ; no possibilities for inheritance
       ;; In these cases, we do not have to do anything
@@ -6342,13 +6835,13 @@
 	   (max (abs show-classes))
 	   (lmax (if do-dots (apply 'max (mapcar 'length list))))
 	  classes nclasses class-info space)
-      (mapcar
+      (mapcar 
        (lambda (x)
 	 ;; get the classes
 	 (if (eq type 'class-tag)
 	     ;; Just one class for tags
 	     (setq classes
-		   (list
+		   (list 
 		    (idlwave-class-or-superclass-with-tag class-selector x)))
 	   ;; Multiple classes for method or method-keyword
 	   (setq classes
@@ -6357,7 +6850,7 @@
 		      method-selector x type-selector)
 		   (idlwave-all-method-classes x type-selector)))
 	   (if inherit
-	       (setq classes
+	       (setq classes 
 		     (delq nil
 			   (mapcar (lambda (x) (if (memq x inherit) x nil))
 				   classes)))))
@@ -6394,7 +6887,7 @@
 (defun idlwave-attach-class-tag-classes (list)
   ;; Call idlwave-attach-classes with class structure tags
   (idlwave-attach-classes list 'class-tag idlwave-completion-show-classes))
-
+					
 
 ;;----------------------------------------------------------------------
 ;;----------------------------------------------------------------------
@@ -6415,7 +6908,7 @@
 	  ((= 1 (length list))
 	   (setq rtn (car list)))
 	  ((featurep 'xemacs)
-	   (if sort (setq list (sort list (lambda (a b)
+	   (if sort (setq list (sort list (lambda (a b) 
 					    (string< (upcase a) (upcase b))))))
 	   (setq menu
 		 (append (list title)
@@ -6426,7 +6919,7 @@
 	   (setq resp (get-popup-menu-response menu))
 	   (funcall (event-function resp) (event-object resp)))
 	  (t
-	   (if sort (setq list (sort list (lambda (a b)
+	   (if sort (setq list (sort list (lambda (a b) 
 					    (string< (upcase a) (upcase b))))))
 	   (setq menu (cons title
 			    (list
@@ -6517,7 +7010,7 @@
     (setq idlwave-before-completion-wconf (current-window-configuration)))
 
   (if (featurep 'xemacs)
-      (idlwave-display-completion-list-xemacs
+      (idlwave-display-completion-list-xemacs 
        list)
     (idlwave-display-completion-list-emacs list))
 
@@ -6598,7 +7091,7 @@
             (mapcar (lambda(x)
                       (princ (nth 1 x))
                       (princ "\n"))
-                    keys-alist))
+                    keys-alist))            
           (setq char (read-char)))
       (setq char (read-char)))
     (message nil)
@@ -6718,7 +7211,7 @@
 (defun idlwave-make-modified-completion-map-emacs (old-map)
   "Replace `choose-completion' and `mouse-choose-completion' in OLD-MAP."
   (let ((new-map (copy-keymap old-map)))
-    (substitute-key-definition
+    (substitute-key-definition 
      'choose-completion 'idlwave-choose-completion new-map)
     (substitute-key-definition
      'mouse-choose-completion 'idlwave-mouse-choose-completion new-map)
@@ -6744,8 +7237,8 @@
 ;;
 ;; - Go again over the documentation how to write a completion
 ;;   plugin.  It is in self.el, but currently still very bad.
-;;   This could be in a separate file in the distribution, or
-;;   in an appendix for the manual.
+;;   This could be in a separate file in the distribution, or 
+;;   in an appendix for the manual.  
 
 (defvar idlwave-struct-skip
   "[ \t]*\\(\\$.*\n\\(^[ \t]*\\(\\$[ \t]*\\)?\\(;.*\\)?\n\\)*\\)?[ \t]*"
@@ -6784,7 +7277,7 @@
 	 (beg (car borders))
 	 (end (cdr borders))
 	 (case-fold-search t))
-    (re-search-forward (concat "\\(^[ \t]*\\|[,{][ \t]*\\)" tag "[ \t]*:")
+    (re-search-forward (concat "\\(^[ \t]*\\|[,{][ \t]*\\)" tag "[ \t]*:") 
 		       end t)))
 
 (defun idlwave-struct-inherits ()
@@ -6799,7 +7292,7 @@
       (goto-char beg)
       (save-restriction
 	(narrow-to-region beg end)
-	(while (re-search-forward
+	(while (re-search-forward 
 		(concat "[{,]"  ;leading comma/brace
 			idlwave-struct-skip ; 4 groups
 			"inherits"    ; The INHERITS tag
@@ -6849,9 +7342,9 @@
 		  (concat "\\<" (regexp-quote (downcase var)) "\\>" ws)
 		"\\(\\)")
 	      "=" ws "\\({\\)"
-	      (if name
+	      (if name 
 		  (if (stringp name)
-		      (concat ws "\\(\\<" (downcase name) "\\)[^a-zA-Z0-9_$]")
+		      (concat ws "\\(\\<" (downcase name) "\\)[^a-zA-Z0-9_$]") 
 		    ;; Just a generic name
 		    (concat ws "\\<\\([a-zA-Z_0-9$]+\\)" ws ","))
 		""))))
@@ -6862,8 +7355,7 @@
 	  (goto-char (match-beginning 3))
 	  (match-string-no-properties 5)))))
 
-(defvar idlwave-class-info nil)
-(defvar idlwave-system-class-info nil) ; Gathered from idlw-rinfo
+(defvar idlwave-class-info nil) 
 (defvar idlwave-class-reset nil) ; to reset buffer-local classes
 
 (add-hook 'idlwave-update-rinfo-hook
@@ -6875,13 +7367,13 @@
   (let (list entry)
     (if idlwave-class-info
 	(if idlwave-class-reset
-	    (setq
+	    (setq 	    
 	     idlwave-class-reset nil
 	     idlwave-class-info ; Remove any visited in a buffer
-	     (delq nil (mapcar
-			(lambda (x)
-			  (let ((filebuf
-				 (idlwave-class-file-or-buffer
+	     (delq nil (mapcar 
+			(lambda (x) 
+			  (let ((filebuf 
+				 (idlwave-class-file-or-buffer 
 				  (or (cdr (assq 'found-in x)) (car x)))))
 			    (if (cdr filebuf)
 				nil
@@ -6919,7 +7411,7 @@
 	  (progn
 	    ;; For everything there
 	    (setq end-lim (save-excursion (idlwave-end-of-subprogram) (point)))
-	    (while (setq name
+	    (while (setq name 
 			 (idlwave-find-structure-definition nil t end-lim))
 	      (funcall all-hook name)))
 	(idlwave-find-structure-definition nil (or alt-class class))))))
@@ -6957,11 +7449,11 @@
 	  (insert-file-contents file))
 	(save-excursion
 	  (goto-char 1)
-	  (idlwave-find-class-definition class
+	  (idlwave-find-class-definition class 
 	   ;; Scan all of the structures found there
 	   (lambda (name)
 	     (let* ((this-class (idlwave-sintern-class name))
-		    (entry
+		    (entry 
 		     (list this-class
 			   (cons 'tags (idlwave-struct-tags))
 			   (cons 'inherits (idlwave-struct-inherits)))))
@@ -6986,7 +7478,7 @@
   (condition-case err
       (apply 'append (mapcar 'idlwave-class-tags
 			     (cons class (idlwave-all-class-inherits class))))
-    (error
+    (error           
      (idlwave-class-tag-reset)
      (error "%s" (error-message-string err)))))
 
@@ -7023,24 +7515,24 @@
 	  all-inherits))))))
 
 (defun idlwave-entry-keywords (entry &optional record-link)
-  "Return the flat entry keywords alist from routine-info entry.
+  "Return the flat entry keywords alist from routine-info entry.  
 If RECORD-LINK is non-nil, the keyword text is copied and a text
 property indicating the link is added."
   (let (kwds)
     (mapcar
-     (lambda (key-list)
+     (lambda (key-list) 
        (let ((file (car key-list)))
 	 (mapcar (lambda (key-cons)
 		   (let ((key (car key-cons))
 			 (link (cdr key-cons)))
 		     (when (and record-link file)
 			 (setq key (copy-sequence key))
-			 (put-text-property
+			 (put-text-property 
 			  0 (length key)
-			  'link
-			  (concat
-			   file
-			   (if link
+			  'link 
+			  (concat 
+			   file 
+			   (if link 
 			       (concat idlwave-html-link-sep
 				       (number-to-string link))))
 			  key))
@@ -7053,13 +7545,13 @@
   "Find keyword KEYWORD in entry ENTRY, and return (with link) if set"
   (catch 'exit
     (mapc
-     (lambda (key-list)
+     (lambda (key-list) 
        (let ((file (car key-list))
 	     (kwd (assoc keyword (cdr key-list))))
 	 (when kwd
-	   (setq kwd (cons (car kwd)
+	   (setq kwd (cons (car kwd) 
 			   (if (and file (cdr kwd))
-			       (concat file
+			       (concat file 
 				       idlwave-html-link-sep
 				       (number-to-string (cdr kwd)))
 			     (cdr kwd))))
@@ -7097,14 +7589,14 @@
 	  ;; Check if we need to update the "current" class
 	  (if (not (equal class-selector idlwave-current-tags-class))
 	      (idlwave-prepare-class-tag-completion class-selector))
-	  (setq idlwave-completion-help-info
+	  (setq idlwave-completion-help-info 
 		(list 'idlwave-complete-class-structure-tag-help
-		      (idlwave-sintern-routine
+		      (idlwave-sintern-routine 
 		       (concat class-selector "__define"))
 		      nil))
 	  (let  ((idlwave-cpl-bold idlwave-current-native-class-tags))
 	    (idlwave-complete-in-buffer
-	     'class-tag 'class-tag
+	     'class-tag 'class-tag 
 	     idlwave-current-class-tags nil
 	     (format "Select a tag of class %s" class-selector)
 	     "class tag"
@@ -7139,12 +7631,6 @@
 (add-hook 'idlwave-update-rinfo-hook 'idlwave-sysvars-reset)
 (add-hook 'idlwave-after-load-rinfo-hook 'idlwave-sintern-sysvar-alist)
 
-(defvar idlwave-executive-commands-alist nil
-  "Alist of system variables and their help files.")
-
-(defvar idlwave-system-variables-alist nil
-  "Alist of system variables and the associated structure tags.
-Gets set in `idlw-rinfo.el'.")
 
 (defun idlwave-complete-sysvar-or-tag ()
   "Complete a system variable."
@@ -7156,7 +7642,7 @@
 	     (skip-chars-backward "[a-zA-Z0-9_$]")
 	     (equal (char-before) ?!))
 	   (setq idlwave-completion-help-info '(idlwave-complete-sysvar-help))
-	   (idlwave-complete-in-buffer 'sysvar 'sysvar
+	   (idlwave-complete-in-buffer 'sysvar 'sysvar 
 				       idlwave-system-variables-alist nil
 				       "Select a system variable"
 				       "system variable")
@@ -7175,14 +7661,15 @@
 	     (or tags (error "System variable !%s is not a structure" var))
 	     (setq idlwave-completion-help-info
 		   (list 'idlwave-complete-sysvar-tag-help var))
-	     (idlwave-complete-in-buffer 'sysvartag 'sysvartag
+	     (idlwave-complete-in-buffer 'sysvartag 'sysvartag 
 					 tags nil
 					 "Select a system variable tag"
 					 "system variable tag")
 	     t)) ; return t to skip other completions
 	  (t nil))))
 
-(defvar link) ;dynamic
+(defvar link) ;dynamic variables set by help callback
+(defvar props)
 (defun idlwave-complete-sysvar-help (mode word)
   (let ((word (or (nth 1 idlwave-completion-help-info) word))
 	(entry (assoc word idlwave-system-variables-alist)))
@@ -7203,13 +7690,19 @@
      ((eq mode 'test) ; we can at least link the main
       (and (stringp word) entry main))
      ((eq mode 'set)
-      (if entry
-	  (setq link
+      (if entry 
+	  (setq link 
 		(if (setq target (cdr (assoc word tags)))
 		  (idlwave-substitute-link-target main target)
 		main)))) ;; setting dynamic!!!
      (t (error "This should not happen")))))
 
+(defun idlwave-split-link-target (link)
+  "Split a given link into link file and anchor."
+  (if (string-match idlwave-html-link-sep link)
+      (cons (substring link 0 (match-beginning 0))
+	    (string-to-number (substring link (match-end 0))))))
+
 (defun idlwave-substitute-link-target (link target)
   "Substitute the target anchor for the given link."
   (let (main-base)
@@ -7222,7 +7715,7 @@
 
 ;; Fake help in the source buffer for class structure tags.
 ;; KWD AND NAME ARE GLOBAL-VARIABLES HERE.
-(defvar name)
+(defvar name) 
 (defvar kwd)
 (defvar idlwave-help-do-class-struct-tag nil)
 (defun idlwave-complete-class-structure-tag-help (mode word)
@@ -7231,11 +7724,11 @@
     nil)
    ((eq mode 'set)
     (let (class-with found-in)
-      (when (setq class-with
-		(idlwave-class-or-superclass-with-tag
+      (when (setq class-with 
+		(idlwave-class-or-superclass-with-tag 
 		 idlwave-current-tags-class
 		 word))
-	(if (assq (idlwave-sintern-class class-with)
+	(if (assq (idlwave-sintern-class class-with) 
 		  idlwave-system-class-info)
 	    (error "No help available for system class tags"))
 	(if (setq found-in (idlwave-class-found-in class-with))
@@ -7248,7 +7741,7 @@
 (defun idlwave-class-or-superclass-with-tag (class tag)
   "Find and return the CLASS or one of its superclass with the
 associated TAG, if any."
-  (let ((sclasses (cons class (cdr (assq 'all-inherits
+  (let ((sclasses (cons class (cdr (assq 'all-inherits 
 					 (idlwave-class-info class)))))
 	cl)
    (catch 'exit
@@ -7257,7 +7750,7 @@
        (let ((tags (idlwave-class-tags cl)))
 	 (while tags
 	   (if (eq t (compare-strings tag 0 nil (car tags) 0 nil t))
-	     (throw 'exit cl))
+	     (throw 'exit cl))	       
 	   (setq tags (cdr tags))))))))
 
 
@@ -7280,8 +7773,8 @@
       (setcar entry (idlwave-sintern-sysvar (car entry) 'set))
       (setq tags (assq 'tags entry))
       (if tags
-	  (setcdr tags
-		  (mapcar (lambda (x)
+	  (setcdr tags 
+		  (mapcar (lambda (x) 
 			    (cons (idlwave-sintern-sysvartag (car x) 'set)
 				  (cdr x)))
 			  (cdr tags)))))))
@@ -7298,19 +7791,19 @@
 			 text start)
       (setq start (match-end 0)
 	    var (match-string 1 text)
-	    tags (if (match-end 3)
+	    tags (if (match-end 3) 
 		     (idlwave-split-string (match-string 3 text))))
       ;; Maintain old links, if present
       (setq old-entry (assq (idlwave-sintern-sysvar var) old))
       (setq link (assq 'link old-entry))
       (setq idlwave-system-variables-alist
-	    (cons (list var
-			(cons
-			 'tags
-			 (mapcar (lambda (x)
-				   (cons x
-					 (cdr (assq
-					       (idlwave-sintern-sysvartag x)
+	    (cons (list var 
+			(cons 
+			 'tags 
+			 (mapcar (lambda (x) 
+				   (cons x 
+					 (cdr (assq 
+					       (idlwave-sintern-sysvartag x) 
 					       (cdr (assq 'tags old-entry))))))
 				 tags)) link)
 		  idlwave-system-variables-alist)))
@@ -7332,9 +7825,9 @@
 
 (defun idlwave-uniquify (list)
   (let ((ht (make-hash-table :size (length list) :test 'equal)))
-    (delq nil
+    (delq nil 
 	  (mapcar (lambda (x)
-		    (unless (gethash x ht)
+		    (unless (gethash x ht) 
 		      (puthash x t ht)
 		      x))
 		  list))))
@@ -7362,11 +7855,11 @@
       nil)))
 
   ;; Restore the pre-completion window configuration if this is safe.
-
-  (if (or (eq verify 'force)                                    ; force
-	  (and
+  
+  (if (or (eq verify 'force)                                    ; force 
+	  (and 
 	   (get-buffer-window "*Completions*")                  ; visible
-	   (idlwave-local-value 'idlwave-completion-p
+	   (idlwave-local-value 'idlwave-completion-p 
 				"*Completions*")                ; cib-buffer
 	   (eq (marker-buffer idlwave-completion-mark)
 	       (current-buffer))                                ; buffer OK
@@ -7464,7 +7957,7 @@
     (if (string-match "\\(pro\\|function\\)[ \t]+\\(\\(.*\\)::\\)?\\(.*\\)"
 		      resolve)
 	(setq type (match-string 1 resolve)
-	      class (if (match-beginning 2)
+	      class (if (match-beginning 2) 
 			(match-string 3 resolve)
 		      nil)
 	      name (match-string 4 resolve)))
@@ -7473,15 +7966,15 @@
 
     (cond
      ((null class)
-      (idlwave-shell-send-command
+      (idlwave-shell-send-command 
        (format "resolve_routine,'%s'%s" (downcase name) kwd)
        'idlwave-update-routine-info
        nil t))
      (t
-      (idlwave-shell-send-command
+      (idlwave-shell-send-command 
        (format "resolve_routine,'%s__define'%s" (downcase class) kwd)
-       (list 'idlwave-shell-send-command
-	     (format "resolve_routine,'%s__%s'%s"
+       (list 'idlwave-shell-send-command 
+	     (format "resolve_routine,'%s__%s'%s" 
 		     (downcase class) (downcase name) kwd)
 	     '(idlwave-update-routine-info)
 	     nil t))))))
@@ -7502,19 +7995,19 @@
 	 (this-buffer (equal arg '(4)))
 	 (module (idlwave-fix-module-if-obj_new (idlwave-what-module)))
 	 (default (if module
-		      (concat (idlwave-make-full-name
+		      (concat (idlwave-make-full-name 
 			       (nth 2 module) (car module))
 			      (if (eq (nth 1 module) 'pro) "<p>" "<f>"))
 		    "none"))
-	 (list
+	 (list 
 	  (idlwave-uniquify
 	   (delq nil
-		 (mapcar (lambda (x)
+		 (mapcar (lambda (x) 
 			   (if (eq 'system (car-safe (nth 3 x)))
 			       ;; Take out system routines with no source.
 			       nil
 			     (list
-			      (concat (idlwave-make-full-name
+			      (concat (idlwave-make-full-name 
 				       (nth 2 x) (car x))
 				      (if (eq (nth 1 x) 'pro) "<p>" "<f>")))))
 			 (if this-buffer
@@ -7543,10 +8036,10 @@
 		     (t t)))
     (idlwave-do-find-module name type class nil this-buffer)))
 
-(defun idlwave-do-find-module (name type class
+(defun idlwave-do-find-module (name type class 
 				    &optional force-source this-buffer)
   (let ((name1 (idlwave-make-full-name class name))
-	source buf1 entry
+	source buf1 entry 
 	(buf (current-buffer))
 	(pos (point))
 	file name2)
@@ -7556,11 +8049,11 @@
 	  name2 (if (nth 2 entry)
 		    (idlwave-make-full-name (nth 2 entry) name)
 		  name1))
-    (if source
+    (if source	
 	(setq file (idlwave-routine-source-file source)))
     (unless file  ; Try to find it on the path.
-      (setq file
-	    (idlwave-expand-lib-file-name
+      (setq file 
+	    (idlwave-expand-lib-file-name 
 	     (if class
 		 (format "%s__define.pro" (downcase class))
 	       (format "%s.pro" (downcase name))))))
@@ -7568,14 +8061,14 @@
      ((or (null name) (equal name ""))
       (error "Abort"))
      ((eq (car source) 'system)
-      (error "Source code for system routine %s is not available"
+      (error "Source code for system routine %s is not available" 
 	     name2))
      ((or (not file) (not (file-regular-p file)))
       (error "Source code for routine %s is not available"
 	     name2))
      (t
       (when (not this-buffer)
-	(setq buf1
+	(setq buf1 
 	      (idlwave-find-file-noselect file 'find))
 	(pop-to-buffer buf1 t))
       (goto-char (point-max))
@@ -7585,7 +8078,7 @@
 		     (cond ((eq type 'fun) "function")
 			   ((eq type 'pro) "pro")
 			   (t "\\(pro\\|function\\)"))
-		     "\\>[ \t]+"
+		     "\\>[ \t]+" 
 		     (regexp-quote (downcase name2))
 		     "[^a-zA-Z0-9_$]")
 	     nil t)
@@ -7622,17 +8115,17 @@
       (cond
        ((and (eq cw 'procedure)
 	     (not (equal this-word "")))
-	(setq this-word (idlwave-sintern-routine-or-method
+	(setq this-word (idlwave-sintern-routine-or-method 
 			 this-word (nth 2 (nth 3 where))))
 	(list this-word 'pro
-	      (idlwave-determine-class
+	      (idlwave-determine-class 
 	       (cons this-word (cdr (nth 3 where)))
 	       'pro)))
-       ((and (eq cw 'function)
+       ((and (eq cw 'function) 
 	     (not (equal this-word ""))
 	     (or (eq next-char ?\()	; exclude arrays, vars.
 		 (looking-at "[a-zA-Z0-9_]*[ \t]*(")))
-	(setq this-word (idlwave-sintern-routine-or-method
+	(setq this-word (idlwave-sintern-routine-or-method 
 			 this-word (nth 2 (nth 3 where))))
 	(list this-word 'fun
 	      (idlwave-determine-class
@@ -7669,7 +8162,7 @@
       class)))
 
 (defun idlwave-fix-module-if-obj_new (module)
-  "Check if MODULE points to obj_new.
+  "Check if MODULE points to obj_new.  
 If yes, and if the cursor is in the keyword region, change to the
 appropriate Init method."
   (let* ((name (car module))
@@ -7690,7 +8183,7 @@
 			     (idlwave-sintern-class class)))))
     module))
 
-(defun idlwave-fix-keywords (name type class keywords
+(defun idlwave-fix-keywords (name type class keywords 
 				  &optional super-classes system)
   "Update a list of keywords.
 Translate OBJ_NEW, adding all super-class keywords, or all keywords
@@ -7711,34 +8204,34 @@
 			     string)
 	       (setq class (idlwave-sintern-class (match-string 1 string)))
 	       (setq idlwave-current-obj_new-class class)
-	       (setq keywords
-		     (append keywords
+	       (setq keywords 
+		     (append keywords 
 			     (idlwave-entry-keywords
 			      (idlwave-rinfo-assq
 			       (idlwave-sintern-method "INIT")
 			       'fun
 			       class
 			       (idlwave-routines)) 'do-link))))))
-
+    
     ;; If the class is `t', combine all keywords of all methods NAME
     (when (eq class t)
       (mapc (lambda (entry)
 	      (and
 	       (nth 2 entry)             ; non-nil class
 	       (eq (nth 1 entry) type)   ; correct type
-	       (setq keywords
-		     (append keywords
+	       (setq keywords 
+		     (append keywords 
 			     (idlwave-entry-keywords entry 'do-link)))))
 	    (idlwave-all-assq name (idlwave-routines)))
       (setq keywords (idlwave-uniquify keywords)))
-
+    
     ;; If we have inheritance, add all keywords from superclasses, if
     ;; the user indicated that method in `idlwave-keyword-class-inheritance'
-    (when (and
+    (when (and 
 	   super-classes
 	   idlwave-keyword-class-inheritance
 	   (stringp class)
-	   (or
+	   (or 
 	    system
 	    (assq (idlwave-sintern-keyword "_extra") keywords)
 	    (assq (idlwave-sintern-keyword "_ref_extra") keywords))
@@ -7756,7 +8249,7 @@
 		 (mapcar (lambda (k) (add-to-list 'keywords k))
 			 (idlwave-entry-keywords entry 'do-link))))
       (setq keywords (idlwave-uniquify keywords)))
-
+    
     ;; Return the final list
     keywords))
 
@@ -7781,14 +8274,14 @@
 		    (assq (idlwave-sintern-keyword "_REF_EXTRA") kwd-alist)))
 	 (completion-ignore-case t)
 	 candidates)
-    (cond ((assq kwd kwd-alist)
+    (cond ((assq kwd kwd-alist) 
 	   kwd)
 	  ((setq candidates (all-completions kwd kwd-alist))
 	   (if (= (length candidates) 1)
 	       (car candidates)
 	     candidates))
 	  ((and entry extra)
-	   ;; Inheritance may cause this keyword to be correct
+	   ;; Inheritance may cause this keyword to be correct 
 	   keyword)
 	  (entry
 	   ;; We do know the function, which does not have the keyword.
@@ -7800,13 +8293,13 @@
 
 (defvar idlwave-rinfo-mouse-map (make-sparse-keymap))
 (defvar idlwave-rinfo-map (make-sparse-keymap))
-(define-key idlwave-rinfo-mouse-map
+(define-key idlwave-rinfo-mouse-map 
   (if (featurep 'xemacs) [button2] [mouse-2])
   'idlwave-mouse-active-rinfo)
-(define-key idlwave-rinfo-mouse-map
+(define-key idlwave-rinfo-mouse-map 
   (if (featurep 'xemacs) [(shift button2)] [(shift mouse-2)])
   'idlwave-mouse-active-rinfo-shift)
-(define-key idlwave-rinfo-mouse-map
+(define-key idlwave-rinfo-mouse-map 
   (if (featurep 'xemacs) [button3] [mouse-3])
   'idlwave-mouse-active-rinfo-right)
 (define-key idlwave-rinfo-mouse-map " " 'idlwave-active-rinfo-space)
@@ -7832,7 +8325,7 @@
   (let* ((initial-class (or initial-class class))
 	 (entry (or (idlwave-best-rinfo-assq name type class
 					     (idlwave-routines))
-		    (idlwave-rinfo-assq name type class
+		    (idlwave-rinfo-assq name type class 
 					idlwave-unresolved-routines)))
 	 (name (or (car entry) name))
 	 (class (or (nth 2 entry) class))
@@ -7855,9 +8348,9 @@
 	 (col 0)
 	 (data (list name type class (current-buffer) nil initial-class))
 	 (km-prop (if (featurep 'xemacs) 'keymap 'local-map))
-	 (face 'idlwave-help-link-face)
+	 (face 'idlwave-help-link)
 	 beg props win cnt total)
-    ;; Fix keywords, but don't add chained super-classes, since these
+    ;; Fix keywords, but don't add chained super-classes, since these 
     ;; are shown separately for that super-class
     (setq keywords (idlwave-fix-keywords name type class keywords))
     (cond
@@ -7899,7 +8392,7 @@
 			  km-prop idlwave-rinfo-mouse-map
 			  'help-echo help-echo-use
 			  'data (cons 'usage data)))
-	(if html-file (setq props (append (list 'face face 'link html-file)
+	(if html-file (setq props (append (list 'face face 'link html-file) 
 					  props)))
 	(insert "Usage:    ")
 	(setq beg (point))
@@ -7908,14 +8401,14 @@
 		  (format calling-seq name name name name))
 		"\n")
 	(add-text-properties beg (point) props)
-
+	
 	(insert "Keywords:")
 	(if (null keywords)
 	    (insert " No keywords accepted.")
 	  (setq col 9)
 	  (mapcar
 	   (lambda (x)
-	     (if (>= (+ col 1 (length (car x)))
+	     (if (>= (+ col 1 (length (car x))) 
 		     (window-width))
 		 (progn
 		   (insert "\n         ")
@@ -7933,7 +8426,7 @@
 	     (add-text-properties beg (point) props)
 	     (setq col (+ col 1 (length (car x)))))
 	   keywords))
-
+	
 	(setq cnt 1 total (length all))
 	;; Here entry is (key file (list of type-conses))
 	(while (setq entry (pop all))
@@ -7946,7 +8439,7 @@
 					  (cdr (car (nth 2 entry))))
 			    'data (cons 'source data)))
 	  (idlwave-insert-source-location
-	   (format "\n%-8s  %s"
+	   (format "\n%-8s  %s" 
 		   (if (equal cnt 1)
 		       (if (> total 1) "Sources:" "Source:")
 		     "")
@@ -7955,7 +8448,7 @@
 	  (incf cnt)
 	  (when (and all (> cnt idlwave-rinfo-max-source-lines))
 	    ;; No more source lines, please
-	    (insert (format
+	    (insert (format 
 		     "\n          Source information truncated to %d entries."
 		     idlwave-rinfo-max-source-lines))
 	    (setq all nil)))
@@ -7969,7 +8462,7 @@
 	      (unwind-protect
 		  (progn
 		    (select-window win)
-		    (enlarge-window (- (/ (frame-height) 2)
+		    (enlarge-window (- (/ (frame-height) 2) 
 				       (window-height)))
 		    (shrink-window-if-larger-than-buffer))
 		(select-window ww)))))))))
@@ -8006,9 +8499,9 @@
      ((and (not file) shell-flag)
       (insert "Unresolved"))
 
-     ((null file)
+     ((null file)               
       (insert "ERROR"))
-
+     
      ((idlwave-syslib-p file)
       (if (string-match "obsolete" (file-name-directory file))
 	  (insert "Obsolete  ")
@@ -8022,7 +8515,7 @@
      ;; Old special syntax: a matching regexp
      ((setq special (idlwave-special-lib-test file))
       (insert (format "%-10s" special)))
-
+     
      ;; Catch-all with file
      ((idlwave-lib-p file)      (insert "Library   "))
 
@@ -8037,7 +8530,7 @@
 	       (if shell-flag "S" "-")
 	       (if buffer-flag "B" "-")
 	       "] ")))
-    (when (> ndupl 1)
+    (when (> ndupl 1) 
       (setq beg (point))
       (insert (format "(%dx) " ndupl))
       (add-text-properties beg (point) (list 'face 'bold)))
@@ -8061,7 +8554,7 @@
 		  alist nil)))
       rtn)
      (t nil))))
-
+  
 (defun idlwave-mouse-active-rinfo-right (ev)
   (interactive "e")
   (idlwave-mouse-active-rinfo ev 'right))
@@ -8080,7 +8573,7 @@
 was pressed."
   (interactive "e")
   (if ev (mouse-set-point ev))
-  (let (data id name type class buf bufwin source link keyword
+  (let (data id name type class buf bufwin source link keyword 
 	     word initial-class)
     (setq data (get-text-property (point) 'data)
 	  source (get-text-property (point) 'source)
@@ -8095,9 +8588,9 @@
 
     (cond ((eq id 'class) ; Switch class being displayed
 	   (if (window-live-p bufwin) (select-window bufwin))
-	   (idlwave-display-calling-sequence
+	   (idlwave-display-calling-sequence 
 	    (idlwave-sintern-method name)
-	    type (idlwave-sintern-class word)
+	    type (idlwave-sintern-class word) 
 	    initial-class))
 	  ((eq id 'usage) ; Online help on this routine
 	   (idlwave-online-help link name type class))
@@ -8138,9 +8631,9 @@
       (setq bwin (get-buffer-window buffer)))
     (if (eq (preceding-char) ?/)
 	(insert keyword)
-      (unless (save-excursion
+      (unless (save-excursion 
 		(re-search-backward
-		 "[(,][ \t]*\\(\\$[ \t]*\\(;.*\\)?\n\\)?[ \t]*\\="
+		 "[(,][ \t]*\\(\\$[ \t]*\\(;.*\\)?\n\\)?[ \t]*\\=" 
 		 (min (- (point) 100) (point-min)) t))
 	(insert ", "))
       (if shift (insert "/"))
@@ -8192,7 +8685,7 @@
 command can be used to detect possible name clashes during this process."
   (idlwave-routines)  ; Make sure everything is loaded.
   (unless (or idlwave-user-catalog-routines idlwave-library-catalog-routines)
-    (or (y-or-n-p
+    (or (y-or-n-p 
 	 "You don't have any user or library catalogs.  Continue anyway? ")
 	(error "Abort")))
   (let* ((routines (append idlwave-system-routines
@@ -8205,11 +8698,10 @@
 	 (keymap (make-sparse-keymap))
 	 (props (list 'mouse-face 'highlight
 		      km-prop keymap
-		      'help-echo "Mouse2: Find source"))
+		      'help-echo "Mouse2: Find source"))      
 	 (nroutines (length (or special-routines routines)))
-	 (step (/ nroutines 99))
+	 (step (/ nroutines 100))
 	 (n 0)
-	 (next-perc 1)
 	 (cnt 0)
 	 (idlwave-sort-prefer-buffer-info nil)
 	 routine twins dtwins twin done props1 lroutines)
@@ -8229,13 +8721,13 @@
     (message "Sorting routines...done")
 
     (define-key keymap (if (featurep 'xemacs) [(button2)] [(mouse-2)])
-      (lambda (ev)
+      (lambda (ev) 
 	(interactive "e")
 	(mouse-set-point ev)
 	(apply 'idlwave-do-find-module
 	       (get-text-property (point) 'find-args))))
     (define-key keymap [(return)]
-      (lambda ()
+      (lambda () 
 	(interactive)
 	(apply 'idlwave-do-find-module
 	       (get-text-property (point) 'find-args))))
@@ -8245,11 +8737,9 @@
       (setq buffer-read-only nil)
       (erase-buffer)
       (while (setq routine (pop routines))
-	(setq n (1+ n))
-	(if (= (* next-perc step) n)
-	    (progn
-	      (message "Compiling list...(%2d%%)" next-perc)
-	      (setq next-perc (1+ next-perc))))
+	(if (= (mod (setq n (1+ n)) step) 0)
+	    (message "Compiling list...(%2d%%)" (/ (* n 100) nroutines)))
+
 	;; Get a list of all twins
 	(setq twins (idlwave-routine-twins routine (or lroutines routines)))
 	(if (memq routine done)
@@ -8263,13 +8753,13 @@
 		  (> (idlwave-count-memq 'buffer (nth 2 (car dtwins))) 1))
 	  (incf cnt)
 	  (insert (format "\n%s%s"
-			  (idlwave-make-full-name (nth 2 routine)
+			  (idlwave-make-full-name (nth 2 routine) 
 						  (car routine))
 			  (if (eq (nth 1 routine) 'fun) "()" "")))
 	  (while (setq twin (pop dtwins))
 	    (setq props1 (append (list 'find-args
-				       (list (nth 0 routine)
-					     (nth 1 routine)
+				       (list (nth 0 routine) 
+					     (nth 1 routine) 
 					     (nth 2 routine)))
 				 props))
 	    (idlwave-insert-source-location "\n   - " twin props1))))
@@ -8292,7 +8782,7 @@
 	     (or (not (stringp sfile))
 		 (not (string-match "\\S-" sfile))))
 	(setq stype 'unresolved))
-    (princ (format "      %-10s %s\n"
+    (princ (format "      %-10s %s\n" 
 		   stype
 		   (if sfile sfile "No source code available")))))
 
@@ -8311,20 +8801,20 @@
 	       (eq type (nth 1 candidate))
 	       (eq class (nth 2 candidate)))
 	  (push candidate twins)))
-    (if (setq candidate (idlwave-rinfo-assq name type class
+    (if (setq candidate (idlwave-rinfo-assq name type class 
 					    idlwave-unresolved-routines))
 	(push candidate twins))
     (cons entry (nreverse twins))))
 
 (defun idlwave-study-twins (entries)
-  "Return dangerous twins of first entry in ENTRIES.
+  "Return dangerous twins of first entry in ENTRIES.  
 Dangerous twins are routines with same name, but in different files on
 the load path.  If a file is in the system library and has an entry in
 the `idlwave-system-routines' list, we omit the latter as
 non-dangerous because many IDL routines are implemented as library
 routines, and may have been scanned."
   (let* ((entry (car entries))
-	 (name (car entry))      ;
+	 (name (car entry))      ; 
 	 (type (nth 1 entry))    ; Must be bound for
 	 (class (nth 2 entry))   ;  idlwave-routine-twin-compare
 	 (cnt 0)
@@ -8342,23 +8832,23 @@
 		      (t 'unresolved)))
 
       ;; Check for an entry in the system library
-      (if (and file
+      (if (and file 
 	       (not syslibp)
 	       (idlwave-syslib-p file))
 	  (setq syslibp t))
-
+      
       ;; If there's more than one matching entry for the same file, just
       ;; append the type-cons to the type list.
       (if (setq entry (assoc key alist))
 	  (push type-cons (nth 2 entry))
 	(push (list key file (list type-cons)) alist)))
-
+    
     (setq alist (nreverse alist))
-
+    
     (when syslibp
       ;; File is in system *library* - remove any 'system entry
       (setq alist (delq (assq 'system alist) alist)))
-
+    
     ;; If 'system remains and we've scanned the syslib, it's a builtin
     ;; (rather than a !DIR/lib/.pro file bundled as source).
     (when (and (idlwave-syslib-scanned-p)
@@ -8394,7 +8884,7 @@
      ((not (eq type (nth 1 b)))
       ;; Type decides
       (< (if (eq type 'fun) 1 0) (if (eq (nth 1 b) 'fun) 1 0)))
-     (t
+     (t	
       ;; A and B are twins - so the decision is more complicated.
       ;; Call twin-compare with the proper arguments.
       (idlwave-routine-entry-compare-twins a b)))))
@@ -8446,7 +8936,7 @@
 	 (tpath-alist (idlwave-true-path-alist))
 	 (apathp (and (stringp akey)
 		      (assoc (file-name-directory akey) tpath-alist)))
-	 (bpathp (and (stringp bkey)
+	 (bpathp (and (stringp bkey) 
 		      (assoc (file-name-directory bkey) tpath-alist)))
 	 ;; How early on search path?  High number means early since we
 	 ;; measure the tail of the path list
@@ -8482,7 +8972,7 @@
      (t                                nil))))	; Default
 
 (defun idlwave-routine-source-file (source)
-  (if (nth 2 source)
+  (if (nth 2 source) 
       (expand-file-name (nth 1 source) (nth 2 source))
     (nth 1 source)))
 
@@ -8572,7 +9062,7 @@
   (forward-sexp 2)
   (forward-sexp -1)
   (let ((begin (point)))
-    (re-search-forward
+    (re-search-forward 
      "[a-zA-Z_][a-zA-Z0-9$_]+\\(::[a-zA-Z_][a-zA-Z0-9$_]+\\)?")
     (if (fboundp 'buffer-substring-no-properties)
         (buffer-substring-no-properties begin (point))
@@ -8611,13 +9101,16 @@
   (interactive)
   (start-process "idldeclient" nil
 		 idlwave-shell-explicit-file-name "-c" "-e"
-                 (buffer-file-name) "&"))
-
+                 (buffer-file-name)))
+  
+(defvar idlwave-help-use-assistant)
 (defun idlwave-launch-idlhelp ()
   "Start the IDLhelp application."
   (interactive)
-  (start-process "idlhelp" nil idlwave-help-application))
-
+  (if idlwave-help-use-assistant
+      (idlwave-help-assistant-raise)
+    (start-process "idlhelp" nil idlwave-help-application)))
+ 
 ;; Menus - using easymenu.el
 (defvar idlwave-mode-menu-def
   `("IDLWAVE"
@@ -8636,8 +9129,10 @@
      ["Block" idlwave-mark-block t]
      ["Header" idlwave-mark-doclib t])
     ("Format"
+     ["Indent Entire Statement" idlwave-indent-statement 
+      :active t :keys "C-u \\[indent-for-tab-command]" ]
      ["Indent Subprogram" idlwave-indent-subprogram t]
-     ["(Un)Comment Region" idlwave-toggle-comment-region "C-c ;"]
+     ["(Un)Comment Region" idlwave-toggle-comment-region t]
      ["Continue/Split line" idlwave-split-line t]
      "--"
      ["Toggle Auto Fill" idlwave-auto-fill-mode :style toggle
@@ -8656,7 +9151,7 @@
      ["Close Block" idlwave-close-block t])
     ("Completion"
      ["Complete" idlwave-complete t]
-     ("Complete Special"
+     ("Complete Specific"
       ["1 Procedure Name" (idlwave-complete 'procedure) t]
       ["2 Procedure Keyword" (idlwave-complete 'procedure-keyword) t]
       "--"
@@ -8678,6 +9173,7 @@
      ["Resolve Routine" idlwave-resolve (featurep 'idlw-shell)]
      "--"
      ["Update Routine Info" idlwave-update-routine-info t]
+     ["Rescan XML Help Catalog" idlwave-convert-xml-system-routine-info t]
      "--"
      "IDL User Catalog"
      ["Select Catalog Directories" (idlwave-create-user-catalog-file nil) t]
@@ -8696,7 +9192,6 @@
      ["Insert TAB character" idlwave-hard-tab t])
      "--"
     ("External"
-     ["Generate IDL tags" idlwave-make-tags t]
      ["Start IDL shell" idlwave-shell t]
      ["Edit file in IDLDE" idlwave-edit-in-idlde t]
      ["Launch IDL Help" idlwave-launch-idlhelp t])
@@ -8704,7 +9199,7 @@
     ("Customize"
      ["Browse IDLWAVE Group" idlwave-customize t]
      "--"
-     ["Build Full Customize Menu" idlwave-create-customize-menu
+     ["Build Full Customize Menu" idlwave-create-customize-menu 
       (fboundp 'customize-menu-create)])
     ("Documentation"
      ["Describe Mode" describe-mode t]
@@ -8721,22 +9216,22 @@
   '("Debug"
     ["Start IDL shell" idlwave-shell t]
     ["Save and .RUN buffer" idlwave-shell-save-and-run
-     (and (boundp 'idlwave-shell-automatic-start)
+     (and (boundp 'idlwave-shell-automatic-start) 
 	  idlwave-shell-automatic-start)]))
 
 (if (or (featurep 'easymenu) (load "easymenu" t))
     (progn
-      (easy-menu-define idlwave-mode-menu idlwave-mode-map
-			"IDL and WAVE CL editing menu"
+      (easy-menu-define idlwave-mode-menu idlwave-mode-map 
+			"IDL and WAVE CL editing menu" 
 			idlwave-mode-menu-def)
-      (easy-menu-define idlwave-mode-debug-menu idlwave-mode-map
-			"IDL and WAVE CL editing menu"
+      (easy-menu-define idlwave-mode-debug-menu idlwave-mode-map 
+			"IDL and WAVE CL editing menu" 
 			idlwave-mode-debug-menu-def)))
 
 (defun idlwave-customize ()
   "Call the customize function with idlwave as argument."
   (interactive)
-  ;; Try to load the code for the shell, so that we can customize it
+  ;; Try to load the code for the shell, so that we can customize it 
   ;; as well.
   (or (featurep 'idlw-shell)
       (load "idlw-shell" t))
@@ -8747,11 +9242,11 @@
   (interactive)
   (if (fboundp 'customize-menu-create)
       (progn
-	;; Try to load the code for the shell, so that we can customize it
+	;; Try to load the code for the shell, so that we can customize it 
 	;; as well.
 	(or (featurep 'idlw-shell)
 	    (load "idlw-shell" t))
-	(easy-menu-change
+	(easy-menu-change 
 	 '("IDLWAVE") "Customize"
 	 `(["Browse IDLWAVE group" idlwave-customize t]
 	   "--"
@@ -8799,7 +9294,7 @@
   (let ((table (symbol-value 'idlwave-mode-abbrev-table))
 	abbrevs
 	str rpl func fmt (len-str 0) (len-rpl 0))
-    (mapatoms
+    (mapatoms 
      (lambda (sym)
        (if (symbol-value sym)
 	   (progn
@@ -8825,7 +9320,7 @@
     (with-output-to-temp-buffer "*Help*"
       (if arg
 	  (progn
-	    (princ "Abbreviations and Actions in IDLWAVE-Mode\n")
+	    (princ "Abbreviations and Actions in IDLWAVE-Mode\n") 
 	    (princ "=========================================\n\n")
 	    (princ (format fmt "KEY" "REPLACE" "HOOK"))
 	    (princ (format fmt "---" "-------" "----")))
@@ -8852,7 +9347,7 @@
 ;; Will only work on systems which support this.
 (or idlwave-routines (idlwave-start-load-rinfo-timer))
 
-;;;###autoload(add-to-list 'auto-mode-alist '("\\.[Pp][Rr][Oo]\\'" . idlwave-mode))
+;;;###autoload (add-to-list 'auto-mode-alist '("\\.[Pp][Rr][Oo]\\'" . idlwave-mode))
 
 ;; Run the hook
 (run-hooks 'idlwave-load-hook)
--- a/lisp/recentf.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/recentf.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1165,7 +1165,7 @@
            :button-prefix ""
            :button-suffix ""
            :button-face default
-           :format "%[%t%]\n"
+           :format "%[%t\n%]"
            :help-echo ,(concat "Open " (cdr menu-element))
            :action recentf-open-files-action
            ,(cdr menu-element))))
--- a/lisp/rect.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/rect.el	Mon Apr 10 14:52:24 2006 +0000
@@ -141,8 +141,7 @@
       ;; else
       (setq pt (point))
       (move-to-column endcol t)
-      (setcdr lines (cons (buffer-substring pt (point)) (cdr lines)))
-      (delete-region pt (point)))
+      (setcdr lines (cons (filter-buffer-substring pt (point) t) (cdr lines))))
     ))
 
 ;; ### NOTE: this is actually the only function that needs to do complicated
@@ -233,12 +232,22 @@
 You might prefer to use `delete-extract-rectangle' from a program.
 
 With a prefix (or a FILL) argument, also fill lines where nothing has to be
-deleted."
-  (interactive "*r\nP")
-  (when buffer-read-only
-    (setq killed-rectangle (extract-rectangle start end))
-    (barf-if-buffer-read-only))
-  (setq killed-rectangle (delete-extract-rectangle start end fill)))
+deleted.
+
+If the buffer is read-only, Emacs will beep and refrain from deleting
+the rectangle, but put it in the kill ring anyway.  This means that
+you can use this command to copy text from a read-only buffer.
+\(If the variable `kill-read-only-ok' is non-nil, then this won't
+even beep.)"
+  (interactive "r\nP")
+  (condition-case nil
+      (setq killed-rectangle (delete-extract-rectangle start end fill))
+    ((buffer-read-only text-read-only)
+     (setq killed-rectangle (extract-rectangle start end))
+     (if kill-read-only-ok
+	 (progn (message "Read only text copied to kill ring") nil)
+       (barf-if-buffer-read-only)
+       (signal 'text-read-only (list (current-buffer)))))))
 
 ;; this one is untouched --dv
 ;;;###autoload
--- a/lisp/savehist.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/savehist.el	Mon Apr 10 14:52:24 2006 +0000
@@ -56,6 +56,7 @@
 
 (defgroup savehist nil
   "Save minibuffer history."
+  :version "22.1"
   :group 'minibuffer)
 
 ;;;###autoload
@@ -91,6 +92,11 @@
   :type '(repeat variable)
   :group 'savehist)
 
+(defcustom savehist-ignored-variables nil ;; '(command-history)
+  "*List of additional variables not to save."
+  :type '(repeat variable)
+  :group 'savehist)
+
 (defcustom savehist-file
   (cond
    ;; Backward compatibility with previous versions of savehist.
@@ -371,9 +377,10 @@
 	(error nil))))))
 
 (defun savehist-minibuffer-hook ()
-  ;; XEmacs sets minibuffer-history-variable to t to mean "no history
-  ;; is being recorded".
-  (unless (eq minibuffer-history-variable t)
+  (unless (or (eq minibuffer-history-variable t)
+	      ;; XEmacs sets minibuffer-history-variable to t to mean "no
+	      ;; history is being recorded".
+	      (memq minibuffer-history-variable savehist-ignored-variables))
     (add-to-list 'savehist-minibuffer-history-variables
 		 minibuffer-history-variable)))
 
--- a/lisp/shell.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/shell.el	Mon Apr 10 14:52:24 2006 +0000
@@ -574,7 +574,7 @@
 ;;; 2. It cannot infallibly deal with command sequences, though it does well
 ;;;    with these and with ignoring commands forked in another shell with ()s.
 ;;; 3. More generally, any complex command is going to throw it. Otherwise,
-;;;    you'd have to build an entire shell interpreter in emacs lisp.  Failing
+;;;    you'd have to build an entire shell interpreter in Emacs Lisp.  Failing
 ;;;    that, there's no way to catch shell commands where cd's are buried
 ;;;    inside conditional expressions, aliases, and so forth.
 ;;;
@@ -608,7 +608,7 @@
 default directory to track these commands.
 
 You may toggle this tracking on and off with M-x dirtrack-mode.
-If emacs gets confused, you can resync with the shell with M-x dirs.
+If Emacs gets confused, you can resync with the shell with M-x dirs.
 
 See variables `shell-cd-regexp', `shell-chdrive-regexp', `shell-pushd-regexp',
 and  `shell-popd-regexp', while `shell-pushd-tohome', `shell-pushd-dextract',
@@ -929,7 +929,7 @@
 (defun shell-dynamic-complete-command ()
   "Dynamically complete the command at point.
 This function is similar to `comint-dynamic-complete-filename', except that it
-searches `exec-path' (minus the trailing emacs library path) for completion
+searches `exec-path' (minus the trailing Emacs library path) for completion
 candidates.  Note that this may not be the same as the shell's idea of the
 path.
 
--- a/lisp/simple.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/simple.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1038,7 +1038,10 @@
 Value is also consed on to front of the variable `values'.
 Optional argument EVAL-EXPRESSION-INSERT-VALUE, if non-nil, means
 insert the result into the current buffer instead of printing it in
-the echo area."
+the echo area.
+
+If `eval-expression-debug-on-error' is non-nil, which is the default,
+this command arranges for all errors to enter the debugger."
   (interactive
    (list (read-from-minibuffer "Eval: "
 			       nil read-expression-map t
@@ -2317,7 +2320,7 @@
 
 If this variable is nil, no filtering is performed.")
 
-(defun filter-buffer-substring (beg end &optional delete)
+(defun filter-buffer-substring (beg end &optional delete noprops)
   "Return the buffer substring between BEG and END, after filtering.
 The buffer substring is passed through each of the filter
 functions in `buffer-substring-filters', and the value from the
@@ -2327,21 +2330,36 @@
 If DELETE is non-nil, the text between BEG and END is deleted
 from the buffer.
 
+If NOPROPS is non-nil, final string returned does not include
+text properties, while the string passed to the filters still
+includes text properties from the buffer text.
+
 Point is temporarily set to BEG before calling
 `buffer-substring-filters', in case the functions need to know
 where the text came from.
 
-This function should be used instead of `buffer-substring' or
-`delete-and-extract-region' when you want to allow filtering to
-take place.  For example, major or minor modes can use
-`buffer-substring-filters' to extract characters that are special
-to a buffer, and should not be copied into other buffers."
-  (save-excursion
-    (goto-char beg)
-    (let ((string (if delete (delete-and-extract-region beg end)
-                    (buffer-substring beg end))))
-      (dolist (filter buffer-substring-filters string)
-        (setq string (funcall filter string))))))
+This function should be used instead of `buffer-substring',
+`buffer-substring-no-properties', or `delete-and-extract-region'
+when you want to allow filtering to take place.  For example,
+major or minor modes can use `buffer-substring-filters' to
+extract characters that are special to a buffer, and should not
+be copied into other buffers."
+  (cond
+   ((or delete buffer-substring-filters)
+    (save-excursion
+      (goto-char beg)
+      (let ((string (if delete (delete-and-extract-region beg end)
+		      (buffer-substring beg end))))
+	(dolist (filter buffer-substring-filters)
+	  (setq string (funcall filter string)))
+	(if noprops
+	    (set-text-properties 0 (length string) nil string))
+	string)))
+   (noprops
+    (buffer-substring-no-properties beg end))
+   (t
+    (buffer-substring beg end))))
+
 
 ;;;; Window system cut and paste hooks.
 
@@ -3731,7 +3749,7 @@
 To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
   (interactive "p")
   (or arg (setq arg 1))
-  
+
   (let ((orig (point)))
 
     ;; Move by lines, if ARG is not 1 (the default).
--- a/lisp/sort.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/sort.el	Mon Apr 10 14:52:24 2006 +0000
@@ -121,9 +121,6 @@
 (defun sort-build-lists (nextrecfun endrecfun startkeyfun endkeyfun)
   (let ((sort-lists ())
 	(start-rec nil)
-	;; To avoid such functins as `end-of-line' being affected by
-	;; fields.
-	(inhibit-field-text-motion t)
 	done key)
     ;; Loop over sort records.
     ;(goto-char (point-min)) -- it is the caller's responsibility to
@@ -205,7 +202,9 @@
     (save-restriction
       (narrow-to-region beg end)
       (goto-char (point-min))
-      (sort-subr reverse 'forward-line 'end-of-line))))
+      (let ;; To make `end-of-line' and etc. to ignore fields.
+	  ((inhibit-field-text-motion t))
+	(sort-subr reverse 'forward-line 'end-of-line)))))
 
 ;;;###autoload
 (defun sort-paragraphs (reverse beg end)
@@ -271,25 +270,27 @@
 Called from a program, there are three arguments:
 FIELD, BEG and END.  BEG and END specify region to sort."
   (interactive "p\nr")
-  (sort-fields-1 field beg end
-		 (lambda ()
-		   (sort-skip-fields field)
-		   (let* ((case-fold-search t)
-			  (base
-			   (if (looking-at "\\(0x\\)[0-9a-f]\\|\\(0\\)[0-7]")
-			       (cond ((match-beginning 1)
-				      (goto-char (match-end 1))
-				      16)
-				     ((match-beginning 2)
-				      (goto-char (match-end 2))
-				      8)
-				     (t nil)))))
-		     (string-to-number (buffer-substring (point)
-							 (save-excursion
-							   (forward-sexp 1)
-							   (point)))
-				       (or base sort-numeric-base))))
-		 nil))
+  (let ;; To make `end-of-line' and etc. to ignore fields.
+      ((inhibit-field-text-motion t))
+    (sort-fields-1 field beg end
+		   (lambda ()
+		     (sort-skip-fields field)
+		     (let* ((case-fold-search t)
+			    (base
+			     (if (looking-at "\\(0x\\)[0-9a-f]\\|\\(0\\)[0-7]")
+				 (cond ((match-beginning 1)
+					(goto-char (match-end 1))
+					16)
+				       ((match-beginning 2)
+					(goto-char (match-end 2))
+					8)
+				       (t nil)))))
+		       (string-to-number (buffer-substring (point)
+							   (save-excursion
+							     (forward-sexp 1)
+							     (point)))
+					 (or base sort-numeric-base))))
+		   nil)))
 
 ;;;;;###autoload
 ;;(defun sort-float-fields (field beg end)
@@ -322,11 +323,13 @@
 The variable `sort-fold-case' determines whether alphabetic case affects
 the sort order."
   (interactive "p\nr")
-  (sort-fields-1 field beg end
-		 (function (lambda ()
-			     (sort-skip-fields field)
-			     nil))
-		 (function (lambda () (skip-chars-forward "^ \t\n")))))
+  (let ;; To make `end-of-line' and etc. to ignore fields.
+      ((inhibit-field-text-motion t))
+    (sort-fields-1 field beg end
+		   (function (lambda ()
+			       (sort-skip-fields field)
+			       nil))
+		   (function (lambda () (skip-chars-forward "^ \t\n"))))))
 
 (defun sort-fields-1 (field beg end startkeyfun endkeyfun)
   (let ((tbl (syntax-table)))
@@ -471,7 +474,9 @@
 Use \\[untabify] to convert tabs to spaces before sorting."
   (interactive "P\nr")
   (save-excursion
-    (let (beg1 end1 col-beg1 col-end1 col-start col-end)
+    (let ;; To make `end-of-line' and etc. to ignore fields.
+	((inhibit-field-text-motion t)
+	 beg1 end1 col-beg1 col-end1 col-start col-end)
       (goto-char (min beg end))
       (setq col-beg1 (current-column))
       (beginning-of-line)
--- a/lisp/speedbar.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/speedbar.el	Mon Apr 10 14:52:24 2006 +0000
@@ -503,7 +503,7 @@
   :type 'hook)
 
 (defcustom speedbar-after-create-hook '(speedbar-frame-reposition-smartly)
-  "*Hooks called before popping up the speedbar frame."
+  "*Hooks called after popping up the speedbar frame."
   :group 'speedbar
   :type 'hook)
 
--- a/lisp/startup.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/startup.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1327,6 +1327,7 @@
 	(fancy-splash-outer-buffer (current-buffer))
 	splash-buffer
 	(old-minor-mode-map-alist minor-mode-map-alist)
+	(old-emulation-mode-map-alists emulation-mode-map-alists)
 	(frame (fancy-splash-frame))
 	timer)
     (save-selected-window
@@ -1350,6 +1351,7 @@
 	      (setq cursor-type nil
 		    display-hourglass nil
 		    minor-mode-map-alist nil
+		    emulation-mode-map-alists nil
 		    buffer-undo-list t
 		    mode-line-format (propertize "---- %b %-"
 						 'face '(:weight bold))
@@ -1361,7 +1363,8 @@
 	      (recursive-edit))
 	  (cancel-timer timer)
 	  (setq display-hourglass old-hourglass
-		minor-mode-map-alist old-minor-mode-map-alist)
+		minor-mode-map-alist old-minor-mode-map-alist
+		emulation-mode-map-alists old-emulation-mode-map-alists)
 	  (kill-buffer splash-buffer)
 	  (when (frame-live-p frame)
 	    (select-frame frame)
@@ -1401,30 +1404,31 @@
   (let ((prev-buffer (current-buffer)))
     (unwind-protect
 	(with-current-buffer (get-buffer-create "GNU Emacs")
-	  (setq mode-line-format (propertize "---- %b %-"
-					     'face '(:weight bold)))
-	  (let ((tab-width 8))
-	    (if pure-space-overflow
-		(insert "Warning Warning  Pure space overflow   Warning Warning\n"))
+	  (set (make-local-variable 'tab-width) 8)
+          (set (make-local-variable 'mode-line-format)
+               (propertize "---- %b %-" 'face '(:weight bold)))
+
+          (if pure-space-overflow
+              (insert "Warning Warning  Pure space overflow   Warning Warning\n"))
 
-	    ;; The convention for this piece of code is that
-	    ;; each piece of output starts with one or two newlines
-	    ;; and does not end with any newlines.
-	    (insert "Welcome to GNU Emacs")
-	    (insert
-	     (if (eq system-type 'gnu/linux)
-		 ", one component of the GNU/Linux operating system.\n"
-	       ", a part of the GNU operating system.\n"))
+          ;; The convention for this piece of code is that
+          ;; each piece of output starts with one or two newlines
+          ;; and does not end with any newlines.
+          (insert "Welcome to GNU Emacs")
+          (insert
+           (if (eq system-type 'gnu/linux)
+               ", one component of the GNU/Linux operating system.\n"
+             ", a part of the GNU operating system.\n"))
 
-	    (unless (equal (buffer-name prev-buffer) "*scratch*")
-	      (insert (substitute-command-keys
-		       "\nType \\[recenter] to begin editing your file.\n")))
+          (unless (equal (buffer-name prev-buffer) "*scratch*")
+            (insert (substitute-command-keys
+                     "\nType \\[recenter] to begin editing your file.\n")))
 
-	    (if (display-mouse-p)
-		;; The user can use the mouse to activate menus
-		;; so give help in terms of menu items.
-		(progn
-		  (insert "\
+          (if (display-mouse-p)
+              ;; The user can use the mouse to activate menus
+              ;; so give help in terms of menu items.
+              (progn
+                (insert "\
 You can do basic editing with the menu bar and scroll bar using the mouse.
 
 Useful File menu items:
@@ -1440,103 +1444,103 @@
 Getting New Versions	How to obtain the latest version of Emacs
 More Manuals / Ordering Manuals    How to order printed manuals from the FSF
 ")
-		  (insert "\n\n" (emacs-version)
-			  "
+                (insert "\n\n" (emacs-version)
+                        "
 Copyright (C) 2006 Free Software Foundation, Inc."))
 
-	      ;; No mouse menus, so give help using kbd commands.
+	    ;; No mouse menus, so give help using kbd commands.
 
-	      ;; If keys have their default meanings,
-	      ;; use precomputed string to save lots of time.
-	      (if (and (eq (key-binding "\C-h") 'help-command)
-		       (eq (key-binding "\C-xu") 'advertised-undo)
-		       (eq (key-binding "\C-x\C-c") 'save-buffers-kill-terminal)
-		       (eq (key-binding "\C-ht") 'help-with-tutorial)
-		       (eq (key-binding "\C-hi") 'info)
-		       (eq (key-binding "\C-hr") 'info-emacs-manual)
-		       (eq (key-binding "\C-h\C-n") 'view-emacs-news))
-		  (insert "
+	    ;; If keys have their default meanings,
+	    ;; use precomputed string to save lots of time.
+	    (if (and (eq (key-binding "\C-h") 'help-command)
+		     (eq (key-binding "\C-xu") 'advertised-undo)
+		     (eq (key-binding "\C-x\C-c") 'save-buffers-kill-terminal)
+		     (eq (key-binding "\C-ht") 'help-with-tutorial)
+		     (eq (key-binding "\C-hi") 'info)
+		     (eq (key-binding "\C-hr") 'info-emacs-manual)
+		     (eq (key-binding "\C-h\C-n") 'view-emacs-news))
+		(insert "
 Get help	   C-h  (Hold down CTRL and press h)
 Emacs manual	   C-h r
 Emacs tutorial	   C-h t           Undo changes     C-x u
 Buy manuals        C-h C-m         Exit Emacs	    C-x C-c
 Browse manuals     C-h i")
 
-		(insert (substitute-command-keys
-			 (format "\n
+	      (insert (substitute-command-keys
+		       (format "\n
 Get help	   %s
 Emacs manual	   \\[info-emacs-manual]
 Emacs tutorial	   \\[help-with-tutorial]\tUndo changes\t\\[advertised-undo]
 Buy manuals        \\[view-order-manuals]\tExit Emacs\t\\[save-buffers-kill-terminal]
 Browse manuals     \\[info]"
-				 (let ((where (where-is-internal
-					       'help-command nil t)))
-				   (if where
-				       (key-description where)
-				     "M-x help"))))))
+			       (let ((where (where-is-internal
+					     'help-command nil t)))
+				 (if where
+				     (key-description where)
+				   "M-x help"))))))
 
-	      ;; Say how to use the menu bar with the keyboard.
-	      (if (and (eq (key-binding "\M-`") 'tmm-menubar)
-		       (eq (key-binding [f10]) 'tmm-menubar))
-		  (insert "
+	    ;; Say how to use the menu bar with the keyboard.
+	    (if (and (eq (key-binding "\M-`") 'tmm-menubar)
+		     (eq (key-binding [f10]) 'tmm-menubar))
+		(insert "
 Activate menubar   F10  or  ESC `  or   M-`")
-		(insert (substitute-command-keys "
+	      (insert (substitute-command-keys "
 Activate menubar     \\[tmm-menubar]")))
 
-	      ;; Many users seem to have problems with these.
-	      (insert "
+	    ;; Many users seem to have problems with these.
+	    (insert "
 \(`C-' means use the CTRL key.  `M-' means use the Meta (or Alt) key.
 If you have no Meta key, you may instead type ESC followed by the character.)")
 
-	      (insert "\n\n" (emacs-version)
-		      "
+	    (insert "\n\n" (emacs-version)
+		    "
 Copyright (C) 2006 Free Software Foundation, Inc.")
 
-	      (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
-		       (eq (key-binding "\C-h\C-d") 'describe-distribution)
-		       (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
-		  (insert
-		   "\n
+	    (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
+		     (eq (key-binding "\C-h\C-d") 'describe-distribution)
+		     (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
+		(insert
+		 "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for full details.
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type C-h C-c to see the conditions.
 Type C-h C-d for information on getting the latest version.")
-		(insert (substitute-command-keys
-			 "\n
+	      (insert (substitute-command-keys
+		       "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for full details.
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type \\[describe-copying] to see the conditions.
 Type \\[describe-distribution] for information on getting the latest version."))))
 
-	    ;; The rest of the startup screen is the same on all
-	    ;; kinds of terminals.
+	  ;; The rest of the startup screen is the same on all
+	  ;; kinds of terminals.
 
-	    ;; Give information on recovering, if there was a crash.
-	    (and auto-save-list-file-prefix
-		 ;; Don't signal an error if the
-		 ;; directory for auto-save-list files
-		 ;; does not yet exist.
-		 (file-directory-p (file-name-directory
-				    auto-save-list-file-prefix))
-		 (directory-files
-		  (file-name-directory auto-save-list-file-prefix)
-		  nil
-		  (concat "\\`"
-			  (regexp-quote (file-name-nondirectory
-					 auto-save-list-file-prefix)))
-		  t)
-		 (insert "\n\nIf an Emacs session crashed recently, "
-			 "type M-x recover-session RET\nto recover"
-			 " the files you were editing."))
+	  ;; Give information on recovering, if there was a crash.
+	  (and auto-save-list-file-prefix
+	       ;; Don't signal an error if the
+	       ;; directory for auto-save-list files
+	       ;; does not yet exist.
+	       (file-directory-p (file-name-directory
+				  auto-save-list-file-prefix))
+	       (directory-files
+		(file-name-directory auto-save-list-file-prefix)
+		nil
+		(concat "\\`"
+			(regexp-quote (file-name-nondirectory
+				       auto-save-list-file-prefix)))
+		t)
+	       (insert "\n\nIf an Emacs session crashed recently, "
+		       "type M-x recover-session RET\nto recover"
+		       " the files you were editing."))
 
-	    ;; Display the input that we set up in the buffer.
-	    (set-buffer-modified-p nil)
-	    (goto-char (point-min))
-	    (save-window-excursion
-	      (switch-to-buffer (current-buffer))
-	      (sit-for 120))))
-      ;; Unwind ... ensure splash buffer is killed
-      (kill-buffer "GNU Emacs"))))
+	  ;; Display the input that we set up in the buffer.
+	  (set-buffer-modified-p nil)
+	  (goto-char (point-min))
+	  (save-window-excursion
+	    (switch-to-buffer (current-buffer))
+	    (sit-for 120))))
+    ;; Unwind ... ensure splash buffer is killed
+    (kill-buffer "GNU Emacs"))))
 
 
 (defun startup-echo-area-message ()
--- a/lisp/subr.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/subr.el	Mon Apr 10 14:52:24 2006 +0000
@@ -1916,6 +1916,12 @@
 				 "\\" (substring argument end (1+ end)))
 		  start (1+ end)))
 	  (concat result (substring argument start)))))))
+
+(defun string-or-null-p (object)
+  "Return t if OBJECT is a string or nil.
+Otherwise, return nil."
+  (or (stringp object) (null object)))
+
 
 ;;;; Support for yanking and text properties.
 
--- a/lisp/textmodes/bibtex.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/textmodes/bibtex.el	Mon Apr 10 14:52:24 2006 +0000
@@ -2856,25 +2856,45 @@
 	(bibtex-autofill-entry))
     (run-hooks 'bibtex-add-entry-hook)))
 
-(defun bibtex-entry-update ()
+(defun bibtex-entry-update (&optional entry-type)
   "Update an existing BibTeX entry.
 In the BibTeX entry at point, make new fields for those items that may occur
-according to `bibtex-field-list', but are not yet present."
-  (interactive)
+according to `bibtex-field-list', but are not yet present.
+Also, add field delimiters to numerical fields if they are not present.
+If ENTRY-TYPE is non-nil, change first the entry type to ENTRY-TYPE.
+When called interactively with a prefix arg, query for a value of ENTRY-TYPE."
+  (interactive
+   (list (if current-prefix-arg
+             (let ((completion-ignore-case t))
+               (completing-read "New entry type: " bibtex-entry-field-alist
+                                nil t nil 'bibtex-entry-type-history)))))
   (save-excursion
     (bibtex-beginning-of-entry)
-    ;; For inserting new fields, we use the fact that
-    ;; `bibtex-parse-entry' moves point to the end of the last field.
-    (let* ((fields-alist (bibtex-parse-entry))
-           (field-list (bibtex-field-list
-                        (cdr (assoc "=type=" fields-alist)))))
-      (skip-chars-backward " \t\n")
-      (dolist (field (car field-list))
-        (unless (assoc-string (car field) fields-alist t)
-          (bibtex-make-field field)))
-      (dolist (field (cdr field-list))
-        (unless (assoc-string (car field) fields-alist t)
-          (bibtex-make-optional-field field))))))
+    (when (looking-at bibtex-entry-maybe-empty-head)
+      (goto-char (match-end 0))
+      (if entry-type
+          (save-excursion
+            (replace-match (concat "@" entry-type) nil nil nil 1))
+        (setq entry-type (bibtex-type-in-head)))
+      (let* ((field-list (bibtex-field-list entry-type))
+             (required (copy-tree (car field-list)))
+             (optional (copy-tree (cdr field-list)))
+             bounds)
+        (while (setq bounds (bibtex-parse-field))
+          (let ((fname (bibtex-name-in-field bounds t))
+                (end (copy-marker (bibtex-end-of-field bounds) t)))
+            (setq required (delete (assoc-string fname required t) required)
+                  optional (delete (assoc-string fname optional t) optional))
+            (when (string-match "\\`[0-9]+\\'"
+                                (bibtex-text-in-field-bounds bounds))
+              (goto-char (bibtex-end-of-text-in-field bounds))
+              (insert (bibtex-field-right-delimiter))
+              (goto-char (bibtex-start-of-text-in-field bounds))
+              (insert (bibtex-field-left-delimiter)))
+            (goto-char end)))
+        (skip-chars-backward " \t\n")
+        (dolist (field required) (bibtex-make-field field))
+        (dolist (field optional) (bibtex-make-optional-field field))))))
 
 (defun bibtex-parse-entry (&optional content)
   "Parse entry at point, return an alist.
@@ -3613,17 +3633,20 @@
 
 (defun bibtex-find-text-internal (&optional noerror subfield comma)
   "Find text part of current BibTeX field or entry head.
-Return list (NAME START-TEXT END-TEXT END) with field or entry name,
-start and end of text and end of field or entry head, or nil if not found.
-If optional arg NOERROR is non-nil, an error message is suppressed if text
-is not found.  If optional arg SUBFIELD is non-nil START-TEXT and END-TEXT
-correspond to the current subfield delimited by #.
+Return list (NAME START-TEXT END-TEXT END STRING-CONST) with field
+or entry name, start and end of text, and end of field or entry head.
+STRING-CONST is a flag which is non-nil if current subfield delimited by #
+is a BibTeX string constant.  Return value is nil if field or entry head
+are not found.
+If optional arg NOERROR is non-nil, an error message is suppressed
+if text is not found.  If optional arg SUBFIELD is non-nil START-TEXT
+and END-TEXT correspond to the current subfield delimited by #.
 Optional arg COMMA is as in `bibtex-enclosing-field'."
   (save-excursion
     (let ((pnt (point))
           (bounds (bibtex-enclosing-field comma t))
           (case-fold-search t)
-          name start-text end-text end failure done no-sub)
+          name start-text end-text end failure done no-sub string-const)
       (bibtex-beginning-of-entry)
       (cond (bounds
              (setq name (bibtex-name-in-field bounds t)
@@ -3667,9 +3690,11 @@
           (goto-char start-text)
           (while (not done)
             (if (or (prog1 (looking-at bibtex-field-const)
-                      (setq end-text (match-end 0)))
+                      (setq end-text (match-end 0)
+                            string-const t))
                     (prog1 (setq bounds (bibtex-parse-field-string))
-                      (setq end-text (cdr bounds))))
+                      (setq end-text (cdr bounds)
+                            string-const nil)))
                 (progn
                   (if (and (<= start-text pnt) (<= pnt end-text))
                       (setq done t)
@@ -3678,7 +3703,7 @@
                       (setq start-text (goto-char (match-end 0)))))
               (setq done t failure t)))))
       (cond ((not failure)
-             (list name start-text end-text end))
+             (list name start-text end-text end string-const))
             ((and no-sub (not noerror))
              (error "Not on text part of BibTeX field"))
             ((not noerror) (error "Not on BibTeX field"))))))
@@ -3712,13 +3737,10 @@
 Optional arg COMMA is as in `bibtex-enclosing-field'.  It is t for
 interactive calls."
   (interactive (list t))
-  (let* ((bounds (bibtex-find-text-internal nil t comma))
-         (start (nth 1 bounds))
-         (end (nth 2 bounds)))
-    (if (memq (char-before end) '(?\} ?\"))
-        (delete-region (1- end) end))
-    (if (memq (char-after start) '(?\{ ?\"))
-        (delete-region start (1+ start)))))
+  (let ((bounds (bibtex-find-text-internal nil t comma)))
+    (unless (nth 4 bounds)
+      (delete-region (1- (nth 2 bounds)) (nth 2 bounds))
+      (delete-region (nth 1 bounds) (1+ (nth 1 bounds))))))
 
 (defun bibtex-kill-field (&optional copy-only comma)
   "Kill the entire enclosing BibTeX field.
--- a/lisp/textmodes/fill.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/textmodes/fill.el	Mon Apr 10 14:52:24 2006 +0000
@@ -48,6 +48,7 @@
   "*Non-nil means put two spaces after a colon when filling."
   :type 'boolean
   :group 'fill)
+;;;###autoload(put 'colon-double-space 'safe-local-variable t)
 
 (defvar fill-paragraph-function nil
   "Mode-specific function to fill a paragraph, or nil if there is none.
--- a/lisp/textmodes/ispell.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/textmodes/ispell.el	Mon Apr 10 14:52:24 2006 +0000
@@ -267,6 +267,7 @@
 may produce undesired results."
   :type '(choice (const exclusive) (const :tag "off" nil) (const :tag "on" t))
   :group 'ispell)
+;;;###autoload(put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t exclusive))))
 
 (defcustom ispell-query-replace-choices nil
   "*Corrections made throughout region when non-nil.
@@ -461,6 +462,7 @@
   :type '(choice string
 		 (const :tag "default" nil))
   :group 'ispell)
+;;;###autoload(put 'ispell-local-dictionary 'safe-local-variable 'string-or-null-p)
 
 (make-variable-buffer-local 'ispell-local-dictionary)
 
--- a/lisp/textmodes/paragraphs.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/textmodes/paragraphs.el	Mon Apr 10 14:52:24 2006 +0000
@@ -98,6 +98,7 @@
 hard newline are considered to match."
   :group 'paragraphs
   :type 'regexp)
+;;;###autoload(put 'paragraph-start 'safe-local-variable 'stringp)
 
 ;; paragraph-start requires a hard newline, but paragraph-separate does not:
 ;; It is assumed that paragraph-separate is distinctive enough to be believed
@@ -115,6 +116,7 @@
 text indented by a margin setting."
   :group 'paragraphs
   :type 'regexp)
+;;;###autoload(put 'paragraph-separate 'safe-local-variable 'stringp)
 
 (defcustom sentence-end-double-space t
   "*Non-nil means a single space does not end a sentence.
@@ -126,6 +128,7 @@
 `sentence-end' is nil.  See Info node `(elisp)Standard Regexps'."
   :type 'boolean
   :group 'fill)
+;;;###autoload(put 'sentence-end-double-space 'safe-local-variable t)
 
 (defcustom sentence-end-without-period nil
   "*Non-nil means a sentence will end without a period.
@@ -137,6 +140,7 @@
 `sentence-end' is nil.  See Info node `(elisp)Standard Regexps'."
   :type 'boolean
   :group 'fill)
+;;;###autoload(put 'sentence-end-without-period 'safe-local-variable t)
 
 (defcustom sentence-end-without-space
   "$B!#!%!)!*$A!##.#?#!$(0!$!%!)!*$(G!$!%!)!*(B"
@@ -147,6 +151,7 @@
 `sentence-end' is nil.  See Info node `(elisp)Standard Regexps'."
   :group 'paragraphs
   :type 'string)
+;;;###autoload(put 'sentence-end-without-space 'safe-local-variable t)
 
 (defcustom sentence-end nil
   "*Regexp describing the end of a sentence.
@@ -158,12 +163,14 @@
 to obtain the value of this variable."
   :group 'paragraphs
   :type '(choice regexp (const :tag "Use default value" nil)))
+;;;###autoload(put 'sentence-end 'safe-local-variable 'string-or-null-p)
 
 (defcustom sentence-end-base "[.?!][]\"'$B!I$,1r}(B)}]*"
   "*Regexp matching the basic end of a sentence, not including following space."
   :group 'paragraphs
   :type 'string
   :version "22.1")
+;;;###autoload(put 'sentence-end-base 'safe-local-variable 'stringp)
 
 (defun sentence-end ()
   "Return the regexp describing the end of a sentence.
@@ -191,12 +198,14 @@
   "*Regexp describing line-beginnings that separate pages."
   :group 'paragraphs
   :type 'regexp)
+;;;###autoload(put 'page-delimiter 'safe-local-variable t)
 
 (defcustom paragraph-ignore-fill-prefix nil
   "*Non-nil means the paragraph commands are not affected by `fill-prefix'.
 This is desirable in modes where blank lines are the paragraph delimiters."
   :group 'paragraphs
   :type 'boolean)
+;;;###autoload(put 'paragraph-ignore-fill-prefix 'safe-local-variable t)
 
 (defun forward-paragraph (&optional arg)
   "Move forward to end of paragraph.
--- a/lisp/textmodes/picture.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/textmodes/picture.el	Mon Apr 10 14:52:24 2006 +0000
@@ -758,8 +758,9 @@
 
 (defun picture-mode-exit (&optional nostrip)
   "Undo `picture-mode' and return to previous major mode.
-With no argument strips whitespace from end of every line in Picture buffer
-  otherwise just return to previous mode."
+With no argument, strip whitespace from end of every line in Picture buffer;
+  otherwise, just return to previous mode.
+Runs `picture-mode-exit-hook' at the end."
   (interactive "P")
   (if (not (eq major-mode 'picture-mode))
       (error "You aren't editing a Picture")
@@ -769,7 +770,8 @@
     (setq major-mode picture-mode-old-major-mode)
     (kill-local-variable 'tab-stop-list)
     (setq truncate-lines picture-mode-old-truncate-lines)
-    (force-mode-line-update)))
+    (force-mode-line-update)
+    (run-hooks 'picture-mode-exit-hook)))
 
 (provide 'picture)
 
--- a/lisp/textmodes/reftex-vars.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/textmodes/reftex-vars.el	Mon Apr 10 14:52:24 2006 +0000
@@ -948,6 +948,7 @@
 the label types for which it should be true."
   :group  'reftex-referencing-labels
   :type `(choice :tag "\\vref is default macro" ,@reftex-tmp))
+;;;###autoload(put 'reftex-vref-is-default 'safe-local-variable t)
 
 (defcustom reftex-fref-is-default nil
   "*Non-nil means, the fancyref macro \\fref is used as default.
@@ -958,11 +959,13 @@
 the label types for which it should be true."
   :group  'reftex-referencing-labels
   :type `(choice :tag "\\fref is default macro" ,@reftex-tmp))
+;;;###autoload(put 'reftex-fref-is-default 'safe-local-variable t)
 
 (defcustom reftex-level-indent 2
   "*Number of spaces to be used for indentation per section level."
   :group 'reftex-referencing-labels
   :type 'integer)
+;;;###autoload(put 'reftex-level-indent 'safe-local-variable 'integerp)
 
 (defcustom reftex-guess-label-type t
   "*Non-nil means, `reftex-reference' will try to guess the label type.
@@ -972,6 +975,7 @@
 a label type.  If you set this variable to nil, RefTeX will always prompt."
   :group 'reftex-referencing-labels
   :type 'boolean)
+;;;###autoload(put 'reftex-guess-label-type 'safe-local-variable t)
 
 (defcustom reftex-format-ref-function nil
   "Function which produces the string to insert as a reference.
--- a/lisp/woman.el	Sat Apr 01 17:16:18 2006 +0000
+++ b/lisp/woman.el	Mon Apr 10 14:52:24 2006 +0000
@@ -381,7 +381,7 @@
 ;; code fragments, general interest, etc.:
 ;;   Jari Aalto <jari.aalto@cs.tpu.fi>
 ;;   Dean Andrews <dean@dra.com>
-;;   Juanma Barranquero <barranquero@laley-actualidad.es>
+;;   Juanma Barranquero <lekktu@gmail.com>
 ;;   Karl Berry <kb@cs.umb.edu>
 ;;   Jim Chapman <jchapman@netcomuk.co.uk>
 ;;   Kin Cho <kin@neoscale.com>
@@ -426,9 +426,15 @@
 
 (require 'man)
 (require 'button)
-(define-button-type 'WoMan-xref-man-page 
+(define-button-type 'WoMan-xref-man-page
   :supertype 'Man-abstract-xref-man-page
-  'func 'woman)
+  'func (lambda (arg)
+	  (woman
+	   ;; `woman' cannot deal with arguments that contain a
+	   ;; section name, like close(2), so strip the section name.
+	   (if (string-match Man-reference-regexp arg)
+	       (substring arg 0 (match-end 1))
+	     arg))))
 
 (eval-when-compile			; to avoid compiler warnings
   (require 'dired)
--- a/lispref/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/lispref/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,22 @@
+2006-04-10  Kim F. Storm  <storm@cua.dk>
+
+	* text.texi (Buffer Contents): Add NOPROPS arg to
+	filter-buffer-substring.
+
+2006-04-08  Kevin Ryde  <user42@zip.com.au>
+
+	* os.texi (Command-Line Arguments): Update xref to emacs manual
+	"Command Arguments" -> "Emacs Invocation", per change there.
+
+2006-04-08  Thien-Thi Nguyen  <ttn@gnu.org>
+
+	* display.texi (Other Display Specs): Arrange a @code{DOTTED-LIST} to
+	be on one line to help makeinfo not render two spaces after the dot.
+
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* strings.texi (Predicates for Strings): Add string-or-null-p.
+
 2006-03-28  Kim F. Storm  <storm@cua.dk>
 
 	* processes.texi (Accepting Output): Remove obsolete (and incorrect)
--- a/lispref/display.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/lispref/display.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -3500,9 +3500,13 @@
 faces used for the text.
 @end table
 
+@c We put all the `@code{(when ...)}' on one line to encourage
+@c makeinfo's end-of-sentence heuristics to DTRT.  Previously, the dot
+@c was at eol; the info file ended up w/ two spaces rendered after it.
   You can make any display specification conditional.  To do that,
-package it in another list of the form @code{(when @var{condition} .
-@var{spec})}.  Then the specification @var{spec} applies only when
+package it in another list of the form
+@code{(when @var{condition} . @var{spec})}.
+Then the specification @var{spec} applies only when
 @var{condition} evaluates to a non-@code{nil} value.  During the
 evaluation, @code{object} is bound to the string or buffer having the
 conditional @code{display} property.  @code{position} and
--- a/lispref/os.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/lispref/os.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -404,8 +404,9 @@
 arguments is in @code{command-line-args}.)
 
 The command-line arguments are parsed by the @code{command-line-1}
-function in the @file{startup.el} file.  See also @ref{Command
-Arguments, , Command Line Arguments, emacs, The GNU Emacs Manual}.
+function in the @file{startup.el} file.  See also @ref{Emacs
+Invocation, , Command Line Arguments for Emacs Invocation, emacs, The
+GNU Emacs Manual}.
 @end defvar
 
 @defvar command-line-args
--- a/lispref/strings.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/lispref/strings.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -102,6 +102,11 @@
 otherwise.
 @end defun
 
+@defun string-or-null-p object
+This function returns @code{t} if @var{object} is a string or nil,
+@code{nil} otherwise.
+@end defun
+
 @defun char-or-string-p object
 This function returns @code{t} if @var{object} is a string or a
 character (i.e., an integer), @code{nil} otherwise.
--- a/lispref/text.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/lispref/text.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -205,7 +205,7 @@
 properties, just the characters themselves.  @xref{Text Properties}.
 @end defun
 
-@defun filter-buffer-substring start end &optional delete
+@defun filter-buffer-substring start end &optional delete noprops
 This function passes the buffer text between @var{start} and @var{end}
 through the filter functions specified by the variable
 @code{buffer-substring-filters}, and returns the value from the last
@@ -217,7 +217,12 @@
 between @var{start} and @var{end} after copying it, like
 @code{delete-and-extract-region}.
 
-Lisp code should use this function instead of @code{buffer-substring}
+If @var{noprops} is non-@code{nil}, the final string returned does not
+include text properties, while the string passed through the filters
+still includes text properties from the buffer text.
+
+Lisp code should use this function instead of @code{buffer-substring},
+@code{buffer-substring-no-properties},
 or @code{delete-and-extract-region} when copying into user-accessible
 data structures such as the kill-ring, X clipboard, and registers.
 Major and minor modes can add functions to
--- a/man/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,138 @@
+2006-04-09  Kevin Ryde  <user42@zip.com.au>
+
+	* org.texi (Formula syntax): Typo in node name of calc-eval xref.
+
+	* sending.texi (Mail Sending): In send-mail-function @pxref smtpmail,
+	put info and printed manual names the right way around.
+
+2006-04-09  Karl Berry  <karl@gnu.org>
+
+	* msdog.texi, emacs-xtra.texi: move all the MS-DOS material to
+	emacs-xtra.texi, leaving only MS Windows information.
+	* building.texi, emacs.texi, frames.texi, gnu.texi, macos.texi,
+	msdog.texi, mule.texi, trouble.texi: change cross-references and
+	node names.
+
+	* emacs.texi: move @summarycontents and @contents to the beginning
+	of the file.
+
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus.texi (Summary Buffer Lines): Add `*'.
+
+2006-04-07  Jochen K,A|(Bpper  <jochen@fhi-berlin.mpg.de>
+
+	* gnus.texi (Group Parameters): Mention
+	gnus-permanently-visible-groups.
+
+2006-04-06  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus.texi (Face): Fix typo.
+
+2006-04-05  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus.texi (X-Face): Clarify.
+	(Face): Need Emacs with PNG support.
+
+2006-04-08  Kevin Ryde  <user42@zip.com.au>
+
+	* text.texi (Fill Commands): fill-nobreak-predicate is now a hook.
+
+2006-04-07  Richard Stallman  <rms@gnu.org>
+
+	* programs.texi (Comments, Comment Commands, Options for Comments)
+	(Multi-Line Comments): "Align", not "indent".
+	(Basic Indent): C-j deletes trailing whitespace before the newline.
+
+2006-04-06  Richard Stallman  <rms@gnu.org>
+
+	* idlwave.texi: Delete the blocks "not suitable for inclusion with
+	Emacs".
+
+	* programs.texi (Basic Indent): Clarify relationship of C-j to TAB.
+
+2006-04-06  Eli Zaretskii  <eliz@gnu.org>
+
+	* killing.texi (Rectangles): Add index entry for marking a
+	rectangle.
+
+2006-04-06  J.D. Smith  <jdsmith@as.arizona.edu>
+
+	* idlwave.texi: Updated for IDLWAVE version 6.0, factoring out
+	blocks not suitable for inclusion with Emacs using variable
+	PARTOFEMACS.
+
+2006-04-05  Richard Stallman  <rms@gnu.org>
+
+	* emacs.texi (Top): Update subnode menu.
+
+	* trouble.texi (Unasked-for Search): Node deleted.
+	(Lossage): Delete from menu.
+
+2006-04-04  Richard Stallman  <rms@gnu.org>
+
+	* trouble.texi: Various cleanups.
+	(Checklist): Don't bother saying how to snail a bug report.
+	(Emergency Escape): Much rewriting.
+	(After a Crash): Rename the core dump immediately.
+	(Total Frustration): Call it a psychotherapist.
+	(Bug Criteria): Avoid "illegal instruction".
+	(Sending Patches): We always put the contributor's name in.
+
+	* misc.texi (Thumbnails): Minor correction.
+
+2006-04-04  Simon Josefsson  <jas@extundo.com>
+
+	* gnus.texi (Security): Improve.
+
+2006-04-03  Richard Stallman  <rms@gnu.org>
+
+	* misc.texi (Thumbnails): Minor cleanup.
+
+2006-04-02  Karl Berry  <karl@gnu.org>
+
+	* sending.texi (Mail Sending): pxref to Top needs five args.
+
+	* texinfo.tex: update to current version (2006-03-21.13).
+
+2006-04-02  Bill Wohler  <wohler@newt.com>
+
+	* mh-e.texi (Getting Started, Junk, Bug Reports)
+	(MH FAQ and Support): Fix URLs.
+
+2006-03-31  Romain Francoise  <romain@orebokech.com>
+
+	* gnus.texi (Virtual Groups): `nnvirtual-always-rescan' defaults
+	to t, not nil (and has for the past eight years).
+
+2006-03-31  Richard Stallman  <rms@gnu.org>
+
+	* emacs.texi (Top): Update subnode menu.
+
+	* help.texi (Help Mode): Cleanup.
+
+	* dired.texi: Many cleanups.
+	(Dired Deletion): Describe dired-recursive-deletes.
+	(Operating on Files): dired-create-directory moved.
+	(Misc Dired Features): Moved to here.
+	(Tumme): Node moved to misc.texi.
+
+	* custom.texi: Many cleanups.
+	(Minor Modes): Don't mention ISO Accents Mode.
+	(Examining): Update C-h v output example.
+	(Hooks): Add index and  xref for add-hook.
+	(Locals): Delete list of vars that are always per-buffer.  Rearrange.
+	(Local Keymaps): Don't mention lisp-mode-map, c-mode-map.
+
+	* misc.texi: Many cleanups.
+	(beginning): Add to summary of topics.
+	(Shell): Put eshell xref at the end.  Remove eshell from table.
+	(Thumbnails): New node.
+
+2006-03-31  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* message.texi, gnus.texi: Bump version to 5.11.
+
 2006-03-29  Reiner Steib  <Reiner.Steib@gmx.de>
 
 	* gnus.texi (Top): Add comment about version line.
@@ -131,6 +266,10 @@
 
 	* org.texi (Clean view): Document new startup options.
 
+2006-03-12  Richard Stallman  <rms@gnu.org>
+
+	* calendar.texi: Various cleanups.
+
 2006-03-11  Bill Wohler  <wohler@newt.com>
 
 	* mh-e.texi (Preface, More About MH-E, Options, HTML, Folders)
--- a/man/building.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/building.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -323,7 +323,7 @@
 subprocesses; to work around this lack, @kbd{M-x compile} runs the
 compilation command synchronously on MS-DOS.  As a consequence, you must
 wait until the command finishes before you can do anything else in
-Emacs.  @xref{MS-DOS}.
+Emacs.  @xref{MS-DOS,,,emacs-xtra,Specialized Emacs Features}.
 
 @node Grep Searching
 @section Searching with Grep under Emacs
--- a/man/custom.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/custom.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -7,7 +7,7 @@
 @cindex customization
 
   This chapter talks about various topics relevant to adapting the
-behavior of Emacs in minor ways.
+behavior of Emacs in ways we have anticipated.
 @iftex
 See @cite{The Emacs Lisp Reference Manual}
 @end iftex
@@ -15,14 +15,14 @@
 @xref{Top, Emacs Lisp, Emacs Lisp, elisp, The Emacs Lisp
 Reference Manual},
 @end ifnottex
-for how to make more far-reaching changes.  @xref{X Resources},
-for information on using X resources to customize Emacs.
+for how to make more far-reaching and open-ended changes.  @xref{X
+Resources}, for information on using X resources to customize Emacs.
 
   Customization that you do within Emacs normally affects only the
 particular Emacs session that you do it in---it does not persist
 between sessions unless you save the customization in a file such as
-@file{.emacs} or @file{.Xdefaults} that will affect future sessions.
-@xref{Init File}.  In the customization buffer, when you save
+your init file (@file{.emacs}) that will affect future sessions.
+(@xref{Init File}.)  When you tell the customization buffer to save
 customizations for future sessions, this actually works by editing
 @file{.emacs} for you.
 
@@ -55,17 +55,19 @@
 example, Auto Fill mode is a minor mode in which @key{SPC} breaks lines
 between words as you type.  All the minor modes are independent of each
 other and of the selected major mode.  Most minor modes say in the mode
-line when they are on; for example, @samp{Fill} in the mode line means
-that Auto Fill mode is on.
-
-  Append @code{-mode} to the name of a minor mode to get the name of a
-command that turns the mode on or off.  Thus, the command to
-enable or disable Auto Fill mode is called @code{auto-fill-mode}.  These
-commands are usually invoked with @kbd{M-x}, but you can bind keys to them
-if you wish.  With no argument, the function turns the mode on if it was
-off and off if it was on.  This is known as @dfn{toggling}.  A positive
-argument always turns the mode on, and an explicit zero argument or a
-negative argument always turns it off.
+line when they are enabled; for example, @samp{Fill} in the mode line means
+that Auto Fill mode is enabled.
+
+  You should append @code{-mode} to the name of a minor mode to
+produce the name of the command that turns the mode on or off.  Thus,
+the command to enable or disable Auto Fill mode is called
+@code{auto-fill-mode}.  These commands are usually invoked with
+@kbd{M-x}, but you can bind keys to them if you wish.
+
+  With no argument, the minor mode function turns the mode on if it
+was off, and off if it was on.  This is known as @dfn{toggling}.  A
+positive argument always turns the mode on, and an explicit zero
+argument or a negative argument always turns it off.
 
   Some minor modes are global: while enabled, they affect everything
 you do in the Emacs session, in all buffers.  Other minor modes are
@@ -94,8 +96,8 @@
 not want the same minor modes you prefer.
 
   The most useful buffer-local minor modes include Abbrev mode, Auto
-Fill mode, Auto Save mode, Font-Lock mode, Glasses mode, ISO Accents
-mode, Outline minor mode, Overwrite mode, and Binary Overwrite mode.
+Fill mode, Auto Save mode, Font-Lock mode, Glasses mode, Outline minor
+mode, Overwrite mode, and Binary Overwrite mode.
 
   Abbrev mode allows you to define abbreviations that automatically expand
 as you type them.  For example, @samp{amd} might expand to @samp{abbrev
@@ -105,9 +107,8 @@
 explicitly.  Emacs inserts newlines as necessary to prevent lines from
 becoming too long.  @xref{Filling}.
 
-  Auto Save mode causes the contents of a buffer to be saved
-periodically to reduce the amount of work you can lose in case of a
-system crash.  @xref{Auto Save}.
+  Auto Save mode saves the buffer contents periodically to reduce the
+amount of work you can lose in case of a crash.  @xref{Auto Save}.
 
   Enriched mode enables editing and saving of formatted text.
 @xref{Formatted Text}.
@@ -115,16 +116,18 @@
   Flyspell mode automatically highlights misspelled words.
 @xref{Spelling}.
 
-  Font-Lock mode automatically highlights certain textual units found in
-programs, such as comments, strings, and function names being defined.
-This requires a graphical display that can show multiple fonts.
-@xref{Faces}.
-
+  Font-Lock mode automatically highlights certain textual units found
+in programs, such as comments, strings, and function names being
+defined.  This requires a display that can show multiple fonts or
+colors.  @xref{Faces}.
+
+@ignore
   ISO Accents mode makes the characters @samp{`}, @samp{'}, @samp{"},
 @samp{^}, @samp{/} and @samp{~} combine with the following letter, to
 produce an accented letter in the ISO Latin-1 character set.  The
 newer and more general feature of input methods more or less
 supersedes ISO Accents mode.  @xref{Unibyte Mode}.
+@end ignore
 
   Outline minor mode provides the same facilities as the major mode
 called Outline mode; but since it is a minor mode instead, you can
@@ -286,15 +289,15 @@
 shows only the names of groups and settings, and puts them in a
 structure.
 
-  In this buffer, you can show the contents of a group by invoking
-@samp{[+]}.  When the group contents are visible, this button changes to
-@samp{[-]}; invoking that hides the group contents.
-
-  Each setting in this buffer has a link which says @samp{[Group]},
-@samp{[Option]} or @samp{[Face]}.  Invoking this link creates an
-ordinary customization buffer showing just that group and its
-contents, just that user option, or just that face.  This is the way
-to change settings that you find with @kbd{M-x customize-browse}.
+  In this buffer, you can show the contents of a group by invoking the
+@samp{[+]} button.  When the group contents are visible, this button
+changes to @samp{[-]}; invoking that hides the group contents again.
+
+  Each group or setting in this buffer has a link which says
+@samp{[Group]}, @samp{[Option]} or @samp{[Face]}.  Invoking this link
+creates an ordinary customization buffer showing just that group and
+its contents, just that user option, or just that face.  This is the
+way to change settings that you find with @kbd{M-x customize-browse}.
 
   If you can guess part of the name of the settings you are interested
 in, @kbd{M-x customize-apropos} is another way to search for settings.
@@ -343,6 +346,8 @@
                                                            save it.
 @end smallexample
 
+@cindex user options, how to set
+@cindex variables, how to set
 @cindex settings, how to set
   Editing the value does not actually set the variable.  To do that,
 you must @dfn{set} the variable.  To do this, invoke the
@@ -415,8 +420,8 @@
 To delete an association from the list, invoke the @samp{[DEL]} button
 for that item.  To add an association, invoke @samp{[INS]} at the
 position where you want to add it.  There is an @samp{[INS]} button
-between each pair of association, another at the beginning and another
-at the end, so you can add the new association at any position in the
+between each pair of associations, another at the beginning and another
+at the end, so you can add a new association at any position in the
 list.
 
 @kindex TAB @r{(customization buffer)}
@@ -469,7 +474,7 @@
 you can get the customized value back again with this operation.
 @end table
 
-@cindex comments on customized options
+@cindex comments on customized settings
   Sometimes it is useful to record a comment about a specific
 customization.  Use the @samp{Add Comment} item from the
 @samp{[State]} menu to create a field for entering the comment.  The
@@ -494,13 +499,17 @@
 Each of the other buttons performs an operation---set, save or
 reset---on each of the settings in the buffer that could meaningfully
 be set, saved or reset.  They do not operate on settings whose values
-are hidden, nor on subgroups not visible in the buffer.
+are hidden, nor on subgroups which are hidden or not visible in the buffer.
 
 @node Saving Customizations
 @subsection Saving Customizations
 
+  Saving customizations from the customization buffer works by writing
+code that future sessions will read, code to set up those
+customizations again.
+
 @vindex custom-file
-  The customization buffer normally saves customizations in
+  Normally this saves customizations in your init file,
 @file{~/.emacs}.  If you wish, you can save customizations in another
 file instead.  To make this work, your @file{~/.emacs} should set
 @code{custom-file} to the name of that file.  Then you should load the
@@ -511,8 +520,8 @@
 (load custom-file)
 @end example
 
-  You can also use @code{custom-file} to specify different
-customization files for different Emacs versions, like this:
+  You can use @code{custom-file} to specify different customization
+files for different Emacs versions, like this:
 
 @example
 (cond ((< emacs-major-version 21)
@@ -650,9 +659,9 @@
 @findex customize-group
   You can also set up the customization buffer with a specific group,
 using @kbd{M-x customize-group}.  The immediate contents of the chosen
-group, including variables, faces, and other groups, all appear
-as well (even if not already loaded).  However, the subgroups' own
-contents are not included.
+group, including settings (variables and faces), and other groups, all
+appear as well (even if not already loaded).  However, the subgroups'
+own contents are not included.
 
 @findex customize-apropos
   To control more precisely what to customize, you can use @kbd{M-x
@@ -663,13 +672,13 @@
 groups and settings---which takes a long time to set up.
 
 @findex customize-changed
-  When you upgrade to a new Emacs version, you might want to customize
-new settings and settings whose meanings or default values have
-changed.  To do this, use @kbd{M-x customize-changed} and
+  When you upgrade to a new Emacs version, you might want to consider
+customizing new settings, and settings whose meanings or default
+values have changed.  To do this, use @kbd{M-x customize-changed} and
 specify a previous Emacs version number using the minibuffer.  It
 creates a customization buffer which shows all the settings and groups
-whose definitions have been changed since the specified version, loading
-them if necessary.
+whose definitions have been changed since the specified version,
+loading them if necessary.
 
 @findex customize-saved
 @findex customize-customized
@@ -712,7 +721,7 @@
 records all the options that you set in the ordinary customization
 buffer, is always enabled, and always takes precedence over all other
 enabled Custom themes.  Additionally, the @samp{user} theme is
-recorded in your @file{.emacs} file, rather than a
+recorded with code in your @file{.emacs} file, rather than a
 @file{user-theme.el} file.
 
 @vindex custom-enabled-themes
@@ -734,7 +743,7 @@
   You can temporarily enable a Custom theme with @kbd{M-x
 enable-theme}.  This prompts for a theme name in the minibuffer, loads
 the theme from the theme file if necessary, and enables the theme.
-You can @dfn{disabled} any enabled theme with the command @kbd{M-x
+You can @dfn{disable} any enabled theme with the command @kbd{M-x
 disable-theme}; this returns the options specified in the theme to
 their original values.  To re-enable the theme, type @kbd{M-x
 enable-theme} again.  If a theme file is changed during your Emacs
@@ -755,7 +764,7 @@
 have and how the value will be used.
 
   Emacs Lisp allows any variable (with a few exceptions) to have any
-kind of value, but most variables that Emacs uses need a value of a
+kind of value, but most variables that Emacs uses expect a value of a
 certain type.  Often the value should always be a string, or should
 always be a number.  Sometimes we say that a certain feature is turned
 on if a variable is ``non-@code{nil},'' meaning that if the variable's
@@ -766,11 +775,11 @@
 
   Emacs uses many Lisp variables for internal record keeping, but the
 most interesting variables for a non-programmer user are those meant
-for users to change---the @dfn{user options}.
+for users to change---these are called @dfn{user options}.
 
   Each user option that you can set with the customization buffer is
 in fact a Lisp variable.  Emacs does not (usually) change the values
-of these variables; instead, you set the values, and thereby alter and
+of these variables on its own; instead, you set the values in order to
 control the behavior of certain Emacs commands.  Use of the
 customization buffer is explained above (@pxref{Easy Customization});
 here we describe other aspects of Emacs variables.
@@ -808,21 +817,27 @@
 displays something like this:
 
 @smallexample
+fill-column is a variable defined in `C source code'.
 fill-column's value is 70
+Local in buffer custom.texi; global value is 70
+Automatically becomes buffer-local when set in any fashion.
 
 Documentation:
 *Column beyond which automatic line-wrapping should happen.
-Automatically becomes buffer-local when set in any fashion.
+Interactively, you can set the buffer local value using C-x f.
+
+You can customize this variable.
 @end smallexample
 
 @noindent
-The star at the beginning of the documentation indicates that this
-variable is a user option.  @kbd{C-h v} is not restricted to user
-options; it allows any variable name.
+The line that says you can customize the variable indicates that this
+variable is a user option.  (The star also indicates this, but it is
+an obsolete indicator that may eventually disappear.)  @kbd{C-h v} is
+not restricted to user options; it allows any variable name.
 
 @findex set-variable
-  The most convenient way to set a specific user option variable is
-with @kbd{M-x set-variable}.  This reads the variable name with the
+The most convenient way to set a specific user option variable is with
+@kbd{M-x set-variable}.  This reads the variable name with the
 minibuffer (with completion), and then reads a Lisp expression for the
 new value using the minibuffer a second time (you can insert the old
 value into the minibuffer for editing via @kbd{M-n}).  For example,
@@ -889,13 +904,11 @@
 are not called at all.  The documentation of each abnormal hook variable
 explains in detail what is peculiar about it.
 
+@findex add-hook
   You can set a hook variable with @code{setq} like any other Lisp
 variable, but the recommended way to add a hook function to a hook
-(either normal or abnormal) is by calling @code{add-hook}.  You can
-specify any valid Lisp function as the hook function, provided it can
-handle the proper number of arguments (zero arguments, in the case of
-a normal hook).  Of course, not every Lisp function is @emph{useful}
-in any particular hook.
+(either normal or abnormal) is by calling @code{add-hook}.
+@xref{Hooks,,, elisp, The Emacs Lisp Reference Manual}.
 
   For example, here's how to set up a hook to turn on Auto Fill mode
 when entering Text mode and other modes based on Text mode:
@@ -936,11 +949,12 @@
 ``asking for trouble.''  However, the order is predictable: the most
 recently added hook functions are executed first.
 
+@findex remove-hook
   If you play with adding various different versions of a hook
 function by calling @code{add-hook} over and over, remember that all
 the versions you added will remain in the hook variable together.  You
-can clear out individual functions with @code{remove-hook}, or do
-@code{(setq @var{hook-variable} nil)} to remove everything.
+can clear out individual functions by calling @code{remove-hook}, or
+do @code{(setq @var{hook-variable} nil)} to remove everything.
 
 @node Locals
 @subsection Local Variables
@@ -963,46 +977,41 @@
 effect in all buffers that have not made the variable local.
 
 @findex make-local-variable
-  @kbd{M-x make-local-variable} reads the name of a variable and makes it
-local to the current buffer.  Further changes in this buffer will not
-affect others, and further changes in the global value will not affect this
-buffer.
+  @kbd{M-x make-local-variable} reads the name of a variable and makes
+it local to the current buffer.  Changing its value subsequently in
+this buffer will not affect others, and changes in its global value
+will not affect this buffer.
 
 @findex make-variable-buffer-local
 @cindex per-buffer variables
-  @kbd{M-x make-variable-buffer-local} reads the name of a variable and
-changes the future behavior of the variable so that it will become local
-automatically when it is set.  More precisely, once a variable has been
-marked in this way, the usual ways of setting the variable automatically
-do @code{make-local-variable} first.  We call such variables
-@dfn{per-buffer} variables.
+  @kbd{M-x make-variable-buffer-local} marks a variable so it will
+become local automatically whenever it is set.  More precisely, once a
+variable has been marked in this way, the usual ways of setting the
+variable automatically do @code{make-local-variable} first.  We call
+such variables @dfn{per-buffer} variables.  Many variables in Emacs
+are normally per-buffer; the variable's document string tells you when
+this is so.  A per-buffer variable's global value is normally never
+effective in any buffer, but it still has a meaning: it is the initial
+value of the variable for each new buffer.
 
   Major modes (@pxref{Major Modes}) always make variables local to the
 buffer before setting the variables.  This is why changing major modes
-in one buffer has no effect on other buffers.  Minor modes also work by
-setting variables---normally, each minor mode has one controlling
-variable which is non-@code{nil} when the mode is enabled (@pxref{Minor
-Modes}).  For most minor modes, the controlling variable is per buffer.
-
-  Emacs contains a number of variables that are always per-buffer.
-These include @code{abbrev-mode}, @code{auto-fill-function},
-@code{case-fold-search}, @code{comment-column}, @code{ctl-arrow},
-@code{fill-column}, @code{fill-prefix}, @code{indent-tabs-mode},
-@code{left-margin}, @code{mode-line-format}, @code{overwrite-mode},
-@code{selective-display-ellipses}, @code{selective-display},
-@code{tab-width}, and @code{truncate-lines}.  Some other variables are
-always local in every buffer, but they are used for internal
-purposes.@refill
+in one buffer has no effect on other buffers.  Minor modes also work
+by setting variables---normally, each minor mode has one controlling
+variable which is non-@code{nil} when the mode is enabled
+(@pxref{Minor Modes}).  For many minor modes, the controlling variable
+is per buffer, and thus always buffer-local.  Otherwise, you can make
+it local in a specific buffer like any other variable.
 
   A few variables cannot be local to a buffer because they are always
 local to each display instead (@pxref{Multiple Displays}).  If you try to
 make one of these variables buffer-local, you'll get an error message.
 
 @findex kill-local-variable
-  @kbd{M-x kill-local-variable} reads the name of a variable and makes
-it cease to be local to the current buffer.  The global value of the
-variable henceforth is in effect in this buffer.  Setting the major mode
-kills all the local variables of the buffer except for a few variables
+  @kbd{M-x kill-local-variable} makes a specified variable cease to be
+local to the current buffer.  The global value of the variable
+henceforth is in effect in this buffer.  Setting the major mode kills
+all the local variables of the buffer except for a few variables
 specially marked as @dfn{permanent locals}.
 
 @findex setq-default
@@ -1082,9 +1091,9 @@
 
 @cindex shell scripts, and local file variables
   In shell scripts, the first line is used to identify the script
-interpreter, so you cannot put any local variables there.  To accommodate
-for this, when Emacs visits a shell script, it looks for local variable
-specifications in the @emph{second} line.
+interpreter, so you cannot put any local variables there.  To
+accommodate this, Emacs looks for local variable specifications in the
+@emph{second} line when the first line specifies an interpreter.
 
   A @dfn{local variables list} goes near the end of the file, in the
 last page.  (It is often best to put it on a page by itself.)  The local
@@ -1108,9 +1117,9 @@
 ;;; End: ***
 @end example
 
-  As you see, each line starts with the prefix @samp{;;; } and each line
-ends with the suffix @samp{ ***}.  Emacs recognizes these as the prefix
-and suffix based on the first line of the list, by finding them
+  Each line starts with the prefix @samp{;;; } and each line ends with
+the suffix @samp{ ***}.  Emacs recognizes these as the prefix and
+suffix based on the first line of the list, by finding them
 surrounding the magic string @samp{Local Variables:}; then it
 automatically discards them from the other lines of the list.
 
@@ -1155,8 +1164,7 @@
 as the major modes; in fact, you can use it more than once, first to
 set the major mode and then to set minor modes which are specific to
 particular buffers.  But most minor modes should not be specified in
-the file at all, regardless of how, because they represent user
-preferences.
+the file at all, because they represent user preferences.
 
   For example, you may be tempted to try to turn on Auto Fill mode with
 a local variable list.  That is a mistake.  The choice of Auto Fill mode
@@ -1197,10 +1205,10 @@
 
   Emacs normally recognizes certain variables/value pairs as safe.
 For instance, it is safe to give @code{comment-column} or
-@code{fill-column} any integer value.  If a file specifies only safe
-variable/value pairs, Emacs does not ask for confirmation before
-setting them.  Otherwise, you can tell Emacs to record that all the
-variable/value pairs in the file are safe, by typing @kbd{!} at the
+@code{fill-column} any integer value.  If a file specifies only
+known-safe variable/value pairs, Emacs does not ask for confirmation
+before setting them.  Otherwise, you can tell Emacs to record all the
+variable/value pairs in this file as safe, by typing @kbd{!} at the
 confirmation prompt.  When Emacs encounters these variable/value pairs
 subsequently, in the same file or others, it will assume they are
 safe.
@@ -1232,9 +1240,10 @@
 confirmation about processes @code{eval} variables.
 
 @vindex safe-local-eval-forms
-  The @code{safe-local-eval-forms} is a customizable list of eval
-forms which are safe to eval, so Emacs should not ask for
-confirmation to evaluate these forms.
+  But there is an exception.  The @code{safe-local-eval-forms} is a
+customizable list of eval forms which are safe.  Emacs does not ask
+for confirmation when it finds these forms for the @code{eval}
+variable.
 
 @node Key Bindings
 @section Customizing Key Bindings
@@ -1246,7 +1255,7 @@
 
   Recall that a command is a Lisp function whose definition provides for
 interactive use.  Like every Lisp function, a command has a function
-name which usually consists of lower-case letters and hyphens.
+name, which usually consists of lower-case letters and hyphens.
 
 @menu
 * Keymaps::             Generalities.  The global keymap.
@@ -1405,19 +1414,6 @@
 in effect, the definitions in its keymap override both the major
 mode's local keymap and the global keymap.
 
-@vindex c-mode-map
-@vindex lisp-mode-map
-  The local keymaps for Lisp mode and several other major modes always
-exist even when not in use.  These are kept in variables named
-@code{lisp-mode-map} and so on.  For major modes less often used, the
-local keymap is normally constructed only when the mode is used for the
-first time in a session.  This is to save space.  If you wish to change
-one of these keymaps, you must use the major mode's @dfn{mode
-hook}---see below.
-
-  All minor mode keymaps are created in advance.  There is no way to
-defer their creation until the first time the minor mode is enabled.
-
   A local keymap can locally redefine a key as a prefix key by defining
 it as a prefix keymap.  If the key is also defined globally as a prefix,
 then its local and global definitions (both keymaps) effectively
@@ -1433,17 +1429,16 @@
 whole key sequence.  First it checks the minor mode keymaps for minor
 modes that are enabled, then it checks the major mode's keymap, and then
 it checks the global keymap.  This is not precisely how key lookup
-works, but it's good enough for understanding ordinary circumstances.
+works, but it's good enough for understanding the results in ordinary
+circumstances.
 
 @cindex rebinding major mode keys
+  Most major modes construct their keymaps when the mode is used for
+the first time in a session.  If you wish to change one of these
+keymaps, you must use the major mode's @dfn{mode hook}
+(@pxref{Hooks}).
+
 @findex define-key
-  To change the local bindings of a major mode, you must change the
-mode's local keymap.  Normally you must wait until the first time the
-mode is used, because most major modes don't create their keymaps until
-then.  If you want to specify something in your @file{~/.emacs} file to
-change a major mode's bindings, you must use the mode's mode hook to
-delay the change until the mode is first used.
-
   For example, the command @code{texinfo-mode} to select Texinfo mode
 runs the hook @code{texinfo-mode-hook}.  Here's how you can use the hook
 to add local bindings (not very useful, we admit) for @kbd{C-c n} and
@@ -1458,8 +1453,6 @@
                          'forward-paragraph)))
 @end example
 
-  @xref{Hooks}.
-
 @node Minibuffer Maps
 @subsection Minibuffer Keymaps
 
@@ -1545,10 +1538,10 @@
   You can rebind a key that contains more than one event in the same
 way.  Emacs keeps reading the key to rebind until it is a complete key
 (that is, not a prefix key).  Thus, if you type @kbd{C-f} for
-@var{key}, that's the end; the minibuffer is entered immediately to
-read @var{cmd}.  But if you type @kbd{C-x}, another character is read;
-if that is @kbd{4}, another character is read, and so on.  For
-example,
+@var{key}, that's the end; it enters the minibuffer immediately to
+read @var{cmd}.  But if you type @kbd{C-x}, since that's a prefix, it
+reads another character; if that is @kbd{4}, another prefix character,
+it reads one more character, and so on.  For example,
 
 @example
 M-x global-set-key @key{RET} C-x 4 $ spell-other-window @key{RET}
@@ -1572,9 +1565,9 @@
   If you have redefined (or undefined) a key and you subsequently wish
 to retract the change, undefining the key will not do the job---you need
 to redefine the key with its standard definition.  To find the name of
-the standard definition of a key, go to a Fundamental mode buffer and
-use @kbd{C-h c}.  The documentation of keys in this manual also lists
-their command names.
+the standard definition of a key, go to a Fundamental mode buffer in a
+fresh Emacs and use @kbd{C-h c}.  The documentation of keys in this
+manual also lists their command names.
 
   If you want to prevent yourself from invoking a command by mistake, it
 is better to disable the command than to undefine the key.  A disabled
@@ -1669,8 +1662,8 @@
 
 @noindent
 As you see, you represent a multi-character key sequence with a vector
-by listing all of the characters in order within the square brackets that
-delimit the vector.
+by listing all of the characters, in order, within the square brackets
+that delimit the vector.
 
   Language and coding systems can cause problems with key bindings
 for non-@acronym{ASCII} characters.  @xref{Non-ASCII Rebinding}.
@@ -1819,10 +1812,10 @@
 @cindex rebinding non-@acronym{ASCII} keys
 @cindex non-@acronym{ASCII} keys, binding
 
-If your keyboard has keys that send non-@acronym{ASCII}
+  If your keyboard has keys that send non-@acronym{ASCII}
 characters, such as accented letters, rebinding these keys
-must be done by using a vector like this@footnote{Note that
-you should avoid the string syntax for binding
+must be done by using a vector like this@footnote{You must
+avoid the string syntax for binding
 non-@acronym{ASCII} characters, since they will be
 interpreted as meta keys.  @xref{Strings of Events,,,elisp,
 The Emacs Lisp Reference Manual}.}:
@@ -1834,11 +1827,11 @@
 @noindent
 Type @kbd{C-q} followed by the key you want to bind, to insert @var{char}.
 
-Since this puts a non-@acronym{ASCII} character in the @file{.emacs},
+  Since this puts a non-@acronym{ASCII} character in the @file{.emacs},
 you should specify a coding system for that file that supports the
-character in question.  @xref{Init Syntax}.
-
-@strong{Warning:} if you change the keyboard encoding, or change
+character in question.  @xref{Init Non-ASCII}.
+
+  @strong{Warning:} if you change the keyboard encoding, or change
 between multibyte and unibyte mode, or anything that would alter which
 code @kbd{C-q} would insert for that character, you'll need to edit
 the Lisp expression accordingly, to use the character code generated
@@ -1980,19 +1973,19 @@
 @subsection Disabling Commands
 @cindex disabled command
 
-  Disabling a command marks the command as requiring confirmation before it
-can be executed.  The purpose of disabling a command is to prevent
-beginning users from executing it by accident and being confused.
+  Disabling a command menas it requires confirmation before it can be
+executed.  The purpose of disabling a command is to prevent users from
+executing it by accident and being confused.
 
   An attempt to invoke a disabled command interactively in Emacs
-displays a window containing the command's name, its documentation, and
-some instructions on what to do immediately; then Emacs asks for input
-saying whether to execute the command as requested, enable it and
-execute it, or cancel.  If you decide to enable the command, you are
-asked whether to do this permanently or just for the current session.
-(Enabling permanently works by automatically editing your @file{.emacs}
-file.)  You can also type @kbd{!} to enable @emph{all} commands,
-for the current session only.
+displays a window containing the command's name, its documentation,
+and some instructions on what to do immediately; then Emacs asks for
+input saying whether to execute the command as requested, enable it
+and execute it, or cancel.  If you decide to enable the command, you
+must then answer another question---whether to do this permanently, or
+just for the current session.  (Enabling permanently works by
+automatically editing your @file{.emacs} file.)  You can also type
+@kbd{!} to enable @emph{all} commands, for the current session only.
 
   The direct mechanism for disabling a command is to put a
 non-@code{nil} @code{disabled} property on the Lisp symbol for the
@@ -2013,15 +2006,14 @@
 @findex disable-command
 @findex enable-command
   You can make a command disabled either by editing the @file{.emacs}
-file directly or with the command @kbd{M-x disable-command}, which edits
+file directly, or with the command @kbd{M-x disable-command}, which edits
 the @file{.emacs} file for you.  Likewise, @kbd{M-x enable-command}
 edits @file{.emacs} to enable a command permanently.  @xref{Init File}.
 
   If Emacs was invoked with the @option{-q} or @option{--no-init-file}
 options (@pxref{Initial Options}), it will not edit your
-@file{~/.emacs} init file.  This is because editing the init file from
-such a session might overwrite the lines you might have on your init
-file which enable and disable commands.
+@file{~/.emacs} init file.  Doing so could lose information
+because Emacs has not read your init file.
 
   Whether a command is disabled is independent of what key is used to
 invoke it; disabling also applies if the command is invoked using
@@ -2040,7 +2032,7 @@
 some additional information also.
 
   Each major mode has its own syntax table (though related major modes
-sometimes share one syntax table) which it installs in each buffer
+sometimes share one syntax table), which it installs in each buffer
 that uses the mode.  The syntax table installed in the current buffer
 is the one that all commands use, so we call it ``the'' syntax table.
 
@@ -2048,7 +2040,7 @@
 @findex describe-syntax
   To display a description of the contents of the current syntax
 table, type @kbd{C-h s} (@code{describe-syntax}).  The description of
-each character includes both the string you would have to give to
+each character includes the string you would have to give to
 @code{modify-syntax-entry} to set up that character's current syntax,
 starting with the character which designates its syntax class, plus
 some English text to explain its meaning.
@@ -2176,7 +2168,8 @@
 
 @cindex international characters in @file{.emacs}
 @cindex non-@acronym{ASCII} characters in @file{.emacs}
-If you want to include non-@acronym{ASCII} characters in strings in your init
+@anchor{Init Non-ASCII}If you want to include non-@acronym{ASCII}
+characters in strings in your init
 file, you should consider putting a @w{@samp{-*-coding:
 @var{coding-system}-*-}} tag on the first line which states the coding
 system used to save your @file{.emacs}, as explained in @ref{Recognize
@@ -2241,7 +2234,7 @@
 Specify your own email address, if Emacs can't figure it out correctly.
 
 @example
-(setq user-mail-address "coon@@yoyodyne.com")
+(setq user-mail-address "rumsfeld@@torture.gov")
 @end example
 
 Various Emacs packages that need your own email address use the value of
--- a/man/dired.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/dired.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -13,11 +13,12 @@
 to operate on the files listed.
 
     The Dired buffer is ``read-only,'' and inserting text in it is not
-useful, so ordinary printing characters such as @kbd{d} and @kbd{x} are
-used for special Dired commands.  Some Dired commands @dfn{mark} or
-@dfn{flag} the @dfn{current file} (that is, the file on the current
-line); other commands operate on the marked files or on the flagged
-files.
+useful, so ordinary printing characters such as @kbd{d} and @kbd{x}
+are redefined for special Dired commands.  Some Dired commands
+@dfn{mark} or @dfn{flag} the @dfn{current file} (that is, the file on
+the current line); other commands operate on the marked files or on
+the flagged files.  You first mark certain files in order to operate
+on all of them with on command.
 
   The Dired-X package provides various extra features for Dired mode.
 @xref{Top, Dired-X,,dired-x, Dired Extra Version 2 User's Manual}.
@@ -40,8 +41,6 @@
 * Updating: Dired Updating.   Discarding lines for files of no interest.
 * Find: Dired and Find.	      Using `find' to choose the files for Dired.
 * Wdired::                    Operating on files by editing the Dired buffer.
-* Tumme::                     Image file and thumbnail viewing and 
-                              manipulation from the Dired buffer.
 * Misc: Misc Dired Features.  Various other features.
 @end menu
 
@@ -53,18 +52,20 @@
 @vindex dired-listing-switches
   To invoke Dired, do @kbd{C-x d} or @kbd{M-x dired}.  The command
 reads a directory name or wildcard file name pattern as a minibuffer
-argument to specify which files to list.  @kbd{C-x C-f} given a
+argument to specify the files to list.  @kbd{C-x C-f} given a
 directory name also invokes Dired.  Where @code{dired} differs from
 @code{list-directory} is that it puts the buffer into Dired mode, so
 that the special commands of Dired are available.
 
   The variable @code{dired-listing-switches} specifies the options to
-give to @code{ls} for listing the directory; this string @emph{must} contain
-@samp{-l}.  If you use a numeric prefix argument with the @code{dired}
-command, you can specify the @code{ls} switches with the minibuffer
-before you enter the directory specification.  No matter how they are
-specified, the @code{ls} switches should all be short options (that
-is, single characters) requiring no arguments.
+give to @code{ls} for listing the directory; this string @emph{must}
+contain @samp{-l}.  If you use a numeric prefix argument with the
+@code{dired} command, you can specify the @code{ls} switches with the
+minibuffer before you enter the directory specification.  No matter
+how they are specified, the @code{ls} switches can include short
+options (that is, single characters) requiring no arguments, and long
+options (starting with @samp{--}) whose arguments are specified with
+@samp{=}.
 
 @findex dired-other-window
 @kindex C-x 4 d
@@ -81,10 +82,9 @@
 @kindex C-n @r{(Dired)}
 @kindex C-p @r{(Dired)}
   All the usual Emacs cursor motion commands are available in Dired
-buffers.  Some special-purpose cursor motion commands are also
-provided.  The keys @kbd{C-n} and @kbd{C-p} are redefined to put the
-cursor at the beginning of the file name on the line, rather than at the
-beginning of the line.
+buffers.  The keys @kbd{C-n} and @kbd{C-p} are redefined to put the
+cursor at the beginning of the file name on the line, rather than at
+the beginning of the line.
 
 @kindex SPC @r{(Dired)}
   For extra convenience, @key{SPC} and @kbd{n} in Dired are equivalent
@@ -121,42 +121,47 @@
 
 @kindex d @r{(Dired)}
 @findex dired-flag-file-deletion
-  You can flag a file for deletion by moving to the line describing the
-file and typing @kbd{d} (@code{dired-flag-file-deletion}).  The deletion flag is visible as a @samp{D} at
-the beginning of the line.  This command moves point to the next line,
-so that repeated @kbd{d} commands flag successive files.  A numeric
-argument serves as a repeat count.
-
-@cindex recursive deletion
-@vindex dired-recursive-deletes
-  The variable @code{dired-recursive-deletes} controls whether the
-delete command will delete non-empty directories (including their
-contents).  The default is to delete only empty directories.
+  You can flag a file for deletion by moving to the line describing
+the file and typing @kbd{d} (@code{dired-flag-file-deletion}).  The
+deletion flag is visible as a @samp{D} at the beginning of the line.
+This command moves point to the next line, so that repeated @kbd{d}
+commands flag successive files.  A numeric argument serves as a repeat
+count.
 
 @kindex u @r{(Dired deletion)}
 @kindex DEL @r{(Dired)}
-  The files are flagged for deletion rather than deleted immediately to
-reduce the danger of deleting a file accidentally.  Until you direct
-Dired to delete the flagged files, you can remove deletion flags using
-the commands @kbd{u} and @key{DEL}.  @kbd{u} (@code{dired-unmark}) works
-just like @kbd{d}, but removes flags rather than making flags.
-@key{DEL} (@code{dired-unmark-backward}) moves upward, removing flags;
-it is like @kbd{u} with argument @minus{}1.
+  The reason for flagging files for deletion, rather than deleting
+files immediately, is to reduce the danger of deleting a file
+accidentally.  Until you direct Dired to delete the flagged files, you
+can remove deletion flags using the commands @kbd{u} and @key{DEL}.
+@kbd{u} (@code{dired-unmark}) works just like @kbd{d}, but removes
+flags rather than making flags.  @key{DEL}
+(@code{dired-unmark-backward}) moves upward, removing flags; it is
+like @kbd{u} with argument @minus{}1.
 
 @kindex x @r{(Dired)}
 @findex dired-do-flagged-delete
 @cindex expunging (Dired)
-  To delete the flagged files, type @kbd{x} (@code{dired-do-flagged-delete}).
-(This is also known as @dfn{expunging}.)
-This command first displays a list of all the file names flagged for
-deletion, and requests confirmation with @kbd{yes}.  If you confirm,
-Dired deletes the flagged files, then deletes their lines from the text
-of the Dired buffer.  The shortened Dired buffer remains selected.
+  To delete the flagged files, type @kbd{x}
+(@code{dired-do-flagged-delete}).  (This is also known as
+@dfn{expunging}.)  This command first displays a list of all the file
+names flagged for deletion, and requests confirmation with @kbd{yes}.
+If you confirm, Dired deletes the flagged files, then deletes their
+lines from the text of the Dired buffer.  The Dired buffer, with
+somewhat fewer lines, remains selected.
 
   If you answer @kbd{no} or quit with @kbd{C-g} when asked to confirm, you
 return immediately to Dired, with the deletion flags still present in
 the buffer, and no files actually deleted.
 
+@cindex recursive deletion
+@vindex dired-recursive-deletes
+  You can delete empty directories just like other files, but normally
+Dired cannot delete directories that are nonempty.  If the variable
+@code{dired-recursive-deletes} is non-@code{nil}, then Dired can
+delete nonempty directories including all their contents.  That can
+be somewhat risky.
+
 @node Flagging Many Files
 @section Flagging Many Files at Once
 @cindex flagging many files for deletion (in Dired)
@@ -171,8 +176,8 @@
 (@pxref{Backup}).
 
 @item &
-Flag for deletion all files with certain kinds of names, names that
-suggest you could easily create the files again.
+Flag for deletion all files with certain kinds of names which suggest
+you could easily create those files again.
 
 @item .@: @r{(Period)}
 Flag excess numeric backup files for deletion.  The oldest and newest
@@ -204,14 +209,14 @@
 @findex dired-flag-auto-save-files
 @cindex deleting auto-save files
   @kbd{#} (@code{dired-flag-auto-save-files}) flags for deletion all
-files whose names look like auto-save files (@pxref{Auto Save})---that
-is, files whose names begin and end with @samp{#}.
+files whose names look like auto-save files---that is, files whose
+names begin and end with @samp{#}.  @xref{Auto Save}.
 
 @kindex ~ @r{(Dired)}
 @findex dired-flag-backup-files
-  @kbd{~} (@code{dired-flag-backup-files}) flags for deletion all files
-whose names say they are backup files (@pxref{Backup})---that is, files
-whose names end in @samp{~}.
+  @kbd{~} (@code{dired-flag-backup-files}) flags for deletion all
+files whose names say they are backup files---that is, files whose
+names end in @samp{~}.  @xref{Backup}.
 
 @kindex . @r{(Dired)}
 @vindex dired-kept-versions
@@ -235,8 +240,9 @@
   The @kbd{% d} command flags all files whose names match a specified
 regular expression (@code{dired-flag-files-regexp}).  Only the
 non-directory part of the file name is used in matching.  You can use
-@samp{^} and @samp{$} to anchor matches.  You can exclude subdirectories
-by hiding them (@pxref{Hiding Subdirectories}).
+@samp{^} and @samp{$} to anchor matches.  You can exclude certain
+subdirectories from marking by hiding them while you use @kbd{% d}.
+@xref{Hiding Subdirectories}.
 
 @node Dired Visiting
 @section Visiting Files in Dired
@@ -301,8 +307,8 @@
 @kindex ^ @r{(Dired)}
 @findex dired-up-directory
 Visit the parent directory of the current directory
-(@code{dired-up-directory}).  This is more convenient than moving to
-the parent directory's line and typing @kbd{f} there.
+(@code{dired-up-directory}).  This is equivalent to moving to the line
+for @file{..} and typing @kbd{f} there.
 @end table
 
 @node Marks vs Flags
@@ -311,12 +317,13 @@
 @cindex marking many files (in Dired)
   Instead of flagging a file with @samp{D}, you can @dfn{mark} the
 file with some other character (usually @samp{*}).  Most Dired
-commands to operate on files use the files marked with @samp{*}, the
-exception being @kbd{x} which deletes the flagged files.
+commands to operate on files use the files marked with @samp{*}.  The
+only command that operates on flagged flies is @kbd{x}, which expunges
+them.
 
-  Here are some commands for marking with @samp{*}, or for unmarking or
-operating on marks.  (@xref{Dired Deletion}, for commands to flag and
-unflag files.)
+  Here are some commands for marking with @samp{*}, for unmarking, and
+for operating on marks.  (@xref{Dired Deletion}, for commands to flag
+and unflag files.)
 
 @table @kbd
 @item m
@@ -348,7 +355,7 @@
 @kindex * / @r{(Dired)}
 @findex dired-mark-directories
 @cindex marking subdirectories (in Dired)
-Mark with @samp{*} all files which are actually directories, except for
+Mark with @samp{*} all files which are directories, except for
 @file{.} and @file{..} (@code{dired-mark-directories}).  With a numeric
 argument, unmark all those files.
 
@@ -455,11 +462,12 @@
 Mark (with @samp{*}) all files whose names match the regular expression
 @var{regexp} (@code{dired-mark-files-regexp}).  This command is like
 @kbd{% d}, except that it marks files with @samp{*} instead of flagging
-with @samp{D}.  @xref{Flagging Many Files}.
+with @samp{D}.
 
 Only the non-directory part of the file name is used in matching.  Use
-@samp{^} and @samp{$} to anchor matches.  Exclude subdirectories by
-hiding them (@pxref{Hiding Subdirectories}).
+@samp{^} and @samp{$} to anchor matches.  You can exclude
+subdirectories by temporarily hiding them (@pxref{Hiding
+Subdirectories}).
 
 @item % g @var{regexp} @key{RET}
 @findex dired-mark-files-containing-regexp
@@ -471,16 +479,21 @@
 @kbd{% m}, except that it searches the file contents instead of the file
 name.
 
-@item C-_
+@item C-x u
+@itemx C-_
+@itemx C-/
 @kindex C-_ @r{(Dired)}
 @findex dired-undo
 Undo changes in the Dired buffer, such as adding or removing
 marks (@code{dired-undo}).  @emph{This command does not revert the
 actual file operations, nor recover lost files!}  It just undoes
-changes in the buffer itself.  For example, if used after renaming one
-or more files, @code{dired-undo} restores the original names, which
-will get the Dired buffer out of sync with the actual contents of the
-directory.
+changes in the buffer itself.
+
+In some cases, using this after commands that operate on files can
+cause trouble.  For example, after renaming one or more files,
+@code{dired-undo} restores the original names in the Dired buffer,
+which gets the Dired buffer out of sync with the actual contents of
+the directory.
 @end table
 
 @node Operating on Files
@@ -490,8 +503,8 @@
   This section describes the basic Dired commands to operate on one file
 or several files.  All of these commands are capital letters; all of
 them use the minibuffer, either to read an argument or to ask for
-confirmation, before they act.  All of them give you several ways to
-specify which files to manipulate:
+confirmation, before they act.  All of them let you specify the
+files to manipulate in these ways:
 
 @itemize @bullet
 @item
@@ -508,6 +521,10 @@
 Otherwise, the command operates on the current file only.
 @end itemize
 
+@noindent
+Certain other Dired commands, such as @kbd{!} and the @samp{%}
+commands, use the same conventions to decide which files to work on.
+
 @vindex dired-dwim-target
 @cindex two directories (in Dired)
   Commands which ask for a destination directory, such as those which
@@ -517,9 +534,7 @@
 is non-@code{nil}, and if there is another Dired buffer displayed in the
 next window, that other buffer's directory is suggested instead.
 
-  Here are the file-manipulating commands that operate on files in this
-way.  (Some other Dired commands, such as @kbd{!} and the @samp{%}
-commands, also use these conventions to decide which files to work on.)
+  Here are the file-manipulating Dired commands that operate on files.
 
 @table @kbd
 @findex dired-do-copy
@@ -531,15 +546,15 @@
 name.
 
 @vindex dired-copy-preserve-time
-If @code{dired-copy-preserve-time} is non-@code{nil}, then copying with
-this command sets the modification time of the new file to be the same
-as that of the old file.
+If @code{dired-copy-preserve-time} is non-@code{nil}, then copying
+with this command preserves the modification time of the old file in
+the copy.
 
 @vindex dired-recursive-copies
 @cindex recursive copying
-The variable @code{dired-recursive-copies} controls whether
-directories are copied recursively.  The default is to not copy
-recursively, which means that directories cannot be copied.
+The variable @code{dired-recursive-copies} controls whether to copy
+directories recursively.  The default is @code{nil}, which means that
+directories cannot be copied.
 
 @item D
 @findex dired-do-delete
@@ -608,7 +623,8 @@
 @kindex T @r{(Dired)}
 @cindex changing file time (in Dired)
 @item T @var{timestamp} @key{RET}
-Change the time of the specified files (@code{dired-do-touch}).
+Touch the specified files (@code{dired-do-touch}).  This means
+updating their modification times to the present time.
 
 @findex dired-do-print
 @kindex P @r{(Dired)}
@@ -625,7 +641,7 @@
 @cindex compressing files (in Dired)
 @item Z
 Compress the specified files (@code{dired-do-compress}).  If the file
-appears to be a compressed file already, it is uncompressed instead.
+appears to be a compressed file already, uncompress it instead.
 
 @findex dired-do-load
 @kindex L @r{(Dired)}
@@ -666,12 +682,6 @@
 more matches.  @xref{Tags Search}.
 @end table
 
-@kindex + @r{(Dired)}
-@findex dired-create-directory
-  One special file-operation command is @kbd{+}
-(@code{dired-create-directory}).  This command reads a directory name and
-creates the directory if it does not already exist.
-
 @node Shell Commands in Dired
 @section Shell Commands in Dired
 @cindex shell commands, Dired
@@ -679,12 +689,16 @@
 @findex dired-do-shell-command
 @kindex ! @r{(Dired)}
 @kindex X @r{(Dired)}
-The Dired command @kbd{!} (@code{dired-do-shell-command}) reads a shell
-command string in the minibuffer and runs that shell command on all the
-specified files.  @kbd{X} is a synonym for @kbd{!}.  You can specify the
-files to operate on in the usual ways for Dired commands
-(@pxref{Operating on Files}).  There are two ways of applying a shell
-command to multiple files:
+The Dired command @kbd{!} (@code{dired-do-shell-command}) reads a
+shell command string in the minibuffer and runs that shell command on
+all the specified files.  (@kbd{X} is a synonym for @kbd{!}.)  You can
+specify the files to operate on in the usual ways for Dired commands
+(@pxref{Operating on Files}).
+
+  The working directory for the shell command is the top-level directory
+of the Dired buffer.
+
+  There are two ways of applying a shell command to multiple files:
 
 @itemize @bullet
 @item
@@ -711,12 +725,12 @@
 
 @item
 However, if the command string contains @samp{?} surrounded by
-whitespace, the current file name is substituted for @samp{?}  (rather
+whitespace, the current file name is substituted for @samp{?} (rather
 than added at the end).  You can use @samp{?} this way more than once
 in the command, and the same file name replaces each occurrence.
 @end itemize
 
-To iterate over the file names in a more complicated fashion, use an
+  To iterate over the file names in a more complicated fashion, use an
 explicit shell loop.  For example, here is how to uuencode each file,
 making the output file name by appending @samp{.uu} to the input file
 name:
@@ -725,11 +739,8 @@
 for file in * ; do uuencode "$file" "$file" >"$file".uu; done
 @end example
 
-The working directory for the shell command is the top-level directory
-of the Dired buffer.
-
-The @kbd{!} command does not attempt to update the Dired buffer to show
-new or modified files, because it doesn't really understand shell
+  The @kbd{!} command does not attempt to update the Dired buffer to
+show new or modified files, because it doesn't understand shell
 commands, and does not know what files the shell command changed.  Use
 the @kbd{g} command to update the Dired buffer (@pxref{Dired
 Updating}).
@@ -738,7 +749,8 @@
 @section Transforming File Names in Dired
 
   This section describes Dired commands which alter file names in a
-systematic way.
+systematic way.  Each command operates on some or all of the marked
+files, using a new name made by transforming the existing name.
 
   Like the basic Dired file-manipulation commands (@pxref{Operating on
 Files}), the commands described here operate either on the next
@@ -750,7 +762,7 @@
 @emph{interactively}: they ask you to confirm the operation for each
 candidate file.  Thus, you can select more files than you actually
 need to operate on (e.g., with a regexp that matches many files), and
-then refine the selection by typing @kbd{y} or @kbd{n} when the
+then filter the selected names by typing @kbd{y} or @kbd{n} when the
 command prompts for confirmation.
 
 @table @kbd
@@ -787,17 +799,16 @@
 from the name of the old file.
 @end table
 
-  The four regular-expression substitution commands effectively perform
-a search-and-replace on the selected file names in the Dired buffer.
-They read two arguments: a regular expression @var{from}, and a
-substitution pattern @var{to}.
-
-  The commands match each ``old'' file name against the regular
-expression @var{from}, and then replace the matching part with @var{to}.
-You can use @samp{\&} and @samp{\@var{digit}} in @var{to} to refer to
-all or part of what the pattern matched in the old file name, as in
-@code{replace-regexp} (@pxref{Regexp Replace}).  If the regular expression
-matches more than once in a file name, only the first match is replaced.
+  The four regular-expression substitution commands effectively
+perform a search-and-replace on the selected file names.  They read
+two arguments: a regular expression @var{from}, and a substitution
+pattern @var{to}; they match each ``old'' file name against
+@var{from}, and then replace the matching part with @var{to}.  You can
+use @samp{\&} and @samp{\@var{digit}} in @var{to} to refer to all or
+part of what the pattern matched in the old file name, as in
+@code{replace-regexp} (@pxref{Regexp Replace}).  If the regular
+expression matches more than once in a file name, only the first match
+is replaced.
 
   For example, @kbd{% R ^.*$ @key{RET} x-\& @key{RET}} renames each
 selected file by prepending @samp{x-} to its name.  The inverse of this,
@@ -809,15 +820,16 @@
   Normally, the replacement process does not consider the files'
 directory names; it operates on the file name within the directory.  If
 you specify a numeric argument of zero, then replacement affects the
-entire absolute file name including directory name.  (Non-zero
+entire absolute file name including directory name.  (A non-zero
 argument specifies the number of files to operate on.)
 
-  Often you will want to select the set of files to operate on using the
-same @var{regexp} that you will use to operate on them.  To do this,
-mark those files with @kbd{% m @var{regexp} @key{RET}}, then use the
-same regular expression in the command to operate on the files.  To make
-this easier, the @kbd{%} commands to operate on files use the last
-regular expression specified in any @kbd{%} command as a default.
+  You may want to select the set of files to operate on using the same
+regexp @var{from} that you will use to operate on them.  To do this,
+mark those files with @kbd{% m @var{from} @key{RET}}, then use the
+same regular expression in the command to operate on the files.  To
+make this more convenient, the @kbd{%} commands to operate on files
+use the last regular expression specified in any @kbd{%} command as a
+default.
 
 @node Comparison in Dired
 @section File Comparison with Dired
@@ -825,19 +837,20 @@
 @cindex compare files (in Dired)
 
   Here are two Dired commands that compare specified files using
-@code{diff}.
+@code{diff}.  They show the output in a buffer using Diff mode
+(@pxref{Comparing Files}).
 
 @table @kbd
 @item =
 @findex dired-diff
 @kindex = @r{(Dired)}
-Compare the current file (the file at point) with another file (the file
-at the mark) using the @code{diff} program (@code{dired-diff}).  The
-file at the mark is the first argument of @code{diff}, and the file at
-point is the second argument.  Use @kbd{C-@key{SPC}}
+Compare the current file (the file at point) with another file (the
+file at the mark) using the @code{diff} program (@code{dired-diff}).
+The file at the mark is the first argument of @code{diff}, and the
+file at point is the second argument.  This refers to the ordinary
+Emacs mark, not Dired marks; use @kbd{C-@key{SPC}}
 (@code{set-mark-command}) to set the mark at the first file's line
-(@pxref{Setting Mark}), since @code{dired-diff} ignores the files marked
-with the Dired's @kbd{m} command.
+(@pxref{Setting Mark}).
 
 @findex dired-backup-diff
 @kindex M-= @r{(Dired)}
@@ -845,7 +858,7 @@
 Compare the current file with its latest backup file
 (@code{dired-backup-diff}).  If the current file is itself a backup,
 compare it with the file it is a backup of; this way, you can compare
-a file with any backup version of your choice.
+a file with any one of its backups.
 
 The backup file is the first file given to @code{diff}.
 @end table
@@ -864,9 +877,8 @@
 in the minibuffer.)  That produces a recursive directory listing showing
 all subdirectories at all levels.
 
-  But usually all the subdirectories are too many; usually you will
-prefer to include specific subdirectories only.  You can do this with
-the @kbd{i} command:
+  More often, you will want to show only specific subdirectories.  You
+can do this with the @kbd{i} command:
 
 @table @kbd
 @findex dired-maybe-insert-subdir
@@ -950,7 +962,7 @@
 
 @cindex hiding in Dired (Dired)
   @dfn{Hiding} a subdirectory means to make it invisible, except for its
-header line, via selective display (@pxref{Selective Display}).
+header line.
 
 @table @kbd
 @item $
@@ -974,7 +986,8 @@
 subdirectory.  For example, the commands to operate on marked files
 ignore files in hidden directories even if they are marked.  Thus you
 can use hiding to temporarily exclude subdirectories from operations
-without having to remove the markers.
+without having to remove the Dired marks on files in those
+subdirectories.
 
 @node Dired Updating
 @section Updating the Dired Buffer
@@ -990,7 +1003,8 @@
 Update the entire contents of the Dired buffer (@code{revert-buffer}).
 
 @item l
-Update the specified files (@code{dired-do-redisplay}).
+Update the specified files (@code{dired-do-redisplay}).  You specify the
+files for @kbd{l} in the same way as for file operations.
 
 @item k
 Delete the specified @emph{file lines}---not the files, just the lines
@@ -1034,9 +1048,9 @@
 
   If you use @kbd{k} with a numeric prefix argument to kill the line
 for a file that is a directory, which you have inserted in the Dired
-buffer as a subdirectory, then this deletes that subdirectory from the
-buffer as well.  Typing @kbd{C-u k} on the header line for a subdirectory
-is another way to delete a subdirectory from the Dired buffer.
+buffer as a subdirectory, it deletes that subdirectory from the buffer
+as well.  Typing @kbd{C-u k} on the header line for a subdirectory
+also deletes the subdirectory from the Dired buffer.
 
   The @kbd{g} command brings back any individual lines that you have
 killed in this way, but not subdirectories---you must use @kbd{i} to
@@ -1068,7 +1082,7 @@
 @var{pattern}, and chooses all the files in @var{directory} or its
 subdirectories whose individual names match @var{pattern}.
 
-  The files thus chosen are displayed in a Dired buffer in which the
+  The files thus chosen are displayed in a Dired buffer, in which the
 ordinary Dired commands are available.
 
 @findex find-grep-dired
@@ -1101,10 +1115,10 @@
 @cindex file database (locate)
 @vindex locate-command
   @kbd{M-x locate} provides a similar interface to the @code{locate}
-program.  @kbd{M-x locate-with-filter} is similar, but keeps only lines
-matching a given regular expression.
+program.  @kbd{M-x locate-with-filter} is similar, but keeps only files
+whose names match a given regular expression.
 
-  These buffers don't work entirely like ordinary Dired buffers.  File
+  These buffers don't work entirely like ordinary Dired buffers: file
 operations work, but do not always automatically update the buffer.
 Reverting the buffer with @kbd{g} deletes all inserted subdirectories,
 and erases all flags and marks.
@@ -1131,104 +1145,26 @@
   Apart from simply renaming files, you can move a file to another
 directory by typing in the new file name (either absolute or
 relative).  To mark a file for deletion, delete the entire filename.
-To change the target of a symbolic link, just edit the target name
-displayed next to the link name.
+To change the target of a symbolic link, edit the link target name
+which appears next to the link name.
 
   The rest of the text in the buffer, such as the file sizes and
 modification dates, is marked read-only, so you can't edit it.
 However, if you set @code{wdired-allow-to-change-permissions} to
-@code{t}, the file permission bits can also be edited.  For example,
-you can change @samp{-rw-r--r--} to @samp{-rw-rw-rw-} to make a file
+@code{t}, you can edit the file permissions.  For example, you can
+change @samp{-rw-r--r--} to @samp{-rw-rw-rw-} to make a file
 world-writable.  These changes also take effect when you type @kbd{C-c
 C-c}.
 
-@node Tumme
-@section Thumbnail and image file viewing and manipulation
-
-@cindex tumme mode
-
-  Tumme provides for simple viewing of thumbnails of image files.  It
-provides viewing of the original file, sized or in full size, inside
-Emacs or in an external viewer.
-
-  Tumme aims to be both easy to use for a beginner but also powerful
-and useful to an experienced user.
-
-  The quickest way to try out Tumme is to use the command
-@code{tumme}.  It will prompt for a directory where there are images
-files.  All images in that directory will get thumbnail files created
-for them, and the thumbnails will be displayed in the ``thumbnail
-buffer''.
-
-  If the directory contains many image files and becayse thumbnails
-are created on the fly before they can be displayed, the above command
-might take a long time, especially the first time (consecutive
-viewings will use the cached thumbnail files).  Also, if the number of
-image files is higher than @code{tumme-show-all-from-dir-max-files},
-the command will be aborted.  To work around this you can instead mark
-the files you want to look at, using @kbd{m} as usual in Dired, and
-then type @kbd{C-t d} (@code{tumme-display-thumbs}).
-
-  Regardless of which command you chose to display the thumbnails, a
-new buffer will open up, displaying thumbnail images of the files that
-were marked in dired.  The new buffer will be the active one.
-
-  With point in the thumbnail buffer, type @kbd{RET}
-(@code{tumme-display-thumbnail-original-image}) to display a sized
-version of it in another window.  The image will be sized to fit the
-window.  Use the arrow keys to move around in the buffer.  For easy
-browing, type @kbd{SPC} (@code{tumme-display-next-thumbnail-original})
-to advance and display the next image.  Typing @kbd{DEL}
-(@code{tumme-display-previous-thumbnail-original}) backs up to the
-previous thumbnail and displays that instead.
-
-  If you want to see the image in its original size, either provide a
-prefix argument (@kbd{C-u}) before pressing @kbd{RET}, or type
-@kbd{C-return} (@code{tumme-thumbnail-display-external}) to display
-the image in an external viewer.  To use the latter,
-@code{tumme-external-viewer} must be configured.
-
-  If you find in image that you want to delete, type @kbd{d}
-(@code{tumme-flag-thumb-original-file}) and the file will be flagged
-for deletion in the dired buffer.  If you just want visually to delete
-the thumbnail image from the thumbnail buffer, type @kbd{C-d}
-(@code{tumme-delete-char}).
-
-  More advanced features include commands for using ``tags''.  ``Tag''
-is just another word for ``keyword'', ``label'' or ``category''.  In
-short, it is meta data used to categorize an image file.  Commands
-exist to add tags for one or many image files from dired, to mark
-files having a certain tag in Dired and to remove tags from files.
-The tags put on image files are stored in a database file (currently a
-plain text file).
-
-  To tag image files, mark them in the dired buffer and type @kbd{C-t
-t} (@code{tumme-tag-files}).  You will be prompted for a tag. To mark
-files having a certain tag, type @kbd{C-t f}
-(@code{tumme-mark-tagged-files}). After marking image files with a
-certain tag, they can be viewed as explained earlier, by typing
-@key{C-t d}.
-
-  You can also tag a file from the thumbnail buffer by typing @kbd{t
-t} and remove it by typing @kbd{t r}.  There is also a special ``tag''
-called ``comment'' for each file (it is not a tag in the exact same
-sense as the other tags, it is handled slightly different).  That is
-used to enter a comment or description about the image.  You comment a
-file from the thumbnail buffer by typing @kbd{c}.  You will be
-prompted for a comment.  Comments can also be added from Dired, and
-then also to multiple files at once, by typing @kbd{C-t c}
-(@code{tumme-dired-comment-files}).
-
-  Tumme also provides simple image manipulation commands, like
-rotating thumbnails and original image files.  In the thumbnail
-buffer, type @kbd{L} to rotate the original image 90 degrees anti
-clockwise, and @kbd{R} to rotate it 90 degrees clockwise.  This
-rotation will be done lossless (the image quality will not be reduced)
-and needs an external utility called JpegTRAN to work.
-
 @node Misc Dired Features
 @section Other Dired Features
 
+@kindex + @r{(Dired)}
+@findex dired-create-directory
+  An unusual Dired file-operation command is @kbd{+}
+(@code{dired-create-directory}).  This command reads a directory name,
+and creates the directory if it does not already exist.
+
 @cindex Adding to the kill ring in Dired.
 @kindex w @r{(Dired)}
 @findex dired-copy-filename-as-kill
@@ -1236,16 +1172,18 @@
 names of the marked (or next @var{n}) files into the kill ring, as if
 you had killed them with @kbd{C-w}.  The names are separated by a space.
 
+  With a zero prefix argument, this uses the absolute file name of
+each marked file.  With just @kbd{C-u} as the prefix argument, it uses
+file names relative to the Dired buffer's default directory.  (This
+can still contain slashes if in a subdirectory.)  As a special case,
+if point is on a directory headerline, @kbd{w} gives you the absolute
+name of that directory.  Any prefix argument or marked files are
+ignored in this case.
+
   The main purpose of this command is so that you can yank the file
 names into arguments for other Emacs commands.  It also displays what
-was pushed onto the kill ring, so you can use it to display the list
-of currently marked files in the echo area.  With a zero prefix
-argument, this uses the absolute file name of each marked file.  With
-just @kbd{C-u} as the prefix argument, it uses file names relative to
-the Dired buffer's default directory.  (This can still contain slashes
-if in a subdirectory.)  As a special case, if point is on a directory
-headerline, @kbd{w} gives you the absolute name of that directory.
-Any prefix argument or marked files are ignored in this case.
+it added to the kill ring, so you can use it to display the list of
+currently marked files in the echo area.
 
 @findex dired-compare-directories
   The command @kbd{M-x dired-compare-directories} is used to compare
--- a/man/emacs-xtra.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/emacs-xtra.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -64,6 +64,7 @@
 * Picture Mode::                  Editing pictures made up of characters
                                     using the quarter-plane screen model.
 * Fortran::                       Fortran mode and its special features.
+* MS-DOG::                        
 * Index::
 @end menu
 
@@ -2406,6 +2407,687 @@
   Type @samp{;?} or @samp{;C-h} to display a list of all the built-in
 Fortran abbrevs and what they stand for.
 
+
+@node MS-DOG
+@chapter Emacs and MS-DOS
+@cindex MS-DOG
+@cindex MS-DOS peculiarities
+
+  This section briefly describes the peculiarities of using Emacs on
+the MS-DOS ``operating system'' (also known as ``MS-DOG'').
+Information about Emacs and Microsoft's current operating system
+Windows (also known as ``Losedows) is in the main Emacs manual
+(@pxref{Emacs and Microsoft Systems,,, emacs, the Emacs Manual}).
+
+  If you build Emacs for MS-DOS, the binary will also run on Windows
+3.X, Windows NT, Windows 9X/ME, Windows 2000, or OS/2 as a DOS
+application; all of this chapter applies for all of those systems, if
+you use an Emacs that was built for MS-DOS.
+
+  @xref{Text and Binary,,,emacs, the Emacs Manual}, for information
+about Emacs' special handling of text files under MS-DOS (and
+Windows).
+
+@menu
+* Keyboard: MS-DOS Keyboard.   Keyboard conventions on MS-DOS.
+* Mouse: MS-DOS Mouse.         Mouse conventions on MS-DOS.
+* Display: MS-DOS Display.     Fonts, frames and display size on MS-DOS.
+* Files: MS-DOS File Names.    File name conventions on MS-DOS.
+* Printing: MS-DOS Printing.   How to specify the printer on MS-DOS.
+* I18N: MS-DOS and MULE.       Support for internationalization on MS-DOS.
+* Processes: MS-DOS Processes. Running subprocesses on MS-DOS.
+@end menu
+
+@node MS-DOS Keyboard
+@section Keyboard Usage on MS-DOS
+
+@kindex DEL @r{(MS-DOS)}
+@kindex BS @r{(MS-DOS)}
+  The key that is called @key{DEL} in Emacs (because that's how it is
+designated on most workstations) is known as @key{BS} (backspace) on a
+PC.  That is why the PC-specific terminal initialization remaps the
+@key{BS} key to act as @key{DEL}; the @key{DELETE} key is remapped to act
+as @kbd{C-d} for the same reasons.
+
+@kindex C-g @r{(MS-DOS)}
+@kindex C-BREAK @r{(MS-DOS)}
+@cindex quitting on MS-DOS
+  Emacs built for MS-DOS recognizes @kbd{C-@key{BREAK}} as a quit
+character, just like @kbd{C-g}.  This is because Emacs cannot detect
+that you have typed @kbd{C-g} until it is ready for more input.  As a
+consequence, you cannot use @kbd{C-g} to stop a running command
+(@pxref{Quitting,,,emacs, the Emacs Manual}).  By contrast,
+@kbd{C-@key{BREAK}} @emph{is} detected as soon as you type it (as
+@kbd{C-g} is on other systems), so it can be used to stop a running
+command and for emergency escape (@pxref{Emergency Escape,,,emacs, the
+Emacs Manual}).
+
+@cindex Meta (under MS-DOS)
+@cindex Hyper (under MS-DOS)
+@cindex Super (under MS-DOS)
+@vindex dos-super-key
+@vindex dos-hyper-key
+  The PC keyboard maps use the left @key{ALT} key as the @key{META} key.
+You have two choices for emulating the @key{SUPER} and @key{HYPER} keys:
+choose either the right @key{CTRL} key or the right @key{ALT} key by
+setting the variables @code{dos-hyper-key} and @code{dos-super-key} to 1
+or 2 respectively.  If neither @code{dos-super-key} nor
+@code{dos-hyper-key} is 1, then by default the right @key{ALT} key is
+also mapped to the @key{META} key.  However, if the MS-DOS international
+keyboard support program @file{KEYB.COM} is installed, Emacs will
+@emph{not} map the right @key{ALT} to @key{META}, since it is used for
+accessing characters like @kbd{~} and @kbd{@@} on non-US keyboard
+layouts; in this case, you may only use the left @key{ALT} as @key{META}
+key.
+
+@kindex C-j @r{(MS-DOS)}
+@vindex dos-keypad-mode
+  The variable @code{dos-keypad-mode} is a flag variable that controls
+what key codes are returned by keys in the numeric keypad.  You can also
+define the keypad @key{ENTER} key to act like @kbd{C-j}, by putting the
+following line into your @file{_emacs} file:
+
+@smallexample
+;; @r{Make the @key{ENTER} key from the numeric keypad act as @kbd{C-j}.}
+(define-key function-key-map [kp-enter] [?\C-j])
+@end smallexample
+
+@node MS-DOS Mouse
+@section Mouse Usage on MS-DOS
+
+@cindex mouse support under MS-DOS
+  Emacs on MS-DOS supports a mouse (on the default terminal only).
+The mouse commands work as documented, including those that use menus
+and the menu bar (@pxref{Menu Bar,,,emacs, the Emacs Manual}).  Scroll
+bars don't work in MS-DOS Emacs.  PC mice usually have only two
+buttons; these act as @kbd{Mouse-1} and @kbd{Mouse-2}, but if you
+press both of them together, that has the effect of @kbd{Mouse-3}.  If
+the mouse does have 3 buttons, Emacs detects that at startup, and all
+the 3 buttons function normally, as on X.
+
+  Help strings for menu-bar and pop-up menus are displayed in the echo
+area when the mouse pointer moves across the menu items.  Highlighting
+of mouse-sensitive text (@pxref{Mouse References,,,emacs, the Emacs
+Manual}) is also supported.
+
+@cindex mouse, set number of buttons
+@findex msdos-set-mouse-buttons
+  Some versions of mouse drivers don't report the number of mouse
+buttons correctly.  For example, mice with a wheel report that they
+have 3 buttons, but only 2 of them are passed to Emacs; the clicks on
+the wheel, which serves as the middle button, are not passed.  In
+these cases, you can use the @kbd{M-x msdos-set-mouse-buttons} command
+to tell Emacs how many mouse buttons to expect.  You could make such a
+setting permanent by adding this fragment to your @file{_emacs} init
+file:
+
+@example
+;; @r{Treat the mouse like a 2-button mouse.}
+(msdos-set-mouse-buttons 2)
+@end example
+
+@cindex Windows clipboard support
+  Emacs built for MS-DOS supports clipboard operations when it runs on
+Windows.  Commands that put text on the kill ring, or yank text from
+the ring, check the Windows clipboard first, just as Emacs does on the
+X Window System (@pxref{Mouse Commands,,,emacs, the Emacs Manual}).
+Only the primary selection and the cut buffer are supported by MS-DOS
+Emacs on Windows; the secondary selection always appears as empty.
+
+  Due to the way clipboard access is implemented by Windows, the
+length of text you can put into the clipboard is limited by the amount
+of free DOS memory that is available to Emacs.  Usually, up to 620KB of
+text can be put into the clipboard, but this limit depends on the system
+configuration and is lower if you run Emacs as a subprocess of
+another program.  If the killed text does not fit, Emacs outputs a
+message saying so, and does not put the text into the clipboard.
+
+  Null characters also cannot be put into the Windows clipboard.  If the
+killed text includes null characters, Emacs does not put such text into
+the clipboard, and displays in the echo area a message to that effect.
+
+@vindex dos-display-scancodes
+  The variable @code{dos-display-scancodes}, when non-@code{nil},
+directs Emacs to display the @acronym{ASCII} value and the keyboard scan code of
+each keystroke; this feature serves as a complement to the
+@code{view-lossage} command, for debugging.
+
+@node MS-DOS Display
+@section Display on MS-DOS
+@cindex faces under MS-DOS
+@cindex fonts, emulating under MS-DOS
+
+  Display on MS-DOS cannot use font variants, like bold or italic, but
+it does support multiple faces, each of which can specify a foreground
+and a background color.  Therefore, you can get the full functionality
+of Emacs packages that use fonts (such as @code{font-lock}, Enriched
+Text mode, and others) by defining the relevant faces to use different
+colors.  Use the @code{list-colors-display} command (@pxref{Frame
+Parameters,,,emacs, the Emacs Manual}) and the
+@code{list-faces-display} command (@pxref{Faces,,,emacs, the Emacs
+Manual}) to see what colors and faces are available and what they look
+like.
+
+  @xref{MS-DOS and MULE}, later in this chapter, for information on
+how Emacs displays glyphs and characters that aren't supported by the
+native font built into the DOS display.
+
+@cindex cursor shape on MS-DOS
+  When Emacs starts, it changes the cursor shape to a solid box.  This
+is for compatibility with other systems, where the box cursor is the
+default in Emacs.  This default shape can be changed to a bar by
+specifying the @code{cursor-type} parameter in the variable
+@code{default-frame-alist} (@pxref{Creating Frames,,,emacs, the Emacs
+Manual}).  The MS-DOS terminal doesn't support a vertical-bar cursor,
+so the bar cursor is horizontal, and the @code{@var{width}} parameter,
+if specified by the frame parameters, actually determines its height.
+For this reason, the @code{bar} and @code{hbar} cursor types produce
+the same effect on MS-DOS.  As an extension, the bar cursor
+specification can include the starting scan line of the cursor as well
+as its width, like this:
+
+@example
+ '(cursor-type bar @var{width} . @var{start})
+@end example
+
+@noindent
+In addition, if the @var{width} parameter is negative, the cursor bar
+begins at the top of the character cell.
+
+@cindex frames on MS-DOS
+  The MS-DOS terminal can only display a single frame at a time.  The
+Emacs frame facilities work on MS-DOS much as they do on text-only
+terminals (@pxref{Frames,,,emacs, the Emacs Manual}).  When you run
+Emacs from a DOS window on MS-Windows, you can make the visible frame
+smaller than the full screen, but Emacs still cannot display more than
+a single frame at a time.
+
+@cindex frame size under MS-DOS
+@findex mode4350
+@findex mode25
+  The @code{mode4350} command switches the display to 43 or 50
+lines, depending on your hardware; the @code{mode25} command switches
+to the default 80x25 screen size.
+
+  By default, Emacs only knows how to set screen sizes of 80 columns by
+25, 28, 35, 40, 43 or 50 rows.  However, if your video adapter has
+special video modes that will switch the display to other sizes, you can
+have Emacs support those too.  When you ask Emacs to switch the frame to
+@var{n} rows by @var{m} columns dimensions, it checks if there is a
+variable called @code{screen-dimensions-@var{n}x@var{m}}, and if so,
+uses its value (which must be an integer) as the video mode to switch
+to.  (Emacs switches to that video mode by calling the BIOS @code{Set
+Video Mode} function with the value of
+@code{screen-dimensions-@var{n}x@var{m}} in the @code{AL} register.)
+For example, suppose your adapter will switch to 66x80 dimensions when
+put into video mode 85.  Then you can make Emacs support this screen
+size by putting the following into your @file{_emacs} file:
+
+@example
+(setq screen-dimensions-66x80 85)
+@end example
+
+  Since Emacs on MS-DOS can only set the frame size to specific
+supported dimensions, it cannot honor every possible frame resizing
+request.  When an unsupported size is requested, Emacs chooses the next
+larger supported size beyond the specified size.  For example, if you
+ask for 36x80 frame, you will get 40x80 instead.
+
+  The variables @code{screen-dimensions-@var{n}x@var{m}} are used only
+when they exactly match the specified size; the search for the next
+larger supported size ignores them.  In the above example, even if your
+VGA supports 38x80 dimensions and you define a variable
+@code{screen-dimensions-38x80} with a suitable value, you will still get
+40x80 screen when you ask for a 36x80 frame.  If you want to get the
+38x80 size in this case, you can do it by setting the variable named
+@code{screen-dimensions-36x80} with the same video mode value as
+@code{screen-dimensions-38x80}.
+
+  Changing frame dimensions on MS-DOS has the effect of changing all the
+other frames to the new dimensions.
+
+@node MS-DOS File Names
+@section File Names on MS-DOS
+@cindex file names under MS-DOS
+@cindex init file, default name under MS-DOS
+
+  MS-DOS normally uses a backslash, @samp{\}, to separate name units
+within a file name, instead of the slash used on other systems.  Emacs
+on MS-DOS permits use of either slash or backslash, and also knows
+about drive letters in file names.
+
+  On MS-DOS, file names are case-insensitive and limited to eight
+characters, plus optionally a period and three more characters.  Emacs
+knows enough about these limitations to handle file names that were
+meant for other operating systems.  For instance, leading dots
+@samp{.}  in file names are invalid in MS-DOS, so Emacs transparently
+converts them to underscores @samp{_}; thus your default init file
+(@pxref{Init File,,,emacs, the Emacs Manual}) is called @file{_emacs}
+on MS-DOS.  Excess characters before or after the period are generally
+ignored by MS-DOS itself; thus, if you visit the file
+@file{LongFileName.EvenLongerExtension}, you will silently get
+@file{longfile.eve}, but Emacs will still display the long file name
+on the mode line.  Other than that, it's up to you to specify file
+names which are valid under MS-DOS; the transparent conversion as
+described above only works on file names built into Emacs.
+
+@cindex backup file names on MS-DOS
+  The above restrictions on the file names on MS-DOS make it almost
+impossible to construct the name of a backup file (@pxref{Backup
+Names,,,emacs, the Emacs Manual}) without losing some of the original
+file name characters.  For example, the name of a backup file for
+@file{docs.txt} is @file{docs.tx~} even if single backup is used.
+
+@cindex file names under Windows 95/NT
+@cindex long file names in DOS box under Windows 95/NT
+  If you run Emacs as a DOS application under Windows 9X, Windows ME, or
+Windows 2000, you can turn on support for long file names.  If you do
+that, Emacs doesn't truncate file names or convert them to lower case;
+instead, it uses the file names that you specify, verbatim.  To enable
+long file name support, set the environment variable @env{LFN} to
+@samp{y} before starting Emacs.  Unfortunately, Windows NT doesn't allow
+DOS programs to access long file names, so Emacs built for MS-DOS will
+only see their short 8+3 aliases.
+
+@cindex @env{HOME} directory under MS-DOS
+  MS-DOS has no notion of home directory, so Emacs on MS-DOS pretends
+that the directory where it is installed is the value of the @env{HOME}
+environment variable.  That is, if your Emacs binary,
+@file{emacs.exe}, is in the directory @file{c:/utils/emacs/bin}, then
+Emacs acts as if @env{HOME} were set to @samp{c:/utils/emacs}.  In
+particular, that is where Emacs looks for the init file @file{_emacs}.
+With this in mind, you can use @samp{~} in file names as an alias for
+the home directory, as you would on GNU or Unix.  You can also set
+@env{HOME} variable in the environment before starting Emacs; its
+value will then override the above default behavior.
+
+  Emacs on MS-DOS handles the directory name @file{/dev} specially,
+because of a feature in the emulator libraries of DJGPP that pretends
+I/O devices have names in that directory.  We recommend that you avoid
+using an actual directory named @file{/dev} on any disk.
+
+@node MS-DOS Printing
+@section Printing and MS-DOS
+
+  Printing commands, such as @code{lpr-buffer}
+(@pxref{Printing,,,emacs, the Emacs Manual }) and
+@code{ps-print-buffer} (@pxref{PostScript,,,emacs, the Emacs Manual})
+can work in MS-DOS and MS-Windows by sending the output to one of the
+printer ports, if a Posix-style @code{lpr} program is unavailable.
+The same Emacs variables control printing on all systems, but in some
+cases they have different default values on MS-DOS and MS-Windows.
+
+@vindex printer-name @r{(MS-DOS)}
+  If you want to use your local printer, printing on it in the usual DOS
+manner, then set the Lisp variable @code{lpr-command} to @code{""} (its
+default value) and @code{printer-name} to the name of the printer
+port---for example, @code{"PRN"}, the usual local printer port (that's
+the default), or @code{"LPT2"}, or @code{"COM1"} for a serial printer.
+You can also set @code{printer-name} to a file name, in which case
+``printed'' output is actually appended to that file.  If you set
+@code{printer-name} to @code{"NUL"}, printed output is silently
+discarded (sent to the system null device).
+
+  On MS-Windows, when the Windows network software is installed, you can
+also use a printer shared by another machine by setting
+@code{printer-name} to the UNC share name for that printer---for example,
+@code{"//joes_pc/hp4si"}.  (It doesn't matter whether you use forward
+slashes or backslashes here.)  To find out the names of shared printers,
+run the command @samp{net view} at a DOS command prompt to obtain a list
+of servers, and @samp{net view @var{server-name}} to see the names of printers
+(and directories) shared by that server.  Alternatively, click the
+@samp{Network Neighborhood} icon on your desktop, and look for machines
+which share their printers via the network.
+
+@cindex @samp{net use}, and printing on MS-Windows
+@cindex networked printers (MS-Windows)
+  If the printer doesn't appear in the output of @samp{net view}, or
+if setting @code{printer-name} to the UNC share name doesn't produce a
+hardcopy on that printer, you can use the @samp{net use} command to
+connect a local print port such as @code{"LPT2"} to the networked
+printer.  For example, typing @kbd{net use LPT2:
+\\joes_pc\hp4si}@footnote{
+Note that the @samp{net use} command requires the UNC share name to be
+typed with the Windows-style backslashes, while the value of
+@code{printer-name} can be set with either forward- or backslashes.}
+causes Windows to @dfn{capture} the LPT2 port and redirect the printed
+material to the printer connected to the machine @code{joes_pc}.
+After this command, setting @code{printer-name} to @code{"LPT2"}
+should produce the hardcopy on the networked printer.
+
+  With some varieties of Windows network software, you can instruct
+Windows to capture a specific printer port such as @code{"LPT2"}, and
+redirect it to a networked printer via the @w{@code{Control
+Panel->Printers}} applet instead of @samp{net use}.
+
+  Some printers expect DOS codepage encoding of non-@acronym{ASCII} text, even
+though they are connected to a Windows machine which uses a different
+encoding for the same locale.  For example, in the Latin-1 locale, DOS
+uses codepage 850 whereas Windows uses codepage 1252.  @xref{MS-DOS and
+MULE}.  When you print to such printers from Windows, you can use the
+@kbd{C-x RET c} (@code{universal-coding-system-argument}) command before
+@kbd{M-x lpr-buffer}; Emacs will then convert the text to the DOS
+codepage that you specify.  For example, @kbd{C-x RET c cp850-dos RET
+M-x lpr-region RET} will print the region while converting it to the
+codepage 850 encoding.  You may need to create the @code{cp@var{nnn}}
+coding system with @kbd{M-x codepage-setup}.
+
+  If you set @code{printer-name} to a file name, it's best to use an
+absolute file name.  Emacs changes the working directory according to
+the default directory of the current buffer, so if the file name in
+@code{printer-name} is relative, you will end up with several such
+files, each one in the directory of the buffer from which the printing
+was done.
+
+@findex print-buffer @r{(MS-DOS)}
+@findex print-region @r{(MS-DOS)}
+@vindex lpr-headers-switches @r{(MS-DOS)}
+  The commands @code{print-buffer} and @code{print-region} call the
+@code{pr} program, or use special switches to the @code{lpr} program, to
+produce headers on each printed page.  MS-DOS and MS-Windows don't
+normally have these programs, so by default, the variable
+@code{lpr-headers-switches} is set so that the requests to print page
+headers are silently ignored.  Thus, @code{print-buffer} and
+@code{print-region} produce the same output as @code{lpr-buffer} and
+@code{lpr-region}, respectively.  If you do have a suitable @code{pr}
+program (for example, from GNU Textutils), set
+@code{lpr-headers-switches} to @code{nil}; Emacs will then call
+@code{pr} to produce the page headers, and print the resulting output as
+specified by @code{printer-name}.
+
+@vindex print-region-function @r{(MS-DOS)}
+@cindex lpr usage under MS-DOS
+@vindex lpr-command @r{(MS-DOS)}
+@vindex lpr-switches @r{(MS-DOS)}
+  Finally, if you do have an @code{lpr} work-alike, you can set the
+variable @code{lpr-command} to @code{"lpr"}.  Then Emacs will use
+@code{lpr} for printing, as on other systems.  (If the name of the
+program isn't @code{lpr}, set @code{lpr-command} to specify where to
+find it.)  The variable @code{lpr-switches} has its standard meaning
+when @code{lpr-command} is not @code{""}.  If the variable
+@code{printer-name} has a string value, it is used as the value for the
+@code{-P} option to @code{lpr}, as on Unix.
+
+@findex ps-print-buffer @r{(MS-DOS)}
+@findex ps-spool-buffer @r{(MS-DOS)}
+@vindex ps-printer-name @r{(MS-DOS)}
+@vindex ps-lpr-command @r{(MS-DOS)}
+@vindex ps-lpr-switches @r{(MS-DOS)}
+  A parallel set of variables, @code{ps-lpr-command},
+@code{ps-lpr-switches}, and @code{ps-printer-name} (@pxref{PostScript
+Variables,,,emacs, the Emacs Manual}), defines how PostScript files
+should be printed.  These variables are used in the same way as the
+corresponding variables described above for non-PostScript printing.
+Thus, the value of @code{ps-printer-name} is used as the name of the
+device (or file) to which PostScript output is sent, just as
+@code{printer-name} is used for non-PostScript printing.  (There are
+two distinct sets of variables in case you have two printers attached
+to two different ports, and only one of them is a PostScript printer.)
+
+  The default value of the variable @code{ps-lpr-command} is @code{""},
+which causes PostScript output to be sent to the printer port specified
+by @code{ps-printer-name}, but @code{ps-lpr-command} can also be set to
+the name of a program which will accept PostScript files.  Thus, if you
+have a non-PostScript printer, you can set this variable to the name of
+a PostScript interpreter program (such as Ghostscript).  Any switches
+that need to be passed to the interpreter program are specified using
+@code{ps-lpr-switches}.  (If the value of @code{ps-printer-name} is a
+string, it will be added to the list of switches as the value for the
+@code{-P} option.  This is probably only useful if you are using
+@code{lpr}, so when using an interpreter typically you would set
+@code{ps-printer-name} to something other than a string so it is
+ignored.)
+
+  For example, to use Ghostscript for printing on an Epson printer
+connected to the @samp{LPT2} port, put this in your @file{_emacs} file:
+
+@example
+(setq ps-printer-name t)  ; Ghostscript doesn't understand -P
+(setq ps-lpr-command "c:/gs/gs386")
+(setq ps-lpr-switches '("-q" "-dNOPAUSE"
+			"-sDEVICE=epson"
+			"-r240x72"
+			"-sOutputFile=LPT2"
+			"-Ic:/gs"))
+@end example
+
+@noindent
+(This assumes that Ghostscript is installed in the @file{"c:/gs"}
+directory.)
+
+@vindex dos-printer
+@vindex dos-ps-printer
+  For backwards compatibility, the value of @code{dos-printer}
+(@code{dos-ps-printer}), if it has a value, overrides the value of
+@code{printer-name} (@code{ps-printer-name}), on MS-DOS and MS-Windows
+only.
+
+
+@node MS-DOS and MULE
+@section International Support on MS-DOS
+@cindex international support @r{(MS-DOS)}
+
+  Emacs on MS-DOS supports the same international character sets as it
+does on GNU, Unix and other platforms (@pxref{International,,,emacs,
+the Emacs Manual}), including coding systems for converting between
+the different character sets.  However, due to incompatibilities
+between MS-DOS/MS-Windows and other systems, there are several
+DOS-specific aspects of this support that you should be aware of.
+This section describes these aspects.
+
+  The description below is largely specific to the MS-DOS port of
+Emacs, especially where it talks about practical implications for
+Emacs users.  For other operating systems, see the @file{code-pages.el}
+package, which implements support for MS-DOS- and MS-Windows-specific
+encodings for all platforms other than MS-DOS.
+
+@table @kbd
+@item M-x dos-codepage-setup
+Set up Emacs display and coding systems as appropriate for the current
+DOS codepage.
+
+@item M-x codepage-setup
+Create a coding system for a certain DOS codepage.
+@end table
+
+@cindex codepage, MS-DOS
+@cindex DOS codepages
+  MS-DOS is designed to support one character set of 256 characters at
+any given time, but gives you a variety of character sets to choose
+from.  The alternative character sets are known as @dfn{DOS codepages}.
+Each codepage includes all 128 @acronym{ASCII} characters, but the other 128
+characters (codes 128 through 255) vary from one codepage to another.
+Each DOS codepage is identified by a 3-digit number, such as 850, 862,
+etc.
+
+  In contrast to X, which lets you use several fonts at the same time,
+MS-DOS normally doesn't allow use of several codepages in a single
+session.  MS-DOS was designed to load a single codepage at system
+startup, and require you to reboot in order to change
+it@footnote{Normally, one particular codepage is burnt into the
+display memory, while other codepages can be installed by modifying
+system configuration files, such as @file{CONFIG.SYS}, and rebooting.
+While there is third-party software that allows changing the codepage
+without rebooting, we describe here how a stock MS-DOS system
+behaves.}.  Much the same limitation applies when you run DOS
+executables on other systems such as MS-Windows.
+
+@cindex unibyte operation @r{(MS-DOS)}
+  If you invoke Emacs on MS-DOS with the @samp{--unibyte} option
+(@pxref{Initial Options,,,emacs, the Emacs Manual}), Emacs does not
+perform any conversion of non-@acronym{ASCII} characters.  Instead, it
+reads and writes any non-@acronym{ASCII} characters verbatim, and
+sends their 8-bit codes to the display verbatim.  Thus, unibyte Emacs
+on MS-DOS supports the current codepage, whatever it may be, but
+cannot even represent any other characters.
+
+@vindex dos-codepage
+  For multibyte operation on MS-DOS, Emacs needs to know which
+characters the chosen DOS codepage can display.  So it queries the
+system shortly after startup to get the chosen codepage number, and
+stores the number in the variable @code{dos-codepage}.  Some systems
+return the default value 437 for the current codepage, even though the
+actual codepage is different.  (This typically happens when you use the
+codepage built into the display hardware.)  You can specify a different
+codepage for Emacs to use by setting the variable @code{dos-codepage} in
+your init file.
+
+@cindex language environment, automatic selection on @r{MS-DOS}
+  Multibyte Emacs supports only certain DOS codepages: those which can
+display Far-Eastern scripts, like the Japanese codepage 932, and those
+that encode a single ISO 8859 character set.
+
+  The Far-Eastern codepages can directly display one of the MULE
+character sets for these countries, so Emacs simply sets up to use the
+appropriate terminal coding system that is supported by the codepage.
+The special features described in the rest of this section mostly
+pertain to codepages that encode ISO 8859 character sets.
+
+  For the codepages which correspond to one of the ISO character sets,
+Emacs knows the character set name based on the codepage number.  Emacs
+automatically creates a coding system to support reading and writing
+files that use the current codepage, and uses this coding system by
+default.  The name of this coding system is @code{cp@var{nnn}}, where
+@var{nnn} is the codepage number.@footnote{The standard Emacs coding
+systems for ISO 8859 are not quite right for the purpose, because
+typically the DOS codepage does not match the standard ISO character
+codes.  For example, the letter @samp{@,{c}} (@samp{c} with cedilla) has
+code 231 in the standard Latin-1 character set, but the corresponding
+DOS codepage 850 uses code 135 for this glyph.}
+
+@cindex mode line @r{(MS-DOS)}
+  All the @code{cp@var{nnn}} coding systems use the letter @samp{D}
+(for ``DOS'') as their mode-line mnemonic.  Since both the terminal
+coding system and the default coding system for file I/O are set to
+the proper @code{cp@var{nnn}} coding system at startup, it is normal
+for the mode line on MS-DOS to begin with @samp{-DD\-}.  @xref{Mode
+Line,,,emacs, the Emacs Manual}.  Far-Eastern DOS terminals do not use
+the @code{cp@var{nnn}} coding systems, and thus their initial mode
+line looks like the Emacs default.
+
+  Since the codepage number also indicates which script you are using,
+Emacs automatically runs @code{set-language-environment} to select the
+language environment for that script (@pxref{Language
+Environments,,,emacs, the Emacs Manual}).
+
+  If a buffer contains a character belonging to some other ISO 8859
+character set, not the one that the chosen DOS codepage supports, Emacs
+displays it using a sequence of @acronym{ASCII} characters.  For example, if the
+current codepage doesn't have a glyph for the letter @samp{@`o} (small
+@samp{o} with a grave accent), it is displayed as @samp{@{`o@}}, where
+the braces serve as a visual indication that this is a single character.
+(This may look awkward for some non-Latin characters, such as those from
+Greek or Hebrew alphabets, but it is still readable by a person who
+knows the language.)  Even though the character may occupy several
+columns on the screen, it is really still just a single character, and
+all Emacs commands treat it as one.
+
+@cindex IBM graphics characters (MS-DOS)
+@cindex box-drawing characters (MS-DOS)
+@cindex line-drawing characters (MS-DOS)
+  Not all characters in DOS codepages correspond to ISO 8859
+characters---some are used for other purposes, such as box-drawing
+characters and other graphics.  Emacs maps these characters to two
+special character sets called @code{eight-bit-control} and
+@code{eight-bit-graphic}, and displays them as their IBM glyphs.
+However, you should be aware that other systems might display these
+characters differently, so you should avoid them in text that might be
+copied to a different operating system, or even to another DOS machine
+that uses a different codepage.
+
+@vindex dos-unsupported-character-glyph
+  Emacs supports many other characters sets aside from ISO 8859, but it
+cannot display them on MS-DOS.  So if one of these multibyte characters
+appears in a buffer, Emacs on MS-DOS displays them as specified by the
+@code{dos-unsupported-character-glyph} variable; by default, this glyph
+is an empty triangle.  Use the @kbd{C-u C-x =} command to display the
+actual code and character set of such characters.  @xref{Position
+Info,,,emacs, the Emacs Manual}.
+
+@findex codepage-setup
+  By default, Emacs defines a coding system to support the current
+codepage.  To define a coding system for some other codepage (e.g., to
+visit a file written on a DOS machine in another country), use the
+@kbd{M-x codepage-setup} command.  It prompts for the 3-digit code of
+the codepage, with completion, then creates the coding system for the
+specified codepage.  You can then use the new coding system to read and
+write files, but you must specify it explicitly for the file command
+when you want to use it (@pxref{Text Coding,,,emacs, the Emacs Manual}).
+
+  These coding systems are also useful for visiting a file encoded using
+a DOS codepage, using Emacs running on some other operating system.
+
+@cindex MS-Windows codepages
+  MS-Windows provides its own codepages, which are different from the
+DOS codepages for the same locale.  For example, DOS codepage 850
+supports the same character set as Windows codepage 1252; DOS codepage
+855 supports the same character set as Windows codepage 1251, etc.
+The MS-Windows version of Emacs uses the current codepage for display
+when invoked with the @samp{-nw} option.  Support for codepages in the
+Windows port of Emacs is part of the @file{code-pages.el} package.
+
+@node MS-DOS Processes
+@section Subprocesses on MS-DOS
+
+@cindex compilation under MS-DOS
+@cindex inferior processes under MS-DOS
+@findex compile @r{(MS-DOS)}
+@findex grep @r{(MS-DOS)}
+  Because MS-DOS is a single-process ``operating system,''
+asynchronous subprocesses are not available.  In particular, Shell
+mode and its variants do not work.  Most Emacs features that use
+asynchronous subprocesses also don't work on MS-DOS, including
+Shell mode and GUD.  When in doubt, try and see; commands that
+don't work output an error message saying that asynchronous processes
+aren't supported.
+
+  Compilation under Emacs with @kbd{M-x compile}, searching files with
+@kbd{M-x grep} and displaying differences between files with @kbd{M-x
+diff} do work, by running the inferior processes synchronously.  This
+means you cannot do any more editing until the inferior process
+finishes.
+
+  Spell checking also works, by means of special support for synchronous
+invocation of the @code{ispell} program.  This is slower than the
+asynchronous invocation on other platforms
+
+  Instead of the Shell mode, which doesn't work on MS-DOS, you can use
+the @kbd{M-x eshell} command.  This invokes the Eshell package that
+implements a Posix-like shell entirely in Emacs Lisp.
+
+  By contrast, Emacs compiled as a native Windows application
+@strong{does} support asynchronous subprocesses.  @xref{Windows
+Processes,,,emacs, the Emacs Manual}.
+
+@cindex printing under MS-DOS
+  Printing commands, such as @code{lpr-buffer}
+(@pxref{Printing,,,emacs, the Emacs Manual}) and
+@code{ps-print-buffer} (@pxref{PostScript,,,emacs, the Emacs Manual}),
+work in MS-DOS by sending the output to one of the printer ports.
+@xref{MS-DOS Printing,,,emacs, the Emacs Manual}.
+
+  When you run a subprocess synchronously on MS-DOS, make sure the
+program terminates and does not try to read keyboard input.  If the
+program does not terminate on its own, you will be unable to terminate
+it, because MS-DOS provides no general way to terminate a process.
+Pressing @kbd{C-c} or @kbd{C-@key{BREAK}} might sometimes help in these
+cases.
+
+  Accessing files on other machines is not supported on MS-DOS.  Other
+network-oriented commands such as sending mail, Web browsing, remote
+login, etc., don't work either, unless network access is built into
+MS-DOS with some network redirector.
+
+@cindex directory listing on MS-DOS
+@vindex dired-listing-switches @r{(MS-DOS)}
+  Dired on MS-DOS uses the @code{ls-lisp} package where other
+platforms use the system @code{ls} command.  Therefore, Dired on
+MS-DOS supports only some of the possible options you can mention in
+the @code{dired-listing-switches} variable.  The options that work are
+@samp{-A}, @samp{-a}, @samp{-c}, @samp{-i}, @samp{-r}, @samp{-S},
+@samp{-s}, @samp{-t}, and @samp{-u}.
+
+
 @node Index
 @unnumbered Index
 
--- a/man/emacs.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/emacs.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -73,7 +73,12 @@
 Cover art by Etienne Suvasa.
 
 @end titlepage
-@page
+
+
+@summarycontents
+@contents
+
+
 @ifnottex
 @node Top, Distrib, (dir), (dir)
 @top The Emacs Editor
@@ -122,7 +127,7 @@
 * Glossary::	        The glossary.
 * Antinews::	        Information about Emacs version 21.
 * Mac OS::              Using Emacs in the Mac.
-* MS-DOS::              Using Emacs on MS-DOS and Microsoft Windows.
+* Emacs and Microsoft Windows::  Using Emacs on Microsoft Windows.
 * Manifesto::	        What's GNU?  Gnu's Not Unix!
 * Acknowledgments::     Major contributors to GNU Emacs.
 
@@ -201,6 +206,7 @@
 			  "recursive editing level".
 * Emulation::	        Emulating some other editors with Emacs.
 * Hyperlinking::        Following links in buffers.
+* Thumbnails::          Browsing images using thumbnails.
 * Dissociated Press::   Dissociating text for fun.
 * Amusements::	        Various games and hacks.
 * Customization::       Modifying the behavior of Emacs.
@@ -800,7 +806,6 @@
 * Stuck Recursive::     `[...]' in mode line around the parentheses.
 * Screen Garbled::      Garbage on the screen.
 * Text Garbled::        Garbage in the text.
-* Unasked-for Search::  Spontaneous entry to incremental search.
 * Memory Full::         How to cope when you run out of memory.
 * After a Crash::       Recovering editing in an Emacs session that crashed.
 * Emergency Escape::    Emergency escape---
@@ -855,16 +860,9 @@
 * Mac Font Specs::      Specifying fonts on Mac.
 * Mac Functions::       Mac-specific Lisp functions.
 
-MS-DOS and Windows 95/98/NT
+Emacs and Microsoft Windows
 
-* MS-DOS Keyboard::     Keyboard usage on MS-DOS.
-* MS-DOS Mouse::        Mouse usage on MS-DOS.
-* MS-DOS Display::      Fonts, frames and display size on MS-DOS.
-* MS-DOS File Names::   File-name conventions on MS-DOS.
 * Text and Binary::     Text files on MS-DOS use CRLF to separate lines.
-* MS-DOS Printing::     How to specify the printer on MS-DOS.
-* MS-DOS and MULE::     Support for internationalization on MS-DOS.
-* MS-DOS Processes::    Running subprocesses on MS-DOS.
 * Windows Processes::   Running subprocesses on Windows.
 * Windows System Menu:: Controlling what the ALT key does.
 @end menu
@@ -926,10 +924,10 @@
 installed on GNU and Unix systems.  GNU Emacs can also be used on VMS,
 MS-DOS (also called MS-DOG), Microsoft Windows, and Macintosh systems.
 Those systems use different file name syntax; in addition, VMS and
-MS-DOS do not support all GNU Emacs features.  @xref{MS-DOS}, for
-information about using Emacs on MS-DOS and Windows.  @xref{Mac OS},
-for information about using Emacs on Macintosh.  We don't try to
-describe VMS usage in this manual.
+MS-DOS do not support all GNU Emacs features.  @xref{Emacs and
+Microsoft Windows}, for information about using Emacs on Windows.
+@xref{Mac OS}, for information about using Emacs on Macintosh.  We
+don't try to describe VMS usage in this manual.
 @end iftex
 
 @node Distrib, Intro, Top, Top
@@ -1604,8 +1602,6 @@
 @unnumbered Concept Index
 @printindex cp
 
-@summarycontents
-@contents
 @bye
 
 @ignore
--- a/man/frames.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/frames.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -27,7 +27,7 @@
 
   Emacs compiled for MS-DOS emulates some windowing functionality,
 so that you can use many of the features described in this chapter.
-@xref{MS-DOS Mouse}, for more information.
+@xref{MS-DOS Mouse,,,emacs-xtra,Specialized Emacs Features}.
 
 @menu
 * Mouse Commands::      Moving, cutting, and pasting, with the mouse.
--- a/man/gnu.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/gnu.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -2,7 +2,7 @@
 @c Copyright (C) 1985, 1986, 1987, 1993, 1995, 2002, 2003, 2004,
 @c   2005, 2006 Free Software Foundation, Inc.
 @ifclear justgnu
-@node Manifesto,, MS-DOS, Top
+@node Manifesto,, Emacs and Microsoft Windows, Top
 @unnumbered The GNU Manifesto
 @end ifclear
 @ifset justgnu
--- a/man/gnus.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/gnus.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -50,7 +50,7 @@
 \begin{document}
 
 % Adjust ../Makefile.in if you change the following line:
-\newcommand{\gnusversionname}{Gnus v5.10.6}
+\newcommand{\gnusversionname}{Gnus v5.11}
 \newcommand{\gnuschaptername}{}
 \newcommand{\gnussectionname}{}
 
@@ -360,7 +360,7 @@
 luck.
 
 @c Adjust ../Makefile.in if you change the following line:
-This manual corresponds to Gnus v5.10.6.
+This manual corresponds to Gnus v5.11.
 
 @end ifinfo
 
@@ -2758,6 +2758,9 @@
 that group will always be visible in the Group buffer, regardless
 of whether it has any unread articles.
 
+This parameter cannot be set via @code{gnus-parameters}. See
+@code{gnus-permanently-visible-groups} as an alternative.
+
 @item broken-reply-to
 @cindex broken-reply-to
 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
@@ -3035,8 +3038,9 @@
 
 @vindex gnus-parameters
 Group parameters can be set via the @code{gnus-parameters} variable too.
-But some variables, such as @code{visible}, have no effect.  For
-example:
+But some variables, such as @code{visible}, have no effect (For this
+case see @code{gnus-permanently-visible-groups} as an alternative.).
+For example:
 
 @lisp
 (setq gnus-parameters
@@ -4675,6 +4679,8 @@
 The line number.
 @item O
 Download mark.
+@item *
+Desired cursor position (instead of after first colon).
 @item &user-date;
 Age sensitive date format.  Various date format is defined in
 @code{gnus-user-date-format-alist}.
@@ -10655,8 +10661,8 @@
 
 @end enumerate
 
-More information on how to set things up can be found in the message
-manual (@pxref{Security, ,Security, message, Message Manual}).
+The variables that control security functionality on reading messages
+include:
 
 @table @code
 @item mm-verify-option
@@ -10687,6 +10693,15 @@
 
 @end table
 
+By default the buttons that display security information are not
+shown, because they clutter reading the actual e-mail.  You can type
+@kbd{K b} manually to display the information.  Use the
+@code{gnus-buttonized-mime-types} and
+@code{gnus-unbuttonized-mime-types} variables to control this
+permanently.  @ref{MIME Commands} for further details, and hints on
+how to customize these variables to always display security
+information.
+
 @cindex snarfing keys
 @cindex importing PGP keys
 @cindex PGP key ring import
@@ -10707,6 +10722,10 @@
 This happens to also be the default action defined in
 @code{mailcap-mime-data}.
 
+More information on how to set things for sending outgoing signed and
+encrypted messages up can be found in the message manual
+(@pxref{Security, ,Security, message, Message Manual}).
+
 @node Mailing List
 @section Mailing List
 @cindex mailing list
@@ -17540,16 +17559,16 @@
 zombie groups can't be component groups for @code{nnvirtual} groups.
 
 @vindex nnvirtual-always-rescan
-If the @code{nnvirtual-always-rescan} is non-@code{nil},
-@code{nnvirtual} will always scan groups for unread articles when
-entering a virtual group.  If this variable is @code{nil} (which is the
-default) and you read articles in a component group after the virtual
-group has been activated, the read articles from the component group
-will show up when you enter the virtual group.  You'll also see this
-effect if you have two virtual groups that have a component group in
-common.  If that's the case, you should set this variable to @code{t}.
-Or you can just tap @code{M-g} on the virtual group every time before
-you enter it---it'll have much the same effect.
+If the @code{nnvirtual-always-rescan} variable is non-@code{nil} (which
+is the default), @code{nnvirtual} will always scan groups for unread
+articles when entering a virtual group.  If this variable is @code{nil}
+and you read articles in a component group after the virtual group has
+been activated, the read articles from the component group will show up
+when you enter the virtual group.  You'll also see this effect if you
+have two virtual groups that have a component group in common.  If
+that's the case, you should set this variable to @code{t}.  Or you can
+just tap @code{M-g} on the virtual group every time before you enter
+it---it'll have much the same effect.
 
 @code{nnvirtual} can have both mail and news groups as component groups.
 When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
@@ -22060,10 +22079,20 @@
 @end iftex
 @c @anchor{X-Face}
 
-Decoding an @code{X-Face} header either requires an Emacs that has
+Viewing an @code{X-Face} header either requires an Emacs that has
 @samp{compface} support (which most XEmacs versions has), or that you
-have @samp{compface} installed on your system.  If either is true,
-Gnus will default to displaying @code{X-Face} headers.
+have suitable conversion or display programs installed.  If your Emacs
+has image support the default action is to display the face before the
+@code{From} header.  If there's no native @code{X-Face} support, Gnus
+will try to convert the @code{X-Face} header using external programs
+from the @code{pbmplus} package and friends.  For XEmacs it's faster if
+XEmacs has been compiled with @code{X-Face} support.  The default action
+under Emacs without image support is to fork off the @code{display}
+program.
+
+On a GNU/Linux system, the @code{display} program is from the
+ImageMagick package.  For external conversion programs look for packages
+with names like @code{netpbm}, @code{libgr-progs} and @code{compface}.
 
 The variable that controls this is the
 @code{gnus-article-x-face-command} variable.  If this variable is a
@@ -22072,21 +22101,6 @@
 If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches
 the @code{From} header, the face will not be shown.
 
-The default action under Emacs without image support is to fork off the
-@code{display} program@footnote{@code{display} is from the ImageMagick
-package.  For the @code{uncompface} and @code{icontopbm} programs look
-for a package like @code{compface} or @code{faces-xface} on a GNU/Linux
-system.} to view the face.
-
-Under XEmacs or Emacs 21+ with suitable image support, the default
-action is to display the face before the @code{From} header.  (It's
-nicer if XEmacs has been compiled with @code{X-Face} support---that
-will make display somewhat faster.  If there's no native @code{X-Face}
-support, Gnus will try to convert the @code{X-Face} header using
-external programs from the @code{pbmplus} package and
-friends.@footnote{On a GNU/Linux system look for packages with names
-like @code{netpbm}, @code{libgr-progs} and @code{compface}.})
-
 (Note: @code{x-face} is used in the variable/function names, not
 @code{xface}).
 
@@ -22104,7 +22118,9 @@
 If you use posting styles, you can use an @code{x-face-file} entry in
 @code{gnus-posting-styles}, @xref{Posting Styles}.  If you don't, Gnus
 provides a few convenience functions and variables to allow easier
-insertion of X-Face headers in outgoing messages.
+insertion of X-Face headers in outgoing messages.  You also need the
+above mentioned ImageMagick, netpbm or other image conversion packages
+(depending the values of the variables below) for these functions.
 
 @findex gnus-random-x-face
 @vindex gnus-convert-pbm-to-x-face-command
@@ -22151,7 +22167,7 @@
 @subsection Face
 @cindex face
 
-@c #### FIXME: faces and x-faces'implementations should really be harmonized.
+@c #### FIXME: faces and x-faces' implementations should really be harmonized.
 
 @code{Face} headers are essentially a funkier version of @code{X-Face}
 ones. They describe a 48x48 pixel colored image that's supposed to
@@ -22163,6 +22179,13 @@
 See @uref{http://quimby.gnus.org/circus/face/} for the precise
 specifications.
 
+Viewing an @code{Face} header requires an Emacs that is able to display
+PNG images.
+@c Maybe add this:
+@c (if (featurep 'xemacs)
+@c     (featurep 'png)
+@c   (image-type-available-p 'png))
+
 Gnus provides a few convenience functions and variables to allow
 easier insertion of Face headers in outgoing messages.
 
--- a/man/help.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/help.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -512,11 +512,11 @@
 next cross reference.  Use @kbd{S-@key{TAB}} to move point up to the
 previous cross reference (@code{help-previous-ref}).
 
-To view all documentation about a symbol, whether quoted or not, move
-point over the symbol and type @kbd{C-c C-c}
+  You can view all documentation about any symbol name that appears in
+the text, by moving point to the symbol name and typing @kbd{C-c C-c}
 (@code{help-follow-symbol}).  This shows all available documentation
-about the symbol as a variable, function or face.  Just like for
-quoted cross references, you can use @kbd{C-c C-b} to retrace your steps.
+about the symbol as a variable, function and/or face.  @kbd{C-c C-b}
+works in this case also, to retrace your steps.
 
 @node Misc Help
 @section Other Help Commands
--- a/man/idlwave.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/idlwave.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -9,16 +9,16 @@
 @synindex ky cp
 @syncodeindex vr cp
 @syncodeindex fn cp
-@set VERSION 5.5
-@set EDITION 5.5
-@set IDLVERSION 6.1
-@set NSYSROUTINES 1850
-@set NSYSKEYWORDS 7685
-@set DATE March, 2005
+@set VERSION 6.0
+@set EDITION 6.0
+@set IDLVERSION 6.2
+@set NSYSROUTINES 1966
+@set DATE Feb, 2006
 @set AUTHOR J.D. Smith & Carsten Dominik
-@set AUTHOR-EMAIL jdsmith@@as.arizona.edu
+@set AUTHOREMAIL jdsmith@@as.arizona.edu
 @set MAINTAINER J.D. Smith
-@set MAINTAINER-EMAIL jdsmith@@as.arizona.edu
+@set MAINTAINEREMAIL jdsmith@@as.arizona.edu
+@set IDLWAVEHOMEPAGE http://idlwave.org/
 @c %**end of header
 @finalout
 
@@ -29,8 +29,8 @@
 This is edition @value{EDITION} of the IDLWAVE User Manual for IDLWAVE
 @value{VERSION}
 
-Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004,
-2005, 2006 Free Software Foundation, Inc.
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 
+          2006 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.2 or
@@ -60,8 +60,8 @@
 This is edition @value{EDITION} of the @cite{IDLWAVE User Manual} for
 IDLWAVE version @value{VERSION}, @value{DATE}.
 @sp 2
-Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004,
-2005, 2006 Free Software Foundation, Inc.
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 
+          2006 Free Software Foundation, Inc.
 @sp 2
 @cindex Copyright, of IDLWAVE
 Permission is granted to copy, distribute and/or modify this document
@@ -197,6 +197,8 @@
 @node Introduction, IDLWAVE in a Nutshell, Top, Top
 @chapter Introduction
 @cindex Introduction
+@cindex CORBA (Common Object Request Broker Architecture)
+@cindex Interface Definition Language
 @cindex Interactive Data Language
 @cindex cc-mode.el
 @cindex @file{idl.el}
@@ -204,15 +206,12 @@
 @cindex Feature overview
 
 IDLWAVE is a package which supports editing source files written in
-the Interactive Data Language, and running
-IDL as an inferior shell@footnote{Note that this package has nothing
-to do with the Interface Definition Language, part of the Common
-Object Request Broker Architecture (CORBA)}@footnote{IDLWAVE can also
-be used for editing source files for the related WAVE/CL language, but
-with only limited support.}.  It is a feature-rich replacement for the
-IDLDE development environment included with IDL, and uses the full
-power of Emacs to make editing and running IDL programs easier,
-quicker, and more structured.
+the Interactive Data Language (IDL), and running IDL as an inferior shell@footnote{IDLWAVE can also be used
+for editing source files for the related WAVE/CL language, but with only
+limited support.}.  It is a feature-rich replacement for the IDLDE
+development environment included with IDL, and uses the full power of
+Emacs to make editing and running IDL programs easier, quicker, and more
+structured.
 
 IDLWAVE consists of two main parts: a major mode for editing IDL
 source files (@code{idlwave-mode}) and a mode for running the IDL
@@ -231,8 +230,6 @@
 than 1000 native IDL routines, extendible to any additional number of
 local routines, and already available with many pre-scanned libraries.
 @item
-Routine name space conflict search with likelihood-of-use ranking.
-@item
 Fast, context-sensitive online HTML help, or source-header help for
 undocumented routines.
 @item
@@ -246,6 +243,8 @@
 @item
 Integrity checks and auto-termination of logical blocks.
 @item
+Routine name space conflict search with likelihood-of-use ranking.
+@item
 Support for @file{imenu} (Emacs) and @file{func-menu} (XEmacs).
 @item
 Documentation support.
@@ -254,6 +253,9 @@
 editing and all the completion and routine info capabilities present in
 IDL source buffers.
 @item
+Full handling of debugging with breakpoints, with interactive setting
+of break conditions, and easy stepping through code.
+@item
 Compilation, execution and interactive single-keystroke debugging of
 programs directly from the source buffer.
 @item
@@ -311,10 +313,12 @@
 @tab Indent the current line relative to context.
 @item @kbd{C-M-\}
 @tab Re-indent all lines in the current region.
+@item @kbd{C-M-q}
+@tab Re-indent all lines in the current routine.
 @item @kbd{C-u @key{TAB}}
 @tab Re-indent all lines in the current statement.
 @item @kbd{M-@key{RET}}
-@tab Start a continuation line, or split the current line at point.
+@tab Start a continuation line, splitting the current line at point.
 @item @kbd{M-q}
 @tab Fill the current comment paragraph.
 @item @kbd{C-c ?}
@@ -340,10 +344,10 @@
 
 @multitable @columnfractions .15 .85
 @item @kbd{C-c C-s}
-@tab Start IDL as a subprocess and/or switch to the interaction buffer.
-@item @kbd{M-p}
+@tab Start IDL as a subprocess and/or switch to the shell buffer.
+@item @key{Up}, @kbd{M-p}
 @tab Cycle back through IDL command history.
-@item @kbd{M-n}
+@item @key{Down},@kbd{M-n}
 @tab Cycle forward.
 @item @kbd{@key{TAB}}
 @tab Complete a procedure name, function name or keyword in the shell buffer.
@@ -368,12 +372,9 @@
 @subheading Commonly used Settings in @file{.emacs}
 @lisp
 ;; Change the indentation preferences
-(setq idlwave-main-block-indent 2   ; default  0
-      idlwave-block-indent 2        ; default  4
-      idlwave-end-offset -2)        ; default -4
 ;; Start autoloading routine info after 2 idle seconds
 (setq idlwave-init-rinfo-when-idle-after 2)
-;; Pad some operators with spaces
+;; Pad operators with spaces
 (setq idlwave-do-actions t
       idlwave-surround-by-blank t)
 ;; Syntax Highlighting
@@ -384,9 +385,10 @@
 (setq idlwave-shell-debug-modifiers '(control shift))
 @end lisp
 
-@ifhtml
+@html
 <A NAME="TUTORIAL"></A>
-@end ifhtml
+@end html
+
 @node Getting Started, The IDLWAVE Major Mode, IDLWAVE in a Nutshell, Top
 @chapter Getting Started (Tutorial)
 @cindex Quick-Start
@@ -490,7 +492,7 @@
 
 Now go back to the source window and type @kbd{C-c C-d C-c} to compile
 the program.  If you watch the shell buffer, you see that IDLWAVE types
-@samp{.run tutorial.pro} for you.  But the compilation fails because
+@samp{.run "tutorial.pro"} for you.  But the compilation fails because
 there is a comma in the line @samp{years=...}.  The line with the error
 is highlighted and the cursor positioned at the error, so remove the
 comma (you should only need to hit @kbd{Delete}!).  Compile again, using
@@ -548,7 +550,7 @@
 plot_wday,1,4
 @end example
 
-Oops, this looks very wrong.  All April fool's days cannot be Fridays!
+Oops, this looks very wrong.  All April Fool's days cannot be Fridays!
 We've got a bug in the program, perhaps in the @code{daynr} function.
 Let's put a breakpoint on the last line there.  Position the cursor on
 the @samp{return, d+...} line and press @kbd{C-c C-d C-b}.  IDL sets a
@@ -576,12 +578,12 @@
 @node  Lesson II -- Customization, Lesson III -- User Catalog, Lesson I -- Development Cycle, Getting Started
 @section Lesson II: Customization
 
-Emacs is probably the most customizable piece of software ever
-written, and it would be a shame if you did not make use of this and
-adapt IDLWAVE to your own preferences.  Customizing Emacs or IDLWAVE
-is accomplished by setting Lisp variables in the @file{.emacs} file in
-your home directory --- but do not be dismayed; for the most part, you
-can just copy and work from the examples given here.
+Emacs is probably the most customizable piece of software ever written,
+and it would be a shame if you did not make use of this to adapt IDLWAVE
+to your own preferences.  Customizing Emacs or IDLWAVE is accomplished
+by setting Lisp variables in the @file{.emacs} file in your home
+directory --- but do not be dismayed; for the most part, you can just
+copy and work from the examples given here.
 
 Let's first use a boolean variable.  These are variables which you turn
 on or off, much like a checkbox. A value of @samp{t} means on, a value
@@ -600,12 +602,12 @@
 restart Emacs.
 
 You likely have your own indentation preferences for IDL code.  For
-example, some like to indent the main block of an IDL program from the
-margin and use only 3 spaces as indentation between @code{BEGIN} and
-@code{END}.  Try the following lines in @file{.emacs}:
+example, some may prefer to indent the main block of an IDL program
+slightly from the margin and use only 3 spaces as indentation between
+@code{BEGIN} and @code{END}.  Try the following lines in @file{.emacs}:
 
 @lisp
-(setq idlwave-main-block-indent 2)
+(setq idlwave-main-block-indent 1)
 (setq idlwave-block-indent 3)
 (setq idlwave-end-offset -3)
 @end lisp
@@ -810,25 +812,26 @@
 @cindex Foreign code, adapting
 @cindex Indentation, of foreign code
 @kindex C-M-\
-To re-indent a larger portion of code (e.g. when working with foreign code
-written with different conventions), use @kbd{C-M-\}
+To re-indent a larger portion of code (e.g. when working with foreign
+code written with different conventions), use @kbd{C-M-\}
 (@code{indent-region}) after marking the relevant code.  Useful marking
-commands are @kbd{C-x h} (the entire file) or @kbd{C-M-h} (the
-current subprogram). @xref{Actions}, for information how to impose
-additional formatting conventions on foreign code.
-
-@defopt idlwave-main-block-indent (@code{0}) 
+commands are @kbd{C-x h} (the entire file) or @kbd{C-M-h} (the current
+subprogram).  The command @kbd{C-M-q} reindents the entire current
+routine.  @xref{Actions}, for information how to impose additional
+formatting conventions on foreign code.
+
+@defopt idlwave-main-block-indent (@code{2}) 
 Extra indentation for the main block of code.  That is the block between
 the FUNCTION/PRO statement and the END statement for that program
 unit.
 @end defopt
 
-@defopt idlwave-block-indent (@code{4})
+@defopt idlwave-block-indent (@code{3})
 Extra indentation applied to block lines.  If you change this, you
 probably also want to change @code{idlwave-end-offset}.
 @end defopt
 
-@defopt idlwave-end-offset (@code{-4})
+@defopt idlwave-end-offset (@code{-3})
 Extra indentation applied to block END lines.  A value equal to negative
 @code{idlwave-block-indent} will make END lines line up with the block
 BEGIN lines.
@@ -884,8 +887,8 @@
 statements with special continuation indentation, especially if
 @code{idlwave-max-extra-continuation-indent} is small, the key
 @kbd{C-u @key{TAB}} will re-indent all lines in the current statement.
-Note that @code{idlwave-indent-to-open-paren}, if non-@code{nil}, overrides
-the @code{idlwave-max-extra-continuation-indent} limit, for
+Note that @code{idlwave-indent-to-open-paren}, if non-@code{nil},
+overrides the @code{idlwave-max-extra-continuation-indent} limit, for
 parentheses only, forcing them always to line up.
 
 
@@ -1254,9 +1257,9 @@
 @end defopt
 
 
-@ifhtml
+@html
 <A NAME="ONLINE_HELP"></A>
-@end ifhtml
+@end html
 @node Online Help, Completion, Routine Info, The IDLWAVE Major Mode
 @section Online Help
 
@@ -1266,19 +1269,34 @@
 @cindex Installing online help
 @cindex Online Help, Installation
 @cindex Speed, of online help
-
-IDLWAVE can display help from an HTML version of the IDL documentation
-if it is available.  This is @emph{much} faster than using the IDL
-online help application, because IDLWAVE usually gets you to the right
-place in the documentation directly --- e.g. a specific keyword of a
-routine --- without any additional browsing and scrolling.  There are
-a variety of options for displaying the HTML help: see below.  Help
-for routines without HTML documentation is also available, using the
-routine documentation header and/or source.
-
-To make this feature work, you should set
-@code{idlwave-html-help-location} to the directory name of the
-directory where the IDL help files are installed.
+@cindex XML Help Catalog
+
+For IDL system routines, extensive documentation is supplied with IDL.
+IDLWAVE can access the HTML version of this documentation very quickly
+and accurately, based on the local context.  This can be @emph{much}
+faster than using the IDL online help application, because IDLWAVE
+usually gets you to the right place in the documentation directly ---
+e.g. a specific keyword of a routine --- without any additional browsing
+and scrolling.
+
+For this online help to work, an HTML version of the IDL documentation
+is required.  Beginning with IDL 6.2, HTML documentation is distributed
+directly with IDL, along with an XML-based catalog of routine
+information.  By default, IDLWAVE automatically attempts to convert this
+XML catalog into a format Emacs can more easily understand, and caches
+this information in your @code{idlwave_config_directory}
+(@file{~/.idlwave/}, by default).  It also re-scans the XML catalog if
+it is newer than the current cached version.  You can force rescan with
+the menu entry @code{IDLWAVE->Routine Info->Rescan XML Help Catalog}.
+
+Before IDL 6.2, the HTML help was not distributed with IDL, and was not
+part of the standalone IDLWAVE distribution, but had to be downloaded
+separately.  This is no longer necessary: all help and routine
+information is supplied with IDL versions 6.2 and later.
+
+There are a variety of options for displaying the HTML help: see below.
+Help for routines without HTML documentation is also available, by using
+the routine documentation header and/or routine source.
 
 @kindex M-?
 In any IDL program (or, as with most IDLWAVE commands, in the IDL
@@ -1288,19 +1306,21 @@
 
 @cindex Context, for online help
 @multitable @columnfractions .25 .75
-@item @i{Routine name}
+@item @i{Routine names}
 @tab The name of a routine (function, procedure, method).
-@item @i{Keyword Parameter}
+@item @i{Keyword Parameters}
 @tab A keyword parameter of a routine.
-@item @i{System Variable}
+@item @i{System Variables}
 @tab System variables like @code{!DPI}.
 @item @i{System Variable Tags}
 @tab System variables tags like @code{!D.X_SIZE}.
-@item @i{IDL Statement}
+@item @i{IDL Statements}
 @tab Statements like @code{PRO}, @code{REPEAT}, @code{COMPILE_OPT}, etc.
-@item @i{Class name}
+@item @i{IDL Controls}
+@tab Control structures like @code{FOR}, @code{SWITCH}, etc.
+@item @i{Class names}
 @tab A class name in an @code{OBJ_NEW} call.
-@item @i{Class Init}
+@item @i{Class Init Keywords}
 @tab Beyond the class name in an @code{OBJ_NEW} call.
 @item @i{Executive Command}
 @tab An executive command like @code{.RUN}.  Mostly useful in the shell.
@@ -1352,52 +1372,62 @@
 @cindex HTML Help
 @cindex Help using HTML manuals
 @cindex IDL manual, HTML version
+@cindex IDL Assistant
 
 Help using the HTML documentation is invoked with the built-in Emacs
 command @code{browse-url}, which displays the relevant help topic in a
-browser of your choosing.  There are many possible browsers to choose
+browser of your choosing.  Beginning with version 6.2, IDL comes with
+the help browser @emph{IDL Assistant}, which it uses by default for
+displaying online help on all supported platforms.  This browser
+offers topical searches, an index, and is also now the default and
+recommended IDLWAVE help browser.  The variable
+@code{idlwave-help-use-assistant} controls whether this browser is
+used.  Note that, due to limitations in the Assistant, invoking help
+within IDLWAVE and @code{? topic} within IDL will result in two
+running copies of Assistant.
+
+Aside from the IDL Assistant, there are many possible browsers to choose
 among, with differing advantages and disadvantages.  The variable
-@code{idlwave-help-browser-function} controls which browser help is
-sent to.  This function is used to set the variable
-@code{browse-url-browser-function} locally for IDLWAVE help only.
-Customize this variable to see what choices of browsers your system
-offers.
-
-Certain browsers like @code{w3} and @code{w3m}
-(@uref{http://emacs-w3m.namazu.org/}, the author's help browser of
-choice) are run within Emacs, and use Emacs buffers to display the
-HTML help.  This can be convenient, especially on small displays, and
-images can even be displayed in-line on new Emacs versions.  However,
-better formatting results are often achieved with external browsers,
-like Mozilla.  IDLWAVE assumes any browser function containing "w3" is
-displayed in a local buffer.  If you are using another Emacs-local
-browser for which this is not true, set the variable
-@code{idlwave-help-browser-is-local}.
-
-@emph{N.B. For Windows users}: IDLWAVE can bring up help directly
-from the Microsoft HTMLHelp documentation supplied with IDL: no
-additional help files are needed.  Be sure to set
-@code{idlwave-system-directory} and the help file will be found
-automatically (or, alternatively, specify its location directly with
-@code{idlwave-html-help-location}).  The variable
-@code{idlwave-help-use-hh} controls whether HTMLHelp is used, and
-which application is called to invoke it (@code{HH} is the default).
-The free helper application @code{KEYHH}
-(@uref{http://www.keyworks.net/keyhh.htm}) can be used instead, and is
-preferrable, as it permits loading new help topics into the same help
-window.  @code{KEYHH} must be downloaded and installed separately.
+@code{idlwave-help-browser-function} controls which browser help is sent
+to (as long as @code{idlwave-help-use-assistant} is not set).  This
+function is used to set the variable @code{browse-url-browser-function}
+locally for IDLWAVE help only.  Customize the latter variable to see
+what choices of browsers your system offers.  Certain browsers like
+@code{w3} (bundled with many versions of Emacs) and @code{w3m}
+(@uref{http://emacs-w3m.namazu.org/}) are run within Emacs, and use
+Emacs buffers to display the HTML help.  This can be convenient,
+especially on small displays, and images can even be displayed in-line
+on newer Emacs versions.  However, better formatting results are often
+achieved with external browsers, like Mozilla.  IDLWAVE assumes any
+browser function containing "w3" is displayed in a local buffer.  If you
+are using another Emacs-local browser for which this is not true, set
+the variable @code{idlwave-help-browser-is-local}.
+
+With IDL 6.2 or later, it is important to ensure that the variable
+@code{idlwave-system-directory} is set (@pxref{Catalogs}).  One easy way
+to ensure this is to run the IDL Shell (@kbd{C-c C-s}).  It will be
+queried for this directory, and the results will be cached to file for
+subsequent use.
 
 @xref{HTML Help Browser Tips}, for more information on selecting and
 configuring a browser for use with IDL's HTML help system.
 
-@defopt idlwave-html-help-location @file{/usr/local/etc}
-The directory where the @file{idl_html_help} dir or @file{idl.chm}
-HTMLHelp files live.
+@defopt idlwave-html-system-help-location @file{help/online_help}
+Relative directory of the system-supplied HTML help directory,
+considered with respect to @code{idlwave-system-directory}.  Relevant
+for IDL 6.2 and greater.  Should not change.
+@end defopt     
+
+@defopt idlwave-html-help-location @file{/usr/local/etc/}
+The directory where the @file{idl_html_help} HTML directory live.
+Obsolete and ignored for IDL 6.2 and greater
+(@code{idlwave-html-system-help-location} is used instead).
 @end defopt
 
-@defopt idlwave-help-use-hh @code{nil}
-If set to @code{'hh} or @code{'keyhh}, use Windows native HTMLHelp
-with the specified help application.
+@defopt idlwave-help-use-assistant @code{t}
+If set, use the IDL Assistant if possible for online HTML help,
+otherwise use the browser function specified in
+@code{idlwave-help-browser-function}.
 @end defopt
 
 @defopt idlwave-help-browser-function
@@ -1408,8 +1438,8 @@
 
 @defopt idlwave-help-browser-is-local
 Is the browser selected in @code{idlwave-help-browser-function} run in a
-local Emacs buffer?  Defaults to @code{t} if the function contains
-"-w3".
+local Emacs buffer or window?  Defaults to @code{t} if the function
+contains "-w3".
 @end defopt
 
 @defopt idlwave-help-link-face
@@ -1517,16 +1547,15 @@
 @kindex C-c C-i
 IDLWAVE offers completion for class names, routine names, keywords,
 system variables, system variable tags, class structure tags, regular
-structure tags and file names.  As in many programming modes,
-completion is bound to @kbd{M-@key{TAB}} (or @kbd{@key{TAB}} in the
-IDLWAVE Shell --- @pxref{Using the Shell}).  Completion uses exactly
-the same internal information as routine info, so when necessary
-(rarely) it can be updated with @kbd{C-c C-i}
-(@code{idlwave-update-routine-info}).
+structure tags and file names.  As in many programming modes, completion
+is bound to @kbd{M-@key{TAB}} (or simply @kbd{@key{TAB}} in the IDLWAVE
+Shell --- @pxref{Using the Shell}).  Completion uses exactly the same
+internal information as routine info, so when necessary (rarely) it can
+be updated with @kbd{C-c C-i} (@code{idlwave-update-routine-info}).
 
 The completion function is context sensitive and figures out what to
-complete based location of the point.  Here are example lines and what
-@kbd{M-@key{TAB}} would try to complete when the cursor is on the
+complete based on the location of the point.  Here are example lines and
+what @kbd{M-@key{TAB}} would try to complete when the cursor is on the
 position marked with a @samp{_}:
 
 @example
@@ -1536,7 +1565,7 @@
 plot,x,y,/x_            @r{Keyword of @code{plot} procedure}
 plot,min(_              @r{Keyword of @code{min} function}
 obj -> a_               @r{Object method (procedure)}
-a(2,3) = obj -> a_      @r{Object method (function)}
+a[2,3] = obj -> a_      @r{Object method (function)}
 x = obj_new('IDL_       @r{Class name}
 x = obj_new('MyCl',a_   @r{Keyword to @code{Init} method in class @code{MyCl}}
 pro A_                  @r{Class name}
@@ -1655,16 +1684,17 @@
 @cindex Class ambiguity
 @cindex @code{self} object, default class
 An object method is not uniquely determined without the object's class.
-Since the class is almost always omitted in the calling source, IDLWAVE
-considers all available methods in all classes as possible method name
-completions.  The combined list of keywords of the current method in
-@emph{all} known classes which contain that method will be considered
-for keyword completion.  In the @file{*Completions*} buffer, the
-matching classes will be shown next to each item (see option
+Since the class is almost always omitted in the calling source (as
+required to obtain the true benefits of object-based programming),
+IDLWAVE considers all available methods in all classes as possible
+method name completions.  The combined list of keywords of the current
+method in @emph{all} known classes which contain that method will be
+considered for keyword completion.  In the @file{*Completions*} buffer,
+the matching classes will be shown next to each item (see option
 @code{idlwave-completion-show-classes}).  As a special case, the class
 of an object called @samp{self} is always taken to be the class of the
-current routine.  All classes it inherits from are considered as well
-where appropriate.
+current routine, when in an IDLWAVE buffer.  All inherits classes are
+considered as well.
 
 @cindex Forcing class query.
 @cindex Class query, forcing
@@ -1674,7 +1704,7 @@
 @code{idlwave-query-class} can be configured to make such prompting the
 default for all methods (not recommended), or selectively for very
 common methods for which the number of completing keywords would be too
-large (e.g. @code{Init}).  
+large (e.g. @code{Init,SetProperty,GetProperty}).  
 
 @cindex Saving object class on @code{->}
 @cindex @code{->}
@@ -1683,9 +1713,9 @@
 editing session.  Subsequent completions in the same statement
 (e.g. keywords) can then reuse this class information.  This works by
 placing a text property on the method invocation operator @samp{->},
-after which the operator will be shown in a different face.  This is not
-enabled by default --- the variable @code{idlwave-store-inquired-class}
-can be used to turn it on.
+after which the operator will be shown in a different face (bold by
+default).  The variable @code{idlwave-store-inquired-class} can be used
+to turn it off or on.
 
 @defopt idlwave-completion-show-classes (@code{1})
 Non-@code{nil} means show up to that many classes in
@@ -1701,14 +1731,14 @@
 Association list governing query for object classes during completion.
 @end defopt
 
-@defopt idlwave-store-inquired-class (@code{nil})
+@defopt idlwave-store-inquired-class (@code{t})
 Non-@code{nil} means store class of a method call as text property on
 @samp{->}.
 @end defopt
 
 @defopt idlwave-class-arrow-face
-Face to highlight object operator arrows @samp{->} which carry a class
-text property.
+Face to highlight object operator arrows @samp{->} which carry a saved
+class text property.
 @end defopt
 
 @node Object Method Completion in the Shell, Class and Keyword Inheritance, Object Method Completion and Class Ambiguity, Completion
@@ -1722,9 +1752,7 @@
 determine the class of the object.  If this query is successful, the
 class found will be used to select appropriate completions, routine
 info, or help.  If unsuccessful, information from all known classes will
-be used (as in the buffer).  Setting the variable
-@code{idlwave-store-inquired-class} can eliminate unnecessary repetitive
-queries for the object's class, and speed up completion.
+be used (as in the buffer). 
 
 @node   Class and Keyword Inheritance, Structure Tag Completion, Object Method Completion in the Shell, Completion
 @subsection Class and Keyword Inheritance
@@ -1802,7 +1830,17 @@
 @end lisp
 
 Once enabled, you'll also be able to access online help on the structure
-tags, using the usual methods (@pxref{Online Help}).
+tags, using the usual methods (@pxref{Online Help}).  In addition,
+structure variables in the shell will be queried for tag names, similar
+to the way object variables in the shell are queried for method names.
+So, e.g.:
+
+@example
+IDL> st.[Tab]
+@end example
+
+@noindent will complete with all structure fields of the structure
+@code{st}.
 
 @node Routine Source, Resolving Routines, Completion, The IDLWAVE Major Mode
 @section Routine Source
@@ -1817,9 +1855,10 @@
 @code{idlwave-routine-info} would have used, taken from nearby buffer
 contents.  In the minibuffer, specify a complete routine name (including
 any class part).  IDLWAVE will display the source file in another
-window, positioned at the routine in question.  You can also visit a
-routine in the current buffer, with completion, by using a single prefix
-(@kbd{C-u C-c C-v}).
+window, positioned at the routine in question.  You can also limit this
+to a routine in the current buffer only, with completion, and a
+context-sensitive default, by using a single prefix (@kbd{C-u C-c C-v})
+or the convenience binding @kbd{C-c C-t}.
 
 @cindex Buffers, killing
 @cindex Killing autoloaded buffers
@@ -1838,7 +1877,8 @@
 The key sequence @kbd{C-c =} calls the command @code{idlwave-resolve}
 and sends the line @samp{RESOLVE_ROUTINE, '@var{routine_name}'} to IDL
 in order to resolve (compile) it.  The default routine to be resolved is
-taken from context, but you get a chance to edit it.
+taken from context, but you get a chance to edit it.  Usually this is
+not necessary, since IDL automatically discovers routines on its path.
 
 @code{idlwave-resolve} is one way to get a library module within reach
 of IDLWAVE's routine info collecting functions.  A better way is to
@@ -1983,6 +2023,8 @@
 @tab @code{print,}
 @item @code{\pt}
 @tab @code{plot,}
+@item @code{\pv}
+@tab @code{ptr_valid()}
 @item @code{\re}
 @tab @code{read,}
 @item @code{\rf}
@@ -2144,14 +2186,16 @@
 
 Some operators can be automatically surrounded by spaces.  This can
 happen when the operator is typed, or later when the line is indented.
-IDLWAVE can pad the operators @samp{&}, @samp{<}, @samp{>}, @samp{,},
-@samp{=}, and @samp{->}, but this feature is turned off by default.  If
-you want to turn it on, customize the variables
-@code{idlwave-surround-by-blank} and @code{idlwave-do-actions}.  You can
-also define similar actions for other operators by using the function
-@code{idlwave-action-and-binding} in the mode hook.  For example, to
-enforce space padding of the @samp{+} and @samp{*} operators, try this
-in @file{.emacs}
+IDLWAVE can pad the operators @samp{<}, @samp{>}, @samp{,}, @samp{=},
+and @samp{->}, as well as the modified assignment operators
+(@samp{AND=}, @samp{OR=}, etc.).  This feature is turned off by default.
+If you want to turn it on, customize the variables
+@code{idlwave-surround-by-blank} and @code{idlwave-do-actions} and turn
+both on.  You can also define similar actions for other operators by
+using the function @code{idlwave-action-and-binding} in the mode hook.
+For example, to enforce space padding of the @samp{+} and @samp{*}
+operators (outside of strings and comments, of course), try this in
+@file{.emacs}
 
 @lisp
 (add-hook 'idlwave-mode-hook
@@ -2161,14 +2205,26 @@
      (idlwave-action-and-binding "+" '(idlwave-surround 1 1))))
 @end lisp
 
+Note that the modified assignment operators which begin with a word
+(@samp{AND=}, @samp{OR=}, @samp{NOT=}, etc.) require a leading space to
+be recognized (e.g @code{vAND=4} would be intepreted as a variable
+@code{vAND}).  Also note that, since e.g., @code{>} and @code{>=} are
+both valid operators, it is impossible to surround both by blanks while
+they are being typed.  Similarly with @code{&} and @code{&&}.  For
+these, a compromise is made: the padding is placed on the left, and if
+the longer operator is keyed in, on the right as well (otherwise you
+must insert spaces to pad right yourself, or press simply press Tab to
+repad everything if @code{idlwave-do-actions} is on).
+
 @defopt idlwave-surround-by-blank (@code{nil})
 Non-@code{nil} means enable @code{idlwave-surround}.  If non-@code{nil},
-@samp{=}, @samp{<}, @samp{>}, @samp{&}, @samp{,}, @samp{->} are
+@samp{=}, @samp{<}, @samp{>}, @samp{&}, @samp{,}, @samp{->}, and the
+modified assignment operators (@samp{AND=}, @samp{OR=}, etc.) are
 surrounded with spaces by @code{idlwave-surround}.
 @end defopt
 
 @defopt idlwave-pad-keyword (@code{t})
-Non-@code{nil} means pad @samp{=} for keywords like assignments.
+Non-@code{nil} means space-pad the @samp{=} in keyword assignments.
 @end defopt
 
 @node Case Changes,  , Padding Operators, Actions
@@ -2328,8 +2384,6 @@
 Normal hook.  Executed when @file{idlwave.el} is loaded.
 @end defopt
 
-
-
 @node The IDLWAVE Shell, Acknowledgements, The IDLWAVE Major Mode, Top
 @chapter The IDLWAVE Shell
 @cindex IDLWAVE shell
@@ -2346,11 +2400,9 @@
 interactively, to compile and run IDL programs in Emacs buffers and to
 debug these programs.  The IDLWAVE shell is built on @file{comint}, an
 Emacs packages which handles the communication with the IDL program.
-Unfortunately IDL for Windows does not have command-prompt versions
-and thus do not allow the interaction with Emacs@footnote{Please
-inform the maintainer if you come up with a way to make the IDLWAVE
-shell work on these systems.} --- so the IDLWAVE shell currently only
-works under Unix and MacOSX.
+Unfortunately, IDL for Windows does not have command-prompt versions and
+thus do not allow the interaction with Emacs --- so the IDLWAVE shell
+currently only works under Unix and MacOSX.
 
 @menu
 * Starting the Shell::          How to launch IDL as a subprocess
@@ -2448,6 +2500,11 @@
 shell buffer.
 @end defopt
 
+@defopt idlwave-shell-use-dedicated-window (@code{nil})
+Non-@code{nil} means use a dedicated window for the shell, taking care
+not it replace it with other buffers.
+@end defopt
+
 @defopt idlwave-shell-frame-parameters
 The frame parameters for a dedicated idlwave-shell frame.
 @end defopt
@@ -2539,6 +2596,9 @@
 (@code{idlwave-update-routine-info})
 @item @kbd{C-c C-v}
 @tab Find the source file of a routine (@code{idlwave-find-module})
+@item @kbd{C-c C-t}
+@tab Find the source file of a routine in the currently visited file 
+(@code{idlwave-find-module-this-file}).
 @item @kbd{C-c =}
 @tab Compile a library routine (@code{idlwave-resolve})
 @end multitable
@@ -2760,16 +2820,20 @@
 and re-enabled: @kbd{C-c C-d C-\}
 (@code{idlwave-shell-toggle-enable-current-bp}).  
 
-
-Breakpoint lines are highlighted or indicated with an icon in the
-source code (different icons for conditional, after, and other break
-types).  Disabled breakpoints are @emph{grayed out} by default.  Note
-that IDL places breakpoints as close as possible on or after the line
-you specify.  IDLWAVE queries the shell for the actual breakpoint
-location which was set, so the exact line you specify may not be
-marked.  You can re-sync the breakpoint list and display at any time
-(e.g., if you add or remove some on the command line) using @kbd{C-c
-C-d C-l}.
+Breakpoint lines are highlighted or indicated with an icon in the source
+code (different icons for conditional, after, and other break types).
+Disabled breakpoints are @emph{grayed out} by default.  Note that IDL
+places breakpoints as close as possible on or after the line you
+specify.  IDLWAVE queries the shell for the actual breakpoint location
+which was set, so the exact line you specify may not be marked.  You can
+re-sync the breakpoint list and update the display at any time (e.g., if
+you add or remove some on the command line) using @kbd{C-c C-d C-l}.  
+
+In recent IDLWAVE versions, the breakpoint line is highlighted when the
+mouse is moved over it, and a tooltip pops up describing the break
+details.  @kbd{Mouse-3} on the breakpoint line pops up a menu of
+breakpoint actions, including clearing, disabling, and adding or
+changing break conditions or ``after'' break count.
 
 Once the program has stopped somewhere, you can step through it.  The
 most important stepping commands are @kbd{C-c C-d C-s} to execute one
@@ -2785,7 +2849,7 @@
 @item @kbd{C-c C-d C-b}
 @tab Set breakpoint (@code{idlwave-shell-break-here})
 @item @kbd{C-c C-d C-i}
-@tab Set breakpoint in function named here (@code{idlwave-shell-break-in})
+@tab Set breakpoint in module named here (@code{idlwave-shell-break-in})
 @item @kbd{C-c C-d C-d}
 @tab Clear current breakpoint (@code{idlwave-shell-clear-current-bp})
 @item @kbd{C-c C-d C-a}
@@ -2821,7 +2885,14 @@
 @end multitable
 
 All of these commands have equivalents in Electric Debug Mode, which
-provides faster access (@pxref{Electric Debug Mode}).
+provides faster single-key access (@pxref{Electric Debug Mode}).
+
+The line where IDL is currently stopped, at breakpoints, halts, and
+errors, etc., is marked with a color overlay or arrow, depending on the
+setting in @code{idlwave-shell-mark-stop-line}.  If an overlay face is
+used to mark the stop line (as it is by default), when stepping through
+code, the face color is temporarily changed to gray, until IDL completes
+the next command and moves to the new line.
 
 @defopt idlwave-shell-mark-breakpoints (@code{t})
 Non-@code{nil} means mark breakpoints in the source file buffers.  The
@@ -2834,6 +2905,28 @@
 @code{idlwave-shell-mark-breakpoints} has the value @code{face}.
 @end defopt
 
+@defopt idlwave-shell-breakpoint-popup-menu (@code{t})
+Whether to pop-up a menu and present a tooltip description on
+breakpoint lines.
+@end defopt
+
+@defopt idlwave-shell-mark-stop-line (@code{t})
+Non-@code{nil} means mark the source code line where IDL is currently
+stopped.  The value specifies the preferred method.  Valid values are
+@code{nil}, @code{t}, @code{arrow}, and @code{face}.
+@end defopt
+
+@defopt idlwave-shell-overlay-arrow (@code{">"})
+The overlay arrow to display at source lines where execution halts, if
+configured in @code{idlwave-shell-mark-stop-line}.
+@end defopt
+
+@defopt idlwave-shell-stop-line-face
+The face which highlights the source line where IDL is stopped, if
+configured in @code{idlwave-shell-mark-stop-line}.
+@end defopt
+
+
 @node Compiling Programs, Walking the Calling Stack, Breakpoints and Stepping, Debugging IDL Programs
 @subsection Compiling Programs
 @cindex Compiling programs
@@ -2860,22 +2953,6 @@
 been set (or you give two prefix arguments), the last command on the
 @code{comint} input history is sent.
 
-@defopt idlwave-shell-mark-stop-line (@code{t})
-Non-@code{nil} means mark the source code line where IDL is currently
-stopped.  The value specifies the preferred method.  Valid values are
-@code{nil}, @code{t}, @code{arrow}, and @code{face}.
-@end defopt
-
-@defopt idlwave-shell-overlay-arrow (@code{">"})
-The overlay arrow to display at source lines where execution halts, if
-configured in @code{idlwave-shell-mark-stop-line}.
-@end defopt
-
-@defopt idlwave-shell-stop-line-face
-The face which highlights the source line where IDL is stopped, if
-configured in @code{idlwave-shell-mark-stop-line}.
-@end defopt
-
 @node Walking the Calling Stack, Electric Debug Mode, Compiling Programs, Debugging IDL Programs
 @subsection Walking the Calling Stack
 @cindex Calling stack, walking
@@ -2895,26 +2972,27 @@
 for information how to examine the value of variables and expressions on
 higher calling stack levels.
 
-@ifhtml
+@html
 <A NAME="EDEBUG"></A>
-@end ifhtml
+@end html
 @node Electric Debug Mode,  , Walking the Calling Stack, Debugging IDL Programs
 @subsection Electric Debug Mode
 @cindex Electric Debug Mode
 @cindex @samp{*Debugging*}
 
 Even with a convenient debug key prefix enabled, repetitive stepping,
-variable examination (@pxref{Examining Variables}), and other
-debugging activities can be awkward and slow using commands which
-require multiple keystrokes.  Luckily, there's a better way, inspired
-by the lisp e-debug mode, and available through the @emph{Electric
-Debug Mode}.  By default, as soon as a breakpoint is hit, this minor
-mode is enabled.  The buffer showing the line where execution has
-halted is switched to Electric Debug Mode.  This mode is visible as
-@samp{*Debugging*} in the mode line, and a different face (violet by
-default, where color is available) for the line stopped at point.  The
-buffer is made read-only and single-character bindings for the most
-commonly used debugging commands are enabled:
+variable examination (@pxref{Examining Variables}), and other debugging
+activities can be awkward and slow using commands which require multiple
+keystrokes.  Luckily, there's a better way, inspired by the lisp e-debug
+mode, and available through the @emph{Electric Debug Mode}.  By default,
+as soon as a breakpoint is hit, this minor mode is enabled.  The buffer
+showing the line where execution has halted is switched to Electric
+Debug Mode.  This mode is visible as @samp{*Debugging*} in the mode
+line, and a different face (violet by default, if color is available)
+for the line stopped at point.  The buffer is made read-only and
+single-character bindings for the most commonly used debugging commands
+are enabled.  These character commands (a list of which is available
+with @kbd{C-?}) are:
 
 @multitable @columnfractions .2 .8
 @item @kbd{a}
@@ -2923,10 +3001,12 @@
 @tab Set breakpoint, @kbd{C-u b} for a conditional break, @kbd{C-n b} for nth hit (@code{idlwave-shell-break-here})
 @item @kbd{d}
 @tab Clear current breakpoint (@code{idlwave-shell-clear-current-bp})
+@item @kbd{e}
+@tab Prompt for expression to print (@code{idlwave-shell-clear-current-bp}).
 @item @kbd{h}
 @tab Continue to the line at cursor position (@code{idlwave-shell-to-here})
 @item @kbd{i}
-@tab Set breakpoint in function named here (@code{idlwave-shell-break-in})
+@tab Set breakpoint in module named here (@code{idlwave-shell-break-in})
 @item @kbd{[}
 @tab Go to the previous breakpoint in the file (@code{idlwave-shell-goto-previous-bp})
 @item @kbd{]}
@@ -2978,7 +3058,7 @@
 
 Most single-character electric debug bindings use the final keystroke
 of the equivalent multiple key commands (which are of course also
-still available), but some differ (e.g. @kbd{t},@kbd{q},@kbd{x}).
+still available), but some differ (e.g. @kbd{e},@kbd{t},@kbd{q},@kbd{x}).
 Some have additional convenience bindings (like @kbd{@key{SPACE}} for
 stepping).  All prefix and other argument options described in this
 section for the commands invoked by electric debug bindings are still
@@ -3014,15 +3094,24 @@
 halts.
 @end defopt
 
+@defopt idlwave-shell-electric-stop-color (Violet)
+Default color of the stopped line overlay when in electric debug mode.
+@end defopt        
+
+@defopt idlwave-shell-electric-stop-line-face 
+The face to use for the stopped line.  Defaults to a face similar to the
+modeline, with color @code{idlwave-shell-electric-stop-color}.
+@end defopt
+
 @defopt idlwave-shell-electric-zap-to-file (@code{t})
 If set, when entering electric debug mode, select the window displaying
 the file where point is stopped.  This takes point away from the shell
 window, but is useful for immediate stepping, etc.
 @end defopt
 
-@ifhtml
+@html
 <A NAME="EXAMINE"></A>
-@end ifhtml
+@end html
 @node Examining Variables, Custom Expression Examination, Debugging IDL Programs, The IDLWAVE Shell
 @section Examining Variables
 @cindex @code{PRINT} expressions
@@ -3033,15 +3122,15 @@
 @cindex Mouse binding to print expressions
 
 @kindex C-c C-d C-p
-Do you find yourself repeatedly typing,
-e.g. @code{print,n_elements(x)}, and similar statements to remind
-yourself of the type/size/structure/value/etc. of variables and
-expressions in your code or at the command line?  IDLWAVE has a suite
-of special commands to automate these types of variable or expression
-examinations.  They work by sending statements to the shell formatted
-to include the indicated expression.
-
-These examination commands can be used in the shell or buffer at any
+Do you find yourself repeatedly typing, e.g. @code{print,n_elements(x)},
+and similar statements to remind yourself of the
+type/size/structure/value/etc. of variables and expressions in your code
+or at the command line?  IDLWAVE has a suite of special commands to
+automate these types of variable or expression examinations.  They work
+by sending statements to the shell formatted to include the indicated
+expression, and can be accessed in several ways.
+
+These @emph{examine} commands can be used in the shell or buffer at any
 time (as long as the shell is running), and are very useful when
 execution is stopped in a buffer due to a triggered breakpoint or error,
 or while composing a long command in the IDLWAVE shell.  In the latter
@@ -3055,19 +3144,23 @@
 If the variable @code{idlwave-shell-separate-examine-output} is
 non-@code{nil} (the default), all examine output will be sent to a
 special @file{*Examine*} buffer, rather than the shell.  The output of
-prior examine commands is saved.  In this buffer @key{c} clears the
-contents, and @key{q} hides the buffer.
+prior examine commands is saved in this buffer.  In this buffer @key{c}
+clears the contents, and @key{q} hides the buffer.
 
 The two most basic examine commands are bound to @kbd{C-c C-d C-p}, to
 print the expression at point, and @kbd{C-c C-d ?}, to invoke help on
 this expression@footnote{Available as @kbd{p} and @kbd{?} in Electric
 Debug Mode (@pxref{Electric Debug Mode})}.  The expression at point is
-either an array expression or a function call, or the contents of a
-pair of parentheses.  The selected expression is highlighted, and
-simultaneously the resulting output is highlighted in the shell.
-Calling the above commands with a prefix argument will use the current
-region as expression instead of using the one at point.  Two prefix
-arguments (@kbd{C-u C-u C-c C-d C-p}) will prompt for an expression.
+either an array expression or a function call, or the contents of a pair
+of parentheses.  The chosen expression is highlighted, and
+simultaneously the resulting output is highlighted in the shell or
+separate output buffer.  Calling the above commands with a prefix
+argument will use the current region as expression instead of using the
+one at point. which can be useful for examining complicated, multi-line
+expressions.  Two prefix arguments (@kbd{C-u C-u C-c C-d C-p}) will
+prompt for an expression to print directly.  By default, when invoking
+print, only an initial portion of long arrays will be printed, up to
+@code{idlwave-shell-max-print-length}.
 
 For added speed and convenience, there are mouse bindings which allow
 you to click on expressions and examine their values.  Use
@@ -3121,6 +3214,11 @@
 @file{*Examine*} buffer, instead of in the shell itself. 
 @end defopt
 
+@defopt idlwave-shell-max-print-length (200)
+The maximum number of leading array entries to print, when examining
+array expressions.
+@end defopt
+
 @node Custom Expression Examination,  , Examining Variables, The IDLWAVE Shell
 @section Custom Expression Examination
 @cindex Expressions, custom examination
@@ -3191,7 +3289,6 @@
 (three underscores) are replaced by the indicated expression.
 @end defopt
 
-
 @node Acknowledgements, Sources of Routine Info, The IDLWAVE Shell, Top
 @chapter Acknowledgements
 @cindex Acknowledgements
@@ -3219,8 +3316,8 @@
 @item 
 @uref{mailto:jdsmith@@as.arizona.edu, @b{J.D. Smith}}, the current
 maintainer, as of version 4.10, helped shape object method completion
-and most new features introduced in versions 4.x, and added
-significant new capabilities for versions 5.x.
+and most new features introduced in versions 4.x, and introduced many
+new features for IDLWAVE versions 5.x and 6.x.
 @end itemize
 
 @noindent
@@ -3264,6 +3361,10 @@
 Paul Sorenson <aardvark62__at__msn.com>
 @end itemize
 
+Doug Dirks was instrumental in providing the crucial IDL XML catalog to
+support HTML help with IDL v6.2 and later, and Ali Bahrami provided
+scripts and documentation to interface with the IDL Assistant.
+
 @noindent
 Thanks to everyone!
 
@@ -3298,24 +3399,26 @@
 
 @enumerate
 @item 
-@emph{Builtin routines} are defined inside IDL itself.  The source
-code of such routines is not available.
+@emph{Builtin routines} are defined inside IDL itself.  The source code
+of such routines is not available, but instead are learned about through
+the IDL documentation.
 @item
 Routines which are @emph{part of the current program}, are defined in a
 file explicitly compiled by the user.  This file may or may not be
 located on the IDL search path.
 @item 
 @emph{Library routines} are defined in files located on IDL's search
-path, and will not need to be manually compiled.  When a library routine
-is called for the first time, IDL will find the source file and compile
-it dynamically.  A special sub-category of library routines are the
-@emph{system routines} distributed with IDL, and usually available in
-the @file{lib} subdirectory of the IDL distribution.
+path.  When a library routine is called for the first time, IDL will
+find the source file and compile it dynamically.  A special sub-category
+of library routines are the @emph{system routines} distributed with IDL,
+and usually available in the @file{lib} subdirectory of the IDL
+distribution.
 @item
 External routines written in other languages (like Fortran or C) can be
 called with @code{CALL_EXTERNAL}, linked into IDL via @code{LINKIMAGE},
 or included as dynamically loaded modules (DLMs).  Currently IDLWAVE
-cannot provide routine info and completion for such external routines.
+cannot provide routine info and completion for such external routines,
+except by querying the Shell for calling information (DLMs only).
 @end enumerate
 
 @node Routine Information Sources, Catalogs, Routine Definitions, Sources of Routine Info
@@ -3335,15 +3438,15 @@
 @item
 It has a @emph{builtin list} with information about the routines IDL
 ships with.  IDLWAVE @value{VERSION} is distributed with a list of
-@value{NSYSROUTINES} routines and @value{NSYSKEYWORDS} keywords,
-reflecting IDL version @value{IDLVERSION}.  This list has been created
-by scanning the IDL manuals and is stored in the file
-@file{idlw-rinfo.el}.  @xref{Documentation Scan}, for information on
-how to regenerate this file for new versions of IDL.
+@value{NSYSROUTINES} routines, reflecting IDL version
+@value{IDLVERSION}.  As of IDL v6.2, the routine info is distributed
+directly with IDL in the form of an XML catalog which IDLWAVE scans.
+Formerly, this list was created by scanning the IDL manuals to produce
+the file @file{idlw-rinfo.el}.
 
 @item 
-It @emph{scans} all @emph{buffers} of the current Emacs session for
-routine definitions.  This is done automatically when routine
+IDLWAVE @emph{scans} all its @emph{buffers} in the current Emacs session
+for routine definitions.  This is done automatically when routine
 information or completion is first requested by the user.  Each new
 buffer and each buffer saved after making changes is also scanned. The
 command @kbd{C-c C-i} (@code{idlwave-update-routine-info}) can be used
@@ -3353,16 +3456,18 @@
 If you have an IDLWAVE-Shell running in the Emacs session, IDLWAVE will
 @emph{query the shell} for compiled routines and their arguments.  This
 happens automatically when routine information or completion is first
-requested by the user, and each time an Emacs buffer is compiled with
-@kbd{C-c C-d C-c}.  Though rarely necessary, the command @kbd{C-c C-i}
-(@code{idlwave-update-routine-info}) can be used to update the shell
-routine data.
+requested by the user.  Each time an Emacs buffer is compiled with
+@kbd{C-c C-d C-c}, the routine info for that file is queried.  Though
+rarely necessary, the command @kbd{C-c C-i}
+(@code{idlwave-update-routine-info}) can be used to explicitly update
+the shell routine data.
 
 @item
-Many popular libraries are distributed with routine information
-already scanned into @emph{library catalogs} (@pxref{Library
-Catalogs}).  These per-directory catalog files can also be built by
-the user with the supplied @file{idlwave_catalog} tool.
+Many popular libraries are distributed with routine information already
+scanned into @emph{library catalogs} (@pxref{Library Catalogs}).  These
+per-directory catalog files can also be built by the user with the
+supplied @file{idlwave_catalog} tool.  They are automatically discovered
+by IDLWAVE.
 
 @item
 IDLWAVE can scan selected directories of source files and store the
@@ -3371,9 +3476,10 @@
 Catalog}, for information on how to scan files in this way.
 @end enumerate
 
-Loading routine and catalog information can be a time consuming process,
-especially over slow networks.  Depending on the system and network
-configuration it could take up to 30 seconds.  In order to minimize the
+Loading all the routine and catalog information can be a time consuming
+process, especially over slow networks.  Depending on the system and
+network configuration it could take up to 30 seconds (though locally on
+fast systems is usually only a few seconds).  In order to minimize the
 wait time upon your first completion or routine info command in a
 session, IDLWAVE uses Emacs idle time to do the initialization in six
 steps, yielding to user input in between.  If this gets into your way,
@@ -3399,9 +3505,9 @@
 Controls under what circumstances routine info is updated automatically.
 @end defopt
 
-@ifhtml
+@html
 <A NAME="CATALOGS"></A>
-@end ifhtml
+@end html
 @node Catalogs, Load-Path Shadows, Routine Information Sources, Sources of Routine Info
 @appendixsec Catalogs
 @cindex Catalogs
@@ -3426,7 +3532,12 @@
 information (e.g. Windows), a library path must be specified in
 @code{idlwave-library-path} to allow library catalogs to be located, and
 to setup directories for user catalog scan (@pxref{User Catalog} for
-more on this variable).
+more on this variable).  Note that, before the shell is running, IDLWAVE
+can only know about the IDL search path by consulting the file pointed
+to by @code{idlwave-path-file} (@file{~/.idlwave/idlpath.el}, by
+default).  If @code{idlwave-auto-write-path} is enabled (which is the
+default), the paths are written out whenever the IDLWAVE shell is
+started.
 
 @defopt idlwave-auto-write-path  (@code{t})
 Write out information on the !PATH and !DIR paths from IDL automatically
@@ -3435,17 +3546,20 @@
 @end defopt
 
 @defopt idlwave-library-path
-IDL library path for Windows and MacOS.  Not needed under Unix/MacOSX.
+IDL library path for Windows and MacOS.  Under Unix/MacOSX, will be
+obtained from the Shell when run.
 @end defopt
 
 @defopt idlwave-system-directory
-The IDL system directory for Windows and MacOS.  Not needed under
-Unix/MacOSX (obtained from the Shell).
+The IDL system directory for Windows and MacOS.  Also needed for
+locating HTML help and the IDL Assistant for IDL v6.2 and later.  Under
+Unix/MacOSX, will be obtained from the Shell and recorded, if run.
 @end defopt
 
 @defopt idlwave-config-directory (@file{~/.idlwave})
-Default path where IDLWAVE saves configuration information and any
-user catalog.
+Default path where IDLWAVE saves configuration information, a user
+catalog (if any), and a cached scan of the XML catalog (IDL v6.2 and
+later).
 @end defopt
 
 @menu
@@ -3453,23 +3567,23 @@
 * User Catalog::                
 @end menu
 
-@ifhtml
+@html
 <A NAME="LIBRARY_CATALOGS"></A>
-@end ifhtml
+@end html
 @node Library Catalogs, User Catalog, Catalogs, Catalogs
 @appendixsubsec Library Catalogs
 @cindex @file{.idlwave_catalog}
 @cindex Library catalogs
 @cindex @code{idlwave_catalog}
 
-Library catalogs are files named @file{.idlwave_catalog} stored in
-directories containing @code{.pro} routine files.  They are discovered
-on the IDL search path and loaded automatically when routine information
-is read.  Each catalog file documents the routines found in that
-directory --- one catalog per directory.  Every catalog has a library
-name associated with it (e.g. @emph{AstroLib}).  This name will be shown
-briefly when the catalog is found, and in the routine info of routines
-it documents.
+Library catalogs consist of files named @file{.idlwave_catalog} stored
+in directories containing @code{.pro} routine files.  They are
+discovered on the IDL search path and loaded automatically when routine
+information is read.  Each catalog file documents the routines found in
+that directory --- one catalog per directory.  Every catalog has a
+library name associated with it (e.g. @emph{AstroLib}).  This name will
+be shown briefly when the catalog is found, and in the routine info of
+routines it documents.
 
 Many popular libraries of routines are shipped with IDLWAVE catalog
 files by default, and so will be automatically discovered.  Library
@@ -3482,7 +3596,8 @@
 re-scanned automatically to gather updates, e.g. in a @file{cron} job.
 Scanning is much faster than with the built-in user catalog method.  One
 minor disadvantage: the entire IDL search path is scanned for catalog
-files every time IDLWAVE starts up, which might be slow over a network.
+files every time IDLWAVE starts up, which might be slow if accessing IDL
+routines over a slow network.
 
 A Perl tool to create library catalogs is distributed with IDLWAVE:
 @code{idlwave_catalog}.  It can be called quite simply:
@@ -3490,9 +3605,10 @@
 idlwave_catalog MyLib
 @end example
 
-@noindent This would scan all directories recursively beneath the current and
+@noindent This will scan all directories recursively beneath the current and
 populate them with @file{.idlwave_catalog} files, tagging the routines
-found with the name library ``MyLib''.  The full usage information:
+found there with the name library ``MyLib''.  The full usage
+information:
 
 @example
 Usage: idlwave_catalog  [-l] [-v] [-d] [-s] [-f] [-h] libname
@@ -3514,8 +3630,8 @@
 @kbd{C-u C-c C-i}.
 
 @defopt idlwave-use-library-catalogs  (@code{t})
-Whether to search for and load library catalogs.  Only disable if
-performance is a problem and the catalogs are not needed.
+Whether to search for and load library catalogs.  Disable if load
+performance is a problem and/or the catalogs are not needed.
 @end defopt
 
 @node User Catalog,  , Library Catalogs, Catalogs
@@ -3560,11 +3676,11 @@
 (setq idlwave-system-directory "c:/RSI/IDL56/")
 @end lisp
 
-@noindent Under GNU and UNIX, these values will be automatically gathered from
-the IDLWAVE shell.
+@noindent Under GNU/Linux and UNIX, these values will be automatically
+gathered from the IDLWAVE shell, if run.
 
 The command @kbd{M-x idlwave-create-user-catalog-file} (or the menu item
-@samp{IDLWAVE->Routine Info->Select Catalog Directories} can then be
+@samp{IDLWAVE->Routine Info->Select Catalog Directories}) can then be
 used to create a user catalog.  It brings up a widget in which you can
 select some or all directories on the search path.  Directories which
 already contain a library catalog are marked with @samp{[LIB]}, and need
@@ -3642,7 +3758,7 @@
 @cindex MacOS
 @cindex IDL variable @code{!DIR}
 @cindex @code{!DIR}, IDL variable
-Users of Windows and MacOS also must set the variable
+Users of Windows and MacOS (not X) also must set the variable
 @code{idlwave-system-directory} to the value of the @code{!DIR} system
 variable in IDL.  IDLWAVE appends @file{lib} to the value of this
 variable and assumes that all files found on that path are system
@@ -3658,21 +3774,31 @@
 @cindex Scanning the documentation
 @cindex Perl program, to create @file{idlw-rinfo.el}
 
+@strong{Starting with version 6.2, IDL is distributed directly with HTML
+online help, and an XML-based catalog of routine information}.  This
+makes scanning the manuals with the tool @file{get_html_rinfo}, and the
+@file{idlw-rinfo.el} file it produced, as described here, entirely
+unnecessary.  The information is left here for users wishing to produce
+a catalog of older IDL versions' help.
+
+
 IDLWAVE derives its knowledge about system routines from the IDL
 manuals.  The file @file{idlw-rinfo.el} contains the routine information
 for the IDL system routines, and links to relevant sections of the HTML
 documentation.  The Online Help feature of IDLWAVE requires HTML
-versions of the IDL manuals to be available.
+versions of the IDL manuals to be available; the HTML documentation is
+not distributed with IDLWAVE by default, but must be downloaded
+separately.
 
 The HTML files and related images can be produced from the
 @file{idl.chm} HTMLHelp file distributed with IDL using the free
 Microsoft HTML Help Workshop.  If you are lucky, the maintainer of
-IDLWAVE will always have access to the newest version of IDL and
-provide updates.  The IDLWAVE distribution also contains the Perl
-program @file{get_html_rinfo} which constructs the
-@file{idlw-rinfo.el} file by scanning the HTML documents produced from
-the IDL documentation.  Instructions on how to use
-@file{get_html_rinfo} are in the program itself.
+IDLWAVE will always have access to the newest version of IDL and provide
+updates.  The IDLWAVE distribution also contains the Perl program
+@file{get_html_rinfo} which constructs the @file{idlw-rinfo.el} file by
+scanning the HTML documents produced from the IDL documentation.
+Instructions on how to use @file{get_html_rinfo} are in the program
+itself.
 
 @node HTML Help Browser Tips, Configuration Examples, Sources of Routine Info, Top
 @appendix HTML Help Browser Tips
@@ -3680,39 +3806,41 @@
 
 There are a wide variety of possible browsers to use for displaying
 the online HTML help available with IDLWAVE (starting with version
-5.0).  Since IDLWAVE runs on a many different system types, a single
-browser configuration is not possible, but choices abound.
-
-Unfortunately, the HTML manuals decompiled from the original
-source contain formatting structures which Netscape 4.x does not
-handle well, though they are still readable.  A much better choice is
-Mozilla, or one of the Mozilla-derived browsers such as
+5.0). Since IDL v6.2, a single cross-platform HTML help browser, the
+@emph{IDL Assistant} is distributed with IDL.  If this help browser is
+available, it is the preferred choice, and the default.  The variable
+@code{idlwave-help-use-assistant}, enabled by default, controls
+whether this help browser is used.  If you use the IDL Assistant, the
+tips here are not relevant.
+
+Since IDLWAVE runs on a many different system types, a single browser
+configuration is not possible, but choices abound.  On many systems,
+the default browser configured in @code{browse-url-browser-function},
+and hence inherited by default by
+@code{idlwave-help-browser-function}, is Netscape.  Unfortunately, the
+HTML manuals decompiled from the original source contain formatting
+structures which Netscape 4.x does not handle well, though they are
+still readable.  A much better choice is Mozilla, or one of the
+Mozilla-derived browsers such as
 @uref{http://galeon.sourceforge.net/,Galeon} (GNU/Linux),
 @uref{http://www.mozilla.org/projects/camino/,Camino} (MacOSX), or
 @uref{http://www.mozilla.org/projects/firebird/,Firebird} (all
 platforms).  Newer versions of Emacs provide a browser-function choice
 @code{browse-url-gnome-moz} which uses the Gnome-configured browser.
 
-Note that the HTML files decompiled from  Microsoft Help sources
-contain specific references to the @samp{Symbol} font, which by default
-is not permitted in normal encodings (it's invalid, technically).  Though
-it only impacts a few symbols, you can trick Mozilla-based browsers into
+Note that the HTML files decompiled from the help sources contain
+specific references to the @samp{Symbol} font, which by default is not
+permitted in normal encodings (it's invalid, technically).  Though it
+only impacts a few symbols, you can trick Mozilla-based browsers into
 recognizing @samp{Symbol} by following the directions
-@uref{http://hutchinson.belmont.ma.us/tth/Xfonts.html, here}.  With this
-fix in place, HTML help pages look almost identical to their PDF
-equivalents (yet can be bookmarked, browsed as history, searched, etc.).
+@uref{http://hutchinson.belmont.ma.us/tth/Xfonts.html, here}.  With
+this fix in place, HTML help pages look almost identical to their PDF
+equivalents (yet can be bookmarked, browsed as history, searched,
+etc.).
 
 @noindent Individual platform recommendations:
 
 @itemize @bullet
-@item Windows: The native Microsoft HTMLHelp browser is preferred,
-with even better results using the free
-@uref{http://www.keyworks.net/keyhh.htm,@code{KEYHH}} program to
-permit IDL help to be targetted to a single window.  To use HTMLHelp,
-specify @code{idlwave-help-use-hh} as @code{'hh} or @code{'keyhh}.
-One bonus: since IDL is shipped with the @file{idl.chm} help file, you
-don't need to download the HTML help package.  @xref{Help with HTML
-Documentation}.
 @item Unix/MacOSX: The @uref{http://www.w3m.org,@code{w3m}} browser
 and its associated
 @uref{http://emacs-w3m.namazu.org/,@code{emacs-w3m}} emacs mode
@@ -3907,9 +4035,9 @@
                                         "help,___,/STRUCTURE"))))
 @end example
 
-@ifhtml
+@html
 <A NAME="WIN_MAC"></A>
-@end ifhtml
+@end html
 @node Windows and MacOS, Troubleshooting, Configuration Examples, Top
 @appendix Windows and MacOS
 @cindex Windows
@@ -3920,40 +4048,34 @@
 portability of Emacs, much of IDLWAVE does also work under different
 operating systems like Windows (with NTEmacs or NTXEmacs) or MacOS.
 
-The only real problem is that there is no command-line
-version of IDL for Windows or MacOS(<=9) with which IDLWAVE can
-interact.  As a result, the IDLWAVE Shell
-does not work and you have to rely on IDLDE to run and debug your
-programs.  However, editing IDL source files with Emacs/IDLWAVE works
-with all bells and whistles, including routine info, completion and fast
-online help.  Only a small amount of additional information must be
-specified in your @file{.emacs} file: the path names which, on a UNIX
-system, are automatically gathered by talking to the IDL program.
+The only real problem is that there is no command-line version of IDL
+for Windows or MacOS(<=9) with which IDLWAVE can interact.  As a
+result, the IDLWAVE Shell does not work and you have to rely on IDLDE
+to run and debug your programs.  However, editing IDL source files
+with Emacs/IDLWAVE works with all bells and whistles, including
+routine info, completion and fast online help.  Only a small amount of
+additional information must be specified in your @file{.emacs} file:
+the path names which, on a UNIX system, are automatically gathered by
+talking to the IDL program.
 
 Here is an example of the additional configuration needed for a Windows
 system.  I am assuming that IDLWAVE has been installed in
 @w{@samp{C:\Program Files\IDLWAVE}} and that IDL is installed in
-@w{@samp{C:\RSI\IDL55}}.
+@w{@samp{C:\RSI\IDL62}}.
 
 @lisp
-;; location of the lisp files (needed if IDLWAVE is not part of 
-;; the X/Emacs installation)
+;; location of the lisp files (only needed if IDLWAVE is not part of
+;; your default X/Emacs installation)
 (setq load-path (cons "c:/program files/IDLWAVE" load-path))
 
-;; The location of the IDL library files, both standard and your own.
+;; The location of the IDL library directories, both standard,  and your own.
 ;; note that the initial "+" expands the path recursively
 (setq idlwave-library-path
-        '("+c:/RSI/IDL55/lib/" "+c:/user/me/idllibs" ))
+        '("+c:/RSI/IDL55/lib/" "+c:/path/to/my/idllibs" ))
 
 ;; location of the IDL system directory (try "print,!DIR")
-(setq idlwave-system-directory "c:/RSI/IDL55/")
-
-;; specify using the HTMLHelp documentation for online help, with the
-;;  KEYHH helper routine (Windows only)
-(setq idlwave-use-hh 'keyhh)
-
-;; file in which to store the user catalog info
-(setq idlwave-user-catalog-file "c:/IDLWAVE/idlcat.el")
+(setq idlwave-system-directory "c:/RSI/IDL62/")
+
 @end lisp
 
 @noindent Furthermore, Windows sometimes tries to outsmart you --- make
@@ -3971,9 +4093,9 @@
 help can skip the browser and use the HTMLHelp functionality directly.
 @xref{Help with HTML Documentation}.
 
-@ifhtml
+@html
 <A NAME="TROUBLE"></A>
-@end ifhtml
+@end html
 @node Troubleshooting, Index, Windows and MacOS, Top
 @appendix Troubleshooting
 @cindex Troubleshooting
@@ -3996,7 +4118,7 @@
 if you prefer not to enter electric debug on breakpoints@dots{} but
 you really should try it before you disable it!  You can also
 customize this variable to enter debug mode when errors are
-encountered too.  
+encountered.  
 
 @item @strong{I get errors like @samp{Searching for program: no such
 file or directory, idl} when attempting to start the IDL shell.}
@@ -4020,11 +4142,11 @@
 there, or start Emacs and IDLWAVE from the shell.
 
 @item @strong{I get errors like @samp{Symbol's function is void:
-overlayp} when trying to start the shell in XEmacs}
+overlayp}}
 
 You don't have the @samp{fsf-compat} package installed, which IDLWAVE
-needs to run under XEmacs.  Install it and, if necessary, insert
-@code{(require 'overlay)} in your @file{.emacs}.
+needs to run under XEmacs.  Install it, or find an XEmacs distribution
+which includes it by default.
 
 @item @strong{I'm getting errors like @samp{Symbol's value as variable is void:
 cl-builtin-gethash} on completion or routine info.}
@@ -4035,7 +4157,7 @@
 place, and this is the source of the error.  If you recompile (or just
 "make; make install") from source, it should resolve this problem.
 Another option is to recompile the @file{idlw*.el} files by hand using
-@kbd{M-x byte-compile-file}.
+@kbd{M-x byte-compile-file}.  
 
 @item @strong{@kbd{M-@key{TAB}} doesn't complete words, it switches
 windows on my desktop.}
@@ -4063,7 +4185,7 @@
 in your @file{.emacs}:
 
 @lisp
-(setq idlwave-shell-prompt-pattern "^\\(ENVI\\|IDL\\)> ")
+(setq idlwave-shell-prompt-pattern "^\r? ?\\(ENVI\\|IDL\\)> ")
 @end lisp
 
 @item @strong{Attempts to set breakpoints fail: no breakpoint is
@@ -4095,7 +4217,8 @@
 @end lisp
 
 @noindent You can check on your load-path value using @kbd{C-h v
-load-path @key{RET}}.
+load-path @key{RET}}, and @kbd{C-h m} in an IDLWAVE buffer should show
+you the version Emacs is using.
 
 @item @strong{IDLWAVE is screwing up the formatting of my @file{.idl} files.}
 
@@ -4117,10 +4240,10 @@
 compiled in the shell should be up to date.  For other routines, the
 information is only as current as the most recent scan.  If you have a
 rapidly changing set of routines, and you'd like the latest routine
-information to be available for it, one powerful technique makes use of
-the library catalog tool, @samp{idlwave_catalog}.  Simply add a line to
-your @samp{cron} file (@samp{crontab -e} will let you edit this on some
-systems), like this:
+information to be available for it, one powerful technique is to make
+use of the library catalog tool, @samp{idlwave_catalog}.  Simply add a
+line to your @samp{cron} file (@samp{crontab -e} will let you edit this
+on some systems), like this
 
 @example
 45 3 * * 1-5 (cd /path/to/myidllib; /path/to/idlwave_catalog MyLib)
@@ -4130,14 +4253,15 @@
 rescan all @file{.pro} files at or below @file{/path/to/myidllib} every
 week night at 3:45am.  You can even scan site-wide libraries with this
 method, and the most recent information will be available to all users.
+Since the scanning is very fast, there is very little impact.
 
 @item @strong{All the Greek-font characters in the HTML help are
 displayed as Latin characters!}
 
-Unfortunately, the HTMLHelp files attempt to switch to
+Unfortunately, the HTMLHelp files RSI provides attempt to switch to
 @samp{Symbol} font to display Greek characters, which is not really an
 permitted method for doing this in HTML.  There is a "workaround" for
-many browsers: @xref{HTML Help Browser Tips}.
+some browsers: @xref{HTML Help Browser Tips}.
 
 @item @strong{In the shell, my long commands are truncated at 256 characters!}
 
@@ -4150,6 +4274,32 @@
 memory-bounded limit), but disables the processing of background
 widget events (those with @code{/NO_BLOCK} passed to @code{XManager}).
 
+@item @strong{When I invoke IDL HTML help on a routine, the page which
+is loaded is one page off, e.g. for @code{CONVERT_COORD}, I get
+@code{CONTOUR}.}
+
+You have a mismatch between your help index and the HTML help package
+you downloaded.  You need to ensure you download a ``downgrade kit'' if
+you are using anything older than the latest HTML help package.  A new
+help package apppears with each IDL release (assuming the documentation
+is updated).  
+Starting with IDL 6.2, the HTML help and its catalog are
+distributed with IDL, and so should never be inconsistent.
+
+@item @strong{I get errors such as @samp{void-variable
+browse-url-browser-function} or similar when attempting to load IDLWAVE
+under XEmacs.}
+
+You don't have the @samp{browse-url} (or other required) XEmacs package.
+Unlike GNU Emacs, XEmacs distributes many packages separately from the
+main program.  IDLWAVE is actually among these, but is not always the
+most up to date.  When installing IDLWAVE as an XEmacs package, it
+should prompt you for required additional packages.  When installing it
+from source, it won't and you'll get this error.  The easiest solution
+is to install all the packages when you install XEmacs (the so-called
+@samp{sumo} bundle).  The minimum set of XEmacs packages required by
+IDLWAVE is @samp{fsf-compat, xemacs-base, mail-lib}.
+
 @end enumerate
 
 @node Index,  , Troubleshooting, Top
--- a/man/killing.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/killing.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -543,6 +543,7 @@
 commands are useful with text in multicolumn formats, and for changing
 text into or out of such formats.
 
+@cindex mark rectangle
   When you must specify a rectangle for a command to work on, you do it
 by putting the mark at one corner and point at the opposite corner.  The
 rectangle thus specified is called the @dfn{region-rectangle} because
--- a/man/macos.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/macos.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -2,7 +2,7 @@
 @c Copyright (C) 2000, 2001, 2002, 2003, 2004,
 @c   2005, 2006 Free Software Foundation, Inc.
 @c See file emacs.texi for copying conditions.
-@node Mac OS, MS-DOS, Antinews, Top
+@node Mac OS, Emacs and Microsoft Windows, Antinews, Top
 @appendix Emacs and Mac OS
 @cindex Mac OS
 @cindex Macintosh
--- a/man/message.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/message.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -70,7 +70,7 @@
 @c Adjust ../Makefile.in if you change the following lines:
 Message is distributed with Gnus.  The Gnus distribution
 @c
-corresponding to this manual is Gnus v5.10.6.
+corresponding to this manual is Gnus v5.11.
 
 
 @node Interface
--- a/man/mh-e.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/mh-e.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -11,9 +11,9 @@
 @set VERSION 7.93
 @c Edition of the manual. It is either empty for the first edition or
 @c has the form ", nth Edition" (without the quotes).
-@set EDITION , 5th Edition
-@set UPDATED 2006-03-19
-@set UPDATE-MONTH March, 2006
+@set EDITION , 6th Edition
+@set UPDATED 2006-04-02
+@set UPDATE-MONTH April, 2006
 
 @c Other variables.
 @set MH-BOOK-HOME http://www.ics.uci.edu/~mh/book/mh
@@ -591,9 +591,9 @@
 If you've never run MH before, you need to run @command{install-mh}
 from the shell before you continue. This sets up your personal MH
 environment@footnote{See the section
-@uref{@value{MH-BOOK-HOME}/setup.htm, Setting Up MH} in the MH book.}.
-If you don't, you'll be greeted with the error message: @samp{Install
-MH and run install-mh before running MH-E}.
+@uref{@value{MH-BOOK-HOME}/../overall/setup.htm, Setting Up MH} in the
+MH book.}. If you don't, you'll be greeted with the error message:
+@samp{Install MH and run install-mh before running MH-E}.
 
 @cindex @samp{Path:} MH profile component
 @cindex MH profile
@@ -7502,7 +7502,7 @@
 @cindex spam filters, Spamassassin
 @cindex spam filters, bogofilter
 
-MH-E depends on @uref{http://www.spamassassin.org/, SpamAssassin},
+MH-E depends on @uref{http://spamassassin.apache.org/, SpamAssassin},
 @uref{http://bogofilter.sourceforge.net/, bogofilter}, or
 @uref{http://spamprobe.sourceforge.net/, SpamProbe} to throw the dreck
 away. This chapter describes briefly how to configure these programs
@@ -7557,7 +7557,7 @@
 
 SpamAssassin is one of the more popular spam filtering programs. Get
 it from your local distribution or from the
-@uref{http://spamassassin.org/, SpamAssassin web site}.
+@uref{http://spamassassin.apache.org/, SpamAssassin web site}.
 
 To use SpamAssassin, add the following recipes to @file{~/.procmailrc}:
 
@@ -8542,12 +8542,12 @@
 @kindex M-x mh-version
 
 Bug reports should be filed at
-@uref{https://sourceforge.net/bugs/?group_id=13357, SourceForge}. You
-need to be a SourceForge user to submit bug reports, but this is easy
-enough to do that it shouldn't be a restriction for you. Please
-include the output of @kbd{M-x mh-version} (@pxref{Miscellaneous}) in
-any bug report you send unless you're 110% positive we won't ask for
-it.
+@uref{https://sourceforge.net/tracker/?group_id=13357&atid=113357,
+SourceForge}. You need to be a SourceForge user to submit bug reports,
+but this is easy enough to do that it shouldn't be a restriction for
+you. Please include the output of @kbd{M-x mh-version}
+(@pxref{Miscellaneous}) in any bug report you send unless you're 110%
+positive we won't ask for it.
 
 @node Mailing Lists, MH FAQ and Support, Bug Reports, Odds and Ends
 @appendixsec MH-E Mailing Lists
@@ -8577,10 +8577,10 @@
 @cindex support
 
 You can find FAQs on MH-E at the
-@uref{https://sourceforge.net/support/?group_id=13357, Support
-Requests} page on SourceForge. If you don't find the answer to your
-question, file a support request and your question will become a new
-FAQ!
+@uref{https://sourceforge.net/tracker/?group_id=13357&atid=213357,
+Support Requests} page on SourceForge. If you don't find the answer to
+your question, file a support request and your question will become a
+new FAQ!
 
 @node Getting MH-E,  , MH FAQ and Support, Odds and Ends
 @appendixsec Getting MH-E
--- a/man/misc.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/misc.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -9,9 +9,10 @@
 else: reading netnews, running shell commands and shell subprocesses,
 using a single shared Emacs for utilities that expect to run an editor
 as a subprocess, printing hardcopy, sorting text, narrowing display to
-part of the buffer, editing double-column files and binary files, saving
-an Emacs session for later resumption, emulating other editors, and
-various diversions and amusements.
+part of the buffer, editing double-column files and binary files,
+saving an Emacs session for later resumption, following hyperlinks,
+browsing images, emulating other editors, and various diversions and
+amusements.
 
 @end iftex
 
@@ -49,15 +50,15 @@
 @node Buffers of Gnus
 @subsection Gnus Buffers
 
-As opposed to most normal Emacs packages, Gnus uses a number of
-different buffers to display information and to receive commands.  The
-three buffers users spend most of their time in are the @dfn{group
-buffer}, the @dfn{summary buffer} and the @dfn{article buffer}.
-
-The @dfn{group buffer} contains a list of groups.  This is the first
-buffer Gnus displays when it starts up.  It normally displays only the
-groups to which you subscribe and that contain unread articles.  Use
-this buffer to select a specific group.
+Unlike most Emacs packages, Gnus uses several buffers to display
+information and to receive commands.  The three Gnus buffers users use
+most are the @dfn{group buffer}, the @dfn{summary buffer} and the
+@dfn{article buffer}.
+
+The @dfn{group buffer} contains a list of newsgroups.  This is the
+first buffer Gnus displays when it starts up.  It normally displays
+only the groups to which you subscribe and that contain unread
+articles.  Use this buffer to select a specific group.
 
 The @dfn{summary buffer} lists one line for each article in a single
 group.  By default, the author, the subject and the line number are
@@ -67,9 +68,10 @@
 buffer to select an article.
 
 The @dfn{article buffer} displays the article.  In normal Gnus usage,
-you don't select this buffer---all useful article-oriented commands work
-in the summary buffer.  But you can select the article buffer, and
-execute all Gnus commands from that buffer, if you want to.
+you see this buffer but you don't select it---all useful
+article-oriented commands work in the summary buffer.  But you can
+select the article buffer, and execute all Gnus commands from that
+buffer, if you want to.
 
 @node Gnus Startup
 @subsection When Gnus Starts Up
@@ -111,9 +113,9 @@
 buffer in its small window.
 @end enumerate
 
-  Each Gnus buffer has its own special commands; however, the meanings
-of any given key in the various Gnus buffers are usually analogous, even
-if not identical.  Here are commands for the group and summary buffers:
+  Each Gnus buffer has its own special commands; the meanings of any
+given key in the various Gnus buffers are usually analogous, even if
+not identical.  Here are commands for the group and summary buffers:
 
 @table @kbd
 @kindex q @r{(Gnus Group mode)}
@@ -315,9 +317,6 @@
 to an Emacs buffer named @samp{*shell*} or run a shell inside a terminal
 emulator window.
 
-There is a shell implemented entirely in Emacs, documented in a separate
-manual.  @xref{Top,Eshell,Eshell, eshell, Eshell: The Emacs Shell}.
-
 @table @kbd
 @item M-! @var{cmd} @key{RET}
 Run the shell command line @var{cmd} and display the output
@@ -333,11 +332,12 @@
 Run a subshell with input and output through an Emacs buffer.
 You can then give commands interactively.
 Full terminal emulation is available.
-@item M-x eshell
-@findex eshell
-Start the Emacs shell.
 @end table
 
+  @kbd{M-x eshell} invokes a shell implemented entirely in Emacs.  It
+is documented in a separate manual.  @xref{Top,Eshell,Eshell, eshell,
+Eshell: The Emacs Shell}.
+
 @menu
 * Single Shell::           How to run one shell command and return.
 * Interactive Shell::      Permanent shell taking input via Emacs.
@@ -379,37 +379,38 @@
 For a synchronous shell command, @code{shell-command} returns the
 command's exit status (0 means success), when it is called from a Lisp
 program.  You do not get any status information for an asynchronous
-command, since it hasn't finished yet.
+command, since it hasn't finished yet when @code{shell-command} returns.
 
 @kindex M-|
 @findex shell-command-on-region
   @kbd{M-|} (@code{shell-command-on-region}) is like @kbd{M-!} but
 passes the contents of the region as the standard input to the shell
-command, instead of no input.  If a numeric argument is used, meaning
-insert the output in the current buffer, then the old region is deleted
-first and the output replaces it as the contents of the region.  It
-returns the command's exit status when it is called from a Lisp program.
+command, instead of no input.  With a numeric argument, meaning insert
+the output in the current buffer, it deletes the old region and the
+output replaces it as the contents of the region.  It returns the
+command's exit status, like @kbd{M-!}.
 
   One use for @kbd{M-|} is to run @code{gpg} to see what keys are in
 the buffer.  For instance, if the buffer contains a GPG key, type
-@kbd{C-x h M-| gpg @key{RET}} to feed the entire buffer contents
-to the @code{gpg} program.  That program will ignore everything except
-the encoded keys, and will output a list of the keys it contains.
+@kbd{C-x h M-| gpg @key{RET}} to feed the entire buffer contents to
+the @code{gpg} program.  That program will ignore everything except
+the encoded keys, and will output a list of the keys the buffer
+contains.
 
 @vindex shell-file-name
-  Both @kbd{M-!} and @kbd{M-|} use @code{shell-file-name} to specify the
-shell to use.  This variable is initialized based on your @env{SHELL}
-environment variable when Emacs is started.  If the file name does not
-specify a directory, the directories in the list @code{exec-path} are
-searched; this list is initialized based on the environment variable
-@env{PATH} when Emacs is started.  Your @file{.emacs} file can override
-either or both of these default initializations.@refill
+  Both @kbd{M-!} and @kbd{M-|} use @code{shell-file-name} to specify
+the shell to use.  This variable is initialized based on your
+@env{SHELL} environment variable when Emacs is started.  If the file
+name is relative, Emacs searches the directories in the list
+@code{exec-path}; this list is initialized based on the environment
+variable @env{PATH} when Emacs is started.  Your @file{.emacs} file
+can override either or both of these default initializations.
 
   Both @kbd{M-!} and @kbd{M-|} wait for the shell command to complete,
 unless you end the command with @samp{&} to make it asynchronous.  To
 stop waiting, type @kbd{C-g} to quit; that terminates the shell
 command with the signal @code{SIGINT}---the same signal that @kbd{C-c}
-normally generates in the shell.  Emacs waits until the command
+normally generates in the shell.  Emacs then waits until the command
 actually terminates.  If the shell command doesn't stop (because it
 ignores the @code{SIGINT} signal), type @kbd{C-g} again; this sends
 the command a @code{SIGKILL} signal which is impossible to ignore.
@@ -422,10 +423,11 @@
 @kbd{C-x @key{RET} c} immediately beforehand.  @xref{Communication Coding}.
 
 @vindex shell-command-default-error-buffer
-  Error output from the command is normally intermixed with the regular
-output.  If you set the variable
-@code{shell-command-default-error-buffer} to a string, which is a buffer
-name, error output is inserted before point in the buffer of that name.
+  Error output from these commands is normally intermixed with the
+regular output.  But if the variable
+@code{shell-command-default-error-buffer} has a string as value, and
+it's the name of a buffer, @kbd{M-!} and @kbd{M-|} insert error output
+before point in that buffer.
 
 @node Interactive Shell
 @subsection Interactive Inferior Shell
@@ -456,8 +458,8 @@
 prefix argument (e.g. @kbd{C-u M-x shell}), which will read a buffer
 name and create (or reuse) a subshell in that buffer.  You can also
 rename the @samp{*shell*} buffer using @kbd{M-x rename-uniquely}, then
-create a new @samp{*shell*} buffer using plain @kbd{M-x shell}.  All the
-subshells in different buffers run independently and in parallel.
+create a new @samp{*shell*} buffer using plain @kbd{M-x shell}.
+Subshells in different buffers run independently and in parallel.
 
 @vindex explicit-shell-file-name
 @cindex environment variables for subshells
@@ -479,9 +481,10 @@
 @file{~/.emacs_bash}.
 
   To specify a coding system for the shell, you can use the command
-@kbd{C-x @key{RET} c} immediately before @kbd{M-x shell}.  You can also
-specify a coding system after starting the shell by using @kbd{C-x
-@key{RET} p} in the shell buffer.  @xref{Communication Coding}.
+@kbd{C-x @key{RET} c} immediately before @kbd{M-x shell}.  You can
+also change the coding system for a running subshell by typing
+@kbd{C-x @key{RET} p} in the shell buffer.  @xref{Communication
+Coding}.
 
 @cindex @env{EMACS} environment variable
   Unless the environment variable @env{EMACS} is already defined,
@@ -505,10 +508,10 @@
 @kindex RET @r{(Shell mode)}
 @findex comint-send-input
 At end of buffer send line as input; otherwise, copy current line to
-end of buffer and send it (@code{comint-send-input}).  When a line is
-copied, any prompt at the beginning of the line (text output by
-programs preceding your input) is omitted.  @xref{Shell Prompts}, for
-how Shell mode recognizes prompts.
+end of buffer and send it (@code{comint-send-input}).  Copying a line
+in this way omits any prompt at the beginning of the line (text output
+by programs preceding your input).  @xref{Shell Prompts}, for how
+Shell mode recognizes prompts.
 
 @item @key{TAB}
 @kindex TAB @r{(Shell mode)}
@@ -2185,7 +2188,7 @@
 key bindings.
 @end table
 
-@node Hyperlinking, Dissociated Press, Emulation, Top
+@node Hyperlinking, Thumbnails, Emulation, Top
 @section Hyperlinking and Navigation Features
 
 @cindex hyperlinking
@@ -2351,7 +2354,76 @@
 find the one you select (@code{ffap-menu}).
 @end table
 
-@node Dissociated Press, Amusements, Hyperlinking, Top
+@node Thumbnails, Dissociated Press, Hyperlinking, Top
+@section Viewing Images as Thumbnails
+@cindex tumme mode
+@cindex thumbnails
+
+  Tumme is a facility for browsing image files.  It provides viewing
+the images either as thumbnails or in full size, either inside Emacs
+or through an external viewer.
+
+  To enter Tumme, type @kbd{M-x tumme}.  It prompts for a directory;
+specify one that has images files.  This creates thumbnails for all
+the images in that directory, and displays them all in the ``thumbnail
+buffer''.  This takes a long time if the directory contains many image
+files, and it asks for confirmation if the number of image files
+exceeds @code{tumme-show-all-from-dir-max-files}.
+
+@kindex C-t d @r{(Tumme)}
+@findex tumme-display-thumbs
+  You can also enter Tumme through Dired.  Mark the image files you
+want to look at, using @kbd{m} as usual, then type @kbd{C-t d}
+(@code{tumme-display-thumbs}).  This too creates and switches to
+a buffer containing thumbnails, corresponding to the marked files.
+
+  With point in the thumbnail buffer, type @kbd{RET}
+(@code{tumme-display-thumbnail-original-image}) to display a sized
+version of it in another window.  This sizes the image to fit the
+window.  Use the arrow keys to move around in the buffer.  For easy
+browing, type @kbd{SPC} (@code{tumme-display-next-thumbnail-original})
+to advance and display the next image.  Typing @kbd{DEL}
+(@code{tumme-display-previous-thumbnail-original}) backs up to the
+previous thumbnail and displays that instead.
+
+@vindex tumme-external-viewer
+  To view and the image in its original size, either provide a prefix
+argument (@kbd{C-u}) before pressing @kbd{RET}, or type @kbd{C-@key{RET}}
+(@code{tumme-thumbnail-display-external}) to display the image in an
+external viewer.  You must first configure
+@code{tumme-external-viewer}.
+
+  You can delete images through Tumme also.  Type @kbd{d}
+(@code{tumme-flag-thumb-original-file}) to flag the image file for
+deletion in the Dired buffer.  You can also delete the thumbnail image
+from the thumbnail buffer with @kbd{C-d} (@code{tumme-delete-char}).
+
+  More advanced features include @dfn{image tags}, which are metadata
+used to categorize image files.  The tags are stored in a plain text
+file configured by @code{tumme-db-file}.
+
+  To tag image files, mark them in the dired buffer (you can also mark
+files in Dired from the thumbnail buffer by typing @kbd{m}) and type
+@kbd{C-t t} (@code{tumme-tag-files}).  You will be prompted for a tag.
+To mark files having a certain tag, type @kbd{C-t f}
+(@code{tumme-mark-tagged-files}).  After marking image files with a
+certain tag, you can use @kbd{C-t d} to view them.
+
+  You can also tag a file directly from the thumbnail buffer by typing
+@kbd{t t} and you can remove a tag by typing @kbd{t r}.  There is also
+a special ``tag'' called ``comment'' for each file (it is not a tag in
+the exact same sense as the other tags, it is handled slightly
+different).  That is used to enter a comment or description about the
+image.  You comment a file from the thumbnail buffer by typing
+@kbd{c}.  You will be prompted for a comment.  Type @kbd{C-t c} to add
+a comment from Dired (@code{tumme-dired-comment-files}).
+
+  Tumme also provides simple image manipulation.  In the thumbnail
+buffer, type @kbd{L} to rotate the original image 90 degrees anti
+clockwise, and @kbd{R} to rotate it 90 degrees clockwise.  This
+rotation is lossless, and uses an external utility called JpegTRAN.
+
+@node Dissociated Press, Amusements, Thumbnails, Top
 @section Dissociated Press
 
 @findex dissociated-press
@@ -2376,12 +2448,13 @@
 to a different point in the file, it might spot the `ent' in `pentagon'
 and continue from there, producing `presidentagon'.@footnote{This
 dissociword actually appeared during the Vietnam War, when it was very
-appropriate.}  Long sample texts produce the best results.
+appropriate.  Bush has made it appropriate again.}  Long sample texts
+produce the best results.
 
 @cindex againformation
   A positive argument to @kbd{M-x dissociated-press} tells it to operate
 character by character, and specifies the number of overlap characters.  A
-negative argument tells it to operate word by word and specifies the number
+negative argument tells it to operate word by word, and specifies the number
 of overlap words.  In this mode, whole words are treated as the elements to
 be permuted, rather than characters.  No argument is equivalent to an
 argument of two.  For your againformation, the output goes only into the
@@ -2390,13 +2463,13 @@
 @cindex Markov chain
 @cindex ignoriginal
 @cindex techniquitous
-  Dissociated Press produces nearly the same results as a Markov chain
-based on a frequency table constructed from the sample text.  It is,
-however, an independent, ignoriginal invention.  Dissociated Press
+  Dissociated Press produces results fairly like those of a Markov
+chain based on a frequency table constructed from the sample text.  It
+is, however, an independent, ignoriginal invention.  Dissociated Press
 techniquitously copies several consecutive characters from the sample
-between random choices, whereas a Markov chain would choose randomly for
-each word or character.  This makes for more plausible sounding results,
-and runs faster.
+between random choices, whereas a Markov chain would choose randomly
+for each word or character.  This makes for more plausible sounding
+results, and runs faster.
 
 @cindex outragedy
 @cindex buggestion
@@ -2405,7 +2478,7 @@
 @cindex developediment
 @cindex userenced
   It is a mustatement that too much use of Dissociated Press can be a
-developediment to your real work.  Sometimes to the point of outragedy.
+developediment to your real work, sometimes to the point of outragedy.
 And keep dissociwords out of your documentation, if you want it to be well
 userenced and properbose.  Have fun.  Your buggestions are welcome.
 
@@ -2429,7 +2502,7 @@
 @findex mpuz
 @findex 5x5
 @cindex puzzles
-  @kbd{M-x blackbox}, @kbd{M-x mpuz} and @kbd{M-x 5x5} are kinds of puzzles.
+  @kbd{M-x blackbox}, @kbd{M-x mpuz} and @kbd{M-x 5x5} are puzzles.
 @code{blackbox} challenges you to determine the location of objects
 inside a box by tomography.  @code{mpuz} displays a multiplication
 puzzle with letters standing for digits in a code that you must
--- a/man/msdog.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/msdog.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -2,307 +2,28 @@
 @c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2000, 2001,
 @c   2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 @c See file emacs.texi for copying conditions.
-@node MS-DOS, Manifesto, Mac OS, Top
-@appendix Emacs and Microsoft Systems
-@cindex MS-DOG
+@node Emacs and Microsoft Windows, Manifesto, Mac OS, Top
+@appendix Emacs and Microsoft Windows
 @cindex Microsoft Windows
-@cindex MS-DOS peculiarities
-
-  This section briefly describes the peculiarities of using Emacs on
-the MS-DOS ``operating system'' (also known as ``MS-DOG'') and on
-Microsoft Windows.
 
-  If you build Emacs for MS-DOS, the binary will also run on Windows
-3.X, Windows NT, Windows 9X/ME, Windows 2000, or OS/2 as a DOS
-application; all the of this chapter applies for all of those systems,
-if you use an Emacs that was built for MS-DOS.
+  This section describes peculiarities of using Emacs on Microsoft
+Windows.  Information about Emacs and Microsoft's older MS-DOS
+``operating system'' (also known as ``MS-DOG'') is now in a separate
+manual (@inforef{MS-DOG,, emacs-xtra}).
 
-  However, if you want to use Emacs on Windows, you would normally
-build Emacs specifically for Windows.  If you do that, most of this
-chapter does not apply; instead, you get behavior much closer to what
-is documented in the rest of the manual, including support for long
-file names, multiple frames, scroll bars, mouse menus, and
-subprocesses.  However, the section on text files and binary files
-does still apply.  There are also two sections at the end of this
-chapter which apply specifically for the Windows version.
+  Iif you want to use Emacs on Windows, you would normally build Emacs
+specifically for Windows.  If you do that, the behavior is reasonably
+similar to what is documented in the rest of the manual, including
+support for long file names, multiple frames, scroll bars, mouse
+menus, and subprocesses.  However, a few special considerations apply,
+and they are described here.
 
 @menu
-* Keyboard: MS-DOS Keyboard.   Keyboard conventions on MS-DOS.
-* Mouse: MS-DOS Mouse.         Mouse conventions on MS-DOS.
-* Display: MS-DOS Display.     Fonts, frames and display size on MS-DOS.
-* Files: MS-DOS File Names.    File name conventions on MS-DOS.
-* Text and Binary::            Text files on MS-DOS use CRLF to separate lines.
-* Printing: MS-DOS Printing.   How to specify the printer on MS-DOS.
-* I18N: MS-DOS and MULE.       Support for internationalization on MS-DOS.
-* Processes: MS-DOS Processes. Running subprocesses on MS-DOS.
+* Text and Binary::            Text files use CRLF to terminate lines.
 * Windows Processes::          Running subprocesses on Windows.
 * Windows System Menu::        Controlling what the ALT key does.
 @end menu
 
-@node MS-DOS Keyboard
-@section Keyboard Usage on MS-DOS
-
-@kindex DEL @r{(MS-DOS)}
-@kindex BS @r{(MS-DOS)}
-  The key that is called @key{DEL} in Emacs (because that's how it is
-designated on most workstations) is known as @key{BS} (backspace) on a
-PC.  That is why the PC-specific terminal initialization remaps the
-@key{BS} key to act as @key{DEL}; the @key{DELETE} key is remapped to act
-as @kbd{C-d} for the same reasons.
-
-@kindex C-g @r{(MS-DOS)}
-@kindex C-BREAK @r{(MS-DOS)}
-@cindex quitting on MS-DOS
-  Emacs built for MS-DOS recognizes @kbd{C-@key{BREAK}} as a quit
-character, just like @kbd{C-g}.  This is because Emacs cannot detect
-that you have typed @kbd{C-g} until it is ready for more input.  As a
-consequence, you cannot use @kbd{C-g} to stop a running command
-(@pxref{Quitting}).  By contrast, @kbd{C-@key{BREAK}} @emph{is} detected
-as soon as you type it (as @kbd{C-g} is on other systems), so it can be
-used to stop a running command and for emergency escape
-(@pxref{Emergency Escape}).
-
-@cindex Meta (under MS-DOS)
-@cindex Hyper (under MS-DOS)
-@cindex Super (under MS-DOS)
-@vindex dos-super-key
-@vindex dos-hyper-key
-  The PC keyboard maps use the left @key{ALT} key as the @key{META} key.
-You have two choices for emulating the @key{SUPER} and @key{HYPER} keys:
-choose either the right @key{CTRL} key or the right @key{ALT} key by
-setting the variables @code{dos-hyper-key} and @code{dos-super-key} to 1
-or 2 respectively.  If neither @code{dos-super-key} nor
-@code{dos-hyper-key} is 1, then by default the right @key{ALT} key is
-also mapped to the @key{META} key.  However, if the MS-DOS international
-keyboard support program @file{KEYB.COM} is installed, Emacs will
-@emph{not} map the right @key{ALT} to @key{META}, since it is used for
-accessing characters like @kbd{~} and @kbd{@@} on non-US keyboard
-layouts; in this case, you may only use the left @key{ALT} as @key{META}
-key.
-
-@kindex C-j @r{(MS-DOS)}
-@vindex dos-keypad-mode
-  The variable @code{dos-keypad-mode} is a flag variable that controls
-what key codes are returned by keys in the numeric keypad.  You can also
-define the keypad @key{ENTER} key to act like @kbd{C-j}, by putting the
-following line into your @file{_emacs} file:
-
-@smallexample
-;; @r{Make the @key{ENTER} key from the numeric keypad act as @kbd{C-j}.}
-(define-key function-key-map [kp-enter] [?\C-j])
-@end smallexample
-
-@node MS-DOS Mouse
-@section Mouse Usage on MS-DOS
-
-@cindex mouse support under MS-DOS
-  Emacs on MS-DOS supports a mouse (on the default terminal only).
-The mouse commands work as documented, including those that use menus
-and the menu bar (@pxref{Menu Bar}).  Scroll bars don't work in
-MS-DOS Emacs.  PC mice usually have only two buttons; these act as
-@kbd{Mouse-1} and @kbd{Mouse-2}, but if you press both of them
-together, that has the effect of @kbd{Mouse-3}.  If the mouse does have
-3 buttons, Emacs detects that at startup, and all the 3 buttons function
-normally, as on X.
-
-  Help strings for menu-bar and pop-up menus are displayed in the echo
-area when the mouse pointer moves across the menu items.
-Highlighting of mouse-sensitive text (@pxref{Mouse References}) is also
-supported.
-
-@cindex mouse, set number of buttons
-@findex msdos-set-mouse-buttons
-  Some versions of mouse drivers don't report the number of mouse
-buttons correctly.  For example, mice with a wheel report that they
-have 3 buttons, but only 2 of them are passed to Emacs; the clicks on
-the wheel, which serves as the middle button, are not passed.  In
-these cases, you can use the @kbd{M-x msdos-set-mouse-buttons} command
-to tell Emacs how many mouse buttons to expect.  You could make such a
-setting permanent by adding this fragment to your @file{_emacs} init
-file:
-
-@example
-;; @r{Treat the mouse like a 2-button mouse.}
-(msdos-set-mouse-buttons 2)
-@end example
-
-@cindex Windows clipboard support
-  Emacs built for MS-DOS supports clipboard operations when it runs on
-Windows.  Commands that put text on the kill ring, or yank text from the
-ring, check the Windows clipboard first, just as Emacs does on the X
-Window System (@pxref{Mouse Commands}).  Only the primary selection and
-the cut buffer are supported by MS-DOS Emacs on Windows; the secondary
-selection always appears as empty.
-
-  Due to the way clipboard access is implemented by Windows, the
-length of text you can put into the clipboard is limited by the amount
-of free DOS memory that is available to Emacs.  Usually, up to 620KB of
-text can be put into the clipboard, but this limit depends on the system
-configuration and is lower if you run Emacs as a subprocess of
-another program.  If the killed text does not fit, Emacs outputs a
-message saying so, and does not put the text into the clipboard.
-
-  Null characters also cannot be put into the Windows clipboard.  If the
-killed text includes null characters, Emacs does not put such text into
-the clipboard, and displays in the echo area a message to that effect.
-
-@vindex dos-display-scancodes
-  The variable @code{dos-display-scancodes}, when non-@code{nil},
-directs Emacs to display the @acronym{ASCII} value and the keyboard scan code of
-each keystroke; this feature serves as a complement to the
-@code{view-lossage} command, for debugging.
-
-@node MS-DOS Display
-@section Display on MS-DOS
-@cindex faces under MS-DOS
-@cindex fonts, emulating under MS-DOS
-
-  Display on MS-DOS cannot use font variants, like bold or italic,
-but it does support
-multiple faces, each of which can specify a foreground and a background
-color.  Therefore, you can get the full functionality of Emacs packages
-that use fonts (such as @code{font-lock}, Enriched Text mode, and
-others) by defining the relevant faces to use different colors.  Use the
-@code{list-colors-display} command (@pxref{Frame Parameters}) and the
-@code{list-faces-display} command (@pxref{Faces}) to see what colors and
-faces are available and what they look like.
-
-  @xref{MS-DOS and MULE}, later in this chapter, for information on
-how Emacs displays glyphs and characters that aren't supported by the
-native font built into the DOS display.
-
-@cindex cursor shape on MS-DOS
-  When Emacs starts, it changes the cursor shape to a solid box.  This
-is for compatibility with other systems, where the box cursor is the
-default in Emacs.  This default shape can be changed to a bar by
-specifying the @code{cursor-type} parameter in the variable
-@code{default-frame-alist} (@pxref{Creating Frames}).  The MS-DOS
-terminal doesn't support a vertical-bar cursor, so the bar cursor is
-horizontal, and the @code{@var{width}} parameter, if specified by the
-frame parameters, actually determines its height.  For this reason,
-the @code{bar} and @code{hbar} cursor types produce the same effect on
-MS-DOS.  As an extension, the bar cursor specification can include the
-starting scan line of the cursor as well as its width, like this:
-
-@example
- '(cursor-type bar @var{width} . @var{start})
-@end example
-
-@noindent
-In addition, if the @var{width} parameter is negative, the cursor bar
-begins at the top of the character cell.
-
-@cindex frames on MS-DOS
-  The MS-DOS terminal can only display a single frame at a time.  The
-Emacs frame facilities work on MS-DOS much as they do on text-only
-terminals (@pxref{Frames}).  When you run Emacs from a DOS window on
-MS-Windows, you can make the visible frame smaller than the full
-screen, but Emacs still cannot display more than a single frame at a
-time.
-
-@cindex frame size under MS-DOS
-@findex mode4350
-@findex mode25
-  The @code{mode4350} command switches the display to 43 or 50
-lines, depending on your hardware; the @code{mode25} command switches
-to the default 80x25 screen size.
-
-  By default, Emacs only knows how to set screen sizes of 80 columns by
-25, 28, 35, 40, 43 or 50 rows.  However, if your video adapter has
-special video modes that will switch the display to other sizes, you can
-have Emacs support those too.  When you ask Emacs to switch the frame to
-@var{n} rows by @var{m} columns dimensions, it checks if there is a
-variable called @code{screen-dimensions-@var{n}x@var{m}}, and if so,
-uses its value (which must be an integer) as the video mode to switch
-to.  (Emacs switches to that video mode by calling the BIOS @code{Set
-Video Mode} function with the value of
-@code{screen-dimensions-@var{n}x@var{m}} in the @code{AL} register.)
-For example, suppose your adapter will switch to 66x80 dimensions when
-put into video mode 85.  Then you can make Emacs support this screen
-size by putting the following into your @file{_emacs} file:
-
-@example
-(setq screen-dimensions-66x80 85)
-@end example
-
-  Since Emacs on MS-DOS can only set the frame size to specific
-supported dimensions, it cannot honor every possible frame resizing
-request.  When an unsupported size is requested, Emacs chooses the next
-larger supported size beyond the specified size.  For example, if you
-ask for 36x80 frame, you will get 40x80 instead.
-
-  The variables @code{screen-dimensions-@var{n}x@var{m}} are used only
-when they exactly match the specified size; the search for the next
-larger supported size ignores them.  In the above example, even if your
-VGA supports 38x80 dimensions and you define a variable
-@code{screen-dimensions-38x80} with a suitable value, you will still get
-40x80 screen when you ask for a 36x80 frame.  If you want to get the
-38x80 size in this case, you can do it by setting the variable named
-@code{screen-dimensions-36x80} with the same video mode value as
-@code{screen-dimensions-38x80}.
-
-  Changing frame dimensions on MS-DOS has the effect of changing all the
-other frames to the new dimensions.
-
-@node MS-DOS File Names
-@section File Names on MS-DOS
-@cindex file names under MS-DOS
-@cindex init file, default name under MS-DOS
-
-  MS-DOS normally uses a backslash, @samp{\}, to separate name units
-within a file name, instead of the slash used on other systems.  Emacs
-on MS-DOS permits use of either slash or backslash, and also knows
-about drive letters in file names.
-
-  On MS-DOS, file names are case-insensitive and limited to eight
-characters, plus optionally a period and three more characters.  Emacs
-knows enough about these limitations to handle file names that were
-meant for other operating systems.  For instance, leading dots @samp{.}
-in file names are invalid in MS-DOS, so Emacs transparently converts
-them to underscores @samp{_}; thus your default init file (@pxref{Init
-File}) is called @file{_emacs} on MS-DOS.  Excess characters before or
-after the period are generally ignored by MS-DOS itself; thus, if you
-visit the file @file{LongFileName.EvenLongerExtension}, you will
-silently get @file{longfile.eve}, but Emacs will still display the long
-file name on the mode line.  Other than that, it's up to you to specify
-file names which are valid under MS-DOS; the transparent conversion as
-described above only works on file names built into Emacs.
-
-@cindex backup file names on MS-DOS
-  The above restrictions on the file names on MS-DOS make it almost
-impossible to construct the name of a backup file (@pxref{Backup
-Names}) without losing some of the original file name characters.  For
-example, the name of a backup file for @file{docs.txt} is
-@file{docs.tx~} even if single backup is used.
-
-@cindex file names under Windows 95/NT
-@cindex long file names in DOS box under Windows 95/NT
-  If you run Emacs as a DOS application under Windows 9X, Windows ME, or
-Windows 2000, you can turn on support for long file names.  If you do
-that, Emacs doesn't truncate file names or convert them to lower case;
-instead, it uses the file names that you specify, verbatim.  To enable
-long file name support, set the environment variable @env{LFN} to
-@samp{y} before starting Emacs.  Unfortunately, Windows NT doesn't allow
-DOS programs to access long file names, so Emacs built for MS-DOS will
-only see their short 8+3 aliases.
-
-@cindex @env{HOME} directory under MS-DOS
-  MS-DOS has no notion of home directory, so Emacs on MS-DOS pretends
-that the directory where it is installed is the value of the @env{HOME}
-environment variable.  That is, if your Emacs binary,
-@file{emacs.exe}, is in the directory @file{c:/utils/emacs/bin}, then
-Emacs acts as if @env{HOME} were set to @samp{c:/utils/emacs}.  In
-particular, that is where Emacs looks for the init file @file{_emacs}.
-With this in mind, you can use @samp{~} in file names as an alias for
-the home directory, as you would on GNU or Unix.  You can also set
-@env{HOME} variable in the environment before starting Emacs; its
-value will then override the above default behavior.
-
-  Emacs on MS-DOS handles the directory name @file{/dev} specially,
-because of a feature in the emulator libraries of DJGPP that pretends
-I/O devices have names in that directory.  We recommend that you avoid
-using an actual directory named @file{/dev} on any disk.
-
 @node Text and Binary
 @section Text Files and Binary Files
 @cindex text and binary files on MS-DOS/MS-Windows
@@ -419,379 +140,6 @@
 the file-name patterns in @code{file-name-buffer-file-type-alist}, the
 EOL conversion is determined by @code{file-name-buffer-file-type-alist}.
 
-@node MS-DOS Printing
-@section Printing and MS-DOS
-
-  Printing commands, such as @code{lpr-buffer} (@pxref{Printing}) and
-@code{ps-print-buffer} (@pxref{PostScript}) can work in MS-DOS and
-MS-Windows by sending the output to one of the printer ports, if a
-Posix-style @code{lpr} program is unavailable.  The same Emacs
-variables control printing on all systems, but in some cases they have
-different default values on MS-DOS and MS-Windows.
-
-@vindex printer-name @r{(MS-DOS)}
-  If you want to use your local printer, printing on it in the usual DOS
-manner, then set the Lisp variable @code{lpr-command} to @code{""} (its
-default value) and @code{printer-name} to the name of the printer
-port---for example, @code{"PRN"}, the usual local printer port (that's
-the default), or @code{"LPT2"}, or @code{"COM1"} for a serial printer.
-You can also set @code{printer-name} to a file name, in which case
-``printed'' output is actually appended to that file.  If you set
-@code{printer-name} to @code{"NUL"}, printed output is silently
-discarded (sent to the system null device).
-
-  On MS-Windows, when the Windows network software is installed, you can
-also use a printer shared by another machine by setting
-@code{printer-name} to the UNC share name for that printer---for example,
-@code{"//joes_pc/hp4si"}.  (It doesn't matter whether you use forward
-slashes or backslashes here.)  To find out the names of shared printers,
-run the command @samp{net view} at a DOS command prompt to obtain a list
-of servers, and @samp{net view @var{server-name}} to see the names of printers
-(and directories) shared by that server.  Alternatively, click the
-@samp{Network Neighborhood} icon on your desktop, and look for machines
-which share their printers via the network.
-
-@cindex @samp{net use}, and printing on MS-Windows
-@cindex networked printers (MS-Windows)
-  If the printer doesn't appear in the output of @samp{net view}, or
-if setting @code{printer-name} to the UNC share name doesn't produce a
-hardcopy on that printer, you can use the @samp{net use} command to
-connect a local print port such as @code{"LPT2"} to the networked
-printer.  For example, typing @kbd{net use LPT2:
-\\joes_pc\hp4si}@footnote{
-Note that the @samp{net use} command requires the UNC share name to be
-typed with the Windows-style backslashes, while the value of
-@code{printer-name} can be set with either forward- or backslashes.}
-causes Windows to @dfn{capture} the LPT2 port and redirect the printed
-material to the printer connected to the machine @code{joes_pc}.
-After this command, setting @code{printer-name} to @code{"LPT2"}
-should produce the hardcopy on the networked printer.
-
-  With some varieties of Windows network software, you can instruct
-Windows to capture a specific printer port such as @code{"LPT2"}, and
-redirect it to a networked printer via the @w{@code{Control
-Panel->Printers}} applet instead of @samp{net use}.
-
-  Some printers expect DOS codepage encoding of non-@acronym{ASCII} text, even
-though they are connected to a Windows machine which uses a different
-encoding for the same locale.  For example, in the Latin-1 locale, DOS
-uses codepage 850 whereas Windows uses codepage 1252.  @xref{MS-DOS and
-MULE}.  When you print to such printers from Windows, you can use the
-@kbd{C-x RET c} (@code{universal-coding-system-argument}) command before
-@kbd{M-x lpr-buffer}; Emacs will then convert the text to the DOS
-codepage that you specify.  For example, @kbd{C-x RET c cp850-dos RET
-M-x lpr-region RET} will print the region while converting it to the
-codepage 850 encoding.  You may need to create the @code{cp@var{nnn}}
-coding system with @kbd{M-x codepage-setup}.
-
-  If you set @code{printer-name} to a file name, it's best to use an
-absolute file name.  Emacs changes the working directory according to
-the default directory of the current buffer, so if the file name in
-@code{printer-name} is relative, you will end up with several such
-files, each one in the directory of the buffer from which the printing
-was done.
-
-@findex print-buffer @r{(MS-DOS)}
-@findex print-region @r{(MS-DOS)}
-@vindex lpr-headers-switches @r{(MS-DOS)}
-  The commands @code{print-buffer} and @code{print-region} call the
-@code{pr} program, or use special switches to the @code{lpr} program, to
-produce headers on each printed page.  MS-DOS and MS-Windows don't
-normally have these programs, so by default, the variable
-@code{lpr-headers-switches} is set so that the requests to print page
-headers are silently ignored.  Thus, @code{print-buffer} and
-@code{print-region} produce the same output as @code{lpr-buffer} and
-@code{lpr-region}, respectively.  If you do have a suitable @code{pr}
-program (for example, from GNU Textutils), set
-@code{lpr-headers-switches} to @code{nil}; Emacs will then call
-@code{pr} to produce the page headers, and print the resulting output as
-specified by @code{printer-name}.
-
-@vindex print-region-function @r{(MS-DOS)}
-@cindex lpr usage under MS-DOS
-@vindex lpr-command @r{(MS-DOS)}
-@vindex lpr-switches @r{(MS-DOS)}
-  Finally, if you do have an @code{lpr} work-alike, you can set the
-variable @code{lpr-command} to @code{"lpr"}.  Then Emacs will use
-@code{lpr} for printing, as on other systems.  (If the name of the
-program isn't @code{lpr}, set @code{lpr-command} to specify where to
-find it.)  The variable @code{lpr-switches} has its standard meaning
-when @code{lpr-command} is not @code{""}.  If the variable
-@code{printer-name} has a string value, it is used as the value for the
-@code{-P} option to @code{lpr}, as on Unix.
-
-@findex ps-print-buffer @r{(MS-DOS)}
-@findex ps-spool-buffer @r{(MS-DOS)}
-@vindex ps-printer-name @r{(MS-DOS)}
-@vindex ps-lpr-command @r{(MS-DOS)}
-@vindex ps-lpr-switches @r{(MS-DOS)}
-  A parallel set of variables, @code{ps-lpr-command},
-@code{ps-lpr-switches}, and @code{ps-printer-name} (@pxref{PostScript
-Variables}), defines how PostScript files should be printed.  These
-variables are used in the same way as the corresponding variables
-described above for non-PostScript printing.  Thus, the value of
-@code{ps-printer-name} is used as the name of the device (or file) to
-which PostScript output is sent, just as @code{printer-name} is used for
-non-PostScript printing.  (There are two distinct sets of variables in
-case you have two printers attached to two different ports, and only one
-of them is a PostScript printer.)
-
-  The default value of the variable @code{ps-lpr-command} is @code{""},
-which causes PostScript output to be sent to the printer port specified
-by @code{ps-printer-name}, but @code{ps-lpr-command} can also be set to
-the name of a program which will accept PostScript files.  Thus, if you
-have a non-PostScript printer, you can set this variable to the name of
-a PostScript interpreter program (such as Ghostscript).  Any switches
-that need to be passed to the interpreter program are specified using
-@code{ps-lpr-switches}.  (If the value of @code{ps-printer-name} is a
-string, it will be added to the list of switches as the value for the
-@code{-P} option.  This is probably only useful if you are using
-@code{lpr}, so when using an interpreter typically you would set
-@code{ps-printer-name} to something other than a string so it is
-ignored.)
-
-  For example, to use Ghostscript for printing on an Epson printer
-connected to the @samp{LPT2} port, put this in your @file{_emacs} file:
-
-@example
-(setq ps-printer-name t)  ; Ghostscript doesn't understand -P
-(setq ps-lpr-command "c:/gs/gs386")
-(setq ps-lpr-switches '("-q" "-dNOPAUSE"
-			"-sDEVICE=epson"
-			"-r240x72"
-			"-sOutputFile=LPT2"
-			"-Ic:/gs"))
-@end example
-
-@noindent
-(This assumes that Ghostscript is installed in the @file{"c:/gs"}
-directory.)
-
-@vindex dos-printer
-@vindex dos-ps-printer
-  For backwards compatibility, the value of @code{dos-printer}
-(@code{dos-ps-printer}), if it has a value, overrides the value of
-@code{printer-name} (@code{ps-printer-name}), on MS-DOS and MS-Windows
-only.
-
-
-@node MS-DOS and MULE
-@section International Support on MS-DOS
-@cindex international support @r{(MS-DOS)}
-
-  Emacs on MS-DOS supports the same international character sets as it
-does on GNU, Unix and other platforms (@pxref{International}), including
-coding systems for converting between the different character sets.
-However, due to incompatibilities between MS-DOS/MS-Windows and other systems,
-there are several DOS-specific aspects of this support that you should
-be aware of.  This section describes these aspects.
-
-  The description below is largely specific to the MS-DOS port of
-Emacs, especially where it talks about practical implications for
-Emacs users.  For other operating systems, see the @file{code-pages.el}
-package, which implements support for MS-DOS- and MS-Windows-specific
-encodings for all platforms other than MS-DOS.
-
-@table @kbd
-@item M-x dos-codepage-setup
-Set up Emacs display and coding systems as appropriate for the current
-DOS codepage.
-
-@item M-x codepage-setup
-Create a coding system for a certain DOS codepage.
-@end table
-
-@cindex codepage, MS-DOS
-@cindex DOS codepages
-  MS-DOS is designed to support one character set of 256 characters at
-any given time, but gives you a variety of character sets to choose
-from.  The alternative character sets are known as @dfn{DOS codepages}.
-Each codepage includes all 128 @acronym{ASCII} characters, but the other 128
-characters (codes 128 through 255) vary from one codepage to another.
-Each DOS codepage is identified by a 3-digit number, such as 850, 862,
-etc.
-
-  In contrast to X, which lets you use several fonts at the same time,
-MS-DOS normally doesn't allow use of several codepages in a single
-session.  MS-DOS was designed to load a single codepage at system
-startup, and require you to reboot in order to change
-it@footnote{Normally, one particular codepage is burnt into the
-display memory, while other codepages can be installed by modifying
-system configuration files, such as @file{CONFIG.SYS}, and rebooting.
-While there is third-party software that allows changing the codepage
-without rebooting, we describe here how a stock MS-DOS system
-behaves.}.  Much the same limitation applies when you run DOS
-executables on other systems such as MS-Windows.
-
-@cindex unibyte operation @r{(MS-DOS)}
-  If you invoke Emacs on MS-DOS with the @samp{--unibyte} option
-(@pxref{Initial Options}), Emacs does not perform any conversion of
-non-@acronym{ASCII} characters.  Instead, it reads and writes any non-@acronym{ASCII}
-characters verbatim, and sends their 8-bit codes to the display
-verbatim.  Thus, unibyte Emacs on MS-DOS supports the current codepage,
-whatever it may be, but cannot even represent any other characters.
-
-@vindex dos-codepage
-  For multibyte operation on MS-DOS, Emacs needs to know which
-characters the chosen DOS codepage can display.  So it queries the
-system shortly after startup to get the chosen codepage number, and
-stores the number in the variable @code{dos-codepage}.  Some systems
-return the default value 437 for the current codepage, even though the
-actual codepage is different.  (This typically happens when you use the
-codepage built into the display hardware.)  You can specify a different
-codepage for Emacs to use by setting the variable @code{dos-codepage} in
-your init file.
-
-@cindex language environment, automatic selection on @r{MS-DOS}
-  Multibyte Emacs supports only certain DOS codepages: those which can
-display Far-Eastern scripts, like the Japanese codepage 932, and those
-that encode a single ISO 8859 character set.
-
-  The Far-Eastern codepages can directly display one of the MULE
-character sets for these countries, so Emacs simply sets up to use the
-appropriate terminal coding system that is supported by the codepage.
-The special features described in the rest of this section mostly
-pertain to codepages that encode ISO 8859 character sets.
-
-  For the codepages which correspond to one of the ISO character sets,
-Emacs knows the character set name based on the codepage number.  Emacs
-automatically creates a coding system to support reading and writing
-files that use the current codepage, and uses this coding system by
-default.  The name of this coding system is @code{cp@var{nnn}}, where
-@var{nnn} is the codepage number.@footnote{The standard Emacs coding
-systems for ISO 8859 are not quite right for the purpose, because
-typically the DOS codepage does not match the standard ISO character
-codes.  For example, the letter @samp{@,{c}} (@samp{c} with cedilla) has
-code 231 in the standard Latin-1 character set, but the corresponding
-DOS codepage 850 uses code 135 for this glyph.}
-
-@cindex mode line @r{(MS-DOS)}
-  All the @code{cp@var{nnn}} coding systems use the letter @samp{D} (for
-``DOS'') as their mode-line mnemonic.  Since both the terminal coding
-system and the default coding system for file I/O are set to the proper
-@code{cp@var{nnn}} coding system at startup, it is normal for the mode
-line on MS-DOS to begin with @samp{-DD\-}.  @xref{Mode Line}.
-Far-Eastern DOS terminals do not use the @code{cp@var{nnn}} coding
-systems, and thus their initial mode line looks like the Emacs default.
-
-  Since the codepage number also indicates which script you are using,
-Emacs automatically runs @code{set-language-environment} to select the
-language environment for that script (@pxref{Language Environments}).
-
-  If a buffer contains a character belonging to some other ISO 8859
-character set, not the one that the chosen DOS codepage supports, Emacs
-displays it using a sequence of @acronym{ASCII} characters.  For example, if the
-current codepage doesn't have a glyph for the letter @samp{@`o} (small
-@samp{o} with a grave accent), it is displayed as @samp{@{`o@}}, where
-the braces serve as a visual indication that this is a single character.
-(This may look awkward for some non-Latin characters, such as those from
-Greek or Hebrew alphabets, but it is still readable by a person who
-knows the language.)  Even though the character may occupy several
-columns on the screen, it is really still just a single character, and
-all Emacs commands treat it as one.
-
-@cindex IBM graphics characters (MS-DOS)
-@cindex box-drawing characters (MS-DOS)
-@cindex line-drawing characters (MS-DOS)
-  Not all characters in DOS codepages correspond to ISO 8859
-characters---some are used for other purposes, such as box-drawing
-characters and other graphics.  Emacs maps these characters to two
-special character sets called @code{eight-bit-control} and
-@code{eight-bit-graphic}, and displays them as their IBM glyphs.
-However, you should be aware that other systems might display these
-characters differently, so you should avoid them in text that might be
-copied to a different operating system, or even to another DOS machine
-that uses a different codepage.
-
-@vindex dos-unsupported-character-glyph
-  Emacs supports many other characters sets aside from ISO 8859, but it
-cannot display them on MS-DOS.  So if one of these multibyte characters
-appears in a buffer, Emacs on MS-DOS displays them as specified by the
-@code{dos-unsupported-character-glyph} variable; by default, this glyph
-is an empty triangle.  Use the @kbd{C-u C-x =} command to display the
-actual code and character set of such characters.  @xref{Position Info}.
-
-@findex codepage-setup
-  By default, Emacs defines a coding system to support the current
-codepage.  To define a coding system for some other codepage (e.g., to
-visit a file written on a DOS machine in another country), use the
-@kbd{M-x codepage-setup} command.  It prompts for the 3-digit code of
-the codepage, with completion, then creates the coding system for the
-specified codepage.  You can then use the new coding system to read and
-write files, but you must specify it explicitly for the file command
-when you want to use it (@pxref{Text Coding}).
-
-  These coding systems are also useful for visiting a file encoded using
-a DOS codepage, using Emacs running on some other operating system.
-
-@cindex MS-Windows codepages
-  MS-Windows provides its own codepages, which are different from the
-DOS codepages for the same locale.  For example, DOS codepage 850
-supports the same character set as Windows codepage 1252; DOS codepage
-855 supports the same character set as Windows codepage 1251, etc.
-The MS-Windows version of Emacs uses the current codepage for display
-when invoked with the @samp{-nw} option.  Support for codepages in the
-Windows port of Emacs is part of the @file{code-pages.el} package.
-
-@node MS-DOS Processes
-@section Subprocesses on MS-DOS
-
-@cindex compilation under MS-DOS
-@cindex inferior processes under MS-DOS
-@findex compile @r{(MS-DOS)}
-@findex grep @r{(MS-DOS)}
-  Because MS-DOS is a single-process ``operating system,''
-asynchronous subprocesses are not available.  In particular, Shell
-mode and its variants do not work.  Most Emacs features that use
-asynchronous subprocesses also don't work on MS-DOS, including
-Shell mode and GUD.  When in doubt, try and see; commands that
-don't work output an error message saying that asynchronous processes
-aren't supported.
-
-  Compilation under Emacs with @kbd{M-x compile}, searching files with
-@kbd{M-x grep} and displaying differences between files with @kbd{M-x
-diff} do work, by running the inferior processes synchronously.  This
-means you cannot do any more editing until the inferior process
-finishes.
-
-  Spell checking also works, by means of special support for synchronous
-invocation of the @code{ispell} program.  This is slower than the
-asynchronous invocation on other platforms
-
-  Instead of the Shell mode, which doesn't work on MS-DOS, you can use
-the @kbd{M-x eshell} command.  This invokes the Eshell package that
-implements a Posix-like shell entirely in Emacs Lisp.
-
-  By contrast, Emacs compiled as a native Windows application
-@strong{does} support asynchronous subprocesses.  @xref{Windows
-Processes}.
-
-@cindex printing under MS-DOS
-  Printing commands, such as @code{lpr-buffer} (@pxref{Printing}) and
-@code{ps-print-buffer} (@pxref{PostScript}), work in MS-DOS by sending
-the output to one of the printer ports.  @xref{MS-DOS Printing}.
-
-  When you run a subprocess synchronously on MS-DOS, make sure the
-program terminates and does not try to read keyboard input.  If the
-program does not terminate on its own, you will be unable to terminate
-it, because MS-DOS provides no general way to terminate a process.
-Pressing @kbd{C-c} or @kbd{C-@key{BREAK}} might sometimes help in these
-cases.
-
-  Accessing files on other machines is not supported on MS-DOS.  Other
-network-oriented commands such as sending mail, Web browsing, remote
-login, etc., don't work either, unless network access is built into
-MS-DOS with some network redirector.
-
-@cindex directory listing on MS-DOS
-@vindex dired-listing-switches @r{(MS-DOS)}
-  Dired on MS-DOS uses the @code{ls-lisp} package where other
-platforms use the system @code{ls} command.  Therefore, Dired on
-MS-DOS supports only some of the possible options you can mention in
-the @code{dired-listing-switches} variable.  The options that work are
-@samp{-A}, @samp{-a}, @samp{-c}, @samp{-i}, @samp{-r}, @samp{-S},
-@samp{-s}, @samp{-t}, and @samp{-u}.
-
 @node Windows Processes
 @section Subprocesses on Windows 9X/ME and Windows NT/2K
 
--- a/man/mule.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/mule.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -605,7 +605,7 @@
 @key{RET}}@footnote{
 In the MS-DOS port of Emacs, you need to create a @code{cp@var{nnn}}
 coding system with @kbd{M-x codepage-setup}, before you can use it.
-@xref{MS-DOS and MULE}.}.
+@xref{MS-DOS and MULE,,,emacs-extra,Specialized Emacs Features}.}.
 
   In addition to converting various representations of non-@acronym{ASCII}
 characters, a coding system can perform end-of-line conversion.  Emacs
--- a/man/org.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/org.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -1064,7 +1064,7 @@
 @file{calc} package.  Note that @file{calc} has the slightly
 non-standard conversion that @samp{/} has lower precedence than
 @samp{*}, so that @samp{a/b*c} is interpreted as @samp{a/(b*c)}.  Before
-evaluation by @code{calc-eval} (@pxref{Calling Calc from Your Lisp
+evaluation by @code{calc-eval} (@pxref{Calling Calc from Your
 Programs,calc-eval,Calling calc from Your Lisp Programs,calc,GNU Emacs
 Calc Manual}), variable substitution takes place:
 
--- a/man/programs.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/programs.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -360,7 +360,8 @@
 @item @key{TAB}
 Adjust indentation of current line.
 @item C-j
-Equivalent to @key{RET} followed by @key{TAB} (@code{newline-and-indent}).
+Insert a newline, then adjust indentation of following line
+(@code{newline-and-indent}).
 @end table
 
 @kindex TAB @r{(programming modes)}
@@ -385,9 +386,11 @@
 @kindex C-j
 @findex newline-and-indent
   When entering lines of new code, use @kbd{C-j}
-(@code{newline-and-indent}), which is equivalent to @key{RET}
-followed by @key{TAB}.  @kbd{C-j} at the end of a line creates a
-blank line and then gives it the appropriate indentation.
+(@code{newline-and-indent}), which inserts a newline and then adjusts
+indentation after it.  (It also deletes any trailing whitespace which
+remains before the new newline.)  Thus, @kbd{C-j} at the end of a line
+creates a blank line with appropriate indentation.  In programming
+language modes, it is equivalent to @key{RET} @key{TAB}.
 
   @key{TAB} indents a line that starts within a parenthetical grouping
 under the preceding line within the grouping, or the text after the
@@ -851,7 +854,7 @@
 (@pxref{Spelling}).
 
 @menu
-* Comment Commands::    Inserting, killing, and indenting comments.
+* Comment Commands::    Inserting, killing, and aligning comments.
 * Multi-Line Comments:: Commands for adding and editing multi-line comments.
 * Options for Comments::Customizing the comment features.
 @end menu
@@ -859,6 +862,7 @@
 @node Comment Commands
 @subsection Comment Commands
 @cindex indentation for comments
+@cindex alignment for comments
 
   The comment commands in this table insert, kill and align comments.
 They are described in this section and following sections.
@@ -897,11 +901,11 @@
 @kbd{M-;} inserts that after point, to keep the syntax valid.
 
   If the text of the line extends past the comment column, this
-command indents the comment start string to a suitable boundary
+command aligns the comment start string to a suitable boundary
 (usually, at least one space is inserted).
 
   You can also use @kbd{M-;} to align an existing comment.  If a line
-already contains the comment-start string, @kbd{M-;} reindents it to
+already contains the comment-start string, @kbd{M-;} realigns it to
 the conventional alignment and moves point after it.  (Exception:
 comments starting in column 0 are not moved.)  Even when an existing
 comment is properly aligned, @kbd{M-;} is still useful for moving
@@ -931,7 +935,7 @@
 A prefix argument used in these circumstances specifies how many
 comment delimiters to add or how many to delete.
 
-  Some major modes have special rules for indenting certain kinds of
+  Some major modes have special rules for aligning certain kinds of
 comments in certain contexts.  For example, in Lisp code, comments which
 start with two semicolons are indented as if they were lines of code,
 instead of at the comment column.  Comments which start with three
@@ -982,13 +986,13 @@
 opposite---it deletes comment delimiters from the lines in the region.
 
   With a positive argument, @code{comment-region} duplicates the last
-character of the comment start sequence it adds; the argument specifies
-how many copies of the character to insert.  Thus, in Lisp mode,
-@kbd{C-u 2 M-x comment-region} adds @samp{;;} to each line.  Duplicating
-the comment delimiter is a way of calling attention to the comment.  It
-can also affect how the comment is indented.  In Lisp, for proper
-indentation, you should use an argument of two or three, if between defuns;
-if within a defun, it must be three.
+character of the comment start sequence it adds; the argument
+specifies how many copies of the character to insert.  Thus, in Lisp
+mode, @kbd{C-u 2 M-x comment-region} adds @samp{;;} to each line.
+Duplicating the comment delimiter is a way of calling attention to the
+comment.  It can also affect how the comment is aligned or indented.
+In Lisp, for proper indentation, you should use an argument of two or
+three, if between defuns; if within a defun, it must be three.
 
   You can configure C Mode such that when you type a @samp{/} at the
 start of a line in a multi-line block comment, this closes the
@@ -1058,7 +1062,7 @@
 
 @vindex comment-indent-function
   The variable @code{comment-indent-function} should contain a function
-that will be called to compute the indentation for a newly inserted
+that will be called to compute the alignment for a newly inserted
 comment or for aligning an existing comment.  It is set differently by
 various major modes.  The function is called with no arguments, but with
 point at the beginning of the comment, or at the end of a line if a new
--- a/man/sending.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/sending.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -459,9 +459,9 @@
 is @code{sendmail-send-it}, which delivers mail using the Sendmail
 installation on the local host.  To send mail through a SMTP server,
 set it to @code{smtpmail-send-it} and set up the Emacs SMTP library
-(@pxref{Top,, Sending mail via SMTP,smtpmail}).  A third option is
-@code{feedmail-send-it}, see the commentary section of the
-@file{feedmail.el} package for more information.
+(@pxref{Top,,Emacs SMTP Library, smtpmail, Sending mail via SMTP}).  A
+third option is @code{feedmail-send-it}, see the commentary section of
+the @file{feedmail.el} package for more information.
 
 @node Header Editing
 @subsection Mail Header Editing
--- a/man/texinfo.tex	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/texinfo.tex	Mon Apr 10 14:52:24 2006 +0000
@@ -3,11 +3,11 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2006-02-05.23}
-%
-% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994,
-%   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-%   2005, 2006 Free Software Foundation, Inc.
+\def\texinfoversion{2006-03-21.13}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
+% Software Foundation, Inc.
 %
 % This texinfo.tex file is free software; you can redistribute it and/or
 % modify it under the terms of the GNU General Public License as
@@ -24,25 +24,18 @@
 % to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 % Boston, MA 02110-1301, USA.
 %
-% In other words, you are welcome to use, share and improve this program.
-% You are forbidden to forbid anyone else to use, share and improve
-% what you give them.   Help stamp out software-hoarding!
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction.  (This has been our intent since Texinfo was invented.)
 %
 % Please try the latest version of texinfo.tex before submitting bug
 % reports; you can get the latest version from:
-%   ftp://ftp.gnu.org/gnu/texinfo.tex
-%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
-%   ftp://texinfo.org/texinfo/texinfo.tex
+%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
 %   ftp://tug.org/tex/texinfo.tex
-%     (and all CTAN mirrors, see http://www.ctan.org),
-%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
-%
-% The texinfo.tex in any given Texinfo distribution could well be out
+%     (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
 % of date, so if that's what you're using, please check.
 %
-% Texinfo has a small home page at http://texinfo.org/ and also
-% http://www.gnu.org/software/texinfo.
-%
 % Send bug reports to bug-texinfo@gnu.org.  Please include including a
 % complete document in each bug report with which we can reproduce the
 % problem.  Patches are, of course, greatly appreciated.
@@ -59,8 +52,12 @@
 % Sometimes one run after texindex suffices, and sometimes you need more
 % than two; texi2dvi does it as many times as necessary.
 %
-% It is possible to adapt texinfo.tex for other languages.  You can get
-% the existing language-specific files from the full Texinfo distribution.
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
 
 \message{Loading texinfo [version \texinfoversion]:}
 
@@ -70,7 +67,14 @@
 \everyjob{\message{[Texinfo version \texinfoversion]}%
   \catcode`+=\active \catcode`\_=\active}
 
-% Save some parts of plain tex whose names we will redefine.
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
 \let\ptexb=\b
 \let\ptexbullet=\bullet
 \let\ptexc=\c
@@ -80,23 +84,35 @@
 \let\ptexend=\end
 \let\ptexequiv=\equiv
 \let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
 \let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
 \let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
 \let\ptexrbrace=\}
+\let\ptexslash=\/
 \let\ptexstar=\*
 \let\ptext=\t
 
-% We never want plain's outer \+ definition in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-\message{Basics,}
-\chardef\other=12
-
 % If this character appears in an error message or help string, it
 % starts a new line in the output.
 \newlinechar = `^^J
 
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
 % Set up fixed words for English if not already set.
 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
@@ -135,44 +151,97 @@
 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
-\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
-\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
 
 % Ignore a token.
 %
 \def\gobble#1{}
 
-\hyphenation{ap-pen-dix}
-\hyphenation{mini-buf-fer mini-buf-fers}
-\hyphenation{eshell}
-\hyphenation{white-space}
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
 
 % Margin to add to right of even pages, to left of odd pages.
-\newdimen \bindingoffset
-\newdimen \normaloffset
+\newdimen\bindingoffset
+\newdimen\normaloffset
 \newdimen\pagewidth \newdimen\pageheight
 
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
 % Sometimes it is convenient to have everything in the transcript file
 % and nothing on the terminal.  We don't just call \tracingall here,
-% since that produces some useless output on the terminal.
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
 %
 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\ifx\eTeXversion\undefined
-\def\loggingall{\tracingcommands2 \tracingstats2
-   \tracingpages1 \tracingoutput1 \tracinglostchars1
-   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
-   \showboxbreadth\maxdimen\showboxdepth\maxdimen
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
 }%
-\else
-\def\loggingall{\tracingcommands3 \tracingstats2
-   \tracingpages1 \tracingoutput1 \tracinglostchars1
-   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
-   \tracingscantokens1 \tracingassigns1 \tracingifs1
-   \tracinggroups1 \tracingnesting2
-   \showboxbreadth\maxdimen\showboxdepth\maxdimen
-}%
-\fi
 
 % add check for \lastpenalty to plain's definitions.  If the last thing
 % we did was a \nobreak, we don't want to insert more space.
@@ -223,13 +292,17 @@
     % take effect in \write's, yet the group defined by the \vbox ends
     % before the \shipout runs.
     %
-    \escapechar = `\\     % use backslash in output files.
     \indexdummies         % don't expand commands in the output.
     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
-                   % the page break happens to be in the middle of an example.
+               % the page break happens to be in the middle of an example.
+               % We don't want .vr (or whatever) entries like this:
+               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+               % "\acronym" won't work when it's read back in;
+               % it needs to be 
+               % {\code {{\tt \backslashcurfont }acronym}
     \shipout\vbox{%
       % Do this early so pdf references go to the beginning of the page.
-      \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
       %
       \ifcropmarks \vbox to \outervsize\bgroup
         \hsize = \outerhsize
@@ -277,7 +350,7 @@
       \egroup % \vbox from first cropmarks clause
       \fi
     }% end of \shipout\vbox
-  }% end of group with \turnoffactive
+  }% end of group with \indexdummies
   \advancepageno
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
 }
@@ -310,143 +383,161 @@
 % the input line (except we remove a trailing comment).  #1 should be a
 % macro which expects an ordinary undelimited TeX argument.
 %
-\def\parsearg#1{%
-  \let\next = #1%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
   \begingroup
     \obeylines
-    \futurelet\temp\parseargx
-}
-
-% If the next token is an obeyed space (from an @example environment or
-% the like), remove it and recurse.  Otherwise, we're done.
-\def\parseargx{%
-  % \obeyedspace is defined far below, after the definition of \sepspaces.
-  \ifx\obeyedspace\temp
-    \expandafter\parseargdiscardspace
-  \else
-    \expandafter\parseargline
-  \fi
-}
-
-% Remove a single space (as the delimiter token to the macro call).
-{\obeyspaces %
- \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
 
 {\obeylines %
   \gdef\parseargline#1^^M{%
     \endgroup % End of the group started in \parsearg.
-    %
-    % First remove any @c comment, then any @comment.
-    % Result of each macro is put in \toks0.
-    \argremovec #1\c\relax %
-    \expandafter\argremovecomment \the\toks0 \comment\relax %
-    %
-    % Call the caller's macro, saved as \next in \parsearg.
-    \expandafter\next\expandafter{\the\toks0}%
+    \argremovecomment #1\comment\ArgTerm%
   }%
 }
 
-% Since all \c{,omment} does is throw away the argument, we can let TeX
-% do that for us.  The \relax here is matched by the \relax in the call
-% in \parseargline; it could be more or less anything, its purpose is
-% just to delimit the argument to the \c.
-\def\argremovec#1\c#2\relax{\toks0 = {#1}}
-\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
-
-% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
 %    @end itemize  @c foo
-% will have two active spaces as part of the argument with the
-% `itemize'.  Here we remove all active spaces from #1, and assign the
-% result to \toks0.
-%
-% This loses if there are any *other* active characters besides spaces
-% in the argument -- _ ^ +, for example -- since they get expanded.
-% Fortunately, Texinfo does not define any such commands.  (If it ever
-% does, the catcode of the characters in questionwill have to be changed
-% here.)  But this means we cannot call \removeactivespaces as part of
-% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
-% that \parsearg gets might well have any character at all in it.
-%
-\def\removeactivespaces#1{%
-  \begingroup
-    \ignoreactivespaces
-    \edef\temp{#1}%
-    \global\toks0 = \expandafter{\temp}%
-  \endgroup
-}
-
-% Change the active space to expand to nothing.
-%
-\begingroup
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+%	is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick.  --kasal, 16nov03
+
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
   \obeyspaces
-  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
-\endgroup
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
 
 
 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
 
-%% These are used to keep @begin/@end levels from running away
-%% Call \inENV within environments (after a \begingroup)
-\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
-\def\ENVcheck{%
-\ifENV\errmessage{Still within an environment; press RETURN to continue}
-\endgroup\fi} % This is not perfect, but it should reduce lossage
-
-% @begin foo  is the same as @foo, for now.
-\newhelp\EMsimple{Press RETURN to continue.}
-
-\outer\def\begin{\parsearg\beginxxx}
-
-\def\beginxxx #1{%
-\expandafter\ifx\csname #1\endcsname\relax
-{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
-\csname #1\endcsname\fi}
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    out of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
 
 % @end foo executes the definition of \Efoo.
-%
-\def\end{\parsearg\endxxx}
-\def\endxxx #1{%
-  \removeactivespaces{#1}%
-  \edef\endthing{\the\toks0}%
-  %
-  \expandafter\ifx\csname E\endthing\endcsname\relax
-    \expandafter\ifx\csname \endthing\endcsname\relax
-      % There's no \foo, i.e., no ``environment'' foo.
-      \errhelp = \EMsimple
-      \errmessage{Undefined command `@end \endthing'}%
-    \else
-      \unmatchedenderror\endthing
-    \fi
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
   \else
-    % Everything's ok; the right environment has been started.
-    \csname E\endthing\endcsname
+    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
   \fi
 }
 
-% There is an environment #1, but it hasn't been started.  Give an error.
-%
-\def\unmatchedenderror#1{%
-  \errhelp = \EMsimple
-  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
-}
-
-% Define the control sequence \E#1 to give an unmatched @end error.
-%
-\def\defineunmatchedend#1{%
-  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
-}
-
-
-% Single-spacing is done by various environments (specifically, in
-% \nonfillstart and \quotations).
-\newskip\singlespaceskip \singlespaceskip = 12.5pt
-\def\singlespace{%
-  % Why was this kern here?  It messes up equalizing space above and below
-  % environments.  --karl, 6may93
-  %{\advance \baselineskip by -\singlespaceskip
-  %\kern \baselineskip}%
-  \setleading\singlespaceskip
-}
+\newhelp\EMsimple{Press RETURN to continue.}
+
 
 %% Simple single-character @ commands
 
@@ -467,16 +558,22 @@
 \let\{=\mylbrace
 \let\}=\myrbrace
 \begingroup
-  % Definitions to produce actual \{ & \} command in an index.
-  \catcode`\{ = 12 \catcode`\} = 12
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux/toc files.
+  \catcode`\{ = \other \catcode`\} = \other
   \catcode`\[ = 1 \catcode`\] = 2
-  \catcode`\@ = 0 \catcode`\\ = 12
-  @gdef@lbracecmd[\{]%
-  @gdef@rbracecmd[\}]%
-@endgroup
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
 
 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
 \let\, = \c
 \let\dotaccent = \.
 \def\ringaccent#1{{\accent23 #1}}
@@ -484,10 +581,12 @@
 \let\ubaraccent = \b
 \let\udotaccent = \d
 
-% Other special characters: @questiondown @exclamdown
-% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
 \def\questiondown{?`}
 \def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
 
 % Dotless i and dotless j, used for accents.
 \def\imacro{i}
@@ -500,6 +599,25 @@
   \fi\fi
 }
 
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+  \kern-.15em
+  \TeX
+}
+
 % Be sure we're in horizontal mode when doing a tie, since we make space
 % equivalent to this in @example-like environments. Otherwise, a space
 % at the beginning of a line will start with \penalty -- and
@@ -518,14 +636,32 @@
 % @* forces a line break.
 \def\*{\hfil\break\hbox{}\ignorespaces}
 
+% @/ allows a line break.
+\let\/=\allowbreak
+
 % @. is an end-of-sentence period.
-\def\.{.\spacefactor=3000 }
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
 
 % @! is an end-of-sentence bang.
-\def\!{!\spacefactor=3000 }
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
 
 % @? is an end-of-sentence query.
-\def\?{?\spacefactor=3000 }
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+% 
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+  \fi\fi
+}
 
 % @w prevents a word break.  Without the \leavevmode, @w at the
 % beginning of a paragraph, when TeX is still in vertical mode, would
@@ -540,47 +676,24 @@
 % therefore, no glue is inserted, and the space between the headline and
 % the text is small, which looks bad.
 %
-\def\group{\begingroup
-  \ifnum\catcode13=\active \else
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
     \errhelp = \groupinvalidhelp
     \errmessage{@group invalid in context where filling is enabled}%
   \fi
-  %
-  % The \vtop we start below produces a box with normal height and large
-  % depth; thus, TeX puts \baselineskip glue before it, and (when the
-  % next line of text is done) \lineskip glue after it.  (See p.82 of
-  % the TeXbook.)  Thus, space below is not quite equal to space
-  % above.  But it's pretty close.
-  \def\Egroup{%
-    \egroup           % End the \vtop.
-    \endgroup         % End the \group.
-  }%
-  %
-  \vtop\bgroup
-    % We have to put a strut on the last line in case the @group is in
-    % the midst of an example, rather than completely enclosing it.
-    % Otherwise, the interline space between the last line of the group
-    % and the first line afterwards is too small.  But we can't put the
-    % strut in \Egroup, since there it would be on a line by itself.
-    % Hence this just inserts a strut at the beginning of each line.
-    \everypar = {\strut}%
-    %
-    % Since we have a strut on every line, we don't need any of TeX's
-    % normal interline spacing.
-    \offinterlineskip
-    %
-    % OK, but now we have to do something about blank
-    % lines in the input in @example-like environments, which normally
-    % just turn into \lisppar, which will insert no space now that we've
-    % turned off the interline space.  Simplest is to make them be an
-    % empty paragraph.
-    \ifx\par\lisppar
-      \edef\par{\leavevmode \par}%
-      %
-      % Reset ^^M's definition to new definition of \par.
-      \obeylines
-    \fi
-    %
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
     % Do @comment since we are called inside an environment such as
     % @example, where each end-of-line in the input causes an
     % end-of-line in the output.  We don't want the end-of-line after
@@ -590,6 +703,32 @@
     \comment
 }
 %
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\pageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+%
 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
 % message, so this ends up printing `@group can only ...'.
 %
@@ -602,10 +741,8 @@
 
 \newdimen\mil  \mil=0.001in
 
-\def\need{\parsearg\needx}
-
 % Old definition--didn't work.
-%\def\needx #1{\par %
+%\parseargdef\need{\par %
 %% This method tries to make TeX break the page naturally
 %% if the depth of the box does not fit.
 %{\baselineskip=0pt%
@@ -613,7 +750,7 @@
 %\prevdepth=-1000pt
 %}}
 
-\def\needx#1{%
+\parseargdef\need{%
   % Ensure vertical mode, so we don't make a big box in the middle of a
   % paragraph.
   \par
@@ -652,37 +789,11 @@
   \fi
 }
 
-% @br   forces paragraph break
+% @br   forces paragraph break (and is undocumented).
 
 \let\br = \par
 
-% @dots{} output an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in a typewriter
-% font as three actual period characters.
-%
-\def\dots{%
-  \leavevmode
-  \hbox to 1.5em{%
-    \hskip 0pt plus 0.25fil minus 0.25fil
-    .\hss.\hss.%
-    \hskip 0pt plus 0.5fil minus 0.5fil
-  }%
-}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
-  \leavevmode
-  \hbox to 2em{%
-    \hskip 0pt plus 0.25fil minus 0.25fil
-    .\hss.\hss.\hss.%
-    \hskip 0pt plus 0.5fil minus 0.5fil
-  }%
-  \spacefactor=3000
-}
-
-
-% @page    forces the start of a new page
+% @page forces the start of a new page.
 %
 \def\page{\par\vfill\supereject}
 
@@ -694,13 +805,11 @@
 \newskip\exdentamount
 
 % This defn is used inside fill environments such as @defun.
-\def\exdent{\parsearg\exdentyyy}
-\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
 
 % This defn is used inside nofill environments such as @example.
-\def\nofillexdent{\parsearg\nofillexdentyyy}
-\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
-\leftline{\hskip\leftskip{\rm#1}}}}
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
 
 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
 % paragraph.  For more general purposes, use the \margin insertion
@@ -752,37 +861,71 @@
 }
 
 % @include file    insert text of that file as input.
-% Allow normal characters that  we make active in the argument (a file name).
-\def\include{\begingroup
-  \catcode`\\=12
-  \catcode`~=12
-  \catcode`^=12
-  \catcode`_=12
-  \catcode`|=12
-  \catcode`<=12
-  \catcode`>=12
-  \catcode`+=12
-  \parsearg\includezzz}
-% Restore active chars for included file.
-\def\includezzz#1{\endgroup\begingroup
-  % Read the included file in a group so nested @include's work.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
   \def\thisfile{#1}%
-  \input\thisfile
-\endgroup}
+  {%
+    \makevalueexpandable
+    \def\temp{\input #1 }%
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
 
 \def\thisfile{}
 
-% @center line   outputs that line, centered
-
-\def\center{\parsearg\centerzzz}
-\def\centerzzz #1{{\advance\hsize by -\leftskip
-\advance\hsize by -\rightskip
-\centerline{#1}}}
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\next\centerH
+  \else
+    \let\next\centerV
+  \fi
+  \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+  {%
+    \hfil\break
+    \advance\hsize by -\leftskip
+    \advance\hsize by -\rightskip
+    \line{#1}%
+    \break
+  }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
 
 % @sp n   outputs n lines of vertical space
 
-\def\sp{\parsearg\spxxx}
-\def\spxxx #1{\vskip #1\baselineskip}
+\parseargdef\sp{\vskip #1\baselineskip}
 
 % @comment ...line which is ignored...
 % @c is the same as @comment
@@ -797,13 +940,13 @@
 
 % @paragraphindent NCHARS
 % We'll use ems for NCHARS, close enough.
-% We cannot implement @paragraphindent asis, though.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
 %
 \def\asisword{asis} % no translation, these are keywords
 \def\noneword{none}
 %
-\def\paragraphindent{\parsearg\doparagraphindent}
-\def\doparagraphindent#1{%
+\parseargdef\paragraphindent{%
   \def\temp{#1}%
   \ifx\temp\asisword
   \else
@@ -820,8 +963,7 @@
 % We'll use ems for NCHARS like @paragraphindent.
 % It seems @exampleindent asis isn't necessary, but
 % I preserve it to make it similar to @paragraphindent.
-\def\exampleindent{\parsearg\doexampleindent}
-\def\doexampleindent#1{%
+\parseargdef\exampleindent{%
   \def\temp{#1}%
   \ifx\temp\asisword
   \else
@@ -833,33 +975,76 @@
   \fi
 }
 
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \restorefirstparagraphindent
+    \indent
+  }%
+  \gdef\noindent{%
+    \restorefirstparagraphindent
+    \noindent
+  }%
+  \global\everypar = {%
+    \kern -\parindent
+    \restorefirstparagraphindent
+  }%
+}
+
+\gdef\restorefirstparagraphindent{%
+  \global \let \indent = \ptexindent
+  \global \let \noindent = \ptexnoindent
+  \global \everypar = {}%
+}
+
+
 % @asis just yields its argument.  Used with @table, for example.
 %
 \def\asis#1{#1}
 
 % @math outputs its argument in math mode.
-% We don't use $'s directly in the definition of \math because we need
-% to set catcodes according to plain TeX first, to allow for subscripts,
-% superscripts, special math chars, etc.
-%
-% @math does not do math typesetting in section titles, index
-% entries, and other such contexts where the catcodes are set before
-% @math gets a chance to work.  This could perhaps be fixed, but for now
-% at least we can have real math in the main text, where it's needed most.
-%
-\let\implicitmath = $%$ font-lock fix
 %
 % One complication: _ usually means subscripts, but it could also mean
 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
-% _ within @math be active (mathcode "8000), and distinguish by seeing
-% if the current family is \slfam, which is what @var uses.
-%
-{\catcode95 = \active  % 95 = _
-\gdef\mathunderscore{%
-  \catcode95=\active
-  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
-}}
-%
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
 % Another complication: we want \\ (and @\) to output a \ character.
 % FYI, plain.tex uses \\ as a temporary control sequence (why?), but
 % this is not advertised and we don't care.  Texinfo does not
@@ -870,14 +1055,58 @@
 %
 \def\math{%
   \tex
-  \mathcode`\_="8000 \mathunderscore
+  \mathunderscore
   \let\\ = \mathbackslash
-  \implicitmath\finishmath}
-\def\finishmath#1{#1\implicitmath\Etex}
+  \mathactive
+  $\finishmath
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
 
 % @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{\implicitmath\ptexbullet\implicitmath}
-\def\minus{\implicitmath-\implicitmath}
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+  \leavevmode
+  \hbox to 1.5em{%
+    \hskip 0pt plus 0.25fil
+    .\hfil.\hfil.%
+    \hskip 0pt plus 0.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
 
 % @refill is a no-op.
 \let\refill=\relax
@@ -893,20 +1122,20 @@
 % So open here the files we need to have open while reading the input.
 % This makes it possible to make a .fmt file for texinfo.
 \def\setfilename{%
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
    \iflinks
-     \readauxfile
+     \tryauxfile
+     % Open the new aux file.  TeX will close it automatically at exit.
+     \immediate\openout\auxfile=\jobname.aux
    \fi % \openindices needs to do some work in any case.
    \openindices
-   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
-   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   \let\setfilename=\comment % Ignore extra @setfilename cmds.
    %
    % If texinfo.cnf is present on the system, read it.
    % Useful for site-wide @afourpaper, etc.
-   % Just to be on the safe side, close the input stream before the \input.
    \openin 1 texinfo.cnf
-   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
-   \closein1
-   \temp
+   \ifeof 1 \else \input texinfo.cnf \fi
+   \closein 1
    %
    \comment % Ignore the actual filename.
 }
@@ -942,17 +1171,72 @@
 \newif\ifpdf
 \newif\ifpdfmakepagedest
 
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
 \ifx\pdfoutput\undefined
-  \pdffalse
-  \let\pdfmkdest = \gobble
-  \let\pdfurl = \gobble
-  \let\endlink = \relax
-  \let\linkcolor = \relax
-  \let\pdfmakeoutlines = \relax
 \else
-  \pdftrue
-  \pdfoutput = 1
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's what we do).
+
+% double active backslashes.
+% 
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+   @catcode`@\=@active
+   @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters.  hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens.  I've
+% tinkered with it a little for texinfo, but it's definitely from there.
+% 
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+% 
+\def\HyPsdSubst#1#2#3{%
+  \def\HyPsdReplace##1#1##2\END{%
+    ##1%
+    \ifx\\##2\\%
+    \else
+      #2%
+      \HyReturnAfterFi{%
+        \HyPsdReplace##2\END
+      }%
+    \fi
+  }%
+  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+  \xdef#1{#1}% redefine it as its expansion; the definition is simply
+             % \lastnode when called from \setref -> \pdfmkdest.
+  \HyPsdSubst{(}{\realbackslash(}{#1}%
+  \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\ifpdf
   \input pdfcolor
+  \pdfcatalog{/PageMode /UseOutlines}%
   \def\dopdfimage#1#2#3{%
     \def\imagewidth{#2}%
     \def\imageheight{#3}%
@@ -966,15 +1250,26 @@
       \ifx\empty\imagewidth\else width \imagewidth \fi
       \ifx\empty\imageheight\else height \imageheight \fi
       \ifnum\pdftexversion<13
-	 #1.pdf%
+         #1.pdf%
        \else
          {#1.pdf}%
        \fi
     \ifnum\pdftexversion < 14 \else
       \pdfrefximage \pdflastximage
     \fi}
-  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
-  \def\pdfmkpgn#1{#1}
+  \def\pdfmkdest#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \atdummies
+    \activebackslashdouble
+    \def\pdfdestname{#1}%
+    \backslashparens\pdfdestname
+    \pdfdest name{\pdfdestname} xyz%
+  }}%
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}%
+  %
   \let\linkcolor = \Blue  % was Cyan, but that seems light?
   \def\endlink{\Black\pdfendlink}
   % Adding outlines to PDF; macros for calculating structure of outlines
@@ -982,80 +1277,106 @@
   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
     \else \csname#1\endcsname \fi}
   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
-    \advance\tempnum by1
+    \advance\tempnum by 1
     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
-  \def\pdfmakeoutlines{{%
-    \openin 1 \jobname.toc
-    \ifeof 1\else\begingroup
-      \closein 1
-      \indexnofonts
-      \def\tt{}
-      \let\_ = \normalunderscore
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \def\pdfoutlinedest{#3}%
+    \ifx\pdfoutlinedest\empty
+      \def\pdfoutlinedest{#4}%
+    \else
+      % Doubled backslashes in the name.
+      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+       \backslashparens\pdfoutlinedest}%
+    \fi
+    %
+    % Also double the backslashes in the display string.
+    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+     \backslashparens\pdfoutlinetext}%
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
       % Thanh's hack / proper braces in bookmarks
       \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
       \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
       %
-      \def\chapentry ##1##2##3{}
-      \let\appendixentry = \chapentry
-      \def\unnumbchapentry ##1##2{}
-      \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
-      \def\unnumbsecentry ##1##2##3{\advancenumber{chap##2}}
-      \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
-      \def\unnumbsubsecentry ##1##2##3##4{\advancenumber{sec##2.##3}}
-      \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
-      \def\unnumbsubsubsecentry ##1##2##3##4##5{\advancenumber{subsec##2.##3.##4}}
-      \input \jobname.toc
-      \def\chapentry ##1##2##3{%
-        \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
-      \let\appendixentry = \chapentry
-      \def\unnumbchapentry ##1##2{%
-        \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
-      \def\secentry ##1##2##3##4{%
-        \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
-      \def\unnumbsecentry ##1##2##3{%
-        \pdfoutline goto name{\pdfmkpgn{##3}}{##1}}
-      \def\subsecentry ##1##2##3##4##5{%
-        \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
-      \def\unnumbsubsecentry ##1##2##3##4{%
-        \pdfoutline goto name{\pdfmkpgn{##4}}{##1}}
-      \def\subsubsecentry ##1##2##3##4##5##6{%
-        \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
-      \def\unnumbsubsubsecentry ##1##2##3##4##5{%
-        \pdfoutline goto name{\pdfmkpgn{##5}}{##1}}
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\numchapentry##1##2##3##4{%
+	\def\thischapnum{##2}%
+	\def\thissecnum{0}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+	\advancenumber{chap\thischapnum}%
+	\def\thissecnum{##2}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+	\advancenumber{sec\thissecnum}%
+	\def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+	\advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % xx to do this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Right
+      % now, I guess we'll just let the pdf reader have its way.
+      \indexnofonts
+      \setupdatafile
+      \catcode`\\=\active \otherbackslash
       \input \jobname.toc
-    \endgroup\fi
-  }}
-  \def\makelinks #1,{%
-    \def\params{#1}\def\E{END}%
-    \ifx\params\E
-      \let\nextmakelinks=\relax
-    \else
-      \let\nextmakelinks=\makelinks
-      \ifnum\lnkcount>0,\fi
-      \picknum{#1}%
-      \startlink attr{/Border [0 0 0]}
-        goto name{\pdfmkpgn{\the\pgn}}%
-      \linkcolor #1%
-      \advance\lnkcount by 1%
-      \endlink
-    \fi
-    \nextmakelinks
+    \endgroup
   }
-  \def\picknum#1{\expandafter\pn#1}
-  \def\pn#1{%
-    \def\p{#1}%
-    \ifx\p\lbrace
-      \let\nextpn=\ppn
-    \else
-      \let\nextpn=\ppnn
-      \def\first{#1}
-    \fi
-    \nextpn
-  }
-  \def\ppn#1{\pgn=#1\gobble}
-  \def\ppnn{\pgn=\first}
-  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
-  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  %
   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
     \ifx\PP\D\let\nextsp\relax
     \else\let\nextsp\skipspaces
@@ -1070,21 +1391,28 @@
   \else
     \let \startlink \pdfstartlink
   \fi
+  % make a live url in pdf output.
   \def\pdfurl#1{%
     \begingroup
-      \normalturnoffactive\def\@{@}%
-      \let\value=\expandablevalue
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      % 
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
       \leavevmode\Red
       \startlink attr{/Border [0 0 0]}%
         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
-        % #1
     \endgroup}
   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
   \def\maketoks{%
-    \expandafter\poptoks\the\toksA|ENDTOKS|
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
     \ifx\first0\adn0
     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
@@ -1104,20 +1432,44 @@
     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
     \linkcolor #1\endlink}
   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\fi % \ifx\pdfoutput
+\else
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
 
 
 \message{fonts,}
-% Font-change commands.
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname ten#1\endcsname  % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
 
 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf analogous to plain's \rm, etc.
+% So we set up a \sf.
 \newfam\sffam
-\def\sf{\fam=\sffam \tensf}
+\def\sf{\fam=\sffam \setfontstyle{sf}}
 \let\li = \sf % Sometimes we call it \li, not \sf.
 
-% We don't need math for this one.
-\def\ttsl{\tenttsl}
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
 
 % Default leading.
 \newdimen\textleading  \textleading = 13.2pt
@@ -1168,20 +1520,11 @@
 \def\scshape{csc}
 \def\scbshape{csc}
 
-\newcount\mainmagstep
-\ifx\bigger\relax
-  % not really supported.
-  \let\mainmagstep=\magstep1
-  \setfont\textrm\rmshape{12}{1000}
-  \setfont\texttt\ttshape{12}{1000}
-\else
-  \mainmagstep=\magstephalf
-  \setfont\textrm\rmshape{10}{\mainmagstep}
-  \setfont\texttt\ttshape{10}{\mainmagstep}
-\fi
-% Instead of cmb10, you many want to use cmbx10.
-% cmbx10 is a prettier font on its own, but cmb10
-% looks better when embedded in a line with cmr10.
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
 \setfont\textbf\bfshape{10}{\mainmagstep}
 \setfont\textit\itshape{10}{\mainmagstep}
 \setfont\textsl\slshape{10}{\mainmagstep}
@@ -1191,12 +1534,14 @@
 \font\texti=cmmi10 scaled \mainmagstep
 \font\textsy=cmsy10 scaled \mainmagstep
 
-% A few fonts for @defun, etc.
-\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
 \setfont\deftt\ttshape{10}{\magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
 
 % Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
 \setfont\smallrm\rmshape{9}{1000}
 \setfont\smalltt\ttshape{9}{1000}
 \setfont\smallbf\bfshape{10}{900}
@@ -1209,6 +1554,7 @@
 \font\smallsy=cmsy9
 
 % Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
 \setfont\smallerrm\rmshape{8}{1000}
 \setfont\smallertt\ttshape{8}{1000}
 \setfont\smallerbf\bfshape{10}{800}
@@ -1220,7 +1566,8 @@
 \font\smalleri=cmmi8
 \font\smallersy=cmsy8
 
-% Fonts for title page:
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
 \setfont\titlerm\rmbshape{12}{\magstep3}
 \setfont\titleit\itbshape{10}{\magstep4}
 \setfont\titlesl\slbshape{10}{\magstep4}
@@ -1232,8 +1579,10 @@
 \font\titlei=cmmi12 scaled \magstep3
 \font\titlesy=cmsy10 scaled \magstep4
 \def\authorrm{\secrm}
+\def\authortt{\sectt}
 
 % Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
 \setfont\chaprm\rmbshape{12}{\magstep2}
 \setfont\chapit\itbshape{10}{\magstep3}
 \setfont\chapsl\slbshape{10}{\magstep3}
@@ -1246,6 +1595,7 @@
 \font\chapsy=cmsy10 scaled \magstep3
 
 % Section fonts (14.4pt).
+\def\secnominalsize{14pt}
 \setfont\secrm\rmbshape{12}{\magstep1}
 \setfont\secit\itbshape{10}{\magstep2}
 \setfont\secsl\slbshape{10}{\magstep2}
@@ -1258,6 +1608,7 @@
 \font\secsy=cmsy10 scaled \magstep2
 
 % Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
 \setfont\ssecrm\rmbshape{12}{\magstephalf}
 \setfont\ssecit\itbshape{10}{1315}
 \setfont\ssecsl\slbshape{10}{1315}
@@ -1265,11 +1616,22 @@
 \setfont\ssecttsl\ttslshape{10}{1315}
 \setfont\ssecsf\sfbshape{12}{\magstephalf}
 \let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{\magstep1}
+\setfont\ssecsc\scbshape{10}{1315}
 \font\sseci=cmmi12 scaled \magstephalf
 \font\ssecsy=cmsy10 scaled 1315
-% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
-% but that is not a standard magnification.
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
 
 % In order for the font changes to affect most math symbols and letters,
 % we have to define the \textfont of the standard families.  Since
@@ -1284,56 +1646,104 @@
 }
 
 % The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE.  We do this so that font changes will continue to work
-% in math mode, where it is the current \fam that is relevant in most
-% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
-% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
-% redefine \bf itself.
+% of just \STYLE.  We do this because \STYLE needs to also set the
+% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
 \def\textfonts{%
   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
-  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \let\tenttsl=\textttsl
+  \def\curfontsize{text}%
+  \def\lsize{reduced}\def\lllsize{smaller}%
   \resetmathfonts \setleading{\textleading}}
 \def\titlefonts{%
   \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
   \let\tenttsl=\titlettsl
+  \def\curfontsize{title}%
+  \def\lsize{chap}\def\lllsize{subsec}%
   \resetmathfonts \setleading{25pt}}
 \def\titlefont#1{{\titlefonts\rm #1}}
 \def\chapfonts{%
   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
-  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \let\tenttsl=\chapttsl
+  \def\curfontsize{chap}%
+  \def\lsize{sec}\def\lllsize{text}%
   \resetmathfonts \setleading{19pt}}
 \def\secfonts{%
   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
-  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \let\tenttsl=\secttsl
+  \def\curfontsize{sec}%
+  \def\lsize{subsec}\def\lllsize{reduced}%
   \resetmathfonts \setleading{16pt}}
 \def\subsecfonts{%
   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
-  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \let\tenttsl=\ssecttsl
+  \def\curfontsize{ssec}%
+  \def\lsize{text}\def\lllsize{small}%
   \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+  \let\tenttsl=\reducedttsl
+  \def\curfontsize{reduced}%
+  \def\lsize{small}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
 \def\smallfonts{%
   \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
   \let\tenttsl=\smallttsl
+  \def\curfontsize{small}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
   \resetmathfonts \setleading{10.5pt}}
 \def\smallerfonts{%
   \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
   \let\tenttsl=\smallerttsl
+  \def\curfontsize{smaller}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
   \resetmathfonts \setleading{9.5pt}}
-\let\smallexamplefonts = \smallerfonts
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
 
 % Set up the default fonts, so we can use them for creating boxes.
 %
-\textfonts
+\textfonts \rm
 
 % Define these so they can be easily changed for other fonts.
 \def\angleleft{$\langle$}
@@ -1344,27 +1754,41 @@
 
 % Fonts for short table of contents.
 \setfont\shortcontrm\rmshape{12}{1000}
-\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
 \setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
 
 %% Add scribe-like font environments, plus @l for inline lisp (usually sans
 %% serif) and @ii for TeX italic
 
 % \smartitalic{ARG} outputs arg in italics, followed by an italic correction
 % unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
-\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx}
-\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx}
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+                    \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
 
 \let\i=\smartitalic
+\let\slanted=\smartslanted
 \let\var=\smartslanted
 \let\dfn=\smartslanted
 \let\emph=\smartitalic
-\let\cite=\smartslanted
-
+
+% @b, explicit bold.
 \def\b#1{{\bf #1}}
 \let\strong=\b
 
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
 % We can't just use \exhyphenpenalty, because that only has effect at
 % the end of a paragraph.  Restore normal hyphenation at the end of the
 % group within which \nohyphenation is presumably called.
@@ -1372,11 +1796,35 @@
 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
 \def\restorehyphenation{\hyphenchar\font = `- }
 
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar   = `\.
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar  = `\;
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
 \def\t#1{%
-  {\tt \rawbackslash \frenchspacing #1}%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
   \null
 }
-\let\ttfont=\t
 \def\samp#1{`\tclose{#1}'\null}
 \setfont\keyrm\rmshape{8}{1000}
 \font\keysy=cmsy9
@@ -1411,13 +1859,13 @@
     \nohyphenation
     %
     \rawbackslash
-    \frenchspacing
+    \plainfrenchspacing
     #1%
   }%
   \null
 }
 
-% We *must* turn on hyphenation at `-' and `_' in \code.
+% We *must* turn on hyphenation at `-' and `_' in @code.
 % Otherwise, it is too hard to avoid overfull hboxes
 % in the Emacs manual, the Library manual, etc.
 
@@ -1431,14 +1879,16 @@
   \catcode`\_=\active
   %
   \global\def\code{\begingroup
-    \catcode`\-=\active \let-\codedash
-    \catcode`\_=\active \let_\codeunder
+    \catcode`\-=\active  \catcode`\_=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\realdash
+     \let_\realunder
+    \fi
     \codex
   }
-  %
-  % If we end up with any active - characters when handling the index,
-  % just treat them as a normal -.
-  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
 }
 
 \def\realdash{-}
@@ -1456,30 +1906,53 @@
 }
 \def\codex #1{\tclose{#1}\endgroup}
 
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general.  @allowcodebreaks provides a way to control this.
+% 
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+  \fi\fi
+}
+
 % @kbd is like @code, except that if the argument is just one @key command,
 % then @kbd has no effect.
 
 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
 %   `example' (@kbd uses ttsl only inside of @example and friends),
 %   or `code' (@kbd uses normal tty font always).
-\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
-\def\kbdinputstylexxx#1{%
-  \def\arg{#1}%
-  \ifx\arg\worddistinct
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
-  \else\ifx\arg\wordexample
+  \else\ifx\txiarg\wordexample
     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
-  \else\ifx\arg\wordcode
+  \else\ifx\txiarg\wordcode
     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
   \fi\fi\fi
 }
 \def\worddistinct{distinct}
 \def\wordexample{example}
 \def\wordcode{code}
 
-% Default is kbdinputdistinct.  (Too much of a hassle to call the macro,
-% the catcodes are wrong for parsearg to work.)
-\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}
+% Default is `distinct.'
+\kbdinputstyle distinct
 
 \def\xkey{\key}
 \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
@@ -1487,8 +1960,8 @@
 \else{\tclose{\kbdfont\look}}\fi
 \else{\tclose{\kbdfont\look}}\fi}
 
-% For @url, @env, @command quotes seem unnecessary, so use \code.
-\let\url=\code
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
 \let\env=\code
 \let\command=\code
 
@@ -1520,6 +1993,10 @@
   \endlink
 \endgroup}
 
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
 % rms does not like angle brackets --karl, 17may97.
 % So now @email is just like @uref, unless we are pdf.
 %
@@ -1561,12 +2038,101 @@
 \def\sc#1{{\smallcaps#1}}       % smallcaps font
 \def\ii#1{{\it #1}}             % italic font
 
-% @acronym downcases the argument and prints in smallcaps.
-\def\acronym#1{{\smallcaps \lowercase{#1}}}
-
-% @pounds{} is a sterling sign.
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+% 
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\selectfonts\lsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+% 
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
 \def\pounds{{\it\$}}
 
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+% 
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+% 
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+% 
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+% 
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+% 
+% 
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  % 
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  % 
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  % 
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename 
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else 
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+% 
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
 
 \message{page headings,}
 
@@ -1585,85 +2151,102 @@
 \newif\ifsetshortcontentsaftertitlepage
  \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
 
-\def\shorttitlepage{\parsearg\shorttitlepagezzz}
-\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
         \endgroup\page\hbox{}\page}
 
-\def\titlepage{\begingroup \parindent=0pt \textfonts
-   \let\subtitlerm=\tenrm
-   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
-   %
-   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
-   %
-   % Leave some space at the very top of the page.
-   \vglue\titlepagetopglue
-   %
-   % Now you can print the title using @title.
-   \def\title{\parsearg\titlezzz}%
-   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
-                    % print a rule at the page bottom also.
-                    \finishedtitlepagefalse
-                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
-   % No rule at page bottom unless we print one at the top with @title.
-   \finishedtitlepagetrue
-   %
-   % Now you can put text using @subtitle.
-   \def\subtitle{\parsearg\subtitlezzz}%
-   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
-   %
-   % @author should come last, but may come many times.
-   \def\author{\parsearg\authorzzz}%
-   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
-      {\authorfont \leftline{##1}}}%
-   %
-   % Most title ``pages'' are actually two pages long, with space
-   % at the top of the second.  We don't want the ragged left on the second.
-   \let\oldpage = \page
-   \def\page{%
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
       \iffinishedtitlepage\else
-         \finishtitlepage
+	 \finishtitlepage
       \fi
-      \oldpage
       \let\page = \oldpage
-      \hbox{}}%
-%   \def\page{\oldpage \hbox{}}
+      \page
+      \null
+    }%
 }
 
 \def\Etitlepage{%
-   \iffinishedtitlepage\else
-      \finishtitlepage
-   \fi
-   % It is important to do the page break before ending the group,
-   % because the headline and footline are only empty inside the group.
-   % If we use the new definition of \page, we always get a blank page
-   % after the title page, which we certainly don't want.
-   \oldpage
-   \endgroup
-   %
-   % Need this before the \...aftertitlepage checks so that if they are
-   % in effect the toc pages will come out with page numbers.
-   \HEADINGSon
-   %
-   % If they want short, they certainly want long too.
-   \ifsetshortcontentsaftertitlepage
-     \shortcontents
-     \contents
-     \global\let\shortcontents = \relax
-     \global\let\contents = \relax
-   \fi
-   %
-   \ifsetcontentsaftertitlepage
-     \contents
-     \global\let\contents = \relax
-     \global\let\shortcontents = \relax
-   \fi
+    \iffinishedtitlepage\else
+	\finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+  %
+  % If they want short, they certainly want long too.
+  \ifsetshortcontentsaftertitlepage
+    \shortcontents
+    \contents
+    \global\let\shortcontents = \relax
+    \global\let\contents = \relax
+  \fi
+  %
+  \ifsetcontentsaftertitlepage
+    \contents
+    \global\let\contents = \relax
+    \global\let\shortcontents = \relax
+  \fi
 }
 
 \def\finishtitlepage{%
-   \vskip4pt \hrule height 2pt width \hsize
-   \vskip\titlepagebottomglue
-   \finishedtitlepagetrue
-}
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+		\let\tt=\authortt}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \leftline{\titlefonts\rm #1}
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\authorfont \leftline{#1}}%
+  \fi
+}
+
 
 %%% Set up page headings and footings.
 
@@ -1674,7 +2257,7 @@
 \newtoks\evenfootline    % footline on even pages
 \newtoks\oddfootline     % footline on odd pages
 
-% Now make Tex use those variables
+% Now make TeX use those variables
 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
                             \else \the\evenheadline \fi}}
 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
@@ -1688,32 +2271,27 @@
 % @evenfooting @thisfile||
 % @oddfooting ||@thisfile
 
+
 \def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
 \def\oddheading{\parsearg\oddheadingxxx}
-\def\everyheading{\parsearg\everyheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
 
 \def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
 \def\oddfooting{\parsearg\oddfootingxxx}
-\def\everyfooting{\parsearg\everyfootingxxx}
-
-{\catcode`\@=0 %
-
-\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
-\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
-\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
-\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
-\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
   %
   % Leave some space for the footline.  Hopefully ok to assume
@@ -1722,9 +2300,8 @@
   \global\advance\vsize by -\baselineskip
 }
 
-\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-%
-}% unbind the catcode of @.
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
 
 % @headings double      turns headings on for double-sided printing.
 % @headings single      turns headings on for single-sided printing.
@@ -1738,7 +2315,7 @@
 
 \def\headings #1 {\csname HEADINGS#1\endcsname}
 
-\def\HEADINGSoff{
+\def\HEADINGSoff{%
 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
 \global\oddheadline={\hfil} \global\oddfootline={\hfil}}
 \HEADINGSoff
@@ -1747,7 +2324,7 @@
 % chapter name on inside top of right hand pages, document
 % title on inside top of left hand pages, and page numbers on outside top
 % edge of all pages.
-\def\HEADINGSdouble{
+\def\HEADINGSdouble{%
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
@@ -1759,7 +2336,7 @@
 
 % For single-sided printing, chapter title goes across top left of page,
 % page number on top right.
-\def\HEADINGSsingle{
+\def\HEADINGSsingle{%
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
@@ -1806,12 +2383,11 @@
 % @settitle line...  specifies the title of the document, for headings.
 % It generates no output of its own.
 \def\thistitle{\putwordNoTitle}
-\def\settitle{\parsearg\settitlezzz}
-\def\settitlezzz #1{\gdef\thistitle{#1}}
+\def\settitle{\parsearg{\gdef\thistitle}}
 
 
 \message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+% Tables -- @table, @ftable, @vtable, @item(x).
 
 % default indentation of table text
 \newdimen\tableindent \tableindent=.8in
@@ -1823,7 +2399,7 @@
 % used internally for \itemindent minus \itemmargin
 \newdimen\itemmax
 
-% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
 % these defs.
 % They also define \itemindex
 % to index the item name in whatever manner is desired (perhaps none).
@@ -1835,22 +2411,10 @@
 \def\internalBitem{\smallbreak \parsearg\itemzzz}
 \def\internalBitemx{\itemxpar \parsearg\itemzzz}
 
-\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
-\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
-
-\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
-\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
-
-\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
-                 \itemzzz {#1}}
-
-\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
-                 \itemzzz {#1}}
-
 \def\itemzzz #1{\begingroup %
   \advance\hsize by -\rightskip
   \advance\hsize by -\tableindent
-  \setbox0=\hbox{\itemfont{#1}}%
+  \setbox0=\hbox{\itemindicate{#1}}%
   \itemindex{#1}%
   \nobreak % This prevents a break before @itemx.
   %
@@ -1874,10 +2438,14 @@
     % \parskip glue -- logically it's part of the @item we just started.
     \nobreak \vskip-\parskip
     %
-    % Stop a page break at the \parskip glue coming up.  Unfortunately
-    % we can't prevent a possible page break at the following
-    % \baselineskip glue.
-    \nobreak
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    % 
+    \penalty 10001
     \endgroup
     \itemxneedsnegativevskipfalse
   \else
@@ -1896,97 +2464,106 @@
   \fi
 }
 
-\def\item{\errmessage{@item while not in a table}}
-\def\itemx{\errmessage{@itemx while not in a table}}
-\def\kitem{\errmessage{@kitem while not in a table}}
-\def\kitemx{\errmessage{@kitemx while not in a table}}
-\def\xitem{\errmessage{@xitem while not in a table}}
-\def\xitemx{\errmessage{@xitemx while not in a table}}
-
-% Contains a kludge to get @end[description] to work.
-\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
 
 % @table, @ftable, @vtable.
-\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
-{\obeylines\obeyspaces%
-\gdef\tablex #1^^M{%
-\tabley\dontindex#1        \endtabley}}
-
-\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
-{\obeylines\obeyspaces%
-\gdef\ftablex #1^^M{%
-\tabley\fnitemindex#1        \endtabley
-\def\Eftable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
-{\obeylines\obeyspaces%
-\gdef\vtablex #1^^M{%
-\tabley\vritemindex#1        \endtabley
-\def\Evtable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\dontindex #1{}
-\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
-\def\vritemindex #1{\doind {vr}{\code{#1}}}%
-
-{\obeyspaces %
-\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
-\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
-
-\def\tablez #1#2#3#4#5#6{%
-\aboveenvbreak %
-\begingroup %
-\def\Edescription{\Etable}% Necessary kludge.
-\let\itemindex=#1%
-\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
-\ifnum 0#4>0 \tableindent=#4\mil \fi %
-\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
-\def\itemfont{#2}%
-\itemmax=\tableindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \tableindent %
-\exdentamount=\tableindent
-\parindent = 0pt
-\parskip = \smallskipamount
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def\Etable{\endgraf\afterenvbreak\endgroup}%
-\let\item = \internalBitem %
-\let\itemx = \internalBitemx %
-\let\kitem = \internalBkitem %
-\let\kitemx = \internalBkitemx %
-\let\xitem = \internalBxitem %
-\let\xitemx = \internalBxitemx %
-}
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
 
 % This is the counter used by @enumerate, which is really @itemize
 
 \newcount \itemno
 
-\def\itemize{\parsearg\itemizezzz}
-
-\def\itemizezzz #1{%
-  \begingroup % ended by the @end itemize
-  \itemizey {#1}{\Eitemize}
-}
-
-\def\itemizey #1#2{%
-\aboveenvbreak %
-\itemmax=\itemindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \itemindent %
-\exdentamount=\itemindent
-\parindent = 0pt %
-\parskip = \smallskipamount %
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def#2{\endgraf\afterenvbreak\endgroup}%
-\def\itemcontents{#1}%
-\let\item=\itemizeitem}
-
-% Set sfcode to normal for the chars that usually have another value.
-% These are `.?!:;,'
-\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
-  \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  \def\itemcontents{#1}%
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   \vadjust{\penalty 1200}}% not good to break after first line of item.
+  \flushcr
+}
 
 % \splitoff TOKENS\endmark defines \first to be the first token in
 % TOKENS, and \rest to be the remainder.
@@ -1997,11 +2574,8 @@
 % or number, to specify the first label in the enumerated list.  No
 % argument is the same as `1'.
 %
-\def\enumerate{\parsearg\enumeratezzz}
-\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
 \def\enumeratey #1 #2\endenumeratey{%
-  \begingroup % ended by the @end enumerate
-  %
   % If we were given no argument, pretend we were given `1'.
   \def\thearg{#1}%
   \ifx\thearg\empty \def\thearg{1}\fi
@@ -2072,13 +2646,13 @@
   }%
 }
 
-% Call itemizey, adding a period to the first argument and supplying the
+% Call \doitemize, adding a period to the first argument and supplying the
 % common last two arguments.  Also subtract one from the initial value in
 % \itemno, since @item increments \itemno.
 %
 \def\startenumeration#1{%
   \advance\itemno by -1
-  \itemizey{#1.}\Eenumerate\flushcr
+  \doitemize{#1.}\flushcr
 }
 
 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
@@ -2089,16 +2663,6 @@
 \def\Ealphaenumerate{\Eenumerate}
 \def\Ecapsenumerate{\Eenumerate}
 
-% Definition of @item while inside @itemize.
-
-\def\itemizeitem{%
-\advance\itemno by 1
-{\let\par=\endgraf \smallbreak}%
-\ifhmode \errmessage{In hmode at itemizeitem}\fi
-{\parskip=0in \hskip 0pt
-\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
-\vadjust{\penalty 1200}}%
-\flushcr}
 
 % @multitable macros
 % Amy Hendrickson, 8/18/94, 3/6/96
@@ -2125,24 +2689,14 @@
 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
 %   @item ...
 %   using the widest term desired in each column.
-%
-% For those who want to use more than one line's worth of words in
-% the preamble, break the line within one argument and it
-% will parse correctly, i.e.,
-%
-%     @multitable {Column 1 template} {Column 2 template} {Column 3
-%      template}
-% Not:
-%     @multitable {Column 1 template} {Column 2 template}
-%      {Column 3 template}
 
 % Each new table line starts with @item, each subsequent new column
 % starts with @tab. Empty columns may be produced by supplying @tab's
 % with nothing between them for as many times as empty columns are needed,
 % ie, @tab@tab@tab will produce two empty columns.
 
-% @item, @tab, @multitable or @end multitable do not need to be on their
-% own lines, but it will not hurt if they are.
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
 
 % Sample multitable:
 
@@ -2186,13 +2740,12 @@
 \def\xcolumnfractions{\columnfractions}
 \newif\ifsetpercent
 
-% #1 is the part of the @columnfraction before the decimal point, which
-% is presumably either 0 or the empty string (but we don't check, we
-% just throw it away).  #2 is the decimal part, which we use as the
-% percent of \hsize for this column.
-\def\pickupwholefraction#1.#2 {%
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
   \global\advance\colcount by 1
-  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
   \setuptable
 }
 
@@ -2209,8 +2762,8 @@
          \let\go\pickupwholefraction
       \else
          \global\advance\colcount by 1
-         \setbox0=\hbox{#1\unskip }% Add a normal word space as a separator;
-                            % typically that is always in the input, anyway.
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
          \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
       \fi
     \fi
@@ -2225,18 +2778,33 @@
   \go
 }
 
-% This used to have \hskip1sp.  But then the space in a template line is
-% not enough.  That is bad.  So let's go back to just & until we
-% encounter the problem it was intended to solve again.
-% --karl, nathan@acm.org, 20apr99.
-\def\tab{&}
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry.  Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+%					--karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
 
 % @multitable ... @end multitable definitions:
 %
-\def\multitable{\parsearg\dotable}
-\def\dotable#1{\bgroup
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
   \vskip\parskip
-  \let\item\crcr
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
   \tolerance=9500
   \hbadness=9500
   \setmultitablespacing
@@ -2244,81 +2812,93 @@
   \parindent=\multitableparindent
   \overfullrule=0pt
   \global\colcount=0
-  \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}%
-  %
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}%
+      \global\colcount=0 % Reset the column counter.
+      % Check for saved footnotes, etc.
+      \checkinserts
+      % Keeps underfull box messages off when table breaks over pages.
+      %\filbreak
+	% Maybe so, but it also creates really weird page breaks when the
+	% table breaks over pages. Wouldn't \vfil be better?  Wait until the
+	% problem manifests itself, so it can be fixed for real --karl.
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
   % To parse everything between @multitable and @item:
   \setuptable#1 \endsetuptable
   %
-  % \everycr will reset column counter, \colcount, at the end of
-  % each line. Every column entry will cause \colcount to advance by one.
-  % The table preamble
-  % looks at the current \colcount to find the correct column width.
-  \everycr{\noalign{%
-  %
-  % \filbreak%% keeps underfull box messages off when table breaks over pages.
-  % Maybe so, but it also creates really weird page breaks when the table
-  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
-  % manifests itself, so it can be fixed for real --karl.
-    \global\colcount=0\relax}}%
-  %
   % This preamble sets up a generic column definition, which will
   % be used as many times as user calls for columns.
   % \vtop will set a single line and will also let text wrap and
   % continue for many paragraphs if desired.
-  \halign\bgroup&\global\advance\colcount by 1\relax
-    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
-  %
-  % In order to keep entries from bumping into each other
-  % we will add a \leftskip of \multitablecolspace to all columns after
-  % the first one.
-  %
-  % If a template has been used, we will add \multitablecolspace
-  % to the width of each template entry.
-  %
-  % If the user has set preamble in terms of percent of \hsize we will
-  % use that dimension as the width of the column, and the \leftskip
-  % will keep entries from bumping into each other.  Table will start at
-  % left margin and final column will justify at right margin.
-  %
-  % Make sure we don't inherit \rightskip from the outer environment.
-  \rightskip=0pt
-  \ifnum\colcount=1
-    % The first column will be indented with the surrounding text.
-    \advance\hsize by\leftskip
-  \else
-    \ifsetpercent \else
-      % If user has not set preamble in terms of percent of \hsize
-      % we will advance \hsize by \multitablecolspace.
-      \advance\hsize by \multitablecolspace
-    \fi
-   % In either case we will make \leftskip=\multitablecolspace:
-  \leftskip=\multitablecolspace
-  \fi
-  % Ignoring space at the beginning and end avoids an occasional spurious
-  % blank line, when TeX decides to break the line at the space before the
-  % box from the multistrut, so the strut ends up on a line by itself.
-  % For example:
-  % @multitable @columnfractions .11 .89
-  % @item @code{#}
-  % @tab Legal holiday which is valid in major parts of the whole country.
-  % Is automatically provided with highlighting sequences respectively marking
-  % characters.
-  \noindent\ignorespaces##\unskip\multistrut}\cr
-}
-
-\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
-% If so, do nothing. If not, give it an appropriate dimension based on
-% current baselineskip.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+	% The first column will be indented with the surrounding text.
+	\advance\hsize by\leftskip
+      \else
+	\ifsetpercent \else
+	  % If user has not set preamble in terms of percent of \hsize
+	  % we will advance \hsize by \multitablecolspace.
+	  \advance\hsize by \multitablecolspace
+	\fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
 \ifdim\multitablelinespace=0pt
 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
 \global\advance\multitablelinespace by-\ht0
-%% strut to put in table in case some entry doesn't have descenders,
-%% to keep lines equally spaced
-\let\multistrut = \strut
-\else
-%% FIXME: what is \box0 supposed to be?
-\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
-width0pt\relax} \fi
+\fi
 %% Test to see if parskip is larger than space between lines of
 %% table. If not, do nothing.
 %%        If so, set to same dimension as multitablelinespace.
@@ -2335,237 +2915,114 @@
 
 
 \message{conditionals,}
-% Prevent errors for section commands.
-% Used in @ignore and in failing conditionals.
-\def\ignoresections{%
-  \let\chapter=\relax
-  \let\unnumbered=\relax
-  \let\top=\relax
-  \let\unnumberedsec=\relax
-  \let\unnumberedsection=\relax
-  \let\unnumberedsubsec=\relax
-  \let\unnumberedsubsection=\relax
-  \let\unnumberedsubsubsec=\relax
-  \let\unnumberedsubsubsection=\relax
-  \let\section=\relax
-  \let\subsec=\relax
-  \let\subsubsec=\relax
-  \let\subsection=\relax
-  \let\subsubsection=\relax
-  \let\appendix=\relax
-  \let\appendixsec=\relax
-  \let\appendixsection=\relax
-  \let\appendixsubsec=\relax
-  \let\appendixsubsection=\relax
-  \let\appendixsubsubsec=\relax
-  \let\appendixsubsubsection=\relax
-  \let\contents=\relax
-  \let\smallbook=\relax
-  \let\titlepage=\relax
-}
-
-% Used in nested conditionals, where we have to parse the Texinfo source
-% and so want to turn off most commands, in case they are used
-% incorrectly.
-%
-\def\ignoremorecommands{%
-  \let\defcodeindex = \relax
-  \let\defcv = \relax
-  \let\deffn = \relax
-  \let\deffnx = \relax
-  \let\defindex = \relax
-  \let\defivar = \relax
-  \let\defmac = \relax
-  \let\defmethod = \relax
-  \let\defop = \relax
-  \let\defopt = \relax
-  \let\defspec = \relax
-  \let\deftp = \relax
-  \let\deftypefn = \relax
-  \let\deftypefun = \relax
-  \let\deftypeivar = \relax
-  \let\deftypeop = \relax
-  \let\deftypevar = \relax
-  \let\deftypevr = \relax
-  \let\defun = \relax
-  \let\defvar = \relax
-  \let\defvr = \relax
-  \let\ref = \relax
-  \let\xref = \relax
-  \let\printindex = \relax
-  \let\pxref = \relax
-  \let\settitle = \relax
-  \let\setchapternewpage = \relax
-  \let\setchapterstyle = \relax
-  \let\everyheading = \relax
-  \let\evenheading = \relax
-  \let\oddheading = \relax
-  \let\everyfooting = \relax
-  \let\evenfooting = \relax
-  \let\oddfooting = \relax
-  \let\headings = \relax
-  \let\include = \relax
-  \let\lowersections = \relax
-  \let\down = \relax
-  \let\raisesections = \relax
-  \let\up = \relax
-  \let\set = \relax
-  \let\clear = \relax
-  \let\item = \relax
-}
-
-% Ignore @ignore, @ifhtml, @ifinfo, @ifplaintext, @ifnottex, @html, @menu,
-% @direntry, and @documentdescription.
-%
-\def\ignore{\doignore{ignore}}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
 \def\ifhtml{\doignore{ifhtml}}
 \def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
 \def\ifplaintext{\doignore{ifplaintext}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\html{\doignore{html}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
 \def\menu{\doignore{menu}}
-\def\direntry{\doignore{direntry}}
-\def\documentdescription{\doignore{documentdescription}}
-\def\documentdescriptionword{documentdescription}
-
-% @dircategory CATEGORY  -- specify a category of the dir file
-% which this file should belong to.  Ignore this in TeX.
-\let\dircategory = \comment
-
-% Ignore text until a line `@end #1'.
-%
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
 \def\doignore#1{\begingroup
-  % Don't complain about control sequences we have declared \outer.
-  \ignoresections
-  %
-  % Define a command to swallow text until we reach `@end #1'.
-  % This @ is a catcode 12 token (that is the normal catcode of @ in
-  % this texinfo.tex file).  We change the catcode of @ below to match.
-  \long\def\doignoretext##1@end #1{\enddoignore}%
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
   %
   % Make sure that spaces turn into tokens that match what \doignoretext wants.
-  \catcode32 = 10
-  %
-  % Ignore braces, too, so mismatched braces don't cause trouble.
-  \catcode`\{ = 9
-  \catcode`\} = 9
-  %
-  % We must not have @c interpreted as a control sequence.
-  \catcode`\@ = 12
-  %
-  \def\ignoreword{#1}%
-  \ifx\ignoreword\documentdescriptionword
-    % The c kludge breaks documentdescription, since
-    % `documentdescription' contains a `c'.  Means not everything will
-    % be ignored inside @documentdescription, but oh well...
-  \else
-    % Make the letter c a comment character so that the rest of the line
-    % will be ignored. This way, the document can have (for example)
-    %   @c @end ifinfo
-    % and the @end ifinfo will be properly ignored.
-    % (We've just changed @ to catcode 12.)
-    \catcode`\c = 14
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M@end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty			% Nothing found.
+    \let\next\doignoretextzzz
+  \else					% Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy		% ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
   \fi
-  %
-  % And now expand the command defined above.
-  \doignoretext
-}
-
-% What we do to finish off ignored text.
-%
-\def\enddoignore{\endgroup\ignorespaces}%
-
-\newif\ifwarnedobs\warnedobsfalse
-\def\obstexwarn{%
-  \ifwarnedobs\relax\else
-  % We need to warn folks that they may have trouble with TeX 3.0.
-  % This uses \immediate\write16 rather than \message to get newlines.
-    \immediate\write16{}
-    \immediate\write16{WARNING: for users of Unix TeX 3.0!}
-    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
-    \immediate\write16{If you are running another version of TeX, relax.}
-    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
-    \immediate\write16{  Then upgrade your TeX installation if you can.}
-    \immediate\write16{  (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)}
-    \immediate\write16{If you are stuck with version 3.0, run the}
-    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
-    \immediate\write16{  to use a workaround.}
-    \immediate\write16{}
-    \global\warnedobstrue
-    \fi
-}
-
-% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
-% workaround (which requires the file ``dummy.tfm'' to be installed),
-% uncomment the following line:
-%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
-
-% Ignore text, except that we keep track of conditional commands for
-% purposes of nesting, up to an `@end #1' command.
-%
-\def\nestedignore#1{%
-  \obstexwarn
-  % We must actually expand the ignored text to look for the @end
-  % command, so that nested ignore constructs work.  Thus, we put the
-  % text into a \vbox and then do nothing with the result.  To minimize
-  % the change of memory overflow, we follow the approach outlined on
-  % page 401 of the TeXbook: make the current font be a dummy font.
-  %
-  \setbox0 = \vbox\bgroup
-    % Don't complain about control sequences we have declared \outer.
-    \ignoresections
-    %
-    % Define `@end #1' to end the box, which will in turn undefine the
-    % @end command again.
-    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
-    %
-    % We are going to be parsing Texinfo commands.  Most cause no
-    % trouble when they are used incorrectly, but some commands do
-    % complicated argument parsing or otherwise get confused, so we
-    % undefine them.
-    %
-    % We can't do anything about stray @-signs, unfortunately;
-    % they'll produce `undefined control sequence' errors.
-    \ignoremorecommands
-    %
-    % Set the current font to be \nullfont, a TeX primitive, and define
-    % all the font commands to also use \nullfont.  We don't use
-    % dummy.tfm, as suggested in the TeXbook, because not all sites
-    % might have that installed.  Therefore, math mode will still
-    % produce output, but that should be an extremely small amount of
-    % stuff compared to the main input.
-    %
-    \nullfont
-    \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
-    \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
-    \let\tensf=\nullfont
-    % Similarly for index fonts.
-    \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
-    \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
-    \let\smallsf=\nullfont
-    % Similarly for smallexample fonts.
-    \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
-    \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
-    \let\smallersf=\nullfont
-    %
-    % Don't complain when characters are missing from the fonts.
-    \tracinglostchars = 0
-    %
-    % Don't bother to do space factor calculations.
-    \frenchspacing
-    %
-    % Don't report underfull hboxes.
-    \hbadness = 10000
-    %
-    % Do minimal line-breaking.
-    \pretolerance = 10000
-    %
-    % Do not execute instructions in @tex
-    \def\tex{\doignore{tex}}%
-    % Do not execute macro definitions.
-    % `c' is a comment character, so the word `macro' will get cut off.
-    \def\macro{\doignore{ma}}%
-}
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0	% We have just found the outermost @end.
+    \let\next\enddoignore
+  \else				% Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
 
 % @set VAR sets the variable VAR to an empty value.
 % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
@@ -2573,56 +3030,63 @@
 % Since we want to separate VAR from REST-OF-LINE (which might be
 % empty), we can't just use \parsearg; we have to insert a space of our
 % own to delimit the rest of the line, and then take it out again if we
-% didn't need it.  Make sure the catcode of space is correct to avoid
-% losing inside @example, for instance.
-%
-\def\set{\begingroup\catcode` =10
-  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
-  \parsearg\setxxx}
-\def\setxxx#1{\setyyy#1 \endsetyyy}
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
 \def\setyyy#1 #2\endsetyyy{%
-  \def\temp{#2}%
-  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
-  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
-  \fi
-  \endgroup
-}
-% Can't use \xdef to pre-expand #2 and save some time, since \temp or
-% \next or other control sequences that we've defined might get us into
-% an infinite loop. Consider `@set foo @cite{bar}'.
-\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
 
 % @clear VAR clears (i.e., unsets) the variable VAR.
 %
-\def\clear{\parsearg\clearxxx}
-\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
 
 % @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
 {
-  \catcode`\_ = \active
-  %
-  % We might end up with active _ or - characters in the argument if
-  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
-  % such active characters to their normal equivalents.
-  \gdef\value{\begingroup
-    \catcode`\-=12 \catcode`\_=12
-    \indexbreaks \let_\normalunderscore
-    \valuexxx}
-}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+  \catcode`\- = \active \catcode`\_ = \active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\realdash \let_\normalunderscore
+  }
+}
 
 % We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we \let\value to this in \indexdummies).  Ones
-% whose names contain - or _ still won't work, but we can't do anything
-% about that.  The command has to be fully expandable, since the result
-% winds up in the index file.  This means that if the variable's value
-% contains other Texinfo commands, it's almost certain it will fail
-% (although perhaps we could fix that with sufficient work to do a
-% one-level expansion on the result, instead of complete).
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
 %
 \def\expandablevalue#1{%
   \expandafter\ifx\csname SET#1\endcsname\relax
     {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
   \else
     \csname SET#1\endcsname
   \fi
@@ -2631,68 +3095,36 @@
 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
 % with @set.
 %
-\def\ifset{\parsearg\ifsetxxx}
-\def\ifsetxxx #1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \expandafter\ifsetfail
-  \else
-    \expandafter\ifsetsucceed
-  \fi
-}
-\def\ifsetsucceed{\conditionalsucceed{ifset}}
-\def\ifsetfail{\nestedignore{ifset}}
-\defineunmatchedend{ifset}
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
 
 % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
 % defined with @set, or has been undefined with @clear.
 %
-\def\ifclear{\parsearg\ifclearxxx}
-\def\ifclearxxx #1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \expandafter\ifclearsucceed
-  \else
-    \expandafter\ifclearfail
-  \fi
-}
-\def\ifclearsucceed{\conditionalsucceed{ifclear}}
-\def\ifclearfail{\nestedignore{ifclear}}
-\defineunmatchedend{ifclear}
-
-% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
-% read the text following, through the first @end iftex (etc.).  Make
-% `@end iftex' (etc.) valid only after an @iftex.
-%
-\def\iftex{\conditionalsucceed{iftex}}
-\def\ifnothtml{\conditionalsucceed{ifnothtml}}
-\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
-\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
-\defineunmatchedend{iftex}
-\defineunmatchedend{ifnothtml}
-\defineunmatchedend{ifnotinfo}
-\defineunmatchedend{ifnotplaintext}
-
-% We can't just want to start a group at @iftex (etc.) and end it at
-% @end iftex, since then @set commands inside the conditional have no
-% effect (they'd get reverted at the end of the group).  So we must
-% define \Eiftex to redefine itself to be its previous value.  (We can't
-% just define it to fail again with an ``unmatched end'' error, since
-% the @ifset might be nested.)
-%
-\def\conditionalsucceed#1{%
-  \edef\temp{%
-    % Remember the current value of \E#1.
-    \let\nece{prevE#1} = \nece{E#1}%
-    %
-    % At the `@end #1', redefine \E#1 to be its previous value.
-    \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
-  }%
-  \temp
-}
-
-% We need to expand lots of \csname's, but we don't want to expand the
-% control sequences after we've constructed them.
-%
-\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
 
 % @defininfoenclose.
 \let\definfoenclose=\comment
@@ -2702,9 +3134,8 @@
 % Index generation facilities
 
 % Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within \newindex.
-{\catcode`\@=11
-\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
 
 % \newindex {foo} defines an index named foo.
 % It automatically defines \fooindex such that
@@ -2785,285 +3216,393 @@
 \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
 \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
 
-% Take care of texinfo commands likely to appear in an index entry.
-% (Must be a way to avoid doing expansion at all, and thus not have to
-% laboriously list every single command here.)
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
 %
 \def\indexdummies{%
-\def\ { }%
-\def\@{@}% change to @@ when we switch to @ as escape char in aux files.
-% Need these in case \tex is in effect and \{ is a \delimiter again.
-% But can't use \lbracecmd and \rbracecmd because texindex assumes
-% braces and backslashes are used only as delimiters.
-\let\{ = \mylbrace
-\let\} = \myrbrace
-\def\_{{\realbackslash _}}%
-\normalturnoffactive
-%
-% Take care of the plain tex accent commands.
-\def\,##1{\realbackslash ,{##1}}%
-\def\"{\realbackslash "}%
-\def\`{\realbackslash `}%
-\def\'{\realbackslash '}%
-\def\^{\realbackslash ^}%
-\def\~{\realbackslash ~}%
-\def\={\realbackslash =}%
-\def\b{\realbackslash b}%
-\def\c{\realbackslash c}%
-\def\d{\realbackslash d}%
-\def\u{\realbackslash u}%
-\def\v{\realbackslash v}%
-\def\H{\realbackslash H}%
-\def\dotless##1{\realbackslash dotless {##1}}%
-% Take care of the plain tex special European modified letters.
-\def\AA{\realbackslash AA}%
-\def\AE{\realbackslash AE}%
-\def\L{\realbackslash L}%
-\def\OE{\realbackslash OE}%
-\def\O{\realbackslash O}%
-\def\aa{\realbackslash aa}%
-\def\ae{\realbackslash ae}%
-\def\l{\realbackslash l}%
-\def\oe{\realbackslash oe}%
-\def\o{\realbackslash o}%
-\def\ss{\realbackslash ss}%
-%
-% Although these internals commands shouldn't show up, sometimes they do.
-\def\bf{\realbackslash bf }%
-\def\gtr{\realbackslash gtr}%
-\def\hat{\realbackslash hat}%
-\def\less{\realbackslash less}%
-%\def\rm{\realbackslash rm }%
-\def\sf{\realbackslash sf}%
-\def\sl{\realbackslash sl }%
-\def\tclose##1{\realbackslash tclose {##1}}%
-\def\tt{\realbackslash tt}%
-%
-\def\b##1{\realbackslash b {##1}}%
-\def\i##1{\realbackslash i {##1}}%
-\def\sc##1{\realbackslash sc {##1}}%
-\def\t##1{\realbackslash t {##1}}%
-\def\r##1{\realbackslash r {##1}}%
-%
-\def\TeX{\realbackslash TeX}%
-\def\LaTeX{\realbackslash LaTeX}%
-\def\acronym##1{\realbackslash acronym {##1}}%
-\def\cite##1{\realbackslash cite {##1}}%
-\def\code##1{\realbackslash code {##1}}%
-\def\command##1{\realbackslash command {##1}}%
-\def\dfn##1{\realbackslash dfn {##1}}%
-\def\dots{\realbackslash dots }%
-\def\emph##1{\realbackslash emph {##1}}%
-\def\env##1{\realbackslash env {##1}}%
-\def\file##1{\realbackslash file {##1}}%
-\def\kbd##1{\realbackslash kbd {##1}}%
-\def\key##1{\realbackslash key {##1}}%
-\def\math##1{\realbackslash math {##1}}%
-\def\option##1{\realbackslash option {##1}}%
-\def\samp##1{\realbackslash samp {##1}}%
-\def\strong##1{\realbackslash strong {##1}}%
-\def\uref##1{\realbackslash uref {##1}}%
-\def\url##1{\realbackslash url {##1}}%
-\def\var##1{\realbackslash var {##1}}%
-\def\w{\realbackslash w }%
-%
-% These math commands don't seem likely to be used in index entries.
-\def\copyright{\realbackslash copyright}%
-\def\equiv{\realbackslash equiv}%
-\def\error{\realbackslash error}%
-\def\expansion{\realbackslash expansion}%
-\def\point{\realbackslash point}%
-\def\print{\realbackslash print}%
-\def\result{\realbackslash result}%
-%
-% Handle some cases of @value -- where the variable name does not
-% contain - or _, and the value does not contain any
-% (non-fully-expandable) commands.
-\let\value = \expandablevalue
-%
-\unsepspaces
-% Turn off macro expansion
-\turnoffmacros
-}
-
-% If an index command is used in an @example environment, any spaces
-% therein should become regular spaces in the raw index file, not the
-% expansion of \tie (\leavevmode \penalty \@M \ ).
-{\obeyspaces
- \gdef\unsepspaces{\obeyspaces\let =\space}}
-
-% \indexnofonts no-ops all font-change commands.
-% This is used when outputting the strings to sort the index by.
-\def\indexdummyfont#1{#1}
-\def\indexdummytex{TeX}
-\def\indexdummydots{...}
-
+  \escapechar = `\\     % use backslash in output files.
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux and toc files, @ is the escape character.  So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files).  When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % Do the redefinitions.
+  \commondummies
+  \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+  %
+  % \definedummyword defines \#1 as \string\#1\space, thus effectively
+  % preventing its expansion.  This is used only for control% words,
+  % not control letters, because the \space would be incorrect for
+  % control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword  ##1{\def##1{\string##1\space}}%
+  \def\definedummyletter##1{\def##1{\string##1}}%
+  \let\definedummyaccent\definedummyletter
+  %
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\L
+  \definedummyword\OE
+  \definedummyword\O
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\l
+  \definedummyword\oe
+  \definedummyword\o
+  \definedummyword\ss
+  \definedummyword\exclamdown
+  \definedummyword\questiondown
+  \definedummyword\ordf
+  \definedummyword\ordm
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\minus
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\result
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  %
+  \normalturnoffactive
+  %
+  % Handle some cases of @value -- where it does not contain any
+  % (non-fully-expandable) commands.
+  \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \definedummyletter\!%
+  \definedummyaccent\"%
+  \definedummyaccent\'%
+  \definedummyletter\*%
+  \definedummyaccent\,%
+  \definedummyletter\.%
+  \definedummyletter\/%
+  \definedummyletter\:%
+  \definedummyaccent\=%
+  \definedummyletter\?%
+  \definedummyaccent\^%
+  \definedummyaccent\`%
+  \definedummyaccent\~%
+  \definedummyword\u
+  \definedummyword\v
+  \definedummyword\H
+  \definedummyword\dotaccent
+  \definedummyword\ringaccent
+  \definedummyword\tieaccent
+  \definedummyword\ubaraccent
+  \definedummyword\udotaccent
+  \definedummyword\dotless
+  %
+  % Texinfo font commands.
+  \definedummyword\b
+  \definedummyword\i
+  \definedummyword\r
+  \definedummyword\sc
+  \definedummyword\t
+  %
+  % Commands that take arguments.
+  \definedummyword\acronym
+  \definedummyword\cite
+  \definedummyword\code
+  \definedummyword\command
+  \definedummyword\dfn
+  \definedummyword\emph
+  \definedummyword\env
+  \definedummyword\file
+  \definedummyword\kbd
+  \definedummyword\key
+  \definedummyword\math
+  \definedummyword\option
+  \definedummyword\pxref
+  \definedummyword\ref
+  \definedummyword\samp
+  \definedummyword\strong
+  \definedummyword\tie
+  \definedummyword\uref
+  \definedummyword\url
+  \definedummyword\var
+  \definedummyword\verb
+  \definedummyword\w
+  \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
 \def\indexnofonts{%
-\def\@{@}%
-% how to handle braces?
-\def\_{\normalunderscore}%
-%
-\let\,=\indexdummyfont
-\let\"=\indexdummyfont
-\let\`=\indexdummyfont
-\let\'=\indexdummyfont
-\let\^=\indexdummyfont
-\let\~=\indexdummyfont
-\let\==\indexdummyfont
-\let\b=\indexdummyfont
-\let\c=\indexdummyfont
-\let\d=\indexdummyfont
-\let\u=\indexdummyfont
-\let\v=\indexdummyfont
-\let\H=\indexdummyfont
-\let\dotless=\indexdummyfont
-% Take care of the plain tex special European modified letters.
-\def\AA{AA}%
-\def\AE{AE}%
-\def\L{L}%
-\def\OE{OE}%
-\def\O{O}%
-\def\aa{aa}%
-\def\ae{ae}%
-\def\l{l}%
-\def\oe{oe}%
-\def\o{o}%
-\def\ss{ss}%
-%
-% Don't no-op \tt, since it isn't a user-level command
-% and is used in the definitions of the active chars like <, >, |, etc.
-% Likewise with the other plain tex font commands.
-%\let\tt=\indexdummyfont
-%
-\let\b=\indexdummyfont
-\let\i=\indexdummyfont
-\let\r=\indexdummyfont
-\let\sc=\indexdummyfont
-\let\t=\indexdummyfont
-%
-\let\TeX=\indexdummytex
-\let\acronym=\indexdummyfont
-\let\cite=\indexdummyfont
-\let\code=\indexdummyfont
-\let\command=\indexdummyfont
-\let\dfn=\indexdummyfont
-\let\dots=\indexdummydots
-\let\emph=\indexdummyfont
-\let\env=\indexdummyfont
-\let\file=\indexdummyfont
-\let\kbd=\indexdummyfont
-\let\key=\indexdummyfont
-\let\math=\indexdummyfont
-\let\option=\indexdummyfont
-\let\samp=\indexdummyfont
-\let\strong=\indexdummyfont
-\let\uref=\indexdummyfont
-\let\url=\indexdummyfont
-\let\var=\indexdummyfont
-\let\w=\indexdummyfont
-}
-
-% To define \realbackslash, we must make \ not be an escape.
-% We must first make another character (@) an escape
-% so we do not become unable to do a definition.
-
-{\catcode`\@=0 \catcode`\\=\other
- @gdef@realbackslash{\}}
+  % Accent commands should become @asis.
+  \def\definedummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\definedummyletter##1{\let##1\empty}%
+  % Hopefully, all control words can become @asis.
+  \let\definedummyword\definedummyaccent
+  %
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.
+  % (The following {} will end up in the sort string, but that's ok.)
+  \def\bullet{bullet}%
+  \def\comma{,}%
+  \def\copyright{copyright}%
+  \def\registeredsymbol{R}%
+  \def\dots{...}%
+  \def\enddots{...}%
+  \def\equiv{==}%
+  \def\error{error}%
+  \def\euro{euro}%
+  \def\expansion{==>}%
+  \def\minus{-}%
+  \def\pounds{pounds}%
+  \def\point{.}%
+  \def\print{-|}%
+  \def\result{=>}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  % 
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  % 
+  \macrolist
+}
 
 \let\indexbackslash=0  %overridden during \printindex.
 \let\SETmarginindex=\relax % put index entries in margin (undocumented)?
 
-% For \ifx comparisons.
-\def\emptymacro{\empty}
-
 % Most index entries go through here, but \dosubind is the general case.
-%
-\def\doind#1#2{\dosubind{#1}{#2}\empty}
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
 
 % Workhorse for all \fooindexes.
 % #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% \empty if called from \doind, as we usually are.  The main exception
-% is with defuns, which call us directly.
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
 %
 \def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \ifvmode
+      \dosubindsanitize
+    \else
+      \dosubindwrite
+    \fi
+  }%
+  \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
   % Put the index entry in the margin if desired.
   \ifx\SETmarginindex\relax\else
-    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
   \fi
-  {%
-    \count255=\lastpenalty
-    {%
-      \indexdummies % Must do this here, since \bf, etc expand at this stage
-      \escapechar=`\\
-      {%
-        \let\folio = 0% We will expand all macros now EXCEPT \folio.
-        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
-        % so it will be output as is; and it will print as backslash.
-        %
-        \def\thirdarg{#3}%
-        %
-        % If third arg is present, precede it with space in sort key.
-        \ifx\thirdarg\emptymacro
-          \let\subentry = \empty
-        \else
-          \def\subentry{ #3}%
-        \fi
-        %
-        % First process the index entry with all font commands turned
-        % off to get the string to sort by.
-        {\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
-        %
-        % Now the real index entry with the fonts.
-        \toks0 = {#2}%
-        %
-        % If the third (subentry) arg is present, add it to the index
-        % line to write.
-        \ifx\thirdarg\emptymacro \else
-          \toks0 = \expandafter{\the\toks0{#3}}%
-        \fi
-        %
-        % Set up the complete index entry, with both the sort key and
-        % the original text, including any font commands.  We write
-        % three arguments to \entry to the .?? file (four in the
-        % subentry case), texindex reduces to two when writing the .??s
-        % sorted result.
-        \edef\temp{%
-          \write\csname#1indfile\endcsname{%
-            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
-        }%
-        %
-        % If a skip is the last thing on the list now, preserve it
-        % by backing up by \lastskip, doing the \write, then inserting
-        % the skip again.  Otherwise, the whatsit generated by the
-        % \write will make \lastskip zero.  The result is that sequences
-        % like this:
-        % @end defun
-        % @tindex whatever
-        % @defun ...
-        % will have extra space inserted, because the \medbreak in the
-        % start of the @defun won't see the skip inserted by the @end of
-        % the previous defun.
-        %
-        % But don't do any of this if we're not in vertical mode.  We
-        % don't want to do a \vskip and prematurely end a paragraph.
-        %
-        % Avoid page breaks due to these extra skips, too.
-        %
-        \iflinks
-          \ifvmode
-            \skip0 = \lastskip
-            \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi
-          \fi
-          %
-          \temp % do the write
-          %
-          %
-          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
-        \fi
-      }%
-    }%
-    \penalty\count255
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+      % so it will be output as is; and it will print as backslash.
+  %
+  % Process the index entry with all font commands turned off, to
+  % get the string to sort by.
+  {\indexnofonts
+   \edef\temp{\the\toks0}% need full expansion
+   \xdef\indexsorttmp{\temp}%
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
   }%
+  \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write will make \lastskip zero.  The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \skip0 = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \count255 = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\skip0 glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\skip0
+  \fi
+  %
+  \dosubindwrite
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    % 
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\count255>9999 \penalty\count255 \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\skip0
+  \fi
 }
 
 % The index entry written in the file actually looks like
@@ -3101,13 +3640,12 @@
 % @printindex causes a particular index (the ??s file) to get printed.
 % It does not print any chapter heading (usually an @unnumbered).
 %
-\def\printindex{\parsearg\doprintindex}
-\def\doprintindex#1{\begingroup
+\parseargdef\printindex{\begingroup
   \dobreak \chapheadingskip{10000}%
   %
   \smallfonts \rm
   \tolerance = 9500
-  \indexbreaks
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
   %
   % See if the index file exists and is nonempty.
   % Change catcode of @ here so that if the index file contains
@@ -3134,7 +3672,7 @@
       % Index files are almost Texinfo source, but we use \ as the escape
       % character.  It would be better to use @, but that's too big a change
       % to make right now.
-      \def\indexbackslash{\rawbackslashxx}%
+      \def\indexbackslash{\backslashcurfont}%
       \catcode`\\ = 0
       \escapechar = `\\
       \begindoublecolumns
@@ -3156,7 +3694,10 @@
   \removelastskip
   %
   % We like breaks before the index initials, so insert a bonus.
-  \penalty -300
+  \nobreak
+  \vskip 0pt plus 3\baselineskip
+  \penalty 0
+  \vskip 0pt plus -3\baselineskip
   %
   % Typeset the initial.  Making this add up to a whole number of
   % baselineskips increases the chance of the dots lining up from column
@@ -3166,80 +3707,100 @@
   % No shrink because it confuses \balancecolumns.
   \vskip 1.67\baselineskip plus .5\baselineskip
   \leftline{\secbf #1}%
-  \vskip .33\baselineskip plus .1\baselineskip
-  %
   % Do our best not to break after the initial.
   \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
 }}
 
-% This typesets a paragraph consisting of #1, dot leaders, and then #2
-% flush to the right margin.  It is used for index and table of contents
-% entries.  The paragraph is indented by \leftskip.
-%
-\def\entry#1#2{\begingroup
-  %
-  % Start a new paragraph if necessary, so our assignments below can't
-  % affect previous text.
-  \par
-  %
-  % Do not fill out the last line with white space.
-  \parfillskip = 0in
-  %
-  % No extra space above this paragraph.
-  \parskip = 0in
-  %
-  % Do not prefer a separate line ending with a hyphen to fewer lines.
-  \finalhyphendemerits = 0
-  %
-  % \hangindent is only relevant when the entry text and page number
-  % don't both fit on one line.  In that case, bob suggests starting the
-  % dots pretty far over on the line.  Unfortunately, a large
-  % indentation looks wrong when the entry text itself is broken across
-  % lines.  So we use a small indentation and put up with long leaders.
-  %
-  % \hangafter is reset to 1 (which is the value we want) at the start
-  % of each paragraph, so we need not do anything with that.
-  \hangindent = 2em
-  %
-  % When the entry text needs to be broken, just fill out the first line
-  % with blank space.
-  \rightskip = 0pt plus1fil
-  %
-  % A bit of stretch before each entry for the benefit of balancing columns.
-  \vskip 0pt plus1pt
-  %
-  % Start a ``paragraph'' for the index entry so the line breaking
-  % parameters we've set above will have an effect.
-  \noindent
-  %
-  % Insert the text of the index entry.  TeX will do line-breaking on it.
-  #1%
-  % The following is kludged to not output a line of dots in the index if
-  % there are no page numbers.  The next person who breaks this will be
-  % cursed by a Unix daemon.
-  \def\tempa{{\rm }}%
-  \def\tempb{#2}%
-  \edef\tempc{\tempa}%
-  \edef\tempd{\tempb}%
-  \ifx\tempc\tempd\ \else%
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+%	\def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active.  This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+%                                 --kasal, 21nov03
+\def\entry{%
+  \begingroup
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % Do not fill out the last line with white space.
+    \parfillskip = 0in
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % Do not prefer a separate line ending with a hyphen to fewer lines.
+    \finalhyphendemerits = 0
+    %
+    % \hangindent is only relevant when the entry text and page number
+    % don't both fit on one line.  In that case, bob suggests starting the
+    % dots pretty far over on the line.  Unfortunately, a large
+    % indentation looks wrong when the entry text itself is broken across
+    % lines.  So we use a small indentation and put up with long leaders.
+    %
+    % \hangafter is reset to 1 (which is the value we want) at the start
+    % of each paragraph, so we need not do anything with that.
+    \hangindent = 2em
+    %
+    % When the entry text needs to be broken, just fill out the first line
+    % with blank space.
+    \rightskip = 0pt plus1fil
     %
-    % If we must, put the page number on a line of its own, and fill out
-    % this line with blank space.  (The \hfil is overwhelmed with the
-    % fill leaders glue in \indexdotfill if the page number does fit.)
-    \hfil\penalty50
-    \null\nobreak\indexdotfill % Have leaders before the page number.
+    % A bit of stretch before each entry for the benefit of balancing
+    % columns.
+    \vskip 0pt plus1pt
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\doentry{%
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+    % #1 is the page number.
     %
-    % The `\ ' here is removed by the implicit \unskip that TeX does as
-    % part of (the primitive) \par.  Without it, a spurious underfull
-    % \hbox ensues.
-    \ifpdf
-      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+    % The following is kludged to not output a line of dots in the index if
+    % there are no page numbers.  The next person who breaks this will be
+    % cursed by a Unix daemon.
+    \def\tempa{{\rm }}%
+    \def\tempb{#1}%
+    \edef\tempc{\tempa}%
+    \edef\tempd{\tempb}%
+    \ifx\tempc\tempd
+      \ %
     \else
-      \ #2% The page number ends the paragraph.
+      %
+      % If we must, put the page number on a line of its own, and fill out
+      % this line with blank space.  (The \hfil is overwhelmed with the
+      % fill leaders glue in \indexdotfill if the page number does fit.)
+      \hfil\penalty50
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      % The `\ ' here is removed by the implicit \unskip that TeX does as
+      % part of (the primitive) \par.  Without it, a spurious underfull
+      % \hbox ensues.
+      \ifpdf
+	\pdfgettoks#1.%
+	\ \the\toksA
+      \else
+	\ #1%
+      \fi
     \fi
-  \fi%
-  \par
-\endgroup}
+    \par
+  \endgroup
+}
 
 % Like \dotfill except takes at least 1 em.
 \def\indexdotfill{\cleaders
@@ -3408,6 +3969,12 @@
 \message{sectioning,}
 % Chapters, sections, etc.
 
+% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
 \newcount\chapno
 \newcount\secno        \secno=0
 \newcount\subsecno     \subsecno=0
@@ -3415,9 +3982,12 @@
 
 % This counter is funny since it counts through charcodes of letters A, B, ...
 \newcount\appendixno  \appendixno = `\@
+%
 % \def\appendixletter{\char\the\appendixno}
-% We do the following for the sake of pdftex, which needs the actual
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
 % letter in the expansion, not just typeset.
+%
 \def\appendixletter{%
   \ifnum\appendixno=`A A%
   \else\ifnum\appendixno=`B B%
@@ -3455,11 +4025,12 @@
 
 % Each @chapter defines this as the name of the chapter.
 % page headings and footings can use it.  @section does likewise.
+% However, they are not reliable, because we don't use marks.
 \def\thischapter{}
 \def\thissection{}
 
 \newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
 
 % @raisesections: treat @section as chapter, @subsection as section, etc.
 \def\raisesections{\global\advance\secbase by -1}
@@ -3469,288 +4040,246 @@
 \def\lowersections{\global\advance\secbase by 1}
 \let\down=\lowersections % original BFox name
 
-% Choose a numbered-heading macro
-% #1 is heading level if unmodified by @raisesections or @lowersections
-% #2 is text for heading
-\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \chapterzzz{#2}
-\or
-  \seczzz{#2}
-\or
-  \numberedsubseczzz{#2}
-\or
-  \numberedsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \chapterzzz{#2}
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
   \else
-    \numberedsubsubseczzz{#2}
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
   \fi
-\fi
-}
-
-% like \numhead, but chooses appendix heading levels
-\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \appendixzzz{#2}
-\or
-  \appendixsectionzzz{#2}
-\or
-  \appendixsubseczzz{#2}
-\or
-  \appendixsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \appendixzzz{#2}
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unmlevel
+      \chardef\unmlevel = \absseclevel
+    \fi
   \else
-    \appendixsubsubseczzz{#2}
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+	\errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unmlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unmlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+	\unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+	  \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+	  \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
   \fi
-\fi
-}
-
-% like \numhead, but chooses numberless heading levels
-\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \unnumberedzzz{#2}
-\or
-  \unnumberedseczzz{#2}
-\or
-  \unnumberedsubseczzz{#2}
-\or
-  \unnumberedsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \unnumberedzzz{#2}
-  \else
-    \unnumberedsubsubseczzz{#2}
-  \fi
-\fi
-}
-
-% @chapter, @appendix, @unnumbered.
-\def\thischaptername{No Chapter Title}
-\outer\def\chapter{\parsearg\chapteryyy}
-\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz #1{%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
-\chapmacro {#1}{\the\chapno}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-% We don't substitute the actual chapter name into \thischapter
-% because we don't want its macros evaluated now.
-\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
-                                  {\the\chapno}}}%
-\temp
-\donoderef
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
-}
-
-\outer\def\appendix{\parsearg\appendixyyy}
-\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
-\def\appendixzzz #1{%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \appendixno by 1
-\message{\putwordAppendix\space \appendixletter}%
-\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash appendixentry{\the\toks0}%
-                       {\appendixletter}}}%
-\temp
-\appendixnoderef
-\global\let\section = \appendixsec
-\global\let\subsection = \appendixsubsec
-\global\let\subsubsection = \appendixsubsubsec
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  \message{\putwordChapter\space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  \def\appendixnum{\putwordAppendix\space \appendixletter}%
+  \message{\appendixnum}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
 }
 
 % @centerchap is like @unnumbered, but the heading is centered.
-\outer\def\centerchap{\parsearg\centerchapyyy}
-\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+\outer\parseargdef\centerchap{%
+  % Well, we could do the following in a group, but that would break
+  % an assumption that \chapmacro is called at the outermost level.
+  % Thus we are safer this way:		--kasal, 24feb04
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
 
 % @top is like @unnumbered.
-\outer\def\top{\parsearg\unnumberedyyy}
-
-\outer\def\unnumbered{\parsearg\unnumberedyyy}
-\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz #1{%
-\secno=0 \subsecno=0 \subsubsecno=0
-%
-% This used to be simply \message{#1}, but TeX fully expands the
-% argument to \message.  Therefore, if #1 contained @-commands, TeX
-% expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
-% expanded @cite (which turns out to cause errors because \cite is meant
-% to be executed, not expanded).
-%
-% Anyway, we don't want the fully-expanded definition of @cite to appear
-% as a result of the \message, we just want `@cite' itself.  We use
-% \the<toks register> to achieve this: TeX expands \the<toks> only once,
-% simply yielding the contents of <toks register>.  (We also do this for
-% the toc entries.)
-\toks0 = {#1}\message{(\the\toks0)}%
-%
-\unnumbchapmacro {#1}%
-\gdef\thischapter{#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}%
-\temp
-\unnumbnoderef
-\global\let\section = \unnumberedsec
-\global\let\subsection = \unnumberedsubsec
-\global\let\subsubsection = \unnumberedsubsubsec
-}
+\let\top\unnumbered
 
 % Sections.
-\outer\def\numberedsec{\parsearg\secyyy}
-\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
-\def\seczzz #1{%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
-                                  {\the\chapno}{\the\secno}}}%
-\temp
-\donoderef
-\nobreak
-}
-
-\outer\def\appendixsection{\parsearg\appendixsecyyy}
-\outer\def\appendixsec{\parsearg\appendixsecyyy}
-\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz #1{%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
-                                  {\appendixletter}{\the\secno}}}%
-\temp
-\appendixnoderef
-\nobreak
-}
-
-\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
-\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz #1{%
-\plainsecheading {#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry%
-  {\the\toks0}{\the\chapno}}}%
-\temp
-\unnumbnoderef
-\nobreak
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
 }
 
 % Subsections.
-\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
-\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz #1{%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
-                                    {\the\chapno}{\the\secno}{\the\subsecno}}}%
-\temp
-\donoderef
-\nobreak
-}
-
-\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
-\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz #1{%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
-                                {\appendixletter}{\the\secno}{\the\subsecno}}}%
-\temp
-\appendixnoderef
-\nobreak
-}
-
-\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
-\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz #1{%
-\plainsubsecheading {#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry%
-  {\the\toks0}{\the\chapno}{\the\secno}}}%
-\temp
-\unnumbnoderef
-\nobreak
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
 }
 
 % Subsubsections.
-\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
-\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz #1{%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
-  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
-  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
-\temp
-\donoderef
-\nobreak
-}
-
-\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
-\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz #1{%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
-  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
-  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
-\temp
-\appendixnoderef
-\nobreak
-}
-
-\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
-\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz #1{%
-\plainsubsubsecheading {#1}\gdef\thissection{#1}%
-\toks0 = {#1}%
-\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry%
-  {\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}}}%
-\temp
-\unnumbnoderef
-\nobreak
-}
-
-% These are variants which are not "outer", so they can appear in @ifinfo.
-% Actually, they should now be obsolete; ordinary section commands should work.
-\def\infotop{\parsearg\unnumberedzzz}
-\def\infounnumbered{\parsearg\unnumberedzzz}
-\def\infounnumberedsec{\parsearg\unnumberedseczzz}
-\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
-\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
-
-\def\infoappendix{\parsearg\appendixzzz}
-\def\infoappendixsec{\parsearg\appendixseczzz}
-\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
-\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
-
-\def\infochapter{\parsearg\chapterzzz}
-\def\infosection{\parsearg\sectionzzz}
-\def\infosubsection{\parsearg\subsectionzzz}
-\def\infosubsubsection{\parsearg\subsubsectionzzz}
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
 
 % These macros control what the section commands do, according
 % to what kind of chapter we are in (ordinary, appendix, or unnumbered).
 % Define them by default for a numbered chapter.
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
 
 % Define @majorheading, @heading and @subheading
 
@@ -3763,23 +4292,27 @@
 %          if justification is not attempted.  Hence \raggedright.
 
 
-\def\majorheading{\parsearg\majorheadingzzz}
-\def\majorheadingzzz #1{%
-{\advance\chapheadingskip by 10pt \chapbreak }%
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt\raggedright
-                  \rm #1\hfill}}\bigskip \par\penalty 200}
-
-\def\chapheading{\parsearg\chapheadingzzz}
-\def\chapheadingzzz #1{\chapbreak %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt\raggedright
-                  \rm #1\hfill}}\bigskip \par\penalty 200}
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}%
+  \bigskip \par\penalty 200\relax
+  \suppressfirstparagraphindent
+}
 
 % @heading, @subheading, @subsubheading.
-\def\heading{\parsearg\plainsecheading}
-\def\subheading{\parsearg\plainsubsecheading}
-\def\subsubheading{\parsearg\plainsubsubsecheading}
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
 
 % These macros generate a chapter, section, etc. heading only
 % (including whitespace, linebreaking, etc. around it),
@@ -3788,8 +4321,6 @@
 %%% Args are the skip and penalty (usually negative)
 \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
 
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-
 %%% Define plain chapter starts, and page on/off switching for it
 % Parameter controlling skip before chapter headings (if needed)
 
@@ -3812,7 +4343,7 @@
 \global\let\pagealignmacro=\chappager
 \global\def\HEADINGSon{\HEADINGSsingle}}
 
-\def\CHAPPAGodd{
+\def\CHAPPAGodd{%
 \global\let\contentsalignmacro = \chapoddpage
 \global\let\pchapsepmacro=\chapoddpage
 \global\let\pagealignmacro=\chapoddpage
@@ -3820,107 +4351,201 @@
 
 \CHAPPAGon
 
-\def\CHAPFplain{
-\global\let\chapmacro=\chfplain
-\global\let\unnumbchapmacro=\unnchfplain
-\global\let\centerchapmacro=\centerchfplain}
-
-% Plain chapter opening.
-% #1 is the text, #2 the chapter number or empty if unnumbered.
-\def\chfplain#1#2{%
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
   \pchapsepmacro
   {%
     \chapfonts \rm
-    \def\chapnum{#2}%
-    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    %
+    % Have to define \thissection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\thissection{#1}%
+    \gdef\thischaptername{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \def\temptype{#2}%
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+      \gdef\thischapter{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+      \gdef\thischapter{}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+      % We don't substitute the actual chapter name into \thischapter
+      % because we don't want its macros evaluated now.  And we don't
+      % use \thissection because that changes with each section.
+      %
+      \xdef\thischapter{\putwordAppendix{} \appendixletter:
+                        \noexpand\thischaptername}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+      \xdef\thischapter{\putwordChapter{} \the\chapno:
+                        \noexpand\thischaptername}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 \centerparametersmaybe
+          \hangindent=\wd0 \centerparametersmaybe
           \unhbox0 #1\par}%
   }%
   \nobreak\bigskip % no page break after a chapter title
   \nobreak
 }
 
-% Plain opening for unnumbered.
-\def\unnchfplain#1{\chfplain{#1}{}}
-
 % @centerchap -- centered and unnumbered.
 \let\centerparametersmaybe = \relax
-\def\centerchfplain#1{{%
-  \def\centerparametersmaybe{%
-    \advance\rightskip by 3\rightskip
-    \leftskip = \rightskip
-    \parfillskip = 0pt
-  }%
-  \chfplain{#1}{}%
-}}
-
-\CHAPFplain % The default
-
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
 \def\unnchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                        \parindent=0pt\raggedright
                        \rm #1\hfill}}\bigskip \par\nobreak
 }
-
 \def\chfopen #1#2{\chapoddpage {\chapfonts
 \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
 \par\penalty 5000 %
 }
-
 \def\centerchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                        \parindent=0pt
                        \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
 }
-
-\def\CHAPFopen{
-\global\let\chapmacro=\chfopen
-\global\let\unnumbchapmacro=\unnchfopen
-\global\let\centerchapmacro=\centerchfopen}
-
-
-% Section titles.
+\def\CHAPFopen{%
+  \global\let\chapmacro=\chfopen
+  \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
 \newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
-\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
-\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
 
 % Subsection titles.
-\newskip \subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
-\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
-\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
 
 % Subsubsection titles.
-\let\subsubsecheadingskip = \subsecheadingskip
-\let\subsubsecheadingbreak = \subsecheadingbreak
-\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
-\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
-
-
-% Print any size section title.
-%
-% #1 is the section type (sec/subsec/subsubsec), #2 is the section
-% number (maybe empty), #3 the text.
-\def\sectionheading#1#2#3{%
-  {%
-    \expandafter\advance\csname #1headingskip\endcsname by \parskip
-    \csname #1headingbreak\endcsname
-  }%
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
   {%
     % Switch to the right set of fonts.
-    \csname #1fonts\endcsname \rm
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Only insert the space after the number if we have a section number.
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
     %
-    % Only insert the separating space if we have a section number.
-    \def\secnum{#2}%
-    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\thissection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \thissection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\thissection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\thissection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
     %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 % zero if no section number
-          \unhbox0 #3}%
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
   }%
-  \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)
+  \vskip-\parskip
+  % 
+  % This is purely so the last item on the list is a known \penalty >
+  % 10000.  This is so \startdefun can avoid allowing breakpoints after
+  % section headings.  Otherwise, it would insert a valid breakpoint between:
+  % 
+  %   @section sec-whatever
+  %   @deffn def-whatever
+  \penalty 10001
 }
 
 
@@ -3929,112 +4554,173 @@
 \newwrite\tocfile
 
 % Write an entry to the toc file, opening it if necessary.
-% Called from @chapter, etc.  We supply {\folio} at the end of the
-% argument, which will end up as the last argument to the \...entry macro.
-%
-% We open the .toc file here instead of at @setfilename or any other
-% fixed time so that @contents can be put in the document anywhere.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
 %
 \newif\iftocfileopened
-\def\writetocentry#1{%
-  \iftocfileopened\else
-    \immediate\openout\tocfile = \jobname.toc
-    \global\tocfileopenedtrue
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
   \fi
-  \iflinks \write\tocfile{#1{\folio}}\fi
-  %
-  % Tell \shipout to create a page destination if we're doing pdf, which
-  % will be the target of the links in the table of contents.  We can't
-  % just do it on every page because the title pages are numbered 1 and
-  % 2 (the page numbers aren't printed), and so are the first two pages
-  % of the document.  Thus, we'd have two destinations named `1', and
-  % two named `2'.
-  \ifpdf \pdfmakepagedesttrue \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+% 
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \jobname.toc
 }
 
 \newskip\contentsrightmargin \contentsrightmargin=1in
 \newcount\savepageno
 \newcount\lastnegativepageno \lastnegativepageno = -1
 
-% Finish up the main text and prepare to read what we've written
-% to \tocfile.
+% Prepare to read what we've written to \tocfile.
 %
 \def\startcontents#1{%
-   % If @setchapternewpage on, and @headings double, the contents should
-   % start on an odd page, unlike chapters.  Thus, we maintain
-   % \contentsalignmacro in parallel with \pagealignmacro.
-   % From: Torbjorn Granlund <tege@matematik.su.se>
-   \contentsalignmacro
-   \immediate\closeout\tocfile
-   %
-   % Don't need to put `Contents' or `Short Contents' in the headline.
-   % It is abundantly clear what they are.
-   \unnumbchapmacro{#1}\def\thischapter{}%
-   \savepageno = \pageno
-   \begingroup                  % Set up to handle contents files properly.
-      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
-      % We can't do this, because then an actual ^ in a section
-      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
-      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
-      \raggedbottom             % Worry more about breakpoints than the bottom.
-      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
-      %
-      % Roman numerals for page numbers.
-      \ifnum \pageno>0 \pageno = \lastnegativepageno \fi
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \def\thischapter{}%
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
 }
 
 
 % Normal (long) toc.
 \def\contents{%
-   \startcontents{\putwordTOC}%
-     \openin 1 \jobname.toc
-     \ifeof 1 \else
-       \closein 1
-       \input \jobname.toc
-     \fi
-     \vfill \eject
-     \contentsalignmacro % in case @setchapternewpage odd is in effect
-     \pdfmakeoutlines
-   \endgroup
-   \lastnegativepageno = \pageno
-   \pageno = \savepageno
+  \startcontents{\putwordTOC}%
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
 }
 
 % And just the chapters.
 \def\summarycontents{%
-   \startcontents{\putwordShortTOC}%
-      %
-      \let\chapentry = \shortchapentry
-      \let\appendixentry = \shortappendixentry
-      \let\unnumbchapentry = \shortunnumberedentry
-      % We want a true roman here for the page numbers.
-      \secfonts
-      \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
-      \rm
-      \hyphenpenalty = 10000
-      \advance\baselineskip by 1pt % Open it up a little.
-      \def\secentry ##1##2##3##4{}
-      \def\unnumbsecentry ##1##2##3{}
-      \def\subsecentry ##1##2##3##4##5{}
-      \def\unnumbsubsecentry ##1##2##3##4{}
-      \def\subsubsecentry ##1##2##3##4##5##6{}
-      \def\unnumbsubsubsecentry ##1##2##3##4##5{}
-      \openin 1 \jobname.toc
-      \ifeof 1 \else
-        \closein 1
-        \input \jobname.toc
-      \fi
-     \vfill \eject
-     \contentsalignmacro % in case @setchapternewpage odd is in effect
-   \endgroup
-   \lastnegativepageno = \pageno
-   \pageno = \savepageno
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
 }
 \let\shortcontents = \summarycontents
 
-\ifpdf
-  \pdfcatalog{/PageMode /UseOutlines}%
-\fi
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
 
 % These macros generate individual entries in the table of contents.
 % The first argument is the chapter or section name.
@@ -4042,57 +4728,46 @@
 % The arguments in between are the chapter number, section number, ...
 
 % Chapters, in the main contents.
-\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
 %
 % Chapters, in the short toc.
 % See comments in \dochapentry re vbox and related settings.
-\def\shortchapentry#1#2#3{%
-  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
 }
 
 % Appendices, in the main contents.
-\def\appendixentry#1#2#3{\dochapentry{\putwordAppendix{} #2\labelspace#1}{#3}}
-%
-% Appendices, in the short toc.
-\let\shortappendixentry = \shortchapentry
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
-% We could simplify the code here by writing out an \appendixentry
-% command in the toc file for appendices, instead of using \chapentry
-% for both, but it doesn't seem worth it.
-%
-\newdimen\shortappendixwidth
-%
-\def\shortchaplabel#1{%
-  % This space should be enough, since a single number is .5em, and the
-  % widest letter (M) is 1em, at least in the Computer Modern fonts.
-  % But use \hss just in case.
-  % (This space doesn't include the extra space that gets added after
-  % the label; that gets put in by \shortchapentry above.)
-  \dimen0 = 1em
-  \hbox to \dimen0{#1\hss}%
-}
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
 
 % Unnumbered chapters.
-\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
-\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}}
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
 
 % Sections.
-\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
-\def\unnumbsecentry#1#2#3{\dosecentry{#1}{#3}}
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
 
 % Subsections.
-\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
-\def\unnumbsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
 
 % And subsubsections.
-\def\subsubsecentry#1#2#3#4#5#6{%
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
-\def\unnumbsubsubsecentry#1#2#3#4#5{\dosubsubsecentry{#1}{#5}}
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
 
 % This parameter controls the indentation of the various levels.
-\newdimen\tocindent \tocindent = 3pc
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
 
 % Now for the actual typesetting. In all these, #1 is the text and #2 is the
 % page number.
@@ -4123,17 +4798,8 @@
   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \endgroup}
 
-% Final typesetting of a toc entry; we use the same \entry macro as for
-% the index entries, but we want to suppress hyphenation here.  (We
-% can't do that in the \entry macro, since index entries might consist
-% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
-\def\tocentry#1#2{\begingroup
-  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
-  % Do not use \turnoffactive in these arguments.  Since the toc is
-  % typeset in cmr, characters such as _ would come out wrong; we
-  % have to do the usual translation tricks.
-  \entry{#1}{#2}%
-\endgroup}
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
 
 % Space between chapter (or whatever) number and the title.
 \def\labelspace{\hskip1em \relax}
@@ -4143,8 +4809,8 @@
 
 \def\chapentryfonts{\secfonts \rm}
 \def\secentryfonts{\textfonts}
-\let\subsecentryfonts = \textfonts
-\let\subsubsecentryfonts = \textfonts
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
 
 
 \message{environments,}
@@ -4171,10 +4837,10 @@
 % The text. (`r' is open on the right, `e' somewhat less so on the left.)
 \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
 %
-\global\setbox\errorbox=\hbox to \dimen0{\hfil
+\setbox\errorbox=\hbox to \dimen0{\hfil
    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
    \advance\hsize by -2\dimen2 % Rules.
-   \vbox{
+   \vbox{%
       \hrule height\dimen2
       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
@@ -4188,17 +4854,16 @@
 % One exception: @ is still an escape character, so that @end tex works.
 % But \@ or @@ will get a plain tex @ character.
 
-\def\tex{\begingroup
+\envdef\tex{%
   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
-  \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
   \catcode `\%=14
-  \catcode 43=12 % plus
-  \catcode`\"=12
-  \catcode`\==12
-  \catcode`\|=12
-  \catcode`\<=12
-  \catcode`\>=12
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
   \escapechar=`\\
   %
   \let\b=\ptexb
@@ -4210,19 +4875,24 @@
   \let\equiv=\ptexequiv
   \let\!=\ptexexclam
   \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
   \let\{=\ptexlbrace
   \let\+=\tabalign
   \let\}=\ptexrbrace
+  \let\/=\ptexslash
   \let\*=\ptexstar
   \let\t=\ptext
+  \let\frenchspacing=\plainfrenchspacing
   %
   \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
   \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
   \def\@{@}%
-\let\Etex=\endgroup}
+}
+% There is no need to define \Etex.
 
 % Define @lisp ... @end lisp.
-% @lisp does a \begingroup so it can rebind things,
+% @lisp environment forms a group so it can rebind things,
 % including the definition of @end lisp (which normally is erroneous).
 
 % Amount to narrow the margins by for @lisp.
@@ -4233,34 +4903,25 @@
 % have any width.
 \def\lisppar{\null\endgraf}
 
-% Make each space character in the input produce a normal interword
-% space in the output.  Don't allow a line break at this space, as this
-% is used only in environments like @example, where each line of input
-% should produce a line of output anyway.
-%
-{\obeyspaces %
-\gdef\sepspaces{\obeyspaces\let =\tie}}
-
-% Define \obeyedspace to be our active space, whatever it is.  This is
-% for use in \parsearg.
-{\sepspaces%
-\global\let\obeyedspace= }
-
 % This space is always present above and below environments.
 \newskip\envskipamount \envskipamount = 0pt
 
 % Make spacing and below environment symmetrical.  We use \parskip here
 % to help in doing that, since in @example-like environments \parskip
 % is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip
+% start of the next paragraph will insert \parskip.
 %
 \def\aboveenvbreak{{%
-  \ifnum\lastpenalty < 10000
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
     \advance\envskipamount by \parskip
     \endgraf
     \ifdim\lastskip<\envskipamount
       \removelastskip
-      \penalty-50
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
       \vskip\envskipamount
     \fi
   \fi
@@ -4268,7 +4929,8 @@
 
 \let\afterenvbreak = \aboveenvbreak
 
-% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
 \let\nonarrowing=\relax
 
 % @cartouche ... @end cartouche: draw rectangle w/rounded corners around
@@ -4292,181 +4954,187 @@
 %
 \newskip\lskip\newskip\rskip
 
-\long\def\cartouche{%
-\begingroup
-        \lskip=\leftskip \rskip=\rightskip
-        \leftskip=0pt\rightskip=0pt %we want these *outside*.
-        \cartinner=\hsize \advance\cartinner by-\lskip
-                          \advance\cartinner by-\rskip
-        \cartouter=\hsize
-        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
-%                                    side, and for 6pt waste from
-%                                    each corner char, and rule thickness
-        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
-        % Flag to tell @lisp, etc., not to narrow margin.
-        \let\nonarrowing=\comment
-        \vbox\bgroup
-                \baselineskip=0pt\parskip=0pt\lineskip=0pt
-                \carttop
-                \hbox\bgroup
-                        \hskip\lskip
-                        \vrule\kern3pt
-                        \vbox\bgroup
-                                \hsize=\cartinner
-                                \kern3pt
-                                \begingroup
-                                        \baselineskip=\normbskip
-                                        \lineskip=\normlskip
-                                        \parskip=\normpskip
-                                        \vskip -\parskip
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
+				% side, and for 6pt waste from
+				% each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  % Flag to tell @lisp, etc., not to narrow margin.
+  \let\nonarrowing = t%
+  \vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+	  \hskip\lskip
+	  \vrule\kern3pt
+	  \vbox\bgroup
+	      \kern3pt
+	      \hsize=\cartinner
+	      \baselineskip=\normbskip
+	      \lineskip=\normlskip
+	      \parskip=\normpskip
+	      \vskip -\parskip
+	      \comment % For explanation, see the end of \def\group.
+}
 \def\Ecartouche{%
-                                \endgroup
-                                \kern3pt
-                        \egroup
-                        \kern3pt\vrule
-                        \hskip\rskip
-                \egroup
-                \cartbot
-        \egroup
-\endgroup
-}}
+              \ifhmode\par\fi
+	      \kern3pt
+	  \egroup
+	  \kern3pt\vrule
+	  \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \checkinserts
+}
 
 
 % This macro is called at the beginning of all the @example variants,
 % inside a group.
 \def\nonfillstart{%
   \aboveenvbreak
-  \inENV % This group ends at the end of the body
   \hfuzz = 12pt % Don't be fussy
   \sepspaces % Make spaces be word-separators rather than space tokens.
-  \singlespace
   \let\par = \lisppar % don't ignore blank lines
   \obeylines % each line of input is a line of output
   \parskip = 0pt
   \parindent = 0pt
   \emergencystretch = 0pt % don't try to avoid overfull boxes
-  % @cartouche defines \nonarrowing to inhibit narrowing
-  % at next level down.
   \ifx\nonarrowing\relax
     \advance \leftskip by \lispnarrowing
     \exdentamount=\lispnarrowing
-    \let\exdent=\nofillexdent
-    \let\nonarrowing=\relax
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \smallexamplefonts \rm
   \fi
 }
 
-% Define the \E... control sequence only if we are inside the particular
-% environment, so the error checking in \end will work.
-%
-% To end an @example-like environment, we first end the paragraph (via
-% \afterenvbreak's vertical glue), and then the group.  That way we keep
-% the zero \parskip that the environments set -- \parskip glue will be
-% inserted at the beginning of the next paragraph in the document, after
-% the environment.
-%
-\def\nonfillfinish{\afterenvbreak\endgroup}
-
-% @lisp: indented, narrowed, typewriter font.
-\def\lisp{\begingroup
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+  \makedispenv{#1}{#3}
+  \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
   \nonfillstart
-  \let\Elisp = \nonfillfinish
   \tt
   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
   \gobble       % eat return
 }
 
-% @example: Same as @lisp.
-\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
-
-% @small... is usually equivalent to the non-small (@smallbook
-% redefines).  We must call \example (or whatever) last in the
-% definition, since it reads the return following the @example (or
-% whatever) command.
-%
-% This actually allows (for example) @end display inside an
-% @smalldisplay.  Too bad, but makeinfo will catch the error anyway.
-%
-\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display}
-\def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp}
-\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format}
-\def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
-
-% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts.
-% Originally contributed by Pavel@xerox.
-\def\smalllispx{\begingroup
-  \def\Esmalllisp{\nonfillfinish\endgroup}%
-  \def\Esmallexample{\nonfillfinish\endgroup}%
-  \smallexamplefonts
-  \lisp
-}
-
-% @display: same as @lisp except keep current font.
-%
-\def\display{\begingroup
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
   \nonfillstart
-  \let\Edisplay = \nonfillfinish
   \gobble
 }
-%
-% @smalldisplay (when @smallbook): @display plus smaller fonts.
-%
-\def\smalldisplayx{\begingroup
-  \def\Esmalldisplay{\nonfillfinish\endgroup}%
-  \smallexamplefonts \rm
-  \display
-}
-
-% @format: same as @display except don't narrow margins.
-%
-\def\format{\begingroup
-  \let\nonarrowing = t
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+  \let\nonarrowing = t%
   \nonfillstart
-  \let\Eformat = \nonfillfinish
   \gobble
 }
-%
-% @smallformat (when @smallbook): @format plus smaller fonts.
-%
-\def\smallformatx{\begingroup
-  \def\Esmallformat{\nonfillfinish\endgroup}%
-  \smallexamplefonts \rm
-  \format
-}
-
-% @flushleft (same as @format).
-%
-\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
 
 % @flushright.
 %
-\def\flushright{\begingroup
-  \let\nonarrowing = t
+\envdef\flushright{%
+  \let\nonarrowing = t%
   \nonfillstart
-  \let\Eflushright = \nonfillfinish
   \advance\leftskip by 0pt plus 1fill
   \gobble
 }
+\let\Eflushright = \afterenvbreak
 
 
 % @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.
-%
-\def\quotation{%
-  \begingroup\inENV %This group ends at the end of the @quotation body
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
-  \singlespace
   \parindent=0pt
-  % We have retained a nonzero parskip for the environment, since we're
-  % doing normal filling. So to avoid extra space below the environment...
-  \def\Equotation{\parskip = 0pt \nonfillfinish}%
   %
   % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
   \ifx\nonarrowing\relax
     \advance\leftskip by \lispnarrowing
     \advance\rightskip by \lispnarrowing
     \exdentamount = \lispnarrowing
+  \else
     \let\nonarrowing = \relax
   \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\undefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
 }
 
 
@@ -4477,14 +5145,18 @@
 %
 % [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
 %
-% [Knuth] p. 344; only we need to do '@' too
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
 \def\dospecials{%
-  \do\ \do\\\do\@\do\{\do\}\do\$\do\&%
-  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
 %
 % [Knuth] p. 380
 \def\uncatcodespecials{%
-  \def\do##1{\catcode`##1=12}\dospecials}
+  \def\do##1{\catcode`##1=\other}\dospecials}
 %
 % [Knuth] pp. 380,381,391
 % Disable Spanish ligatures ?` and !` of \tt font
@@ -4532,6 +5204,8 @@
   }
 \endgroup
 \def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
   % Easiest (and conventionally used) font for verbatim
   \tt
   \def\par{\leavevmode\egroup\box0\endgraf}%
@@ -4553,7 +5227,7 @@
 %
 % [Knuth] p. 382; only eat outer {}
 \begingroup
-  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
   \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
 \endgroup
 %
@@ -4567,609 +5241,393 @@
 %
 % For Texinfo it's a lot easier than for LaTeX,
 % because texinfo's \verbatim doesn't stop at '\end{verbatim}':
-% we need not redefine '\', '{' and '}'
+% we need not redefine '\', '{' and '}'.
 %
 % Inspired by LaTeX's verbatim command set [latex.ltx]
-%% Include LaTeX hack for completeness -- never know
-%% \begingroup
-%% \catcode`|=0 \catcode`[=1
-%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
-%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
-%% #1|endgroup|def|Everbatim[]|end[verbatim]]
-%% |endgroup
+%
 \begingroup
   \catcode`\ =\active
-  \gdef\doverbatim#1@end verbatim{#1\end{verbatim}}
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
 \endgroup
 %
-\def\verbatim{%
-  \def\Everbatim{\nonfillfinish\endgroup}%
-  \begingroup
-    \nonfillstart
-    \advance\leftskip by -\defbodyindent
-    \begingroup\setupverbatim\doverbatim
-}
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
 
 % @verbatiminclude FILE - insert text of file in verbatim environment.
 %
-% Allow normal characters that we make active in the argument (a file name).
-\def\verbatiminclude{%
-  \begingroup
-    \catcode`\\=12
-    \catcode`~=12
-    \catcode`^=12
-    \catcode`_=12
-    \catcode`|=12
-    \catcode`<=12
-    \catcode`>=12
-    \catcode`+=12
-    \parsearg\doverbatiminclude
-}
-\def\setupverbatiminclude{%
-  \begingroup
-    \nonfillstart
-    \advance\leftskip by -\defbodyindent
-    \begingroup\setupverbatim
-}
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
 %
 \def\doverbatiminclude#1{%
-     % Restore active chars for included file.
-  \endgroup
-  \begingroup
-  \def\thisfile{#1}%
-  \expandafter\expandafter\setupverbatiminclude\input\thisfile
-  \endgroup\nonfillfinish\endgroup
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \input #1
+    \afterenvbreak
+  }%
 }
 
 % @copying ... @end copying.
 % Save the text away for @insertcopying later.
 %
-\newbox\copyingbox
-%
-\def\copying{\begingroup
-  \parindent = 0pt  % looks wrong on title page
-  \def\Ecopying{\egroup\endgroup}%
-  \global\setbox\copyingbox = \vbox\bgroup
-}
-
-% @insertcopying.
-%
-\def\insertcopying{\unvcopy\copyingbox}
-
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
 
 \message{defuns,}
 % @defun etc.
 
-% Allow user to change definition object font (\df) internally
-\def\setdeffont #1 {\csname DEF#1\endcsname}
-
 \newskip\defbodyindent \defbodyindent=.4in
 \newskip\defargsindent \defargsindent=50pt
-\newskip\deftypemargin \deftypemargin=12pt
 \newskip\deflastargmargin \deflastargmargin=18pt
 
-\newcount\parencount
-% define \functionparens, which makes ( and ) and & do special things.
-% \functionparens affects the group it is contained in.
-\def\activeparens{%
-\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
-\catcode`\[=\active \catcode`\]=\active}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
-
-% Be sure that we always have a definition for `(', etc.  For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-\global\let(=\lparen \global\let)=\rparen
-\global\let[=\lbrack \global\let]=\rbrack
-
-\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
-\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
-% This is used to turn on special parens
-% but make & act ordinary (given that it's active).
-\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
-
-% Definitions of (, ) and & used in args for functions.
-% This is the definition of ( outside of all parentheses.
-\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
-  \global\advance\parencount by 1
-}
-%
-% This is the definition of ( when already inside a level of parens.
-\gdef\opnested{\char`\(\global\advance\parencount by 1 }
-%
-\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
-  % also in that case restore the outer-level definition of (.
-  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
-  \global\advance \parencount by -1 }
-% If we encounter &foo, then turn on ()-hacking afterwards
-\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
-%
-\gdef\normalparens{\boldbrax\let&=\ampnr}
-} % End of definition inside \activeparens
-%% These parens (in \boldbrax) actually are a little bolder than the
-%% contained text.  This is especially needed for [ and ]
-\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
-\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
-\let\ampnr = \&
-\def\lbrb{{\bf\char`\[}}
-\def\rbrb{{\bf\char`\]}}
-
-% Active &'s sneak into the index arguments, so make sure it's defined.
-{
-  \catcode`& = 13
-  \global\let& = \ampnr
-}
-
-% First, defname, which formats the header line itself.
-% #1 should be the function name.
-% #2 should be the type of definition, such as "Function".
-
-\def\defname #1#2{%
-% Get the values of \leftskip and \rightskip as they were
-% outside the @def...
-\dimen2=\leftskip
-\advance\dimen2 by -\defbodyindent
-\noindent
-\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
-\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
-\parshape 2 0in \dimen0 \defargsindent \dimen1
-% Now output arg 2 ("Function" or some such)
-% ending at \deftypemargin from the right margin,
-% but stuck inside a box of width 0 so it does not interfere with linebreaking
-{% Adjust \hsize to exclude the ambient margins,
-% so that \rightline will obey them.
-\advance \hsize by -\dimen2
-\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}%
-% Make all lines underfull and no complaints:
-\tolerance=10000 \hbadness=10000
-\advance\leftskip by -\defbodyindent
-\exdentamount=\defbodyindent
-{\df #1}\enskip        % Generate function name
-}
-
-% Common pieces to start any @def...
-% #1 is the \E... control sequence to end the definition (which we define).
-% #2 is the \...x control sequence (which our caller defines).
-% #3 is the control sequence to process the header, such as \defunheader.
-%
-\def\parsebodycommon#1#2#3{%
-  \begingroup\inENV
-  % If there are two @def commands in a row, we'll have a \nobreak,
-  % which is there to keep the function description together with its
-  % header.  But if there's nothing but headers, we want to allow a
-  % break after all.
-  \ifnum\lastpenalty = 10000 \penalty0 \fi
-  \medbreak
-  %
-  % Define the \E... end token that this defining construct specifies
-  % so that it will exit this group.
-  \def#1{\endgraf\endgroup\medbreak}%
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \defargscommonending, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    % 
+    \ifnum\lastpenalty=10002 \penalty2000 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
   %
   \parindent=0in
   \advance\leftskip by \defbodyindent
   \exdentamount=\defbodyindent
 }
 
-% Process body of @defun, @deffn, @defmac, etc.
-%
-\def\defparsebody#1#2#3{%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
-  \catcode61=\active % 61 is `='
-  \begingroup\obeylines\activeparens
-  \spacesplit#3%
-}
-
-% #1, #2, #3 are the common arguments (see \defparsebody).
-% #4, delimited by the space, is the class name.
-%
-\def\defmethparsebody#1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#4}}%
-}
-
-% Used for @deftypemethod and @deftypeivar.
-% #1, #2, #3 are the common arguments (see \defparsebody).
-% #4, delimited by a space, is the class name.
-% #5 is the method's return type.
-%
-\def\deftypemethparsebody#1#2#3#4 #5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#4}{#5}}%
-}
-
-% Used for @deftypeop.  The change from \deftypemethparsebody is an
-% extra argument at the beginning which is the `category', instead of it
-% being the hardwired string `Method' or `Instance Variable'.  We have
-% to account for this both in the \...x definition and in parsing the
-% input at hand.  Thus also need a control sequence (passed as #5) for
-% the \E... definition to assign the category name to.
-%
-\def\deftypeopparsebody#1#2#3#4#5 #6 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 ##3 {%
-    \def#4{##1}%
-    \begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#5}{#6}}%
-}
-
-% For @defop.
-\def\defopparsebody #1#2#3#4#5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\def#4{##1}%
-    \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#5}}%
-}
-
-% These parsing functions are similar to the preceding ones
-% except that they do not make parens into active characters.
-% These are used for "variables" since they have no arguments.
-%
-\def\defvarparsebody #1#2#3{%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2{\begingroup\obeylines\spacesplit#3}%
-  \catcode61=\active %
-  \begingroup\obeylines
-  \spacesplit#3%
-}
-
-% @defopvar.
-\def\defopvarparsebody #1#2#3#4#5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\def#4{##1}%
-    \begingroup\obeylines\spacesplit{#3{##2}}}%
-  \begingroup\obeylines
-  \spacesplit{#3{#5}}%
-}
-
-\def\defvrparsebody#1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
-  \begingroup\obeylines
-  \spacesplit{#3{#4}}%
-}
-
-% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
-% type is just `struct', because we lose the braces in `{struct
-% termios}' when \spacesplit reads its undelimited argument.  Sigh.
-% \let\deftpparsebody=\defvrparsebody
-%
-% So, to get around this, we put \empty in with the type name.  That
-% way, TeX won't find exactly `{...}' as an undelimited argument, and
-% won't strip off the braces.
-%
-\def\deftpparsebody #1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
-  \begingroup\obeylines
-  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
-}
-
-% Fine, but then we have to eventually remove the \empty *and* the
-% braces (if any).  That's what this does.
-%
-\def\removeemptybraces\empty#1\relax{#1}
-
-% After \spacesplit has done its work, this is called -- #1 is the final
-% thing to call, #2 the type name (which starts with \empty), and #3
-% (which might be empty) the arguments.
-%
-\def\parsetpheaderline#1#2#3{%
-  #1{\removeemptybraces#2\relax}{#3}%
-}%
-
-% Split up #2 at the first space token.
-% call #1 with two arguments:
-%  the first is all of #2 before the space token,
-%  the second is all of #2 after that space token.
-% If #2 contains no space token, all of it is passed as the first arg
-% and the second is passed as empty.
-%
-{\obeylines
-\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
-\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
-\ifx\relax #3%
-#1{#2}{}\else #1{#2}{#3#4}\fi}}
-
-% Define @defun.
-
-% First, define the processing that is wanted for arguments of \defun
-% Use this to expand the args and terminate the paragraph they make up
-
-\def\defunargs#1{\functionparens \sl
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Set the font temporarily and use \font in case \setfont made \tensl a macro.
-{\tensl\hyphenchar\font=0}%
-#1%
-{\tensl\hyphenchar\font=45}%
-\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\nobreak\vskip -\parskip\nobreak
-}
-
-\def\deftypefunargs #1{%
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Use \boldbraxnoamp, not \functionparens, so that & is not special.
-\boldbraxnoamp
-\tclose{#1}% avoid \code because of side effects on active chars
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\nobreak\vskip -\parskip\nobreak
-}
-
-% Do complete processing of one @defun or @defunx line already parsed.
-
-% @deffn Command forward-char nchars
-
-\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
-
-\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defun == @deffn Function
-
-\def\defun{\defparsebody\Edefun\defunx\defunheader}
-
-\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDeffunc}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefun int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
-
-% #1 is the data type.  #2 is the name and args.
-\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
-% #1 is the data type, #2 the name, #3 the args.
-\def\deftypefunheaderx #1#2 #3\relax{%
-\doind {fn}{\code{#2}}% Make entry in function index
-\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
-\deftypefunargs {#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
-
-% \defheaderxcond#1\relax$.$
-% puts #1 in @code, followed by a space, but does nothing if #1 is null.
-\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
-
-% #1 is the classification.  #2 is the data type.  #3 is the name and args.
-\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
-% #1 is the classification, #2 the data type, #3 the name, #4 the args.
-\def\deftypefnheaderx #1#2#3 #4\relax{%
-\doind {fn}{\code{#3}}% Make entry in function index
-\begingroup
-\normalparens % notably, turn off `&' magic, which prevents
-%               at least some C++ text from working
-\defname {\defheaderxcond#2\relax$.$#3}{#1}%
-\deftypefunargs {#4}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defmac == @deffn Macro
-
-\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
-
-\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDefmac}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defspec == @deffn Special Form
-
-\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
-
-\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDefspec}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defop CATEGORY CLASS OPERATION ARG...
-%
-\def\defop #1 {\def\defoptype{#1}%
-\defopparsebody\Edefop\defopx\defopheader\defoptype}
-%
-\def\defopheader#1#2#3{%
-\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index
-\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}%
-\defunargs {#3}\endgroup %
-}
-
-% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
-%
-\def\deftypeop #1 {\def\deftypeopcategory{#1}%
-  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
-                       \deftypeopcategory}
-%
-% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
-\def\deftypeopheader#1#2#3#4{%
-  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
   \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}
-            {\deftypeopcategory\ \putwordon\ \code{#1}}%
-    \deftypefunargs{#4}%
-  \endgroup
-}
-
-% @deftypemethod CLASS TYPE METHOD ARG...
-%
-\def\deftypemethod{%
-  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
-%
-% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
-\def\deftypemethodheader#1#2#3#4{%
-  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
-  \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
-    \deftypefunargs{#4}%
-  \endgroup
-}
-
-% @deftypeivar CLASS TYPE VARNAME
-%
-\def\deftypeivar{%
-  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
-%
-% #1 is the class name, #2 the data type, #3 the variable name.
-\def\deftypeivarheader#1#2#3{%
-  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
-  \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}
-            {\putwordInstanceVariableof\ \code{#1}}%
-    \defvarargs{#3}%
-  \endgroup
-}
-
-% @defmethod == @defop Method
-%
-\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
-%
-% #1 is the class name, #2 the method name, #3 the args.
-\def\defmethodheader#1#2#3{%
-  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
-  \begingroup
-    \defname{#2}{\putwordMethodon\ \code{#1}}%
-    \defunargs{#3}%
-  \endgroup
-}
-
-% @defcv {Class Option} foo-class foo-flag
-
-\def\defcv #1 {\def\defcvtype{#1}%
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
-
-\def\defcvarheader #1#2#3{%
-\dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index
-\begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}%
-\defvarargs {#3}\endgroup %
-}
-
-% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
-%
-\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
-%
-\def\defivarheader#1#2#3{%
-  \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index
-  \begingroup
-    \defname{#2}{\putwordInstanceVariableof\ #1}%
-    \defvarargs{#3}%
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty 10002  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
   \endgroup
 }
 
-% @defvar
-% First, define the processing that is wanted for arguments of @defvar.
-% This is actually simple: just print them in roman.
-% This must expand the args and terminate the paragraph they make up
-\def\defvarargs #1{\normalparens #1%
-\interlinepenalty=10000
-\endgraf\nobreak\vskip -\parskip\nobreak}
-
-% @defvr Counter foo-count
-
-\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
-
-\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
-
-% @defvar == @defvr Variable
-
-\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
-
-\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{\putwordDefvar}%
-\defvarargs {#2}\endgroup %
-}
-
-% @defopt == @defvr {User Option}
-
-\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
-
-\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{\putwordDefopt}%
-\defvarargs {#2}\endgroup %
-}
-
-% @deftypevar int foobar
-
-\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
-
-% #1 is the data type.  #2 is the name, perhaps followed by text that
-% is actually part of the data type, which should not be put into the index.
-\def\deftypevarheader #1#2{%
-\dovarind#2 \relax% Make entry in variables index
-\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
-\interlinepenalty=10000
-\endgraf\nobreak\vskip -\parskip\nobreak
-\endgroup}
-\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
-
-% @deftypevr {Global Flag} int enable
-
-\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
-
-\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
-\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
-\interlinepenalty=10000
-\endgraf\nobreak\vskip -\parskip\nobreak
-\endgroup}
-
-% Now define @deftp
-% Args are printed in bold, a slight difference from @defvar.
-
-\def\deftpargs #1{\bf \defvarargs{#1}}
-
-% @deftp Class window height width ...
-
-\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
-
-\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
-\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
-
-% These definitions are used if you use @defunx (etc.)
-% anywhere other than immediately after a @defun or @defunx.
-%
-\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
-\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
-\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
-\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
-\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
-\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
-\def\defopx#1 {\errmessage{@defopx in invalid context}}
-\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
-\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
-\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
-\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
-\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
-\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
-\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
-\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
-\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
-\def\defunx#1 {\errmessage{@defunx in invalid context}}
-\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
-\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % How we'll format the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  % (plain.tex says that \dimen1 should be used only as global.)
+  \parshape 2 0in \dimen0 \defargsindent \dimen2
+  %
+  % Put the type name to the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% return value type
+    \ifx\temp\empty\else \tclose{\temp} \fi
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \tenrm
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  Let's try @var for that.
+  \let\var=\ttslanted
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+  \errmessage{Unbalanced parentheses in @def}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \errmessage{Unbalanced square braces in @def}%
+  \global\brackcount=0
+}
 
 
 \message{macros,}
@@ -5178,42 +5636,69 @@
 % To do this right we need a feature of e-TeX, \scantokens,
 % which we arrange to emulate with a temporary file in ordinary TeX.
 \ifx\eTeXversion\undefined
- \newwrite\macscribble
- \def\scanmacro#1{%
-   \begingroup \newlinechar`\^^M
-   % Undo catcode changes of \startcontents and \doprintindex
-   \catcode`\@=0 \catcode`\\=12 \escapechar=`\@
-   % Append \endinput to make sure that TeX does not see the ending newline.
-   \toks0={#1\endinput}%
-   \immediate\openout\macscribble=\jobname.tmp
-   \immediate\write\macscribble{\the\toks0}%
-   \immediate\closeout\macscribble
-   \let\xeatspaces\eatspaces
-   \input \jobname.tmp
-   \endgroup
-}
-\else
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
 \def\scanmacro#1{%
-\begingroup \newlinechar`\^^M
-% Undo catcode changes of \startcontents and \doprintindex
-\catcode`\@=0 \catcode`\\=12 \escapechar=`\@
-\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
-\fi
+  \begingroup
+    \newlinechar`\^^M
+    \let\xeatspaces\eatspaces
+    % Undo catcode changes of \startcontents and \doprintindex
+    % When called from @insertcopying or (short)caption, we need active
+    % backslash to get it printed correctly.  Previously, we had
+    % \catcode`\\=\other instead.  We'll see whether a problem appears
+    % with macro expansion.				--kasal, 19aug04
+    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+    % ... and \example
+    \spaceisspace
+    %
+    % Append \endinput to make sure that TeX does not see the ending newline.
+    %
+    % I've verified that it is necessary both for e-TeX and for ordinary TeX
+    %							--kasal, 29nov03
+    \scantokens{#1\endinput}%
+  \endgroup
+}
+
+\def\scanexp#1{%
+  \edef\temp{\noexpand\scanmacro{#1}}%
+  \temp
+}
 
 \newcount\paramno   % Count of parameters
 \newtoks\macname    % Macro name
 \newif\ifrecursive  % Is it recursive?
-\def\macrolist{}    % List of all defined macros in the form
-                    % \do\macro1\do\macro2...
+
+% List of all defined macros in the form
+%    \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\definedummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
 
 % Utility routines.
-% Thisdoes \let #1 = #2, except with \csnames.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+% 
 \def\cslet#1#2{%
-\expandafter\expandafter
-\expandafter\let
-\expandafter\expandafter
-\csname#1\endcsname
-\csname#2\endcsname}
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
 
 % Trim leading and trailing spaces off a string.
 % Concepts from aro-bend problem 15 (see CTAN).
@@ -5226,7 +5711,7 @@
 }
 
 % Trim a single trailing ^^M off a string.
-{\catcode`\^^M=12\catcode`\Q=3%
+{\catcode`\^^M=\other \catcode`\Q=3%
 \gdef\eatcr #1{\eatcra #1Q^^MQ}%
 \gdef\eatcra#1^^MQ{\eatcrb#1Q}%
 \gdef\eatcrb#1Q#2Q{#1}%
@@ -5240,30 +5725,36 @@
 % done by  making ^^M (\endlinechar) catcode 12 when reading the macro
 % body, and then making it the \newlinechar in \scanmacro.
 
+\def\scanctxt{%
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\@=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
 \def\macrobodyctxt{%
-  \catcode`\~=12
-  \catcode`\^=12
-  \catcode`\_=12
-  \catcode`\|=12
-  \catcode`\<=12
-  \catcode`\>=12
-  \catcode`\+=12
-  \catcode`\{=12
-  \catcode`\}=12
-  \catcode`\@=12
-  \catcode`\^^M=12
-  \usembodybackslash}
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
 
 \def\macroargctxt{%
-  \catcode`\~=12
-  \catcode`\^=12
-  \catcode`\_=12
-  \catcode`\|=12
-  \catcode`\<=12
-  \catcode`\>=12
-  \catcode`\+=12
-  \catcode`\@=12
-  \catcode`\\=12}
+  \scanctxt
+  \catcode`\\=\other
+}
 
 % \mbodybackslash is the definition of \ in @macro bodies.
 % It maps \foo\ => \csname macarg.foo\endcsname => #N
@@ -5294,42 +5785,39 @@
      \else \errmessage{Macro name \the\macname\space already defined}\fi
      \global\cslet{macsave.\the\macname}{\the\macname}%
      \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
-     % Add the macroname to \macrolist
-     \toks0 = \expandafter{\macrolist\do}%
-     \xdef\macrolist{\the\toks0
-       \expandafter\noexpand\csname\the\macname\endcsname}%
+     \addtomacrolist{\the\macname}%
   \fi
   \begingroup \macrobodyctxt
   \ifrecursive \expandafter\parsermacbody
   \else \expandafter\parsemacbody
   \fi}
 
-\def\unmacro{\parsearg\unmacroxxx}
-\def\unmacroxxx#1{%
+\parseargdef\unmacro{%
   \if1\csname ismacro.#1\endcsname
     \global\cslet{#1}{macsave.#1}%
     \global\expandafter\let \csname ismacro.#1\endcsname=0%
-    % Remove the macro name from \macrolist
+    % Remove the macro name from \macrolist:
     \begingroup
-      \edef\tempa{\expandafter\noexpand\csname#1\endcsname}%
-      \def\do##1{%
-        \def\tempb{##1}%
-        \ifx\tempa\tempb
-          % remove this
-        \else
-          \toks0 = \expandafter{\newmacrolist\do}%
-          \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}%
-        \fi}%
-      \def\newmacrolist{}%
-      % Execute macro list to define \newmacrolist
-      \macrolist
-      \global\let\macrolist\newmacrolist
+      \expandafter\let\csname#1\endcsname \relax
+      \let\definedummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
     \endgroup
   \else
     \errmessage{Macro #1 not defined}%
   \fi
 }
 
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\definedummyword \noexpand#1%
+  \fi
+}
+
 % This makes use of the obscure feature that if the last token of a
 % <parameter list> is #, then the preceding argument is delimited by
 % an opening brace, and that opening brace is not consumed.
@@ -5439,31 +5927,29 @@
 % {.  If so it reads up to the closing }, if not, it reads the whole
 % line.  Whatever was read is then fed to the next control sequence
 % as an argument (by \parsebrace or \parsearg)
-\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
 \def\braceorlinexxx{%
   \ifx\nchar\bgroup\else
     \expandafter\parsearg
-  \fi \next}
-
-% We mant to disable all macros during \shipout so that they are not
-% expanded by \write.
-\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
-  \edef\next{\macrolist}\expandafter\endgroup\next}
+  \fi \macnamexxx}
 
 
 % @alias.
 % We need some trickery to remove the optional spaces around the equal
 % sign.  Just make them active and then expand them all to nothing.
-\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
 \def\aliasxxx #1{\aliasyyy#1\relax}
-\def\aliasyyy #1=#2\relax{\ignoreactivespaces
-\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
-           \expandafter\noexpand\csname#2\endcsname}%
-\expandafter\endgroup\next}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
 
 
 \message{cross references,}
-% @xref etc.
 
 \newwrite\auxfile
 
@@ -5475,56 +5961,68 @@
 \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
   node \samp{\ignorespaces#1{}}}
 
-% @node's job is to define \lastnode.
-\def\node{\ENVcheck\parsearg\nodezzz}
-\def\nodezzz#1{\nodexxx [#1,]}
-\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
 \let\nwnode=\node
-\let\lastnode=\relax
-
-% The sectioning commands (@chapter, etc.) call these.
-\def\donoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}%
-      {Ysectionnumberandtype}%
-    \global\let\lastnode=\relax
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
   \fi
 }
-\def\unnumbnoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
-    \global\let\lastnode=\relax
-  \fi
-}
-\def\appendixnoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}%
-      {Yappendixletterandtype}%
-    \global\let\lastnode=\relax
-  \fi
-}
-
 
 % @anchor{NAME} -- define xref target at arbitrary point.
 %
 \newcount\savesfregister
-\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
-\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
-\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
-
-% \setref{NAME}{SNT} defines a cross-reference point NAME, namely
-% NAME-title, NAME-pg, and NAME-SNT.  Called from \foonoderef.  We have
-% to set \indexdummies so commands such as @code in a section title
-% aren't expanded.  It would be nicer not to expand the titles in the
-% first place, but there's so many layers that that is hard to do.
-%
-\def\setref#1#2{{%
-  \indexdummies
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
   \pdfmkdest{#1}%
-  \dosetq{#1-title}{Ytitle}%
-  \dosetq{#1-pg}{Ypagenumber}%
-  \dosetq{#1-snt}{#2}%
-}}
+  \iflinks
+    {%
+      \atdummies  % preserve commands, but don't expand them
+      \edef\writexrdef##1##2{%
+	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+	  ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\thissection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \writexrdef{pg}{\folio}% will be written later, during \shipout
+    }%
+  \fi
+}
 
 % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
 % the node name, #2 the name of the Info cross-reference, #3 the printed
@@ -5537,137 +6035,159 @@
 \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
   \unsepspaces
   \def\printedmanual{\ignorespaces #5}%
-  \def\printednodename{\ignorespaces #3}%
-  \setbox1=\hbox{\printedmanual}%
-  \setbox0=\hbox{\printednodename}%
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual\unskip}%
+  \setbox0=\hbox{\printedrefname\unskip}%
   \ifdim \wd0 = 0pt
     % No printed node name was explicitly given.
     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
       % Use the node name inside the square brackets.
-      \def\printednodename{\ignorespaces #1}%
+      \def\printedrefname{\ignorespaces #1}%
     \else
       % Use the actual chapter/section title appear inside
       % the square brackets.  Use the real section title if we have it.
       \ifdim \wd1 > 0pt
         % It is in another manual, so we don't have it.
-        \def\printednodename{\ignorespaces #1}%
+        \def\printedrefname{\ignorespaces #1}%
       \else
         \ifhavexrefs
           % We know the real title if we have the xref values.
-          \def\printednodename{\refx{#1-title}{}}%
+          \def\printedrefname{\refx{#1-title}{}}%
         \else
           % Otherwise just copy the Info node name.
-          \def\printednodename{\ignorespaces #1}%
+          \def\printedrefname{\ignorespaces #1}%
         \fi%
       \fi
     \fi
   \fi
   %
-  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
-  % insert empty discretionaries after hyphens, which means that it will
-  % not find a line break at a hyphen in a node names.  Since some manuals
-  % are best written with fairly long node names, containing hyphens, this
-  % is a loss.  Therefore, we give the text of the node name again, so it
-  % is as if TeX is seeing it for the first time.
+  % Make link in pdf output.
   \ifpdf
     \leavevmode
     \getfilename{#4}%
-    {\normalturnoffactive
+    {\turnoffactive
+     % See comments at \activebackslashdouble.
+     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+      \backslashparens\pdfxrefdest}%
+     %
      \ifnum\filenamelength>0
        \startlink attr{/Border [0 0 0]}%
-         goto file{\the\filename.pdf} name{#1}%
+         goto file{\the\filename.pdf} name{\pdfxrefdest}%
      \else
        \startlink attr{/Border [0 0 0]}%
-         goto name{#1}%
+         goto name{\pdfmkpgn{\pdfxrefdest}}%
      \fi
     }%
     \linkcolor
   \fi
   %
-  \ifdim \wd1 > 0pt
-    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  We distinguish them by the
+  % LABEL-title being set to a magic string.
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd0 = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % if the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd1 > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
   \else
-    % _ (for example) has to be the character _ for the purposes of the
-    % control sequence corresponding to the node, but it has to expand
-    % into the usual \leavevmode...\vrule stuff for purposes of
-    % printing. So we \turnoffactive for the \refx-snt, back on for the
-    % printing, back off for the \refx-pg.
-    {\normalturnoffactive
-     % Only output a following space if the -snt ref is nonempty; for
-     % @unnumbered and @anchor, it won't be.
-     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
-     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
-    }%
-    % [mynode],
-    [\printednodename],\space
-    % page 3
-    \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    % node/anchor (non-float) references.
+    %
+    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+    % insert empty discretionaries after hyphens, which means that it will
+    % not find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens, this
+    % is a loss.  Therefore, we give the text of the node name again, so it
+    % is as if TeX is seeing it for the first time.
+    \ifdim \wd1 > 0pt
+      \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+    \else
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via a macro so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    \fi
   \fi
   \endlink
 \endgroup}
 
-% \dosetq is the interface for calls from other macros
-
-% Use \normalturnoffactive so that punctuation chars such as underscore
-% and backslash work in node names.  (\turnoffactive doesn't do \.)
-\def\dosetq#1#2{%
-  {\let\folio=0%
-   \normalturnoffactive
-   \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
-   \iflinks
-     \next
-   \fi
-  }%
-}
-
-% \internalsetq {foo}{page} expands into
-% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
-% When the aux file is read, ' is the escape character
-
-\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
-
-% Things to be expanded by \internalsetq
-
-\def\Ypagenumber{\folio}
-
-\def\Ytitle{\thissection}
-
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
 \def\Ynothing{}
-
-\def\Ysectionnumberandtype{%
-\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
-\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\def\Yappendixletterandtype{%
-\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
-\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\gdef\xreftie{'tie}
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
-  \let\linenumber = \empty % Non-3.0.
-\else
-  \def\linenumber{\the\inputlineno:\space}
-\fi
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
 
 % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
 % If its value is nonempty, SUFFIX is output afterward.
-
+%
 \def\refx#1#2{%
-  \expandafter\ifx\csname X#1\endcsname\relax
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
     % If not defined, say something at least.
     \angleleft un\-de\-fined\angleright
     \iflinks
@@ -5682,22 +6202,50 @@
     \fi
   \else
     % It's defined, so just use it.
-    \csname X#1\endcsname
+    \thisrefX
   \fi
   #2% Output the suffix in any case.
 }
 
-% This is the macro invoked by entries in the aux file.
-%
-\def\xrdef#1{\begingroup
-  % Reenable \ as an escape while reading the second argument.
-  \catcode`\\ = 0
-  \afterassignment\endgroup
-  \expandafter\gdef\csname X#1\endcsname
+% This is the macro invoked by entries in the aux file.  Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions).  But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR#1\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
+  \fi
 }
 
 % Read the last existing aux file, if any.  No error if none exists.
-\def\readauxfile{\begingroup
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
   \catcode`\^^@=\other
   \catcode`\^^A=\other
   \catcode`\^^B=\other
@@ -5725,9 +6273,7 @@
   \catcode`\^^]=\other
   \catcode`\^^^=\other
   \catcode`\^^_=\other
-  \catcode`\@=\other
-  \catcode`\^=\other
-  % It was suggested to define this as 7, which would allow ^^e4 etc.
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
   % in xref tags, i.e., node names.  But since ^^e4 notation isn't
   % supported in the main text, it doesn't seem desirable.  Furthermore,
   % that is not enough: for node names that actually contain a ^
@@ -5740,6 +6286,9 @@
   % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
   % and then to call \auxhat in \setq.
   %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
   \catcode`\~=\other
   \catcode`\[=\other
   \catcode`\]=\other
@@ -5751,41 +6300,42 @@
   \catcode`\$=\other
   \catcode`\#=\other
   \catcode`\&=\other
+  \catcode`\%=\other
   \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
-  % Make the characters 128-255 be printing characters
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % Make the characters 128-255 be printing characters.
   {%
-    \count 1=128
+    \count1=128
     \def\loop{%
-      \catcode\count 1=\other
-      \advance\count 1 by 1
-      \ifnum \count 1<256 \loop \fi
+      \catcode\count1=\other
+      \advance\count1 by 1
+      \ifnum \count1<256 \loop \fi
     }%
   }%
-  % The aux file uses ' as the escape (for now).
-  % Turn off \ as an escape so we do not lose on
-  % entries which were dumped with control sequences in their names.
-  % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
-  % Reference to such entries still does not work the way one would wish,
-  % but at least they do not bomb out when the aux file is read in.
+  %
+  % @ is our escape character in .aux files, and we need braces.
   \catcode`\{=1
   \catcode`\}=2
-  \catcode`\%=\other
-  \catcode`\'=0
-  \catcode`\\=\other
-  %
-  \openin 1 \jobname.aux
-  \ifeof 1 \else
-    \closein 1
-    \input \jobname.aux
-    \global\havexrefstrue
-    \global\warnedobstrue
-  \fi
-  % Open the new aux file.  TeX will close it automatically at exit.
-  \openout\auxfile=\jobname.aux
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
 \endgroup}
 
-
-% Footnotes.
+\message{insertions,}
+% including footnotes.
 
 \newcount \footnoteno
 
@@ -5799,37 +6349,39 @@
 % @footnotestyle is meaningful for info output only.
 \let\footnotestyle=\comment
 
-\let\ptexfootnote=\footnote
-
 {\catcode `\@=11
 %
 % Auto-number footnotes.  Otherwise like plain.
 \gdef\footnote{%
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
   \global\advance\footnoteno by \@ne
   \edef\thisfootno{$^{\the\footnoteno}$}%
   %
   % In case the footnote comes at the end of a sentence, preserve the
   % extra spacing after we do the footnote number.
   \let\@sf\empty
-  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
   %
   % Remove inadvertent blank space before typesetting the footnote number.
   \unskip
   \thisfootno\@sf
-  \footnotezzz
+  \dofootnote
 }%
 
 % Don't bother with the trickery in plain.tex to not require the
 % footnote text as a parameter.  Our footnotes don't need to be so general.
 %
-% Oh yes, they do; otherwise, @ifset and anything else that uses
-% \parseargline fail inside footnotes because the tokens are fixed when
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
 % the footnote is read.  --karl, 16nov96.
 %
-\long\gdef\footnotezzz{\insert\footins\bgroup
+\gdef\dofootnote{%
+  \insert\footins\bgroup
   % We want to typeset this text as a normal paragraph, even if the
   % footnote reference occurs in (for example) a display environment.
   % So reset some parameters.
+  \hsize=\pagewidth
   \interlinepenalty\interfootnotelinepenalty
   \splittopskip\ht\strutbox % top baseline for broken footnotes
   \splitmaxdepth\dp\strutbox
@@ -5859,48 +6411,68 @@
   \footstrut
   \futurelet\next\fo@t
 }
-\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
-  \else\let\next\f@t\fi \next}
-\def\f@@t{\bgroup\aftergroup\@foot\let\next}
-\def\f@t#1{#1\@foot}
-\def\@foot{\strut\par\egroup}
-
 }%end \catcode `\@=11
 
-% @| inserts a changebar to the left of the current line.  It should
-% surround any changed text.  This approach does *not* work if the
-% change spans more than two lines of output.  To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
-  % \vadjust can only be used in horizontal mode.
-  \leavevmode
-  %
-  % Append this vertical mode material after the current line in the output.
-  \vadjust{%
-    % We want to insert a rule with the height and depth of the current
-    % leading; that is exactly what \strutbox is supposed to record.
-    \vskip-\baselineskip
-    %
-    % \vadjust-items are inserted at the left edge of the type.  So
-    % the \llap here moves out into the left-hand margin.
-    \llap{%
-      %
-      % For a thicker or thinner bar, change the `1pt'.
-      \vrule height\baselineskip width1pt
-      %
-      % This is the space between the bar and the text.
-      \hskip 12pt
-    }%
-  }%
-}
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
 
 % @image.  We use the macros from epsf.tex to support this.
 % If epsf.tex is not installed and @image is used, we complain.
@@ -5910,12 +6482,12 @@
 % undone and the next image would fail.
 \openin 1 = epsf.tex
 \ifeof 1 \else
-  \closein 1
-  % Do not bother showing banner with post-v2.7 epsf.tex (available in
-  % doc/epsf.tex until it shows up on ctan).
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
   \def\epsfannounce{\toks0 = }%
   \input epsf.tex
 \fi
+\closein 1
 %
 % We will only complain once about lack of epsf.tex.
 \newif\ifwarnednoepsf
@@ -5954,7 +6526,7 @@
     % above and below.
     \nobreak\vskip\parskip
     \nobreak
-    \line\bgroup\hss
+    \line\bgroup
   \fi
   %
   % Output the image.
@@ -5967,10 +6539,275 @@
     \epsfbox{#1.eps}%
   \fi
   %
-  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
+  \ifimagevmode \egroup \bigbreak \fi  % space after the image
 \endgroup}
 
 
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \thissection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\thissection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+	\appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \atdummies
+        %
+        % since we read the caption text in the macro world, where ^^M
+        % is turned into a normal character, we have to scan it back, so
+        % we don't write the literal three characters "^^M" into the aux file.
+	\scanexp{%
+	  \xdef\noexpand\gtemp{%
+	    \ifx\thisshortcaption\empty
+	      \thiscaption
+	    \else
+	      \thisshortcaption
+	    \fi
+	  }%
+	}%
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+	  \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  % place the captured inserts
+  %
+  % BEWARE: when the floats start floating, we have to issue warning
+  % whenever an insert appears inside a float which could possibly
+  % float. --kasal, 26may04
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
 \message{localization,}
 % and i18n.
 
@@ -5979,19 +6816,17 @@
 % properly.  Single argument is the language abbreviation.
 % It would be nice if we could set up a hyphenation file here.
 %
-\def\documentlanguage{\parsearg\dodocumentlanguage}
-\def\dodocumentlanguage#1{%
+\parseargdef\documentlanguage{%
   \tex % read txi-??.tex file in plain TeX.
-  % Read the file if it exists.
-  \openin 1 txi-#1.tex
-  \ifeof1
-    \errhelp = \nolanghelp
-    \errmessage{Cannot read language file txi-#1.tex}%
-    \let\temp = \relax
-  \else
-    \def\temp{\input txi-#1.tex }%
-  \fi
-  \temp
+    % Read the file if it exists.
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \errhelp = \nolanghelp
+      \errmessage{Cannot read language file txi-#1.tex}%
+    \else
+      \input txi-#1.tex
+    \fi
+    \closein 1
   \endgroup
 }
 \newhelp\nolanghelp{The given language definition file cannot be found or
@@ -6036,12 +6871,14 @@
   \fi
 }
 
-% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
-% 4) hoffset; 5) binding offset; 6) topskip.  We also call
-% \setleading{\textleading}, so the caller should define \textleading.
-% The caller should also set \parskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6{%
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
   \voffset = #3\relax
   \topskip = #6\relax
   \splittopskip = \topskip
@@ -6060,55 +6897,88 @@
   \normaloffset = #4\relax
   \bindingoffset = #5\relax
   %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+  \fi
+  %
   \setleading{\textleading}
   %
   \parindent = \defaultparindent
   \setemergencystretch
 }
 
-% Use `small' versions.
-%
-\def\smallenvironments{%
-  \let\smalldisplay = \smalldisplayx
-  \let\smallexample = \smalllispx
-  \let\smallformat = \smallformatx
-  \let\smalllisp = \smalllispx
-}
-
 % @letterpaper (the default).
 \def\letterpaper{{\globaldefs = 1
   \parskip = 3pt plus 2pt minus 1pt
   \textleading = 13.2pt
   %
   % If page is nothing but text, make it come out even.
-  \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
 }}
 
-% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+% Use @smallbook to reset parameters for 7x9.25 trim size.
 \def\smallbook{{\globaldefs = 1
   \parskip = 2pt plus 1pt
   \textleading = 12pt
   %
-  \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
+  \internalpagesizes{7.5in}{5in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
   %
   \lispnarrowing = 0.3in
   \tolerance = 700
   \hfuzz = 1pt
   \contentsrightmargin = 0pt
-  \deftypemargin = 0pt
   \defbodyindent = .5cm
-  \smallenvironments
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
 }}
 
 % Use @afourpaper to print on European A4 paper.
 \def\afourpaper{{\globaldefs = 1
   \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 12pt
-  %
-  \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}%
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
   %
   \tolerance = 700
   \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
 }}
 
 % Use @afivepaper to print on European A5 paper.
@@ -6118,44 +6988,46 @@
   \parskip = 2pt plus 1pt minus 0.1pt
   \textleading = 12.5pt
   %
-  \internalpagesizes{166mm}{120mm}{\voffset}{-8mm}{\bindingoffset}{8pt}%
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
   %
   \lispnarrowing = 0.2in
   \tolerance = 800
   \hfuzz = 1.2pt
-  \contentsrightmargin = 0mm
-  \deftypemargin = 0pt
+  \contentsrightmargin = 0pt
   \defbodyindent = 2mm
   \tableindent = 12mm
-  %
-  \smallenvironments
 }}
 
-% A specific text layout, 24x15cm overall, intended for A4 paper.  Top margin
-% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
+% A specific text layout, 24x15cm overall, intended for A4 paper.
 \def\afourlatex{{\globaldefs = 1
-  \textleading = 13.6pt
-  %
   \afourpaper
-  \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
-  %
-  % Must explicitly reset to 0 because we call \afourpaper, apparently,
-  % although this does not entirely make sense.
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
   \globaldefs = 0
 }}
 
-% Use @afourwide to print on European A4 paper in wide format.
-\def\afourwide{%
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
   \afourpaper
-  \internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
-}
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
 
 % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
 % Perhaps we should allow setting the margins, \topskip, \parskip,
 % and/or leading, also. Or perhaps we should compute them somehow.
 %
-\def\pagesizes{\parsearg\pagesizesxxx}
-\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
 \def\pagesizesyyy#1,#2,#3\finish{{%
   \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
   \globaldefs = 1
@@ -6163,7 +7035,16 @@
   \parskip = 3pt plus 2pt minus 1pt
   \setleading{\textleading}%
   %
-  \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
 }}
 
 % Set default to letter.
@@ -6193,8 +7074,8 @@
 \def\normalplus{+}
 \def\normaldollar{$}%$ font-lock fix
 
-% This macro is used to make a character print one way in ttfont
-% where it can probably just be output, and another way in other fonts,
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
 % where something hairier probably needs to be done.
 %
 % #1 is what to print if we are indeed using \tt; #2 is what to print
@@ -6226,8 +7107,9 @@
 
 \catcode`\_=\active
 \def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
 % Subroutine for the previous macro.
-\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
 
 \catcode`\|=\active
 \def|{{\tt\char124}}
@@ -6241,15 +7123,6 @@
 \def+{{\tt \char 43}}
 \catcode`\$=\active
 \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
-%\catcode 27=\active
-%\def^^[{$\diamondsuit$}
-
-% Set up an active definition for =, but don't enable it most of the time.
-{\catcode`\==\active
-\global\def={{\tt \char 61}}}
-
-\catcode`+=\active
-\catcode`\_=\active
 
 % If a .fmt file is being used, characters that might appear in a file
 % name cannot be active until we have parsed the command line.
@@ -6257,46 +7130,53 @@
 % \otherifyactive is called near the end of this file.
 \def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
 
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
 \catcode`\@=0
 
-% \rawbackslashxx output one backslash character in current font
-\global\chardef\rawbackslashxx=`\\
-%{\catcode`\\=\other
-%@gdef@rawbackslashxx{\}}
-
-% \rawbackslash redefines \ as input to do \rawbackslashxx.
-{\catcode`\\=\active
-@gdef@rawbackslash{@let\=@rawbackslashxx }}
-
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\rawbackslashxx}}
-
-% \catcode 17=0   % Define control-q
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
 \catcode`\\=\active
-
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-@def@turnoffactive{@let"=@normaldoublequote
-@let\=@realbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus
-@let$=@normaldollar}%$ font-lock fix
-
-@def@normalturnoffactive{@let"=@normaldoublequote
-@let\=@normalbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus
-@let$=@normaldollar}%$ font-lock fix
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+%  @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+% 
+@def@normalturnoffactive{%
+  @let\=@normalbackslash
+  @let"=@normaldoublequote
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+  @unsepspaces
+}
 
 % Make _ and + \other characters, temporarily.
 % This is canceled by @fixbackslash.
@@ -6310,9 +7190,9 @@
 @global@let\ = @eatinput
 
 % On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\{ in the file would cause an error. This macro tries to fix
+% the first `\' in the file would cause an error. This macro tries to fix
 % that, assuming it is called before the first `\' could plausibly occur.
-% Also back turn on active characters that might appear in the input
+% Also turn back on active characters that might appear in the input
 % file name, in case not using a pre-dumped format.
 %
 @gdef@fixbackslash{%
@@ -6329,10 +7209,6 @@
 @catcode`@# = @other
 @catcode`@% = @other
 
-@c Set initial fonts.
-@textfonts
-@rm
-
 
 @c Local variables:
 @c eval: (add-hook 'write-file-hooks 'time-stamp)
@@ -6342,6 +7218,8 @@
 @c time-stamp-end: "}"
 @c End:
 
+@c vim:sw=2:
+
 @ignore
    arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
 @end ignore
--- a/man/text.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/text.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -557,11 +557,11 @@
 fill commands put two spaces after a colon.
 
 @vindex fill-nobreak-predicate
-  The variable @code{fill-nobreak-predicate} specifies additional
-conditions for where line-breaking is allowed.  Its value is either
-@code{nil} or a Lisp function; the function is called with no
+  The variable @code{fill-nobreak-predicate} is a hook (an abnormal
+hook, @pxref{Hooks}) specifying additional conditions where
+line-breaking is not allowed.  Each function is called with no
 arguments, with point at a place where Emacs is considering breaking
-the line.  If the function returns a non-@code{nil} value, then that's
+the line.  If a function returns a non-@code{nil} value, then that's
 a bad place to break the line.  Two standard functions you can use are
 @code{fill-single-word-nobreak-p} (don't break after the first word of
 a sentence or before the last) and @code{fill-french-nobreak-p} (don't
--- a/man/trouble.texi	Sat Apr 01 17:16:18 2006 +0000
+++ b/man/trouble.texi	Mon Apr 10 14:52:24 2006 +0000
@@ -34,36 +34,37 @@
 Cancel a previously made change in the buffer contents (@code{undo}).
 @end table
 
-  There are two ways of canceling commands which are not finished
-executing: @dfn{quitting} with @kbd{C-g}, and @dfn{aborting} with
-@kbd{C-]} or @kbd{M-x top-level}.  Quitting cancels a partially typed
-command or one which is already running.  Aborting exits a recursive
-editing level and cancels the command that invoked the recursive edit.
+  There are two ways of canceling a command before it has finished:
+@dfn{quitting} with @kbd{C-g}, and @dfn{aborting} with @kbd{C-]} or
+@kbd{M-x top-level}.  Quitting cancels a partially typed command, or
+one which is still running.  Aborting exits a recursive editing level
+and cancels the command that invoked the recursive edit.
 (@xref{Recursive Edit}.)
 
 @cindex quitting
 @kindex C-g
-  Quitting with @kbd{C-g} is used for getting rid of a partially typed
+  Quitting with @kbd{C-g} is the way to get rid of a partially typed
 command, or a numeric argument that you don't want.  It also stops a
 running command in the middle in a relatively safe way, so you can use
 it if you accidentally give a command which takes a long time.  In
-particular, it is safe to quit out of killing; either your text will
-@emph{all} still be in the buffer, or it will @emph{all} be in the kill
-ring (or maybe both).  Quitting an incremental search does special
-things documented under searching; in general, it may take two
-successive @kbd{C-g} characters to get out of a search
-(@pxref{Incremental Search}).
+particular, it is safe to quit out of a kill command; either your text
+will @emph{all} still be in the buffer, or it will @emph{all} be in
+the kill ring, or maybe both.  Quitting an incremental search does
+special things, documented under searching; it may take two successive
+@kbd{C-g} characters to get out of a search (@pxref{Incremental
+Search}).
 
   On MS-DOS, the character @kbd{C-@key{BREAK}} serves as a quit character
 like @kbd{C-g}.  The reason is that it is not feasible, on MS-DOS, to
 recognize @kbd{C-g} while a command is running, between interactions
 with the user.  By contrast, it @emph{is} feasible to recognize
-@kbd{C-@key{BREAK}} at all times.  @xref{MS-DOS Keyboard}.
+@kbd{C-@key{BREAK}} at all times.  @xref{MS-DOS Keyboard,,,emacs-xtra,
+Specialized Emacs Features}.
 
 @findex keyboard-quit
   @kbd{C-g} works by setting the variable @code{quit-flag} to @code{t}
 the instant @kbd{C-g} is typed; Emacs Lisp checks this variable
-frequently and quits if it is non-@code{nil}.  @kbd{C-g} is only
+frequently, and quits if it is non-@code{nil}.  @kbd{C-g} is only
 actually executed as a command if you type it while Emacs is waiting for
 input.  In that case, the command it runs is @code{keyboard-quit}.
 
@@ -72,15 +73,15 @@
 escape'' feature and return to the shell.  @xref{Emergency Escape}.
 
 @cindex NFS and quitting
-  There may be times when you cannot quit.  When Emacs is waiting for
-the operating system to do something, quitting is impossible unless
-special pains are taken for the particular system call within Emacs
-where the waiting occurs.  We have done this for the system calls that
-users are likely to want to quit from, but it's possible you will find
-another.  In one very common case---waiting for file input or output
-using NFS---Emacs itself knows how to quit, but many NFS implementations
-simply do not allow user programs to stop waiting for NFS when the NFS
-server is hung.
+  There are some situations where you cannot quit.  When Emacs is
+waiting for the operating system to do something, quitting is
+impossible unless special pains are taken for the particular system
+call within Emacs where the waiting occurs.  We have done this for the
+system calls that users are likely to want to quit from, but it's
+possible you will a case not handled.  In one very common
+case---waiting for file input or output using NFS---Emacs itself knows
+how to quit, but many NFS implementations simply do not allow user
+programs to stop waiting for NFS when the NFS server is hung.
 
 @cindex aborting recursive edit
 @findex abort-recursive-edit
@@ -96,16 +97,16 @@
 
 @findex keyboard-escape-quit
 @kindex ESC ESC ESC
-  The command @kbd{@key{ESC} @key{ESC} @key{ESC}}
-(@code{keyboard-escape-quit}) can either quit or abort.  This key was
-defined because @key{ESC} is used to ``get out'' in many PC programs.
-It can cancel a prefix argument, clear a selected region, or get out of
-a Query Replace, like @kbd{C-g}.  It can get out of the minibuffer or a
-recursive edit, like @kbd{C-]}.  It can also get out of splitting the
-frame into multiple windows, like @kbd{C-x 1}.  One thing it cannot do,
-however, is stop a command that is running.  That's because it executes
-as an ordinary command, and Emacs doesn't notice it until it is ready
-for a command.
+  The sequence @kbd{@key{ESC} @key{ESC} @key{ESC}}
+(@code{keyboard-escape-quit}) can either quit or abort.  (We defined
+it this way because @key{ESC} means ``get out'' in many PC programs.)
+It can cancel a prefix argument, clear a selected region, or get out
+of a Query Replace, like @kbd{C-g}.  It can get out of the minibuffer
+or a recursive edit, like @kbd{C-]}.  It can also get out of splitting
+the frame into multiple windows, as with @kbd{C-x 1}.  One thing it
+cannot do, however, is stop a command that is running.  That's because
+it executes as an ordinary command, and Emacs doesn't notice it until
+it is ready for the next command.
 
 @findex top-level
   The command @kbd{M-x top-level} is equivalent to ``enough'' @kbd{C-]}
@@ -137,7 +138,6 @@
 * Stuck Recursive::       `[...]' in mode line around the parentheses.
 * Screen Garbled::        Garbage on the screen.
 * Text Garbled::          Garbage in the text.
-* Unasked-for Search::    Spontaneous entry to incremental search.
 * Memory Full::           How to cope when you run out of memory.
 * After a Crash::         Recovering editing in an Emacs session that crashed.
 * Emergency Escape::      Emergency escape---
@@ -181,10 +181,10 @@
   In all of those cases, the immediate remedy is the same: use the
 command @kbd{M-x normal-erase-is-backspace-mode}.  This toggles
 between the two modes that Emacs supports for handling @key{DEL}, so
-if Emacs starts in the wrong mode, it should switch to the right mode.
-On a text-only terminal, if you want to ask for help when @key{BS} is
-treated as @key{DEL}, use @key{F1}; @kbd{C-?} may also work, if it
-sends character code 127.
+if Emacs starts in the wrong mode, this should switch to the right
+mode.  On a text-only terminal, if you want to ask for help when
+@key{BS} is treated as @key{DEL}, use @key{F1}; @kbd{C-?} may also
+work, if it sends character code 127.
 
 @findex normal-erase-is-backspace-mode
   To fix the problem automatically for every Emacs session, you can
@@ -244,25 +244,24 @@
 problem was entirely in the previous screen update.  (Otherwise, see
 the following section.)
 
-  Display updating problems often result from an incorrect termcap entry
-for the terminal you are using.  The file @file{etc/TERMS} in the Emacs
-distribution gives the fixes for known problems of this sort.
-@file{INSTALL} contains general advice for these problems in one of its
-sections.  Very likely there is simply insufficient padding for certain
-display operations.  To investigate the possibility that you have this sort
-of problem, try Emacs on another terminal made by a different manufacturer.
-If problems happen frequently on one kind of terminal but not another kind,
-it is likely to be a bad termcap entry, though it could also be due to a
-bug in Emacs that appears for terminals that have or that lack specific
-features.
+  Display updating problems often result from an incorrect terminfo
+entry for the terminal you are using.  The file @file{etc/TERMS} in
+the Emacs distribution gives the fixes for known problems of this
+sort.  @file{INSTALL} contains general advice for these problems in
+one of its sections.  To investigate the possibility that you have
+this sort of problem, try Emacs on another terminal made by a
+different manufacturer.  If problems happen frequently on one kind of
+terminal but not another kind, it is likely to be a bad terminfo entry,
+though it could also be due to a bug in Emacs that appears for
+terminals that have or that lack specific features.
 
 @node Text Garbled
 @subsection Garbage in the Text
 
-  If @kbd{C-l} shows that the text is wrong, try undoing the changes to it
-using @kbd{C-x u} until it gets back to a state you consider correct.  Also
-try @kbd{C-h l} to find out what command you typed to produce the observed
-results.
+  If @kbd{C-l} shows that the text is wrong, first type @kbd{C-h l} to
+see what commands you typed to produce the observed results.  Then try
+undoing the changes step by step using @kbd{C-x u}, until it gets back
+to a state you consider correct.
 
   If a large portion of text appears to be missing at the beginning or
 end of the buffer, check for the word @samp{Narrow} in the mode line.
@@ -270,42 +269,6 @@
 temporarily off-limits.  To make it accessible again, type @kbd{C-x n
 w}.  @xref{Narrowing}.
 
-@node Unasked-for Search
-@subsection Spontaneous Entry to Incremental Search
-
-  If Emacs spontaneously displays @samp{I-search:} at the bottom of the
-screen, it means that the terminal is sending @kbd{C-s} and @kbd{C-q}
-according to the poorly designed xon/xoff ``flow control'' protocol.
-
-  If this happens to you, your best recourse is to put the terminal in a
-mode where it will not use flow control, or give it so much padding that
-it will never send a @kbd{C-s}.  (One way to increase the amount of
-padding is to set the variable @code{baud-rate} to a larger value.  Its
-value is the terminal output speed, measured in the conventional units
-of baud.)
-
-@cindex flow control
-@cindex xon-xoff
-@findex enable-flow-control
-  If you don't succeed in turning off flow control, the next best thing
-is to tell Emacs to cope with it.  To do this, call the function
-@code{enable-flow-control}.
-
-@findex enable-flow-control-on
-  Typically there are particular terminal types with which you must use
-flow control.  You can conveniently ask for flow control on those
-terminal types only, using @code{enable-flow-control-on}.  For example,
-if you find you must use flow control on VT-100 and H19 terminals, put
-the following in your @file{.emacs} file:
-
-@example
-(enable-flow-control-on "vt100" "h19")
-@end example
-
-  When flow control is enabled, you must type @kbd{C-\} to get the
-effect of a @kbd{C-s}, and type @kbd{C-^} to get the effect of a
-@kbd{C-q}.
-
 @node Memory Full
 @subsection Running out of Memory
 @cindex memory full
@@ -342,12 +305,13 @@
 recover from.  Typically the one you want is the most recent one.  Move
 point to the one you choose, and type @kbd{C-c C-c}.
 
-  Then @code{recover-session} asks about each of the files that you were
-editing during that session; it asks whether to recover that file.  If
-you answer @kbd{y} for a file, it shows the dates of that file and its
-auto-save file, then asks once again whether to recover that file.  For
-the second question, you must confirm with @kbd{yes}.  If you do, Emacs
-visits the file but gets the text from the auto-save file.
+  Then @code{recover-session} considers each of the files that you
+were editing during that session; for each such file, it asks whether
+to recover that file.  If you answer @kbd{y} for a file, it shows the
+dates of that file and its auto-save file, then asks once again
+whether to recover that file.  For the second question, you must
+confirm with @kbd{yes}.  If you do, Emacs visits the file but gets the
+text from the auto-save file.
 
   When @code{recover-session} is done, the files you've chosen to
 recover are present in Emacs buffers.  You should then save them.  Only
@@ -361,6 +325,9 @@
 and that the Emacs executable was not stripped of its debugging
 symbols.
 
+  As soon as you get the core dump, rename it to another name such as
+@file{core.emacs}, so that another crash won't overwrite it.
+
   To use this script, run @code{gdb} with the file name of your Emacs
 executable and the file name of the core dump, e.g. @samp{gdb
 /usr/bin/emacs core.emacs}.  At the @code{(gdb)} prompt, load the
@@ -375,16 +342,18 @@
 @node Emergency Escape
 @subsection Emergency Escape
 
-  Because at times there have been bugs causing Emacs to loop without
-checking @code{quit-flag}, a special feature causes Emacs to be suspended
-immediately if you type a second @kbd{C-g} while the flag is already set,
-so you can always get out of GNU Emacs.  Normally Emacs recognizes and
-clears @code{quit-flag} (and quits!) quickly enough to prevent this from
-happening.  (On MS-DOS and compatible systems, type @kbd{C-@key{BREAK}}
-twice.)
+  On text-only terminals, the @dfn{emergency escape} feature suspends
+Emacs immediately if you type @kbd{C-g} a second time before Emacs can
+actually respond to the first one by quitting.  This is so you can
+always get out of GNU Emacs no matter how badly it might be hung.
+When things are working properly, Emacs recognizes and handles the
+first @kbd{C-g} so fast that the second one won't trigger emergency
+escape.  However, if some problem prevents Emacs from handling the
+first @kbd{C-g} properly, then the second one will get you back to the
+shell.
 
-  When you resume Emacs after a suspension caused by multiple @kbd{C-g}, it
-asks two questions before going back to what it had been doing:
+  When you resume Emacs after a suspension caused by emergency escape,
+it asks two questions before going back to what it had been doing:
 
 @example
 Auto-save? (y or n)
@@ -394,29 +363,31 @@
 @noindent
 Answer each one with @kbd{y} or @kbd{n} followed by @key{RET}.
 
-  Saying @kbd{y} to @samp{Auto-save?} causes immediate auto-saving of all
-modified buffers in which auto-saving is enabled.
+  Saying @kbd{y} to @samp{Auto-save?} causes immediate auto-saving of
+all modified buffers in which auto-saving is enabled.  Saying @kbd{n}
+skips this.
 
-  Saying @kbd{y} to @samp{Abort (and dump core)?} causes an illegal instruction to be
-executed, dumping core.  This is to enable a wizard to figure out why Emacs
-was failing to quit in the first place.  Execution does not continue
-after a core dump.  If you answer @kbd{n}, execution does continue.  With
-luck, GNU Emacs will ultimately check @code{quit-flag} and quit normally.
-If not, and you type another @kbd{C-g}, it is suspended again.
+  Saying @kbd{y} to @samp{Abort (and dump core)?} causes Emacs to
+crash, dumping core.  This is to enable a wizard to figure out why
+Emacs was failing to quit in the first place.  Execution does not
+continue after a core dump.
+
+  If you answer this question @kbd{n}, Emacs execution resumes.  With
+luck, Emacs will ultimately do the requested quit.  If not, each
+subsequent @kbd{C-g} invokes emergency escape again.
 
   If Emacs is not really hung, just slow, you may invoke the double
-@kbd{C-g} feature without really meaning to.  Then just resume and answer
-@kbd{n} to both questions, and you will arrive at your former state.
-Presumably the quit you requested will happen soon.
+@kbd{C-g} feature without really meaning to.  Then just resume and
+answer @kbd{n} to both questions, and you will get back to the former
+state.  The quit you requested will happen by and by.
 
-  The double @kbd{C-g} feature is turned off when Emacs is running under
-the X Window System, since you can use the window manager to kill Emacs
-or to create another window and run another program.
+  Emergency escape is active only for text terminals.  On a graphical
+display that supports multiple windows, you can use the window manager
+to kill Emacs, or to switch to some other program.
 
-  On MS-DOS and compatible systems, the emergency escape feature is
-sometimes unavailable, even if you press @kbd{C-@key{BREAK}} twice, when
-some system call (MS-DOS or BIOS) hangs, or when Emacs is stuck in a
-very tight endless loop (in C code, @strong{not} in Lisp code).
+  On MS-DOS, you must type @kbd{C-@key{BREAK}} (twice) to cause
+emergency escape---but there are cases where it won't work, when
+system call hangs or when Emacs is stuck in a tight loop in C code.
 
 @node Total Frustration
 @subsection Help for Total Frustration
@@ -433,9 +404,9 @@
 @findex doctor
   Second, type @kbd{M-x doctor @key{RET}}.
 
-  The doctor will help you feel better.  Each time you say something to
-the doctor, you must end it by typing @key{RET} @key{RET}.  This lets
-the doctor know you are finished.
+  The Emacs psychotherapist will help you feel better.  Each time you
+say something to the psychotherapist, you must end it by typing
+@key{RET} @key{RET}.  This indicates you are finished typing.
 
 @node Bugs, Contributing, Lossage, Top
 @section Reporting Bugs
@@ -467,9 +438,10 @@
 @node Bug Criteria
 @subsection When Is There a Bug
 
-  If Emacs executes an illegal instruction, or dies with an operating
-system error message that indicates a problem in the program (as opposed to
-something like ``disk full''), then it is certainly a bug.
+  If Emacs accesses an invalid memory location (``segmentation
+fault''), or exits with an operating system error message that
+indicates a problem in the program (as opposed to something like
+``disk full''), then it is certainly a bug.
 
   If Emacs updates the display in a way that does not correspond to what is
 in the buffer, then it is certainly a bug.  If a command seems to do the
@@ -502,9 +474,10 @@
 features.  It is probably best not to complain about such a problem
 until you have checked the documentation in the usual ways, feel
 confident that you understand it, and know for certain that what you
-want is not available.  If you are not sure what the command is
-supposed to do after a careful reading of the manual, check the index
-and glossary for any terms that may be unclear.
+want is not available.  Ask other Emacs users, too.  If you are not
+sure what the command is supposed to do after a careful reading of the
+manual, check the index and glossary for any terms that may be
+unclear.
 
   If after careful rereading of the manual you still do not understand
 what the command should do, that indicates a bug in the manual, which
@@ -533,10 +506,10 @@
 have no real information about the bug.
 
   For example, suppose that you type @kbd{C-x C-f /glorp/baz.ugh
-@key{RET}}, visiting a file which (you know) happens to be rather large,
-and Emacs displayed @samp{I feel pretty today}.  The best way to report
-the bug is with a sentence like the preceding one, because it gives all
-the facts.
+@key{RET}}, visiting a file which (you know) happens to be rather
+large, and Emacs displays @samp{I feel pretty today}.  The best way to
+report the bug is with a sentence like the preceding one, because it
+gives all the facts.
 
   A bad way would be to assume that the problem is due to the size of
 the file and say, ``I visited a large file, and Emacs displayed @samp{I
@@ -559,7 +532,7 @@
 you @emph{know} that it makes no difference which visiting command is used.
 Similarly, rather than saying ``if I have three characters on the line,''
 say ``after I type @kbd{@key{RET} A B C @key{RET} C-p},'' if that is
-the way you entered the text.@refill
+the way you entered the text.
 
   So please don't guess any explanations when you report a bug.  If you
 want to actually @emph{debug} the problem, and report explanations that
@@ -591,19 +564,6 @@
 instead, offer to send it on request, or make it available by ftp and
 say where.
 
-  If you can't send electronic mail, then mail the bug report on paper
-or machine-readable media to this address:
-
-@format
-GNU Emacs Bugs
-Free Software Foundation
-51 Franklin Street, Fifth Floor
-Boston, MA 02110-1301 USA
-@end format
-
-  We do not promise to fix the bug; but if the bug is serious,
-or ugly, or easy to fix, chances are we will want to.
-
 @findex report-emacs-bug
   A convenient way to send a bug report for Emacs is to use the command
 @kbd{M-x report-emacs-bug}.  This sets up a mail buffer (@pxref{Sending
@@ -658,7 +618,7 @@
   If you can tell us a way to cause the problem without visiting any files,
 please do so.  This makes it much easier to debug.  If you do need files,
 make sure you arrange for us to see their exact contents.  For example, it
-can often matter whether there are spaces at the ends of lines, or a
+can matter whether there are spaces at the ends of lines, or a
 newline after the last line in the buffer (nothing ought to care whether
 the last line is terminated, but try telling the bugs that).
 
@@ -668,7 +628,7 @@
 @findex open-dribble-file
 @cindex dribble file
 @cindex logging keystrokes
-  The easy way to record the input to Emacs precisely is to write a
+The easy way to record the input to Emacs precisely is to write a
 dribble file.  To start the file, execute the Lisp expression
 
 @example
@@ -705,7 +665,7 @@
 
 Be warned: it is often difficult, and sometimes impossible, to fix a
 terminal-dependent bug without access to a terminal of the type that
-stimulates the bug.@refill
+stimulates the bug.
 
 @item
 If non-@acronym{ASCII} text or internationalization is relevant, the locale that
@@ -765,7 +725,7 @@
 @pindex Edebug
 To make a backtrace for the error, use @kbd{M-x toggle-debug-on-error}
 before the error happens (that is to say, you must give that command
-and then make the bug happen).  This causes the error to run the Lisp
+and then make the bug happen).  This causes the error to start the Lisp
 debugger, which shows you a backtrace.  Copy the text of the
 debugger's backtrace into the bug report.  @xref{Debugger,, The Lisp
 Debugger, elisp, the Emacs Lisp Reference Manual}, for information on
@@ -1028,11 +988,9 @@
 feel that the purpose needs explaining, it probably does---but put the
 explanation in comments in the code.  It will be more useful there.
 
-Please read the @file{ChangeLog} files in the @file{src} and @file{lisp}
-directories to see what sorts of information to put in, and to learn the
-style that we use.  If you would like your name to appear in the header
-line, showing who made the change, send us the header line.
-@xref{Change Log}.
+Please read the @file{ChangeLog} files in the @file{src} and
+@file{lisp} directories to see what sorts of information to put in,
+and to learn the style that we use.  @xref{Change Log}.
 
 @item
 When you write the fix, keep in mind that we can't install a change that
@@ -1071,8 +1029,8 @@
 
 The development version of Emacs can be downloaded from the CVS
 repository where it is actively maintained by a group of developers.
-See the Emacs project page http://savannah.gnu.org/projects/emacs/ for
-details.
+See the Emacs project page
+@url{http://savannah.gnu.org/projects/emacs/} for details.
 
 @node Service, Copying, Contributing, Top
 @section How To Get Help with GNU Emacs
--- a/src/ChangeLog	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/ChangeLog	Mon Apr 10 14:52:24 2006 +0000
@@ -1,3 +1,82 @@
+2006-04-09  Richard Stallman  <rms@gnu.org>
+
+	* lisp.h (Fkill_emacs): Undo previous change.
+
+2006-04-08  Richard Stallman  <rms@gnu.org>
+
+	* search.c (boyer_moore): Test ch >= 0400, not >.
+
+2006-04-09  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* puresize.h (pure_write_error): Mark as NO_RETURN.
+
+	* lisp.h (args_out_of_range, args_out_of_range_3)
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* w32fns.c (w32_wnd_proc) <WM_MOUSEMOVE>: Ignore mouse movements
+	if a menu is active on this frame.
+
+2006-04-08  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* lisp.h (report_file_error): Mark as NO_RETURN.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* alloc.c [STDC_HEADERS]: Include stddef.h.
+
+	* lisp.h (PSEUDOVECSIZE): Fix last change.
+
+2006-04-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
+	`raw_status_high', and `raw_status_low' with plain integers, and move
+	them to the end of the structure.
+
+	* alloc.c (allocate_process): Use PSEUDOVECSIZE to initialize the
+	pseudovector's size field so only the Lisp_Object fields get GC'd.
+
+	* process.c (update_status, make_process, Fdelete_process)
+	(Fprocess_status, list_processes_1, start_process_unwind)
+	(create_process, Fmake_network_process, server_accept_connection)
+	(wait_reading_process_output, send_process, Fprocess_running_child_p)
+	(process_send_signal, proc_encode_coding_system, Fprocess_send_eof)
+	(sigchld_handler, status_notify): Adjust to new non-Lisp fields for
+	`pid' and `raw_status'.
+	(Fprocess_id, Fsignal_process): Same, and additionally use floats when
+	representing PIDs that are larger than most-positive-fixnum.
+
+	* keymap.c (describe_map): Only use XINT if we checked INTEGERP.
+
+	* lisp.h (OFFSETOF, PSEUDOVECSIZE): New macros.
+
+2006-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* w32fns.c (Fx_show_tip): Add 3 to the 5th arg of SetWindowPos.
+
+2006-04-03  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* editfns.c (TM_YEAR_IN_ASCTIME_RANGE): New macro, identical to
+	../lib-src/b2m.c and ../lib-src/editfns.c.
+	(Fcurrent_time_string): Use it.
+	Document that the year might not consume 4 columns if it's outside
+	the range 1000-9999.
+	Check for asctime failure.
+	Don't assume that the output string length is always exactly 24.
+
+2006-04-03  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+	* macterm.c (XTread_socket): Initialize variable `f' before its use.
+
+2006-04-03  Kenichi Handa  <handa@m17n.org>
+
+	* image.c: Include "charset.h" and "coding.h".
+	(x_find_image_file): Return an encoded file name.
+
+2006-04-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* configure: Regenerated.
+
 2006-03-31  Kenichi Handa  <handa@m17n.org>
 
 	* xfns.c (xg_set_icon): Delete superfluous UNGCPRO.
--- a/src/alloc.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/alloc.c	Mon Apr 10 14:52:24 2006 +0000
@@ -23,6 +23,10 @@
 #include <stdio.h>
 #include <limits.h>		/* For CHAR_BIT.  */
 
+#ifdef STDC_HEADERS
+#include <stddef.h>		/* For offsetof, used by PSEUDOVECSIZE. */
+#endif
+
 #ifdef ALLOC_DEBUG
 #undef INLINE
 #endif
@@ -3005,13 +3009,17 @@
 struct Lisp_Process *
 allocate_process ()
 {
-  EMACS_INT len = VECSIZE (struct Lisp_Process);
-  struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_PROCESS);
+  /* Memory-footprint of the object in nb of Lisp_Object fields.  */
+  EMACS_INT memlen = VECSIZE (struct Lisp_Process);
+  /* Size if we only count the actual Lisp_Object fields (which need to be
+     traced by the GC).  */
+  EMACS_INT lisplen = PSEUDOVECSIZE (struct Lisp_Process, pid);
+  struct Lisp_Vector *v = allocate_vectorlike (memlen, MEM_TYPE_PROCESS);
   EMACS_INT i;
 
-  for (i = 0; i < len; ++i)
+  for (i = 0; i < lisplen; ++i)
     v->contents[i] = Qnil;
-  v->size = len;
+  v->size = lisplen;
 
   return (struct Lisp_Process *) v;
 }
@@ -5563,6 +5571,10 @@
 	  if (size & PSEUDOVECTOR_FLAG)
 	    size &= PSEUDOVECTOR_SIZE_MASK;
 
+	  /* Note that this size is not the memory-footprint size, but only
+	     the number of Lisp_Object fields that we should trace.
+	     The distinction is used e.g. by Lisp_Process which places extra
+	     non-Lisp_Object fields at the end of the structure.  */
 	  for (i = 0; i < size; i++) /* and then mark its elements */
 	    mark_object (ptr->contents[i]);
 	}
--- a/src/config.in	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/config.in	Mon Apr 10 14:52:24 2006 +0000
@@ -1,8 +1,8 @@
 /* src/config.in.  Generated from configure.in by autoheader.  */
 
 /* GNU Emacs site configuration template file.
-   Copyright (C) 1988, 1993, 1994, 1999, 2000, 2002, 2004, 2005,
-                 2006 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1993, 1994, 1999, 2000, 2002, 2004, 2005, 2006
+             Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
--- a/src/editfns.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/editfns.c	Mon Apr 10 14:52:24 2006 +0000
@@ -74,6 +74,13 @@
 
 #define TM_YEAR_BASE 1900
 
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
+#endif
+
 extern size_t emacs_strftimeu P_ ((char *, size_t, const char *,
 				   const struct tm *, int));
 static int tm_diff P_ ((struct tm *, struct tm *));
@@ -1833,7 +1840,8 @@
 DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0,
        doc: /* Return the current time, as a human-readable string.
 Programs can use this function to decode a time,
-since the number of columns in each field is fixed.
+since the number of columns in each field is fixed
+if the year is in the range 1000-9999.
 The format is `Sun Sep 16 01:03:52 1973'.
 However, see also the functions `decode-time' and `format-time-string'
 which provide a much more powerful and general facility.
@@ -1847,31 +1855,23 @@
      Lisp_Object specified_time;
 {
   time_t value;
-  char buf[30];
   struct tm *tm;
   register char *tem;
 
   if (! lisp_time_argument (specified_time, &value, NULL))
     error ("Invalid time specification");
-  /* Do not use ctime, since it has undefined behavior with
-     out-of-range time stamps.  This avoids a core dump triggered by
-     (current-time-string '(2814749767106 0)) on 64-bit Solaris 8. See
-     <http://www.opengroup.org/austin/mailarchives/ag/msg09294.html>
-     for more details about this portability problem.  */
+
+  /* Convert to a string, checking for out-of-range time stamps.
+     Don't use 'ctime', as that might dump core if VALUE is out of
+     range.  */
   tm = localtime (&value);
-  /* Checking for out-of-range time stamps avoids buffer overruns that
-     cause core dump on some systems (e.g., 64-bit Solaris), and also
-     preserves the historic behavior of always returning a fixed-size
-     24-character string.  */
-  if (! (tm && -999 - TM_YEAR_BASE <= tm->tm_year
-	 && tm->tm_year <= 9999 - TM_YEAR_BASE))
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) && (tem = asctime (tm))))
     error ("Specified time is not representable");
-  tem = asctime (tm);
-
-  strncpy (buf, tem, 24);
-  buf[24] = 0;
-
-  return build_string (buf);
+
+  /* Remove the trailing newline.  */
+  tem[strlen (tem) - 1] = '\0';
+
+  return build_string (tem);
 }
 
 /* Yield A - B, measured in seconds.
--- a/src/image.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/image.c	Mon Apr 10 14:52:24 2006 +0000
@@ -39,6 +39,8 @@
 #include "blockinput.h"
 #include "systime.h"
 #include <epaths.h>
+#include "charset.h"
+#include "coding.h"
 
 
 #ifdef HAVE_X_WINDOWS
@@ -2248,8 +2250,8 @@
 
 
 /* Find image file FILE.  Look in data-directory, then
-   x-bitmap-file-path.  Value is the full name of the file found, or
-   nil if not found.  */
+   x-bitmap-file-path.  Value is the encoded full name of the file
+   found, or nil if not found.  */
 
 Lisp_Object
 x_find_image_file (file)
@@ -2269,7 +2271,10 @@
   if (fd == -1)
     file_found = Qnil;
   else
-    close (fd);
+    {
+      file_found = ENCODE_FILE (file_found);
+      close (fd);
+    }
 
   UNGCPRO;
   return file_found;
--- a/src/keymap.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/keymap.c	Mon Apr 10 14:52:24 2006 +0000
@@ -3336,7 +3336,7 @@
       if (INTEGERP (vect[i].event))
 	{
 	  while (i + 1 < slots_used
-		 && XINT (vect[i + 1].event) == XINT (vect[i].event) + 1
+		 && EQ (vect[i+1].event, make_number (XINT (vect[i].event) + 1))
 		 && !NILP (Fequal (vect[i + 1].definition, definition))
 		 && vect[i].shadowed == vect[i + 1].shadowed)
 	    i++;
--- a/src/lisp.h	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/lisp.h	Mon Apr 10 14:52:24 2006 +0000
@@ -297,7 +297,11 @@
 #endif
 };
 
-/* For convenience, we also store the number of elements in these bits.  */
+/* For convenience, we also store the number of elements in these bits.
+   Note that this size is not necessarily the memory-footprint size, but
+   only the number of Lisp_Object fields (that need to be traced by the GC).
+   The distinction is used e.g. by Lisp_Process which places extra
+   non-Lisp_Object fields at the end of the structure.  */
 #define PSEUDOVECTOR_SIZE_MASK 0x1ff
 
 /* Number of bits to put in each character in the internal representation
@@ -702,12 +706,12 @@
     unsigned char *data;
   };
 
-/* If a struct is made to look like a vector, this macro returns the length
-   of the shortest vector that would hold that struct.  */
-#define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector)  \
-                                         - sizeof (Lisp_Object))      \
-                        + sizeof(Lisp_Object) - 1) /* round up */     \
-		       / sizeof (Lisp_Object))
+#ifdef offsetof
+#define OFFSETOF(type,field) offsetof(type,field)
+#else
+#define OFFSETOF(type,field) \
+  ((int)((char*)&((type*)0)->field - (char*)0))
+#endif
 
 struct Lisp_Vector
   {
@@ -716,6 +720,20 @@
     Lisp_Object contents[1];
   };
 
+/* If a struct is made to look like a vector, this macro returns the length
+   of the shortest vector that would hold that struct.  */
+#define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector)  \
+                                         - sizeof (Lisp_Object))      \
+                        + sizeof(Lisp_Object) - 1) /* round up */     \
+		       / sizeof (Lisp_Object))
+
+/* Like VECSIZE, but used when the pseudo-vector has non-Lisp_Object fields
+   at the end and we need to compute the number of Lisp_Object fields (the
+   ones that the GC needs to trace).  */
+#define PSEUDOVECSIZE(type, nonlispfield) \
+  ((OFFSETOF(type, nonlispfield) - OFFSETOF(struct Lisp_Vector, contents[0])) \
+   / sizeof (Lisp_Object))
+
 /* A char table is a kind of vectorlike, with contents are like a
    vector but with a few other slots.  For some purposes, it makes
    sense to handle a chartable with type struct Lisp_Vector.  An
@@ -2225,8 +2243,9 @@
 extern Lisp_Object indirect_variable P_ ((Lisp_Object));
 extern Lisp_Object long_to_cons P_ ((unsigned long));
 extern unsigned long cons_to_long P_ ((Lisp_Object));
-extern void args_out_of_range P_ ((Lisp_Object, Lisp_Object));
-extern void args_out_of_range_3 P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
+extern void args_out_of_range P_ ((Lisp_Object, Lisp_Object)) NO_RETURN;
+extern void args_out_of_range_3 P_ ((Lisp_Object, Lisp_Object,
+				     Lisp_Object)) NO_RETURN;
 extern Lisp_Object wrong_type_argument P_ ((Lisp_Object, Lisp_Object));
 extern void store_symval_forwarding P_ ((Lisp_Object, Lisp_Object,
 					 Lisp_Object, struct buffer *));
@@ -2844,7 +2863,7 @@
 EXFUN (Ffile_executable_p, 1);
 EXFUN (Fread_file_name, 6);
 extern Lisp_Object close_file_unwind P_ ((Lisp_Object));
-extern void report_file_error P_ ((const char *, Lisp_Object));
+extern void report_file_error P_ ((const char *, Lisp_Object)) NO_RETURN;
 extern int internal_delete_file P_ ((Lisp_Object));
 extern void syms_of_fileio P_ ((void));
 extern void init_fileio_once P_ ((void));
--- a/src/macterm.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/macterm.c	Mon Apr 10 14:52:24 2006 +0000
@@ -10455,6 +10455,8 @@
 
 	    ObscureCursor ();
 
+	    f = mac_focus_frame (dpyinfo);
+
 	    if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
 		&& !EQ (f->tool_bar_window, dpyinfo->mouse_face_window))
 	      {
@@ -10500,7 +10502,7 @@
 	  inev.modifiers |= (extra_keyboard_modifiers
 			     & (meta_modifier | alt_modifier
 				| hyper_modifier | super_modifier));
-	  XSETFRAME (inev.frame_or_window, mac_focus_frame (dpyinfo));
+	  XSETFRAME (inev.frame_or_window, f);
 	  break;
 
 	case kHighLevelEvent:
--- a/src/process.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/process.c	Mon Apr 10 14:52:24 2006 +0000
@@ -414,10 +414,10 @@
      struct Lisp_Process *p;
 {
   union { int i; WAITTYPE wt; } u;
-  u.i = XFASTINT (p->raw_status_low) + (XFASTINT (p->raw_status_high) << 16);
+  eassert (p->raw_status_new);
+  u.i = p->raw_status;
   p->status = status_convert (u.wt);
-  p->raw_status_low = Qnil;
-  p->raw_status_high = Qnil;
+  p->raw_status_new = 0;
 }
 
 /*  Convert a process status word in Unix format to
@@ -619,11 +619,10 @@
 
   XSETINT (p->infd, -1);
   XSETINT (p->outfd, -1);
-  XSETFASTINT (p->pid, 0);
   XSETFASTINT (p->tick, 0);
   XSETFASTINT (p->update_tick, 0);
-  p->raw_status_low = Qnil;
-  p->raw_status_high = Qnil;
+  p->pid = 0;
+  p->raw_status_new = 0;
   p->status = Qrun;
   p->mark = Fmake_marker ();
 
@@ -789,8 +788,7 @@
   process = get_process (process);
   p = XPROCESS (process);
 
-  p->raw_status_low = Qnil;
-  p->raw_status_high = Qnil;
+  p->raw_status_new = 0;
   if (NETCONN1_P (p))
     {
       p->status = Fcons (Qexit, Fcons (make_number (0), Qnil));
@@ -840,7 +838,7 @@
     return process;
 
   p = XPROCESS (process);
-  if (!NILP (p->raw_status_low))
+  if (p->raw_status_new)
     update_status (p);
   status = p->status;
   if (CONSP (status))
@@ -865,7 +863,7 @@
      register Lisp_Object process;
 {
   CHECK_PROCESS (process);
-  if (!NILP (XPROCESS (process)->raw_status_low))
+  if (XPROCESS (process)->raw_status_new)
     update_status (XPROCESS (process));
   if (CONSP (XPROCESS (process)->status))
     return XCAR (XCDR (XPROCESS (process)->status));
@@ -880,7 +878,9 @@
      register Lisp_Object process;
 {
   CHECK_PROCESS (process);
-  return XPROCESS (process)->pid;
+  return (XPROCESS (process)->pid
+	  ? make_fixnum_or_float (XPROCESS (process)->pid)
+	  : Qnil);
 }
 
 DEFUN ("process-name", Fprocess_name, Sprocess_name, 1, 1, 0,
@@ -1362,7 +1362,7 @@
       Finsert (1, &p->name);
       Findent_to (i_status, minspace);
 
-      if (!NILP (p->raw_status_low))
+      if (p->raw_status_new)
 	update_status (p);
       symbol = p->status;
       if (CONSP (p->status))
@@ -1734,7 +1734,7 @@
     abort ();
 
   /* Was PROC started successfully?  */
-  if (XINT (XPROCESS (proc)->pid) <= 0)
+  if (XPROCESS (proc)->pid <= 0)
     remove_process (proc);
 
   return Qnil;
@@ -1945,7 +1945,7 @@
      in the table after this function has returned; if it does
      it might cause call-process to hang and subsequent asynchronous
      processes to get their return values scrambled.  */
-  XSETINT (XPROCESS (process)->pid, -1);
+  XPROCESS (process)->pid = -1;
 
   BLOCK_INPUT;
 
@@ -2136,7 +2136,7 @@
   else
     {
       /* vfork succeeded.  */
-      XSETFASTINT (XPROCESS (process)->pid, pid);
+      XPROCESS (process)->pid = pid;
 
 #ifdef WINDOWSNT
       register_child (pid, inchannel);
@@ -3354,7 +3354,7 @@
     p->kill_without_query = Qt;
   if ((tem = Fplist_get (contact, QCstop), !NILP (tem)))
     p->command = Qt;
-  p->pid = Qnil;
+  p->pid = 0;
   XSETINT (p->infd, inch);
   XSETINT (p->outfd, outch);
   if (is_server && socktype == SOCK_STREAM)
@@ -4070,7 +4070,7 @@
   p->sentinel = ps->sentinel;
   p->filter = ps->filter;
   p->command = Qnil;
-  p->pid = Qnil;
+  p->pid = 0;
   XSETINT (p->infd, s);
   XSETINT (p->outfd, s);
   p->status = Qrun;
@@ -4370,9 +4370,9 @@
 
       /* Don't wait for output from a non-running process.  Just
          read whatever data has already been received.  */
-      if (wait_proc != 0 && !NILP (wait_proc->raw_status_low))
+      if (wait_proc && wait_proc->raw_status_new)
 	update_status (wait_proc);
-      if (wait_proc != 0
+      if (wait_proc
 	  && ! EQ (wait_proc->status, Qrun)
 	  && ! EQ (wait_proc->status, Qconnect))
 	{
@@ -4756,7 +4756,7 @@
 		  /* Preserve status of processes already terminated.  */
 		  XSETINT (XPROCESS (proc)->tick, ++process_tick);
 		  deactivate_process (proc);
-		  if (!NILP (XPROCESS (proc)->raw_status_low))
+		  if (XPROCESS (proc)->raw_status_new)
 		    update_status (XPROCESS (proc));
 		  if (EQ (XPROCESS (proc)->status, Qrun))
 		    XPROCESS (proc)->status
@@ -5293,7 +5293,7 @@
   VMS_PROC_STUFF *vs, *get_vms_process_pointer();
 #endif /* VMS */
 
-  if (! NILP (p->raw_status_low))
+  if (p->raw_status_new)
     update_status (p);
   if (! EQ (p->status, Qrun))
     error ("Process %s not running", SDATA (p->name));
@@ -5557,8 +5557,7 @@
       proc = process_sent_to;
       p = XPROCESS (proc);
 #endif
-      p->raw_status_low = Qnil;
-      p->raw_status_high = Qnil;
+      p->raw_status_new = 0;
       p->status = Fcons (Qexit, Fcons (make_number (256), Qnil));
       XSETINT (p->tick, ++process_tick);
       deactivate_process (proc);
@@ -5673,7 +5672,7 @@
 
   gid = emacs_get_tty_pgrp (p);
 
-  if (gid == XFASTINT (p->pid))
+  if (gid == p->pid)
     return Qnil;
   return Qt;
 }
@@ -5720,7 +5719,7 @@
   /* If we are using pgrps, get a pgrp number and make it negative.  */
   if (NILP (current_group))
     /* Send the signal to the shell's process group.  */
-    gid = XFASTINT (p->pid);
+    gid = p->pid;
   else
     {
 #ifdef SIGNALS_VIA_CHARACTERS
@@ -5839,7 +5838,7 @@
       if (gid == -1)
 	/* If we can't get the information, assume
 	   the shell owns the tty.  */
-	gid = XFASTINT (p->pid);
+	gid = p->pid;
 
       /* It is not clear whether anything really can set GID to -1.
 	 Perhaps on some system one of those ioctls can or could do so.
@@ -5849,12 +5848,12 @@
 #else  /* ! defined (TIOCGPGRP ) */
       /* Can't select pgrps on this system, so we know that
 	 the child itself heads the pgrp.  */
-      gid = XFASTINT (p->pid);
+      gid = p->pid;
 #endif /* ! defined (TIOCGPGRP ) */
 
       /* If current_group is lambda, and the shell owns the terminal,
 	 don't send any signal.  */
-      if (EQ (current_group, Qlambda) && gid == XFASTINT (p->pid))
+      if (EQ (current_group, Qlambda) && gid == p->pid)
 	return;
     }
 
@@ -5862,8 +5861,7 @@
     {
 #ifdef SIGCONT
     case SIGCONT:
-      p->raw_status_low = Qnil;
-      p->raw_status_high = Qnil;
+      p->raw_status_new = 0;
       p->status = Qrun;
       XSETINT (p->tick, ++process_tick);
       if (!nomsg)
@@ -5882,7 +5880,7 @@
 #endif
     case SIGKILL:
 #ifdef VMS
-      sys$forcex (&(XFASTINT (p->pid)), 0, 1);
+      sys$forcex (&(p->pid), 0, 1);
       whoosh:
 #endif
       flush_pending_output (XINT (p->infd));
@@ -5894,7 +5892,7 @@
      obvious alternative.  */
   if (no_pgrp)
     {
-      kill (XFASTINT (p->pid), signo);
+      kill (p->pid, signo);
       return;
     }
 
@@ -5907,7 +5905,7 @@
     }
   else
     {
-      gid = - XFASTINT (p->pid);
+      gid = - p->pid;
       kill (gid, signo);
     }
 #else /* ! defined (TIOCSIGSEND) */
@@ -6027,11 +6025,17 @@
      (process, sigcode)
      Lisp_Object process, sigcode;
 {
-  Lisp_Object pid;
+  pid_t pid;
 
   if (INTEGERP (process))
     {
-      pid = process;
+      pid = XINT (process);
+      goto got_it;
+    }
+
+  if (FLOATP (process))
+    {
+      pid = (pid_t) XFLOAT (process);
       goto got_it;
     }
 
@@ -6040,8 +6044,8 @@
       Lisp_Object tem;
       if (tem = Fget_process (process), NILP (tem))
 	{
-	  pid = Fstring_to_number (process, make_number (10));
-	  if (XINT (pid) != 0)
+	  pid = XINT (Fstring_to_number (process, make_number (10)));
+	  if (pid > 0)
 	    goto got_it;
 	}
       process = tem;
@@ -6054,7 +6058,7 @@
 
   CHECK_PROCESS (process);
   pid = XPROCESS (process)->pid;
-  if (!INTEGERP (pid) || XINT (pid) <= 0)
+  if (pid <= 0)
     error ("Cannot signal process %s", SDATA (XPROCESS (process)->name));
 
  got_it:
@@ -6173,7 +6177,7 @@
 
 #undef handle_signal
 
-  return make_number (kill (XINT (pid), XINT (sigcode)));
+  return make_number (kill (pid, XINT (sigcode)));
 }
 
 DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0,
@@ -6197,7 +6201,7 @@
   coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)];
 
   /* Make sure the process is really alive.  */
-  if (! NILP (XPROCESS (proc)->raw_status_low))
+  if (XPROCESS (proc)->raw_status_new)
     update_status (XPROCESS (proc));
   if (! EQ (XPROCESS (proc)->status, Qrun))
     error ("Process %s not running", SDATA (XPROCESS (proc)->name));
@@ -6222,7 +6226,7 @@
 	 for communication with the subprocess, call shutdown to cause EOF.
 	 (In some old system, shutdown to socketpair doesn't work.
 	 Then we just can't win.)  */
-      if (NILP (XPROCESS (proc)->pid)
+      if (XPROCESS (proc)->pid == 0
 	  || XINT (XPROCESS (proc)->outfd) == XINT (XPROCESS (proc)->infd))
 	shutdown (XINT (XPROCESS (proc)->outfd), 1);
       /* In case of socketpair, outfd == infd, so don't close it.  */
@@ -6359,7 +6363,7 @@
 	{
 	  proc = XCDR (XCAR (tail));
 	  p = XPROCESS (proc);
-	  if (GC_EQ (p->childp, Qt) && XINT (p->pid) == pid)
+	  if (GC_EQ (p->childp, Qt) && p->pid == pid)
 	    break;
 	  p = 0;
 	}
@@ -6371,7 +6375,7 @@
 	  {
 	    proc = XCDR (XCAR (tail));
 	    p = XPROCESS (proc);
-	    if (GC_INTEGERP (p->pid) && XINT (p->pid) == -1)
+	    if (p->pid == -1)
 	      break;
 	    p = 0;
 	  }
@@ -6384,8 +6388,8 @@
 
 	  XSETINT (p->tick, ++process_tick);
 	  u.wt = w;
-	  XSETINT (p->raw_status_low, u.i & 0xffff);
-	  XSETINT (p->raw_status_high, u.i >> 16);
+	  p->raw_status = u.i;
+	  p->raw_status_new = 1;
 
 	  /* If process has terminated, stop waiting for its output.  */
 	  if ((WIFSIGNALED (w) || WIFEXITED (w))
@@ -6582,7 +6586,7 @@
 	  buffer = p->buffer;
 
 	  /* Get the text to use for the message.  */
-	  if (!NILP (p->raw_status_low))
+	  if (p->raw_status_new)
 	    update_status (p);
 	  msg = status_message (p);
 
--- a/src/process.h	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/process.h	Mon Apr 10 14:52:24 2006 +0000
@@ -51,8 +51,6 @@
     Lisp_Object log;
     /* Buffer that output is going to */
     Lisp_Object buffer;
-    /* Number of this process */
-    Lisp_Object pid;
     /* t if this is a real child process.
        For a net connection, it is a plist based on the arguments to make-network-process.  */
     Lisp_Object childp;
@@ -63,10 +61,6 @@
     /* Non-nil means kill silently if Emacs is exited.
        This is the inverse of the `query-on-exit' flag.  */
     Lisp_Object kill_without_query;
-    /* Record the process status in the raw form in which it comes from `wait'.
-       This is to avoid consing in a signal handler.  */
-    Lisp_Object raw_status_low;
-    Lisp_Object raw_status_high;
     /* Symbol indicating status of process.
        This may be a symbol: run, open, or closed.
        Or it may be a list, whose car is stop, exit or signal
@@ -112,6 +106,19 @@
     Lisp_Object read_output_delay;
     /* Skip reading this process on next read.  */
     Lisp_Object read_output_skip;
+
+    /* After this point, there are no Lisp_Objects any more.  */
+
+    /* Number of this process.
+       allocate_process assumes this is the first non-Lisp_Object field.
+       A value 0 is used for pseudo-processes such as network connections.  */
+    pid_t pid;
+    /* Record the process status in the raw form in which it comes from `wait'.
+       This is to avoid consing in a signal handler.  The `raw_status_new'
+       flag indicates that `raw_status' contains a new status that still
+       needs to be synced to `status'.  */
+    int raw_status_new : 1;
+    int raw_status;
 };
 
 /* Every field in the preceding structure except for the first two
--- a/src/puresize.h	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/puresize.h	Mon Apr 10 14:52:24 2006 +0000
@@ -65,7 +65,7 @@
   { if (PURE_P (obj))	  \
       pure_write_error (); }
 
-extern void pure_write_error P_ ((void));
+extern void pure_write_error P_ ((void)) NO_RETURN;
 
 /* Define PURE_P.  */
 
--- a/src/search.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/search.c	Mon Apr 10 14:52:24 2006 +0000
@@ -1720,7 +1720,7 @@
 		ch = -1;
 	    }
 
-	  if (ch > 0400)
+	  if (ch >= 0400)
 	    j = ((unsigned char) ch) | 0200;
 	  else
 	    j = *ptr;
@@ -1739,7 +1739,7 @@
 	      while (1)
 		{
 		  TRANSLATE (ch, inverse_trt, ch);
-		  if (ch > 0400)
+		  if (ch >= 0400)
 		    j = ((unsigned char) ch) | 0200;
 		  else
 		    j = (unsigned char) ch;
--- a/src/w32fns.c	Sat Apr 01 17:16:18 2006 +0000
+++ b/src/w32fns.c	Mon Apr 10 14:52:24 2006 +0000
@@ -3297,6 +3297,14 @@
       return (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONUP);
 
     case WM_MOUSEMOVE:
+      /* Ignore mouse movements as long as the menu is active.  These
+	 movements are processed by the window manager anyway, and
+	 it's wrong to handle them as if they happened on the
+	 underlying frame.  */
+      f = x_window_to_frame (dpyinfo, hwnd);
+      if (f && f->output_data.w32->menubar_active)
+	return 0;
+
       /* If the mouse has just moved into the frame, start tracking
 	 it, so we will be notified when it leaves the frame.  Mouse
 	 tracking only works under W98 and NT4 and later. On earlier
@@ -7668,9 +7676,12 @@
     AdjustWindowRect (&rect, f->output_data.w32->dwStyle,
 		      FRAME_EXTERNAL_MENU_BAR (f));
 
-    /* Position and size tooltip, and put it in the topmost group.  */
+    /* Position and size tooltip, and put it in the topmost group.
+       The add-on of 3 to the 5th argument is a kludge: without it,
+       some fonts cause the last character of the tip to be truncated,
+       for some obscure reason.  */
     SetWindowPos (FRAME_W32_WINDOW (f), HWND_TOPMOST,
-		  root_x, root_y, rect.right - rect.left,
+		  root_x, root_y, rect.right - rect.left + 3,
 		  rect.bottom - rect.top, SWP_NOACTIVATE);
 
     /* Ensure tooltip is on top of other topmost windows (eg menus).  */