readline-8.3/000775 000436 000024 00000000000 15030514137 013231 5ustar00chetstaff000000 000000 readline-8.3/nls.c000644 000436 000024 00000021025 14637567462 014214 0ustar00chetstaff000000 000000 /* nls.c -- skeletal internationalization code. */ /* Copyright (C) 1996-2022 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_LOCALE_H) # include #endif #if defined (HAVE_LANGINFO_CODESET) # include #endif #include #include "rldefs.h" #include "readline.h" #include "rlshell.h" #include "rlprivate.h" #include "xmalloc.h" static int utf8locale (char *); #define RL_DEFAULT_LOCALE "C" static char *_rl_current_locale = 0; #if !defined (HAVE_SETLOCALE) /* A list of legal values for the LANG or LC_CTYPE environment variables. If a locale name in this list is the value for the LC_ALL, LC_CTYPE, or LANG environment variable (using the first of those with a value), readline eight-bit mode is enabled. */ static char *legal_lang_values[] = { "iso88591", "iso88592", "iso88593", "iso88594", "iso88595", "iso88596", "iso88597", "iso88598", "iso88599", "iso885910", "koi8r", "utf8", 0 }; static char *normalize_codeset (char *); #endif /* !HAVE_SETLOCALE */ static char *find_codeset (char *, size_t *); static char *_rl_get_locale_var (const char *); static char * _rl_get_locale_var (const char *v) { char *lspec; lspec = sh_get_env_value ("LC_ALL"); if (lspec == 0 || *lspec == 0) lspec = sh_get_env_value (v); if (lspec == 0 || *lspec == 0) lspec = sh_get_env_value ("LANG"); return lspec; } static int utf8locale (char *lspec) { char *cp; #if HAVE_LANGINFO_CODESET cp = nl_langinfo (CODESET); return (STREQ (cp, "UTF-8") || STREQ (cp, "utf8")); #else size_t len; cp = find_codeset (lspec, &len); if (cp == 0 || len < 4 || len > 5) return 0; return ((len == 5) ? strncmp (cp, "UTF-8", len) == 0 : strncmp (cp, "utf8", 4) == 0); #endif } /* Query the right environment variables and call setlocale() to initialize the C library locale settings. */ char * _rl_init_locale (void) { char *ret, *lspec; /* Set the LC_CTYPE locale category from environment variables. */ lspec = _rl_get_locale_var ("LC_CTYPE"); /* Since _rl_get_locale_var queries the right environment variables, we query the current locale settings with setlocale(), and, if that doesn't return anything, we set lspec to the empty string to force the subsequent call to setlocale() to define the `native' environment. */ #if defined (HAVE_SETLOCALE) if (lspec == 0 || *lspec == 0) lspec = setlocale (LC_CTYPE, (char *)NULL); if (lspec == 0) lspec = ""; ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */ if (ret == 0 || *ret == 0) ret = setlocale (LC_CTYPE, (char *)NULL); if (ret == 0 || *ret == 0) ret = RL_DEFAULT_LOCALE; #else ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec; #endif _rl_utf8locale = (ret && *ret) ? utf8locale (ret) : 0; _rl_current_locale = savestring (ret); return ret; } /* If we have setlocale(3), just check the current LC_CTYPE category value (passed as LOCALESTR), and go into eight-bit mode if it's not "C" or "POSIX". If FORCE is non-zero, we reset the locale variables to values appropriate for the C locale if the locale is "C" or "POSIX". FORCE is 0 when this is called from _rl_init_eightbit, since we're modifying the default initial values and don't need to change anything else. If we don't have setlocale(3), we check the codeset portion of LOCALESTR against a set of known values and go into eight-bit mode if it matches one of those. Returns 1 if we set eight-bit (multibyte) mode. */ static int _rl_set_localevars (char *localestr, int force) { #if defined (HAVE_SETLOCALE) if (localestr && *localestr && (localestr[0] != 'C' || localestr[1]) && (STREQ (localestr, "POSIX") == 0)) { _rl_meta_flag = 1; _rl_convert_meta_chars_to_ascii = 0; _rl_output_meta_chars = 1; return (1); } else if (force) { /* Default "C" locale settings. */ _rl_meta_flag = 0; _rl_convert_meta_chars_to_ascii = 1; _rl_output_meta_chars = 0; return (0); } else return (0); #else /* !HAVE_SETLOCALE */ char *t; int i; /* We don't have setlocale. Finesse it. Check the environment for the appropriate variables and set eight-bit mode if they have the right values. */ if (localestr == 0 || (t = normalize_codeset (localestr)) == 0) return (0); for (i = 0; t && legal_lang_values[i]; i++) if (STREQ (t, legal_lang_values[i])) { _rl_meta_flag = 1; _rl_convert_meta_chars_to_ascii = 0; _rl_output_meta_chars = 1; break; } if (force && legal_lang_values[i] == 0) /* didn't find it */ { /* Default "C" locale settings. */ _rl_meta_flag = 0; _rl_convert_meta_chars_to_ascii = 1; _rl_output_meta_chars = 0; } _rl_utf8locale = *t ? STREQ (t, "utf8") : 0; xfree (t); return (legal_lang_values[i] ? 1 : 0); #endif /* !HAVE_SETLOCALE */ } /* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value to decide the defaults for 8-bit character input and output. Returns 1 if we set eight-bit mode. */ int _rl_init_eightbit (void) { char *t, *ol; ol = _rl_current_locale; t = _rl_init_locale (); /* resets _rl_current_locale, returns static pointer */ xfree (ol); return (_rl_set_localevars (t, 0)); } #if !defined (HAVE_SETLOCALE) static char * normalize_codeset (char *codeset) { size_t namelen, i; int len, all_digits; char *wp, *retval; codeset = find_codeset (codeset, &namelen); if (codeset == 0) return (codeset); all_digits = 1; for (len = 0, i = 0; i < namelen; i++) { if (ISALNUM ((unsigned char)codeset[i])) { len++; all_digits &= _rl_digit_p (codeset[i]); } } retval = (char *)malloc ((all_digits ? 3 : 0) + len + 1); if (retval == 0) return ((char *)0); wp = retval; /* Add `iso' to beginning of an all-digit codeset */ if (all_digits) { *wp++ = 'i'; *wp++ = 's'; *wp++ = 'o'; } for (i = 0; i < namelen; i++) if (ISALPHA ((unsigned char)codeset[i])) *wp++ = _rl_to_lower (codeset[i]); else if (_rl_digit_p (codeset[i])) *wp++ = codeset[i]; *wp = '\0'; return retval; } #endif /* !HAVE_SETLOCALE */ /* Isolate codeset portion of locale specification. */ static char * find_codeset (char *name, size_t *lenp) { char *cp, *language, *result; cp = language = name; result = (char *)0; while (*cp && *cp != '_' && *cp != '@' && *cp != '+' && *cp != ',') cp++; /* This does not make sense: language has to be specified. As an exception we allow the variable to contain only the codeset name. Perhaps there are funny codeset names. */ if (language == cp) { *lenp = strlen (language); result = language; } else { /* Next is the territory. */ if (*cp == '_') do ++cp; while (*cp && *cp != '.' && *cp != '@' && *cp != '+' && *cp != ',' && *cp != '_'); /* Now, finally, is the codeset. */ result = cp; if (*cp == '.') do ++cp; while (*cp && *cp != '@'); if (cp - result > 2) { result++; *lenp = cp - result; } else { *lenp = strlen (language); result = language; } } return result; } void _rl_reset_locale (void) { char *ol, *nl; /* This should not be NULL; _rl_init_eightbit sets it on the first call to readline() or rl_initialize(). */ ol = _rl_current_locale; nl = _rl_init_locale (); /* resets _rl_current_locale */ if ((ol == 0 && nl) || (ol && nl && (STREQ (ol, nl) == 0))) (void)_rl_set_localevars (nl, 1); xfree (ol); } readline-8.3/CHANGES000644 000436 000024 00000254116 15013112710 014223 0ustar00chetstaff000000 000000 This document details the changes between this version, readline-8.3, and the previous version, readline-8.2. 1. Changes to Readline a. Fixed a bug in clearing the visible line structure before redisplay. b. Fix a bug where setlocale(3) returning NULL caused a crash. c. Fixed signal checking in callback mode to handle signals that arrive before readline restore's the application's signal handlers. d. Fixed a bug with word completion where the directory name needs to be dequoted and tilde-expanded. e. Fixed a bug that caused compilation to fail on systems with select but not pselect. f. System-specific changes for: WIN32, z/OS, Cygwin, MSYS g. Fixed a bug that caused word completion mismatches if the quoted text the user typed was longer than the unquoted match. h. Fixes for freeing undo lists that might appear in history list entries after non-incremental searches. i. Fixes for some errors revealed by address sanitizer. j. In vi mode, if an `f' or `F' move command associated with a `c' or `C' command fails, don't enter insert mode. k. Fixed bug with truncating a history file containing timestamps that caused the timestamp associated with the first history entry not to be written. l. Fix vi-mode so that a motion command attached to d/D, y/Y, or t/T must consume or delete at least one character. m. Fix a redisplay error when displaying meta characters as octal sequences and other C locale issues. n. Fix error that caused characters composing an incomplete multibyte character not to be inserted into the line. o. In callback mode, let the application echo the signal characters (e.g., ^C) when the application's signal handlers are installed. p. Added some support for lines that consume more than the physical number of screen lines. q. Make sure dump-variables returns the string values for active-region-start-color and active-region-end-color if they're set. r. Fixes to how characters between 128 and 159 are printed when displaying macro values (use symbolic notation instead of directly printing the character). s. Don't convert meta characters that contain NULL (\M-\C-@) to actual NULs, which prematurely terminates the macro value. t. Fix typo in the readline color prefix extension that it uses for coloring filename prefixes when displaying possible completions. u. Call the filename rewrite hook on the word being completed before comparing it against possible completions from the file system to get consistent strings. v. Fix infinite recursion that can happen if someone binds a key that doesn't have a different upper and lower case represenation to do-lowercase-version. w. Check for non-ANSI (dumb) terminals a little more thoroughly. x. Don't attempt to history-expand the `quick substitution' character at the beginning of a line if the application has set the quoting state to single quotes. y. Fix small memory leak if non-incremental or incremental search is interrupted by a signal. z. Loading very large history files should be much faster. aa. Retry opening startup files if the open is interrupted by a signal and is not automatically restarted. bb. Make sure the bracketed-paste input buffer is null-terminated when read returns an error. cc. Fixed a small memory leak in execute-named-command if the command doesn't exist or the function doesn't return. dd. Fix for attempting to change case of invalid multibyte characters. ee. Fix for possible completions that compare identically when using case- insensitive completion but have different byte lengths. ff. Fix to make non-incremental searches use undo lists and set the history position the same way as incremental searches. gg. Don't check for signals when handling a received signal. hh. Fix off-by-one error when tokenizing words like $((expr)) while performing history expansion. ii. Fixes for incremental searches and redisplay in the C locale. jj. Fixes for some use-after-free of the undo list errors when stacking multiple commands that use rl_maybe_replace_line to save changes to a history entry. kk. Fixes to ensure that completion-prefix-display-length and colored-completion-prefix are mutually exclusive. ll. Fixed a bug that allowed a history search to change the current history list position. mm. Fixed a bug that allowed ^G to retain a saved command to execute. nn. Updates to new export-completions command to allow filename suffixes. oo. Fixed a redisplay bug with prompts containing multiple sequences of invisible characters that are longer than the screen width. pp. The history library no longer skips blank lines while it is reading a multiline history entry from a history file. 2. New Features in Readline a. Output a newline if there is no prompt and readline reads an empty line. b. The history library falls back to stdio when writing the history list if mmap fails. c. New bindable variable `search-ignore-case', causes readline to perform case-insensitive incremental and non-incremental history searches. d. rl_full_quoting_desired: new application-settable variable, causes all completions to be quoted as if they were filenames. e. rl_macro_display_hook: new application-settable function pointer, used if the application wants to print macro values itself instead of letting readline do it f. rl_reparse_colors: new application-callable function, reparses $LS_COLORS (presumably after the user changes it) g. rl_completion_rewrite_hook: new application-settable function pointer, called to modify the word being completed before comparing it against pathnames from the file system. h. execute-named-command: a new bindable command that reads the name of a readline command from the standard input and executes it. Bound to M-x in emacs mode by default. i. Incremental and non-incremental searches now allow ^V/^Q (or, in the former case, anything bound to quoted-insert) to quote characters in the search string. j. Documentation has been significantly updated. k. New `force-meta-prefix' bindable variable, which forces the use of ESC as the meta prefix when using "\M-" in key bindings instead of overloading convert-meta. l. The default value for `readline-colored-completion-prefix' no longer has a leading `.'; the original report was based on a misunderstanding. m. There is a new bindable command, `export-completions', which writes the possible completions for a word to the standard output in a defined format. n. Readline can reset its idea of the screen dimensions when executing after a SIGCONT. ------------------------------------------------------------------------------- This document details the changes between this version, readline-8.2, and the previous version, readline-8.1. 1. Changes to Readline a. Fixed a problem with cleaning up active marks when using callback mode. b. Fixed a problem with arithmetic comparison operators checking the version. c. Fixed a problem that could cause readline not to build on systems without POSIX signal functions. d. Fixed a bug that could cause readline to crash if the application removed the callback line handler before readline read all typeahead. e. Added additional checks for read errors in the middle of readline commands. f. Fixed a redisplay problem that occurred when switching from the digit- argument prompt `(arg: N)' back to the regular prompt and the regular prompt contained invisible characters. g. Fixed a problem with restoring the prompt when aborting an incremental search. h. Fix a problem with characters > 128 not being displayed correctly in certain single-byte encodings. i. Fixed a problem with unix-filename-rubout that caused it to delete too much when applied to a pathname consisting only of one or more slashes. j. Fixed a display problem that caused the prompt to be wrapped incorrectly if the screen changed dimensions during a call to readline() and the prompt became longer than the screen width. k. Fixed a problem that caused the \r output by turning off bracketed paste to overwrite the line if terminal echo was disabled. l. Fixed a bug that could cause colored-completion-prefix to not display if completion-prefix-display-length was set. m. Fixed a problem with line wrapping prompts when a group of invisible characters runs to the right edge of the screen and the prompt extends longer then the screen width. n. Fixed a couple problems that could cause rl_end to be set incorrectly by transpose-words. o. Prevent some display problems when running a command as the result of a trap or one bound using `bind -x' and the command generates output. p. Fixed an issue with multi-line prompt strings that have one or more invisible characters at the end of a physical line. q. Fixed an issue that caused a history line's undo list to be cleared when it should not have been. r. When replacing a history entry, make sure the existing entry has a non-NULL timestamp before copying it; it may have been added by the application, not the history library. 2. New Features in Readline a. There is now an HS_HISTORY_VERSION containing the version number of the history library for applications to use. b. History expansion better understands multiple history expansions that may contain strings that would ordinarily inhibit history expansion (e.g., `abc!$!$'). c. There is a new framework for readline timeouts, including new public functions to set timeouts and query how much time is remaining before a timeout hits, and a hook function that can trigger when readline times out. There is a new state value to indicate a timeout. d. Automatically bind termcap key sequences for page-up and page-down to history-search-backward and history-search-forward, respectively. e. There is a new `fetch-history' bindable command that retrieves the history entry corresponding to its numeric argument. Negative arguments count back from the end of the history. f. `vi-undo' is now a bindable command. g. There is a new option: `enable-active-region'. This separates control of the active region and bracketed-paste. It has the same default value as bracketed-paste, and enabling bracketed paste enables the active region. Users can now turn off the active region while leaving bracketed paste enabled. h. rl_completer_word_break_characters is now `const char *' like rl_basic_word_break_characters. i. Readline looks in $LS_COLORS for a custom filename extension (*.readline-colored-completion-prefix) and uses that as the default color for the common prefix displayed when `colored-completion-prefix' is set. j. Two new bindable string variables: active-region-start-color and active-region-end-color. The first sets the color used to display the active region; the second turns it off. If set, these are used in place of terminal standout mode. k. New readline state (RL_STATE_EOF) and application-visible variable (rl_eof_found) to allow applications to detect when readline reads EOF before calling the deprep-terminal hook. l. There is a new configuration option: --with-shared-termcap-library, which forces linking the shared readline library with the shared termcap (or curses/ncurses/termlib) library so applications don't have to do it. m. Readline now checks for changes to locale settings (LC_ALL/LC_CTYPE/LANG) each time it is called, and modifies the appropriate locale-specific display and key binding variables when the locale changes. ------------------------------------------------------------------------------- This document details the changes between this version, readline-8.1, and the previous version, readline-8.0. 1. Changes to Readline a. There are a number of fixes that were found as the result of fuzzing with random input. b. Changed the revert-all-at-newline behavior to make sure to start at the end of the history list when doing it, instead of the line where the user hit return. c. When parsing `set' commands from the inputrc file or an application, readline now allows trailing whitespace. d. Fixed a bug that left a file descriptor open to the history file if the file size was 0. e. Fixed a problem with binding key sequences containing meta characters. f. Fixed a bug that caused the wrong line to be displayed if the user tried to move back beyond the beginning of the history list, or forward past the end of the history list. g. If readline catches SIGTSTP, it now sets a hook that allows the calling application to handle it if it desires. h. Fixed a redisplay problem with a prompt string containing embedded newlines. i. Fixed a problem with completing filenames containing invalid multibyte sequences when case-insensitive comparisons are enabled. j. Fixed a redisplay problem with prompt strings containing invisible multibyte characters. k. Fixed a problem with multibyte characters mapped to editing commands that modify the search string in incremental search. l. Fixed a bug with maintaining the key sequence while resolving a bound command in the presence of ambiguous sequences (sequences with a common prefix), in most cases while attempting to unbind it. m. Fixed several buffer overflows found as the result of fuzzing. n. Reworked backslash handling when translating key sequences for key binding to be more uniform and consistent, which introduces a slight backwards incompatibility. o. Fixed a bug with saving the history that resulted in errors not being propagated to the calling application when the history file is not writable. p. Readline only calls chown(2) on a newly-written history file if it really needs to, instead of having it be a no-op. q. Readline now behaves better when operate-and-get-next is used when the history list is `full': when there are already $HISTSIZE entries. r. Fixed a bug that could cause vi redo (`.') of a replace command not to work correctly in the C or POSIX locale. s. Fixed a bug with vi-mode digit arguments that caused the last command to be set incorrectly. This prevents yank-last-arg from working as intended, for example. t. Make sure that all undo groups are closed when leaving vi insertion mode. u. Make sure that the vi-mode `C' and `c' commands enter insert mode even if the motion command doesn't have any effect. v. Fixed several potential memory leaks in the callback mode context handling. w. If readline is handling a SIGTTOU, make sure SIGTTOU is blocked while executing the terminal cleanup code, since it's no longer run in a signal handling context. x. Fixed a bug that could cause an application with an application-specific redisplay function to crash if the line data structures had not been initialized. y. Terminals that are named "dumb" or unknown do not enable bracketed paste by default. z. Ensure that disabling bracketed paste turns off highlighting the incremental search string when the search is successful. 2. New Features in Readline a. If a second consecutive completion attempt produces matches where the first did not, treat it as a new completion attempt and insert a match as appropriate. b. Bracketed paste mode works in more places: incremental search strings, vi overstrike mode, character search, and reading numeric arguments. c. Readline automatically switches to horizontal scrolling if the terminal has only one line. d. Unbinding all key sequences bound to a particular readline function now descends into keymaps for multi-key sequences. e. rl-clear-display: new bindable command that clears the screen and, if possible, the scrollback buffer (bound to emacs mode M-C-l by default). f. New active mark and face feature: when enabled, it will highlight the text inserted by a bracketed paste (the `active region') and the text found by incremental and non-incremental history searches. This is tied to bracketed paste and can be disabled by turning off bracketed paste. g. Readline sets the mark in several additional commands. h. Bracketed paste mode is enabled by default. There is a configure-time option (--enable-bracketed-paste-default) to set the default to on or off. i. Readline tries to take advantage of the more regular structure of UTF-8 characters to identify the beginning and end of characters when moving through the line buffer. j. The bindable operate-and-get-next command (and its default bindings) are now part of readline instead of a bash-specific addition. k. The signal cleanup code now blocks SIGINT while processing after a SIGINT. ------------------------------------------------------------------------------- This document details the changes between this version, readline-8.0, and the previous version, readline-7.0. 1. Changes to Readline a. Added a guard to prevent nested macros from causing an infinite expansion loop. b. Instead of allocating enough history list entries to hold the maximum list size, cap the number allocated initially. c. Added a strategy to avoid allocating huge amounts of memory if a block of history entries without timestamps occurs after a block with timestamps. d. Added support for keyboard timeouts when an ESC character is the last character in a macro. e. There are several performance improvements when in a UTF-8 locale. f. Readline does a better job of preserving the original set of blocked signals when using pselect() to wait for input. g. Fixed a bug that caused multibyte characters in macros to be mishandled. h. Fixed several bugs in the code that calculates line breaks when expanding prompts that span several lines, contain multibyte characters, and contain invisible character seqeuences. i. Fixed several bugs in cursor positioning when displaying lines with prompts containing invisible characters and multibyte characters. j. When performing case-insensitive completion, Readline no longer sorts the list of matches unless directed to do so. k. Fixed a problem with key sequences ending with a backslash. l. Fixed out-of-bounds and free memory read errors found via fuzzing. m. Fixed several cases where the mark was set to an invalid value. n. Fixed a problem with the case-changing operators in the case where the lower and upper case versions of a character do not have the same number of bytes. o. Handle incremental and non-incremental search character reads returning EOF. p. Handle the case where a failing readline command at the end of a multi-key sequence could be misinterpreted. q. The history library now prints a meaningful error message if the history file isn't a regular file. r. Fixed a problem with vi-mode redo (`.') on a command when trying to replace a multibyte character. s. The key binding code now attempts to remove a keymap if a key unbinding leaves it empty. t. Fixed a line-wrapping issue that caused problems for some terminal emulators. u. If there is a key bound to the tty's VDISCARD special character, readline disables VDISCARD while it is active. v. Fixed a problem with exiting bracketed paste mode on terminals that assume the bracketed paste mode character sequence contains visible characters. w. Fixed a bug that could cause a key binding command to refer to an uninitialized variable. x. Added more UTF-8-specific versions of multibyte functions, and optimized existing functions if the current locale uses UTF-8 encoding. y. Fixed a problem with bracketed-paste inserting more than one character and interacting with other readline functions. z. Fixed a bug that caused the history library to attempt to append a history line to a non-existent history entry. aa. If using bracketed paste mode, output a newline after the \r that is the last character of the mode disable string to avoid overwriting output. bb. Fixes to the vi-mode `b', `B', `w', `W', `e', and `E' commands to better handle multibyte characters. cc. Fixed a redisplay problem that caused an extra newline to be generated on accept-line when the line length is exactly the screenwidth. dd. Fixed a bug with adding multibyte characters to an incremental search string. ee. Fixed a bug with redoing text insertions in vi mode. ff. Fixed a bug with pasting text into an incremental search string if bracketed paste mode is enabled. ESC cannot be one of the incremental search terminator characters for this to work. gg. Fixed a bug with anchored search patterns when performing searches in vi mode. 2. New Features in Readline a. Non-incremental vi-mode search (`N', `n') can search for a shell pattern, as Posix specifies (uses fnmatch(3) if available). b. There are new `next-screen-line' and `previous-screen-line' bindable commands, which move the cursor to the same column in the next, or previous, physical line, respectively. c. There are default key bindings for control-arrow-key key combinations. d. A negative argument (-N) to `quoted-insert' means to insert the next N characters using quoted-insert. e. New public function: rl_check_signals(), which allows applications to respond to signals that readline catches while waiting for input using a custom read function. f. There is new support for conditionally testing the readline version in an inputrc file, with a full set of arithmetic comparison operators available. g. There is a simple variable comparison facility available for use within an inputrc file. Allowable operators are equality and inequality; string variables may be compared to a value; boolean variables must be compared to either `on' or `off'; variable names are separated from the operator by whitespace. h. The history expansion library now understands command and process substitution and extended globbing and allows them to appear anywhere in a word. i. The history library has a new variable that allows applications to set the initial quoting state, so quoting state can be inherited from a previous line. j. Readline now allows application-defined keymap names; there is a new public function, rl_set_keymap_name(), to do that. k. The "Insert" keypad key, if available, now puts readline into overwrite mode. ------------------------------------------------------------------------------- This document details the changes between this version, readline-7.0, and the previous version, readline-6.3. 1. Changes to Readline a. A bug that caused vi-mode `.' to be unable to redo `c', `d', and `y' commands with modifiers was fixed. b. Fixed a bug that caused callback mode to dump core when reading a multiple-key sequence (e.g., arrow keys). c. Fixed a bug that caused the redisplay code to erase some of the line when using horizontal scrolling with incremental search. d. Readline's input handler now performs signal processing if read(2) is interrupted by SIGALRM or SIGVTALRM. e. Fixed a problem with revert-all-at-newline freeing freed memory. f. Clarified the documentation for the history_quotes_inhibit_expansion variable to note that it inhibits scanning for the history comment character and that it only affects double-quoted strings. g. Fixed an off-by-one error in the prompt printed when performing searches. h. Use pselect(2), if available, to wait for input before calling read(2), so a SIGWINCH can interrupt it, since it doesn't interrupt read(2). i. Some memory leaks caused by signals interrupting filename completion have been fixed. j. Reading EOF twice on a non-empty line causes EOF to be returned, rather than the partial line. This can cause partial lines to be executed on SIGHUP, for example. k. Fixed a bug concerning deleting multibyte characters from the search string while performing an incremental search. l. Fixed a bug with tilde expanding directory names in filename completion. m. Fixed a bug that did not allow binding sequences beginning with a `\'. n. Fixed a redisplay bug involving incorrect line wrapping when the prompt contains a multibyte character in the last screen column. o. Fixed a bug that caused history expansion to disregard characters that are documented to delimit a history event specifier without requiring `:'. p. Fixed a bug that could cause reading past the end of a string when reading the value when binding the set of isearch terminators. q. Fixed a bug that caused readline commands that depend on knowing which key invoked them to misbehave when dispatching key sequences that are prefixes of other key bindings. r. Paren matching now works in vi insert mode. s. Colored completion prefixes are now displayed using a different color, less likely to collide with files. t. Fixed a bug that caused vi-mode character search to misbehave when running in callback mode. u. Fixed a bug that caused output to be delayed when input is coming from a macro in vi-mode. v. Fixed a bug that caused the vi-mode `.' command to misbehave when redoing a multi-key key sequence via a macro. w. Fixed a bug that caused problems with applications that supply their own input function when performing completion. x. When read returns -1/EIO when attempting to read a key, return an error instead of line termination back to the caller. y. Updated tty auditing feature based on patch from Red Hat. z. Fixed a bug that could cause the history library to crash on overflows introduced by malicious editing of timestamps in the history file. aa. The history file writing functions only attempt to create and use a backup history file if the history file exists and is a regular file. bb. Fixed an out-of-bounds read in readline's internal tilde expansion interface. cc. Fixed several redisplay bugs with prompt strings containing multibyte and non-visible characters whose physical length is longer than the screen width. dd. Fixed a redisplay bug with prompt strings containing invisible characters whose physical length exceeds the screen width and using incremental search. ee. Readline prints more descriptive error messages when it encounters errors while reading an inputrc file. ff. Fixed a bug in the character insertion code that attempts to optimize typeahead when it reads a character that is not bound to self-insert and resets the key sequence state. gg. When refreshing the line as the result of a key sequence, Readline attempts to redraw only the last line of a multiline prompt. hh. Fixed an issue that caused completion of git commands to display incorrectly when using colored-completion-prefix. ii. Fixed several redisplay bugs having to do with multibyte characters and invisible characters in prompt strings. jj. Fixed a bug that caused mode strings to be displayed incorrectly if the prompt was shorter than the mode string. 2. New Features in Readline a. The history truncation code now uses the same error recovery mechanism as the history writing code, and restores the old version of the history file on error. The error recovery mechanism handles symlinked history files. b. There is a new bindable variable, `enable-bracketed-paste', which enables support for a terminal's bracketed paste mode. c. The editing mode indicators can now be strings and are user-settable (new `emacs-mode-string', `vi-cmd-mode-string' and `vi-ins-mode-string' variables). Mode strings can contain invisible character sequences. Setting mode strings to null strings restores the defaults. d. Prompt expansion adds the mode string to the last line of a multi-line prompt (one with embedded newlines). e. There is a new bindable variable, `colored-completion-prefix', which, if set, causes the common prefix of a set of possible completions to be displayed in color. f. There is a new bindable command `vi-yank-pop', a vi-mode version of emacs- mode yank-pop. g. The redisplay code underwent several efficiency improvements for multibyte locales. h. The insert-char function attempts to batch-insert all pending typeahead that maps to self-insert, as long as it is coming from the terminal. i. rl_callback_sigcleanup: a new application function that can clean up and unset any state set by readline's callback mode. Intended to be used after a signal. j. If an incremental search string has its last character removed with DEL, the resulting empty search string no longer matches the previous line. k. If readline reads a history file that begins with `#' (or the value of the history comment character) and has enabled history timestamps, the history entries are assumed to be delimited by timestamps. This allows multi-line history entries. l. Readline now throws an error if it parses a key binding without a terminating `:' or whitespace. m. The default binding for ^W in vi mode now uses word boundaries specified by Posix (vi-unix-word-rubout is bindable command name). n. rl_clear_visible_line: new application-callable function; clears all screen lines occupied by the current visible readline line. o. rl_tty_set_echoing: application-callable function that controls whether or not readline thinks it is echoing terminal output. p. Handle >| and strings of digits preceding and following redirection specifications as single tokens when tokenizing the line for history expansion. q. Fixed a bug with displaying completions when the prefix display length is greater than the length of the completions to be displayed. r. The :p history modifier now applies to the entire line, so any expansion specifying :p causes the line to be printed instead of expanded. s. New application-callable function: rl_pending_signal(): returns the signal number of any signal readline has caught but not yet handled. t. New application-settable variable: rl_persistent_signal_handlers: if set to a non-zero value, readline will enable the readline-6.2 signal handler behavior in callback mode: handlers are installed when rl_callback_handler_install is called and removed removed when a complete line has been read. ------------------------------------------------------------------------------- This document details the changes between this version, readline-6.3, and the previous version, readline-6.2. 1. Changes to Readline a. Fixed a bug that did not allow the `dd', `cc', or `yy' vi editing mode commands to work on the entire line. b. Fixed a bug that caused redisplay problems with prompts longer than 128 characters and history searches. c. Fixed a bug that caused readline to try and run code to modify its idea of the screen size in a signal handler context upon receiving a SIGWINCH. d. Fixed a bug that caused the `meta' key to be enabled beyond the duration of an individual call top readline(). e. Added a workaround for a wcwidth bug in Mac OS X that caused readline's redisplay to mishandle zero-width combining characters. f. Fixed a bug that caused readline to `forget' part of a key sequence when a multiple-key sequence caused it to break out of an incremental search. g. Fixed bugs that caused readline to execute code in a signal handler context if interrupted while reading from the file system during completion. h. Fixed a bug that caused readline to `forget' part of a key sequence when reading an unbound multi-character key sequence. i. Fixed a bug that caused Readline's signal handlers to be installed beyond the bounds of a single call to readline(). j. Fixed a bug that caused the `.' command to not redo the most recent `R' command in vi mode. k. Fixed a bug that caused ignoring case in completion matches to result in readline using the wrong match. l. Paren matching now works in vi insert mode. m. Fix menu-completion to make show-all-if-ambiguous and menu-complete-display-prefix work together. n. Fixed a bug that didn't allow the `cc', `dd', or `yy' commands to be redone in vi editing mode. o. Fixed a bug that caused the filename comparison code to not compare multibyte characters correctly when using case-sensitive or case-mapping comparisons. p. Fixed the input reading loop to call the input hook function only when there is no terminal input available. q. Fixed a bug that caused binding a macro to a multi-character key sequence where the sequence and macro value share a common prefix to not perform the macro replacement. r. Fixed several redisplay errors with multibyte characters and prompts containing invisible characters when using horizontal scrolling. s. Fixed a bug that caused redisplay errors when trying to overwrite existing characters using multibyte characters. t. Fixed a bug in vi mode that caused the arrow keys to set the saved last vi-mode command to the wrong value. u. Fixed a bug that caused double-quoted strings to be scanned incorrectly when being used as the value of a readline variable assignment. v. Fixed a bug with vi mode that prevented `.' from repeating a command entered on a previous line (command). w. Fixed a bug that could cause completion to core dump if it was interrupted by a signal. x. Fixed a bug that could cause readline to crash and seg fault attempting to expand an empty history entry. y. Fixed a bug that caused display problems with multi-line prompts containing invisible characters on multiple lines. z. Fixed a bug that caused effects made by undoing changes to a history line to be discarded. 2. New Features in Readline a. Readline is now more responsive to SIGHUP and other fatal signals when reading input from the terminal or performing word completion but no longer attempts to run any not-allowable functions from a signal handler context. b. There are new bindable commands to search the history for the string of characters between the beginning of the line and the point (history-substring-search-forward, history-substring-search-backward) c. Readline allows quoted strings as the values of variables when setting them with `set'. As a side effect, trailing spaces and tabs are ignored when setting a string variable's value. d. The history library creates a backup of the history file when writing it and restores the backup on a write error. e. New application-settable variable: rl_filename_stat_hook: a function called with a filename before using it in a call to stat(2). Bash uses it to expand shell variables so things like $HOME/Downloads have a slash appended. f. New bindable function `print-last-kbd-macro', prints the most-recently- defined keyboard macro in a reusable format. g. New user-settable variable `colored-stats', enables use of colored text to denote file types when displaying possible completions (colored analog of visible-stats). h. New user-settable variable `keyseq-timout', acts as an inter-character timeout when reading input or incremental search strings. i. New application-callable function: rl_clear_history. Clears the history list and frees all readline-associated private data. j. New user-settable variable, show-mode-in-prompt, adds a characters to the beginning of the prompt indicating the current editing mode. k. New application-settable variable: rl_input_available_hook; function to be called when readline needs to check whether there is data available on its input source. The default hook checks rl_instream. l. Readline calls an application-set event hook (rl_signal_event_hook) after it gets a signal while reading input (read returns -1/EINTR but readline does not handle the signal immediately) to allow the application to handle or otherwise note it. Not currently called for SIGHUP or SIGTERM. m. If the user-settable variable `history-size' is set to a value less than 0, the history list size is unlimited. n. When creating shared libraries on Mac OS X, the pathname written into the library (install_name) no longer includes the minor version number. ------------------------------------------------------------------------------- This document details the changes between this version, readline-6.2, and the previous version, readline-6.1. 1. Changes to Readline a. Fixed a bug that caused the unconverted filename to be added to the list of completions when the application specified filename conversion functions. b. Fixed a bug that caused the wrong filename to be passed to opendir when the application has specified a filename dequoting function. c. Fixed a bug when repeating a character search in vi mode in the case where there was no search to repeat. d. When show-all-if-ambiguous is set, the completion routines no longer insert a common match prefix that is shorter than the text being completed. e. The full set of vi editing commands may now be used in callback mode. f. Fixed a bug that caused readline to not update its idea of the terminal dimensions while running in `no-echo' mode. h. Fixed a bug that caused readline to dump core if an application called rl_prep_terminal without setting rl_instream. i. Fixed a bug that caused meta-prefixed characters bound to incremental search forward or backward to not be recognized if they were typed subsequently. j. The incremental search code treats key sequences that map to the same functions as (default) ^G, ^W, and ^Y as equivalent to those characters. k. Fixed a bug in menu-complete that caused it to misbehave with large negative argument. l. Fixed a bug that caused vi-mode yank-last-arg to ring the bell when invoked at the end of the line. m. Fixed a bug that made an explicit argument of 0 to yank-last-arg behave as if it were a negative argument. n. Fixed a bug that caused directory names in words to be completed to not be dequoted correctly. 2. New Features in Readline a. The history library does not try to write the history filename in the current directory if $HOME is unset. This closes a potential security problem if the application does not specify a history filename. b. New bindable variable `completion-display-width' to set the number of columns used when displaying completions. c. New bindable variable `completion-case-map' to cause case-insensitive completion to treat `-' and `_' as identical. d. There are new bindable vi-mode command names to avoid readline's case- insensitive matching not allowing them to be bound separately. e. New bindable variable `menu-complete-display-prefix' causes the menu completion code to display the common prefix of the possible completions before cycling through the list, instead of after. ------------------------------------------------------------------------------- This document details the changes between this version, readline-6.1, and the previous version, readline-6.0. 1. Changes to Readline a. The SIGWINCH signal handler now avoids calling the redisplay code if one arrives while in the middle of redisplay. b. Changes to the timeout code to make sure that timeout values greater than one second are handled better. c. Fixed a bug in the redisplay code that was triggered by a prompt containing invisible characters exactly the width of the screen. d. Fixed a bug in the redisplay code encountered when running in horizontal scroll mode. e. Fixed a bug that prevented menu completion from properly completing filenames. f. Fixed a redisplay bug caused by a multibyte character causing a line to wrap. g. Fixed a bug that caused key sequences of two characters to not be recognized when a longer sequence identical in the first two characters was bound. h. Fixed a bug that caused history expansion to be attempted on $'...' single-quoted strings. i. Fixed a bug that caused incorrect redisplay when the prompt contained multibyte characters in an `invisible' sequence bracketed by \[ and \]. j. Fixed a bug that caused history expansion to short-circuit after encountering a multibyte character. k. Fixed a bug that caused applications using the callback interface to not react to SIGINT (or other signals) until another character arrived. 2. New Features in Readline a. New bindable function: menu-complete-backward. b. In the vi insertion keymap, C-n is now bound to menu-complete by default, and C-p to menu-complete-backward. c. When in vi command mode, repeatedly hitting ESC now does nothing, even when ESC introduces a bound key sequence. This is closer to how historical vi behaves. d. New bindable function: skip-csi-sequence. Can be used as a default to consume key sequences generated by keys like Home and End without having to bind all keys. e. New application-settable function: rl_filename_rewrite_hook. Can be used to rewrite or modify filenames read from the file system before they are compared to the word to be completed. f. New bindable variable: skip-completed-text, active when completing in the middle of a word. If enabled, it means that characters in the completion that match characters in the remainder of the word are "skipped" rather than inserted into the line. g. The pre-readline-6.0 version of menu completion is available as "old-menu-complete" for users who do not like the readline-6.0 version. h. New bindable variable: echo-control-characters. If enabled, and the tty ECHOCTL bit is set, controls the echoing of characters corresponding to keyboard-generated signals. i. New bindable variable: enable-meta-key. Controls whether or not readline sends the smm/rmm sequences if the terminal indicates it has a meta key that enables eight-bit characters. ------------------------------------------------------------------------------- This document details the changes between this version, readline-6.0, and the previous version, readline-5.2. 1. Changes to Readline a. Fixed a number of redisplay errors in environments supporting multibyte characters. b. Fixed bugs in vi command mode that caused motion commands to inappropriately set the mark. c. When using the arrow keys in vi insertion mode, readline allows movement beyond the current end of the line (unlike command mode). d. Fixed bugs that caused readline to loop when the terminal has been taken away and reads return -1/EIO. e. Fixed bugs in redisplay occurring when displaying prompts containing invisible characters. f. Fixed a bug that caused the completion append character to not be reset to the default after an application-specified completion function changed it. g. Fixed a problem that caused incorrect positioning of the cursor while in emacs editing mode when moving forward at the end of a line while using a locale supporting multibyte characters. h. Fixed an off-by-one error that caused readline to drop every 511th character of buffered input. i. Fixed a bug that resulted in SIGTERM not being caught or cleaned up. j. Fixed redisplay bugs caused by multiline prompts with invisible characters or no characters following the final newline. k. Fixed redisplay bug caused by prompts consisting solely of invisible characters. l. Fixed a bug in the code that buffers characters received very quickly in succession which caused characters to be dropped. m. Fixed a bug that caused readline to reference uninitialized data structures if it received a SIGWINCH before completing initialization. n. Fixed a bug that caused the vi-mode `last command' to be set incorrectly and therefore unrepeatable. o. Fixed a bug that caused readline to disable echoing when it was being used with an output file descriptor that was not a terminal. p. Readline now blocks SIGINT while manipulating internal data structures during redisplay. q. Fixed a bug in redisplay that caused readline to segfault when pasting a very long line (over 130,000 characters). r. Fixed bugs in redisplay when using prompts with no visible printing characters. s. Fixed a bug that caused redisplay errors when using prompts with invisible characters and numeric arguments to a command in a multibyte locale. t. Fixed a bug that caused redisplay errors when using prompts with invisible characters spanning more than two physical screen lines. 2. New Features in Readline a. A new variable, rl_sort_completion_matches; allows applications to inhibit match list sorting (but beware: some things don't work right if applications do this). b. A new variable, rl_completion_invoking_key; allows applications to discover the key that invoked rl_complete or rl_menu_complete. c. The functions rl_block_sigint and rl_release_sigint are now public and available to calling applications who want to protect critical sections (like redisplay). d. The functions rl_save_state and rl_restore_state are now public and available to calling applications; documented rest of readline's state flag values. e. A new user-settable variable, `history-size', allows setting the maximum number of entries in the history list. f. There is a new implementation of menu completion, with several improvements over the old; the most notable improvement is a better `completions browsing' mode. g. The menu completion code now uses the rl_menu_completion_entry_function variable, allowing applications to provide their own menu completion generators. h. There is support for replacing a prefix of a pathname with a `...' when displaying possible completions. This is controllable by setting the `completion-prefix-display-length' variable. Matches with a common prefix longer than this value have the common prefix replaced with `...'. i. There is a new `revert-all-at-newline' variable. If enabled, readline will undo all outstanding changes to all history lines when `accept-line' is executed. ------------------------------------------------------------------------------- This document details the changes between this version, readline-5.2, and the previous version, readline-5.1. 1. Changes to Readline a. Fixed a problem that caused segmentation faults when using readline in callback mode and typing consecutive DEL characters on an empty line. b. Fixed several redisplay problems with multibyte characters, all having to do with the different code paths and variable meanings between single-byte and multibyte character redisplay. c. Fixed a problem with key sequence translation when presented with the sequence \M-\C-x. d. Fixed a problem that prevented the `a' command in vi mode from being undone and redone properly. e. Fixed a problem that prevented empty inserts in vi mode from being undone properly. f. Fixed a problem that caused readline to initialize with an incorrect idea of whether or not the terminal can autowrap. g. Fixed output of key bindings (like bash `bind -p') to honor the setting of convert-meta and use \e where appropriate. h. Changed the default filename completion function to call the filename dequoting function if the directory completion hook isn't set. This means that any directory completion hooks need to dequote the directory name, since application-specific hooks need to know how the word was quoted, even if no other changes are made. i. Fixed a bug with creating the prompt for a non-interactive search string when there are non-printing characters in the primary prompt. j. Fixed a bug that caused prompts with invisible characters to be redrawn multiple times in a multibyte locale. k. Fixed a bug that could cause the key sequence scanning code to return the wrong function. l. Fixed a problem with the callback interface that caused it to fail when using multi-character keyboard macros. m. Fixed a bug that could cause a core dump when an edited history entry was re-executed under certain conditions. n. Fixed a bug that caused readline to reference freed memory when attmpting to display a portion of the prompt. o. Fixed a bug with prompt redisplay in a multi-byte locale to avoid redrawing the prompt and input line multiple times. p. Fixed history expansion to not be confused by here-string redirection. q. Readline no longer treats read errors by converting them to newlines, as it does with EOF. This caused partial lines to be returned from readline(). r. Fixed a redisplay bug that occurred in multibyte-capable locales when the prompt was one character longer than the screen width. 2. New Features in Readline a. Calling applications can now set the keyboard timeout to 0, allowing poll-like behavior. b. The value of SYS_INPUTRC (configurable at compilation time) is now used as the default last-ditch startup file. c. The history file reading functions now allow windows-like \r\n line terminators. ------------------------------------------------------------------------------- This document details the changes between this version, readline-5.1, and the previous version, readline-5.0. 1. Changes to Readline a. Fixed a bug that caused multiliine prompts to be wrapped and displayed incorrectly. b. Fixed a bug that caused ^P/^N in emacs mode to fail to display the current line correctly. c. Fixed a problem in computing the number of invisible characters on the first line of a prompt whose length exceeds the screen width. d. Fixed vi-mode searching so that failure preserves the current line rather than the last line in the history list. e. Fixed the vi-mode `~' command (change-case) to have the correct behavior at end-of-line when manipulating multibyte characters. f. Fixed the vi-mode `r' command (change-char) to have the correct behavior at end-of-line when manipulating multibyte characters. g. Fixed multiple bugs in the redisplay of multibyte characters: displaying prompts longer than the screen width containing multibyte characters, h. Fix the calculation of the number of physical characters in the prompt string when it contains multibyte characters. i. A non-zero value for the `rl_complete_suppress_append' variable now causes no `/' to be appended to a directory name. j. Fixed forward-word and backward-word to work when words contained multibyte characters. k. Fixed a bug in finding the delimiter of a `?' substring when performing history expansion in a locale that supports multibyte characters. l. Fixed a memory leak caused by not freeing the timestamp in a history entry. m. Fixed a bug that caused "\M-x" style key bindings to not obey the setting of the `convert-meta' variable. n. Fixed saving and restoring primary prompt when prompting for incremental and non-incremental searches; search prompts now display multibyte characters correctly. o. Fixed a bug that caused keys originally bound to self-insert but shadowed by a multi-character key sequence to not be inserted. p. Fixed code so rl_prep_term_function and rl_deprep_term_function aren't dereferenced if NULL (matching the documentation). q. Extensive changes to readline to add enough state so that commands requiring additional characters (searches, multi-key sequences, numeric arguments, commands requiring an additional specifier character like vi-mode change-char, etc.) work without synchronously waiting for additional input. r. Lots of changes so readline builds and runs on MinGW. s. Readline no longer tries to modify the terminal settings when running in callback mode. t. The Readline display code no longer sets the location of the last invisible character in the prompt if the \[\] sequence is empty. u. The `change-case' command now correctly changes the case of multibyte characters. v. Changes to the shared library construction scripts to deal with Windows DLL naming conventions for Cygwin. w. Fixed the redisplay code to avoid core dumps resulting from a poorly-timed SIGWINCH. x. Fixed the non-incremental search code in vi mode to dispose of any current undo list when copying a line from the history into the current editing buffer. y. Fixed a bug that caused reversing the incremental search direction to not work correctly. z. Fixed the vi-mode `U' command to only undo up to the first time insert mode was entered, as Posix specifies. aa. Fixed a bug in the vi-mode `r' command that left the cursor in the wrong place. bb. Fixed a redisplay bug caused by moving the cursor vertically to a line with invisible characters in the prompt in a multibyte locale. cc. Fixed a bug that could cause the terminal special chars to be bound in the wrong keymap in vi mode. 2. New Features in Readline a. The key sequence sent by the keypad `delete' key is now automatically bound to delete-char. b. A negative argument to menu-complete now cycles backward through the completion list. c. A new bindable readline variable: bind-tty-special-chars. If non-zero, readline will bind the terminal special characters to their readline equivalents when it's called (on by default). d. New bindable command: vi-rubout. Saves deleted text for possible reinsertion, as with any vi-mode `text modification' command; `X' is bound to this in vi command mode. e. If the rl_completion_query_items is set to a value < 0, readline never asks the user whether or not to view the possible completions. f. The `C-w' binding in incremental search now understands multibyte characters. g. New application-callable auxiliary function, rl_variable_value, returns a string corresponding to a readline variable's value. h. When parsing inputrc files and variable binding commands, the parser strips trailing whitespace from values assigned to boolean variables before checking them. i. A new external application-controllable variable that allows the LINES and COLUMNS environment variables to set the window size regardless of what the kernel returns. ------------------------------------------------------------------------------- This document details the changes between this version, readline-5.0, and the previous version, readline-4.3. 1. Changes to Readline a. Fixes to avoid core dumps because of null pointer references in the multibyte character code. b. Fix to avoid infinite recursion caused by certain key combinations. c. Fixed a bug that caused the vi-mode `last command' to be set incorrectly. d. Readline no longer tries to read ahead more than one line of input, even when more is available. e. Fixed the code that adjusts the point to not mishandle null wide characters. f. Fixed a bug in the history expansion `g' modifier that caused it to skip every other match. g. Fixed a bug that caused the prompt to overwrite previous output when the output doesn't contain a newline and the locale supports multibyte characters. This same change fixes the problem of readline redisplay slowing down dramatically as the line gets longer in multibyte locales. h. History traversal with arrow keys in vi insertion mode causes the cursor to be placed at the end of the new line, like in emacs mode. i. The locale initialization code does a better job of using the right precedence and defaulting when checking the appropriate environment variables. j. Fixed the history word tokenizer to handle <( and >( better when used as part of bash. k. The overwrite mode code received several bug fixes to improve undo. l. Many speedups to the multibyte character redisplay code. m. The callback character reading interface should not hang waiting to read keyboard input. n. Fixed a bug with redoing vi-mode `s' command. o. The code that initializes the terminal tracks changes made to the terminal special characters with stty(1) (or equivalent), so that these changes are reflected in the readline bindings. New application-callable function to make it work: rl_tty_unset_default_bindings(). p. Fixed a bug that could cause garbage to be inserted in the buffer when changing character case in vi mode when using a multibyte locale. q. Fixed a bug in the redisplay code that caused problems on systems supporting multibyte characters when moving between history lines when the new line has more glyphs but fewer bytes. r. Undo and redo now work better after exiting vi insertion mode. s. Make sure system calls are restarted after a SIGWINCH is received using SA_RESTART. t. Improvements to the code that displays possible completions when using multibyte characters. u. Fixed a problem when parsing nested if statements in inputrc files. v. The completer now takes multibyte characters into account when looking for quoted substrings on which to perform completion. w. The history search functions now perform better bounds checking on the history list. x. Change to history expansion functions to treat `^' as equivalent to word one, as the documentation states. y. Some changes to the display code to improve display and redisplay of multibyte characters. z. Changes to speed up the multibyte character redisplay code. aa. Fixed a bug in the vi-mode `E' command that caused it to skip over the last character of a word if invoked while point was on the word's next-to-last character. bb. Fixed a bug that could cause incorrect filename quoting when case-insensitive completion was enabled and the word being completed contained backslashes quoting word break characters. cc. Fixed a bug in redisplay triggered when the prompt string contains invisible characters. dd. Fixed some display (and other) bugs encountered in multibyte locales when a non-ascii character was the last character on a line. ee. Fixed some display bugs caused by multibyte characters in prompt strings. ff. Fixed a problem with history expansion caused by non-whitespace characters used as history word delimiters. gg. Fixed a problem that could cause readline to refer to freed memory when moving between history lines while doing searches. hh. Improvements to the code that expands and displays prompt strings containing multibyte characters. ii. Fixed a problem with vi-mode not correctly remembering the numeric argument to the last `c'hange command for later use with `.'. jj. Fixed a bug in vi-mode that caused multi-digit count arguments to work incorrectly. kk. Fixed a problem in vi-mode that caused the last text modification command to not be remembered across different command lines. ll. Fixed problems with changing characters and changing case at the end of the line. mm. Fixed a problem with readline saving the contents of the current line before beginning a non-interactive search. nn. Fixed a problem with EOF detection when using rl_event_hook. oo. Fixed a problem with the vi mode `p' and `P' commands ignoring numeric arguments. 2. New Features in Readline a. History expansion has a new `a' modifier equivalent to the `g' modifier for compatibility with the BSD csh. b. History expansion has a new `G' modifier equivalent to the BSD csh `g' modifier, which performs a substitution once per word. c. All non-incremental search operations may now undo the operation of replacing the current line with the history line. d. The text inserted by an `a' command in vi mode can be reinserted with `.'. e. New bindable variable, `show-all-if-unmodified'. If set, the readline completer will list possible completions immediately if there is more than one completion and partial completion cannot be performed. f. There is a new application-callable `free_history_entry()' function. g. History list entries now contain timestamp information; the history file functions know how to read and write timestamp information associated with each entry. h. Four new key binding functions have been added: rl_bind_key_if_unbound() rl_bind_key_if_unbound_in_map() rl_bind_keyseq_if_unbound() rl_bind_keyseq_if_unbound_in_map() i. New application variable, rl_completion_quote_character, set to any quote character readline finds before it calls the application completion function. j. New application variable, rl_completion_suppress_quote, settable by an application completion function. If set to non-zero, readline does not attempt to append a closing quote to a completed word. k. New application variable, rl_completion_found_quote, set to a non-zero value if readline determines that the word to be completed is quoted. Set before readline calls any application completion function. l. New function hook, rl_completion_word_break_hook, called when readline needs to break a line into words when completion is attempted. Allows the word break characters to vary based on position in the line. m. New bindable command: unix-filename-rubout. Does the same thing as unix-word-rubout, but adds `/' to the set of word delimiters. n. When listing completions, directories have a `/' appended if the `mark-directories' option has been enabled. ------------------------------------------------------------------------------- This document details the changes between this version, readline-4.3, and the previous version, readline-4.2a. 1. Changes to Readline a. Fixed output of comment-begin character when listing variable values. b. Added some default key bindings for common escape sequences produced by HOME and END keys. c. Fixed the mark handling code to be more emacs-compatible. d. A bug was fixed in the code that prints possible completions to keep it from printing empty strings in certain circumstances. e. Change the key sequence printing code to print ESC as M\- if ESC is a meta-prefix character -- it's easier for users to understand than \e. f. Fixed unstifle_history() to return values that match the documentation. g. Fixed the event loop (rl_event_hook) to handle the case where the input file descriptor is invalidated. h. Fixed the prompt display code to work better when the application has a custom redisplay function. i. Changes to make reading and writing the history file a little faster, and to cope with huge history files without calling abort(3) from xmalloc. j. The vi-mode `S' and `s' commands are now undone correctly. k. Fixed a problem which caused the display to be messed up when the last line of a multi-line prompt (possibly containing invisible characters) was longer than the screen width. 2. New Features in Readline a. Support for key `subsequences': allows, e.g., ESC and ESC-a to both be bound to readline functions. Now the arrow keys may be used in vi insert mode. b. When listing completions, and the number of lines displayed is more than the screen length, readline uses an internal pager to display the results. This is controlled by the `page-completions' variable (default on). c. New code to handle editing and displaying multibyte characters. d. The behavior introduced in bash-2.05a of deciding whether or not to append a slash to a completed name that is a symlink to a directory has been made optional, controlled by the `mark-symlinked-directories' variable (default is the 2.05a behavior). e. The `insert-comment' command now acts as a toggle if given a numeric argument: if the first characters on the line don't specify a comment, insert one; if they do, delete the comment text f. New application-settable completion variable: rl_completion_mark_symlink_dirs, allows an application's completion function to temporarily override the user's preference for appending slashes to names which are symlinks to directories. g. New function available to application completion functions: rl_completion_mode, to tell how the completion function was invoked and decide which argument to supply to rl_complete_internal (to list completions, etc.). h. Readline now has an overwrite mode, toggled by the `overwrite-mode' bindable command, which could be bound to `Insert'. i. New application-settable completion variable: rl_completion_suppress_append, inhibits appending of rl_completion_append_character to completed words. j. New key bindings when reading an incremental search string: ^W yanks the currently-matched word out of the current line into the search string; ^Y yanks the rest of the current line into the search string, DEL or ^H deletes characters from the search string. ------------------------------------------------------------------------------- This document details the changes between this version, readline-4.2a, and the previous version, readline-4.2. 1. Changes to Readline a. More `const' and type casting fixes. b. Changed rl_message() to use vsnprintf(3) (if available) to fix buffer overflow problems. c. The completion code no longer appends a `/' or ` ' to a match when completing a symbolic link that resolves to a directory name, unless the match does not add anything to the word being completed. This means that a tab will complete the word up to the full name, but not add anything, and a subsequent tab will add a slash. d. Fixed a trivial typo that made the vi-mode `dT' command not work. e. Fixed the tty code so that ^S and ^Q can be inserted with rl_quoted_insert. f. Fixed the tty code so that ^V works more than once. g. Changed the use of __P((...)) for function prototypes to PARAMS((...)) because the use of __P in typedefs conflicted g++ and glibc. h. The completion code now attempts to do a better job of preserving the case of the word the user typed if ignoring case in completions. i. Readline defaults to not echoing the input and lets the terminal initialization code enable echoing if there is a controlling terminal. j. The key binding code now processes only two hex digits after a `\x' escape sequence, and the documentation was changed to note that the octal and hex escape sequences result in an eight-bit value rather than strict ASCII. k. Fixed a few places where negative array subscripts could have occurred. l. Fixed the vi-mode code to use a better method to determine the bounds of the array used to hold the marks, and to avoid out-of-bounds references. m. Fixed the defines in chardefs.h to work better when chars are signed. n. Fixed configure.in to use the new names for bash autoconf macros. o. Readline no longer attempts to define its own versions of some ctype macros if they are implemented as functions in libc but not as macros in . p. Fixed a problem where rl_backward could possibly set point to before the beginning of the line. q. Fixed Makefile to not put -I/usr/include into CFLAGS, since it can cause include file problems. 2. New Features in Readline a. Added extern declaration for rl_get_termcap to readline.h, making it a public function (it was always there, just not in readline.h). b. New #defines in readline.h: RL_READLINE_VERSION, currently 0x0402, RL_VERSION_MAJOR, currently 4, and RL_VERSION_MINOR, currently 2. c. New readline variable: rl_readline_version, mirrors RL_READLINE_VERSION. d. New bindable boolean readline variable: match-hidden-files. Controls completion of files beginning with a `.' (on Unix). Enabled by default. e. The history expansion code now allows any character to terminate a `:first-' modifier, like csh. f. The incremental search code remembers the last search string and uses it if ^R^R is typed without a search string. h. New bindable variable `history-preserve-point'. If set, the history code attempts to place the user at the same location on each history line retrieved with previous-history or next-history. ------------------------------------------------------------------------------- This document details the changes between this version, readline-4.2, and the previous version, readline-4.1. 1. Changes to Readline a. When setting the terminal attributes on systems using `struct termio', readline waits for output to drain before changing the attributes. b. A fix was made to the history word tokenization code to avoid attempts to dereference a null pointer. c. Readline now defaults rl_terminal_name to $TERM if the calling application has left it unset, and tries to initialize with the resultant value. d. Instead of calling (*rl_getc_function)() directly to get input in certain places, readline now calls rl_read_key() consistently. e. Fixed a bug in the completion code that allowed a backslash to quote a single quote inside a single-quoted string. f. rl_prompt is no longer assigned directly from the argument to readline(), but uses memory allocated by readline. This allows constant strings to be passed to readline without problems arising when the prompt processing code wants to modify the string. g. Fixed a bug that caused non-interactive history searches to return the wrong line when performing multiple searches backward for the same string. h. Many variables, function arguments, and function return values are now declared `const' where appropriate, to improve behavior when linking with C++ code. i. The control character detection code now works better on systems where `char' is unsigned by default. j. The vi-mode numeric argument is now capped at 999999, just like emacs mode. k. The Function, CPFunction, CPPFunction, and VFunction typedefs have been replaced with a set of specific prototyped typedefs, though they are still in the readline header files for backwards compatibility. m. Nearly all of the (undocumented) internal global variables in the library now have an _rl_ prefix -- there were a number that did not, like screenheight, screenwidth, alphabetic, etc. n. The ding() convenience function has been renamed to rl_ding(), though the old function is still defined for backwards compatibility. o. The completion convenience functions filename_completion_function, username_completion_function, and completion_matches now have an rl_ prefix, though the old names are still defined for backwards compatibility. p. The functions shared by readline and bash (linkage is satisfied from bash when compiling with bash, and internally otherwise) now have an sh_ prefix. q. Changed the shared library creation procedure on Linux and BSD/OS 4.x so that the `soname' contains only the major version number rather than the major and minor numbers. r. Fixed a redisplay bug that occurred when the prompt spanned more than one physical line and contained invisible characters. s. Added a missing `includedir' variable to the Makefile. t. When installing the shared libraries, make sure symbolic links are relative. u. Added configure test so that it can set `${MAKE}' appropriately. v. Fixed a bug in rl_forward that could cause the point to be set to before the beginning of the line in vi mode. w. Fixed a bug in the callback read-char interface to make it work when a readline function pushes some input onto the input stream with rl_execute_next (like the incremental search functions). x. Fixed a file descriptor leak in the history file manipulation code that was tripped when attempting to truncate a non-regular file (like /dev/null). y. Changes to make all of the exported readline functions declared in readline.h have an rl_ prefix (rltty_set_default_bindings is now rl_tty_set_default_bindings, crlf is now rl_crlf, etc.) z. The formatted documentation included in the base readline distribution is no longer removed on a `make distclean'. aa. Some changes were made to avoid gcc warnings with -Wall. bb. rl_get_keymap_by_name now finds keymaps case-insensitively, so `set keymap EMACS' works. cc. The history file writing and truncation functions now return a useful status on error. dd. Fixed a bug that could cause applications to dereference a NULL pointer if a NULL second argument was passed to history_expand(). ee. If a hook function assigned to rl_event_hook sets rl_done to a non-zero value, rl_read_key() now immediately returns '\n' (which is assumed to be bound to accept-line). 2. New Features in Readline a. The blink timeout for paren matching is now settable by applications, via the rl_set_paren_blink_timeout() function. b. _rl_executing_macro has been renamed to rl_executing_macro, which means it's now part of the public interface. c. Readline has a new variable, rl_readline_state, which is a bitmap that encapsulates the current state of the library; intended for use by callbacks and hook functions. d. rlfe has a new -l option to log input and output (-a appends to logfile), a new -n option to set the readline application name, and -v and -h options for version and help information. e. rlfe can now perform filename completion for the inferior process if the OS has a /proc//cwd that can be read with readlink(2) to get the inferior's current working directory. f. A new file, rltypedefs.h, contains the new typedefs for function pointers and is installed by `make install'. g. New application-callable function rl_set_prompt(const char *prompt): expands its prompt string argument and sets rl_prompt to the result. h. New application-callable function rl_set_screen_size(int rows, int cols): public method for applications to set readline's idea of the screen dimensions. i. The history example program (examples/histexamp.c) is now built as one of the examples. j. The documentation has been updated to cover nearly all of the public functions and variables declared in readline.h. k. New function, rl_get_screen_size (int *rows, int *columns), returns readline's idea of the screen dimensions. l. The timeout in rl_gather_tyi (readline keyboard input polling function) is now settable via a function (rl_set_keyboard_input_timeout()). m. Renamed the max_input_history variable to history_max_entries; the old variable is maintained for backwards compatibility. n. The list of characters that separate words for the history tokenizer is now settable with a variable: history_word_delimiters. The default value is as before. o. There is a new history.3 manual page documenting the history library. ------------------------------------------------------------------------------- This document details the changes between this version, readline-4.1, and the previous version, readline-4.0. 1. Changes to Readline a. Changed the HTML documents so that the table-of-contents is no longer a separate file. b. Changes to the shared object configuration for: Irix 5.x, Irix 6.x, OSF/1. c. The shared library major and minor versions are now constructed automatically by configure and substituted into the makefiles. d. It's now possible to install the shared libraries separately from the static libraries. e. The history library tries to truncate the history file only if it is a regular file. f. A bug that caused _rl_dispatch to address negative array indices on systems with signed chars was fixed. g. rl-yank-nth-arg now leaves the history position the same as when it was called. h. Changes to the completion code to handle MS-DOS drive-letter:pathname filenames. i. Completion is now case-insensitive by default on MS-DOS. j. Fixes to the history file manipulation code for MS-DOS. k. Readline attempts to bind the arrow keys to appropriate defaults on MS-DOS. l. Some fixes were made to the redisplay code for better operation on MS-DOS. m. The quoted-insert code will now insert tty special chars like ^C. n. A bug was fixed that caused the display code to reference memory before the start of the prompt string. o. More support for __EMX__ (OS/2). p. A bug was fixed in readline's signal handling that could cause infinite recursion in signal handlers. q. A bug was fixed that caused the point to be less than zero when rl_forward was given a very large numeric argument. r. The vi-mode code now gets characters via the application-settable value of rl_getc_function rather than calling rl_getc directly. s. The history file code now uses O_BINARY mode when reading and writing the history file on cygwin32. t. Fixed a bug in the redisplay code for lines with more than 256 line breaks. u. A bug was fixed which caused invisible character markers to not be stripped from the prompt string if the terminal was in no-echo mode. v. Readline no longer tries to get the variables it needs for redisplay from the termcap entry if the calling application has specified its own redisplay function. Readline treats the terminal as `dumb' in this case. w. Fixes to the SIGWINCH code so that a multiple-line prompt with escape sequences is redrawn correctly. x. Changes to the install and install-shared targets so that the libraries and header files are installed separately. 2. New Features in Readline a. A new Readline `user manual' is in doc/rluserman.texinfo. b. Parentheses matching is now always compiled into readline, and enabled or disabled when the value of the `blink-matching-paren' variable is changed. c. MS-DOS systems now use ~/_inputrc as the last-ditch inputrc filename. d. MS-DOS systems now use ~/_history as the default history file. e. history-search-{forward,backward} now leave the point at the end of the line when the string to search for is empty, like {reverse,forward}-search-history. f. history-search-{forward,backward} now leave the last history line found in the readline buffer if the second or subsequent search fails. g. New function for use by applications: rl_on_new_line_with_prompt, used when an application displays the prompt itself before calling readline(). h. New variable for use by applications: rl_already_prompted. An application that displays the prompt itself before calling readline() must set this to a non-zero value. i. A new variable, rl_gnu_readline_p, always 1. The intent is that an application can verify whether or not it is linked with the `real' readline library or some substitute. j. Per Bothner's `rlfe' (pronounced `Ralphie') readline front-end program is included in the examples subdirectory, though it is not built by default. ------------------------------------------------------------------------------- This document details the changes between this version, readline-4.0, and the previous version, readline-2.2. 1. Changes to Readline a. The version number is now 4.0, to match the major and minor version numbers on the shared readline and history libraries. Future releases will maintain the identical numbering. b. Fixed a typo in the `make install' recipe that copied libreadline.a to libhistory.old right after installing it. c. The readline and history info files are now installed out of the source directory if they are not found in the build directory. d. The library no longer exports a function named `savestring' -- backwards compatibility be damned. e. There is no longer any #ifdef SHELL code in the source files. f. Some changes were made to the key binding code to fix memory leaks and better support Win32 systems. g. Fixed a silly typo in the paren matching code -- it's microseconds, not milliseconds. h. The readline library should be compilable by C++ compilers. i. The readline.h public header file now includes function prototypes for all readline functions, and some changes were made to fix errors in the source files uncovered by the use of prototypes. j. The maximum numeric argument is now clamped at 1000000. k. Fixes to rl_yank_last_arg to make it behave better. l. Fixed a bug in the display code that caused core dumps if the prompt string length exceeded 1024 characters. m. The menu completion code was fixed to properly insert a single completion if there is only one match. n. A bug was fixed that caused the display code to improperly display tabs after newlines. o. A fix was made to the completion code in which a typo caused the wrong value to be passed to the function that computed the longest common prefix of the list of matches. p. The completion code now checks the value of rl_filename_completion_desired, which is set by application-supplied completion functions to indicate that filename completion is being performed, to decide whether or not to call an application-supplied `ignore completions' function. q. Code was added to the history library to catch history substitutions using `&' without a previous history substitution or search having been performed. 2. New Features in Readline a. There is a new script, support/shobj-conf, to do system-specific shared object and library configuration. It generates variables for configure to substitute into makefiles. The README file provides a detailed explanation of the shared library creation process. b. Shared libraries and objects are now built in the `shlib' subdirectory. There is a shlib/Makefile.in to control the build process. `make shared' from the top-level directory is still the right way to build shared versions of the libraries. c. rlconf.h is now installed, so applications can find out which features have been compiled into the installed readline and history libraries. d. rlstdc.h is now an installed header file. e. Many changes to the signal handling: o Readline now catches SIGQUIT and cleans up the tty before returning; o A new variable, rl_catch_signals, is available to application writers to indicate to readline whether or not it should install its own signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU; o A new variable, rl_catch_sigwinch, is available to application writers to indicate to readline whether or not it should install its own signal handler for SIGWINCH, which will chain to the calling applications's SIGWINCH handler, if one is installed; o There is a new function, rl_free_line_state, for application signal handlers to call to free up the state associated with the current line after receiving a signal; o There is a new function, rl_cleanup_after_signal, to clean up the display and terminal state after receiving a signal; o There is a new function, rl_reset_after_signal, to reinitialize the terminal and display state after an application signal handler returns and readline continues f. There is a new function, rl_resize_terminal, to reset readline's idea of the screen size after a SIGWINCH. g. New public functions: rl_save_prompt and rl_restore_prompt. These were previously private functions with a `_' prefix. These functions are used when an application wants to write a message to the `message area' with rl_message and have the prompt restored correctly when the message is erased. h. New function hook: rl_pre_input_hook, called just before readline starts reading input, after initialization. i. New function hook: rl_display_matches_hook, called when readline would display the list of completion matches. The new function rl_display_match_list is what readline uses internally, and is available for use by application functions called via this hook. j. New bindable function, delete-char-or-list, like tcsh. k. A new variable, rl_erase_empty_line, which, if set by an application using readline, will cause readline to erase, prompt and all, lines on which the only thing typed was a newline. l. There is a new script, support/shlib-install, to install and uninstall the shared readline and history libraries. m. A new bindable variable, `isearch-terminators', which is a string containing the set of characters that should terminate an incremental search without being executed as a command. n. A new bindable function, forward-backward-delete-char. ------------------------------------------------------------------------------- This document details the changes between this version, readline-2.2, and the previous version, readline-2.1. 1. Changes to Readline a. Added a missing `extern' to a declaration in readline.h that kept readline from compiling cleanly on some systems. b. The history file is now opened with mode 0600 when it is written for better security. c. Changes were made to the SIGWINCH handling code so that prompt redisplay is done better. d. ^G now interrupts incremental searches correctly. e. A bug that caused a core dump when the set of characters to be quoted when completing words was empty was fixed. f. Fixed a problem in the readline test program rltest.c that caused a core dump. g. The code that handles parser directives in inputrc files now displays more error messages. h. The history expansion code was fixed so that the appearance of the history comment character at the beginning of a word inhibits history expansion for that word and the rest of the input line. i. The code that prints completion listings now behaves better if one or more of the filenames contains non-printable characters. j. The time delay when showing matching parentheses is now 0.5 seconds. 2. New Features in Readline a. There is now an option for `iterative' yank-last-arg handline, so a user can keep entering `M-.', yanking the last argument of successive history lines. b. New variable, `print-completions-horizontally', which causes completion matches to be displayed across the screen (like `ls -x') rather than up and down the screen (like `ls'). c. New variable, `completion-ignore-case', which causes filename completion and matching to be performed case-insensitively. d. There is a new bindable command, `magic-space', which causes history expansion to be performed on the current readline buffer and a space to be inserted into the result. e. There is a new bindable command, `menu-complete', which enables tcsh-like menu completion (successive executions of menu-complete insert a single completion match, cycling through the list of possible completions). f. There is a new bindable command, `paste-from-clipboard', for use on Win32 systems, to insert the text from the Win32 clipboard into the editing buffer. g. The key sequence translation code now understands printf-style backslash escape sequences, including \NNN octal escapes. These escape sequences may be used in key sequence definitions or macro values. h. An `$include' inputrc file parser directive has been added. readline-8.3/histsearch.c000644 000436 000024 00000021635 14656457115 015556 0ustar00chetstaff000000 000000 /* histsearch.c -- searching the history list. */ /* Copyright (C) 1989, 1992-2009,2017,2021-2024 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. History 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 3 of the License, or (at your option) any later version. History 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 History. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_UNISTD_H) # ifdef _MINIX # include # endif # include #endif #if defined (HAVE_FNMATCH) # include #endif #include "history.h" #include "histlib.h" #include "xmalloc.h" #include "rlmbutil.h" /* The list of alternate characters that can delimit a history search string. */ char *history_search_delimiter_chars = (char *)NULL; static int history_search_internal (const char *, int, int, int); /* Search the history for STRING, starting at history_offset. If LISTDIR < 0, then the search is through previous entries, else through subsequent. If ANCHORED is non-zero, the string must appear at the beginning of a history line, otherwise, the string may appear anywhere in the line. If the search is not anchored, LINEDIR determines how the line is searched: if it is < 0, the search proceeds from the end of the line to the beginning, otherwise the substring search starts at the beginning of each history entry. If PATSEARCH is non-zero, and fnmatch(3) is available, fnmatch is used to match the string instead of a simple string comparison. If IGNORECASE is set, the string comparison is performed case-insensitively. If the string is found, then current_history () is the history entry, and the value of this function is the offset in the line of that history entry in which the string was found. Otherwise, nothing is changed, and a -1 is returned. */ static int history_search_internal (const char *string, int listdir, int linedir, int flags) { int i, reverse; char *line; size_t string_len, line_len; int line_index; /* can't be unsigned */ int anchored, patsearch, igncase; int found, mb_cur_max; HIST_ENTRY **the_history; /* local */ i = history_offset; reverse = (listdir < 0); anchored = (flags & ANCHORED_SEARCH); #if defined (HAVE_FNMATCH) patsearch = (flags & PATTERN_SEARCH); #else patsearch = 0; #endif igncase = (flags & CASEFOLD_SEARCH); /* Take care of trivial cases first. */ if (string == 0 || *string == '\0') return (-1); if (!history_length || ((i >= history_length) && !reverse)) return (-1); if (reverse && (i >= history_length)) i = history_length - 1; mb_cur_max = MB_CUR_MAX; #define NEXT_LINE() do { if (reverse) i--; else i++; } while (0) the_history = history_list (); string_len = strlen (string); while (1) { /* Search each line in the history list for STRING. */ /* At limit for direction? */ if ((reverse && i < 0) || (!reverse && i == history_length)) return (-1); line = the_history[i]->line; line_len = line_index = strlen (line); /* If STRING is longer than line, no match. */ if (patsearch == 0 && (string_len > line_index)) { NEXT_LINE (); continue; } /* Handle anchored searches first. */ if (anchored == ANCHORED_SEARCH) { found = 0; #if defined (HAVE_FNMATCH) if (patsearch) found = fnmatch (string, line, 0) == 0; else #endif if (igncase) { #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1) /* no rl_byte_oriented equivalent */ found = _rl_mb_strcaseeqn (string, string_len, line, line_len, string_len, 0); else #endif found = strncasecmp (string, line, string_len) == 0; } else found = STREQN (string, line, string_len); if (found) { history_offset = i; return (0); } NEXT_LINE (); continue; } /* Do substring search. */ if (linedir < 0) /* search backwards from end */ { size_t ll; ll = (patsearch == 0) ? string_len : 1; line_index -= ll; found = 0; while (line_index >= 0) { #if defined (HAVE_FNMATCH) if (patsearch) found = fnmatch (string, line + line_index, 0) == 0; else #endif if (igncase) { #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1) /* no rl_byte_oriented equivalent */ found = _rl_mb_strcaseeqn (string, string_len, line + line_index, ll, string_len, 0); else #endif found = strncasecmp (string, line + line_index, string_len) == 0; } else found = STREQN (string, line + line_index, string_len); if (found) { history_offset = i; return (line_index); } line_index--; ll++; } } else { register int limit; size_t ll; ll = line_len; limit = line_index - string_len + 1; line_index = 0; found = 0; while (line_index < limit) { #if defined (HAVE_FNMATCH) if (patsearch) found = fnmatch (string, line + line_index, 0) == 0; else #endif if (igncase) { #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1) /* no rl_byte_oriented equivalent */ found = _rl_mb_strcaseeqn (string, string_len, line + line_index, ll, string_len, 0); else #endif found = strncasecmp (string, line + line_index, string_len) == 0; } else found = STREQN (string, line + line_index, string_len); if (found) { history_offset = i; return (line_index); } line_index++; ll--; } } NEXT_LINE (); } } int _hs_history_patsearch (const char *string, int listdir, int linedir, int flags) { char *pat; size_t len, start; int ret, unescaped_backslash; #if defined (HAVE_FNMATCH) /* Assume that the string passed does not have a leading `^' and any anchored search request is captured in FLAGS */ len = strlen (string); ret = len - 1; /* fnmatch is required to reject a pattern that ends with an unescaped backslash */ if (unescaped_backslash = (string[ret] == '\\')) { while (ret > 0 && string[--ret] == '\\') unescaped_backslash = 1 - unescaped_backslash; } if (unescaped_backslash) return -1; pat = (char *)xmalloc (len + 3); /* If the search string is not anchored, we'll be calling fnmatch (assuming we have it). Prefix a `*' to the front of the search string so we search anywhere in the line. */ if ((flags & ANCHORED_SEARCH) == 0 && string[0] != '*') { pat[0] = '*'; start = 1; len++; } else { start = 0; } /* Attempt to reduce the number of searches by tacking a `*' onto the end of a pattern that doesn't have one. Assume a pattern that ends in a backslash contains an even number of trailing backslashes; we check above */ strcpy (pat + start, string); if (pat[len - 1] != '*') { pat[len] = '*'; /* XXX */ pat[len+1] = '\0'; } #else pat = string; #endif ret = history_search_internal (pat, listdir, linedir, flags|PATTERN_SEARCH); if (pat != string) xfree (pat); return ret; } /* Do a non-anchored search for STRING through the history list in direction LISTDIR. */ int history_search (const char *string, int listdir) { return (history_search_internal (string, listdir, listdir, NON_ANCHORED_SEARCH)); } /* Do an anchored search for string through the history list in direction LISTDIR. */ int history_search_prefix (const char *string, int listdir) { return (history_search_internal (string, listdir, listdir, ANCHORED_SEARCH)); } /* Perform a history search for STRING, letting the caller specify the flags. At some point, make this public for users of the history library. */ int _hs_history_search (const char *string, int listdir, int linedir, int flags) { return (history_search_internal (string, listdir, linedir, flags)); } /* Search for STRING in the history list. LISTDIR is < 0 for searching backwards through the list. POS is an absolute index into the history list where the search should begin. */ int history_search_pos (const char *string, int listdir, int pos) { int ret, old; old = where_history (); history_set_pos (pos); if (history_search (string, listdir) == -1) { history_set_pos (old); return (-1); } ret = where_history (); history_set_pos (old); return ret; } readline-8.3/readline.pc.in000644 000436 000024 00000000514 13452710567 015756 0ustar00chetstaff000000 000000 prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: Readline Description: Gnu Readline library for command line editing URL: http://tiswww.cwru.edu/php/chet/readline/rltop.html Version: @LIBVERSION@ Requires.private: @TERMCAP_PKG_CONFIG_LIB@ Libs: -L${libdir} -lreadline Cflags: -I${includedir} readline-8.3/text.c000644 000436 000024 00000153273 14635366400 014402 0ustar00chetstaff000000 000000 /* text.c -- text handling commands for readline. */ /* Copyright (C) 1987-2021,2023-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_LOCALE_H) # include #endif #include /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "rlmbutil.h" #if defined (__EMX__) # define INCL_DOSPROCESS # include #endif /* __EMX__ */ /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "rlshell.h" #include "xmalloc.h" /* Forward declarations. */ static int rl_change_case (int, int); static int _rl_char_search (int, int, int); #if defined (READLINE_CALLBACKS) static int _rl_insert_next_callback (_rl_callback_generic_arg *); static int _rl_char_search_callback (_rl_callback_generic_arg *); #endif /* The largest chunk of text that can be inserted in one call to rl_insert_text. Text blocks larger than this are divided. */ #define TEXT_COUNT_MAX 1024 int _rl_optimize_typeahead = 1; /* rl_insert tries to read typeahead */ /* **************************************************************** */ /* */ /* Insert and Delete */ /* */ /* **************************************************************** */ /* Insert a string of text into the line at point. This is the only way that you should do insertion. _rl_insert_char () calls this function. Returns the number of characters inserted. */ int rl_insert_text (const char *string) { register int i; size_t l; l = (string && *string) ? strlen (string) : 0; if (l == 0) return 0; if (rl_end + l >= rl_line_buffer_len) rl_extend_line_buffer (rl_end + l); for (i = rl_end; i >= rl_point; i--) rl_line_buffer[i + l] = rl_line_buffer[i]; strncpy (rl_line_buffer + rl_point, string, l); /* Remember how to undo this if we aren't undoing something. */ if (_rl_doing_an_undo == 0) { /* If possible and desirable, concatenate the undos. */ if ((l == 1) && rl_undo_list && (rl_undo_list->what == UNDO_INSERT) && (rl_undo_list->end == rl_point) && (rl_undo_list->end - rl_undo_list->start < 20)) rl_undo_list->end++; else rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL); } rl_point += l; rl_end += l; rl_line_buffer[rl_end] = '\0'; return l; } /* Delete the string between FROM and TO. FROM is inclusive, TO is not. Returns the number of characters deleted. */ int rl_delete_text (int from, int to) { register char *text; register int diff, i; /* Fix it if the caller is confused. */ if (from > to) SWAP (from, to); /* fix boundaries */ if (to > rl_end) { to = rl_end; if (from > to) from = to; } if (from < 0) from = 0; text = rl_copy_text (from, to); /* Some versions of strncpy() can't handle overlapping arguments. */ diff = to - from; for (i = from; i < rl_end - diff; i++) rl_line_buffer[i] = rl_line_buffer[i + diff]; /* Remember how to undo this delete. */ if (_rl_doing_an_undo == 0) rl_add_undo (UNDO_DELETE, from, to, text); else xfree (text); rl_end -= diff; rl_line_buffer[rl_end] = '\0'; _rl_fix_mark (); return (diff); } /* Fix up point so that it is within the line boundaries after killing text. If FIX_MARK_TOO is non-zero, the mark is forced within line boundaries also. */ #define _RL_FIX_POINT(x) \ do { \ if (x > rl_end) \ x = rl_end; \ else if (x < 0) \ x = 0; \ } while (0) void _rl_fix_point (int fix_mark_too) { _RL_FIX_POINT (rl_point); if (fix_mark_too) _RL_FIX_POINT (rl_mark); } void _rl_fix_mark (void) { _RL_FIX_POINT (rl_mark); } #undef _RL_FIX_POINT /* Replace the contents of the line buffer between START and END with TEXT. The operation is undoable. To replace the entire line in an undoable mode, use _rl_replace_text(text, 0, rl_end); */ int _rl_replace_text (const char *text, int start, int end) { int n; n = 0; rl_begin_undo_group (); if (start <= end) rl_delete_text (start, end + 1); rl_point = start; if (*text) n = rl_insert_text (text); rl_end_undo_group (); return n; } /* Replace the current line buffer contents with TEXT. If CLEAR_UNDO is non-zero, we free the current undo list. */ void rl_replace_line (const char *text, int clear_undo) { int len; len = strlen (text); if (len >= rl_line_buffer_len) rl_extend_line_buffer (len); strcpy (rl_line_buffer, text); rl_end = len; if (clear_undo) rl_free_undo_list (); _rl_fix_point (1); } /* **************************************************************** */ /* */ /* Readline character functions */ /* */ /* **************************************************************** */ /* This is not a gap editor, just a stupid line input routine. No hair is involved in writing any of the functions, and none should be. */ /* Note that: rl_end is the place in the string that we would place '\0'; i.e., it is always safe to place '\0' there. rl_point is the place in the string where the cursor is. Sometimes this is the same as rl_end. Any command that is called interactively receives two arguments. The first is a count: the numeric arg passed to this command. The second is the key which invoked this command. */ /* **************************************************************** */ /* */ /* Movement Commands */ /* */ /* **************************************************************** */ /* Note that if you `optimize' the display for these functions, you cannot use said functions in other functions which do not do optimizing display. I.e., you will have to update the data base for rl_redisplay, and you might as well let rl_redisplay do that job. */ /* Move forward COUNT bytes. */ int rl_forward_byte (int count, int key) { if (count < 0) return (rl_backward_byte (-count, key)); if (count > 0) { int end, lend; end = rl_point + count; #if defined (VI_MODE) lend = rl_end > 0 ? rl_end - (VI_COMMAND_MODE()) : rl_end; #else lend = rl_end; #endif if (end > lend) { rl_point = lend; rl_ding (); } else rl_point = end; } if (rl_end < 0) rl_end = 0; return 0; } int _rl_forward_char_internal (int count) { int point; #if defined (HANDLE_MULTIBYTE) point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); #if defined (VI_MODE) if (point >= rl_end && VI_COMMAND_MODE()) point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO); #endif if (rl_end < 0) rl_end = 0; #else point = rl_point + count; #endif if (point > rl_end) point = rl_end; return (point); } int _rl_backward_char_internal (int count) { int point; point = rl_point; #if defined (HANDLE_MULTIBYTE) if (count > 0) { while (count > 0 && point > 0) { point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO); count--; } if (count > 0) return 0; /* XXX - rl_ding() here? */ } #else if (count > 0) point -= count; #endif if (point < 0) point = 0; return (point); } #if defined (HANDLE_MULTIBYTE) /* Move forward COUNT characters. */ int rl_forward_char (int count, int key) { int point; if (MB_CUR_MAX == 1 || rl_byte_oriented) return (rl_forward_byte (count, key)); if (count < 0) return (rl_backward_char (-count, key)); if (count > 0) { if (rl_point == rl_end && EMACS_MODE()) { rl_ding (); return 0; } point = _rl_forward_char_internal (count); if (rl_point == point) rl_ding (); rl_point = point; } return 0; } #else /* !HANDLE_MULTIBYTE */ int rl_forward_char (int count, int key) { return (rl_forward_byte (count, key)); } #endif /* !HANDLE_MULTIBYTE */ /* Backwards compatibility. */ int rl_forward (int count, int key) { return (rl_forward_char (count, key)); } /* Move backward COUNT bytes. */ int rl_backward_byte (int count, int key) { if (count < 0) return (rl_forward_byte (-count, key)); if (count > 0) { if (rl_point < count) { rl_point = 0; rl_ding (); } else rl_point -= count; } if (rl_point < 0) rl_point = 0; return 0; } #if defined (HANDLE_MULTIBYTE) /* Move backward COUNT characters. */ int rl_backward_char (int count, int key) { int point; if (MB_CUR_MAX == 1 || rl_byte_oriented) return (rl_backward_byte (count, key)); if (count < 0) return (rl_forward_char (-count, key)); if (count > 0) { point = rl_point; while (count > 0 && point > 0) { point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO); count--; } if (count > 0) { rl_point = 0; rl_ding (); } else rl_point = point; } return 0; } #else int rl_backward_char (int count, int key) { return (rl_backward_byte (count, key)); } #endif /* Backwards compatibility. */ int rl_backward (int count, int key) { return (rl_backward_char (count, key)); } /* Move to the beginning of the line. */ int rl_beg_of_line (int count, int key) { rl_point = 0; return 0; } /* Move to the end of the line. */ int rl_end_of_line (int count, int key) { rl_point = rl_end; return 0; } /* Move forward a word. We do what Emacs does. Handles multibyte chars. */ int rl_forward_word (int count, int key) { int c; if (count < 0) return (rl_backward_word (-count, key)); while (count) { if (rl_point > rl_end) rl_point = rl_end; if (rl_point == rl_end) return 0; /* If we are not in a word, move forward until we are in one. Then, move forward until we hit a non-alphabetic character. */ c = _rl_char_value (rl_line_buffer, rl_point); if (_rl_walphabetic (c) == 0) { rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); while (rl_point < rl_end) { c = _rl_char_value (rl_line_buffer, rl_point); if (_rl_walphabetic (c)) break; rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); } } if (rl_point > rl_end) rl_point = rl_end; if (rl_point == rl_end) return 0; rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); while (rl_point < rl_end) { c = _rl_char_value (rl_line_buffer, rl_point); if (_rl_walphabetic (c) == 0) break; rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); } --count; } return 0; } /* Move backward a word. We do what Emacs does. Handles multibyte chars. */ int rl_backward_word (int count, int key) { int c, p; if (count < 0) return (rl_forward_word (-count, key)); while (count) { if (rl_point == 0) return 0; /* Like rl_forward_word (), except that we look at the characters just before point. */ p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); c = _rl_char_value (rl_line_buffer, p); if (_rl_walphabetic (c) == 0) { rl_point = p; while (rl_point > 0) { p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); c = _rl_char_value (rl_line_buffer, p); if (_rl_walphabetic (c)) break; rl_point = p; } } while (rl_point) { p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); c = _rl_char_value (rl_line_buffer, p); if (_rl_walphabetic (c) == 0) break; else rl_point = p; } --count; } return 0; } /* Clear the current line. Numeric argument to C-l does this. */ int rl_refresh_line (int ignore1, int ignore2) { _rl_refresh_line (); rl_display_fixed = 1; return 0; } /* C-l typed to a line without quoting clears the screen, and then reprints the prompt and the current input line. Given a numeric arg, redraw only the current line. */ int rl_clear_screen (int count, int key) { if (rl_explicit_arg) { rl_refresh_line (count, key); return 0; } _rl_clear_screen (0); /* calls termcap function to clear screen */ rl_keep_mark_active (); rl_forced_update_display (); rl_display_fixed = 1; return 0; } int rl_clear_display (int count, int key) { _rl_clear_screen (1); /* calls termcap function to clear screen and scrollback buffer */ rl_forced_update_display (); rl_display_fixed = 1; return 0; } int rl_previous_screen_line (int count, int key) { int c; c = _rl_term_autowrap ? _rl_screenwidth : (_rl_screenwidth + 1); return (rl_backward_char (c, key)); } int rl_next_screen_line (int count, int key) { int c; c = _rl_term_autowrap ? _rl_screenwidth : (_rl_screenwidth + 1); return (rl_forward_char (c, key)); } int rl_skip_csi_sequence (int count, int key) { int ch; RL_SETSTATE (RL_STATE_MOREINPUT); do ch = rl_read_key (); while (ch >= 0x20 && ch < 0x40); RL_UNSETSTATE (RL_STATE_MOREINPUT); return (ch < 0); } int rl_arrow_keys (int count, int key) { int ch; RL_SETSTATE(RL_STATE_MOREINPUT); ch = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (ch < 0) return (1); switch (_rl_to_upper (ch)) { case 'A': rl_get_previous_history (count, ch); break; case 'B': rl_get_next_history (count, ch); break; case 'C': if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_forward_char (count, ch); else rl_forward_byte (count, ch); break; case 'D': if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_backward_char (count, ch); else rl_backward_byte (count, ch); break; default: rl_ding (); } return 0; } /* **************************************************************** */ /* */ /* Text commands */ /* */ /* **************************************************************** */ #ifdef HANDLE_MULTIBYTE static char pending_bytes[MB_LEN_MAX]; static int pending_bytes_length = 0; static mbstate_t ps = {0}; #endif /* Insert the character C at the current location, moving point forward. If C introduces a multibyte sequence, we read the whole sequence and then insert the multibyte char into the line buffer. If C == 0, we immediately insert any pending partial multibyte character, assuming that we have read a character that doesn't map to self-insert. This doesn't completely handle characters that are part of a multibyte character but map to editing functions. */ int _rl_insert_char (int count, int c) { register int i; char *string; #ifdef HANDLE_MULTIBYTE int string_size; char incoming[MB_LEN_MAX + 1]; int incoming_length = 0; mbstate_t ps_back; static int stored_count = 0; #endif #if !defined (HANDLE_MULTIBYTE) if (count <= 0) return 0; #else if (count < 0) return 0; if (count == 0) { if (pending_bytes_length == 0) return 0; if (stored_count <= 0) stored_count = count; else count = stored_count; memcpy (incoming, pending_bytes, pending_bytes_length); incoming[pending_bytes_length] = '\0'; incoming_length = pending_bytes_length; pending_bytes_length = 0; memset (&ps, 0, sizeof (mbstate_t)); } else if (MB_CUR_MAX == 1 || rl_byte_oriented) { incoming[0] = c; incoming[1] = '\0'; incoming_length = 1; } else if (_rl_utf8locale && (c & 0x80) == 0) { if (pending_bytes_length) _rl_insert_char (0, 0); incoming[0] = c; incoming[1] = '\0'; incoming_length = 1; } else { WCHAR_T wc; size_t ret; if (stored_count <= 0) stored_count = count; else count = stored_count; ps_back = ps; pending_bytes[pending_bytes_length++] = c; ret = MBRTOWC (&wc, pending_bytes, pending_bytes_length, &ps); if (ret == (size_t)-2) { /* Bytes too short to compose character, try to wait for next byte. Restore the state of the byte sequence, because in this case the effect of mbstate is undefined. */ ps = ps_back; return 1; } else if (ret == (size_t)-1) { /* Invalid byte sequence for the current locale. Treat first byte as a single character. */ incoming[0] = pending_bytes[0]; incoming[1] = '\0'; incoming_length = 1; pending_bytes_length--; if (pending_bytes_length) memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); /* Clear the state of the byte sequence, because in this case the effect of mbstate is undefined. */ memset (&ps, 0, sizeof (mbstate_t)); } else if (ret == (size_t)0) { incoming[0] = '\0'; incoming_length = 0; pending_bytes_length--; /* Clear the state of the byte sequence, because in this case the effect of mbstate is undefined. */ memset (&ps, 0, sizeof (mbstate_t)); } else if (ret == 1) { incoming[0] = pending_bytes[0]; incoming[incoming_length = 1] = '\0'; pending_bytes_length = 0; } else { /* We successfully read a single multibyte character. */ memcpy (incoming, pending_bytes, pending_bytes_length); incoming[pending_bytes_length] = '\0'; incoming_length = pending_bytes_length; pending_bytes_length = 0; } } #endif /* HANDLE_MULTIBYTE */ /* If we can optimize, then do it. But don't let people crash readline because of extra large arguments. */ if (count > 1 && count <= TEXT_COUNT_MAX) { #if defined (HANDLE_MULTIBYTE) string_size = count * incoming_length; string = (char *)xmalloc (1 + string_size); i = 0; while (i < string_size) { if (incoming_length == 1) string[i++] = *incoming; else { strncpy (string + i, incoming, incoming_length); i += incoming_length; } } incoming_length = 0; stored_count = 0; #else /* !HANDLE_MULTIBYTE */ string = (char *)xmalloc (1 + count); for (i = 0; i < count; i++) string[i] = c; #endif /* !HANDLE_MULTIBYTE */ string[i] = '\0'; rl_insert_text (string); xfree (string); #if defined (HANDLE_MULTIBYTE) return (pending_bytes_length != 0); #else return 0; #endif } if (count > TEXT_COUNT_MAX) { int decreaser; #if defined (HANDLE_MULTIBYTE) string_size = incoming_length * TEXT_COUNT_MAX; string = (char *)xmalloc (1 + string_size); i = 0; while (i < string_size) { if (incoming_length == 1) string[i++] = *incoming; else { strncpy (string + i, incoming, incoming_length); i += incoming_length; } } while (count) { decreaser = (count > TEXT_COUNT_MAX) ? TEXT_COUNT_MAX : count; string[decreaser*incoming_length] = '\0'; rl_insert_text (string); count -= decreaser; } xfree (string); incoming_length = 0; stored_count = 0; return (pending_bytes_length != 0); #else /* !HANDLE_MULTIBYTE */ char str[TEXT_COUNT_MAX+1]; for (i = 0; i < TEXT_COUNT_MAX; i++) str[i] = c; while (count) { decreaser = (count > TEXT_COUNT_MAX ? TEXT_COUNT_MAX : count); str[decreaser] = '\0'; rl_insert_text (str); count -= decreaser; } return 0; #endif /* !HANDLE_MULTIBYTE */ } if (MB_CUR_MAX == 1 || rl_byte_oriented) { /* We are inserting a single character. If there is pending input, then make a string of all of the pending characters that are bound to rl_insert, and insert them all. Don't do this if we're current reading input from a macro. */ if ((RL_ISSTATE (RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available ()) _rl_insert_typein (c); else { /* Inserting a single character. */ char str[2]; str[1] = '\0'; str[0] = c; rl_insert_text (str); } } #if defined (HANDLE_MULTIBYTE) else { rl_insert_text (incoming); stored_count = 0; } return (pending_bytes_length != 0); #else return 0; #endif } /* Overwrite the character at point (or next COUNT characters) with C. If C introduces a multibyte character sequence, read the entire sequence before starting the overwrite loop. */ int _rl_overwrite_char (int count, int c) { int i; #if defined (HANDLE_MULTIBYTE) char mbkey[MB_LEN_MAX]; int k; /* Read an entire multibyte character sequence to insert COUNT times. */ k = 1; if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX); if (k < 0) return 1; #endif rl_begin_undo_group (); for (i = 0; i < count; i++) { #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_insert_text (mbkey); else #endif _rl_insert_char (1, c); if (rl_point < rl_end) rl_delete (1, c); } rl_end_undo_group (); return 0; } int rl_insert (int count, int c) { int r, n, x; r = (rl_insert_mode == RL_IM_INSERT) ? _rl_insert_char (count, c) : _rl_overwrite_char (count, c); /* XXX -- attempt to batch-insert pending input that maps to self-insert */ x = 0; n = (unsigned short)-2; while (_rl_optimize_typeahead && rl_num_chars_to_read == 0 && (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available () == 0 && _rl_input_queued (0) && (n = rl_read_key ()) > 0 && _rl_keymap[(unsigned char)n].type == ISFUNC && _rl_keymap[(unsigned char)n].function == rl_insert) { r = (rl_insert_mode == RL_IM_INSERT) ? _rl_insert_char (1, n) : _rl_overwrite_char (1, n); /* _rl_insert_char keeps its own set of pending characters to compose a complete multibyte character, and only returns 1 if it sees a character that's part of a multibyte character but too short to complete one. We can try to read another character in the hopes that we will get the next one or just punt. Right now we try to read another character. We don't want to call rl_insert_next if _rl_insert_char has already stored the character in the pending_bytes array because that will result in doubled input. */ n = (unsigned short)-2; x++; /* count of bytes of typeahead read, currently unused */ if (r == 1) /* read partial multibyte character */ continue; if (rl_done || r != 0) break; } /* If we didn't insert n and there are pending bytes, we need to insert them if _rl_insert_char didn't do that on its own. */ if (r == 1 && rl_insert_mode == RL_IM_INSERT) r = _rl_insert_char (0, 0); /* flush partial multibyte char */ if (n != (unsigned short)-2) /* -2 = sentinel value for having inserted N */ { /* setting rl_pending_input inhibits setting rl_last_func so we do it ourselves here */ rl_last_func = rl_insert; _rl_reset_argument (); rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; r = rl_execute_next (n); } return r; } /* Insert the next typed character verbatim. */ static int _rl_insert_next (int count) { int c; RL_SETSTATE(RL_STATE_MOREINPUT); c = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (c < 0) return 1; if (RL_ISSTATE (RL_STATE_MACRODEF)) _rl_add_macro_char (c); #if defined (HANDLE_SIGNALS) if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) _rl_restore_tty_signals (); #endif return (_rl_insert_char (count, c)); } #if defined (READLINE_CALLBACKS) static int _rl_insert_next_callback (_rl_callback_generic_arg *data) { int count, r; count = data->count; r = 0; if (count < 0) { data->count++; r = _rl_insert_next (1); _rl_want_redisplay = 1; /* If we should keep going, leave the callback function installed */ if (data->count < 0 && r == 0) return r; count = 0; /* data->count == 0 || r != 0; force break below */ } /* Deregister function, let rl_callback_read_char deallocate data */ _rl_callback_func = 0; _rl_want_redisplay = 1; if (count == 0) return r; return _rl_insert_next (count); } #endif int rl_quoted_insert (int count, int key) { int r; /* Let's see...should the callback interface futz with signal handling? */ #if defined (HANDLE_SIGNALS) if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) _rl_disable_tty_signals (); #endif #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_callback_data = _rl_callback_data_alloc (count); _rl_callback_func = _rl_insert_next_callback; return (0); } #endif /* A negative count means to quote the next -COUNT characters. */ if (count < 0) { do r = _rl_insert_next (1); while (r == 0 && ++count < 0); } else r = _rl_insert_next (count); if (r == 1) _rl_insert_char (0, 0); /* insert partial multibyte character */ return r; } /* Insert a tab character. */ int rl_tab_insert (int count, int key) { return (_rl_insert_char (count, '\t')); } /* What to do when a NEWLINE is pressed. We accept the whole line. KEY is the key that invoked this command. I guess it could have meaning in the future. */ int rl_newline (int count, int key) { if (rl_mark_active_p ()) { rl_deactivate_mark (); (*rl_redisplay_function) (); _rl_want_redisplay = 0; } rl_done = 1; if (_rl_history_preserve_point) _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; RL_SETSTATE(RL_STATE_DONE); #if defined (VI_MODE) if (rl_editing_mode == vi_mode) { _rl_vi_done_inserting (); if (_rl_vi_textmod_command (_rl_vi_last_command) == 0) /* XXX */ _rl_vi_reset_last (); } #endif /* VI_MODE */ /* If we've been asked to erase empty lines, suppress the final update, since _rl_update_final calls rl_crlf(). */ if (rl_erase_empty_line && rl_point == 0 && rl_end == 0) return 0; if (_rl_echoing_p) _rl_update_final (); return 0; } /* What to do for some uppercase characters, like meta characters, and some characters appearing in emacs_ctlx_keymap. This function is just a stub, you bind keys to it and the code in _rl_dispatch () is special cased. */ int rl_do_lowercase_version (int ignore1, int ignore2) { return 99999; /* prevent from being combined with _rl_null_function */ } /* This is different from what vi does, so the code's not shared. Emacs rubout in overwrite mode has one oddity: it replaces a control character that's displayed as two characters (^X) with two spaces. */ int _rl_overwrite_rubout (int count, int key) { int opoint; int i, l; if (rl_point == 0) { rl_ding (); return 1; } opoint = rl_point; /* L == number of spaces to insert */ for (i = l = 0; i < count; i++) { rl_backward_char (1, key); l += rl_character_len (rl_line_buffer[rl_point], rl_point); /* not exactly right */ } rl_begin_undo_group (); if (count > 1 || rl_explicit_arg) rl_kill_text (opoint, rl_point); else rl_delete_text (opoint, rl_point); /* Emacs puts point at the beginning of the sequence of spaces. */ if (rl_point < rl_end) { opoint = rl_point; _rl_insert_char (l, ' '); rl_point = opoint; } rl_end_undo_group (); return 0; } /* Rubout the character behind point. */ int rl_rubout (int count, int key) { if (count < 0) return (rl_delete (-count, key)); if (!rl_point) { rl_ding (); return 1; } if (rl_insert_mode == RL_IM_OVERWRITE) return (_rl_overwrite_rubout (count, key)); return (_rl_rubout_char (count, key)); } int _rl_rubout_char (int count, int key) { int orig_point; unsigned char c; /* Duplicated code because this is called from other parts of the library. */ if (count < 0) return (rl_delete (-count, key)); if (rl_point == 0) { rl_ding (); return 1; } orig_point = rl_point; if (count > 1 || rl_explicit_arg) { rl_backward_char (count, key); rl_kill_text (orig_point, rl_point); } else if (MB_CUR_MAX == 1 || rl_byte_oriented) { c = rl_line_buffer[--rl_point]; rl_delete_text (rl_point, orig_point); /* The erase-at-end-of-line hack is of questionable merit now. */ if (rl_point == rl_end && ISPRINT ((unsigned char)c) && _rl_last_c_pos && _rl_last_v_pos == 0) { int l; l = rl_character_len (c, rl_point); if (_rl_last_c_pos >= l) _rl_erase_at_end_of_line (l); } } else { rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); rl_delete_text (rl_point, orig_point); } return 0; } /* Delete the character under the cursor. Given a numeric argument, kill that many characters instead. */ int rl_delete (int count, int key) { int xpoint; if (count < 0) return (_rl_rubout_char (-count, key)); if (rl_point == rl_end) { rl_ding (); return 1; } if (count > 1 || rl_explicit_arg) { xpoint = rl_point; if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_forward_char (count, key); else rl_forward_byte (count, key); rl_kill_text (xpoint, rl_point); rl_point = xpoint; } else { xpoint = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); rl_delete_text (rl_point, xpoint); } return 0; } /* Delete the character under the cursor, unless the insertion point is at the end of the line, in which case the character behind the cursor is deleted. COUNT is obeyed and may be used to delete forward or backward that many characters. */ int rl_rubout_or_delete (int count, int key) { if (rl_end != 0 && rl_point == rl_end) return (_rl_rubout_char (count, key)); else return (rl_delete (count, key)); } /* Delete all spaces and tabs around point. */ int rl_delete_horizontal_space (int count, int ignore) { int start; while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) rl_point--; start = rl_point; while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) rl_point++; if (start != rl_point) { rl_delete_text (start, rl_point); rl_point = start; } if (rl_point < 0) rl_point = 0; return 0; } /* Like the tcsh editing function delete-char-or-list. The eof character is caught before this is invoked, so this really does the same thing as delete-char-or-list-or-eof, as long as it's bound to the eof character. */ int rl_delete_or_show_completions (int count, int key) { if (rl_end != 0 && rl_point == rl_end) return (rl_possible_completions (count, key)); else return (rl_delete (count, key)); } #ifndef RL_COMMENT_BEGIN_DEFAULT #define RL_COMMENT_BEGIN_DEFAULT "#" #endif /* Turn the current line into a comment in shell history. A K*rn shell style function. */ int rl_insert_comment (int count, int key) { char *rl_comment_text; int rl_comment_len; rl_beg_of_line (1, key); rl_comment_text = _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT; if (rl_explicit_arg == 0) rl_insert_text (rl_comment_text); else { rl_comment_len = strlen (rl_comment_text); if (STREQN (rl_comment_text, rl_line_buffer, rl_comment_len)) rl_delete_text (rl_point, rl_point + rl_comment_len); else rl_insert_text (rl_comment_text); } (*rl_redisplay_function) (); rl_newline (1, '\n'); return (0); } /* **************************************************************** */ /* */ /* Changing Case */ /* */ /* **************************************************************** */ /* The three kinds of things that we know how to do. */ #define UpCase 1 #define DownCase 2 #define CapCase 3 /* Uppercase the word at point. */ int rl_upcase_word (int count, int key) { return (rl_change_case (count, UpCase)); } /* Lowercase the word at point. */ int rl_downcase_word (int count, int key) { return (rl_change_case (count, DownCase)); } /* Upcase the first letter, downcase the rest. */ int rl_capitalize_word (int count, int key) { return (rl_change_case (count, CapCase)); } /* The meaty function. Change the case of COUNT words, performing OP on them. OP is one of UpCase, DownCase, or CapCase. If a negative argument is given, leave point where it started, otherwise, leave it where it moves to. */ static int rl_change_case (int count, int op) { int start, next, end; int inword, nc, nop; WCHAR_T c; unsigned char uc; #if defined (HANDLE_MULTIBYTE) WCHAR_T wc, nwc; char mb[MB_LEN_MAX+1]; size_t m, mlen; mbstate_t mps; #endif start = rl_point; rl_forward_word (count, 0); end = rl_point; if (op != UpCase && op != DownCase && op != CapCase) { rl_ding (); return 1; } if (count < 0) SWAP (start, end); #if defined (HANDLE_MULTIBYTE) memset (&mps, 0, sizeof (mbstate_t)); #endif /* We are going to modify some text, so let's prepare to undo it. */ rl_modifying (start, end); inword = 0; while (start < end) { c = _rl_char_value (rl_line_buffer, start); /* This assumes that the upper and lower case versions are the same width. */ next = MB_NEXTCHAR (rl_line_buffer, start, 1, MB_FIND_NONZERO); if (_rl_walphabetic (c) == 0) { inword = 0; start = next; continue; } if (op == CapCase) { nop = inword ? DownCase : UpCase; inword = 1; } else nop = op; /* Can't check isascii here; some languages (e.g, Turkish) have multibyte upper and lower case equivalents of single-byte ascii characters */ if (MB_CUR_MAX == 1 || rl_byte_oriented) { change_singlebyte: uc = c; nc = (nop == UpCase) ? _rl_to_upper (uc) : _rl_to_lower (uc); rl_line_buffer[start] = nc; } #if defined (HANDLE_MULTIBYTE) else { m = MBRTOWC (&wc, rl_line_buffer + start, end - start, &mps); if (MB_INVALIDCH (m)) { c = rl_line_buffer[start]; next = start + 1; /* potentially redundant */ goto change_singlebyte; } else if (MB_NULLWCH (m)) { start = next; /* don't bother with null wide characters */ continue; } nwc = (nop == UpCase) ? _rl_to_wupper (wc) : _rl_to_wlower (wc); if (nwc != wc) /* just skip unchanged characters */ { char *s, *e; mbstate_t ts; memset (&ts, 0, sizeof (mbstate_t)); mlen = WCRTOMB (mb, nwc, &ts); if (MB_INVALIDCH (mlen)) { nwc = wc; memset (&ts, 0, sizeof (mbstate_t)); mlen = WCRTOMB (mb, nwc, &ts); if (MB_INVALIDCH (mlen)) /* should not happen */ strncpy (mb, rl_line_buffer + start, mlen = m); } if (mlen > 0) mb[mlen] = '\0'; /* what to do if m != mlen? adjust below */ /* m == length of old char, mlen == length of new char */ s = rl_line_buffer + start; e = rl_line_buffer + rl_end; if (m == mlen) memcpy (s, mb, mlen); else if (m > mlen) { memcpy (s, mb, mlen); memmove (s + mlen, s + m, (e - s) - m); next -= m - mlen; /* next char changes */ end -= m - mlen; /* end of word changes */ rl_end -= m - mlen; /* end of line changes */ rl_line_buffer[rl_end] = 0; } else if (m < mlen) { rl_extend_line_buffer (rl_end + mlen + (e - s) - m + 2); s = rl_line_buffer + start; /* have to redo this */ e = rl_line_buffer + rl_end; memmove (s + mlen, s + m, (e - s) - m); memcpy (s, mb, mlen); next += mlen - m; /* next char changes */ end += mlen - m; /* end of word changes */ rl_end += mlen - m; /* end of line changes */ rl_line_buffer[rl_end] = 0; } } } #endif start = next; } rl_point = end; return 0; } /* **************************************************************** */ /* */ /* Transposition */ /* */ /* **************************************************************** */ /* Transpose the words at point. If point is at the end of the line, transpose the two words before point. */ int rl_transpose_words (int count, int key) { char *word1, *word2; int w1_beg, w1_end, w2_beg, w2_end; int orig_point, orig_end; orig_point = rl_point; orig_end = rl_end; if (!count) return 0; /* Find the two words. */ rl_forward_word (count, key); w2_end = rl_point; rl_backward_word (1, key); w2_beg = rl_point; rl_backward_word (count, key); w1_beg = rl_point; rl_forward_word (1, key); w1_end = rl_point; /* Do some check to make sure that there really are two words. */ if ((w1_beg == w2_beg) || (w2_beg < w1_end)) { rl_ding (); rl_point = orig_point; return 1; } /* Get the text of the words. */ word1 = rl_copy_text (w1_beg, w1_end); word2 = rl_copy_text (w2_beg, w2_end); /* We are about to do many insertions and deletions. Remember them as one operation. */ rl_begin_undo_group (); /* Do the stuff at word2 first, so that we don't have to worry about word1 moving. */ rl_point = w2_beg; rl_delete_text (w2_beg, w2_end); rl_insert_text (word1); rl_point = w1_beg; rl_delete_text (w1_beg, w1_end); rl_insert_text (word2); /* This is exactly correct since the text before this point has not changed in length. */ rl_point = w2_end; rl_end = orig_end; /* just make sure */ /* I think that does it. */ rl_end_undo_group (); xfree (word1); xfree (word2); return 0; } /* Transpose the characters at point. If point is at the end of the line, then transpose the characters before point. */ int rl_transpose_chars (int count, int key) { #if defined (HANDLE_MULTIBYTE) char *dummy; int i; #else char dummy[2]; #endif int char_length, prev_point; if (count == 0) return 0; if (!rl_point || rl_end < 2) { rl_ding (); return 1; } rl_begin_undo_group (); if (rl_point == rl_end) { rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); count = 1; } prev_point = rl_point; rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO); #if defined (HANDLE_MULTIBYTE) char_length = prev_point - rl_point; dummy = (char *)xmalloc (char_length + 1); for (i = 0; i < char_length; i++) dummy[i] = rl_line_buffer[rl_point + i]; dummy[i] = '\0'; #else dummy[0] = rl_line_buffer[rl_point]; dummy[char_length = 1] = '\0'; #endif rl_delete_text (rl_point, rl_point + char_length); rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); _rl_fix_point (0); rl_insert_text (dummy); rl_end_undo_group (); #if defined (HANDLE_MULTIBYTE) xfree (dummy); #endif return 0; } /* **************************************************************** */ /* */ /* Character Searching */ /* */ /* **************************************************************** */ int #if defined (HANDLE_MULTIBYTE) _rl_char_search_internal (int count, int dir, char *smbchar, int len) #else _rl_char_search_internal (int count, int dir, int schar) #endif { int pos, inc; #if defined (HANDLE_MULTIBYTE) int prepos; #endif if (dir == 0) return 1; pos = rl_point; inc = (dir < 0) ? -1 : 1; while (count) { if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end)) { rl_ding (); return 1; } #if defined (HANDLE_MULTIBYTE) pos = (inc > 0) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) : _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); #else pos += inc; #endif do { #if defined (HANDLE_MULTIBYTE) if (_rl_is_mbchar_matched (rl_line_buffer, pos, rl_end, smbchar, len)) #else if (rl_line_buffer[pos] == schar) #endif { count--; if (dir < 0) rl_point = (dir == BTO) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) : pos; else rl_point = (dir == FTO) ? _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY) : pos; break; } #if defined (HANDLE_MULTIBYTE) prepos = pos; #endif } #if defined (HANDLE_MULTIBYTE) while ((dir < 0) ? (pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)) != prepos : (pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)) != prepos); #else while ((dir < 0) ? pos-- : ++pos < rl_end); #endif } return (0); } /* Search COUNT times for a character read from the current input stream. FDIR is the direction to search if COUNT is non-negative; otherwise the search goes in BDIR. So much is dependent on HANDLE_MULTIBYTE that there are two separate versions of this function. */ #if defined (HANDLE_MULTIBYTE) static int _rl_char_search (int count, int fdir, int bdir) { char mbchar[MB_LEN_MAX]; int mb_len; mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX); if (mb_len <= 0) return 1; if (count < 0) return (_rl_char_search_internal (-count, bdir, mbchar, mb_len)); else return (_rl_char_search_internal (count, fdir, mbchar, mb_len)); } #else /* !HANDLE_MULTIBYTE */ static int _rl_char_search (int count, int fdir, int bdir) { int c; c = _rl_bracketed_read_key (); if (c < 0) return 1; if (count < 0) return (_rl_char_search_internal (-count, bdir, c)); else return (_rl_char_search_internal (count, fdir, c)); } #endif /* !HANDLE_MULTIBYTE */ #if defined (READLINE_CALLBACKS) static int _rl_char_search_callback (_rl_callback_generic_arg *data) { _rl_callback_func = 0; _rl_want_redisplay = 1; return (_rl_char_search (data->count, data->i1, data->i2)); } #endif int rl_char_search (int count, int key) { #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_callback_data = _rl_callback_data_alloc (count); _rl_callback_data->i1 = FFIND; _rl_callback_data->i2 = BFIND; _rl_callback_func = _rl_char_search_callback; return (0); } #endif return (_rl_char_search (count, FFIND, BFIND)); } int rl_backward_char_search (int count, int key) { #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_callback_data = _rl_callback_data_alloc (count); _rl_callback_data->i1 = BFIND; _rl_callback_data->i2 = FFIND; _rl_callback_func = _rl_char_search_callback; return (0); } #endif return (_rl_char_search (count, BFIND, FFIND)); } /* **************************************************************** */ /* */ /* The Mark and the Region. */ /* */ /* **************************************************************** */ /* Set the mark at POSITION. */ int _rl_set_mark_at_pos (int position) { if (position < 0 || position > rl_end) return 1; rl_mark = position; return 0; } /* A bindable command to set the mark. */ int rl_set_mark (int count, int key) { return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point)); } /* Exchange the position of mark and point. */ int rl_exchange_point_and_mark (int count, int key) { if (rl_mark > rl_end) rl_mark = -1; if (rl_mark < 0) { rl_ding (); rl_mark = 0; /* like _RL_FIX_POINT */ return 1; } else { SWAP (rl_point, rl_mark); rl_activate_mark (); } return 0; } /* Active mark support */ /* Is the region active? */ static int mark_active = 0; /* Does the current command want the mark to remain active when it completes? */ int _rl_keep_mark_active; void rl_keep_mark_active (void) { _rl_keep_mark_active++; } void rl_activate_mark (void) { mark_active = 1; rl_keep_mark_active (); } void rl_deactivate_mark (void) { mark_active = 0; } int rl_mark_active_p (void) { return (mark_active); } /* **************************************************************** */ /* */ /* Reading a string entered from the keyboard */ /* */ /* **************************************************************** */ /* A very simple set of functions to read a string from the keyboard using the line buffer as temporary storage. The caller can set a completion function to perform completion on TAB and SPACE. */ /* XXX - this is all very similar to the search stuff but with a different CXT. */ static HIST_ENTRY *_rl_saved_line_for_readstr; _rl_readstr_cxt *_rl_rscxt; _rl_readstr_cxt * _rl_rscxt_alloc (int flags) { _rl_readstr_cxt *cxt; cxt = (_rl_readstr_cxt *)xmalloc (sizeof (_rl_readstr_cxt)); cxt->flags = flags; cxt->save_point = rl_point; cxt->save_mark = rl_mark; cxt->save_line = where_history (); cxt->prevc = cxt->lastc = 0; cxt->compfunc = NULL; return cxt; } void _rl_rscxt_dispose (_rl_readstr_cxt *cxt, int flags) { xfree (cxt); } /* This isn't used yet */ void _rl_free_saved_readstr_line () { if (_rl_saved_line_for_readstr) /* This doesn't free any saved undo list, if it needs to, rl_clear_history shows how to do it. */ _rl_free_saved_line (_rl_saved_line_for_readstr); _rl_saved_line_for_readstr = (HIST_ENTRY *)NULL; } void _rl_unsave_saved_readstr_line () { if (_rl_saved_line_for_readstr) { _rl_free_undo_list (rl_undo_list); _rl_unsave_line (_rl_saved_line_for_readstr); /* restores rl_undo_list */ } _rl_saved_line_for_readstr = (HIST_ENTRY *)NULL; } _rl_readstr_cxt * _rl_readstr_init (int pchar, int flags) { _rl_readstr_cxt *cxt; char *p; cxt = _rl_rscxt_alloc (flags); _rl_saved_line_for_readstr = _rl_alloc_saved_line (); rl_undo_list = 0; rl_line_buffer[0] = 0; rl_end = rl_point = 0; p = _rl_make_prompt_for_search (pchar ? pchar : '@'); cxt->flags |= READSTR_FREEPMT; rl_message ("%s", p); xfree (p); RL_SETSTATE (RL_STATE_READSTR); _rl_rscxt = cxt; return cxt; } int _rl_readstr_cleanup (_rl_readstr_cxt *cxt, int r) { _rl_rscxt_dispose (cxt, 0); _rl_rscxt = 0; RL_UNSETSTATE (RL_STATE_READSTR); return (r != 1); } void _rl_readstr_restore (_rl_readstr_cxt *cxt) { _rl_unsave_saved_readstr_line (); /* restores rl_undo_list */ rl_point = cxt->save_point; rl_mark = cxt->save_mark; if (cxt->flags & READSTR_FREEPMT) rl_restore_prompt (); /* _rl_make_prompt_for_search saved it */ cxt->flags &= ~READSTR_FREEPMT; rl_clear_message (); _rl_fix_point (1); } int _rl_readstr_sigcleanup (_rl_readstr_cxt *cxt, int r) { if (cxt->flags & READSTR_FREEPMT) rl_restore_prompt (); /* _rl_make_prompt_for_search saved it */ cxt->flags &= ~READSTR_FREEPMT; return (_rl_readstr_cleanup (cxt, r)); } int _rl_readstr_getchar (_rl_readstr_cxt *cxt) { int c; cxt->prevc = cxt->lastc; /* Read a key and decide how to proceed. */ RL_SETSTATE(RL_STATE_MOREINPUT); c = cxt->lastc = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); #if defined (HANDLE_MULTIBYTE) /* This ends up with C (and LASTC) being set to the last byte of the multibyte character. In most cases c == lastc == mb[0] */ if (c >= 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) c = cxt->lastc = _rl_read_mbstring (cxt->lastc, cxt->mb, MB_LEN_MAX); #endif RL_CHECK_SIGNALS (); return c; } /* Process just-read character C according to readstr context CXT. Return -1 if the caller should abort the read, 0 if we should break out of the loop, and 1 if we should continue to read characters. This can perform completion on the string read so far (stored in rl_line_buffer) if the caller has set up a completion function. The completion function can return -1 to indicate that we should abort the read. If we return -1 we will call _rl_readstr_restore to clean up the state, leaving the caller to free the context. */ int _rl_readstr_dispatch (_rl_readstr_cxt *cxt, int c) { int n; if (c < 0) c = CTRL ('C'); /* could consider looking up the function bound to they key and dispatching off that, but you want most characters inserted by default without having to quote. */ switch (c) { case CTRL('W'): rl_unix_word_rubout (1, c); break; case CTRL('U'): rl_unix_line_discard (1, c); break; case CTRL('Q'): case CTRL('V'): n = rl_quoted_insert (1, c); if (n < 0) { _rl_readstr_restore (cxt); return -1; } cxt->lastc = (rl_point > 0) ? rl_line_buffer[rl_point - 1] : rl_line_buffer[0]; /* preserve prevc */ break; case RETURN: case NEWLINE: return 0; case CTRL('H'): case RUBOUT: if (rl_point == 0) { _rl_readstr_restore (cxt); return -1; } _rl_rubout_char (1, c); break; case CTRL('C'): case CTRL('G'): rl_ding (); _rl_readstr_restore (cxt); return -1; case ESC: /* Allow users to bracketed-paste text into the string. Similar code is in search.c:_rl_nsearch_dispatch(). */ if (_rl_enable_bracketed_paste && ((n = _rl_nchars_available ()) >= (BRACK_PASTE_SLEN-1))) { if (_rl_read_bracketed_paste_prefix (c) == 1) rl_bracketed_paste_begin (1, c); else { c = rl_read_key (); /* get the ESC that got pushed back */ _rl_insert_char (1, c); } } else _rl_insert_char (1, c); break; case ' ': if ((cxt->flags & READSTR_NOSPACE) == 0) { _rl_insert_char (1, c); break; } /* FALLTHROUGH */ case TAB: /* Perform completion if the caller has set a completion function. */ n = (cxt->compfunc) ? (*cxt->compfunc) (cxt, c) : _rl_insert_char (1, c); if (n < 0) { _rl_readstr_restore (cxt); return -1; } break; #if 0 case CTRL('_'): rl_do_undo (); break; #endif default: #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_insert_text (cxt->mb); else #endif _rl_insert_char (1, c); break; } (*rl_redisplay_function) (); rl_deactivate_mark (); return 1; } /* **************************************************************** */ /* */ /* Reading and Executing named commands */ /* */ /* **************************************************************** */ /* A completion generator for bindable readline command names. */ static char * readcmd_completion_function (const char *text, int state) { static const char **cmdlist = NULL; static size_t lind, nlen; const char *cmdname; if (state == 0) { if (cmdlist) free (cmdlist); cmdlist = rl_funmap_names (); lind = 0; nlen = RL_STRLEN (text); } if (cmdlist == 0 || cmdlist[lind] == 0) return (char *)NULL; while (cmdlist[lind]) { cmdname = cmdlist[lind++]; if (STREQN (text, cmdname, nlen)) return (savestring (cmdname)); } return ((char *)NULL); } static void _rl_display_cmdname_matches (char **matches) { size_t len, max, i; int old; old = rl_filename_completion_desired; rl_filename_completion_desired = 0; /* There is more than one match. Find out how many there are, and find the maximum printed length of a single entry. */ for (max = 0, i = 1; matches[i]; i++) { len = strlen (matches[i]); if (len > max) max = len; } len = i - 1; rl_display_match_list (matches, len, max); rl_filename_completion_desired = old; rl_forced_update_display (); rl_display_fixed = 1; } static int _rl_readcmd_complete (_rl_readstr_cxt *cxt, int c) { char **matches; char *prefix; size_t plen; matches = rl_completion_matches (rl_line_buffer, readcmd_completion_function); if (RL_SIG_RECEIVED()) { _rl_free_match_list (matches); matches = 0; RL_CHECK_SIGNALS (); return -1; } else if (matches == 0) rl_ding (); /* Whether or not there are multiple matches, we just want to append the new characters in matches[0]. We display possible matches if we didn't append anything. */ if (matches) { prefix = matches[0]; plen = strlen (prefix); if (plen > rl_end) { size_t n; for (n = rl_end; n < plen && prefix[n]; n++) _rl_insert_char (1, prefix[n]); } else if (matches[1]) _rl_display_cmdname_matches (matches); _rl_free_match_list (matches); } return 0; } /* Use the readstr functions to read a bindable command name using the line buffer, with completion. */ static char * _rl_read_command_name () { _rl_readstr_cxt *cxt; char *ret; int c, r; cxt = _rl_readstr_init ('!', READSTR_NOSPACE); cxt->compfunc = _rl_readcmd_complete; /* skip callback stuff for now */ r = 0; while (1) { c = _rl_readstr_getchar (cxt); if (c < 0) { _rl_readstr_restore (cxt); _rl_readstr_cleanup (cxt, r); return NULL; } if (c == 0) break; r = _rl_readstr_dispatch (cxt, c); if (r < 0) { _rl_readstr_cleanup (cxt, r); return NULL; /* dispatch function cleans up */ } else if (r == 0) break; } ret = savestring (rl_line_buffer); /* Now restore the original line and perform one final redisplay. */ _rl_readstr_restore (cxt); (*rl_redisplay_function) (); /* And free up the context. */ _rl_readstr_cleanup (cxt, r); return ret; } /* Read a command name from the keyboard and execute it as if the bound key sequence had been entered. */ int rl_execute_named_command (int count, int key) { char *command; rl_command_func_t *func; int r; command = _rl_read_command_name (); if (command == 0 || *command == '\0') { free (command); return 1; } func = rl_named_function (command); free (command); if (func) { int prev, ostate; prev = rl_dispatching; ostate = RL_ISSTATE (RL_STATE_DISPATCHING); rl_dispatching = 1; RL_SETSTATE (RL_STATE_DISPATCHING); /* make sure it's set */ r = (*func) (count, key); if (ostate == 0) RL_UNSETSTATE (RL_STATE_DISPATCHING); /* unset it if it wasn't set */ rl_dispatching = prev; } else { rl_ding (); r = 1; } return r; } readline-8.3/chardefs.h000644 000436 000024 00000011164 14463251723 015172 0ustar00chetstaff000000 000000 /* chardefs.h -- Character definitions for readline. */ /* Copyright (C) 1994-2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #ifndef _CHARDEFS_H_ #define _CHARDEFS_H_ #include #if defined (HAVE_CONFIG_H) # if defined (HAVE_STRING_H) # include # endif /* HAVE_STRING_H */ # if defined (HAVE_STRINGS_H) # include # endif /* HAVE_STRINGS_H */ #else # include #endif /* !HAVE_CONFIG_H */ #ifndef whitespace #define whitespace(c) (((c) == ' ') || ((c) == '\t')) #endif #ifdef CTRL # undef CTRL #endif #ifdef UNCTRL # undef UNCTRL #endif /* Some character stuff. */ #define control_character_threshold 0x020 /* Smaller than this is control. */ #define control_character_mask 0x1f /* 0x20 - 1 */ #define meta_character_threshold 0x07f /* Larger than this is Meta. */ #define control_character_bit 0x40 /* 0x000000, must be off. */ #define meta_character_bit 0x080 /* x0000000, must be on. */ #define largest_char 255 /* Largest character value. */ #define CTRL_CHAR(c) ((c) < control_character_threshold && (((c) & 0x80) == 0)) #define META_CHAR(c) ((unsigned char)(c) > meta_character_threshold && (unsigned char)(c) <= largest_char) #define CTRL(c) ((c) & control_character_mask) #define META(c) ((c) | meta_character_bit) #define UNMETA(c) ((c) & (~meta_character_bit)) #define UNCTRL(c) _rl_to_upper(((c)|control_character_bit)) #ifndef UCHAR_MAX # define UCHAR_MAX 255 #endif #ifndef CHAR_MAX # define CHAR_MAX 127 #endif /* use this as a proxy for C89 */ #if defined (HAVE_STDLIB_H) && defined (HAVE_STRING_H) # define IN_CTYPE_DOMAIN(c) 1 # define NON_NEGATIVE(c) 1 #else # define IN_CTYPE_DOMAIN(c) ((c) >= 0 && (c) <= CHAR_MAX) # define NON_NEGATIVE(c) ((unsigned char)(c) == (c)) #endif #if !defined (isxdigit) && !defined (HAVE_ISXDIGIT) && !defined (__cplusplus) # define isxdigit(c) (isdigit((unsigned char)(c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) #endif /* Some systems define these; we want our definitions. */ #undef ISPRINT /* Beware: these only work with single-byte ASCII characters. */ #define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum ((unsigned char)c)) #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha ((unsigned char)c)) #define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit ((unsigned char)c)) #define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower ((unsigned char)c)) #define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint ((unsigned char)c)) #define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper ((unsigned char)c)) #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit ((unsigned char)c)) #define _rl_lowercase_p(c) (NON_NEGATIVE(c) && ISLOWER(c)) #define _rl_uppercase_p(c) (NON_NEGATIVE(c) && ISUPPER(c)) #define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') #define _rl_alphabetic_p(c) (NON_NEGATIVE(c) && ISALNUM(c)) #define _rl_pure_alphabetic(c) (NON_NEGATIVE(c) && ISALPHA(c)) #ifndef _rl_to_upper # define _rl_to_upper(c) (_rl_lowercase_p(c) ? toupper((unsigned char)(c)) : (c)) # define _rl_to_lower(c) (_rl_uppercase_p(c) ? tolower((unsigned char)(c)) : (c)) #endif #ifndef _rl_digit_value # define _rl_digit_value(x) ((x) - '0') #endif #ifndef _rl_isident # define _rl_isident(c) (ISALNUM(c) || (c) == '_') #endif #ifndef ISOCTAL # define ISOCTAL(c) ((c) >= '0' && (c) <= '7') #endif #define OCTVALUE(c) ((c) - '0') #define HEXVALUE(c) \ (((c) >= 'a' && (c) <= 'f') \ ? (c)-'a'+10 \ : (c) >= 'A' && (c) <= 'F' ? (c)-'A'+10 : (c)-'0') #ifndef NEWLINE #define NEWLINE '\n' #endif #ifndef RETURN #define RETURN CTRL('M') #endif #ifndef RUBOUT #define RUBOUT 0x7f #endif #ifndef TAB #define TAB '\t' #endif #ifdef ABORT_CHAR #undef ABORT_CHAR #endif #define ABORT_CHAR CTRL('G') #ifdef PAGE #undef PAGE #endif #define PAGE CTRL('L') #ifdef SPACE #undef SPACE #endif #define SPACE ' ' /* XXX - was 0x20 */ #ifdef ESC #undef ESC #endif #define ESC CTRL('[') #endif /* _CHARDEFS_H_ */ readline-8.3/histlib.h000644 000436 000024 00000005462 14656457041 015062 0ustar00chetstaff000000 000000 /* histlib.h -- internal definitions for the history library. */ /* Copyright (C) 1989-2009,2021-2023 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. History 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 3 of the License, or (at your option) any later version. History 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 History. If not, see . */ #if !defined (_HISTLIB_H_) #define _HISTLIB_H_ #if defined (HAVE_STRING_H) # include #else # include #endif /* !HAVE_STRING_H */ #if !defined (STREQ) #define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) #define STREQN(a, b, n) (((n) == 0) ? (1) \ : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) #endif #if !defined (HAVE_STRCASECMP) #define strcasecmp(a,b) strcmp ((a), (b)) #define strncasecmp(a, b, n) strncmp ((a), (b), (n)) #endif #ifndef savestring #define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x)) #endif #ifndef whitespace #define whitespace(c) (((c) == ' ') || ((c) == '\t')) #endif #ifndef _rl_digit_p #define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') #endif #ifndef _rl_digit_value #define _rl_digit_value(c) ((c) - '0') #endif #ifndef member #define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0) #endif #ifndef FREE # define FREE(x) if (x) free (x) #endif /* Possible history errors passed to hist_error. */ #define EVENT_NOT_FOUND 0 #define BAD_WORD_SPEC 1 #define SUBST_FAILED 2 #define BAD_MODIFIER 3 #define NO_PREV_SUBST 4 /* Possible definitions for history starting point specification. */ #define NON_ANCHORED_SEARCH 0 #define ANCHORED_SEARCH 0x01 #define PATTERN_SEARCH 0x02 #define CASEFOLD_SEARCH 0x04 /* Possible definitions for what style of writing the history file we want. */ #define HISTORY_APPEND 0 #define HISTORY_OVERWRITE 1 /* internal extern function declarations used by other parts of the library */ /* histsearch.c */ extern int _hs_history_patsearch (const char *, int, int, int); extern int _hs_history_search (const char *, int, int, int); /* history.c */ extern void _hs_replace_history_data (int, histdata_t *, histdata_t *); extern int _hs_search_history_data (histdata_t *); extern int _hs_at_end_of_history (void); /* histfile.c */ extern void _hs_append_history_line (int, const char *); #endif /* !_HISTLIB_H_ */ readline-8.3/rlmbutil.h000644 000436 000024 00000027354 15020315055 015242 0ustar00chetstaff000000 000000 /* rlmbutil.h -- utility functions for multibyte characters. */ /* Copyright (C) 2001-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RL_MBUTIL_H_) #define _RL_MBUTIL_H_ #include "rlstdc.h" /************************************************/ /* check multibyte capability for I18N code */ /************************************************/ /* For platforms which support the ISO C amendment 1 functionality we support user defined character classes. */ /* Solaris 2.5 has a bug: must be included before . */ #if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) && defined (HAVE_LOCALE_H) # include # include # if defined (HAVE_ISWCTYPE) && \ defined (HAVE_ISWLOWER) && \ defined (HAVE_ISWUPPER) && \ defined (HAVE_MBSRTOWCS) && \ defined (HAVE_MBRTOWC) && \ defined (HAVE_MBRLEN) && \ defined (HAVE_TOWLOWER) && \ defined (HAVE_TOWUPPER) && \ defined (HAVE_WCHAR_T) && \ defined (HAVE_WCWIDTH) /* system is supposed to support XPG5 */ # define HANDLE_MULTIBYTE 1 # endif #endif /* If we don't want multibyte chars even on a system that supports them, let the configuring user turn multibyte support off. */ #if defined (NO_MULTIBYTE_SUPPORT) # undef HANDLE_MULTIBYTE #endif /* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ #if HANDLE_MULTIBYTE && !defined (HAVE_MBSTATE_T) # define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0) # define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0) # define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0) # define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) # define mbrlen(s, n, ps) (mbrlen) (s, n, 0) # define mbstate_t int #endif /* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to handle multibyte chars (some systems define MB_LEN_MAX as 1) */ #ifdef HANDLE_MULTIBYTE # include # if defined(MB_LEN_MAX) && (MB_LEN_MAX < 16) # undef MB_LEN_MAX # endif # if !defined (MB_LEN_MAX) # define MB_LEN_MAX 16 # endif #endif /************************************************/ /* end of multibyte capability checks for I18N */ /************************************************/ /* * wchar_t doesn't work for 32-bit values on Windows using MSVC */ #ifdef WCHAR_T_BROKEN # define WCHAR_T char32_t # define MBRTOWC mbrtoc32 # define WCRTOMB c32rtomb #else /* normal systems */ # define WCHAR_T wchar_t # define MBRTOWC mbrtowc # define WCRTOMB wcrtomb #endif /* * Flags for _rl_find_prev_mbchar and _rl_find_next_mbchar: * * MB_FIND_ANY find any multibyte character * MB_FIND_NONZERO find a non-zero-width multibyte character */ #define MB_FIND_ANY 0x00 #define MB_FIND_NONZERO 0x01 extern int _rl_find_prev_mbchar (const char *, int, int); extern int _rl_find_next_mbchar (const char *, int, int, int); #ifdef HANDLE_MULTIBYTE extern size_t _rl_mbstrlen (const char *); extern int _rl_compare_chars (const char *, int, mbstate_t *, const char *, int, mbstate_t *); extern int _rl_get_char_len (const char *, mbstate_t *); extern int _rl_adjust_point (const char *, int, mbstate_t *); extern int _rl_read_mbchar (char *, int); extern int _rl_read_mbstring (int, char *, int); extern int _rl_is_mbchar_matched (const char *, int, int, char *, int); extern WCHAR_T _rl_char_value (const char *, int); extern int _rl_walphabetic (WCHAR_T); extern int _rl_mb_strcaseeqn (const char *, size_t, const char *, size_t, size_t, int); extern int _rl_mb_charcasecmp (const char *, mbstate_t *, const char *, mbstate_t *, int); #define _rl_to_wupper(wc) (iswlower (wc) ? towupper (wc) : (wc)) #define _rl_to_wlower(wc) (iswupper (wc) ? towlower (wc) : (wc)) #define MB_NEXTCHAR(b,s,c,f) \ ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \ ? _rl_find_next_mbchar ((b), (s), (c), (f)) \ : ((s) + (c))) #define MB_PREVCHAR(b,s,f) \ ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \ ? _rl_find_prev_mbchar ((b), (s), (f)) \ : ((s) - 1)) #define MB_INVALIDCH(x) ((x) == (size_t)-1 || (x) == (size_t)-2) #define MB_NULLWCH(x) ((x) == 0) /* Try and shortcut the printable ascii characters to cut down the number of calls to a libc wcwidth() */ static inline int _rl_wcwidth (WCHAR_T wc) { switch (wc) { case L' ': case L'!': case L'"': case L'#': case L'%': case L'&': case L'\'': case L'(': case L')': case L'*': case L'+': case L',': case L'-': case L'.': case L'/': case L'0': case L'1': case L'2': case L'3': case L'4': case L'5': case L'6': case L'7': case L'8': case L'9': case L':': case L';': case L'<': case L'=': case L'>': case L'?': case L'A': case L'B': case L'C': case L'D': case L'E': case L'F': case L'G': case L'H': case L'I': case L'J': case L'K': case L'L': case L'M': case L'N': case L'O': case L'P': case L'Q': case L'R': case L'S': case L'T': case L'U': case L'V': case L'W': case L'X': case L'Y': case L'Z': case L'[': case L'\\': case L']': case L'^': case L'_': case L'a': case L'b': case L'c': case L'd': case L'e': case L'f': case L'g': case L'h': case L'i': case L'j': case L'k': case L'l': case L'm': case L'n': case L'o': case L'p': case L'q': case L'r': case L's': case L't': case L'u': case L'v': case L'w': case L'x': case L'y': case L'z': case L'{': case L'|': case L'}': case L'~': return 1; default: return wcwidth (wc); } } /* Unicode combining characters as of version 15.1 */ #define UNICODE_COMBINING_CHAR(x) \ (((x) >= 0x0300 && (x) <= 0x036F) || \ ((x) >= 0x1AB0 && (x) <= 0x1AFF) || \ ((x) >= 0x1DC0 && (x) <= 0x1DFF) || \ ((x) >= 0x20D0 && (x) <= 0x20FF) || \ ((x) >= 0xFE20 && (x) <= 0xFE2F)) #if defined (WCWIDTH_BROKEN) # define WCWIDTH(wc) ((_rl_utf8locale && UNICODE_COMBINING_CHAR((int)wc)) ? 0 : _rl_wcwidth(wc)) #else # define WCWIDTH(wc) _rl_wcwidth(wc) #endif #if defined (WCWIDTH_BROKEN) # define IS_COMBINING_CHAR(x) (WCWIDTH(x) == 0 && iswcntrl(x) == 0) #else # define IS_COMBINING_CHAR(x) (WCWIDTH(x) == 0) #endif #define IS_BASE_CHAR(x) (iswgraph(x) && WCWIDTH(x) > 0) #define UTF8_SINGLEBYTE(c) (((c) & 0x80) == 0) #define UTF8_MBFIRSTCHAR(c) (((c) & 0xc0) == 0xc0) #define UTF8_MBCHAR(c) (((c) & 0xc0) == 0x80) #else /* !HANDLE_MULTIBYTE */ #undef MB_LEN_MAX #undef MB_CUR_MAX #define MB_LEN_MAX 1 #define MB_CUR_MAX 1 #define _rl_find_prev_mbchar(b, i, f) (((i) == 0) ? (i) : ((i) - 1)) #define _rl_find_next_mbchar(b, i1, i2, f) ((i1) + (i2)) #define _rl_char_value(buf,ind) ((buf)[(ind)]) #define _rl_walphabetic(c) (rl_alphabetic (c)) #define _rl_to_wupper(c) (_rl_to_upper (c)) #define _rl_to_wlower(c) (_rl_to_lower (c)) #define MB_NEXTCHAR(b,s,c,f) ((s) + (c)) #define MB_PREVCHAR(b,s,f) ((s) - 1) #define MB_INVALIDCH(x) (0) #define MB_NULLWCH(x) (0) #define UTF8_SINGLEBYTE(c) (1) #if !defined (HAVE_WCHAR_T) && !defined (wchar_t) # define wchar_t int #endif #endif /* !HANDLE_MULTIBYTE */ extern int rl_byte_oriented; /* Snagged from gnulib */ #ifdef HANDLE_MULTIBYTE #ifdef __cplusplus extern "C" { #endif /* is_basic(c) tests whether the single-byte character c is - in the ISO C "basic character set" or is one of '@', '$', and '`' which ISO C 23 § 5.2.1.1.(1) guarantees to be single-byte and in practice are safe to treat as basic in the execution character set, or - in the POSIX "portable character set", which equally guarantees to be single-byte. */ #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('$' == 36) && ('%' == 37) && ('&' == 38) && ('\'' == 39) \ && ('(' == 40) && (')' == 41) && ('*' == 42) && ('+' == 43) \ && (',' == 44) && ('-' == 45) && ('.' == 46) && ('/' == 47) \ && ('0' == 48) && ('1' == 49) && ('2' == 50) && ('3' == 51) \ && ('4' == 52) && ('5' == 53) && ('6' == 54) && ('7' == 55) \ && ('8' == 56) && ('9' == 57) && (':' == 58) && (';' == 59) \ && ('<' == 60) && ('=' == 61) && ('>' == 62) && ('?' == 63) \ && ('@' == 64) && ('A' == 65) && ('B' == 66) && ('C' == 67) \ && ('D' == 68) && ('E' == 69) && ('F' == 70) && ('G' == 71) \ && ('H' == 72) && ('I' == 73) && ('J' == 74) && ('K' == 75) \ && ('L' == 76) && ('M' == 77) && ('N' == 78) && ('O' == 79) \ && ('P' == 80) && ('Q' == 81) && ('R' == 82) && ('S' == 83) \ && ('T' == 84) && ('U' == 85) && ('V' == 86) && ('W' == 87) \ && ('X' == 88) && ('Y' == 89) && ('Z' == 90) && ('[' == 91) \ && ('\\' == 92) && (']' == 93) && ('^' == 94) && ('_' == 95) \ && ('`' == 96) && ('a' == 97) && ('b' == 98) && ('c' == 99) \ && ('d' == 100) && ('e' == 101) && ('f' == 102) && ('g' == 103) \ && ('h' == 104) && ('i' == 105) && ('j' == 106) && ('k' == 107) \ && ('l' == 108) && ('m' == 109) && ('n' == 110) && ('o' == 111) \ && ('p' == 112) && ('q' == 113) && ('r' == 114) && ('s' == 115) \ && ('t' == 116) && ('u' == 117) && ('v' == 118) && ('w' == 119) \ && ('x' == 120) && ('y' == 121) && ('z' == 122) && ('{' == 123) \ && ('|' == 124) && ('}' == 125) && ('~' == 126) /* The character set is ISO-646, not EBCDIC. */ # define IS_BASIC_ASCII 1 /* All locale encodings (see localcharset.h) map the characters 0x00..0x7F to U+0000..U+007F, like ASCII, except for CP864 different mapping of '%' SHIFT_JIS different mappings of 0x5C, 0x7E JOHAB different mapping of 0x5C However, these characters in the range 0x20..0x7E are in the ISO C "basic character set" and in the POSIX "portable character set", which ISO C and POSIX guarantee to be single-byte. Thus, locales with these encodings are not POSIX compliant. And they are most likely not in use any more (as of 2023). */ # define _rl_is_basic(c) ((unsigned char) (c) < 0x80) #else static inline int _rl_is_basic (char c) { switch (c) { case '\0': case '\007': case '\010': case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': case '!': case '"': case '#': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '[': case '\\': case ']': case '^': case '_': case '`': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~': return 1; default: return 0; } } #endif #ifdef __cplusplus } #endif #endif /* HANDLE_MULTIBYTE */ #endif /* _RL_MBUTIL_H_ */ readline-8.3/tilde.c000644 000436 000024 00000031200 14643255245 014503 0ustar00chetstaff000000 000000 /* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ /* Copyright (C) 1988-2020,2023-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if defined (HAVE_CONFIG_H) # include #endif #if defined (HAVE_UNISTD_H) # ifdef _MINIX # include # endif # include #endif #if defined (HAVE_STRING_H) # include #else /* !HAVE_STRING_H */ # include #endif /* !HAVE_STRING_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include #if defined (HAVE_PWD_H) #include #endif #include "tilde.h" #if defined (TEST) || defined (STATIC_MALLOC) static void *xmalloc (), *xrealloc (); #else # include "xmalloc.h" #endif /* TEST || STATIC_MALLOC */ #if !defined (HAVE_GETPW_DECLS) # if defined (HAVE_GETPWUID) extern struct passwd *getpwuid (uid_t); # endif # if defined (HAVE_GETPWNAM) extern struct passwd *getpwnam (const char *); # endif #endif /* !HAVE_GETPW_DECLS */ #if !defined (savestring) #define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) #endif /* !savestring */ /* If being compiled as part of bash, these will be satisfied from variables.o. If being compiled as part of readline, they will be satisfied from shell.o. */ extern char *sh_get_home_dir (void); extern char *sh_get_env_value (const char *); /* The default value of tilde_additional_prefixes. This is set to whitespace preceding a tilde so that simple programs which do not perform any word separation get desired behaviour. */ static const char *default_prefixes[] = { " ~", "\t~", (const char *)NULL }; /* The default value of tilde_additional_suffixes. This is set to whitespace or newline so that simple programs which do not perform any word separation get desired behaviour. */ static const char *default_suffixes[] = { " ", "\n", (const char *)NULL }; /* If non-null, this contains the address of a function that the application wants called before trying the standard tilde expansions. The function is called with the text sans tilde, and returns a malloc()'ed string which is the expansion, or a NULL pointer if the expansion fails. */ tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL; /* If non-null, this contains the address of a function to call if the standard meaning for expanding a tilde fails. The function is called with the text (sans tilde, as in "foo"), and returns a malloc()'ed string which is the expansion, or a NULL pointer if there is no expansion. */ tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL; /* When non-null, this is a NULL terminated array of strings which are duplicates for a tilde prefix. Bash uses this to expand `=~' and `:~'. */ char **tilde_additional_prefixes = (char **)default_prefixes; /* When non-null, this is a NULL terminated array of strings which match the end of a username, instead of just "/". Bash sets this to `:' and `=~'. */ char **tilde_additional_suffixes = (char **)default_suffixes; static int tilde_find_prefix (const char *, int *); static int tilde_find_suffix (const char *); static char *isolate_tilde_prefix (const char *, int *); static char *glue_prefix_and_suffix (char *, const char *, int); /* Find the start of a tilde expansion in STRING, and return the index of the tilde which starts the expansion. Place the length of the text which identified this tilde starter in LEN, excluding the tilde itself. */ static int tilde_find_prefix (const char *string, int *len) { register int i, j, string_len; register char **prefixes; prefixes = tilde_additional_prefixes; string_len = strlen (string); *len = 0; if (*string == '\0' || *string == '~') return (0); if (prefixes) { for (i = 0; i < string_len; i++) { for (j = 0; prefixes[j]; j++) { if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0) { *len = strlen (prefixes[j]) - 1; return (i + *len); } } } } return (string_len); } /* Find the end of a tilde expansion in STRING, and return the index of the character which ends the tilde definition. */ static int tilde_find_suffix (const char *string) { int i, j; size_t string_len; char **suffixes; suffixes = tilde_additional_suffixes; string_len = strlen (string); for (i = 0; i < string_len; i++) { #if defined (__MSDOS__) if (string[i] == '/' || string[i] == '\\' /* || !string[i] */) #else if (string[i] == '/' /* || !string[i] */) #endif break; for (j = 0; suffixes && suffixes[j]; j++) { if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0) return (i); } } return (i); } /* Return a new string which is the result of tilde expanding STRING. */ char * tilde_expand (const char *string) { char *result; size_t result_size, result_index; result_index = result_size = 0; if (result = strchr (string, '~')) result = (char *)xmalloc (result_size = (strlen (string) + 16)); else result = (char *)xmalloc (result_size = (strlen (string) + 1)); /* Scan through STRING expanding tildes as we come to them. */ while (1) { int start, end; char *tilde_word, *expansion; int len; /* Make START point to the tilde which starts the expansion. */ start = tilde_find_prefix (string, &len); /* Copy the skipped text into the result. */ if ((result_index + start + 1) > result_size) result = (char *)xrealloc (result, 1 + (result_size += (start + 20))); strncpy (result + result_index, string, start); result_index += start; /* Advance STRING to the starting tilde. */ string += start; /* Make END be the index of one after the last character of the username. */ end = tilde_find_suffix (string); /* If both START and END are zero, we are all done. */ if (!start && !end) break; /* Expand the entire tilde word, and copy it into RESULT. */ tilde_word = (char *)xmalloc (1 + end); strncpy (tilde_word, string, end); tilde_word[end] = '\0'; string += end; expansion = tilde_expand_word (tilde_word); if (expansion == 0) expansion = tilde_word; else xfree (tilde_word); len = strlen (expansion); #ifdef __CYGWIN__ /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when $HOME for `user' is /. On cygwin, // denotes a network drive. */ if (len > 1 || *expansion != '/' || *string != '/') #endif { if ((result_index + len + 1) > result_size) result = (char *)xrealloc (result, 1 + (result_size += (len + 20))); strcpy (result + result_index, expansion); result_index += len; } xfree (expansion); } result[result_index] = '\0'; return (result); } /* Take FNAME and return the tilde prefix we want expanded. If LENP is non-null, the index of the end of the prefix into FNAME is returned in the location it points to. */ static char * isolate_tilde_prefix (const char *fname, int *lenp) { char *ret; int i; ret = (char *)xmalloc (strlen (fname)); #if defined (__MSDOS__) for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++) #else for (i = 1; fname[i] && fname[i] != '/'; i++) #endif ret[i - 1] = fname[i]; ret[i - 1] = '\0'; if (lenp) *lenp = i; return ret; } #if 0 /* Public function to scan a string (FNAME) beginning with a tilde and find the portion of the string that should be passed to the tilde expansion function. Right now, it just calls tilde_find_suffix and allocates new memory, but it can be expanded to do different things later. */ char * tilde_find_word (const char *fname, int flags, int *lenp) { int x; char *r; x = tilde_find_suffix (fname); if (x == 0) { r = savestring (fname); if (lenp) *lenp = 0; } else { r = (char *)xmalloc (1 + x); strncpy (r, fname, x); r[x] = '\0'; if (lenp) *lenp = x; } return r; } #endif /* Return a string that is PREFIX concatenated with SUFFIX starting at SUFFIND. */ static char * glue_prefix_and_suffix (char *prefix, const char *suffix, int suffind) { char *ret; size_t plen, slen; plen = (prefix && *prefix) ? strlen (prefix) : 0; slen = strlen (suffix + suffind); ret = (char *)xmalloc (plen + slen + 1); if (plen) strcpy (ret, prefix); strcpy (ret + plen, suffix + suffind); return ret; } /* Do the work of tilde expansion on FILENAME. FILENAME starts with a tilde. If there is no expansion, call tilde_expansion_failure_hook. This always returns a newly-allocated string, never static storage. */ char * tilde_expand_word (const char *filename) { char *dirname, *expansion, *username; int user_len; struct passwd *user_entry; if (filename == 0) return ((char *)NULL); if (*filename != '~') return (savestring (filename)); /* A leading `~/' or a bare `~' is *always* translated to the value of $HOME or the home directory of the current user, regardless of any preexpansion hook. */ if (filename[1] == '\0' || filename[1] == '/') { /* Prefix $HOME to the rest of the string. */ expansion = sh_get_env_value ("HOME"); #if defined (_WIN32) if (expansion == 0) expansion = sh_get_env_value ("APPDATA"); #endif /* If there is no HOME variable, look up the directory in the password database. */ if (expansion == 0) expansion = sh_get_home_dir (); return (glue_prefix_and_suffix (expansion, filename, 1)); } username = isolate_tilde_prefix (filename, &user_len); if (tilde_expansion_preexpansion_hook) { expansion = (*tilde_expansion_preexpansion_hook) (username); if (expansion) { dirname = glue_prefix_and_suffix (expansion, filename, user_len); xfree (username); xfree (expansion); return (dirname); } } /* No preexpansion hook, or the preexpansion hook failed. Look in the password database. */ dirname = (char *)NULL; #if defined (HAVE_GETPWNAM) user_entry = getpwnam (username); #else user_entry = 0; #endif if (user_entry == 0) { /* If the calling program has a special syntax for expanding tildes, and we couldn't find a standard expansion, then let them try. */ if (tilde_expansion_failure_hook) { expansion = (*tilde_expansion_failure_hook) (username); if (expansion) { dirname = glue_prefix_and_suffix (expansion, filename, user_len); xfree (expansion); } } /* If we don't have a failure hook, or if the failure hook did not expand the tilde, return a copy of what we were passed. */ if (dirname == 0) dirname = savestring (filename); } #if defined (HAVE_GETPWENT) else dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len); #endif xfree (username); #if defined (HAVE_GETPWENT) endpwent (); #endif return (dirname); } #if defined (TEST) #undef NULL #include main (int argc, char **argv) { char *result, line[512]; int done = 0; while (!done) { printf ("~expand: "); fflush (stdout); if (!gets (line)) strcpy (line, "done"); if ((strcmp (line, "done") == 0) || (strcmp (line, "quit") == 0) || (strcmp (line, "exit") == 0)) { done = 1; break; } result = tilde_expand (line); printf (" --> %s\n", result); free (result); } exit (0); } static void memory_error_and_abort (void); static void * xmalloc (size_t bytes) { void *temp = (char *)malloc (bytes); if (!temp) memory_error_and_abort (); return (temp); } static void * xrealloc (void *pointer, int bytes) { void *temp; if (!pointer) temp = malloc (bytes); else temp = realloc (pointer, bytes); if (!temp) memory_error_and_abort (); return (temp); } static void memory_error_and_abort (void) { fprintf (stderr, "readline: out of virtual memory\n"); abort (); } /* * Local variables: * compile-command: "gcc -g -DTEST -o tilde tilde.c" * end: */ #endif /* TEST */ readline-8.3/colors.h000644 000436 000024 00000007017 12651440543 014713 0ustar00chetstaff000000 000000 /* `dir', `vdir' and `ls' directory listing programs for GNU. Modified by Chet Ramey for Readline. Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012, 2015 Free Software Foundation, Inc. This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see . */ /* Written by Richard Stallman and David MacKenzie. */ /* Color support by Peter Anvin and Dennis Flaherty based on original patches by Greg Lee . */ #ifndef _COLORS_H_ #define _COLORS_H_ #include // size_t #if defined(__TANDEM) && defined(HAVE_STDBOOL_H) && (__STDC_VERSION__ < 199901L) typedef int _Bool; #endif #if defined (HAVE_STDBOOL_H) # include // bool #else typedef int _rl_bool_t; #ifdef bool # undef bool #endif #define bool _rl_bool_t #ifndef true # define true 1 # define false 0 #endif #endif /* !HAVE_STDBOOL_H */ /* Null is a valid character in a color indicator (think about Epson printers, for example) so we have to use a length/buffer string type. */ struct bin_str { size_t len; const char *string; }; /* file type indicators (dir, sock, fifo, ...) Default value is initialized in parse-colors.c. It is then modified from the values of $LS_COLORS. */ extern struct bin_str _rl_color_indicator[]; /* The LS_COLORS variable is in a termcap-like format. */ typedef struct _color_ext_type { struct bin_str ext; /* The extension we're looking for */ struct bin_str seq; /* The sequence to output when we do */ struct _color_ext_type *next; /* Next in list */ } COLOR_EXT_TYPE; /* file extensions indicators (.txt, .log, .jpg, ...) Values are taken from $LS_COLORS in rl_parse_colors(). */ extern COLOR_EXT_TYPE *_rl_color_ext_list; #define FILETYPE_INDICATORS \ { \ C_ORPHAN, C_FIFO, C_CHR, C_DIR, C_BLK, C_FILE, \ C_LINK, C_SOCK, C_FILE, C_DIR \ } /* Whether we used any colors in the output so far. If so, we will need to restore the default color later. If not, we will need to call prep_non_filename_text before using color for the first time. */ enum indicator_no { C_LEFT, C_RIGHT, C_END, C_RESET, C_NORM, C_FILE, C_DIR, C_LINK, C_FIFO, C_SOCK, C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR, C_SETUID, C_SETGID, C_STICKY, C_OTHER_WRITABLE, C_STICKY_OTHER_WRITABLE, C_CAP, C_MULTIHARDLINK, C_CLR_TO_EOL }; #if !S_IXUGO # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) #endif enum filetype { unknown, fifo, chardev, directory, blockdev, normal, symbolic_link, sock, whiteout, arg_directory }; /* Prefix color, currently same as socket */ #define C_PREFIX C_SOCK extern void _rl_put_indicator (const struct bin_str *ind); extern void _rl_set_normal_color (void); extern bool _rl_print_prefix_color (void); extern bool _rl_print_color_indicator (const char *f); extern void _rl_prep_non_filename_text (void); #endif /* !_COLORS_H_ */ readline-8.3/vi_keymap.c000644 000436 000024 00000107261 13060556765 015404 0ustar00chetstaff000000 000000 /* vi_keymap.c -- the keymap for vi_mode in readline (). */ /* Copyright (C) 1987-2017 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (BUFSIZ) #include #endif /* !BUFSIZ */ #include "readline.h" #if 0 extern KEYMAP_ENTRY_ARRAY vi_escape_keymap; #endif /* The keymap arrays for handling vi mode. */ KEYMAP_ENTRY_ARRAY vi_movement_keymap = { /* The regular control keys come first. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ { ISFUNC, rl_emacs_editing_mode }, /* Control-e */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ { ISFUNC, rl_abort }, /* Control-g */ { ISFUNC, rl_backward_char }, /* Control-h */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ { ISFUNC, rl_newline }, /* Control-j */ { ISFUNC, rl_kill_line }, /* Control-k */ { ISFUNC, rl_clear_screen }, /* Control-l */ { ISFUNC, rl_newline }, /* Control-m */ { ISFUNC, rl_get_next_history }, /* Control-n */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ { ISFUNC, rl_get_previous_history }, /* Control-p */ { ISFUNC, rl_quoted_insert }, /* Control-q */ { ISFUNC, rl_reverse_search_history }, /* Control-r */ { ISFUNC, rl_forward_search_history }, /* Control-s */ { ISFUNC, rl_transpose_chars }, /* Control-t */ { ISFUNC, rl_unix_line_discard }, /* Control-u */ { ISFUNC, rl_quoted_insert }, /* Control-v */ { ISFUNC, rl_vi_unix_word_rubout }, /* Control-w */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ { ISFUNC, rl_yank }, /* Control-y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ /* vi_escape_keymap */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ { ISFUNC, rl_vi_undo }, /* Control-_ */ /* The start of printing characters. */ { ISFUNC, rl_forward_char }, /* SPACE */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ { ISFUNC, rl_insert_comment }, /* # */ { ISFUNC, rl_end_of_line }, /* $ */ { ISFUNC, rl_vi_match }, /* % */ { ISFUNC, rl_vi_tilde_expand }, /* & */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ { ISFUNC, rl_vi_complete }, /* * */ { ISFUNC, rl_get_next_history}, /* + */ { ISFUNC, rl_vi_char_search }, /* , */ { ISFUNC, rl_get_previous_history }, /* - */ { ISFUNC, rl_vi_redo }, /* . */ { ISFUNC, rl_vi_search }, /* / */ /* Regular digits. */ { ISFUNC, rl_beg_of_line }, /* 0 */ { ISFUNC, rl_vi_arg_digit }, /* 1 */ { ISFUNC, rl_vi_arg_digit }, /* 2 */ { ISFUNC, rl_vi_arg_digit }, /* 3 */ { ISFUNC, rl_vi_arg_digit }, /* 4 */ { ISFUNC, rl_vi_arg_digit }, /* 5 */ { ISFUNC, rl_vi_arg_digit }, /* 6 */ { ISFUNC, rl_vi_arg_digit }, /* 7 */ { ISFUNC, rl_vi_arg_digit }, /* 8 */ { ISFUNC, rl_vi_arg_digit }, /* 9 */ /* A little more punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ { ISFUNC, rl_vi_char_search }, /* ; */ { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ { ISFUNC, rl_vi_complete }, /* = */ { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ { ISFUNC, rl_vi_search }, /* ? */ { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ /* Uppercase alphabet. */ { ISFUNC, rl_vi_append_eol }, /* A */ { ISFUNC, rl_vi_prev_word}, /* B */ { ISFUNC, rl_vi_change_to }, /* C */ { ISFUNC, rl_vi_delete_to }, /* D */ { ISFUNC, rl_vi_end_word }, /* E */ { ISFUNC, rl_vi_char_search }, /* F */ { ISFUNC, rl_vi_fetch_history }, /* G */ { ISFUNC, (rl_command_func_t *)0x0 }, /* H */ { ISFUNC, rl_vi_insert_beg }, /* I */ { ISFUNC, (rl_command_func_t *)0x0 }, /* J */ { ISFUNC, (rl_command_func_t *)0x0 }, /* K */ { ISFUNC, (rl_command_func_t *)0x0 }, /* L */ { ISFUNC, (rl_command_func_t *)0x0 }, /* M */ { ISFUNC, rl_vi_search_again }, /* N */ { ISFUNC, (rl_command_func_t *)0x0 }, /* O */ { ISFUNC, rl_vi_put }, /* P */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Q */ { ISFUNC, rl_vi_replace }, /* R */ { ISFUNC, rl_vi_subst }, /* S */ { ISFUNC, rl_vi_char_search }, /* T */ { ISFUNC, rl_revert_line }, /* U */ { ISFUNC, (rl_command_func_t *)0x0 }, /* V */ { ISFUNC, rl_vi_next_word }, /* W */ { ISFUNC, rl_vi_rubout }, /* X */ { ISFUNC, rl_vi_yank_to }, /* Y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Z */ /* Some more punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ { ISFUNC, rl_vi_complete }, /* \ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ { ISFUNC, rl_vi_first_print }, /* ^ */ { ISFUNC, rl_vi_yank_arg }, /* _ */ { ISFUNC, rl_vi_goto_mark }, /* ` */ /* Lowercase alphabet. */ { ISFUNC, rl_vi_append_mode }, /* a */ { ISFUNC, rl_vi_prev_word }, /* b */ { ISFUNC, rl_vi_change_to }, /* c */ { ISFUNC, rl_vi_delete_to }, /* d */ { ISFUNC, rl_vi_end_word }, /* e */ { ISFUNC, rl_vi_char_search }, /* f */ { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ { ISFUNC, rl_backward_char }, /* h */ { ISFUNC, rl_vi_insert_mode }, /* i */ { ISFUNC, rl_get_next_history }, /* j */ { ISFUNC, rl_get_previous_history }, /* k */ { ISFUNC, rl_forward_char }, /* l */ { ISFUNC, rl_vi_set_mark }, /* m */ { ISFUNC, rl_vi_search_again }, /* n */ { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ { ISFUNC, rl_vi_put }, /* p */ { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ { ISFUNC, rl_vi_change_char }, /* r */ { ISFUNC, rl_vi_subst }, /* s */ { ISFUNC, rl_vi_char_search }, /* t */ { ISFUNC, rl_vi_undo }, /* u */ { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ { ISFUNC, rl_vi_next_word }, /* w */ { ISFUNC, rl_vi_delete }, /* x */ { ISFUNC, rl_vi_yank_to }, /* y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ /* Final punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ { ISFUNC, rl_vi_column }, /* | */ { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ { ISFUNC, rl_vi_change_case }, /* ~ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* RUBOUT */ #if KEYMAP_SIZE > 128 /* Undefined keys. */ { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 } #endif /* KEYMAP_SIZE > 128 */ }; KEYMAP_ENTRY_ARRAY vi_insertion_keymap = { /* The regular control keys come first. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ { ISFUNC, rl_insert }, /* Control-a */ { ISFUNC, rl_insert }, /* Control-b */ { ISFUNC, rl_insert }, /* Control-c */ { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ { ISFUNC, rl_insert }, /* Control-e */ { ISFUNC, rl_insert }, /* Control-f */ { ISFUNC, rl_insert }, /* Control-g */ { ISFUNC, rl_rubout }, /* Control-h */ { ISFUNC, rl_complete }, /* Control-i */ { ISFUNC, rl_newline }, /* Control-j */ { ISFUNC, rl_insert }, /* Control-k */ { ISFUNC, rl_insert }, /* Control-l */ { ISFUNC, rl_newline }, /* Control-m */ { ISFUNC, rl_menu_complete}, /* Control-n */ { ISFUNC, rl_insert }, /* Control-o */ { ISFUNC, rl_backward_menu_complete }, /* Control-p */ { ISFUNC, rl_insert }, /* Control-q */ { ISFUNC, rl_reverse_search_history }, /* Control-r */ { ISFUNC, rl_forward_search_history }, /* Control-s */ { ISFUNC, rl_transpose_chars }, /* Control-t */ { ISFUNC, rl_unix_line_discard }, /* Control-u */ { ISFUNC, rl_quoted_insert }, /* Control-v */ { ISFUNC, rl_vi_unix_word_rubout }, /* Control-w */ { ISFUNC, rl_insert }, /* Control-x */ { ISFUNC, rl_yank }, /* Control-y */ { ISFUNC, rl_insert }, /* Control-z */ { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ { ISFUNC, rl_insert }, /* Control-\ */ { ISFUNC, rl_insert }, /* Control-] */ { ISFUNC, rl_insert }, /* Control-^ */ { ISFUNC, rl_vi_undo }, /* Control-_ */ /* The start of printing characters. */ { ISFUNC, rl_insert }, /* SPACE */ { ISFUNC, rl_insert }, /* ! */ { ISFUNC, rl_insert }, /* " */ { ISFUNC, rl_insert }, /* # */ { ISFUNC, rl_insert }, /* $ */ { ISFUNC, rl_insert }, /* % */ { ISFUNC, rl_insert }, /* & */ { ISFUNC, rl_insert }, /* ' */ { ISFUNC, rl_insert }, /* ( */ { ISFUNC, rl_insert }, /* ) */ { ISFUNC, rl_insert }, /* * */ { ISFUNC, rl_insert }, /* + */ { ISFUNC, rl_insert }, /* , */ { ISFUNC, rl_insert }, /* - */ { ISFUNC, rl_insert }, /* . */ { ISFUNC, rl_insert }, /* / */ /* Regular digits. */ { ISFUNC, rl_insert }, /* 0 */ { ISFUNC, rl_insert }, /* 1 */ { ISFUNC, rl_insert }, /* 2 */ { ISFUNC, rl_insert }, /* 3 */ { ISFUNC, rl_insert }, /* 4 */ { ISFUNC, rl_insert }, /* 5 */ { ISFUNC, rl_insert }, /* 6 */ { ISFUNC, rl_insert }, /* 7 */ { ISFUNC, rl_insert }, /* 8 */ { ISFUNC, rl_insert }, /* 9 */ /* A little more punctuation. */ { ISFUNC, rl_insert }, /* : */ { ISFUNC, rl_insert }, /* ; */ { ISFUNC, rl_insert }, /* < */ { ISFUNC, rl_insert }, /* = */ { ISFUNC, rl_insert }, /* > */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* @ */ /* Uppercase alphabet. */ { ISFUNC, rl_insert }, /* A */ { ISFUNC, rl_insert }, /* B */ { ISFUNC, rl_insert }, /* C */ { ISFUNC, rl_insert }, /* D */ { ISFUNC, rl_insert }, /* E */ { ISFUNC, rl_insert }, /* F */ { ISFUNC, rl_insert }, /* G */ { ISFUNC, rl_insert }, /* H */ { ISFUNC, rl_insert }, /* I */ { ISFUNC, rl_insert }, /* J */ { ISFUNC, rl_insert }, /* K */ { ISFUNC, rl_insert }, /* L */ { ISFUNC, rl_insert }, /* M */ { ISFUNC, rl_insert }, /* N */ { ISFUNC, rl_insert }, /* O */ { ISFUNC, rl_insert }, /* P */ { ISFUNC, rl_insert }, /* Q */ { ISFUNC, rl_insert }, /* R */ { ISFUNC, rl_insert }, /* S */ { ISFUNC, rl_insert }, /* T */ { ISFUNC, rl_insert }, /* U */ { ISFUNC, rl_insert }, /* V */ { ISFUNC, rl_insert }, /* W */ { ISFUNC, rl_insert }, /* X */ { ISFUNC, rl_insert }, /* Y */ { ISFUNC, rl_insert }, /* Z */ /* Some more punctuation. */ { ISFUNC, rl_insert }, /* [ */ { ISFUNC, rl_insert }, /* \ */ { ISFUNC, rl_insert }, /* ] */ { ISFUNC, rl_insert }, /* ^ */ { ISFUNC, rl_insert }, /* _ */ { ISFUNC, rl_insert }, /* ` */ /* Lowercase alphabet. */ { ISFUNC, rl_insert }, /* a */ { ISFUNC, rl_insert }, /* b */ { ISFUNC, rl_insert }, /* c */ { ISFUNC, rl_insert }, /* d */ { ISFUNC, rl_insert }, /* e */ { ISFUNC, rl_insert }, /* f */ { ISFUNC, rl_insert }, /* g */ { ISFUNC, rl_insert }, /* h */ { ISFUNC, rl_insert }, /* i */ { ISFUNC, rl_insert }, /* j */ { ISFUNC, rl_insert }, /* k */ { ISFUNC, rl_insert }, /* l */ { ISFUNC, rl_insert }, /* m */ { ISFUNC, rl_insert }, /* n */ { ISFUNC, rl_insert }, /* o */ { ISFUNC, rl_insert }, /* p */ { ISFUNC, rl_insert }, /* q */ { ISFUNC, rl_insert }, /* r */ { ISFUNC, rl_insert }, /* s */ { ISFUNC, rl_insert }, /* t */ { ISFUNC, rl_insert }, /* u */ { ISFUNC, rl_insert }, /* v */ { ISFUNC, rl_insert }, /* w */ { ISFUNC, rl_insert }, /* x */ { ISFUNC, rl_insert }, /* y */ { ISFUNC, rl_insert }, /* z */ /* Final punctuation. */ { ISFUNC, rl_insert }, /* { */ { ISFUNC, rl_insert }, /* | */ { ISFUNC, rl_insert }, /* } */ { ISFUNC, rl_insert }, /* ~ */ { ISFUNC, rl_rubout }, /* RUBOUT */ #if KEYMAP_SIZE > 128 /* Pure 8-bit characters (128 - 159). These might be used in some character sets. */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ /* ISO Latin-1 characters (160 - 255) */ { ISFUNC, rl_insert }, /* No-break space */ { ISFUNC, rl_insert }, /* Inverted exclamation mark */ { ISFUNC, rl_insert }, /* Cent sign */ { ISFUNC, rl_insert }, /* Pound sign */ { ISFUNC, rl_insert }, /* Currency sign */ { ISFUNC, rl_insert }, /* Yen sign */ { ISFUNC, rl_insert }, /* Broken bar */ { ISFUNC, rl_insert }, /* Section sign */ { ISFUNC, rl_insert }, /* Diaeresis */ { ISFUNC, rl_insert }, /* Copyright sign */ { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ { ISFUNC, rl_insert }, /* Not sign */ { ISFUNC, rl_insert }, /* Soft hyphen */ { ISFUNC, rl_insert }, /* Registered sign */ { ISFUNC, rl_insert }, /* Macron */ { ISFUNC, rl_insert }, /* Degree sign */ { ISFUNC, rl_insert }, /* Plus-minus sign */ { ISFUNC, rl_insert }, /* Superscript two */ { ISFUNC, rl_insert }, /* Superscript three */ { ISFUNC, rl_insert }, /* Acute accent */ { ISFUNC, rl_insert }, /* Micro sign */ { ISFUNC, rl_insert }, /* Pilcrow sign */ { ISFUNC, rl_insert }, /* Middle dot */ { ISFUNC, rl_insert }, /* Cedilla */ { ISFUNC, rl_insert }, /* Superscript one */ { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ { ISFUNC, rl_insert }, /* Vulgar fraction one half */ { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ { ISFUNC, rl_insert }, /* Inverted questionk mark */ { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ { ISFUNC, rl_insert }, /* Latin capital letter ae */ { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ { ISFUNC, rl_insert }, /* Multiplication sign */ { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ { ISFUNC, rl_insert }, /* Latin small letter a with grave */ { ISFUNC, rl_insert }, /* Latin small letter a with acute */ { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ { ISFUNC, rl_insert }, /* Latin small letter ae */ { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ { ISFUNC, rl_insert }, /* Latin small letter e with grave */ { ISFUNC, rl_insert }, /* Latin small letter e with acute */ { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter i with grave */ { ISFUNC, rl_insert }, /* Latin small letter i with acute */ { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ { ISFUNC, rl_insert }, /* Latin small letter o with grave */ { ISFUNC, rl_insert }, /* Latin small letter o with acute */ { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ { ISFUNC, rl_insert }, /* Division sign */ { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ { ISFUNC, rl_insert }, /* Latin small letter u with grave */ { ISFUNC, rl_insert }, /* Latin small letter u with acute */ { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter y with acute */ { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ #endif /* KEYMAP_SIZE > 128 */ }; /* Unused for the time being. */ #if 0 KEYMAP_ENTRY_ARRAY vi_escape_keymap = { /* The regular control keys come first. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-g */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ { ISFUNC, rl_tab_insert}, /* Control-i */ { ISFUNC, rl_emacs_editing_mode}, /* Control-j */ { ISFUNC, rl_kill_line }, /* Control-k */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ { ISFUNC, rl_emacs_editing_mode}, /* Control-m */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-r */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-u */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ { ISFUNC, rl_vi_undo }, /* Control-_ */ /* The start of printing characters. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ /* Regular digits. */ { ISFUNC, rl_vi_arg_digit }, /* 0 */ { ISFUNC, rl_vi_arg_digit }, /* 1 */ { ISFUNC, rl_vi_arg_digit }, /* 2 */ { ISFUNC, rl_vi_arg_digit }, /* 3 */ { ISFUNC, rl_vi_arg_digit }, /* 4 */ { ISFUNC, rl_vi_arg_digit }, /* 5 */ { ISFUNC, rl_vi_arg_digit }, /* 6 */ { ISFUNC, rl_vi_arg_digit }, /* 7 */ { ISFUNC, rl_vi_arg_digit }, /* 8 */ { ISFUNC, rl_vi_arg_digit }, /* 9 */ /* A little more punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ /* Uppercase alphabet. */ { ISFUNC, rl_do_lowercase_version }, /* A */ { ISFUNC, rl_do_lowercase_version }, /* B */ { ISFUNC, rl_do_lowercase_version }, /* C */ { ISFUNC, rl_do_lowercase_version }, /* D */ { ISFUNC, rl_do_lowercase_version }, /* E */ { ISFUNC, rl_do_lowercase_version }, /* F */ { ISFUNC, rl_do_lowercase_version }, /* G */ { ISFUNC, rl_do_lowercase_version }, /* H */ { ISFUNC, rl_do_lowercase_version }, /* I */ { ISFUNC, rl_do_lowercase_version }, /* J */ { ISFUNC, rl_do_lowercase_version }, /* K */ { ISFUNC, rl_do_lowercase_version }, /* L */ { ISFUNC, rl_do_lowercase_version }, /* M */ { ISFUNC, rl_do_lowercase_version }, /* N */ { ISFUNC, rl_do_lowercase_version }, /* O */ { ISFUNC, rl_do_lowercase_version }, /* P */ { ISFUNC, rl_do_lowercase_version }, /* Q */ { ISFUNC, rl_do_lowercase_version }, /* R */ { ISFUNC, rl_do_lowercase_version }, /* S */ { ISFUNC, rl_do_lowercase_version }, /* T */ { ISFUNC, rl_do_lowercase_version }, /* U */ { ISFUNC, rl_do_lowercase_version }, /* V */ { ISFUNC, rl_do_lowercase_version }, /* W */ { ISFUNC, rl_do_lowercase_version }, /* X */ { ISFUNC, rl_do_lowercase_version }, /* Y */ { ISFUNC, rl_do_lowercase_version }, /* Z */ /* Some more punctuation. */ { ISFUNC, rl_arrow_keys }, /* [ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ /* Lowercase alphabet. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ { ISFUNC, (rl_command_func_t *)0x0 }, /* e */ { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ { ISFUNC, rl_arrow_keys }, /* o */ { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ /* Final punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ { ISFUNC, rl_backward_kill_word }, /* RUBOUT */ #if KEYMAP_SIZE > 128 /* Undefined keys. */ { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 } #endif /* KEYMAP_SIZE > 128 */ }; #endif readline-8.3/keymaps.h000644 000436 000024 00000006201 14002565352 015053 0ustar00chetstaff000000 000000 /* keymaps.h -- Manipulation of readline keymaps. */ /* Copyright (C) 1987, 1989, 1992-2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #ifndef _KEYMAPS_H_ #define _KEYMAPS_H_ #ifdef __cplusplus extern "C" { #endif #if defined (READLINE_LIBRARY) # include "rlstdc.h" # include "chardefs.h" # include "rltypedefs.h" #else # include # include # include #endif /* A keymap contains one entry for each key in the ASCII set. Each entry consists of a type and a pointer. FUNCTION is the address of a function to run, or the address of a keymap to indirect through. TYPE says which kind of thing FUNCTION is. */ typedef struct _keymap_entry { char type; rl_command_func_t *function; } KEYMAP_ENTRY; /* This must be large enough to hold bindings for all of the characters in a desired character set (e.g, 128 for ASCII, 256 for ISO Latin-x, and so on) plus one for subsequence matching. */ #define KEYMAP_SIZE 257 #define ANYOTHERKEY KEYMAP_SIZE-1 typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE]; typedef KEYMAP_ENTRY *Keymap; /* The values that TYPE can have in a keymap entry. */ #define ISFUNC 0 #define ISKMAP 1 #define ISMACR 2 extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap; extern KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap; /* Return a new, empty keymap. Free it with free() when you are done. */ extern Keymap rl_make_bare_keymap (void); /* Return a new keymap which is a copy of MAP. */ extern Keymap rl_copy_keymap (Keymap); /* Return a new keymap with the printing characters bound to rl_insert, the lowercase Meta characters bound to run their equivalents, and the Meta digits bound to produce numeric arguments. */ extern Keymap rl_make_keymap (void); /* Free the storage associated with a keymap. */ extern void rl_discard_keymap (Keymap); /* These functions actually appear in bind.c */ /* Return the keymap corresponding to a given name. Names look like `emacs' or `emacs-meta' or `vi-insert'. */ extern Keymap rl_get_keymap_by_name (const char *); /* Return the current keymap. */ extern Keymap rl_get_keymap (void); /* Set the current keymap to MAP. */ extern void rl_set_keymap (Keymap); /* Set the name of MAP to NAME */ extern int rl_set_keymap_name (const char *, Keymap); #ifdef __cplusplus } #endif #endif /* _KEYMAPS_H_ */ readline-8.3/histfile.c000644 000436 000024 00000060607 15005146470 015216 0ustar00chetstaff000000 000000 /* histfile.c - functions to manipulate the history file. */ /* Copyright (C) 1989-2019,2023-2025 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. History 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 3 of the License, or (at your option) any later version. History 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 History. If not, see . */ /* The goal is to make the implementation transparent, so that you don't have to know what data types are used, just what functions you can call. I think I have done that. */ #define READLINE_LIBRARY #if defined (__TANDEM) # define _XOPEN_SOURCE_EXTENDED 1 # include # include #endif #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_LIMITS_H) # include #endif #include #if ! defined (_MINIX) && defined (HAVE_SYS_FILE_H) # include #endif #include "posixstat.h" #include #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_UNISTD_H) # include #endif #include #if defined (__EMX__) # undef HAVE_MMAP #endif #ifdef HISTORY_USE_MMAP # include # ifdef MAP_FILE # define MAP_RFLAGS (MAP_FILE|MAP_PRIVATE) # define MAP_WFLAGS (MAP_FILE|MAP_SHARED) # else # define MAP_RFLAGS MAP_PRIVATE # define MAP_WFLAGS MAP_SHARED # endif # ifndef MAP_FAILED # define MAP_FAILED ((void *)-1) # endif #endif /* HISTORY_USE_MMAP */ #if defined(_WIN32) # define WIN32_LEAN_AND_MEAN # include #endif /* If we're compiling for __EMX__ (OS/2) or __CYGWIN__ (cygwin32 environment on win 95/98/nt), we want to open files with O_BINARY mode so that there is no \n -> \r\n conversion performed. On other systems, we don't want to mess around with O_BINARY at all, so we ensure that it's defined to 0. */ #if defined (__EMX__) || defined (__CYGWIN__) # ifndef O_BINARY # define O_BINARY 0 # endif #else /* !__EMX__ && !__CYGWIN__ */ # undef O_BINARY # define O_BINARY 0 #endif /* !__EMX__ && !__CYGWIN__ */ #include #if !defined (errno) extern int errno; #endif /* !errno */ #include "history.h" #include "histlib.h" #include "rlshell.h" #include "xmalloc.h" #if !defined (PATH_MAX) # define PATH_MAX 1024 /* default */ #endif /* history file version; currently unused */ int history_file_version = 1; /* If non-zero, we write timestamps to the history file in history_do_write() */ int history_write_timestamps = 0; /* If non-zero, we assume that a history file that starts with a timestamp uses timestamp-delimited entries and can include multi-line history entries. Used by read_history_range */ int history_multiline_entries = 0; /* Immediately after a call to read_history() or read_history_range(), this will return the number of lines just read from the history file in that call. */ int history_lines_read_from_file = 0; /* Immediately after a call to write_history() or history_do_write(), this will return the number of lines just written to the history file in that call. This also works with history_truncate_file. */ int history_lines_written_to_file = 0; /* Does S look like the beginning of a history timestamp entry? Placeholder for more extensive tests. */ #define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char && isdigit ((unsigned char)(s)[1]) ) static char *history_backupfile (const char *); static char *history_tempfile (const char *); static int histfile_backup (const char *, const char *); static int histfile_restore (const char *, const char *); static int history_rename (const char *, const char *); /* Return the string that should be used in the place of this filename. This only matters when you don't specify the filename to read_history (), or write_history (). */ static char * history_filename (const char *filename) { char *return_val; const char *home; size_t home_len; return_val = filename ? savestring (filename) : (char *)NULL; if (return_val) return (return_val); home = sh_get_env_value ("HOME"); #if defined (_WIN32) if (home == 0) home = sh_get_env_value ("APPDATA"); #endif if (home == 0) return (NULL); home_len = strlen (home); return_val = (char *)xmalloc (2 + home_len + 8); /* strlen(".history") == 8 */ strcpy (return_val, home); return_val[home_len] = '/'; #if defined (__MSDOS__) strcpy (return_val + home_len + 1, "_history"); #else strcpy (return_val + home_len + 1, ".history"); #endif return (return_val); } #if defined (DEBUG) static char * history_backupfile (const char *filename) { const char *fn; char *ret, linkbuf[PATH_MAX+1]; size_t len; ssize_t n; fn = filename; #if defined (HAVE_READLINK) /* Follow symlink to avoid backing up symlink itself; call will fail if not a symlink */ if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0) { linkbuf[n] = '\0'; fn = linkbuf; } #endif len = strlen (fn); ret = xmalloc (len + 2); strcpy (ret, fn); ret[len] = '-'; ret[len+1] = '\0'; return ret; } #endif static char * history_tempfile (const char *filename) { const char *fn; char *ret, linkbuf[PATH_MAX+1]; size_t len; ssize_t n; int pid; fn = filename; #if defined (HAVE_READLINK) /* Follow symlink so tempfile created in the same directory as any symlinked history file; call will fail if not a symlink */ if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0) { linkbuf[n] = '\0'; fn = linkbuf; } #endif len = strlen (fn); ret = xmalloc (len + 11); strcpy (ret, fn); pid = (int)getpid (); /* filename-PID.tmp */ ret[len] = '-'; ret[len+1] = (pid / 10000 % 10) + '0'; ret[len+2] = (pid / 1000 % 10) + '0'; ret[len+3] = (pid / 100 % 10) + '0'; ret[len+4] = (pid / 10 % 10) + '0'; ret[len+5] = (pid % 10) + '0'; strcpy (ret + len + 6, ".tmp"); return ret; } /* Add the contents of FILENAME to the history list, a line at a time. If FILENAME is NULL, then read from ~/.history. Returns 0 if successful, or errno if not. */ int read_history (const char *filename) { return (read_history_range (filename, 0, -1)); } /* Read a range of lines from FILENAME, adding them to the history list. Start reading at the FROM'th line and end at the TO'th. If FROM is zero, start at the beginning. If TO is less than FROM, read until the end of the file. If FILENAME is NULL, then read from ~/.history. Returns 0 if successful, or errno if not. */ int read_history_range (const char *filename, int from, int to) { register char *line_start, *line_end, *p; char *input, *buffer, *bufend, *last_ts; int file, current_line, chars_read, has_timestamps, reset_comment_char; int skipblanks, default_skipblanks; struct stat finfo; size_t file_size; #if defined (EFBIG) int overflow_errno = EFBIG; #elif defined (EOVERFLOW) int overflow_errno = EOVERFLOW; #else int overflow_errno = EIO; #endif history_lines_read_from_file = 0; buffer = last_ts = (char *)NULL; input = history_filename (filename); if (input == 0) return 0; errno = 0; file = open (input, O_RDONLY|O_BINARY, 0666); if ((file < 0) || (fstat (file, &finfo) == -1)) goto error_and_exit; if (S_ISREG (finfo.st_mode) == 0) { #ifdef EFTYPE errno = EFTYPE; #else errno = EINVAL; #endif goto error_and_exit; } else { /* regular file */ file_size = (size_t)finfo.st_size; /* check for overflow on very large files */ if (file_size != finfo.st_size || file_size + 1 < file_size) { errno = overflow_errno; goto error_and_exit; } if (file_size == 0) { xfree (input); close (file); return 0; /* don't waste time if we don't have to */ } } #ifdef HISTORY_USE_MMAP /* We map read/write and private so we can change newlines to NULs without affecting the underlying object. */ buffer = (char *)mmap (0, file_size, PROT_READ|PROT_WRITE, MAP_RFLAGS, file, 0); if ((void *)buffer == MAP_FAILED) { errno = overflow_errno; goto error_and_exit; } chars_read = file_size; #else buffer = (char *)malloc (file_size + 1); if (buffer == 0) { errno = overflow_errno; goto error_and_exit; } chars_read = read (file, buffer, file_size); #endif if (chars_read < 0) { error_and_exit: if (errno != 0) chars_read = errno; else chars_read = EIO; if (file >= 0) close (file); FREE (input); #ifndef HISTORY_USE_MMAP FREE (buffer); #endif return (chars_read); } close (file); /* Set TO to larger than end of file if negative. */ if (to < 0) to = chars_read; /* Start at beginning of file, work to end. */ bufend = buffer + chars_read; *bufend = '\0'; /* null-terminate buffer for timestamp checks */ current_line = 0; /* Heuristic: the history comment character rarely changes, so assume we have timestamps if the buffer starts with `#[:digit:]' and temporarily set history_comment_char so timestamp parsing works right */ reset_comment_char = 0; if (history_comment_char == '\0' && buffer[0] == '#' && isdigit ((unsigned char)buffer[1])) { history_comment_char = '#'; reset_comment_char = 1; } has_timestamps = HIST_TIMESTAMP_START (buffer); history_multiline_entries += has_timestamps && history_write_timestamps; /* default is to skip blank lines unless history entries are multiline */ default_skipblanks = history_multiline_entries == 0; /* Skip lines until we are at FROM. */ if (has_timestamps) last_ts = buffer; for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++) if (*line_end == '\n') { p = line_end + 1; /* If we see something we think is a timestamp, continue with this line. We should check more extensively here... */ if (HIST_TIMESTAMP_START(p) == 0) current_line++; else last_ts = p; line_start = p; /* If we are at the last line (current_line == from) but we have timestamps (has_timestamps), then line_start points to the text of the last command, and we need to skip to its end. */ if (current_line >= from && has_timestamps) { for (line_end = p; line_end < bufend && *line_end != '\n'; line_end++) ; line_start = (*line_end == '\n') ? line_end + 1 : line_end; } } skipblanks = default_skipblanks; /* If there are lines left to gobble, then gobble them now. */ for (line_end = line_start; line_end < bufend; line_end++) if (*line_end == '\n') { /* Change to allow Windows-like \r\n end of line delimiter. */ if (line_end > line_start && line_end[-1] == '\r') line_end[-1] = '\0'; else *line_end = '\0'; if (*line_start || skipblanks == 0) { if (HIST_TIMESTAMP_START(line_start) == 0) { /* If we have multiline entries (default_skipblanks == 0), we don't want to skip blanks here, since we turned that on at the last timestamp line. Consider doing this even if default_skipblanks == 1 in order not to lose blank lines in commands. */ skipblanks = default_skipblanks; if (last_ts == NULL && history_length > 0 && history_multiline_entries) _hs_append_history_line (history_length - 1, line_start); else add_history (line_start); if (last_ts) { add_history_time (last_ts); last_ts = NULL; } } else { last_ts = line_start; current_line--; /* Even if we're not skipping blank lines by default, we want to skip leading blank lines after a timestamp. */ skipblanks = 1; } } current_line++; if (current_line >= to) break; line_start = line_end + 1; } history_lines_read_from_file = current_line; if (reset_comment_char) history_comment_char = '\0'; FREE (input); #ifndef HISTORY_USE_MMAP FREE (buffer); #else munmap (buffer, file_size); #endif return (0); } /* We need a special version for WIN32 because Windows rename() refuses to overwrite an existing file. */ static int history_rename (const char *old, const char *new) { #if defined (_WIN32) return (MoveFileEx (old, new, MOVEFILE_REPLACE_EXISTING) == 0 ? -1 : 0); #else return (rename (old, new)); #endif } #if defined (DEBUG) /* Save FILENAME to BACK, handling case where FILENAME is a symlink (e.g., ~/.bash_history -> .histfiles/.bash_history.$HOSTNAME) */ static int histfile_backup (const char *filename, const char *back) { #if defined (HAVE_READLINK) char linkbuf[PATH_MAX+1]; ssize_t n; /* Follow to target of symlink to avoid renaming symlink itself */ if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0) { linkbuf[n] = '\0'; return (history_rename (linkbuf, back)); } #endif return (history_rename (filename, back)); } #endif /* Restore ORIG from BACKUP handling case where ORIG is a symlink (e.g., ~/.bash_history -> .histfiles/.bash_history.$HOSTNAME) */ static int histfile_restore (const char *backup, const char *orig) { #if defined (HAVE_READLINK) char linkbuf[PATH_MAX+1]; ssize_t n; /* Follow to target of symlink to avoid renaming symlink itself */ if ((n = readlink (orig, linkbuf, sizeof (linkbuf) - 1)) > 0) { linkbuf[n] = '\0'; return (history_rename (backup, linkbuf)); } #endif return (history_rename (backup, orig)); } /* Should we call chown, based on whether finfo and nfinfo describe different files with different owners? */ #define SHOULD_CHOWN(finfo, nfinfo) \ (finfo.st_uid != nfinfo.st_uid || finfo.st_gid != nfinfo.st_gid) /* Truncate the history file FNAME, leaving only LINES trailing lines. If FNAME is NULL, then use ~/.history. Writes a new file and renames it to the original name. Returns 0 on success, errno on failure. */ int history_truncate_file (const char *fname, int lines) { char *buffer, *filename, *tempname, *bp, *bp1; /* bp1 == bp+1 */ int file, chars_read, rv, orig_lines, exists, r; struct stat finfo, nfinfo; size_t file_size; history_lines_written_to_file = 0; buffer = (char *)NULL; filename = history_filename (fname); if (filename == 0) return 0; tempname = 0; file = open (filename, O_RDONLY|O_BINARY, 0666); rv = exists = 0; orig_lines = lines; /* Don't try to truncate non-regular files. */ if (file == -1 || fstat (file, &finfo) == -1) { rv = errno; if (file != -1) close (file); goto truncate_exit; } exists = 1; nfinfo.st_uid = finfo.st_uid; nfinfo.st_gid = finfo.st_gid; if (S_ISREG (finfo.st_mode) == 0) { close (file); #ifdef EFTYPE rv = EFTYPE; #else rv = EINVAL; #endif goto truncate_exit; } file_size = (size_t)finfo.st_size; /* check for overflow on very large files */ if (file_size != finfo.st_size || file_size + 1 < file_size) { close (file); #if defined (EFBIG) rv = errno = EFBIG; #elif defined (EOVERFLOW) rv = errno = EOVERFLOW; #else rv = errno = EINVAL; #endif goto truncate_exit; } buffer = (char *)malloc (file_size + 1); if (buffer == 0) { rv = errno; close (file); goto truncate_exit; } /* Don't bother with any of this if we're truncating to zero length. */ if (lines == 0) { close (file); buffer[chars_read = 0] = '\0'; bp = buffer; goto truncate_write; } chars_read = read (file, buffer, file_size); close (file); if (chars_read <= 0) { rv = (chars_read < 0) ? errno : 0; goto truncate_exit; } buffer[chars_read] = '\0'; /* for the initial check of bp1[1] */ /* Count backwards from the end of buffer until we have passed LINES lines. bp1 is set funny initially. But since bp[1] can't be a comment character (since it's off the end) and *bp can't be both a newline and the history comment character, it should be OK. If we are writing history timestamps, we need to add one to LINES because we decrement it one extra time the first time through the loop and we need the final timestamp line. */ lines += history_write_timestamps; for (bp1 = bp = buffer + chars_read - 1; lines > 0 && bp > buffer; bp--) { if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0) lines--; bp1 = bp; } /* This is the right line, so move to its start. If we're writing history timestamps, we want to go back until *bp == '\n' and bp1 starts a history timestamp. If we're not, just move back to *bp == '\n'. If this is the first line, then the file contains exactly the number of lines we want to truncate to, so we don't need to do anything, and we'll end up with bp == buffer. Otherwise, write from the start of this line until the end of the buffer. */ for ( ; bp > buffer; bp--) { if (*bp == '\n' && (history_write_timestamps == 0 || HIST_TIMESTAMP_START(bp1))) { bp++; break; } bp1 = bp; } /* Write only if there are more lines in the file than we want to truncate to. */ if (bp <= buffer) { rv = 0; /* No-op if LINES == 0 at this point */ history_lines_written_to_file = orig_lines - lines; goto truncate_exit; } truncate_write: tempname = history_tempfile (filename); rv = 0; if ((file = open (tempname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0600)) != -1) { if (write (file, bp, chars_read - (bp - buffer)) < 0) { rv = errno; close (file); } if (rv == 0 && fstat (file, &nfinfo) < 0) { rv = errno; close (file); } if (rv == 0 && close (file) < 0) rv = errno; } else rv = errno; truncate_exit: FREE (buffer); history_lines_written_to_file = orig_lines - lines; if (rv == 0 && filename && tempname) rv = histfile_restore (tempname, filename); if (rv != 0) { rv = errno; if (tempname) unlink (tempname); history_lines_written_to_file = 0; } #if defined (HAVE_CHOWN) /* Make sure the new filename is owned by the same user as the old. If one user is running this, it's a no-op. If the shell is running after sudo with a shared history file, we don't want to leave the history file owned by root. */ if (rv == 0 && exists && SHOULD_CHOWN (finfo, nfinfo)) r = chown (filename, finfo.st_uid, finfo.st_gid); #endif xfree (filename); FREE (tempname); return rv; } /* Use stdio to write the history file after mmap or malloc fails, on the assumption that the stdio library can allocate the smaller buffers it uses. */ static int history_write_slow (int fd, HIST_ENTRY **the_history, int nelements, int overwrite) { FILE *fp; int i, e; fp = fdopen (fd, overwrite ? "w" : "a"); if (fp == 0) return -1; for (i = history_length - nelements; i < history_length; i++) { if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) fprintf (fp, "%s\n", the_history[i]->timestamp); if (fprintf (fp, "%s\n", the_history[i]->line) < 0) goto slow_write_error; } if (fflush (fp) < 0) { slow_write_error: e = errno; fclose (fp); errno = e; return -1; } if (fclose (fp) < 0) return -1; return 0; } /* Workhorse function for writing history. Writes the last NELEMENT entries from the history list to FILENAME. OVERWRITE is non-zero if you wish to replace FILENAME with the entries. */ static int history_do_write (const char *filename, int nelements, int overwrite) { register int i; char *output, *tempname, *histname; int file, mode, rv, exists; struct stat finfo; #ifdef HISTORY_USE_MMAP size_t cursize, newsize; off_t offset; history_lines_written_to_file = 0; if (nelements < 0) return (0); mode = overwrite ? O_RDWR|O_CREAT|O_TRUNC|O_BINARY : O_RDWR|O_APPEND|O_BINARY; #else mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY; #endif histname = history_filename (filename); exists = histname ? (stat (histname, &finfo) == 0) : 0; tempname = (overwrite && exists && S_ISREG (finfo.st_mode)) ? history_tempfile (histname) : 0; output = tempname ? tempname : histname; file = output ? open (output, mode, 0600) : -1; rv = 0; if (file == -1) { rv = errno; FREE (histname); FREE (tempname); return (rv); } #ifdef HISTORY_USE_MMAP cursize = overwrite ? 0 : lseek (file, 0, SEEK_END); #endif if (nelements > history_length) nelements = history_length; /* Build a buffer of all the lines to write, and write them in one syscall. Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */ { HIST_ENTRY **the_history; /* local */ size_t j; size_t buffer_size; char *buffer; the_history = history_list (); /* Calculate the total number of bytes to write. */ for (buffer_size = 0, i = history_length - nelements; i < history_length; i++) { if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) buffer_size += strlen (the_history[i]->timestamp) + 1; buffer_size += strlen (the_history[i]->line) + 1; } /* Allocate the buffer, and fill it. */ #ifdef HISTORY_USE_MMAP if (ftruncate (file, buffer_size+cursize) == -1) goto mmap_error; /* for portability, ensure that we round cursize to a multiple of the page size. */ offset = cursize & ~(getpagesize () - 1); newsize = buffer_size + cursize - offset; buffer = (char *)mmap (0, newsize, PROT_READ|PROT_WRITE, MAP_WFLAGS, file, offset); if ((void *)buffer == MAP_FAILED) { mmap_error: if ((rv = history_write_slow (file, the_history, nelements, overwrite)) == 0) goto write_success; rv = errno; close (file); if (tempname) unlink (tempname); FREE (histname); FREE (tempname); return rv; } j = cursize - offset; #else buffer = (char *)malloc (buffer_size); if (buffer == 0) { if ((rv = history_write_slow (file, the_history, nelements, overwrite)) == 0) goto write_success; rv = errno; close (file); if (tempname) unlink (tempname); FREE (histname); FREE (tempname); return rv; } j = 0; #endif for (i = history_length - nelements; i < history_length; i++) { if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) { strcpy (buffer + j, the_history[i]->timestamp); j += strlen (the_history[i]->timestamp); buffer[j++] = '\n'; } strcpy (buffer + j, the_history[i]->line); j += strlen (the_history[i]->line); buffer[j++] = '\n'; } #ifdef HISTORY_USE_MMAP /* make sure we unmap the pages even if the sync fails */ if (msync (buffer, newsize, MS_ASYNC) != 0) rv = errno; if (munmap (buffer, newsize) != 0 && rv == 0) rv = errno; #else if (write (file, buffer, buffer_size) < 0) rv = errno; xfree (buffer); #endif } history_lines_written_to_file = nelements; if (close (file) < 0 && rv == 0) rv = errno; write_success: if (rv == 0 && histname && tempname) rv = histfile_restore (tempname, histname); if (rv != 0) { rv = errno; if (tempname) unlink (tempname); history_lines_written_to_file = 0; } #if defined (HAVE_CHOWN) /* Make sure the new filename is owned by the same user as the old. If one user is running this, it's a no-op. If the shell is running after sudo with a shared history file, we don't want to leave the history file owned by root. */ if (rv == 0 && exists) mode = chown (histname, finfo.st_uid, finfo.st_gid); #endif FREE (histname); FREE (tempname); return (rv); } /* Append NELEMENT entries to FILENAME. The entries appended are from the end of the list minus NELEMENTs up to the end of the list. */ int append_history (int nelements, const char *filename) { return (history_do_write (filename, nelements, HISTORY_APPEND)); } /* Overwrite FILENAME with the current history. If FILENAME is NULL, then write the history list to ~/.history. Values returned are as in read_history ().*/ int write_history (const char *filename) { return (history_do_write (filename, history_length, HISTORY_OVERWRITE)); } readline-8.3/posixtime.h000644 000436 000024 00000005344 15027051241 015425 0ustar00chetstaff000000 000000 /* posixtime.h -- wrapper for time.h, sys/times.h mess. */ /* Copyright (C) 1999-2025 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. Bash 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 3 of the License, or (at your option) any later version. Bash 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 Bash. If not, see . */ #ifndef _POSIXTIME_H_ #define _POSIXTIME_H_ /* include this after config.h */ /* Some systems require this, mostly for the definition of `struct timezone'. For example, Dynix/ptx has that definition in rather than sys/time.h */ #if defined (HAVE_SYS_TIME_H) # include #endif #include #if !defined (HAVE_SYSCONF) || !defined (_SC_CLK_TCK) # if !defined (CLK_TCK) # if defined (HZ) # define CLK_TCK HZ # else # define CLK_TCK 60 /* 60HZ */ # endif # endif /* !CLK_TCK */ #endif /* !HAVE_SYSCONF && !_SC_CLK_TCK */ #if !HAVE_TIMEVAL struct timeval { time_t tv_sec; long int tv_usec; }; #endif #if !HAVE_GETTIMEOFDAY extern int gettimeofday (struct timeval * restrict, void * restrict); #endif /* consistently use gettimeofday for time information */ static inline time_t getnow(void) { struct timeval now; gettimeofday (&now, 0); return now.tv_sec; } /* These exist on BSD systems, at least. */ #if !defined (timerclear) # define timerclear(tvp) do { (tvp)->tv_sec = 0; (tvp)->tv_usec = 0; } while (0) #endif #if !defined (timerisset) # define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) #endif #if !defined (timercmp) # define timercmp(a, b, CMP) \ (((a)->tv_sec == (b)->tv_sec) ? ((a)->tv_usec CMP (b)->tv_usec) \ : ((a)->tv_sec CMP (b)->tv_sec)) #endif /* These are non-standard. */ #if !defined (timerisunset) # define timerisunset(tvp) ((tvp)->tv_sec == 0 && (tvp)->tv_usec == 0) #endif #if !defined (timerset) # define timerset(tvp, s, u) do { tvp->tv_sec = s; tvp->tv_usec = u; } while (0) #endif #ifndef TIMEVAL_TO_TIMESPEC # define TIMEVAL_TO_TIMESPEC(tv, ts) \ do { \ (ts)->tv_sec = (tv)->tv_sec; \ (ts)->tv_nsec = (tv)->tv_usec * 1000; \ } while (0) #endif #ifndef TIMESPEC_TO_TIMEVAL # define TIMESPEC_TO_TIMEVAL(tv, ts) \ do { \ (tv)->tv_sec = (ts)->tv_sec; \ (tv)->tv_usec = (tv)->tv_nsec / 1000; \ } while (0) #endif #endif /* _POSIXTIME_H_ */ readline-8.3/support/000755 000436 000024 00000000000 15030514137 014743 5ustar00chetstaff000000 000000 readline-8.3/config.h.in000644 000436 000024 00000020335 14773761620 015273 0ustar00chetstaff000000 000000 /* config.h.in for the GNU readline library. */ /* Copyright (C) 1994-2024 Free Software Foundation, Inc. This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see . */ /* config.h.in. Maintained by hand. */ /* Template definitions for autoconf */ /* These are set by AC_USE_SYSTEM_EXTENSIONS */ #undef __EXTENSIONS__ #undef _ALL_SOURCE #undef _GNU_SOURCE #undef _POSIX_SOURCE #undef _POSIX_1_SOURCE #undef _POSIX_PTHREAD_SEMANTICS #undef _TANDEM_SOURCE #undef _MINIX /* Define NO_MULTIBYTE_SUPPORT to not compile in support for multibyte characters, even if the OS supports them. */ #undef NO_MULTIBYTE_SUPPORT #undef _FILE_OFFSET_BITS /* Characteristics of the compiler. */ #undef inline #undef sig_atomic_t #undef size_t #undef ssize_t #undef mode_t #undef const #undef volatile #undef PROTOTYPES #undef __PROTOTYPES #undef __CHAR_UNSIGNED__ /* Define if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN /* Define if you have the chown function. */ #undef HAVE_CHOWN /* Define if you have the fcntl function. */ #undef HAVE_FCNTL /* Define if you have the fnmatch function. */ #undef HAVE_FNMATCH /* Define if you have the getpwent function. */ #undef HAVE_GETPWENT /* Define if you have the getpwnam function. */ #undef HAVE_GETPWNAM /* Define if you have the getpwuid function. */ #undef HAVE_GETPWUID /* Define if you have the gettimeofday function. */ #undef HAVE_GETTIMEOFDAY /* Define if you have the isascii function. */ #undef HAVE_ISASCII /* Define if you have the iswctype function. */ #undef HAVE_ISWCTYPE /* Define if you have the iswlower function. */ #undef HAVE_ISWLOWER /* Define if you have the iswupper function. */ #undef HAVE_ISWUPPER /* Define if you have the isxdigit function. */ #undef HAVE_ISXDIGIT /* Define if you have the kill function. */ #undef HAVE_KILL /* Define if you have the lstat function. */ #undef HAVE_LSTAT /* Define if you have the mbrlen function. */ #undef HAVE_MBRLEN /* Define if you have the mbrtowc function. */ #undef HAVE_MBRTOWC /* Define if you have the mbscasecmp function. */ #undef HAVE_MBSCASECMP /* Define if you have the mbscmp function. */ #undef HAVE_MBSCMP /* Define if you have the mbsncmp function. */ #undef HAVE_MBSNCMP /* Define if you have the mbsrtowcs function. */ #undef HAVE_MBSRTOWCS /* Define if you have the memmove function. */ #undef HAVE_MEMMOVE /* Define if you have the pselect function. */ #undef HAVE_PSELECT /* Define if you have the putenv function. */ #undef HAVE_PUTENV /* Define if you have the readlink function. */ #undef HAVE_READLINK /* Define if you have the select function. */ #undef HAVE_SELECT /* Define if you have the setenv function. */ #undef HAVE_SETENV /* Define if you have the setitimer function. */ #undef HAVE_SETITIMER /* Define if you have the setlocale function. */ #undef HAVE_SETLOCALE /* Define if you have the strcasecmp function. */ #undef HAVE_STRCASECMP /* Define if you have the strcoll function. */ #undef HAVE_STRCOLL #undef STRCOLL_BROKEN /* Define if you have the strpbrk function. */ #undef HAVE_STRPBRK /* Define if you have the sysconf function. */ #undef HAVE_SYSCONF /* Define if you have the tcgetattr function. */ #undef HAVE_TCGETATTR /* Define if you have the tcgetwinsize function. */ #undef HAVE_TCGETWINSIZE /* Define if you have the tcsetwinsize function. */ #undef HAVE_TCSETWINSIZE /* Define if you have the towlower function. */ #undef HAVE_TOWLOWER /* Define if you have the towupper function. */ #undef HAVE_TOWUPPER /* Define if you have the vsnprintf function. */ #undef HAVE_VSNPRINTF /* Define if you have the wcrtomb function. */ #undef HAVE_WCRTOMB /* Define if you have the wcscoll function. */ #undef HAVE_WCSCOLL #undef HAVE_WCSLEN #undef HAVE_WCSNLEN /* Define if you have the wcsnrtombs function. */ #undef HAVE_WCSNRTOMBS /* Define if you have the wctype function. */ #undef HAVE_WCTYPE /* Define if you have the wcwidth function. */ #undef HAVE_WCWIDTH /* and whether it works */ #undef WCWIDTH_BROKEN /* Define if you have the header file. */ #undef HAVE_DIRENT_H /* Define if you have the header file. */ #undef HAVE_FCNTL_H /* Define if you have the header file. */ #undef HAVE_LANGINFO_H /* Define if you have the header file. */ #undef HAVE_LIBAUDIT_H /* Define if you have the header file. */ #undef HAVE_LIMITS_H /* Define if you have the header file. */ #undef HAVE_LOCALE_H /* Define if you have the header file. */ #undef HAVE_MEMORY_H /* Define if you have the header file. */ #undef HAVE_NDIR_H /* Define if you have the header file. */ #undef HAVE_NCURSES_TERMCAP_H /* Define if you have the header file. */ #undef HAVE_PWD_H /* Define if you have the header file. */ #undef HAVE_STDARG_H /* Define if you have the header file. */ #undef HAVE_STDBOOL_H /* Define if you have the header file. */ #undef HAVE_STDLIB_H /* Define if you have the header file. */ #undef HAVE_STRING_H /* Define if you have the header file. */ #undef HAVE_STRINGS_H /* Define if you have the header file. */ #undef HAVE_SYS_DIR_H /* Define if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define if you have the header file. */ #undef HAVE_SYS_NDIR_H /* Define if you have the header file. */ #undef HAVE_SYS_PTE_H /* Define if you have the header file. */ #undef HAVE_SYS_PTEM_H /* Define if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define if you have the header file. */ #undef HAVE_SYS_STREAM_H /* Define if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define if you have the header file. */ #undef HAVE_TERMCAP_H /* Define if you have the header file. */ #undef HAVE_TERMIO_H /* Define if you have the header file. */ #undef HAVE_TERMIOS_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* Define if you have the header file. */ #undef HAVE_VARARGS_H /* Define if you have the header file. */ #undef HAVE_WCHAR_H /* Define if you have the header file. */ #undef HAVE_WCTYPE_H #undef HAVE_MBSTATE_T /* Define if you have wchar_t in . */ #undef HAVE_WCHAR_T /* Define if you have wctype_t in . */ #undef HAVE_WCTYPE_T /* Define if you have wint_t in . */ #undef HAVE_WINT_T /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Define if you have and it defines AUDIT_USER_TTY */ #undef HAVE_DECL_AUDIT_USER_TTY /* Definitions pulled in from aclocal.m4. */ #undef GWINSZ_IN_SYS_IOCTL #undef STRUCT_WINSIZE_IN_SYS_IOCTL #undef STRUCT_WINSIZE_IN_TERMIOS #undef TIOCSTAT_IN_SYS_IOCTL #undef FIONREAD_IN_SYS_IOCTL #undef SPEED_T_IN_SYS_TYPES #undef HAVE_GETPW_DECLS #undef HAVE_STRUCT_DIRENT_D_INO #undef HAVE_STRUCT_DIRENT_D_FILENO #undef HAVE_STRUCT_DIRENT_D_NAMLEN #undef HAVE_TIMEVAL #undef HAVE_BSD_SIGNALS #undef HAVE_POSIX_SIGNALS #undef HAVE_USG_SIGHOLD #undef MUST_REINSTALL_SIGHANDLERS #undef HAVE_POSIX_SIGSETJMP #undef CTYPE_NON_ASCII /* modify settings or make new ones based on what autoconf tells us. */ /* Ultrix botches type-ahead when switching from canonical to non-canonical mode, at least through version 4.3 */ #if !defined (HAVE_TERMIOS_H) || !defined (HAVE_TCGETATTR) || defined (ultrix) # define TERMIOS_MISSING #endif /* VARARGS defines moved to rlstdc.h */ readline-8.3/util.c000644 000436 000024 00000027717 15020315172 014363 0ustar00chetstaff000000 000000 /* util.c -- readline utility functions */ /* Copyright (C) 1987-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include #include "posixjmp.h" #if defined (HAVE_UNISTD_H) # include /* for _POSIX_VERSION */ #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include #include /* System-specific feature definitions and include files. */ #include "rlmbutil.h" #include "rldefs.h" #if defined (TIOCSTAT_IN_SYS_IOCTL) # include #endif /* TIOCSTAT_IN_SYS_IOCTL */ /* Some standard library routines. */ #include "readline.h" #include "rlprivate.h" #include "xmalloc.h" #include "rlshell.h" /* **************************************************************** */ /* */ /* Utility Functions */ /* */ /* **************************************************************** */ /* Return 0 if C is not a member of the class of characters that belong in words, or 1 if it is. */ int _rl_allow_pathname_alphabetic_chars = 0; static const char * const pathname_alphabetic_chars = "/-_=~.#$"; int rl_alphabetic (int c) { if (_rl_alphabetic_p (c)) return (1); return (_rl_allow_pathname_alphabetic_chars && strchr (pathname_alphabetic_chars, c) != NULL); } #if defined (HANDLE_MULTIBYTE) int _rl_walphabetic (WCHAR_T wc) { int c; if (iswalnum (wc)) return (1); c = wc & 0177; return (_rl_allow_pathname_alphabetic_chars && strchr (pathname_alphabetic_chars, c) != NULL); } #endif /* How to abort things. */ int _rl_abort_internal (void) { if (RL_ISSTATE (RL_STATE_TIMEOUT) == 0) rl_ding (); /* Don't ring the bell on a timeout */ rl_clear_message (); _rl_reset_argument (); rl_clear_pending_input (); rl_deactivate_mark (); while (rl_executing_macro) _rl_pop_executing_macro (); _rl_kill_kbd_macro (); RL_UNSETSTATE (RL_STATE_MULTIKEY); /* XXX */ rl_last_func = (rl_command_func_t *)NULL; _rl_command_to_execute = 0; _rl_longjmp (_rl_top_level, 1); return (0); } int rl_abort (int count, int key) { return (_rl_abort_internal ()); } int _rl_null_function (int count, int key) { return 0; } int rl_tty_status (int count, int key) { #if defined (TIOCSTAT) ioctl (1, TIOCSTAT, (char *)0); rl_refresh_line (count, key); #else rl_ding (); #endif return 0; } /* Return a copy of the string between FROM and TO. FROM is inclusive, TO is not. */ char * rl_copy_text (int from, int to) { register int length; char *copy; /* Fix it if the caller is confused. */ if (from > to) SWAP (from, to); length = to - from; copy = (char *)xmalloc (1 + length); strncpy (copy, rl_line_buffer + from, length); copy[length] = '\0'; return (copy); } /* Increase the size of RL_LINE_BUFFER until it has enough space to hold LEN characters. */ void rl_extend_line_buffer (int len) { while (len >= rl_line_buffer_len) { rl_line_buffer_len += DEFAULT_BUFFER_SIZE; rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len); } _rl_set_the_line (); } /* A function for simple tilde expansion. */ int rl_tilde_expand (int ignore, int key) { register int start, end; char *homedir, *temp; int len; end = rl_point; start = end - 1; if (rl_point == rl_end && rl_line_buffer[rl_point] == '~') { homedir = tilde_expand ("~"); _rl_replace_text (homedir, start, end); xfree (homedir); return (0); } else if (start >= 0 && rl_line_buffer[start] != '~') { for (; start >= 0 && !whitespace (rl_line_buffer[start]); start--) ; start++; } else if (start < 0) start = 0; end = start; do end++; while (end < rl_end && whitespace (rl_line_buffer[end]) == 0); if (end >= rl_end || whitespace (rl_line_buffer[end])) end--; /* If the first character of the current word is a tilde, perform tilde expansion and insert the result. If not a tilde, do nothing. */ if (rl_line_buffer[start] == '~') { len = end - start + 1; temp = (char *)xmalloc (len + 1); strncpy (temp, rl_line_buffer + start, len); temp[len] = '\0'; homedir = tilde_expand (temp); xfree (temp); _rl_replace_text (homedir, start, end); xfree (homedir); } return (0); } void _rl_ttymsg (const char *format, ...) { va_list args; va_start (args, format); fprintf (stderr, "readline: "); vfprintf (stderr, format, args); fprintf (stderr, "\n"); fflush (stderr); va_end (args); rl_forced_update_display (); } void _rl_errmsg (const char *format, ...) { va_list args; va_start (args, format); fprintf (stderr, "readline: "); vfprintf (stderr, format, args); fprintf (stderr, "\n"); fflush (stderr); va_end (args); } /* **************************************************************** */ /* */ /* String Utility Functions */ /* */ /* **************************************************************** */ /* Determine if s2 occurs in s1. If so, return a pointer to the match in s1. The compare is case insensitive. */ char * _rl_strindex (const char *s1, const char *s2) { int i; size_t l, len; for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++) if (_rl_strnicmp (s1 + i, s2, l) == 0) return ((char *) (s1 + i)); return ((char *)NULL); } #if !defined (HAVE_STRPBRK) || defined (HANDLE_MULTIBYTE) /* Find the first occurrence in STRING1 of any character from STRING2. Return a pointer to the character in STRING1. Understands multibyte characters. */ char * _rl_strpbrk (const char *string1, const char *string2) { register const char *scan; #if defined (HANDLE_MULTIBYTE) mbstate_t ps; int v; memset (&ps, 0, sizeof (mbstate_t)); #endif for (; *string1; string1++) { for (scan = string2; *scan; scan++) { if (*string1 == *scan) return ((char *)string1); } #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { v = _rl_get_char_len (string1, &ps); if (v > 1) string1 += v - 1; /* -1 to account for auto-increment in loop */ } #endif } return ((char *)NULL); } #endif #if !defined (HAVE_STRCASECMP) /* Compare at most COUNT characters from string1 to string2. Case doesn't matter (strncasecmp). */ int _rl_strnicmp (const char *string1, const char *string2, int count) { register const char *s1; register const char *s2; register int d; if (count <= 0 || (string1 == string2)) return 0; s1 = string1; s2 = string2; do { d = _rl_to_lower (*s1) - _rl_to_lower (*s2); /* XXX - cast to unsigned char? */ if (d != 0) return d; if (*s1++ == '\0') break; s2++; } while (--count != 0); return (0); } /* strcmp (), but caseless (strcasecmp). */ int _rl_stricmp (const char *string1, const char *string2) { register const char *s1; register const char *s2; register int d; s1 = string1; s2 = string2; if (s1 == s2) return 0; while ((d = _rl_to_lower (*s1) - _rl_to_lower (*s2)) == 0) { if (*s1++ == '\0') return 0; s2++; } return (d); } #endif /* !HAVE_STRCASECMP */ /* Compare the first N characters of S1 and S2 without regard to case. If FLAGS&1, apply the mapping specified by completion-map-case and make `-' and `_' equivalent. Returns 1 if the strings are equal. */ int _rl_strcaseeqn(const char *s1, const char *s2, size_t n, int flags) { int c1, c2; int d; if ((flags & 1) == 0) return (_rl_strnicmp (s1, s2, n) == 0); do { c1 = _rl_to_lower (*s1); c2 = _rl_to_lower (*s2); d = c1 - c2; if ((*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_')) d = 0; /* case insensitive character mapping */ if (d != 0) return 0; s1++; s2++; n--; } while (n != 0); return 1; } /* Return 1 if the characters C1 and C2 are equal without regard to case. If FLAGS&1, apply the mapping specified by completion-map-case and make `-' and `_' equivalent. */ int _rl_charcasecmp (int c1, int c2, int flags) { if ((flags & 1) && (c1 == '-' || c1 == '_') && (c2 == '-' || c2 == '_')) return 1; return ( _rl_to_lower (c1) == _rl_to_lower (c2)); } /* Stupid comparison routine for qsort () ing strings. */ int _rl_qsort_string_compare (char **s1, char **s2) { #if defined (HAVE_STRCOLL) return (strcoll (*s1, *s2)); #else int result; result = **s1 - **s2; if (result == 0) result = strcmp (*s1, *s2); return result; #endif } /* Function equivalents for the macros defined in chardefs.h. */ #define FUNCTION_FOR_MACRO(f) int (f) (int c) { return f (c); } FUNCTION_FOR_MACRO (_rl_digit_p) FUNCTION_FOR_MACRO (_rl_digit_value) FUNCTION_FOR_MACRO (_rl_lowercase_p) FUNCTION_FOR_MACRO (_rl_pure_alphabetic) FUNCTION_FOR_MACRO (_rl_to_lower) FUNCTION_FOR_MACRO (_rl_to_upper) FUNCTION_FOR_MACRO (_rl_uppercase_p) /* A convenience function, to force memory deallocation to be performed by readline. DLLs on Windows apparently require this. */ void rl_free (void *mem) { if (mem) free (mem); } /* Backwards compatibility, now that savestring has been removed from all `public' readline header files. */ #undef _rl_savestring char * _rl_savestring (const char *s) { return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s))); } #if defined (DEBUG) static FILE *_rl_tracefp; void _rl_trace (const char *format, ...) { va_list args; va_start (args, format); if (_rl_tracefp == 0) _rl_tropen (); vfprintf (_rl_tracefp, format, args); fprintf (_rl_tracefp, "\n"); fflush (_rl_tracefp); va_end (args); } int _rl_tropen (void) { char fnbuf[128], *x; if (_rl_tracefp) fclose (_rl_tracefp); #if defined (_WIN32) && !defined (__CYGWIN__) x = sh_get_env_value ("TEMP"); if (x == 0) x = "."; #else x = "/var/tmp"; #endif snprintf (fnbuf, sizeof (fnbuf), "%s/rltrace.%ld", x, (long)getpid()); unlink(fnbuf); _rl_tracefp = fopen (fnbuf, "w+"); return _rl_tracefp != 0; } int _rl_trclose (void) { int r; r = fclose (_rl_tracefp); _rl_tracefp = 0; return r; } void _rl_settracefp (FILE *fp) { _rl_tracefp = fp; } #endif /* DEBUG */ #if HAVE_DECL_AUDIT_USER_TTY && defined (HAVE_LIBAUDIT_H) && defined (ENABLE_TTY_AUDIT_SUPPORT) #include #include #include #include /* Report STRING to the audit system. */ void _rl_audit_tty (char *string) { struct audit_message req; struct sockaddr_nl addr; size_t size; int fd; fd = socket (PF_NETLINK, SOCK_RAW, NETLINK_AUDIT); if (fd < 0) return; size = strlen (string) + 1; if (NLMSG_SPACE (size) > MAX_AUDIT_MESSAGE_LENGTH) { close (fd); return; } memset (&req, 0, sizeof(req)); req.nlh.nlmsg_len = NLMSG_SPACE (size); req.nlh.nlmsg_type = AUDIT_USER_TTY; req.nlh.nlmsg_flags = NLM_F_REQUEST; req.nlh.nlmsg_seq = 0; if (size && string) memcpy (NLMSG_DATA(&req.nlh), string, size); memset (&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; addr.nl_pid = 0; addr.nl_groups = 0; sendto (fd, &req, req.nlh.nlmsg_len, 0, (struct sockaddr*)&addr, sizeof(addr)); close (fd); } #endif readline-8.3/colors.c000644 000436 000024 00000020561 14705520654 014711 0ustar00chetstaff000000 000000 /* `dir', `vdir' and `ls' directory listing programs for GNU. Modified by Chet Ramey for Readline. Copyright (C) 1985, 1988, 1990-1991, 1995-2021, 2023 Free Software Foundation, Inc. This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see . */ /* Written by Richard Stallman and David MacKenzie. */ /* Color support by Peter Anvin and Dennis Flaherty based on original patches by Greg Lee . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include "rlconf.h" #if defined __TANDEM # define _XOPEN_SOURCE_EXTENDED 1 # define _TANDEM_SOURCE 1 # include # include #endif #include #include "posixstat.h" // stat related macros (S_ISREG, ...) #include // S_ISUID #ifndef S_ISDIR # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif // strlen() #if defined (HAVE_STRING_H) # include #else /* !HAVE_STRING_H */ # include #endif /* !HAVE_STRING_H */ // abort() #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include "readline.h" #include "rldefs.h" #ifdef COLOR_SUPPORT #include "xmalloc.h" #include "colors.h" static bool is_colored (enum indicator_no type); static void restore_default_color (void); #define RL_COLOR_PREFIX_EXTENSION "readline-colored-completion-prefix" COLOR_EXT_TYPE *_rl_color_ext_list = 0; /* Output a color indicator (which may contain nulls). */ void _rl_put_indicator (const struct bin_str *ind) { fwrite (ind->string, ind->len, 1, rl_outstream); } static bool is_colored (enum indicator_no colored_filetype) { size_t len = _rl_color_indicator[colored_filetype].len; char const *s = _rl_color_indicator[colored_filetype].string; return ! (len == 0 || (len == 1 && strncmp (s, "0", 1) == 0) || (len == 2 && strncmp (s, "00", 2) == 0)); } static void restore_default_color (void) { _rl_put_indicator (&_rl_color_indicator[C_LEFT]); _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); } void _rl_set_normal_color (void) { if (is_colored (C_NORM)) { _rl_put_indicator (&_rl_color_indicator[C_LEFT]); _rl_put_indicator (&_rl_color_indicator[C_NORM]); _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); } } static struct bin_str * _rl_custom_readline_prefix (void) { size_t len; COLOR_EXT_TYPE *ext; len = strlen (RL_COLOR_PREFIX_EXTENSION); for (ext = _rl_color_ext_list; ext; ext = ext->next) if (ext->ext.len == len && STREQN (ext->ext.string, RL_COLOR_PREFIX_EXTENSION, len)) return (&ext->seq); return (NULL); } bool _rl_print_prefix_color (void) { struct bin_str *s; /* What do we want to use for the prefix? Let's try cyan first, see colors.h */ s = _rl_custom_readline_prefix (); if (s == 0) s = &_rl_color_indicator[C_PREFIX]; if (s->string != NULL) { if (is_colored (C_NORM)) restore_default_color (); _rl_put_indicator (&_rl_color_indicator[C_LEFT]); _rl_put_indicator (s); _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); return 0; } else return 1; } /* Returns whether any color sequence was printed. */ bool _rl_print_color_indicator (const char *f) { enum indicator_no colored_filetype; COLOR_EXT_TYPE *ext; /* Color extension */ size_t len; /* Length of name */ const char* name; char *filename; struct stat astat, linkstat; mode_t mode; int linkok; /* 1 == ok, 0 == dangling symlink, -1 == missing */ int stat_ok; name = f; /* This should already have undergone tilde expansion */ filename = 0; if (rl_filename_stat_hook) { filename = savestring (f); (*rl_filename_stat_hook) (&filename); name = filename; } #if defined (HAVE_LSTAT) stat_ok = lstat(name, &astat); #else stat_ok = stat(name, &astat); #endif if (stat_ok == 0) { mode = astat.st_mode; #if defined (HAVE_LSTAT) if (S_ISLNK (mode)) { linkok = stat (name, &linkstat) == 0; if (linkok && strncmp (_rl_color_indicator[C_LINK].string, "target", 6) == 0) mode = linkstat.st_mode; } else #endif linkok = 1; } else linkok = -1; /* Is this a nonexistent file? If so, linkok == -1. */ if (linkok == -1 && _rl_color_indicator[C_MISSING].string != NULL) colored_filetype = C_MISSING; else if (linkok == 0 && _rl_color_indicator[C_ORPHAN].string != NULL) colored_filetype = C_ORPHAN; /* dangling symlink */ else if(stat_ok != 0) { static enum indicator_no filetype_indicator[] = FILETYPE_INDICATORS; colored_filetype = filetype_indicator[normal]; //f->filetype]; } else { if (S_ISREG (mode)) { colored_filetype = C_FILE; #if defined (S_ISUID) if ((mode & S_ISUID) != 0 && is_colored (C_SETUID)) colored_filetype = C_SETUID; else #endif #if defined (S_ISGID) if ((mode & S_ISGID) != 0 && is_colored (C_SETGID)) colored_filetype = C_SETGID; else #endif if (is_colored (C_CAP) && 0) //f->has_capability) colored_filetype = C_CAP; else if ((mode & S_IXUGO) != 0 && is_colored (C_EXEC)) colored_filetype = C_EXEC; else if ((1 < astat.st_nlink) && is_colored (C_MULTIHARDLINK)) colored_filetype = C_MULTIHARDLINK; } else if (S_ISDIR (mode)) { colored_filetype = C_DIR; #if defined (S_ISVTX) if ((mode & S_ISVTX) && (mode & S_IWOTH) && is_colored (C_STICKY_OTHER_WRITABLE)) colored_filetype = C_STICKY_OTHER_WRITABLE; else #endif if ((mode & S_IWOTH) != 0 && is_colored (C_OTHER_WRITABLE)) colored_filetype = C_OTHER_WRITABLE; #if defined (S_ISVTX) else if ((mode & S_ISVTX) != 0 && is_colored (C_STICKY)) colored_filetype = C_STICKY; #endif } #if defined (S_ISLNK) else if (S_ISLNK (mode)) colored_filetype = C_LINK; #endif else if (S_ISFIFO (mode)) colored_filetype = C_FIFO; #if defined (S_ISSOCK) else if (S_ISSOCK (mode)) colored_filetype = C_SOCK; #endif #if defined (S_ISBLK) else if (S_ISBLK (mode)) colored_filetype = C_BLK; #endif else if (S_ISCHR (mode)) colored_filetype = C_CHR; else { /* Classify a file of some other type as C_ORPHAN. */ colored_filetype = C_ORPHAN; } } /* Check the file's suffix only if still classified as C_FILE. */ ext = NULL; if (colored_filetype == C_FILE) { /* Test if NAME has a recognized suffix. */ len = strlen (name); name += len; /* Pointer to final \0. */ for (ext = _rl_color_ext_list; ext != NULL; ext = ext->next) { if (ext->ext.len <= len && strncmp (name - ext->ext.len, ext->ext.string, ext->ext.len) == 0) break; } } free (filename); /* NULL or savestring return value */ { const struct bin_str *const s = ext ? &(ext->seq) : &_rl_color_indicator[colored_filetype]; if (s->string != NULL) { /* Need to reset so not dealing with attribute combinations */ if (is_colored (C_NORM)) restore_default_color (); _rl_put_indicator (&_rl_color_indicator[C_LEFT]); _rl_put_indicator (s); _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); return 0; } else return 1; } } void _rl_prep_non_filename_text (void) { if (_rl_color_indicator[C_END].string != NULL) _rl_put_indicator (&_rl_color_indicator[C_END]); else { _rl_put_indicator (&_rl_color_indicator[C_LEFT]); _rl_put_indicator (&_rl_color_indicator[C_RESET]); _rl_put_indicator (&_rl_color_indicator[C_RIGHT]); } } #endif /* COLOR_SUPPORT */ readline-8.3/gettimeofday.c000644 000436 000024 00000010620 14773522320 016061 0ustar00chetstaff000000 000000 /* Provide gettimeofday for systems that don't have it or for which it's broken. Copyright (C) 2001-2003, 2005-2007, 2009-2025 Free Software Foundation, Inc. This file is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This file 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ /* written by Jim Meyering */ /* A version of gettimeofday that just sets tv_sec from time(3) on Unix-like systems that don't have it, or a version for Win32 systems. From gnulib */ #include #if !defined (HAVE_GETTIMEOFDAY) #include "posixtime.h" #if defined _WIN32 && ! defined __CYGWIN__ # define WINDOWS_NATIVE # include #endif #ifdef WINDOWS_NATIVE # if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) /* Avoid warnings from gcc -Wcast-function-type. */ # define GetProcAddress \ (void *) GetProcAddress /* GetSystemTimePreciseAsFileTime was introduced only in Windows 8. */ typedef void (WINAPI * GetSystemTimePreciseAsFileTimeFuncType) (FILETIME *lpTime); static GetSystemTimePreciseAsFileTimeFuncType GetSystemTimePreciseAsFileTimeFunc = NULL; static BOOL initialized = FALSE; static void initialize (void) { HMODULE kernel32 = LoadLibrary ("kernel32.dll"); if (kernel32 != NULL) { GetSystemTimePreciseAsFileTimeFunc = (GetSystemTimePreciseAsFileTimeFuncType) GetProcAddress (kernel32, "GetSystemTimePreciseAsFileTime"); } initialized = TRUE; } # else /* !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) */ # define GetSystemTimePreciseAsFileTimeFunc GetSystemTimePreciseAsFileTime # endif /* !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) */ #endif /* WINDOWS_NATIVE */ /* This is a wrapper for gettimeofday. It is used only on systems that lack this function, or whose implementation of this function causes problems. Work around the bug in some systems whereby gettimeofday clobbers the static buffer that localtime uses for its return value. The gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has this problem. */ int gettimeofday (struct timeval *restrict tv, void *restrict tz) { #undef gettimeofday #ifdef WINDOWS_NATIVE /* On native Windows, there are two ways to get the current time: GetSystemTimeAsFileTime or GetSystemTimePreciseAsFileTime . GetSystemTimeAsFileTime produces values that jump by increments of 15.627 milliseconds (!) on average. Whereas GetSystemTimePreciseAsFileTime values usually jump by 1 or 2 microseconds. More discussion on this topic: . */ FILETIME current_time; # if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) if (!initialized) initialize (); # endif if (GetSystemTimePreciseAsFileTimeFunc != NULL) GetSystemTimePreciseAsFileTimeFunc (¤t_time); else GetSystemTimeAsFileTime (¤t_time); /* Convert from FILETIME to 'struct timeval'. */ /* FILETIME: */ ULONGLONG since_1601 = ((ULONGLONG) current_time.dwHighDateTime << 32) | (ULONGLONG) current_time.dwLowDateTime; /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89 leap years, in total 134774 days. */ ULONGLONG since_1970 = since_1601 - (ULONGLONG) 134774 * (ULONGLONG) 86400 * (ULONGLONG) 10000000; ULONGLONG microseconds_since_1970 = since_1970 / (ULONGLONG) 10; *tv = (struct timeval) { .tv_sec = microseconds_since_1970 / (ULONGLONG) 1000000, .tv_usec = microseconds_since_1970 % (ULONGLONG) 1000000 }; return 0; #else /* !WINDOWS_NATIVE */ tv->tv_sec = (time_t) time ((time_t *)0); tv->tv_usec = 0; return 0; #endif /* !WINDOWS_NATIVE */ } #endif /* !HAVE_GETTIMEOFDAY */ readline-8.3/rltty.c000644 000436 000024 00000057431 15020315031 014552 0ustar00chetstaff000000 000000 /* rltty.c -- functions to prepare and restore the terminal for readline's use. */ /* Copyright (C) 1992-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include #include #include #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #include "rldefs.h" #include "rltty.h" #if defined (HAVE_SYS_IOCTL_H) # include /* include for declaration of ioctl */ #endif #include "readline.h" #include "rlprivate.h" #if !defined (errno) extern int errno; #endif /* !errno */ int _rl_use_tty_xon_xoff = 1; rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal; rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal; static void set_winsize (int); /* **************************************************************** */ /* */ /* Saving and Restoring the TTY */ /* */ /* **************************************************************** */ /* Non-zero means that the terminal is in a prepped state. There are several flags that are OR'd in to denote whether or not we have sent various init strings to the terminal. */ #define TPX_PREPPED 0x01 #define TPX_BRACKPASTE 0x02 #define TPX_METAKEY 0x04 static int terminal_prepped; static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars; /* If non-zero, means that this process has called tcflow(fd, TCOOFF) and output is suspended. */ #if defined (__ksr1__) static int ksrflow; #endif /* Dummy call to force a backgrounded readline to stop before it tries to get the tty settings. But we use the information to set our idea of the screen size if we're in a signal handling context, since it doesn't make sense to waste it. */ static void set_winsize (int tty) { #if defined (TIOCGWINSZ) || defined (HAVE_TCGETWINSIZE) struct winsize w; if (_rl_tcgetwinsize (tty, &w) == 0) { (void) _rl_tcsetwinsize (tty, &w); /* We restrict this to the case where we're running a signal handler and executing after a SIGTSTP. We can relax it later. */ #if defined (SIGTSTP) if (RL_ISSTATE (RL_STATE_SIGHANDLER) && _rl_handling_signal == SIGTSTP && rl_prefer_env_winsize == 0) _rl_set_screen_size (w.ws_row, w.ws_col); /* don't waste the info */ #endif } #endif /* TIOCGWINSZ */ } #if defined (NO_TTY_DRIVER) /* Nothing */ #elif defined (NEW_TTY_DRIVER) /* Values for the `flags' field of a struct bsdtty. This tells which elements of the struct bsdtty have been fetched from the system and are valid. */ #define SGTTY_SET 0x01 #define LFLAG_SET 0x02 #define TCHARS_SET 0x04 #define LTCHARS_SET 0x08 struct bsdtty { struct sgttyb sgttyb; /* Basic BSD tty driver information. */ int lflag; /* Local mode flags, like LPASS8. */ #if defined (TIOCGETC) struct tchars tchars; /* Terminal special characters, including ^S and ^Q. */ #endif #if defined (TIOCGLTC) struct ltchars ltchars; /* 4.2 BSD editing characters */ #endif int flags; /* Bitmap saying which parts of the struct are valid. */ }; #define TIOTYPE struct bsdtty static TIOTYPE otio; static void save_tty_chars (TIOTYPE *); static int _get_tty_settings (int, TIOTYPE *); static int get_tty_settings (int, TIOTYPE *); static int _set_tty_settings (int, TIOTYPE *); static int set_tty_settings (int, TIOTYPE *); static void prepare_terminal_settings (int, TIOTYPE, TIOTYPE *); static void set_special_char (Keymap, TIOTYPE *, int, rl_command_func_t *); static void save_tty_chars (TIOTYPE *tiop) { _rl_last_tty_chars = _rl_tty_chars; if (tiop->flags & SGTTY_SET) { _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase; _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill; } if (tiop->flags & TCHARS_SET) { _rl_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc; _rl_quit_char = _rl_tty_chars.t_quit = tiop->tchars.t_quitc; _rl_tty_chars.t_start = tiop->tchars.t_startc; _rl_tty_chars.t_stop = tiop->tchars.t_stopc; _rl_tty_chars.t_eof = tiop->tchars.t_eofc; _rl_tty_chars.t_eol = '\n'; _rl_tty_chars.t_eol2 = tiop->tchars.t_brkc; } if (tiop->flags & LTCHARS_SET) { _rl_susp_char = _rl_tty_chars.t_susp = tiop->ltchars.t_suspc; _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc; _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc; _rl_tty_chars.t_flush = tiop->ltchars.t_flushc; _rl_tty_chars.t_werase = tiop->ltchars.t_werasc; _rl_tty_chars.t_lnext = tiop->ltchars.t_lnextc; } _rl_tty_chars.t_status = -1; } static int get_tty_settings (int tty, TIOTYPE *tiop) { set_winsize (tty); tiop->flags = tiop->lflag = 0; errno = 0; if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0) return -1; tiop->flags |= SGTTY_SET; #if defined (TIOCLGET) if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0) tiop->flags |= LFLAG_SET; #endif #if defined (TIOCGETC) if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0) tiop->flags |= TCHARS_SET; #endif #if defined (TIOCGLTC) if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0) tiop->flags |= LTCHARS_SET; #endif return 0; } static int set_tty_settings (int tty, TIOTYPE *tiop) { if (tiop->flags & SGTTY_SET) { ioctl (tty, TIOCSETN, &(tiop->sgttyb)); tiop->flags &= ~SGTTY_SET; } _rl_echoing_p = 1; #if defined (TIOCLSET) if (tiop->flags & LFLAG_SET) { ioctl (tty, TIOCLSET, &(tiop->lflag)); tiop->flags &= ~LFLAG_SET; } #endif #if defined (TIOCSETC) if (tiop->flags & TCHARS_SET) { ioctl (tty, TIOCSETC, &(tiop->tchars)); tiop->flags &= ~TCHARS_SET; } #endif #if defined (TIOCSLTC) if (tiop->flags & LTCHARS_SET) { ioctl (tty, TIOCSLTC, &(tiop->ltchars)); tiop->flags &= ~LTCHARS_SET; } #endif return 0; } static void prepare_terminal_settings (int meta_flag, TIOTYPE oldtio, TIOTYPE *tiop) { _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO); _rl_echoctl = (oldtio.sgttyb.sg_flags & ECHOCTL); /* Copy the original settings to the structure we're going to use for our settings. */ tiop->sgttyb = oldtio.sgttyb; tiop->lflag = oldtio.lflag; #if defined (TIOCGETC) tiop->tchars = oldtio.tchars; #endif #if defined (TIOCGLTC) tiop->ltchars = oldtio.ltchars; #endif tiop->flags = oldtio.flags; /* First, the basic settings to put us into character-at-a-time, no-echo input mode. */ tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD); tiop->sgttyb.sg_flags |= CBREAK; /* If this terminal doesn't care how the 8th bit is used, then we can use it for the meta-key. If only one of even or odd parity is specified, then the terminal is using parity, and we cannot. */ #if !defined (ANYP) # define ANYP (EVENP | ODDP) #endif if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) || ((oldtio.sgttyb.sg_flags & ANYP) == 0)) { tiop->sgttyb.sg_flags |= ANYP; /* Hack on local mode flags if we can. */ #if defined (TIOCLGET) # if defined (LPASS8) tiop->lflag |= LPASS8; # endif /* LPASS8 */ #endif /* TIOCLGET */ } #if defined (TIOCGETC) if (_rl_use_tty_xon_xoff == 0) { /* Get rid of terminal output start and stop characters. */ tiop->tchars.t_stopc = -1; /* C-s */ tiop->tchars.t_startc = -1; /* C-q */ /* If there is an XON character, bind it to restart the output. */ if (oldtio.tchars.t_startc != -1) rl_bind_key (oldtio.tchars.t_startc, rl_restart_output); } /* If there is an EOF char, bind _rl_eof_char to it. */ if (oldtio.tchars.t_eofc != -1) _rl_eof_char = oldtio.tchars.t_eofc; # if defined (NO_KILL_INTR) /* Get rid of terminal-generated SIGQUIT and SIGINT. */ tiop->tchars.t_quitc = -1; /* C-\ */ tiop->tchars.t_intrc = -1; /* C-c */ # endif /* NO_KILL_INTR */ #endif /* TIOCGETC */ #if defined (TIOCGLTC) /* Make the interrupt keys go away. Just enough to make people happy. */ tiop->ltchars.t_dsuspc = -1; /* C-y */ tiop->ltchars.t_lnextc = -1; /* C-v */ #endif /* TIOCGLTC */ } #else /* !defined (NEW_TTY_DRIVER) */ #if !defined (VMIN) # define VMIN VEOF #endif #if !defined (VTIME) # define VTIME VEOL #endif #if defined (TERMIOS_TTY_DRIVER) # define TIOTYPE struct termios # define DRAIN_OUTPUT(fd) tcdrain (fd) # define GETATTR(tty, tiop) (tcgetattr (tty, tiop)) # ifdef M_UNIX # define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop)) # else # define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop)) # endif /* !M_UNIX */ #else # define TIOTYPE struct termio # define DRAIN_OUTPUT(fd) # define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop)) # define SETATTR(tty, tiop) (ioctl (tty, TCSETAW, tiop)) #endif /* !TERMIOS_TTY_DRIVER */ static TIOTYPE otio; static void save_tty_chars (TIOTYPE *); static int _get_tty_settings (int, TIOTYPE *); static int get_tty_settings (int, TIOTYPE *); static int _set_tty_settings (int, TIOTYPE *); static int set_tty_settings (int, TIOTYPE *); static void prepare_terminal_settings (int, TIOTYPE, TIOTYPE *); static void set_special_char (Keymap, TIOTYPE *, int, rl_command_func_t *); static void _rl_bind_tty_special_chars (Keymap, TIOTYPE); #if defined (FLUSHO) # define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO) #else # define OUTPUT_BEING_FLUSHED(tp) 0 #endif static void save_tty_chars (TIOTYPE *tiop) { _rl_last_tty_chars = _rl_tty_chars; _rl_tty_chars.t_eof = tiop->c_cc[VEOF]; _rl_tty_chars.t_eol = tiop->c_cc[VEOL]; #ifdef VEOL2 _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2]; #endif _rl_tty_chars.t_erase = tiop->c_cc[VERASE]; #ifdef VWERASE _rl_tty_chars.t_werase = tiop->c_cc[VWERASE]; #endif _rl_tty_chars.t_kill = tiop->c_cc[VKILL]; #ifdef VREPRINT _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT]; #endif _rl_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR]; _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT]; #ifdef VSUSP _rl_susp_char = _rl_tty_chars.t_susp = tiop->c_cc[VSUSP]; #endif #ifdef VDSUSP _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP]; #endif #ifdef VSTART _rl_tty_chars.t_start = tiop->c_cc[VSTART]; #endif #ifdef VSTOP _rl_tty_chars.t_stop = tiop->c_cc[VSTOP]; #endif #ifdef VLNEXT _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT]; #endif #ifdef VDISCARD _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD]; #endif #ifdef VSTATUS _rl_tty_chars.t_status = tiop->c_cc[VSTATUS]; #endif } #if defined (_AIX) || defined (_AIX41) /* Currently this is only used on AIX */ static void rltty_warning (char *msg) { _rl_errmsg ("warning: %s", msg); } #endif #if defined (_AIX) void setopost (TIOTYPE *tp) { if ((tp->c_oflag & OPOST) == 0) { _rl_errmsg ("warning: turning on OPOST for terminal\r"); tp->c_oflag |= OPOST|ONLCR; } } #endif static int _get_tty_settings (int tty, TIOTYPE *tiop) { int ioctl_ret; while (1) { ioctl_ret = GETATTR (tty, tiop); if (ioctl_ret < 0) { if (errno != EINTR) return -1; else continue; } if (OUTPUT_BEING_FLUSHED (tiop)) { #if defined (FLUSHO) _rl_errmsg ("warning: turning off output flushing"); tiop->c_lflag &= ~FLUSHO; break; #else continue; #endif } break; } return 0; } static int get_tty_settings (int tty, TIOTYPE *tiop) { set_winsize (tty); errno = 0; if (_get_tty_settings (tty, tiop) < 0) return -1; #if defined (_AIX) setopost(tiop); #endif return 0; } static int _set_tty_settings (int tty, TIOTYPE *tiop) { while (SETATTR (tty, tiop) < 0) { if (errno != EINTR) return -1; errno = 0; } return 0; } static int set_tty_settings (int tty, TIOTYPE *tiop) { if (_set_tty_settings (tty, tiop) < 0) return -1; #if 0 #if defined (TERMIOS_TTY_DRIVER) # if defined (__ksr1__) if (ksrflow) { ksrflow = 0; tcflow (tty, TCOON); } # else /* !ksr1 */ tcflow (tty, TCOON); /* Simulate a ^Q. */ # endif /* !ksr1 */ #else ioctl (tty, TCXONC, 1); /* Simulate a ^Q. */ #endif /* !TERMIOS_TTY_DRIVER */ #endif /* 0 */ return 0; } static void prepare_terminal_settings (int meta_flag, TIOTYPE oldtio, TIOTYPE *tiop) { int sc; Keymap kmap; _rl_echoing_p = (oldtio.c_lflag & ECHO); #if defined (ECHOCTL) _rl_echoctl = (oldtio.c_lflag & ECHOCTL); #endif tiop->c_lflag &= ~(ICANON | ECHO); if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE) _rl_eof_char = oldtio.c_cc[VEOF]; if (_rl_use_tty_xon_xoff == 0) #if defined (IXANY) tiop->c_iflag &= ~(IXON | IXANY); #else /* `strict' Posix systems do not define IXANY. */ tiop->c_iflag &= ~IXON; #endif /* IXANY */ /* Only turn this off if we are using all 8 bits. */ if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag) tiop->c_iflag &= ~(ISTRIP | INPCK); /* Make sure we differentiate between CR and NL on input. */ tiop->c_iflag &= ~(ICRNL | INLCR); #if !defined (HANDLE_SIGNALS) tiop->c_lflag &= ~ISIG; #else tiop->c_lflag |= ISIG; #endif tiop->c_cc[VMIN] = 1; tiop->c_cc[VTIME] = 0; #if defined (FLUSHO) if (OUTPUT_BEING_FLUSHED (tiop)) { tiop->c_lflag &= ~FLUSHO; oldtio.c_lflag &= ~FLUSHO; } #endif /* Turn off characters that we need on Posix systems with job control, just to be sure. This includes ^Y and ^V. This should not really be necessary. */ #if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE) #if defined (VLNEXT) tiop->c_cc[VLNEXT] = _POSIX_VDISABLE; #endif #if defined (VDSUSP) tiop->c_cc[VDSUSP] = _POSIX_VDISABLE; #endif /* Conditionally disable some other tty special characters if there is a key binding for them in the current keymap. Readline ordinarily doesn't bind these characters, but an application or user might. */ #if defined (VI_MODE) kmap = (rl_editing_mode == vi_mode) ? vi_insertion_keymap : _rl_keymap; #else kmap = _rl_keymap; #endif #if defined (VDISCARD) sc = tiop->c_cc[VDISCARD]; if (sc != _POSIX_VDISABLE && kmap[(unsigned char)sc].type == ISFUNC) tiop->c_cc[VDISCARD] = _POSIX_VDISABLE; #endif /* VDISCARD */ #endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */ } #endif /* !NEW_TTY_DRIVER */ /* Put the terminal in CBREAK mode so that we can detect key presses. */ #if defined (NO_TTY_DRIVER) void rl_prep_terminal (int meta_flag) { _rl_echoing_p = 1; } void rl_deprep_terminal (void) { } #else /* ! NO_TTY_DRIVER */ void rl_prep_terminal (int meta_flag) { int tty, nprep; TIOTYPE tio; if (terminal_prepped) return; /* Try to keep this function from being INTerrupted. */ _rl_block_sigint (); tty = rl_instream ? fileno (rl_instream) : fileno (stdin); if (get_tty_settings (tty, &tio) < 0) { #if defined (ENOTSUP) /* MacOS X and Linux, at least, lie about the value of errno if tcgetattr fails. */ if (errno == ENOTTY || errno == EINVAL || errno == ENOTSUP) #else if (errno == ENOTTY || errno == EINVAL) #endif _rl_echoing_p = 1; /* XXX */ _rl_release_sigint (); return; } otio = tio; if (_rl_bind_stty_chars) { #if defined (VI_MODE) /* If editing in vi mode, make sure we restore the bindings in the insertion keymap no matter what keymap we ended up in. */ if (rl_editing_mode == vi_mode) rl_tty_unset_default_bindings (vi_insertion_keymap); else #endif rl_tty_unset_default_bindings (_rl_keymap); } save_tty_chars (&otio); RL_SETSTATE(RL_STATE_TTYCSAVED); if (_rl_bind_stty_chars) { #if defined (VI_MODE) /* If editing in vi mode, make sure we set the bindings in the insertion keymap no matter what keymap we ended up in. */ if (rl_editing_mode == vi_mode) _rl_bind_tty_special_chars (vi_insertion_keymap, tio); else #endif _rl_bind_tty_special_chars (_rl_keymap, tio); } prepare_terminal_settings (meta_flag, otio, &tio); if (set_tty_settings (tty, &tio) < 0) { _rl_release_sigint (); return; } if (_rl_enable_keypad) _rl_control_keypad (1); nprep = TPX_PREPPED; if (_rl_enable_bracketed_paste) { fprintf (rl_outstream, BRACK_PASTE_INIT); nprep |= TPX_BRACKPASTE; } fflush (rl_outstream); terminal_prepped = nprep; RL_SETSTATE(RL_STATE_TERMPREPPED); _rl_release_sigint (); } /* Restore the terminal's normal settings and modes. */ void rl_deprep_terminal (void) { int tty; if (terminal_prepped == 0) return; /* Try to keep this function from being interrupted. */ _rl_block_sigint (); tty = rl_instream ? fileno (rl_instream) : fileno (stdin); if (terminal_prepped & TPX_BRACKPASTE) { fprintf (rl_outstream, BRACK_PASTE_FINI); /* Since the last character in BRACK_PASTE_FINI is \r */ _rl_last_c_pos = 0; if (rl_eof_found && (RL_ISSTATE (RL_STATE_TIMEOUT) == 0)) fprintf (rl_outstream, "\n"); else if (_rl_echoing_p == 0) fprintf (rl_outstream, "\n"); } if (_rl_enable_keypad) _rl_control_keypad (0); fflush (rl_outstream); if (set_tty_settings (tty, &otio) < 0) { _rl_release_sigint (); return; } terminal_prepped = 0; RL_UNSETSTATE(RL_STATE_TERMPREPPED); _rl_release_sigint (); } #endif /* !NO_TTY_DRIVER */ /* Set readline's idea of whether or not it is echoing output to the terminal, returning the old value. */ int rl_tty_set_echoing (int u) { int o; o = _rl_echoing_p; _rl_echoing_p = u; return o; } /* **************************************************************** */ /* */ /* Bogus Flow Control */ /* */ /* **************************************************************** */ int rl_restart_output (int count, int key) { #if defined (__MINGW32__) return 0; #else /* !__MING32__ */ int fildes = fileno (rl_outstream); #if defined (TIOCSTART) #if defined (apollo) ioctl (&fildes, TIOCSTART, 0); #else ioctl (fildes, TIOCSTART, 0); #endif /* apollo */ #else /* !TIOCSTART */ # if defined (TERMIOS_TTY_DRIVER) # if defined (__ksr1__) if (ksrflow) { ksrflow = 0; tcflow (fildes, TCOON); } # else /* !ksr1 */ tcflow (fildes, TCOON); /* Simulate a ^Q. */ # endif /* !ksr1 */ # else /* !TERMIOS_TTY_DRIVER */ # if defined (TCXONC) ioctl (fildes, TCXONC, TCOON); # endif /* TCXONC */ # endif /* !TERMIOS_TTY_DRIVER */ #endif /* !TIOCSTART */ return 0; #endif /* !__MINGW32__ */ } int rl_stop_output (int count, int key) { #if defined (__MINGW32__) return 0; #else int fildes = fileno (rl_instream); #if defined (TIOCSTOP) # if defined (apollo) ioctl (&fildes, TIOCSTOP, 0); # else ioctl (fildes, TIOCSTOP, 0); # endif /* apollo */ #else /* !TIOCSTOP */ # if defined (TERMIOS_TTY_DRIVER) # if defined (__ksr1__) ksrflow = 1; # endif /* ksr1 */ tcflow (fildes, TCOOFF); # else # if defined (TCXONC) ioctl (fildes, TCXONC, TCOON); # endif /* TCXONC */ # endif /* !TERMIOS_TTY_DRIVER */ #endif /* !TIOCSTOP */ return 0; #endif /* !__MINGW32__ */ } /* **************************************************************** */ /* */ /* Default Key Bindings */ /* */ /* **************************************************************** */ #if !defined (NO_TTY_DRIVER) #define SET_SPECIAL(sc, func) set_special_char(kmap, &ttybuff, sc, func) #endif #if defined (NO_TTY_DRIVER) #define SET_SPECIAL(sc, func) #define RESET_SPECIAL(c) #elif defined (NEW_TTY_DRIVER) static void set_special_char (Keymap kmap, TIOTYPE *tiop, int sc, rl_command_func_t *func) { if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC) kmap[(unsigned char)sc].function = func; } #define RESET_SPECIAL(c) \ if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) \ kmap[(unsigned char)c].function = rl_insert; static void _rl_bind_tty_special_chars (Keymap kmap, TIOTYPE ttybuff) { if (ttybuff.flags & SGTTY_SET) { SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout); SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard); } # if defined (TIOCGLTC) if (ttybuff.flags & LTCHARS_SET) { SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout); SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert); } # endif /* TIOCGLTC */ } #else /* !NEW_TTY_DRIVER */ static void set_special_char (Keymap kmap, TIOTYPE *tiop, int sc, rl_command_func_t *func) { unsigned char uc; uc = tiop->c_cc[sc]; if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) kmap[uc].function = func; } /* used later */ #define RESET_SPECIAL(uc) \ if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \ kmap[uc].function = rl_insert; static void _rl_bind_tty_special_chars (Keymap kmap, TIOTYPE ttybuff) { SET_SPECIAL (VERASE, rl_rubout); SET_SPECIAL (VKILL, rl_unix_line_discard); # if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) SET_SPECIAL (VLNEXT, rl_quoted_insert); # endif /* VLNEXT && TERMIOS_TTY_DRIVER */ # if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) # if defined (VI_MODE) if (rl_editing_mode == vi_mode) SET_SPECIAL (VWERASE, rl_vi_unix_word_rubout); else # endif SET_SPECIAL (VWERASE, rl_unix_word_rubout); # endif /* VWERASE && TERMIOS_TTY_DRIVER */ } #endif /* !NEW_TTY_DRIVER */ /* Set the system's default editing characters to their readline equivalents in KMAP. Should be static, now that we have rl_tty_set_default_bindings. */ void rltty_set_default_bindings (Keymap kmap) { #if !defined (NO_TTY_DRIVER) TIOTYPE ttybuff; int tty; tty = fileno (rl_instream); if (get_tty_settings (tty, &ttybuff) == 0) _rl_bind_tty_special_chars (kmap, ttybuff); #endif } /* New public way to set the system default editing chars to their readline equivalents. */ void rl_tty_set_default_bindings (Keymap kmap) { rltty_set_default_bindings (kmap); } /* Rebind all of the tty special chars that readline worries about back to self-insert. Call this before saving the current terminal special chars with save_tty_chars(). This only works on POSIX termios or termio systems. */ void rl_tty_unset_default_bindings (Keymap kmap) { /* Don't bother before we've saved the tty special chars at least once. */ if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0) return; RESET_SPECIAL (_rl_tty_chars.t_erase); RESET_SPECIAL (_rl_tty_chars.t_kill); # if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) RESET_SPECIAL (_rl_tty_chars.t_lnext); # endif /* VLNEXT && TERMIOS_TTY_DRIVER */ # if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) RESET_SPECIAL (_rl_tty_chars.t_werase); # endif /* VWERASE && TERMIOS_TTY_DRIVER */ } #if defined (HANDLE_SIGNALS) #if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER) int _rl_disable_tty_signals (void) { return 0; } int _rl_restore_tty_signals (void) { return 0; } #else static TIOTYPE sigstty, nosigstty; static int tty_sigs_disabled = 0; int _rl_disable_tty_signals (void) { if (tty_sigs_disabled) return 0; if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0) return -1; nosigstty = sigstty; nosigstty.c_lflag &= ~ISIG; nosigstty.c_iflag &= ~IXON; if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0) return (_set_tty_settings (fileno (rl_instream), &sigstty)); tty_sigs_disabled = 1; return 0; } int _rl_restore_tty_signals (void) { int r; if (tty_sigs_disabled == 0) return 0; r = _set_tty_settings (fileno (rl_instream), &sigstty); if (r == 0) tty_sigs_disabled = 0; return r; } #endif /* !NEW_TTY_DRIVER */ #endif /* HANDLE_SIGNALS */ readline-8.3/posixjmp.h000644 000436 000024 00000002577 12465654057 015303 0ustar00chetstaff000000 000000 /* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */ /* Copyright (C) 1987,1991-2015 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. Bash 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 3 of the License, or (at your option) any later version. Bash 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 Bash. If not, see . */ #ifndef _POSIXJMP_H_ #define _POSIXJMP_H_ #include /* This *must* be included *after* config.h */ #if defined (HAVE_POSIX_SIGSETJMP) # define procenv_t sigjmp_buf # define setjmp_nosigs(x) sigsetjmp((x), 0) # define setjmp_sigs(x) sigsetjmp((x), 1) # define _rl_longjmp(x, n) siglongjmp((x), (n)) # define sh_longjmp(x, n) siglongjmp((x), (n)) #else # define procenv_t jmp_buf # define setjmp_nosigs setjmp # define setjmp_sigs setjmp # define _rl_longjmp(x, n) longjmp((x), (n)) # define sh_longjmp(x, n) longjmp((x), (n)) #endif #endif /* _POSIXJMP_H_ */ readline-8.3/patchlevel000644 000436 000024 00000000061 13661543360 015306 0ustar00chetstaff000000 000000 # Do not edit -- exists only for use by patch 0 readline-8.3/rlwinsize.h000644 000436 000024 00000004411 15020315024 015417 0ustar00chetstaff000000 000000 /* rlwinsize.h -- an attempt to isolate some of the system-specific defines for `struct winsize' and TIOCGWINSZ. */ /* Copyright (C) 1997-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RLWINSIZE_H_) #define _RLWINSIZE_H_ #if defined (HAVE_CONFIG_H) # include "config.h" #endif /* Try to find the definitions of `struct winsize' and TIOGCWINSZ */ #if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ) # include #endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */ #if defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL) # include #endif /* STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ /* Not in either of the standard places, look around. */ #if !defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL) # if defined (HAVE_SYS_STREAM_H) # include # endif /* HAVE_SYS_STREAM_H */ # if defined (HAVE_SYS_PTEM_H) /* SVR4.2, at least, has it here */ # include # define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */ # endif /* HAVE_SYS_PTEM_H */ # if defined (HAVE_SYS_PTE_H) /* ??? */ # include # endif /* HAVE_SYS_PTE_H */ #endif /* !STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ #if defined (M_UNIX) && !defined (_SCO_DS) && !defined (tcflow) # define tcflow(fd, action) ioctl(fd, TCXONC, action) #endif extern int _rl_tcgetwinsize (int, struct winsize *); extern void _rl_tcsetwinsize (int, struct winsize *); #endif /* _RL_WINSIZE_H */ readline-8.3/misc.c000644 000436 000024 00000050773 14723375775 014367 0ustar00chetstaff000000 000000 /* misc.c -- miscellaneous bindable readline functions. */ /* Copyright (C) 1987-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_LOCALE_H) # include #endif #include /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "rlmbutil.h" /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "histlib.h" #include "rlshell.h" #include "xmalloc.h" static int rl_digit_loop (void); static void _rl_history_set_point (void); /* If non-zero, rl_get_previous_history and rl_get_next_history attempt to preserve the value of rl_point from line to line. */ int _rl_history_preserve_point = 0; _rl_arg_cxt _rl_argcxt; /* Saved target point for when _rl_history_preserve_point is set. Special value of -1 means that point is at the end of the line. */ int _rl_history_saved_point = -1; /* **************************************************************** */ /* */ /* Numeric Arguments */ /* */ /* **************************************************************** */ int _rl_arg_overflow (void) { if (rl_numeric_arg > 1000000) { _rl_argcxt = 0; rl_explicit_arg = rl_numeric_arg = 0; rl_ding (); rl_restore_prompt (); rl_clear_message (); RL_UNSETSTATE(RL_STATE_NUMERICARG); return 1; } return 0; } void _rl_arg_init (void) { rl_save_prompt (); _rl_argcxt = 0; RL_SETSTATE(RL_STATE_NUMERICARG); } int _rl_arg_getchar (void) { int c; rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); RL_SETSTATE(RL_STATE_MOREINPUT); c = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); return c; } /* Process C as part of the current numeric argument. Return -1 if the argument should be aborted, 0 if we should not read any more chars, and 1 if we should continue to read chars. */ int _rl_arg_dispatch (_rl_arg_cxt cxt, int c) { int key, r; key = c; /* If we see a key bound to `universal-argument' after seeing digits, it ends the argument but is otherwise ignored. */ if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument) { if ((cxt & NUM_SAWDIGITS) == 0) { rl_numeric_arg *= 4; return 1; } else if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_argcxt |= NUM_READONE; return 0; /* XXX */ } else { key = _rl_bracketed_read_key (); rl_restore_prompt (); rl_clear_message (); RL_UNSETSTATE(RL_STATE_NUMERICARG); if (key < 0) return -1; return (_rl_dispatch (key, _rl_keymap)); } } c = UNMETA (c); if (_rl_digit_p (c)) { _rl_add_executing_keyseq (key); r = _rl_digit_value (c); rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + r : r; rl_explicit_arg = 1; _rl_argcxt |= NUM_SAWDIGITS; } else if (c == '-' && rl_explicit_arg == 0) { _rl_add_executing_keyseq (key); rl_numeric_arg = 1; _rl_argcxt |= NUM_SAWMINUS; rl_arg_sign = -1; } else { /* Make M-- command equivalent to M--1 command. */ if ((_rl_argcxt & NUM_SAWMINUS) && rl_numeric_arg == 1 && rl_explicit_arg == 0) rl_explicit_arg = 1; rl_restore_prompt (); rl_clear_message (); RL_UNSETSTATE(RL_STATE_NUMERICARG); r = _rl_dispatch (key, _rl_keymap); if (RL_ISSTATE (RL_STATE_CALLBACK)) { /* At worst, this will cause an extra redisplay. Otherwise, we have to wait until the next character comes in. */ if (rl_done == 0) (*rl_redisplay_function) (); r = 0; } return r; } return 1; } /* Handle C-u style numeric args, as well as M--, and M-digits. */ static int rl_digit_loop (void) { int c, r; while (1) { if (_rl_arg_overflow ()) return 1; c = _rl_arg_getchar (); if (c < 0) { _rl_abort_internal (); return -1; } r = _rl_arg_dispatch (_rl_argcxt, c); if (r <= 0 || (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)) break; } return r; } /* Create a default argument. */ void _rl_reset_argument (void) { rl_numeric_arg = rl_arg_sign = 1; rl_explicit_arg = 0; _rl_argcxt = 0; } /* Start a numeric argument with initial value KEY */ int rl_digit_argument (int ignore, int key) { _rl_arg_init (); if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_arg_dispatch (_rl_argcxt, key); rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); return 0; } else { rl_execute_next (key); _rl_del_executing_keyseq (); return (rl_digit_loop ()); } } /* C-u, universal argument. Multiply the current argument by 4. Read a key. If the key has nothing to do with arguments, then dispatch on it. If the key is the abort character then abort. */ int rl_universal_argument (int count, int key) { _rl_arg_init (); rl_numeric_arg *= 4; return (RL_ISSTATE (RL_STATE_CALLBACK) ? 0 : rl_digit_loop ()); } int _rl_arg_callback (_rl_arg_cxt cxt) { int c, r; c = _rl_arg_getchar (); if (c < 0) return (1); /* EOF */ if (_rl_argcxt & NUM_READONE) { _rl_argcxt &= ~NUM_READONE; rl_restore_prompt (); rl_clear_message (); RL_UNSETSTATE(RL_STATE_NUMERICARG); rl_execute_next (c); return 0; } r = _rl_arg_dispatch (cxt, c); if (r > 0) rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); return (r != 1); } /* What to do when you abort reading an argument. */ int rl_discard_argument (void) { rl_ding (); rl_clear_message (); _rl_reset_argument (); return 0; } /* **************************************************************** */ /* */ /* History Utilities */ /* */ /* **************************************************************** */ /* We already have a history library, and that is what we use to control the history features of readline. This is our local interface to the history mechanism. */ /* While we are editing the history, this is the saved version of the original line. */ HIST_ENTRY *_rl_saved_line_for_history = (HIST_ENTRY *)NULL; /* Set the history pointer back to the last entry in the history. */ void _rl_start_using_history (void) { using_history (); #if 1 if (_rl_saved_line_for_history && _rl_saved_line_for_history->data) _rl_free_undo_list ((UNDO_LIST *)_rl_saved_line_for_history->data); #endif _rl_free_saved_history_line (); _rl_history_search_pos = -99; /* some random invalid history position */ } /* Free the contents (and containing structure) of a HIST_ENTRY. */ void _rl_free_history_entry (HIST_ENTRY *entry) { if (entry == 0) return; FREE (entry->line); FREE (entry->timestamp); xfree (entry); } /* Perhaps put back the current line if it has changed. */ int _rl_maybe_replace_line (int clear_undo) { HIST_ENTRY *temp; temp = current_history (); /* If the current line has changed, save the changes. */ if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list)) { temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); xfree (temp->line); FREE (temp->timestamp); xfree (temp); /* What about _rl_saved_line_for_history? if the saved undo list is rl_undo_list, and we just put that into a history entry, should we set the saved undo list to NULL? */ if (_rl_saved_line_for_history && (UNDO_LIST *)_rl_saved_line_for_history->data == rl_undo_list) _rl_saved_line_for_history->data = 0; /* Do we want to set rl_undo_list = 0 here since we just saved it into a history entry? We let the caller decide. */ if (clear_undo) rl_undo_list = 0; } return 0; } int rl_maybe_replace_line (void) { return (_rl_maybe_replace_line (0)); } void _rl_unsave_line (HIST_ENTRY *entry) { /* Can't call with `1' because rl_undo_list might point to an undo list from a history entry, as in rl_replace_from_history() below. */ rl_replace_line (entry->line, 0); rl_undo_list = (UNDO_LIST *)entry->data; /* Doesn't free `data'. */ _rl_free_history_entry (entry); rl_point = rl_end; /* rl_replace_line sets rl_end */ } /* Restore the _rl_saved_line_for_history if there is one. */ int rl_maybe_unsave_line (void) { if (_rl_saved_line_for_history) { _rl_unsave_line (_rl_saved_line_for_history); _rl_saved_line_for_history = (HIST_ENTRY *)NULL; } else rl_ding (); return 0; } HIST_ENTRY * _rl_alloc_saved_line (void) { HIST_ENTRY *ret; ret = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); ret->line = savestring (rl_line_buffer); ret->timestamp = (char *)NULL; ret->data = (char *)rl_undo_list; return ret; } /* Save the current line in _rl_saved_line_for_history. */ int rl_maybe_save_line (void) { if (_rl_saved_line_for_history == 0) _rl_saved_line_for_history = _rl_alloc_saved_line (); return 0; } /* Just a wrapper, any self-respecting compiler will inline it. */ void _rl_free_saved_line (HIST_ENTRY *entry) { _rl_free_history_entry (entry); } int _rl_free_saved_history_line (void) { _rl_free_saved_line (_rl_saved_line_for_history); _rl_saved_line_for_history = (HIST_ENTRY *)NULL; return 0; } static void _rl_history_set_point (void) { rl_point = (_rl_history_preserve_point && _rl_history_saved_point != -1) ? _rl_history_saved_point : rl_end; if (rl_point > rl_end) rl_point = rl_end; #if defined (VI_MODE) if (rl_editing_mode == vi_mode && _rl_keymap != vi_insertion_keymap) rl_point = 0; #endif /* VI_MODE */ if (rl_editing_mode == emacs_mode) rl_mark = (rl_point == rl_end ? 0 : rl_end); } void rl_replace_from_history (HIST_ENTRY *entry, int flags) { /* Can't call with `1' because rl_undo_list might point to an undo list from a history entry, just like we're setting up here. */ rl_replace_line (entry->line, 0); rl_undo_list = (UNDO_LIST *)entry->data; rl_point = rl_end; rl_mark = 0; #if defined (VI_MODE) if (rl_editing_mode == vi_mode) { rl_point = 0; rl_mark = rl_end; } #endif } /* Process and free undo lists attached to each history entry prior to the current entry, inclusive, reverting each line to its saved state. This is destructive, and state about the current line is lost. This is not intended to be called while actively editing, and the current line is not assumed to have been added to the history list. */ void _rl_revert_previous_lines (void) { int hpos; HIST_ENTRY *entry; UNDO_LIST *ul, *saved_undo_list; char *lbuf; lbuf = savestring (rl_line_buffer); saved_undo_list = rl_undo_list; hpos = where_history (); entry = (hpos == history_length) ? previous_history () : current_history (); while (entry) { if (ul = (UNDO_LIST *)entry->data) { if (ul == saved_undo_list) saved_undo_list = 0; /* Set up rl_line_buffer and other variables from history entry */ rl_replace_from_history (entry, 0); /* entry->line is now current */ entry->data = 0; /* entry->data is now current undo list */ /* Undo all changes to this history entry */ while (rl_undo_list) rl_do_undo (); /* And copy the reverted line back to the history entry, preserving the timestamp. */ FREE (entry->line); entry->line = savestring (rl_line_buffer); } entry = previous_history (); } /* Restore history state */ rl_undo_list = saved_undo_list; /* may have been set to null */ history_set_pos (hpos); /* reset the line buffer */ rl_replace_line (lbuf, 0); _rl_set_the_line (); /* and clean up */ xfree (lbuf); } /* Revert all lines in the history by making sure we are at the end of the history before calling _rl_revert_previous_lines() */ void _rl_revert_all_lines (void) { int pos; pos = where_history (); using_history (); _rl_revert_previous_lines (); history_set_pos (pos); } /* Free the history list, including private readline data and take care of pointer aliases to history data. Resets rl_undo_list if it points to an UNDO_LIST * saved as some history entry's data member. This should not be called while editing is active. */ void rl_clear_history (void) { HIST_ENTRY **hlist, *hent; register int i; UNDO_LIST *ul, *saved_undo_list; saved_undo_list = rl_undo_list; hlist = history_list (); /* direct pointer, not copy */ for (i = 0; i < history_length; i++) { hent = hlist[i]; if (ul = (UNDO_LIST *)hent->data) { if (ul == saved_undo_list) saved_undo_list = 0; _rl_free_undo_list (ul); hent->data = 0; } _rl_free_history_entry (hent); } history_offset = history_length = 0; rl_undo_list = saved_undo_list; /* should be NULL */ } /* **************************************************************** */ /* */ /* History Commands */ /* */ /* **************************************************************** */ /* Meta-< goes to the start of the history. */ int rl_beginning_of_history (int count, int key) { return (rl_get_previous_history (1 + where_history (), key)); } /* Meta-> goes to the end of the history. (The current line). */ int rl_end_of_history (int count, int key) { rl_maybe_replace_line (); using_history (); rl_maybe_unsave_line (); return 0; } int _rl_next_history_internal (int count) { HIST_ENTRY *temp; /* either not saved by rl_newline or at end of line, so set appropriately. */ if (_rl_history_saved_point == -1 && (rl_point || rl_end)) _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; temp = (HIST_ENTRY *)NULL; while (count) { temp = next_history (); if (!temp) break; --count; } if (temp == 0) return 0; else { rl_replace_from_history (temp, 0); _rl_history_set_point (); return 1; } } /* Move down to the next history line. */ int rl_get_next_history (int count, int key) { int r; if (count < 0) return (rl_get_previous_history (-count, key)); if (count == 0) return 0; /* If the current line has changed, save the changes. */ #if 0 /* XXX old code can leak or corrupt rl_undo_list */ rl_maybe_replace_line (); #else _rl_maybe_replace_line (1); #endif r = _rl_next_history_internal (count); if (r == 0) rl_maybe_unsave_line (); return 0; } int _rl_previous_history_internal (int count) { HIST_ENTRY *old_temp, *temp; temp = old_temp = (HIST_ENTRY *)NULL; /* either not saved by rl_newline or at end of line, so set appropriately. */ if (_rl_history_saved_point == -1 && (rl_point || rl_end)) _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; while (count) { temp = previous_history (); if (temp == 0) break; old_temp = temp; --count; } /* If there was a large argument, and we moved back to the start of the history, that is not an error. So use the last value found. */ if (!temp && old_temp) temp = old_temp; if (temp == 0) { rl_ding (); return 0; } else { rl_replace_from_history (temp, 0); _rl_history_set_point (); return 1; } } /* Get the previous item out of our interactive history, making it the current line. If there is no previous history, just ding. */ int rl_get_previous_history (int count, int key) { int had_saved_line, r; if (count < 0) return (rl_get_next_history (-count, key)); if (count == 0 || history_list () == 0) return 0; /* If we don't have a line saved, then save this one. */ had_saved_line = _rl_saved_line_for_history != 0; /* XXX - if we are not editing a history line and we already had a saved line, we're going to lose this undo list. Not sure what the right thing is here - replace the saved line? */ rl_maybe_save_line (); /* If the current line has changed, save the changes. */ #if 0 /* XXX old code can leak or corrupt rl_undo_list */ rl_maybe_replace_line (); #else _rl_maybe_replace_line (1); #endif r = _rl_previous_history_internal (count); if (r == 0 && had_saved_line == 0) /* failed to find previous history */ _rl_free_saved_history_line (); return 0; } /* With an argument, move back that many history lines, else move to the beginning of history. */ int rl_fetch_history (int count, int c) { int wanted, nhist; /* Giving an argument of n means we want the nth command in the history file. The command number is interpreted the same way that the bash `history' command does it -- that is, giving an argument count of 450 to this command would get the command listed as number 450 in the output of `history'. */ if (rl_explicit_arg) { nhist = history_base + where_history (); /* Negative arguments count back from the end of the history list. */ wanted = (count >= 0) ? nhist - count : -count; if (wanted <= 0 || wanted >= nhist) { /* In vi mode, we don't change the line with an out-of-range argument, as for the `G' command. */ if (rl_editing_mode == vi_mode) rl_ding (); else rl_beginning_of_history (0, 0); } else rl_get_previous_history (wanted, c); } else rl_beginning_of_history (count, 0); return (0); } /* The equivalent of the Korn shell C-o operate-and-get-next-history-line editing command. */ /* This could stand to be global to the readline library */ static rl_hook_func_t *_rl_saved_internal_startup_hook = 0; static int saved_history_logical_offset = -1; #define HISTORY_FULL() (history_is_stifled () && history_length >= history_max_entries) static int set_saved_history (void) { int absolute_offset, count; if (saved_history_logical_offset >= 0) { absolute_offset = saved_history_logical_offset - history_base; count = where_history () - absolute_offset; rl_get_previous_history (count, 0); } saved_history_logical_offset = -1; _rl_internal_startup_hook = _rl_saved_internal_startup_hook; return (0); } int rl_operate_and_get_next (int count, int c) { /* Accept the current line. */ rl_newline (1, c); saved_history_logical_offset = rl_explicit_arg ? count : where_history () + history_base + 1; _rl_saved_internal_startup_hook = _rl_internal_startup_hook; _rl_internal_startup_hook = set_saved_history; return 0; } /* **************************************************************** */ /* */ /* Editing Modes */ /* */ /* **************************************************************** */ /* How to toggle back and forth between editing modes. */ int rl_vi_editing_mode (int count, int key) { #if defined (VI_MODE) _rl_set_insert_mode (RL_IM_INSERT, 1); /* vi mode ignores insert mode */ rl_editing_mode = vi_mode; rl_vi_insert_mode (1, key); #endif /* VI_MODE */ return 0; } int rl_emacs_editing_mode (int count, int key) { rl_editing_mode = emacs_mode; _rl_set_insert_mode (RL_IM_INSERT, 1); /* emacs mode default is insert mode */ _rl_keymap = emacs_standard_keymap; if (_rl_show_mode_in_prompt) _rl_reset_prompt (); return 0; } /* Function for the rest of the library to use to set insert/overwrite mode. */ void _rl_set_insert_mode (int im, int force) { #ifdef CURSOR_MODE _rl_set_cursor (im, force); #endif RL_UNSETSTATE (RL_STATE_OVERWRITE); rl_insert_mode = im; if (rl_insert_mode == RL_IM_OVERWRITE) RL_SETSTATE (RL_STATE_OVERWRITE); } /* Toggle overwrite mode. A positive explicit argument selects overwrite mode. A negative or zero explicit argument selects insert mode. */ int rl_overwrite_mode (int count, int key) { if (rl_explicit_arg == 0) _rl_set_insert_mode (rl_insert_mode ^ 1, 0); else if (count > 0) _rl_set_insert_mode (RL_IM_OVERWRITE, 0); else _rl_set_insert_mode (RL_IM_INSERT, 0); return 0; } readline-8.3/funmap.c000644 000436 000024 00000023365 14715702127 014701 0ustar00chetstaff000000 000000 /* funmap.c -- attach names to functions. */ /* Copyright (C) 1987-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #if !defined (BUFSIZ) #include #endif /* BUFSIZ */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include "rlconf.h" #include "readline.h" #include "xmalloc.h" typedef int QSFUNC (const void *, const void *); extern int _rl_qsort_string_compare (char **, char **); FUNMAP **funmap; static size_t funmap_size; static int funmap_entry; /* After initializing the function map, this is the index of the first program specific function. */ int funmap_program_specific_entry_start; static const FUNMAP default_funmap[] = { { "abort", rl_abort }, { "accept-line", rl_newline }, { "arrow-key-prefix", rl_arrow_keys }, { "backward-byte", rl_backward_byte }, { "backward-char", rl_backward_char }, { "backward-delete-char", rl_rubout }, { "backward-kill-line", rl_backward_kill_line }, { "backward-kill-word", rl_backward_kill_word }, { "backward-word", rl_backward_word }, { "beginning-of-history", rl_beginning_of_history }, { "beginning-of-line", rl_beg_of_line }, { "bracketed-paste-begin", rl_bracketed_paste_begin }, { "call-last-kbd-macro", rl_call_last_kbd_macro }, { "capitalize-word", rl_capitalize_word }, { "character-search", rl_char_search }, { "character-search-backward", rl_backward_char_search }, { "clear-display", rl_clear_display }, { "clear-screen", rl_clear_screen }, { "complete", rl_complete }, { "copy-backward-word", rl_copy_backward_word }, { "copy-forward-word", rl_copy_forward_word }, { "copy-region-as-kill", rl_copy_region_to_kill }, { "delete-char", rl_delete }, { "delete-char-or-list", rl_delete_or_show_completions }, { "delete-horizontal-space", rl_delete_horizontal_space }, { "digit-argument", rl_digit_argument }, { "do-lowercase-version", rl_do_lowercase_version }, { "downcase-word", rl_downcase_word }, { "dump-functions", rl_dump_functions }, { "dump-macros", rl_dump_macros }, { "dump-variables", rl_dump_variables }, { "emacs-editing-mode", rl_emacs_editing_mode }, { "end-kbd-macro", rl_end_kbd_macro }, { "end-of-history", rl_end_of_history }, { "end-of-line", rl_end_of_line }, { "exchange-point-and-mark", rl_exchange_point_and_mark }, { "execute-named-command", rl_execute_named_command }, { "export-completions", rl_export_completions }, { "fetch-history", rl_fetch_history }, { "forward-backward-delete-char", rl_rubout_or_delete }, { "forward-byte", rl_forward_byte }, { "forward-char", rl_forward_char }, { "forward-search-history", rl_forward_search_history }, { "forward-word", rl_forward_word }, { "history-search-backward", rl_history_search_backward }, { "history-search-forward", rl_history_search_forward }, { "history-substring-search-backward", rl_history_substr_search_backward }, { "history-substring-search-forward", rl_history_substr_search_forward }, { "insert-comment", rl_insert_comment }, { "insert-completions", rl_insert_completions }, { "kill-whole-line", rl_kill_full_line }, { "kill-line", rl_kill_line }, { "kill-region", rl_kill_region }, { "kill-word", rl_kill_word }, { "menu-complete", rl_menu_complete }, { "menu-complete-backward", rl_backward_menu_complete }, { "next-history", rl_get_next_history }, { "next-screen-line", rl_next_screen_line }, { "non-incremental-forward-search-history", rl_noninc_forward_search }, { "non-incremental-reverse-search-history", rl_noninc_reverse_search }, { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again }, { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again }, { "old-menu-complete", rl_old_menu_complete }, { "operate-and-get-next", rl_operate_and_get_next }, { "overwrite-mode", rl_overwrite_mode }, #if defined (_WIN32) { "paste-from-clipboard", rl_paste_from_clipboard }, #endif { "possible-completions", rl_possible_completions }, { "previous-history", rl_get_previous_history }, { "previous-screen-line", rl_previous_screen_line }, { "print-last-kbd-macro", rl_print_last_kbd_macro }, { "quoted-insert", rl_quoted_insert }, { "re-read-init-file", rl_re_read_init_file }, { "redraw-current-line", rl_refresh_line}, { "reverse-search-history", rl_reverse_search_history }, { "revert-line", rl_revert_line }, { "self-insert", rl_insert }, { "set-mark", rl_set_mark }, { "skip-csi-sequence", rl_skip_csi_sequence }, { "start-kbd-macro", rl_start_kbd_macro }, { "tab-insert", rl_tab_insert }, { "tilde-expand", rl_tilde_expand }, { "transpose-chars", rl_transpose_chars }, { "transpose-words", rl_transpose_words }, { "tty-status", rl_tty_status }, { "undo", rl_undo_command }, { "universal-argument", rl_universal_argument }, { "unix-filename-rubout", rl_unix_filename_rubout }, { "unix-line-discard", rl_unix_line_discard }, { "unix-word-rubout", rl_unix_word_rubout }, { "upcase-word", rl_upcase_word }, { "yank", rl_yank }, { "yank-last-arg", rl_yank_last_arg }, { "yank-nth-arg", rl_yank_nth_arg }, { "yank-pop", rl_yank_pop }, #if defined (VI_MODE) { "vi-append-eol", rl_vi_append_eol }, { "vi-append-mode", rl_vi_append_mode }, { "vi-arg-digit", rl_vi_arg_digit }, { "vi-back-to-indent", rl_vi_back_to_indent }, { "vi-backward-bigword", rl_vi_bWord }, { "vi-backward-word", rl_vi_bword }, { "vi-bWord", rl_vi_bWord }, { "vi-bword", rl_vi_bword }, /* BEWARE: name matching is case insensitive */ { "vi-change-case", rl_vi_change_case }, { "vi-change-char", rl_vi_change_char }, { "vi-change-to", rl_vi_change_to }, { "vi-char-search", rl_vi_char_search }, { "vi-column", rl_vi_column }, { "vi-complete", rl_vi_complete }, { "vi-delete", rl_vi_delete }, { "vi-delete-to", rl_vi_delete_to }, { "vi-eWord", rl_vi_eWord }, { "vi-editing-mode", rl_vi_editing_mode }, { "vi-end-bigword", rl_vi_eWord }, { "vi-end-word", rl_vi_end_word }, { "vi-eof-maybe", rl_vi_eof_maybe }, { "vi-eword", rl_vi_eword }, /* BEWARE: name matching is case insensitive */ { "vi-fWord", rl_vi_fWord }, { "vi-fetch-history", rl_vi_fetch_history }, { "vi-first-print", rl_vi_first_print }, { "vi-forward-bigword", rl_vi_fWord }, { "vi-forward-word", rl_vi_fword }, { "vi-fword", rl_vi_fword }, /* BEWARE: name matching is case insensitive */ { "vi-goto-mark", rl_vi_goto_mark }, { "vi-insert-beg", rl_vi_insert_beg }, { "vi-insertion-mode", rl_vi_insert_mode }, { "vi-match", rl_vi_match }, { "vi-movement-mode", rl_vi_movement_mode }, { "vi-next-word", rl_vi_next_word }, { "vi-overstrike", rl_vi_overstrike }, { "vi-overstrike-delete", rl_vi_overstrike_delete }, { "vi-prev-word", rl_vi_prev_word }, { "vi-put", rl_vi_put }, { "vi-redo", rl_vi_redo }, { "vi-replace", rl_vi_replace }, { "vi-rubout", rl_vi_rubout }, { "vi-search", rl_vi_search }, { "vi-search-again", rl_vi_search_again }, { "vi-set-mark", rl_vi_set_mark }, { "vi-subst", rl_vi_subst }, { "vi-tilde-expand", rl_vi_tilde_expand }, { "vi-undo", rl_vi_undo }, { "vi-unix-word-rubout", rl_vi_unix_word_rubout }, { "vi-yank-arg", rl_vi_yank_arg }, { "vi-yank-pop", rl_vi_yank_pop }, { "vi-yank-to", rl_vi_yank_to }, #endif /* VI_MODE */ {(char *)NULL, (rl_command_func_t *)NULL } }; int rl_add_funmap_entry (const char *name, rl_command_func_t *function) { if (funmap_entry + 2 >= funmap_size) { funmap_size += 64; funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *)); } funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP)); funmap[funmap_entry]->name = name; funmap[funmap_entry]->function = function; funmap[++funmap_entry] = (FUNMAP *)NULL; return funmap_entry; } static int funmap_initialized; /* Make the funmap contain all of the default entries. */ void rl_initialize_funmap (void) { register int i; if (funmap_initialized) return; for (i = 0; default_funmap[i].name; i++) rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function); funmap_initialized = 1; funmap_program_specific_entry_start = i; } /* Produce a NULL terminated array of known function names. The array is sorted. The array itself is allocated, but not the strings inside. You should free () the array when you done, but not the pointers. */ const char ** rl_funmap_names (void) { const char **result; size_t result_size, result_index; /* Make sure that the function map has been initialized. */ rl_initialize_funmap (); for (result_index = result_size = 0, result = (const char **)NULL; funmap[result_index]; result_index++) { if (result_index + 2 > result_size) { result_size += 20; result = (const char **)xrealloc (result, result_size * sizeof (char *)); } result[result_index] = funmap[result_index]->name; result[result_index + 1] = (char *)NULL; } if (result) qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); return (result); } readline-8.3/parse-colors.c000644 000436 000024 00000032276 14473206554 016031 0ustar00chetstaff000000 000000 /* `dir', `vdir' and `ls' directory listing programs for GNU. Modified by Chet Ramey for Readline. Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012, 2017 Free Software Foundation, Inc. This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see . */ /* Written by Richard Stallman and David MacKenzie. */ /* Color support by Peter Anvin and Dennis Flaherty based on original patches by Greg Lee . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include // strdup() / strcpy() #if defined (HAVE_STRING_H) # include #else /* !HAVE_STRING_H */ # include #endif /* !HAVE_STRING_H */ // abort() #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include "rldefs.h" // STREQ, savestring #include "readline.h" #include "rlprivate.h" #include "rlshell.h" #include "xmalloc.h" #include "colors.h" #include "parse-colors.h" #if defined (COLOR_SUPPORT) static bool get_funky_string (char **dest, const char **src, bool equals_end, size_t *output_count); struct bin_str _rl_color_indicator[] = { { LEN_STR_PAIR ("\033[") }, // lc: Left of color sequence { LEN_STR_PAIR ("m") }, // rc: Right of color sequence { 0, NULL }, // ec: End color (replaces lc+no+rc) { LEN_STR_PAIR ("0") }, // rs: Reset to ordinary colors { 0, NULL }, // no: Normal { 0, NULL }, // fi: File: default { LEN_STR_PAIR ("01;34") }, // di: Directory: bright blue { LEN_STR_PAIR ("01;36") }, // ln: Symlink: bright cyan { LEN_STR_PAIR ("33") }, // pi: Pipe: yellow/brown { LEN_STR_PAIR ("01;35") }, // so: Socket: bright magenta { LEN_STR_PAIR ("01;33") }, // bd: Block device: bright yellow { LEN_STR_PAIR ("01;33") }, // cd: Char device: bright yellow { 0, NULL }, // mi: Missing file: undefined { 0, NULL }, // or: Orphaned symlink: undefined { LEN_STR_PAIR ("01;32") }, // ex: Executable: bright green { LEN_STR_PAIR ("01;35") }, // do: Door: bright magenta { LEN_STR_PAIR ("37;41") }, // su: setuid: white on red { LEN_STR_PAIR ("30;43") }, // sg: setgid: black on yellow { LEN_STR_PAIR ("37;44") }, // st: sticky: black on blue { LEN_STR_PAIR ("34;42") }, // ow: other-writable: blue on green { LEN_STR_PAIR ("30;42") }, // tw: ow w/ sticky: black on green { LEN_STR_PAIR ("30;41") }, // ca: black on red { 0, NULL }, // mh: disabled by default { LEN_STR_PAIR ("\033[K") }, // cl: clear to end of line }; /* Parse a string as part of the LS_COLORS variable; this may involve decoding all kinds of escape characters. If equals_end is set an unescaped equal sign ends the string, otherwise only a : or \0 does. Set *OUTPUT_COUNT to the number of bytes output. Return true if successful. The resulting string is *not* null-terminated, but may contain embedded nulls. Note that both dest and src are char **; on return they point to the first free byte after the array and the character that ended the input string, respectively. */ static bool get_funky_string (char **dest, const char **src, bool equals_end, size_t *output_count) { char num; /* For numerical codes */ size_t count; /* Something to count with */ enum { ST_GND, ST_BACKSLASH, ST_OCTAL, ST_HEX, ST_CARET, ST_END, ST_ERROR } state; const char *p; char *q; p = *src; /* We don't want to double-indirect */ q = *dest; /* the whole darn time. */ count = 0; /* No characters counted in yet. */ num = 0; state = ST_GND; /* Start in ground state. */ while (state < ST_END) { switch (state) { case ST_GND: /* Ground state (no escapes) */ switch (*p) { case ':': case '\0': state = ST_END; /* End of string */ break; case '\\': state = ST_BACKSLASH; /* Backslash scape sequence */ ++p; break; case '^': state = ST_CARET; /* Caret escape */ ++p; break; case '=': if (equals_end) { state = ST_END; /* End */ break; } /* else fall through */ default: *(q++) = *(p++); ++count; break; } break; case ST_BACKSLASH: /* Backslash escaped character */ switch (*p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': state = ST_OCTAL; /* Octal sequence */ num = *p - '0'; break; case 'x': case 'X': state = ST_HEX; /* Hex sequence */ num = 0; break; case 'a': /* Bell */ num = '\a'; break; case 'b': /* Backspace */ num = '\b'; break; case 'e': /* Escape */ num = 27; break; case 'f': /* Form feed */ num = '\f'; break; case 'n': /* Newline */ num = '\n'; break; case 'r': /* Carriage return */ num = '\r'; break; case 't': /* Tab */ num = '\t'; break; case 'v': /* Vtab */ num = '\v'; break; case '?': /* Delete */ num = 127; break; case '_': /* Space */ num = ' '; break; case '\0': /* End of string */ state = ST_ERROR; /* Error! */ break; default: /* Escaped character like \ ^ : = */ num = *p; break; } if (state == ST_BACKSLASH) { *(q++) = num; ++count; state = ST_GND; } ++p; break; case ST_OCTAL: /* Octal sequence */ if (*p < '0' || *p > '7') { *(q++) = num; ++count; state = ST_GND; } else num = (num << 3) + (*(p++) - '0'); break; case ST_HEX: /* Hex sequence */ switch (*p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num = (num << 4) + (*(p++) - '0'); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': num = (num << 4) + (*(p++) - 'a') + 10; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': num = (num << 4) + (*(p++) - 'A') + 10; break; default: *(q++) = num; ++count; state = ST_GND; break; } break; case ST_CARET: /* Caret escape */ state = ST_GND; /* Should be the next state... */ if (*p >= '@' && *p <= '~') { *(q++) = *(p++) & 037; ++count; } else if (*p == '?') { *(q++) = 127; ++count; } else state = ST_ERROR; break; default: /* should we ? */ /* abort (); no, we should not */ state = ST_ERROR; break; } } *dest = q; *src = p; *output_count = count; return state != ST_ERROR; } #endif /* COLOR_SUPPORT */ static void free_color_ext_list (void) { COLOR_EXT_TYPE *e; COLOR_EXT_TYPE *e2; for (e = _rl_color_ext_list; e != NULL; /* empty */) { e2 = e; e = e->next; free (e2); } _rl_color_ext_list = 0; } void _rl_parse_colors(void) { #if defined (COLOR_SUPPORT) const char *p; /* Pointer to character being parsed */ char *buf; /* color_buf buffer pointer */ int state; /* State of parser */ int ind_no; /* Indicator number */ char label[3]; /* Indicator label */ COLOR_EXT_TYPE *ext; /* Extension we are working on */ p = sh_get_env_value ("LS_COLORS"); if (p == 0 || *p == '\0') { _rl_color_ext_list = NULL; return; } ext = NULL; strcpy (label, "??"); /* This is an overly conservative estimate, but any possible LS_COLORS string will *not* generate a color_buf longer than itself, so it is a safe way of allocating a buffer in advance. */ buf = color_buf = savestring (p); state = 1; while (state > 0) { switch (state) { case 1: /* First label character */ switch (*p) { case ':': ++p; break; case '*': /* Allocate new extension block and add to head of linked list (this way a later definition will override an earlier one, which can be useful for having terminal-specific defs override global). */ ext = (COLOR_EXT_TYPE *)xmalloc (sizeof *ext); ext->next = _rl_color_ext_list; _rl_color_ext_list = ext; ++p; ext->ext.string = buf; state = (get_funky_string (&buf, &p, true, &ext->ext.len) ? 4 : -1); break; case '\0': state = 0; /* Done! */ break; default: /* Assume it is file type label */ label[0] = *(p++); state = 2; break; } break; case 2: /* Second label character */ if (*p) { label[1] = *(p++); state = 3; } else state = -1; /* Error */ break; case 3: /* Equal sign after indicator label */ state = -1; /* Assume failure... */ if (*(p++) == '=')/* It *should* be... */ { for (ind_no = 0; indicator_name[ind_no] != NULL; ++ind_no) { if (STREQ (label, indicator_name[ind_no])) { _rl_color_indicator[ind_no].string = buf; state = (get_funky_string (&buf, &p, false, &_rl_color_indicator[ind_no].len) ? 1 : -1); break; } } if (state == -1) { _rl_errmsg ("LS_COLORS: unrecognized prefix: %s", label); /* recover from an unrecognized prefix */ while (p && *p && *p != ':') p++; if (p && *p == ':') state = 1; else if (p && *p == 0) state = 0; } } break; case 4: /* Equal sign after *.ext */ if (*(p++) == '=') { ext->seq.string = buf; state = (get_funky_string (&buf, &p, false, &ext->seq.len) ? 1 : -1); } else state = -1; /* XXX - recover here as with an unrecognized prefix? */ if (state == -1 && ext->ext.string) _rl_errmsg ("LS_COLORS: syntax error: %s", ext->ext.string); break; } } if (state < 0) { _rl_errmsg ("unparsable value for LS_COLORS environment variable"); free (color_buf); free_color_ext_list (); _rl_colored_stats = 0; /* can't have colored stats without colors */ _rl_colored_completion_prefix = 0; /* or colored prefixes */ } #else /* !COLOR_SUPPORT */ ; #endif /* !COLOR_SUPPORT */ } void rl_reparse_colors (void) { char *v; v = sh_get_env_value ("LS_COLORS"); if (v == 0 && color_buf == 0) return; /* no change */ if (v && color_buf && STREQ (v, color_buf)) return; /* no change */ free (color_buf); free_color_ext_list (); _rl_parse_colors (); } readline-8.3/signals.c000644 000436 000024 00000051207 14762703153 015051 0ustar00chetstaff000000 000000 /* signals.c -- signal handling support for readline. */ /* Copyright (C) 1987-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include /* Just for NULL. Yuck. */ #include #include #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ /* System-specific feature definitions and include files. */ #include "rldefs.h" #if defined (GWINSZ_IN_SYS_IOCTL) # include #endif /* GWINSZ_IN_SYS_IOCTL */ /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #if defined (HANDLE_SIGNALS) #define SIGHANDLER_RETURN return /* This typedef is equivalent to the one for Function; it allows us to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */ typedef void SigHandler (int); #if defined (HAVE_POSIX_SIGNALS) typedef struct sigaction sighandler_cxt; # define rl_sigaction(s, nh, oh) sigaction(s, nh, oh) #else typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt; # define sigemptyset(m) #endif /* !HAVE_POSIX_SIGNALS */ #ifndef SA_RESTART # define SA_RESTART 0 #endif static SigHandler *rl_set_sighandler (int, SigHandler *, sighandler_cxt *); static void rl_maybe_set_sighandler (int, SigHandler *, sighandler_cxt *); static void rl_maybe_restore_sighandler (int, sighandler_cxt *); static void rl_signal_handler (int); static void _rl_handle_signal (int); /* Exported variables for use by applications. */ /* If non-zero, readline will install its own signal handlers for SIGINT, SIGTERM, SIGHUP, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ int rl_catch_signals = 1; /* If non-zero, readline will install a signal handler for SIGWINCH. */ #ifdef SIGWINCH int rl_catch_sigwinch = 1; #else int rl_catch_sigwinch = 0; /* for the readline state struct in readline.c */ #endif /* Private variables. */ int volatile _rl_caught_signal = 0; /* should be sig_atomic_t, but that requires including everywhere */ int volatile _rl_handling_signal = 0; /* If non-zero, print characters corresponding to received signals as long as the user has indicated his desire to do so (_rl_echo_control_chars). */ int _rl_echoctl = 0; int _rl_intr_char = 0; int _rl_quit_char = 0; int _rl_susp_char = 0; static int signals_set_flag; static int sigwinch_set_flag; #if defined (HAVE_POSIX_SIGNALS) sigset_t _rl_orig_sigset; #endif /* !HAVE_POSIX_SIGNALS */ /* **************************************************************** */ /* */ /* Signal Handling */ /* */ /* **************************************************************** */ static sighandler_cxt old_int, old_term, old_hup, old_alrm, old_quit; #if defined (SIGTSTP) static sighandler_cxt old_tstp, old_ttou, old_ttin; #endif #if defined (SIGWINCH) static sighandler_cxt old_winch; #endif _rl_sigcleanup_func_t *_rl_sigcleanup; void *_rl_sigcleanarg; /* Readline signal handler functions. */ /* Called from RL_CHECK_SIGNALS() macro to run signal handling code. */ void _rl_signal_handler (int sig) { _rl_caught_signal = 0; /* XXX */ #if defined (SIGWINCH) if (sig == SIGWINCH) { RL_SETSTATE(RL_STATE_SIGHANDLER); _rl_handling_signal = SIGWINCH; rl_resize_terminal (); /* XXX - experimental for now */ /* Call a signal hook because though we called the original signal handler in rl_sigwinch_handler below, we will not resend the signal to ourselves. */ if (rl_signal_event_hook) (*rl_signal_event_hook) (); _rl_handling_signal = 0; RL_UNSETSTATE(RL_STATE_SIGHANDLER); } else #endif _rl_handle_signal (sig); SIGHANDLER_RETURN; } static void rl_signal_handler (int sig) { _rl_caught_signal = sig; SIGHANDLER_RETURN; } /* This is called to handle a signal when it is safe to do so (out of the signal handler execution path). Called by _rl_signal_handler for all the signals readline catches except SIGWINCH. */ static void _rl_handle_signal (int sig) { int block_sig; #if defined (HAVE_POSIX_SIGNALS) sigset_t set, oset; #else /* !HAVE_POSIX_SIGNALS */ # if defined (HAVE_BSD_SIGNALS) long omask; # else /* !HAVE_BSD_SIGNALS */ sighandler_cxt dummy_cxt; /* needed for rl_set_sighandler call */ # endif /* !HAVE_BSD_SIGNALS */ #endif /* !HAVE_POSIX_SIGNALS */ RL_SETSTATE(RL_STATE_SIGHANDLER); _rl_handling_signal = sig; #if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS) /* Since the signal will not be blocked while we are in the signal handler, ignore it until rl_clear_signals resets the catcher. */ # if defined (SIGALRM) if (sig == SIGINT || sig == SIGALRM) # else if (sig == SIGINT) # endif rl_set_sighandler (sig, SIG_IGN, &dummy_cxt); #endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */ /* If there's a sig cleanup function registered, call it and `deregister' the cleanup function to avoid multiple calls */ if (_rl_sigcleanup) { (*_rl_sigcleanup) (sig, _rl_sigcleanarg); _rl_sigcleanup = 0; _rl_sigcleanarg = 0; } #if defined (HAVE_POSIX_SIGNALS) /* Get the current set of blocked signals. If we want to block a signal for the duration of the cleanup functions, make sure to add it to SET and set block_sig = 1 (see the SIGHUP case below). */ block_sig = 0; /* sentinel to block signals with sigprocmask */ sigemptyset (&set); sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set); #endif switch (sig) { case SIGINT: /* We will end up blocking SIGTTOU while we are resetting the tty, so watch out for this if it causes problems. We could prevent this by setting block_sig to 1 without modifying SET. */ _rl_reset_completion_state (); rl_free_line_state (); #if defined (READLINE_CALLBACKS) rl_callback_sigcleanup (); #endif /* FALLTHROUGH */ #if defined (SIGTSTP) case SIGTSTP: case SIGTTIN: case SIGTTOU: # if defined (HAVE_POSIX_SIGNALS) /* Block SIGTTOU so we can restore the terminal settings to something sane without stopping on SIGTTOU if we have been placed into the background. Even trying to get the current terminal pgrp with tcgetpgrp() will generate SIGTTOU, so we don't bother. We still do this even if we've been stopped on SIGTTOU, since we handle signals when we have returned from the signal handler and the signal is no longer blocked. */ if (block_sig == 0) { sigaddset (&set, SIGTTOU); block_sig = 1; } # endif #endif /* SIGTSTP */ /* Any signals that should be blocked during cleanup should go here. */ #if defined (SIGHUP) case SIGHUP: # if defined (_AIX) if (block_sig == 0) { sigaddset (&set, sig); block_sig = 1; } # endif // _AIX #endif /* Signals that don't require blocking during cleanup should go here. */ case SIGTERM: #if defined (SIGALRM) case SIGALRM: if (sig == SIGALRM) _rl_timeout_handle_sigalrm (); #endif #if defined (SIGQUIT) case SIGQUIT: #endif #if defined (HAVE_POSIX_SIGNALS) if (block_sig) sigprocmask (SIG_BLOCK, &set, &oset); #endif #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK) == 0 || rl_persistent_signal_handlers) #endif rl_echo_signal_char (sig); rl_cleanup_after_signal (); /* At this point, the application's signal handler, if any, is the current handler. */ #if defined (HAVE_POSIX_SIGNALS) /* Unblock any signal(s) blocked above */ if (block_sig) sigprocmask (SIG_UNBLOCK, &set, &oset); #endif /* We don't have to bother unblocking the signal because we are not running in a signal handler context. */ #if defined (__EMX__) signal (sig, SIG_ACK); #endif #if defined (HAVE_KILL) kill (getpid (), sig); #else raise (sig); /* assume we have raise */ #endif /* We don't need to modify the signal mask now that this is not run in a signal handler context. */ rl_reset_after_signal (); } _rl_handling_signal = 0; RL_UNSETSTATE(RL_STATE_SIGHANDLER); SIGHANDLER_RETURN; } #if defined (SIGWINCH) static void rl_sigwinch_handler (int sig) { SigHandler *oh; #if defined (MUST_REINSTALL_SIGHANDLERS) sighandler_cxt dummy_winch; /* We don't want to change old_winch -- it holds the state of SIGWINCH disposition set by the calling application. We need this state because we call the application's SIGWINCH handler after updating our own idea of the screen size. */ rl_set_sighandler (SIGWINCH, rl_sigwinch_handler, &dummy_winch); #endif RL_SETSTATE(RL_STATE_SIGHANDLER); _rl_caught_signal = sig; /* If another sigwinch handler has been installed, call it. */ oh = (SigHandler *)old_winch.sa_handler; if (oh && oh != (SigHandler *)SIG_IGN && oh != (SigHandler *)SIG_DFL) (*oh) (sig); RL_UNSETSTATE(RL_STATE_SIGHANDLER); SIGHANDLER_RETURN; } #endif /* SIGWINCH */ /* Functions to manage signal handling. */ #if !defined (HAVE_POSIX_SIGNALS) static int rl_sigaction (int sig, sighandler_cxt *nh, sighandler_cxt *oh) { oh->sa_handler = signal (sig, nh->sa_handler); return 0; } #endif /* !HAVE_POSIX_SIGNALS */ /* Set up a readline-specific signal handler, saving the old signal information in OHANDLER. Return the old signal handler, like signal(). */ static SigHandler * rl_set_sighandler (int sig, SigHandler *handler, sighandler_cxt *ohandler) { sighandler_cxt old_handler; #if defined (HAVE_POSIX_SIGNALS) struct sigaction act; act.sa_handler = handler; # if defined (SIGWINCH) act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0; # else act.sa_flags = 0; # endif /* SIGWINCH */ sigemptyset (&act.sa_mask); sigemptyset (&ohandler->sa_mask); sigaction (sig, &act, &old_handler); #else old_handler.sa_handler = (SigHandler *)signal (sig, handler); #endif /* !HAVE_POSIX_SIGNALS */ /* XXX -- assume we have memcpy */ /* If rl_set_signals is called twice in a row, don't set the old handler to rl_signal_handler, because that would cause infinite recursion. */ if (handler != rl_signal_handler || old_handler.sa_handler != rl_signal_handler) memcpy (ohandler, &old_handler, sizeof (sighandler_cxt)); return (ohandler->sa_handler); } /* Set disposition of SIG to HANDLER, returning old state in OHANDLER. Don't change disposition if OHANDLER indicates the signal was ignored. */ static void rl_maybe_set_sighandler (int sig, SigHandler *handler, sighandler_cxt *ohandler) { sighandler_cxt dummy; SigHandler *oh; sigemptyset (&dummy.sa_mask); dummy.sa_flags = 0; oh = rl_set_sighandler (sig, handler, ohandler); if (oh == (SigHandler *)SIG_IGN) rl_sigaction (sig, ohandler, &dummy); } /* Set the disposition of SIG to HANDLER, if HANDLER->sa_handler indicates the signal was not being ignored. MUST only be called for signals whose disposition was changed using rl_maybe_set_sighandler or for which the SIG_IGN check was performed inline (e.g., SIGALRM below). */ static void rl_maybe_restore_sighandler (int sig, sighandler_cxt *handler) { sighandler_cxt dummy; sigemptyset (&dummy.sa_mask); dummy.sa_flags = 0; if (handler->sa_handler != SIG_IGN) rl_sigaction (sig, handler, &dummy); } int rl_set_signals (void) { sighandler_cxt dummy; SigHandler *oh; #if defined (HAVE_POSIX_SIGNALS) static int sigmask_set = 0; static sigset_t bset, oset; #endif #if defined (HAVE_POSIX_SIGNALS) if (rl_catch_signals && sigmask_set == 0) { sigemptyset (&bset); sigaddset (&bset, SIGINT); sigaddset (&bset, SIGTERM); #if defined (SIGHUP) sigaddset (&bset, SIGHUP); #endif #if defined (SIGQUIT) sigaddset (&bset, SIGQUIT); #endif #if defined (SIGALRM) sigaddset (&bset, SIGALRM); #endif #if defined (SIGTSTP) sigaddset (&bset, SIGTSTP); #endif #if defined (SIGTTIN) sigaddset (&bset, SIGTTIN); #endif #if defined (SIGTTOU) sigaddset (&bset, SIGTTOU); #endif sigmask_set = 1; } #endif /* HAVE_POSIX_SIGNALS */ if (rl_catch_signals && signals_set_flag == 0) { #if defined (HAVE_POSIX_SIGNALS) sigemptyset (&_rl_orig_sigset); sigprocmask (SIG_BLOCK, &bset, &_rl_orig_sigset); #endif rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int); rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term); #if defined (SIGHUP) rl_maybe_set_sighandler (SIGHUP, rl_signal_handler, &old_hup); #endif #if defined (SIGQUIT) rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit); #endif #if defined (SIGALRM) oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm); if (oh == (SigHandler *)SIG_IGN) rl_sigaction (SIGALRM, &old_alrm, &dummy); #if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART) /* If the application using readline has already installed a signal handler with SA_RESTART, SIGALRM will cause reads to be restarted automatically, so readline should just get out of the way. Since we tested for SIG_IGN above, we can just test for SIG_DFL here. */ if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART)) rl_sigaction (SIGALRM, &old_alrm, &dummy); #endif /* HAVE_POSIX_SIGNALS */ #endif /* SIGALRM */ #if defined (SIGTSTP) rl_maybe_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp); #endif /* SIGTSTP */ #if defined (SIGTTOU) rl_maybe_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou); #endif /* SIGTTOU */ #if defined (SIGTTIN) rl_maybe_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin); #endif /* SIGTTIN */ signals_set_flag = 1; #if defined (HAVE_POSIX_SIGNALS) sigprocmask (SIG_SETMASK, &_rl_orig_sigset, (sigset_t *)NULL); #endif } else if (rl_catch_signals == 0) { #if defined (HAVE_POSIX_SIGNALS) sigemptyset (&_rl_orig_sigset); sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &_rl_orig_sigset); #endif } #if defined (SIGWINCH) if (rl_catch_sigwinch && sigwinch_set_flag == 0) { rl_maybe_set_sighandler (SIGWINCH, rl_sigwinch_handler, &old_winch); sigwinch_set_flag = 1; } #endif /* SIGWINCH */ return 0; } int rl_clear_signals (void) { sighandler_cxt dummy; if (rl_catch_signals && signals_set_flag == 1) { /* Since rl_maybe_set_sighandler doesn't override a SIG_IGN handler, we should in theory not have to restore a handler where old_xxx.sa_handler == SIG_IGN. That's what rl_maybe_restore_sighandler does. Fewer system calls should reduce readline's per-line overhead */ rl_maybe_restore_sighandler (SIGINT, &old_int); rl_maybe_restore_sighandler (SIGTERM, &old_term); #if defined (SIGHUP) rl_maybe_restore_sighandler (SIGHUP, &old_hup); #endif #if defined (SIGQUIT) rl_maybe_restore_sighandler (SIGQUIT, &old_quit); #endif #if defined (SIGALRM) rl_maybe_restore_sighandler (SIGALRM, &old_alrm); #endif #if defined (SIGTSTP) rl_maybe_restore_sighandler (SIGTSTP, &old_tstp); #endif /* SIGTSTP */ #if defined (SIGTTOU) rl_maybe_restore_sighandler (SIGTTOU, &old_ttou); #endif /* SIGTTOU */ #if defined (SIGTTIN) rl_maybe_restore_sighandler (SIGTTIN, &old_ttin); #endif /* SIGTTIN */ signals_set_flag = 0; } #if defined (SIGWINCH) if (rl_catch_sigwinch && sigwinch_set_flag == 1) { sigemptyset (&dummy.sa_mask); rl_sigaction (SIGWINCH, &old_winch, &dummy); sigwinch_set_flag = 0; } #endif return 0; } /* Clean up the terminal and readline state after catching a signal, before resending it to the calling application. */ void rl_cleanup_after_signal (void) { _rl_clean_up_for_exit (); if (rl_deprep_term_function) (*rl_deprep_term_function) (); rl_clear_pending_input (); rl_clear_signals (); } /* Reset the terminal and readline state after a signal handler returns. */ void rl_reset_after_signal (void) { if (rl_prep_term_function) (*rl_prep_term_function) (_rl_meta_flag); rl_set_signals (); } /* Similar to rl_callback_sigcleanup, but cleans up operations that allocate state even when not in callback mode. */ void _rl_state_sigcleanup (void) { if (RL_ISSTATE (RL_STATE_ISEARCH)) /* incremental search */ _rl_isearch_cleanup (_rl_iscxt, 0); else if (RL_ISSTATE (RL_STATE_NSEARCH)) /* non-incremental search */ _rl_nsearch_sigcleanup (_rl_nscxt, 0); else if (RL_ISSTATE (RL_STATE_READSTR)) /* reading a string */ _rl_readstr_sigcleanup (_rl_rscxt, 0); } /* Free up the readline variable line state for the current line (undo list, any partial history entry, any keyboard macros in progress, and any numeric arguments in process) after catching a signal, before calling rl_cleanup_after_signal(). */ void rl_free_line_state (void) { register HIST_ENTRY *entry; if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) _rl_state_sigcleanup (); rl_free_undo_list (); entry = current_history (); if (entry) entry->data = (char *)NULL; _rl_kill_kbd_macro (); rl_clear_message (); _rl_reset_argument (); } int rl_pending_signal (void) { return (_rl_caught_signal); } void rl_check_signals (void) { RL_CHECK_SIGNALS (); } #endif /* HANDLE_SIGNALS */ /* **************************************************************** */ /* */ /* SIGINT Management */ /* */ /* **************************************************************** */ #if defined (HAVE_POSIX_SIGNALS) static sigset_t sigwinch_set, sigwinch_oset; #else /* !HAVE_POSIX_SIGNALS */ # if defined (HAVE_BSD_SIGNALS) static int sigint_oldmask; static int sigwinch_oldmask; # endif /* HAVE_BSD_SIGNALS */ #endif /* !HAVE_POSIX_SIGNALS */ static int sigint_blocked; static int sigwinch_blocked; /* Cause SIGINT to not be delivered until the corresponding call to release_sigint(). */ void _rl_block_sigint (void) { if (sigint_blocked) return; sigint_blocked = 1; } /* Allow SIGINT to be delivered. */ void _rl_release_sigint (void) { if (sigint_blocked == 0) return; sigint_blocked = 0; if (RL_ISSTATE (RL_STATE_SIGHANDLER) == 0) RL_CHECK_SIGNALS (); } /* Cause SIGWINCH to not be delivered until the corresponding call to release_sigwinch(). */ void _rl_block_sigwinch (void) { if (sigwinch_blocked) return; #if defined (SIGWINCH) #if defined (HAVE_POSIX_SIGNALS) sigemptyset (&sigwinch_set); sigemptyset (&sigwinch_oset); sigaddset (&sigwinch_set, SIGWINCH); sigprocmask (SIG_BLOCK, &sigwinch_set, &sigwinch_oset); #else /* !HAVE_POSIX_SIGNALS */ # if defined (HAVE_BSD_SIGNALS) sigwinch_oldmask = sigblock (sigmask (SIGWINCH)); # else /* !HAVE_BSD_SIGNALS */ # if defined (HAVE_USG_SIGHOLD) sighold (SIGWINCH); # endif /* HAVE_USG_SIGHOLD */ # endif /* !HAVE_BSD_SIGNALS */ #endif /* !HAVE_POSIX_SIGNALS */ #endif /* SIGWINCH */ sigwinch_blocked = 1; } /* Allow SIGWINCH to be delivered. */ void _rl_release_sigwinch (void) { if (sigwinch_blocked == 0) return; #if defined (SIGWINCH) #if defined (HAVE_POSIX_SIGNALS) sigprocmask (SIG_SETMASK, &sigwinch_oset, (sigset_t *)NULL); #else # if defined (HAVE_BSD_SIGNALS) sigsetmask (sigwinch_oldmask); # else /* !HAVE_BSD_SIGNALS */ # if defined (HAVE_USG_SIGHOLD) sigrelse (SIGWINCH); # endif /* HAVE_USG_SIGHOLD */ # endif /* !HAVE_BSD_SIGNALS */ #endif /* !HAVE_POSIX_SIGNALS */ #endif /* SIGWINCH */ sigwinch_blocked = 0; } /* **************************************************************** */ /* */ /* Echoing special control characters */ /* */ /* **************************************************************** */ void rl_echo_signal_char (int sig) { char cstr[3]; int cslen, c; if (_rl_echoctl == 0 || _rl_echo_control_chars == 0) return; switch (sig) { case SIGINT: c = _rl_intr_char; break; #if defined (SIGQUIT) case SIGQUIT: c = _rl_quit_char; break; #endif #if defined (SIGTSTP) case SIGTSTP: c = _rl_susp_char; break; #endif default: return; } if (CTRL_CHAR (c) || c == RUBOUT) { cstr[0] = '^'; cstr[1] = CTRL_CHAR (c) ? UNCTRL (c) : '?'; cstr[cslen = 2] = '\0'; } else { cstr[0] = c; cstr[cslen = 1] = '\0'; } _rl_output_some_chars (cstr, cslen); } readline-8.3/configure000755 000436 000024 00000760134 15017402567 015161 0ustar00chetstaff000000 000000 #! /bin/sh # From configure.ac for Readline 8.3, version 2.103. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for readline 8.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: bug-readline@gnu.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='readline' PACKAGE_TARNAME='readline' PACKAGE_VERSION='8.3' PACKAGE_STRING='readline 8.3' PACKAGE_BUGREPORT='bug-readline@gnu.org' PACKAGE_URL='' ac_unique_file="readline.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= enable_year2038=no ac_subst_vars='LTLIBOBJS TERMCAP_PKG_CONFIG_LIB TERMCAP_LIB LIBVERSION ARFLAGS STYLE_CFLAGS LOCAL_DEFS LOCAL_LDFLAGS LOCAL_CFLAGS BUILD_DIR EXAMPLES_INSTALL_TARGET SHARED_INSTALL_TARGET STATIC_INSTALL_TARGET SHARED_TARGET STATIC_TARGET SHLIB_MINOR SHLIB_MAJOR SHLIB_LIBS SHLIB_DLLVERSION SHLIB_LIBVERSION SHLIB_LIBSUFF SHLIB_LIBPREF SHLIB_DOT SHLIB_XLDFLAGS SHLIB_STATUS SHOBJ_STATUS SHOBJ_LIBS SHOBJ_XLDFLAGS SHOBJ_LDFLAGS SHOBJ_LD SHOBJ_CFLAGS SHOBJ_CC LIBOBJS CPP MAKE_SHELL install_sh RANLIB AR INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC SET_MAKE CROSS_COMPILE BRACKETED_PASTE host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_curses with_shared_termcap_library enable_multibyte enable_shared enable_static enable_install_examples enable_bracketed_paste_default enable_largefile enable_year2038 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures readline 8.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/readline] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of readline 8.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-multibyte enable multibyte characters if OS supports them --enable-shared build shared libraries [[default=YES]] --enable-static build static libraries [[default=YES]] --disable-install-examples don't install examples [[default=install]] --disable-bracketed-paste-default disable bracketed paste by default [[default=enable]] --disable-largefile omit support for large files --enable-year2038 support timestamps after 2038 Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-curses use the curses library instead of the termcap library --with-shared-termcap-library link the readline shared library against the termcap/curses shared library [[default=NO]] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF readline configure 8.3 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) eval "$3=yes" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_run LINENO # ---------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status ;; esac fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else case e in #( e) eval "$4=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$4 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR # ------------------------------------------------------------------ # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. ac_fn_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 printf %s "checking whether $as_decl_name is declared... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` eval ac_save_FLAGS=\$$6 as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_check_decl # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid; break else case e in #( e) as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=$ac_mid; break else case e in #( e) as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else case e in #( e) ac_lo= ac_hi= ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid else case e in #( e) as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval (void) { return $2; } static unsigned long int ulongval (void) { return $2; } #include #include int main (void) { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by readline $as_me 8.3, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" # Auxiliary files required by this configure script. ac_aux_files="install-sh config.guess config.sub" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/./support" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" LIBVERSION=8.3 # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac opt_curses=no opt_shared_termcap_lib=no # Check whether --with-curses was given. if test ${with_curses+y} then : withval=$with_curses; opt_curses=$withval fi # Check whether --with-shared-termcap-library was given. if test ${with_shared_termcap_library+y} then : withval=$with_shared_termcap_library; opt_shared_termcap_lib=$withval fi if test "$opt_curses" = "yes"; then prefer_curses=yes fi opt_multibyte=yes opt_static_libs=yes opt_shared_libs=yes opt_install_examples=yes opt_bracketed_paste_default=yes # Check whether --enable-multibyte was given. if test ${enable_multibyte+y} then : enableval=$enable_multibyte; opt_multibyte=$enableval fi # Check whether --enable-shared was given. if test ${enable_shared+y} then : enableval=$enable_shared; opt_shared_libs=$enableval fi # Check whether --enable-static was given. if test ${enable_static+y} then : enableval=$enable_static; opt_static_libs=$enableval fi # Check whether --enable-install-examples was given. if test ${enable_install_examples+y} then : enableval=$enable_install_examples; opt_install_examples=$enableval fi # Check whether --enable-bracketed-paste-default was given. if test ${enable_bracketed_paste_default+y} then : enableval=$enable_bracketed_paste_default; opt_bracketed_paste_default=$enableval fi if test $opt_multibyte = no; then printf "%s\n" "#define NO_MULTIBYTE_SUPPORT 1" >>confdefs.h fi if test $opt_bracketed_paste_default = yes; then BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=1' else BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=0' fi CROSS_COMPILE= if test "x$cross_compiling" = "xyes"; then case "${host}" in *-cygwin*) cross_cache=${srcdir}/cross-build/cygwin.cache ;; *-mingw*) cross_cache=${srcdir}/cross-build/mingw.cache ;; i[3456]86-*-beos*) cross_cache=${srcdir}/cross-build/x86-beos.cache ;; *) echo "configure: cross-compiling for $host is not supported" >&2 ;; esac if test -n "${cross_cache}" && test -r "${cross_cache}"; then echo "loading cross-build cache file ${cross_cache}" . ${cross_cache} fi unset cross_cache CROSS_COMPILE='-DCROSS_COMPILING' fi echo "" echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}" echo "" # We want these before the checks, so the checks can modify their values. test -z "$CFLAGS" && want_auto_cflags=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test ${ac_cv_safe_to_define___extensions__+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_safe_to_define___extensions__=yes else case e in #( e) ac_cv_safe_to_define___extensions__=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } if test ${ac_cv_should_define__xopen_source+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h if test $ac_cv_header_minix_config_h = yes then : MINIX=yes printf "%s\n" "#define _MINIX 1" >>confdefs.h printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h else case e in #( e) MINIX= ;; esac fi if test $ac_cv_safe_to_define___extensions__ = yes then : printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h fi if test $ac_cv_should_define__xopen_source = yes then : printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h fi # If we're using gcc and the user hasn't specified CFLAGS, add -O2 to CFLAGS if test -n "$want_auto_cflags" ; then AUTO_CFLAGS="-g ${GCC:+-O2}" # STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}" STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security}" fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi test -n "$ARFLAGS" || ARFLAGS="cr" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi MAKE_SHELL=/bin/sh # codeset.m4 serial 5 (gettext-0.18.2) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 printf %s "checking for an ANSI C-conforming const... " >&6; } if test ${ac_cv_c_const+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* IBM XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_const=yes else case e in #( e) ac_cv_c_const=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 printf "%s\n" "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then printf "%s\n" "#define const /**/" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 printf %s "checking for inline... " >&6; } if test ${ac_cv_c_inline+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo (void) {return 0; } $ac_kw foo_t foo (void) {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 printf "%s\n" "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac if test "$ac_prog_cc_stdc" != no; then printf "%s\n" "#define PROTOTYPES 1" >>confdefs.h printf "%s\n" "#define __PROTOTYPES 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 printf %s "checking whether char is unsigned... " >&6; } if test ${ac_cv_c_char_unsigned+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { static int test_array [1 - 2 * !(((char) -1) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_char_unsigned=no else case e in #( e) ac_cv_c_char_unsigned=yes ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 printf "%s\n" "$ac_cv_c_char_unsigned" >&6; } if test $ac_cv_c_char_unsigned = yes; then printf "%s\n" "#define __CHAR_UNSIGNED__ 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 printf %s "checking for working volatile... " >&6; } if test ${ac_cv_c_volatile+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_volatile=yes else case e in #( e) ac_cv_c_volatile=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 printf "%s\n" "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then printf "%s\n" "#define volatile /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes then : else case e in #( e) printf "%s\n" "#define size_t unsigned int" >>confdefs.h ;; esac fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes then : else case e in #( e) printf "%s\n" "#define ssize_t int" >>confdefs.h ;; esac fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" if test "x$ac_cv_type_mode_t" = xyes then : else case e in #( e) printf "%s\n" "#define mode_t int" >>confdefs.h ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 printf %s "checking whether stat file-mode macros are broken... " >&6; } if test ${ac_cv_header_stat_broken+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_header_stat_broken=no else case e in #( e) ac_cv_header_stat_broken=yes ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 printf "%s\n" "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then printf "%s\n" "#define STAT_MACROS_BROKEN 1" >>confdefs.h fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | sed "$as_sed_sh"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 printf %s "checking for $ac_hdr that defines DIR... " >&6; } if eval test \${$as_ac_Header+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main (void) { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$as_ac_Header=yes" else case e in #( e) eval "$as_ac_Header=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$as_ac_Header { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes" then : cat >>confdefs.h <<_ACEOF #define `printf "%s\n" "HAVE_$ac_hdr" | sed "$as_sed_cpp"` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 printf %s "checking for library containing opendir... " >&6; } if test ${ac_cv_search_opendir+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char opendir (void); int main (void) { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_opendir+y} then : break fi done if test ${ac_cv_search_opendir+y} then : else case e in #( e) ac_cv_search_opendir=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 printf "%s\n" "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 printf %s "checking for library containing opendir... " >&6; } if test ${ac_cv_search_opendir+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char opendir (void); int main (void) { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_opendir+y} then : break fi done if test ${ac_cv_search_opendir+y} then : else case e in #( e) ac_cv_search_opendir=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 printf "%s\n" "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl" if test "x$ac_cv_func_fcntl" = xyes then : printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" if test "x$ac_cv_func_gettimeofday" = xyes then : printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "kill" "ac_cv_func_kill" if test "x$ac_cv_func_kill" = xyes then : printf "%s\n" "#define HAVE_KILL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" if test "x$ac_cv_func_lstat" = xyes then : printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "pselect" "ac_cv_func_pselect" if test "x$ac_cv_func_pselect" = xyes then : printf "%s\n" "#define HAVE_PSELECT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "readlink" "ac_cv_func_readlink" if test "x$ac_cv_func_readlink" = xyes then : printf "%s\n" "#define HAVE_READLINK 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" if test "x$ac_cv_func_select" = xyes then : printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer" if test "x$ac_cv_func_setitimer" = xyes then : printf "%s\n" "#define HAVE_SETITIMER 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "fnmatch" "ac_cv_func_fnmatch" if test "x$ac_cv_func_fnmatch" = xyes then : printf "%s\n" "#define HAVE_FNMATCH 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" if test "x$ac_cv_func_memmove" = xyes then : printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" if test "x$ac_cv_func_putenv" = xyes then : printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" if test "x$ac_cv_func_setenv" = xyes then : printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes then : printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes then : printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strpbrk" "ac_cv_func_strpbrk" if test "x$ac_cv_func_strpbrk" = xyes then : printf "%s\n" "#define HAVE_STRPBRK 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" if test "x$ac_cv_func_sysconf" = xyes then : printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "tcgetattr" "ac_cv_func_tcgetattr" if test "x$ac_cv_func_tcgetattr" = xyes then : printf "%s\n" "#define HAVE_TCGETATTR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "tcgetwinsize" "ac_cv_func_tcgetwinsize" if test "x$ac_cv_func_tcgetwinsize" = xyes then : printf "%s\n" "#define HAVE_TCGETWINSIZE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "tcsetwinsize" "ac_cv_func_tcsetwinsize" if test "x$ac_cv_func_tcsetwinsize" = xyes then : printf "%s\n" "#define HAVE_TCSETWINSIZE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" if test "x$ac_cv_func_vsnprintf" = xyes then : printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "isascii" "ac_cv_func_isascii" if test "x$ac_cv_func_isascii" = xyes then : printf "%s\n" "#define HAVE_ISASCII 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "isxdigit" "ac_cv_func_isxdigit" if test "x$ac_cv_func_isxdigit" = xyes then : printf "%s\n" "#define HAVE_ISXDIGIT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getpwent" "ac_cv_func_getpwent" if test "x$ac_cv_func_getpwent" = xyes then : printf "%s\n" "#define HAVE_GETPWENT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getpwnam" "ac_cv_func_getpwnam" if test "x$ac_cv_func_getpwnam" = xyes then : printf "%s\n" "#define HAVE_GETPWNAM 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getpwuid" "ac_cv_func_getpwuid" if test "x$ac_cv_func_getpwuid" = xyes then : printf "%s\n" "#define HAVE_GETPWUID 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "uid_t" "ac_cv_type_uid_t" "$ac_includes_default" if test "x$ac_cv_type_uid_t" = xyes then : else case e in #( e) printf "%s\n" "#define uid_t int" >>confdefs.h ;; esac fi ac_fn_c_check_type "$LINENO" "gid_t" "ac_cv_type_gid_t" "$ac_includes_default" if test "x$ac_cv_type_gid_t" = xyes then : else case e in #( e) printf "%s\n" "#define gid_t int" >>confdefs.h ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working chown" >&5 printf %s "checking for working chown... " >&6; } if test ${ac_cv_func_chown_works+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on glibc systems. *-gnu*) ac_cv_func_chown_works=yes ;; # If we don't know, assume the worst. *) ac_cv_func_chown_works=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main (void) { char *f = "conftest.chown"; struct stat before, after; if (creat (f, 0600) < 0) return 1; if (stat (f, &before) < 0) return 1; if (chown (f, (uid_t) -1, (gid_t) -1) == -1) return 1; if (stat (f, &after) < 0) return 1; return ! (before.st_uid == after.st_uid && before.st_gid == after.st_gid); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_chown_works=yes else case e in #( e) ac_cv_func_chown_works=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f conftest.chown ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_chown_works" >&5 printf "%s\n" "$ac_cv_func_chown_works" >&6; } if test $ac_cv_func_chown_works = yes; then printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strcoll" >&5 printf %s "checking for working strcoll... " >&6; } if test ${ac_cv_func_strcoll_works+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on glibc systems. *-gnu*) ac_cv_func_strcoll_works=yes ;; # If we don't know, assume the worst. *) ac_cv_func_strcoll_works=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { return (strcoll ("abc", "def") >= 0 || strcoll ("ABC", "DEF") >= 0 || strcoll ("123", "456") >= 0) ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_strcoll_works=yes else case e in #( e) ac_cv_func_strcoll_works=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strcoll_works" >&5 printf "%s\n" "$ac_cv_func_strcoll_works" >&6; } if test $ac_cv_func_strcoll_works = yes; then printf "%s\n" "#define HAVE_STRCOLL 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" if test "x$ac_cv_header_fcntl_h" = xyes then : printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes then : printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes then : printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "varargs.h" "ac_cv_header_varargs_h" "$ac_includes_default" if test "x$ac_cv_header_varargs_h" = xyes then : printf "%s\n" "#define HAVE_VARARGS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdarg.h" "ac_cv_header_stdarg_h" "$ac_includes_default" if test "x$ac_cv_header_stdarg_h" = xyes then : printf "%s\n" "#define HAVE_STDARG_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" "$ac_includes_default" if test "x$ac_cv_header_stdbool_h" = xyes then : printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes then : printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" if test "x$ac_cv_header_strings_h" = xyes then : printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes then : printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes then : printf "%s\n" "#define HAVE_LOCALE_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "pwd.h" "ac_cv_header_pwd_h" "$ac_includes_default" if test "x$ac_cv_header_pwd_h" = xyes then : printf "%s\n" "#define HAVE_PWD_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "memory.h" "ac_cv_header_memory_h" "$ac_includes_default" if test "x$ac_cv_header_memory_h" = xyes then : printf "%s\n" "#define HAVE_MEMORY_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "termcap.h" "ac_cv_header_termcap_h" "$ac_includes_default" if test "x$ac_cv_header_termcap_h" = xyes then : printf "%s\n" "#define HAVE_TERMCAP_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" if test "x$ac_cv_header_termios_h" = xyes then : printf "%s\n" "#define HAVE_TERMIOS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "termio.h" "ac_cv_header_termio_h" "$ac_includes_default" if test "x$ac_cv_header_termio_h" = xyes then : printf "%s\n" "#define HAVE_TERMIO_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" if test "x$ac_cv_header_sys_ioctl_h" = xyes then : printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/pte.h" "ac_cv_header_sys_pte_h" "$ac_includes_default" if test "x$ac_cv_header_sys_pte_h" = xyes then : printf "%s\n" "#define HAVE_SYS_PTE_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/stream.h" "ac_cv_header_sys_stream_h" "$ac_includes_default" if test "x$ac_cv_header_sys_stream_h" = xyes then : printf "%s\n" "#define HAVE_SYS_STREAM_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes then : printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" if test "x$ac_cv_header_sys_time_h" = xyes then : printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/file.h" "ac_cv_header_sys_file_h" "$ac_includes_default" if test "x$ac_cv_header_sys_file_h" = xyes then : printf "%s\n" "#define HAVE_SYS_FILE_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/ptem.h" "ac_cv_header_sys_ptem_h" " #if HAVE_SYS_STREAM_H # include #endif " if test "x$ac_cv_header_sys_ptem_h" = xyes then : printf "%s\n" "#define HAVE_SYS_PTEM_H 1" >>confdefs.h fi # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : enableval=$enable_largefile; fi if test "$enable_largefile,$enable_year2038" != no,no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable large file support" >&5 printf %s "checking for $CC option to enable large file support... " >&6; } if test ${ac_cv_sys_largefile_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CC="$CC" ac_opt_found=no for ac_opt in "none needed" "-D_FILE_OFFSET_BITS=64" "-D_LARGE_FILES=1" "-n32"; do if test x"$ac_opt" != x"none needed" then : CC="$ac_save_CC $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef FTYPE # define FTYPE off_t #endif /* Check that FTYPE can represent 2**63 - 1 correctly. We can't simply define LARGE_FTYPE to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_FTYPE (((FTYPE) 1 << 31 << 31) - 1 + ((FTYPE) 1 << 31 << 31)) int FTYPE_is_large[(LARGE_FTYPE % 2147483629 == 721 && LARGE_FTYPE % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_opt" = x"none needed" then : # GNU/Linux s390x and alpha need _FILE_OFFSET_BITS=64 for wide ino_t. CC="$CC -DFTYPE=ino_t" if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) CC="$CC -D_FILE_OFFSET_BITS=64" if ac_fn_c_try_compile "$LINENO" then : ac_opt='-D_FILE_OFFSET_BITS=64' fi rm -f core conftest.err conftest.$ac_objext conftest.beam ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam fi ac_cv_sys_largefile_opts=$ac_opt ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CC="$ac_save_CC" test $ac_opt_found = yes || ac_cv_sys_largefile_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_opts" >&5 printf "%s\n" "$ac_cv_sys_largefile_opts" >&6; } ac_have_largefile=yes case $ac_cv_sys_largefile_opts in #( "none needed") : ;; #( "supported through gnulib") : ;; #( "support not detected") : ac_have_largefile=no ;; #( "-D_FILE_OFFSET_BITS=64") : printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h ;; #( "-D_LARGE_FILES=1") : printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h ;; #( "-n32") : CC="$CC -n32" ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_largefile_opts" "$LINENO" 5 ;; esac if test "$enable_year2038" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option for timestamps after 2038" >&5 printf %s "checking for $CC option for timestamps after 2038... " >&6; } if test ${ac_cv_sys_year2038_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CPPFLAGS="$CPPFLAGS" ac_opt_found=no for ac_opt in "none needed" "-D_TIME_BITS=64" "-D__MINGW_USE_VC2005_COMPAT" "-U_USE_32_BIT_TIME_T -D__MINGW_USE_VC2005_COMPAT"; do if test x"$ac_opt" != x"none needed" then : CPPFLAGS="$ac_save_CPPFLAGS $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_year2038_opts="$ac_opt" ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CPPFLAGS="$ac_save_CPPFLAGS" test $ac_opt_found = yes || ac_cv_sys_year2038_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_year2038_opts" >&5 printf "%s\n" "$ac_cv_sys_year2038_opts" >&6; } ac_have_year2038=yes case $ac_cv_sys_year2038_opts in #( "none needed") : ;; #( "support not detected") : ac_have_year2038=no ;; #( "-D_TIME_BITS=64") : printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h ;; #( "-D__MINGW_USE_VC2005_COMPAT") : printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h ;; #( "-U_USE_32_BIT_TIME_T"*) : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "the 'time_t' type is currently forced to be 32-bit. It will stop working after mid-January 2038. Remove _USE_32BIT_TIME_T from the compiler flags. See 'config.log' for more details" "$LINENO" 5; } ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_year2038_opts" "$LINENO" 5 ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for type of signal functions" >&5 printf %s "checking for type of signal functions... " >&6; } if test ${bash_cv_signal_vintage+y} then : printf %s "(cached) " >&6 else case e in #( e) if test ${bash_cv_posix_signals+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { sigset_t ss; struct sigaction sa; sigemptyset(&ss); sigsuspend(&ss); sigaction(SIGINT, &sa, (struct sigaction *) 0); sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_posix_signals=yes else case e in #( e) bash_cv_posix_signals=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi if test $bash_cv_posix_signals = yes; then bash_cv_signal_vintage=posix else if test ${bash_cv_bsd_signals+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int mask = sigmask(SIGINT); sigsetmask(mask); sigblock(mask); sigpause(mask); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_bsd_signals=yes else case e in #( e) bash_cv_bsd_signals=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi if test $bash_cv_bsd_signals = yes; then bash_cv_signal_vintage=4.2bsd else if test ${bash_cv_sysv_signals+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void foo() { } int main (void) { int mask = sigmask(SIGINT); sigset(SIGINT, foo); sigrelse(SIGINT); sighold(SIGINT); sigpause(SIGINT); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_sysv_signals=yes else case e in #( e) bash_cv_sysv_signals=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi if test $bash_cv_sysv_signals = yes; then bash_cv_signal_vintage=svr3 else bash_cv_signal_vintage=v7 fi fi fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_signal_vintage" >&5 printf "%s\n" "$bash_cv_signal_vintage" >&6; } if test "$bash_cv_signal_vintage" = posix; then printf "%s\n" "#define HAVE_POSIX_SIGNALS 1" >>confdefs.h elif test "$bash_cv_signal_vintage" = "4.2bsd"; then printf "%s\n" "#define HAVE_BSD_SIGNALS 1" >>confdefs.h elif test "$bash_cv_signal_vintage" = svr3; then printf "%s\n" "#define HAVE_USG_SIGHOLD 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if signal handlers must be reinstalled when invoked" >&5 printf %s "checking if signal handlers must be reinstalled when invoked... " >&6; } if test ${bash_cv_must_reinstall_sighandlers+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&5 printf "%s\n" "$as_me: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&2;} bash_cv_must_reinstall_sighandlers=no else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_UNISTD_H #include #endif #include typedef void sigfunc(int); volatile int nsigint; #ifdef HAVE_POSIX_SIGNALS sigfunc * set_signal_handler(int sig, sigfunc *handler) { struct sigaction act, oact; act.sa_handler = handler; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigemptyset (&oact.sa_mask); sigaction (sig, &act, &oact); return (oact.sa_handler); } #else #define set_signal_handler(s, h) signal(s, h) #endif void sigint(int s) { nsigint++; } int main() { nsigint = 0; set_signal_handler(SIGINT, sigint); kill((int)getpid(), SIGINT); kill((int)getpid(), SIGINT); exit(nsigint != 2); } _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_must_reinstall_sighandlers=no else case e in #( e) bash_cv_must_reinstall_sighandlers=yes ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_must_reinstall_sighandlers" >&5 printf "%s\n" "$bash_cv_must_reinstall_sighandlers" >&6; } if test $bash_cv_must_reinstall_sighandlers = yes; then printf "%s\n" "#define MUST_REINSTALL_SIGHANDLERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5 printf %s "checking for presence of POSIX-style sigsetjmp/siglongjmp... " >&6; } if test ${bash_cv_func_sigsetjmp+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals" >&5 printf "%s\n" "$as_me: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals" >&2;} if test "$bash_cv_posix_signals" = "yes" ; then bash_cv_func_sigsetjmp=present else bash_cv_func_sigsetjmp=missing fi else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include int main() { #if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS) exit (1); #else int code; sigset_t set, oset, nset; sigjmp_buf xx; /* get the mask */ sigemptyset(&set); sigemptyset(&oset); sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset); /* paranoia -- make sure SIGINT is not blocked */ sigdelset (&oset, SIGINT); sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); /* save it */ code = sigsetjmp(xx, 1); if (code) { sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &nset); /* could compare nset to oset here, but we just look for SIGINT */ if (sigismember (&nset, SIGINT)) exit(1); exit(0); } /* change it so that SIGINT is blocked */ sigaddset(&set, SIGINT); sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL); /* and siglongjmp */ siglongjmp(xx, 10); exit(1); #endif } _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_func_sigsetjmp=present else case e in #( e) bash_cv_func_sigsetjmp=missing ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_sigsetjmp" >&5 printf "%s\n" "$bash_cv_func_sigsetjmp" >&6; } if test $bash_cv_func_sigsetjmp = present; then printf "%s\n" "#define HAVE_POSIX_SIGSETJMP 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lstat" >&5 printf %s "checking for lstat... " >&6; } if test ${bash_cv_func_lstat+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { lstat(".",(struct stat *)0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_func_lstat=yes else case e in #( e) bash_cv_func_lstat=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_lstat" >&5 printf "%s\n" "$bash_cv_func_lstat" >&6; } if test $bash_cv_func_lstat = yes; then printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether or not strcoll and strcmp differ" >&5 printf %s "checking whether or not strcoll and strcmp differ... " >&6; } if test ${bash_cv_func_strcoll_broken+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&5 printf "%s\n" "$as_me: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&2;} bash_cv_func_strcoll_broken=no else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if defined (HAVE_LOCALE_H) #include #endif #include #include int main(int c, char **v) { int r1, r2; char *deflocale, *defcoll; #ifdef HAVE_SETLOCALE deflocale = setlocale(LC_ALL, ""); defcoll = setlocale(LC_COLLATE, ""); #endif #ifdef HAVE_STRCOLL /* These two values are taken from tests/glob-test. */ r1 = strcoll("abd", "aXd"); #else r1 = 0; #endif r2 = strcmp("abd", "aXd"); /* These two should both be greater than 0. It is permissible for a system to return different values, as long as the sign is the same. */ /* Exit with 1 (failure) if these two values are both > 0, since this tests whether strcoll(3) is broken with respect to strcmp(3) in the default locale. */ exit (r1 > 0 && r2 > 0); } _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_func_strcoll_broken=yes else case e in #( e) bash_cv_func_strcoll_broken=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_strcoll_broken" >&5 printf "%s\n" "$bash_cv_func_strcoll_broken" >&6; } if test $bash_cv_func_strcoll_broken = yes; then printf "%s\n" "#define STRCOLL_BROKEN 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 printf %s "checking for egrep -e... " >&6; } if test ${ac_cv_path_EGREP_TRADITIONAL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then : fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi if test "$ac_cv_path_EGREP_TRADITIONAL" then : ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getpw functions are declared in pwd.h" >&5 printf %s "checking whether getpw functions are declared in pwd.h... " >&6; } if test ${bash_cv_getpw_declared+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_UNISTD_H # include #endif #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "getpwuid" >/dev/null 2>&1 then : bash_cv_getpw_declared=yes else case e in #( e) bash_cv_getpw_declared=no ;; esac fi rm -rf conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_getpw_declared" >&5 printf "%s\n" "$bash_cv_getpw_declared" >&6; } if test $bash_cv_getpw_declared = yes; then printf "%s\n" "#define HAVE_GETPW_DECLS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5 printf %s "checking whether termios.h defines TIOCGWINSZ... " >&6; } if test ${ac_cv_sys_tiocgwinsz_in_termios_h+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include const int tiocgwinsz = TIOCGWINSZ; _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_tiocgwinsz_in_termios_h=yes else case e in #( e) ac_cv_sys_tiocgwinsz_in_termios_h=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5 printf "%s\n" "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5 printf %s "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; } if test ${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include const int tiocgwinsz = TIOCGWINSZ; _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes else case e in #( e) ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5 printf "%s\n" "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then printf "%s\n" "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h fi fi ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" if test "x$ac_cv_header_inttypes_h" = xyes then : printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t in signal.h" >&5 printf %s "checking for sig_atomic_t in signal.h... " >&6; } if test ${ac_cv_have_sig_atomic_t+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { sig_atomic_t x; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_have_sig_atomic_t=yes else case e in #( e) ac_cv_have_sig_atomic_t=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sig_atomic_t" >&5 printf "%s\n" "$ac_cv_have_sig_atomic_t" >&6; } if test "$ac_cv_have_sig_atomic_t" = "no" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t" >&5 printf %s "checking for sig_atomic_t... " >&6; } if test ${bash_cv_type_sig_atomic_t+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_STDLIB_H #include #endif #if HAVE_STDDEF_H #include #endif #if HAVE_INTTYPES_H #include #endif #if HAVE_STDINT_H #include #endif #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "sig_atomic_t" >/dev/null 2>&1 then : bash_cv_type_sig_atomic_t=yes else case e in #( e) bash_cv_type_sig_atomic_t=no ;; esac fi rm -rf conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_sig_atomic_t" >&5 printf "%s\n" "$bash_cv_type_sig_atomic_t" >&6; } if test $bash_cv_type_sig_atomic_t = no; then printf "%s\n" "#define sig_atomic_t int" >>confdefs.h fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIOCSTAT in sys/ioctl.h" >&5 printf %s "checking for TIOCSTAT in sys/ioctl.h... " >&6; } if test ${bash_cv_tiocstat_in_ioctl+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { int x = TIOCSTAT; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_tiocstat_in_ioctl=yes else case e in #( e) bash_cv_tiocstat_in_ioctl=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_tiocstat_in_ioctl" >&5 printf "%s\n" "$bash_cv_tiocstat_in_ioctl" >&6; } if test $bash_cv_tiocstat_in_ioctl = yes; then printf "%s\n" "#define TIOCSTAT_IN_SYS_IOCTL 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/ioctl.h" >&5 printf %s "checking for FIONREAD in sys/ioctl.h... " >&6; } if test ${bash_cv_fionread_in_ioctl+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { int x = FIONREAD; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_fionread_in_ioctl=yes else case e in #( e) bash_cv_fionread_in_ioctl=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_fionread_in_ioctl" >&5 printf "%s\n" "$bash_cv_fionread_in_ioctl" >&6; } if test $bash_cv_fionread_in_ioctl = yes; then printf "%s\n" "#define FIONREAD_IN_SYS_IOCTL 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for speed_t in sys/types.h" >&5 printf %s "checking for speed_t in sys/types.h... " >&6; } if test ${bash_cv_speed_t_in_sys_types+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { speed_t x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_speed_t_in_sys_types=yes else case e in #( e) bash_cv_speed_t_in_sys_types=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_speed_t_in_sys_types" >&5 printf "%s\n" "$bash_cv_speed_t_in_sys_types" >&6; } if test $bash_cv_speed_t_in_sys_types = yes; then printf "%s\n" "#define SPEED_T_IN_SYS_TYPES 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct winsize in sys/ioctl.h and termios.h" >&5 printf %s "checking for struct winsize in sys/ioctl.h and termios.h... " >&6; } if test ${bash_cv_struct_winsize_header+y} then : printf %s "(cached) " >&6 else case e in #( e) if test ${bash_cv_struct_winsize_ioctl+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { struct winsize x; if (sizeof (x) > 0) return (0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_struct_winsize_ioctl=yes else case e in #( e) bash_cv_struct_winsize_ioctl=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test ${bash_cv_struct_winsize_termios+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { struct winsize x; if (sizeof (x) > 0) return (0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_struct_winsize_termios=yes else case e in #( e) bash_cv_struct_winsize_termios=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test $bash_cv_struct_winsize_ioctl = yes; then bash_cv_struct_winsize_header=ioctl_h elif test $bash_cv_struct_winsize_termios = yes; then bash_cv_struct_winsize_header=termios_h else bash_cv_struct_winsize_header=other fi ;; esac fi if test $bash_cv_struct_winsize_header = ioctl_h; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: sys/ioctl.h" >&5 printf "%s\n" "sys/ioctl.h" >&6; } printf "%s\n" "#define STRUCT_WINSIZE_IN_SYS_IOCTL 1" >>confdefs.h elif test $bash_cv_struct_winsize_header = termios_h; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: termios.h" >&5 printf "%s\n" "termios.h" >&6; } printf "%s\n" "#define STRUCT_WINSIZE_IN_TERMIOS 1" >>confdefs.h else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } fi ac_fn_c_check_member "$LINENO" "struct dirent" "d_ino" "ac_cv_member_struct_dirent_d_ino" " #include #include #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ #if defined(HAVE_DIRENT_H) # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif /* SYSNDIR */ # ifdef HAVE_SYS_DIR_H # include # endif /* SYSDIR */ # ifdef HAVE_NDIR_H # include # endif #endif /* HAVE_DIRENT_H */ " if test "x$ac_cv_member_struct_dirent_d_ino" = xyes then : printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_INO 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct dirent" "d_fileno" "ac_cv_member_struct_dirent_d_fileno" " #include #include #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ #if defined(HAVE_DIRENT_H) # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif /* SYSNDIR */ # ifdef HAVE_SYS_DIR_H # include # endif /* SYSDIR */ # ifdef HAVE_NDIR_H # include # endif #endif /* HAVE_DIRENT_H */ " if test "x$ac_cv_member_struct_dirent_d_fileno" = xyes then : printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_FILENO 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timeval in sys/time.h and time.h" >&5 printf %s "checking for struct timeval in sys/time.h and time.h... " >&6; } if test ${bash_cv_struct_timeval+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H #include #endif #include int main (void) { static struct timeval x; x.tv_sec = x.tv_usec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_struct_timeval=yes else case e in #( e) bash_cv_struct_timeval=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_struct_timeval" >&5 printf "%s\n" "$bash_cv_struct_timeval" >&6; } if test $bash_cv_struct_timeval = yes; then printf "%s\n" "#define HAVE_TIMEVAL 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libaudit.h" "ac_cv_header_libaudit_h" "$ac_includes_default" if test "x$ac_cv_header_libaudit_h" = xyes then : printf "%s\n" "#define HAVE_LIBAUDIT_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CFLAGS=$CFLAGS ac_cv_c_undeclared_builtin_options='cannot detect' for ac_arg in '' -fno-builtin; do CFLAGS="$ac_save_CFLAGS $ac_arg" # This test program should *not* compile successfully. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) # This test program should compile successfully. # No library function is consistently available on # freestanding implementations, so test against a dummy # declaration. Include always-available headers on the # off chance that they somehow elicit warnings. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include extern void ac_decl (int, char *); int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_c_undeclared_builtin_options='none needed' else case e in #( e) ac_cv_c_undeclared_builtin_options=$ac_arg ;; esac fi break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } case $ac_cv_c_undeclared_builtin_options in #( 'cannot detect') : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot make $CC report undeclared builtins See 'config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; esac ac_fn_check_decl "$LINENO" "AUDIT_USER_TTY" "ac_cv_have_decl_AUDIT_USER_TTY" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_AUDIT_USER_TTY" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_AUDIT_USER_TTY $ac_have_decl" >>confdefs.h case "$host_os" in aix*) prefer_curses=yes ;; esac if test "X$bash_cv_termcap_lib" = "X"; then _bash_needmsg=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which library has the termcap functions" >&5 printf %s "checking which library has the termcap functions... " >&6; } _bash_needmsg= fi if test ${bash_cv_termcap_lib+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_fn_c_check_func "$LINENO" "tgetent" "ac_cv_func_tgetent" if test "x$ac_cv_func_tgetent" = xyes then : bash_cv_termcap_lib=libc else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5 printf %s "checking for tgetent in -ltermcap... " >&6; } if test ${ac_cv_lib_termcap_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ltermcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_termcap_tgetent=yes else case e in #( e) ac_cv_lib_termcap_tgetent=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5 printf "%s\n" "$ac_cv_lib_termcap_tgetent" >&6; } if test "x$ac_cv_lib_termcap_tgetent" = xyes then : bash_cv_termcap_lib=libtermcap else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5 printf %s "checking for tgetent in -ltinfo... " >&6; } if test ${ac_cv_lib_tinfo_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ltinfo $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_tinfo_tgetent=yes else case e in #( e) ac_cv_lib_tinfo_tgetent=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tinfo_tgetent" >&5 printf "%s\n" "$ac_cv_lib_tinfo_tgetent" >&6; } if test "x$ac_cv_lib_tinfo_tgetent" = xyes then : bash_cv_termcap_lib=libtinfo else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lcurses" >&5 printf %s "checking for tgetent in -lcurses... " >&6; } if test ${ac_cv_lib_curses_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lcurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_curses_tgetent=yes else case e in #( e) ac_cv_lib_curses_tgetent=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tgetent" >&5 printf "%s\n" "$ac_cv_lib_curses_tgetent" >&6; } if test "x$ac_cv_lib_curses_tgetent" = xyes then : bash_cv_termcap_lib=libcurses else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncursesw" >&5 printf %s "checking for tgetent in -lncursesw... " >&6; } if test ${ac_cv_lib_ncursesw_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lncursesw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_ncursesw_tgetent=yes else case e in #( e) ac_cv_lib_ncursesw_tgetent=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_tgetent" >&5 printf "%s\n" "$ac_cv_lib_ncursesw_tgetent" >&6; } if test "x$ac_cv_lib_ncursesw_tgetent" = xyes then : bash_cv_termcap_lib=libncursesw else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncurses" >&5 printf %s "checking for tgetent in -lncurses... " >&6; } if test ${ac_cv_lib_ncurses_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lncurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_ncurses_tgetent=yes else case e in #( e) ac_cv_lib_ncurses_tgetent=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tgetent" >&5 printf "%s\n" "$ac_cv_lib_ncurses_tgetent" >&6; } if test "x$ac_cv_lib_ncurses_tgetent" = xyes then : bash_cv_termcap_lib=libncurses else case e in #( e) bash_cv_termcap_lib=gnutermcap ;; esac fi ;; esac fi ;; esac fi ;; esac fi ;; esac fi ;; esac fi ;; esac fi if test "X$_bash_needmsg" = "Xyes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which library has the termcap functions" >&5 printf %s "checking which library has the termcap functions... " >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using $bash_cv_termcap_lib" >&5 printf "%s\n" "using $bash_cv_termcap_lib" >&6; } if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then LDFLAGS="$LDFLAGS -L./lib/termcap" TERMCAP_LIB="./lib/termcap/libtermcap.a" TERMCAP_DEP="./lib/termcap/libtermcap.a" elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then TERMCAP_LIB=-ltermcap TERMCAP_DEP= elif test $bash_cv_termcap_lib = libtinfo; then TERMCAP_LIB=-ltinfo TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncursesw; then TERMCAP_LIB=-lncursesw TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncurses; then TERMCAP_LIB=-lncurses TERMCAP_DEP= elif test $bash_cv_termcap_lib = libcurses; then TERMCAP_LIB=-lcurses TERMCAP_DEP= elif test $bash_cv_termcap_lib = libc; then TERMCAP_LIB= TERMCAP_DEP= else # we assume ncurses is installed somewhere the linker can find it TERMCAP_LIB=-lncurses TERMCAP_DEP= fi if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then if test "$prefer_curses" = yes; then TERMCAP_LIB=-lcurses else TERMCAP_LIB=-ltermcap #default fi fi # Windows ncurses installation if test "$TERMCAP_LIB" = "-lncurses"; then ac_fn_c_check_header_compile "$LINENO" "ncurses/termcap.h" "ac_cv_header_ncurses_termcap_h" "$ac_includes_default" if test "x$ac_cv_header_ncurses_termcap_h" = xyes then : printf "%s\n" "#define HAVE_NCURSES_TERMCAP_H 1" >>confdefs.h fi fi case "$opt_shared_termcap_lib" in [Yy][Ee][Ss]) SHARED_TERMCAP="$TERMCAP_LIB" ;; -l*) SHARED_TERMCAP="$opt_shared_termcap_lib" ;; esac case "$TERMCAP_LIB" in -ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;; -lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; -lncursesw) TERMCAP_PKG_CONFIG_LIB=ncursesw ;; -lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; -ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;; *) TERMCAP_PKG_CONFIG_LIB=termcap ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 printf %s "checking for nl_langinfo and CODESET... " >&6; } if test ${am_cv_langinfo_codeset+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { char* cs = nl_langinfo(CODESET); return !cs; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : am_cv_langinfo_codeset=yes else case e in #( e) am_cv_langinfo_codeset=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 printf "%s\n" "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "wctype.h" "ac_cv_header_wctype_h" "$ac_includes_default" if test "x$ac_cv_header_wctype_h" = xyes then : printf "%s\n" "#define HAVE_WCTYPE_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" if test "x$ac_cv_header_wchar_h" = xyes then : printf "%s\n" "#define HAVE_WCHAR_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes then : printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "mbstr.h" "ac_cv_header_mbstr_h" "$ac_includes_default" if test "x$ac_cv_header_mbstr_h" = xyes then : printf "%s\n" "#define HAVE_MBSTR_H 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbrlen" "ac_cv_func_mbrlen" if test "x$ac_cv_func_mbrlen" = xyes then : printf "%s\n" "#define HAVE_MBRLEN 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbscasecmp" "ac_cv_func_mbscasecmp" if test "x$ac_cv_func_mbscasecmp" = xyes then : printf "%s\n" "#define HAVE_MBSCASECMP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbscmp" "ac_cv_func_mbscmp" if test "x$ac_cv_func_mbscmp" = xyes then : printf "%s\n" "#define HAVE_MBSCMP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbsncmp" "ac_cv_func_mbsncmp" if test "x$ac_cv_func_mbsncmp" = xyes then : printf "%s\n" "#define HAVE_MBSNCMP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbsnrtowcs" "ac_cv_func_mbsnrtowcs" if test "x$ac_cv_func_mbsnrtowcs" = xyes then : printf "%s\n" "#define HAVE_MBSNRTOWCS 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbsrtowcs" "ac_cv_func_mbsrtowcs" if test "x$ac_cv_func_mbsrtowcs" = xyes then : printf "%s\n" "#define HAVE_MBSRTOWCS 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbschr" "ac_cv_func_mbschr" if test "x$ac_cv_func_mbschr" = xyes then : printf "%s\n" "#define HAVE_MBSCHR 1" >>confdefs.h else case e in #( e) case " $LIBOBJS " in *" mbschr.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS mbschr.$ac_objext" ;; esac ;; esac fi ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb" if test "x$ac_cv_func_wcrtomb" = xyes then : printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcscoll" "ac_cv_func_wcscoll" if test "x$ac_cv_func_wcscoll" = xyes then : printf "%s\n" "#define HAVE_WCSCOLL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcsdup" "ac_cv_func_wcsdup" if test "x$ac_cv_func_wcsdup" = xyes then : printf "%s\n" "#define HAVE_WCSDUP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcwidth" "ac_cv_func_wcwidth" if test "x$ac_cv_func_wcwidth" = xyes then : printf "%s\n" "#define HAVE_WCWIDTH 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wctype" "ac_cv_func_wctype" if test "x$ac_cv_func_wctype" = xyes then : printf "%s\n" "#define HAVE_WCTYPE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcsnrtombs" "ac_cv_func_wcsnrtombs" if test "x$ac_cv_func_wcsnrtombs" = xyes then : printf "%s\n" "#define HAVE_WCSNRTOMBS 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcswidth" "ac_cv_func_wcswidth" if test "x$ac_cv_func_wcswidth" = xyes then : printf "%s\n" "#define HAVE_WCSWIDTH 1" >>confdefs.h else case e in #( e) case " $LIBOBJS " in *" wcswidth.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS wcswidth.$ac_objext" ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc and mbstate_t are properly declared" >&5 printf %s "checking whether mbrtowc and mbstate_t are properly declared... " >&6; } if test ${ac_cv_func_mbrtowc+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { wchar_t wc; char const s[] = ""; size_t n = 1; mbstate_t state; return ! (sizeof state && (mbrtowc) (&wc, s, n, &state)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_func_mbrtowc=yes else case e in #( e) ac_cv_func_mbrtowc=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mbrtowc" >&5 printf "%s\n" "$ac_cv_func_mbrtowc" >&6; } if test $ac_cv_func_mbrtowc = yes; then printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h fi if test $ac_cv_func_mbrtowc = yes; then printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "iswlower" "ac_cv_func_iswlower" if test "x$ac_cv_func_iswlower" = xyes then : printf "%s\n" "#define HAVE_ISWLOWER 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "iswupper" "ac_cv_func_iswupper" if test "x$ac_cv_func_iswupper" = xyes then : printf "%s\n" "#define HAVE_ISWUPPER 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower" if test "x$ac_cv_func_towlower" = xyes then : printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "towupper" "ac_cv_func_towupper" if test "x$ac_cv_func_towupper" = xyes then : printf "%s\n" "#define HAVE_TOWUPPER 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "iswctype" "ac_cv_func_iswctype" if test "x$ac_cv_func_iswctype" = xyes then : printf "%s\n" "#define HAVE_ISWCTYPE 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t in wchar.h" >&5 printf %s "checking for wchar_t in wchar.h... " >&6; } if test ${bash_cv_type_wchar_t+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { wchar_t foo; foo = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_type_wchar_t=yes else case e in #( e) bash_cv_type_wchar_t=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wchar_t" >&5 printf "%s\n" "$bash_cv_type_wchar_t" >&6; } if test $bash_cv_type_wchar_t = yes; then printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t in wctype.h" >&5 printf %s "checking for wctype_t in wctype.h... " >&6; } if test ${bash_cv_type_wctype_t+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { wctype_t foo; foo = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_type_wctype_t=yes else case e in #( e) bash_cv_type_wctype_t=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wctype_t" >&5 printf "%s\n" "$bash_cv_type_wctype_t" >&6; } if test $bash_cv_type_wctype_t = yes; then printf "%s\n" "#define HAVE_WCTYPE_T 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t in wctype.h" >&5 printf %s "checking for wint_t in wctype.h... " >&6; } if test ${bash_cv_type_wint_t+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { wint_t foo; foo = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_type_wint_t=yes else case e in #( e) bash_cv_type_wint_t=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wint_t" >&5 printf "%s\n" "$bash_cv_type_wint_t" >&6; } if test $bash_cv_type_wint_t = yes; then printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wcwidth broken with unicode combining characters" >&5 printf %s "checking for wcwidth broken with unicode combining characters... " >&6; } if test ${bash_cv_wcwidth_broken+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : bash_cv_wcwidth_broken=no else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include int main(int c, char **v) { int w; setlocale(LC_ALL, "en_US.UTF-8"); w = wcwidth (0x0301); if (w != 0) exit (0); w = wcwidth (0x200b); exit (w == 0); /* exit 0 if wcwidth broken */ } _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_wcwidth_broken=yes else case e in #( e) bash_cv_wcwidth_broken=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_wcwidth_broken" >&5 printf "%s\n" "$bash_cv_wcwidth_broken" >&6; } if test "$bash_cv_wcwidth_broken" = yes; then printf "%s\n" "#define WCWIDTH_BROKEN 1" >>confdefs.h fi if test "$am_cv_func_iconv" = yes; then OLDLIBS="$LIBS" LIBS="$LIBS $LIBINTL $LIBICONV" ac_fn_c_check_func "$LINENO" "locale_charset" "ac_cv_func_locale_charset" if test "x$ac_cv_func_locale_charset" = xyes then : printf "%s\n" "#define HAVE_LOCALE_CHARSET 1" >>confdefs.h fi LIBS="$OLDLIBS" fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5 printf %s "checking size of wchar_t... " >&6; } if test ${ac_cv_sizeof_wchar_t+y} then : printf %s "(cached) " >&6 else case e in #( e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "$ac_includes_default" then : else case e in #( e) if test "$ac_cv_type_wchar_t" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (wchar_t) See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_wchar_t=0 fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_wchar_t" >&5 printf "%s\n" "$ac_cv_sizeof_wchar_t" >&6; } printf "%s\n" "#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t" >>confdefs.h case "$host_cpu" in *cray*) LOCAL_CFLAGS=-DCRAY ;; *s390*) LOCAL_CFLAGS=-fsigned-char ;; esac case "$host_os" in isc*) LOCAL_CFLAGS=-Disc386 ;; hpux*) LOCAL_CFLAGS="-DTGETENT_BROKEN -DTGETFLAG_BROKEN" ;; esac # shared library configuration section # # Shared object configuration section. These values are generated by # ${srcdir}/support/shobj-conf # if test -f ${srcdir}/support/shobj-conf; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking configuration for building shared libraries" >&5 printf %s "checking configuration for building shared libraries... " >&6; } eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}` # SHARED_TERMCAP is set only if opt_shared_termcap_library is set case "$SHLIB_LIBS" in *curses*|*tinfo*) ;; *termcap*|*termlib*) ;; # common aliases *) SHLIB_LIBS="$SHLIB_LIBS $SHARED_TERMCAP" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SHLIB_STATUS" >&5 printf "%s\n" "$SHLIB_STATUS" >&6; } # SHLIB_STATUS is either `supported' or `unsupported'. If it's # `unsupported', turn off any default shared library building if test "$SHLIB_STATUS" = 'unsupported'; then opt_shared_libs=no fi # shared library versioning # quoted for m4 so I can use character classes SHLIB_MAJOR=`expr "$LIBVERSION" : '\([0-9]\)\..*'` SHLIB_MINOR=`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'` fi if test "$opt_static_libs" = "yes"; then STATIC_TARGET=static STATIC_INSTALL_TARGET=install-static fi if test "$opt_shared_libs" = "yes"; then SHARED_TARGET=shared SHARED_INSTALL_TARGET=install-shared fi if test "$opt_install_examples" = "yes"; then EXAMPLES_INSTALL_TARGET=install-examples fi case "$build_os" in msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file *) BUILD_DIR=`pwd` ;; esac case "$BUILD_DIR" in *\ *) BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;; *) ;; esac # CFLAGS=${CFLAGS-"$AUTO_CFLAGS"} if test -n "$want_auto_cflags"; then CFLAGS="$AUTO_CFLAGS" fi CFLAGS="$CFLAGS $STYLE_CFLAGS" ac_config_files="$ac_config_files Makefile doc/Makefile examples/Makefile shlib/Makefile readline.pc history.pc" ac_config_commands="$ac_config_commands stamp-h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs # Check whether --enable-year2038 was given. if test ${enable_year2038+y} then : enableval=$enable_year2038; fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by readline $as_me 8.3, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ readline config.status 8.3 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "shlib/Makefile") CONFIG_FILES="$CONFIG_FILES shlib/Makefile" ;; "readline.pc") CONFIG_FILES="$CONFIG_FILES readline.pc" ;; "history.pc") CONFIG_FILES="$CONFIG_FILES history.pc" ;; "stamp-h") CONFIG_COMMANDS="$CONFIG_COMMANDS stamp-h" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "stamp-h":C) echo > stamp-h ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi readline-8.3/INSTALL000644 000436 000024 00000033772 15027053424 014277 0ustar00chetstaff000000 000000 Basic Installation ================== These are installation instructions for Readline. The simplest way to compile readline is: 1. `cd' to the directory containing the readline source code and type `./configure' to configure readline for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes some time. While running, it prints some messages telling which features it is checking for. If you want to build readline in a directory other than the source directory, just run `configure' using a full pathname, for instance: bash /usr/local/src/readline/readline-8.3/configure 2. Type `make' to compile readline and build the static readline and history libraries. If supported, this will build the shared readline and history libraries also. See below for instructions on compiling the other parts of the distribution. Typing `make everything' will build the static and shared libraries (if supported) and the example programs. 3. Type `make install' to install the static readline and history libraries, the readline include files, the documentation, and, if supported, the shared readline and history libraries. 4. You can remove the created libraries and object files from the build directory by typing `make clean'. To also remove the files that `configure' created (so you can compile readline for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the readline developers, and should be used with care. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in the build directory, and Makefiles in the `doc', `shlib', and `examples' subdirectories. It also creates a `config.h' file containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). To find out more about the options and arguments that the `configure' script understands, type bash-4.2$ ./configure --help at a shell prompt in your readline source directory. If you want to build readline in a directory separate from the source directory - to build for multiple architectures, for example - just use the full path to the configure script. The following commands will build readline in a directory under `/usr/local/build' from the source code in `/usr/local/src/readline/readline-8.3': mkdir /usr/local/build/readline-8.3 cd /usr/local/build/readline-8.3 bash /usr/local/src/readline/readline-8.3/configure make See `Compiling For Multiple Architectures' below for more information about building in a directory separate from the source. If you need to do unusual things to compile readline, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The readline `configure.in' requires autoconf version 2.69 or newer. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile readline for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile readline for one architecture at a time in the source code directory. After you have installed readline for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the readline libraries in `/usr/local/lib', the include files in `/usr/local/include/readline', the man pages in `/usr/local/man', and the info files in `/usr/local/info'. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH' or by supplying a value for the DESTDIR variable when running `make install'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the readline Makefiles will use PATH as the prefix for installing the libraries. Documentation and other data files will still use the regular prefix. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but need to determine by the type of host readline will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM (e.g., i386-unknown-freebsd4.2). See the file `config.sub' for the possible values of each field. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: the readline `configure' looks for a site script, but not all `configure' scripts do. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. Optional Features ================= The readline `configure' recognizes two `--with-PACKAGE' options: `--with-curses' This tells readline that it can find the termcap library functions (tgetent, et al.) in the curses library, rather than a separate termcap library. Readline uses the termcap functions, but does not usually link with the termcap or curses library itself, allowing applications which link with readline the to choose an appropriate library. This option tells readline to link the example programs with the curses library rather than libtermcap. `--with-shared-termcap-library' This tells the readline build process to link the shared version of libreadline against a shared version of the curses or termcap library (see the description of SHLIB_LIBS below under `Shared Libraries'). This relieves the application of having to link with curses or termcap itself, but does not allow the application to choose which library to use. This is only effective on systems that build shared libraries (see below; the default for shared libraries is `yes'). `configure' also recognizes several `--enable-FEATURE' options: `--enable-bracketed-paste-default' Enable bracketed paste by default, so the initial value of the `enable-bracketed-paste' Readline variable is `on'. The default is `yes'. `--enable-install-examples' Install the readline example programs as part of `make install'. `--enable-multibyte' Build with support for multibyte characters enabled on systems with the necessary framework (locale definitions, C library functions, etc.). The default is `yes'. `--enable-shared' Build the shared libraries by default on supported platforms. The default is `yes'. `--enable-static' Build the static libraries by default. The default is `yes'. Shared Libraries ================ There is support for building shared versions of the readline and history libraries. The configure script creates a Makefile in the `shlib' subdirectory, and typing `make shared' will cause shared versions of the readline and history libraries to be built on supported platforms. If `configure' is given the `--enable-shared' option, it will attempt to build the shared libraries by default on supported platforms. This option is enabled by default. Configure calls the script support/shobj-conf to test whether or not shared library creation is supported and to generate the values of variables that are substituted into shlib/Makefile. If you try to build shared libraries on an unsupported platform, `make' will display a message asking you to update support/shobj-conf for your platform. If you need to update support/shobj-conf, you will need to create a `stanza' for your operating system and compiler. The script uses the value of host_os and ${CC} as determined by configure. For instance, FreeBSD 4.2 with any version of gcc is identified as `freebsd4.2-gcc*'. In the stanza for your operating system-compiler pair, you will need to define several variables. They are: SHOBJ_CC The C compiler used to compile source files into shareable object files. This is normally set to the value of ${CC} by configure, and should not need to be changed. SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create position-independent code. If you are using gcc, this should probably be set to `-fpic'. SHOBJ_LD The link editor to be used to create the shared library from the object files created by $SHOBJ_CC. If you are using gcc, a value of `gcc' will probably work. SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation. If you are using gcc, `-shared' may be all that is necessary. These should be the flags needed for generic shared object creation. SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library creation. Many systems use the -R option to the link editor to embed a path within the library for run-time library searches. A reasonable value for such systems would be `-R$(libdir)'. SHLIB_LIBS Any additional libraries that shared libraries should be linked against when they are created. SHLIB_LIBPREF The prefix to use when generating the filename of the shared library. The default is `lib'; Cygwin uses `cyg'. SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when generating the filename of the shared library. Many systems use `so'; HP-UX uses `sl'. SHLIB_LIBVERSION The string to append to the filename to indicate the version of the shared library. It should begin with $(SHLIB_LIBSUFF), and possibly include version information that allows the run-time loader to load the version of the shared library appropriate for a particular program. Systems using shared libraries similar to SunOS 4.x use major and minor library version numbers; for those systems a value of `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate. Systems based on System V Release 4 don't use minor version numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems. Other Unix versions use different schemes. SHLIB_DLLVERSION The version number for shared libraries that determines API compatibility between readline versions and the underlying system. Used only on Cygwin. Defaults to $SHLIB_MAJOR, but can be overridden at configuration time by defining DLLVERSION in the environment. SHLIB_DOT The character used to separate the name of the shared library from the suffix and version information. The default is `.'; systems like Cygwin which don't separate version information from the library name should set this to the empty string. SHLIB_STATUS Set this to `supported' when you have defined the other necessary variables. Make uses this to determine whether or not shared library creation should be attempted. If shared libraries are not supported, this will be set to `unsupported'. You should look at the existing stanzas in support/shobj-conf for ideas. Once you have updated support/shobj-conf, re-run configure and type `make shared' or `make'. The shared libraries will be created in the shlib subdirectory. If shared libraries are created, `make install' will install them. You may install only the shared libraries by running `make install-shared' from the top-level build directory. Running `make install' in the shlib subdirectory will also work. If you don't want to install any created shared libraries, run `make install-static'. readline-8.3/complete.c000644 000436 000024 00000270713 14762703162 015226 0ustar00chetstaff000000 000000 /* complete.c -- filename completion for readline. */ /* Copyright (C) 1987-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (__TANDEM) # define _XOPEN_SOURCE_EXTENDED 1 #endif #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (__TANDEM) # include #endif #include #if defined (HAVE_SYS_FILE_H) # include #endif #include #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include #include #if !defined (errno) extern int errno; #endif /* !errno */ #if defined (HAVE_PWD_H) #include #endif #include "posixdir.h" #include "posixstat.h" /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "rlmbutil.h" /* Some standard library routines. */ #include "readline.h" #include "xmalloc.h" #include "rlprivate.h" #if defined (COLOR_SUPPORT) # include "colors.h" #endif #ifndef MIN #define MIN(x,y) (((x) < (y)) ? (x): (y)) #endif typedef int QSFUNC (const void *, const void *); #ifdef HAVE_LSTAT # define LSTAT lstat #else # define LSTAT stat #endif /* Unix version of a hidden file. Could be different on other systems. */ #define HIDDEN_FILE(fname) ((fname)[0] == '.') /* Most systems don't declare getpwent in if _POSIX_SOURCE is defined. */ #if defined (HAVE_GETPWENT) && (!defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE)) extern struct passwd *getpwent (void); #endif /* HAVE_GETPWENT && (!HAVE_GETPW_DECLS || _POSIX_SOURCE) */ /* If non-zero, then this is the address of a function to call when completing a word would normally display the list of possible matches. This function is called instead of actually doing the display. It takes three arguments: (char **matches, int num_matches, int max_length) where MATCHES is the array of strings that matched, NUM_MATCHES is the number of strings in that array, and MAX_LENGTH is the length of the longest string in that array. */ rl_compdisp_func_t *rl_completion_display_matches_hook = (rl_compdisp_func_t *)NULL; #if defined (VISIBLE_STATS) || defined (COLOR_SUPPORT) # if !defined (X_OK) # define X_OK 1 # endif #endif #if defined (VISIBLE_STATS) static int stat_char (char *); #endif #if defined (COLOR_SUPPORT) static int colored_stat_start (const char *); static void colored_stat_end (void); static int colored_prefix_start (void); static void colored_prefix_end (void); #endif static int path_isdir (const char *); static char *rl_quote_filename (char *, int, char *); static void _rl_complete_sigcleanup (int, void *); static void set_completion_defaults (int); static int get_y_or_n (int); static int _rl_internal_pager (int); static char *printable_part (char *); static int fnwidth (const char *); static int fnprint (const char *, int, const char *); static int print_filename (char *, char *, int); static char **gen_completion_matches (char *, int, int, rl_compentry_func_t *, int, int); static char **remove_duplicate_matches (char **); static void insert_match (char *, int, int, char *); static int append_to_match (char *, int, int, int); static void insert_all_matches (char **, int, char *); static int complete_fncmp (const char *, int, const char *, int); static void display_matches (char **); static int compute_lcd_of_matches (char **, int, const char *); static int postprocess_matches (char ***, int); static int compare_match (char *, const char *); static int complete_get_screenwidth (void); static char *make_quoted_replacement (char *, int, char *); static void _rl_export_completions (char **, char *, int, int); /* **************************************************************** */ /* */ /* Completion matching, from readline's point of view. */ /* */ /* **************************************************************** */ /* Variables known only to the readline library. */ /* If non-zero, non-unique completions always show the list of matches. */ int _rl_complete_show_all = 0; /* If non-zero, non-unique completions show the list of matches, unless it is not possible to do partial completion and modify the line. */ int _rl_complete_show_unmodified = 0; /* If non-zero, completed directory names have a slash appended. */ int _rl_complete_mark_directories = 1; /* If non-zero, the symlinked directory completion behavior introduced in readline-4.2a is disabled, and symlinks that point to directories have a slash appended (subject to the value of _rl_complete_mark_directories). This is user-settable via the mark-symlinked-directories variable. */ int _rl_complete_mark_symlink_dirs = 0; /* If non-zero, completions are printed horizontally in alphabetical order, like `ls -x'. */ int _rl_print_completions_horizontally; /* Non-zero means that case is not significant in filename completion. */ #if (defined (__MSDOS__) && !defined (__DJGPP__)) || (defined (_WIN32) && !defined (__CYGWIN__)) int _rl_completion_case_fold = 1; #else int _rl_completion_case_fold = 0; #endif /* Non-zero means that `-' and `_' are equivalent when comparing filenames for completion. */ int _rl_completion_case_map = 0; /* If zero, don't match hidden files (filenames beginning with a `.' on Unix) when doing filename completion. */ int _rl_match_hidden_files = 1; /* Length in characters of a common prefix replaced with an ellipsis (`...') when displaying completion matches. Matches whose printable portion has more than this number of displaying characters in common will have the common display prefix replaced with an ellipsis. */ int _rl_completion_prefix_display_length = 0; /* The readline-private number of screen columns to use when displaying matches. If < 0 or > _rl_screenwidth, it is ignored. */ int _rl_completion_columns = -1; #if defined (COLOR_SUPPORT) /* Non-zero means to use colors to indicate file type when listing possible completions. The colors used are taken from $LS_COLORS, if set. */ int _rl_colored_stats = 0; /* Non-zero means to use a color (currently magenta) to indicate the common prefix of a set of possible word completions. */ int _rl_colored_completion_prefix = 0; #endif /* If non-zero, when completing in the middle of a word, don't insert characters from the match that match characters following point in the word. This means, for instance, completing when the cursor is after the `e' in `Makefile' won't result in `Makefilefile'. */ int _rl_skip_completed_text = 0; /* If non-zero, menu completion displays the common prefix first in the cycle of possible completions instead of the last. */ int _rl_menu_complete_prefix_first = 0; /* Global variables available to applications using readline. */ #if defined (VISIBLE_STATS) /* Non-zero means add an additional character to each filename displayed during listing completion iff rl_filename_completion_desired which helps to indicate the type of file being listed. */ int rl_visible_stats = 0; #endif /* VISIBLE_STATS */ /* If non-zero, then this is the address of a function to call when completing on a directory name. The function is called with the address of a string (the current directory name) as an arg. */ rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL; rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL; rl_icppfunc_t *rl_filename_stat_hook = (rl_icppfunc_t *)NULL; /* If non-zero, this is the address of a function to call when reading directory entries from the filesystem for completion and comparing them to the partial word to be completed. The function should either return its first argument (if no conversion takes place) or newly-allocated memory. This can, for instance, convert filenames between character sets for comparison against what's typed at the keyboard (after its potential modification by rl_completion_rewrite_hook). The returned value is what is added to the list of matches. The second argument is the length of the filename to be converted. */ rl_dequote_func_t *rl_filename_rewrite_hook = (rl_dequote_func_t *)NULL; /* If non-zero, this is the address of a function to call before comparing the filename portion of a word to be completed with directory entries from the filesystem. This takes the address of the partial word to be completed, after any rl_filename_dequoting_function has been applied. The function should either return its first argument (if no conversion takes place) or newly-allocated memory. This can, for instance, convert the filename portion of the completion word to a character set suitable for comparison against directory entries read from the filesystem (after their potential modification by rl_filename_rewrite_hook). The returned value is what is added to the list of matches. The second argument is the length of the filename to be converted. */ rl_dequote_func_t *rl_completion_rewrite_hook = (rl_dequote_func_t *)NULL; /* Non-zero means readline completion functions perform tilde expansion. */ int rl_complete_with_tilde_expansion = 0; /* Pointer to the generator function for completion_matches (). NULL means to use rl_filename_completion_function (), the default filename completer. */ rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)NULL; /* Pointer to generator function for rl_menu_complete (). NULL means to use *rl_completion_entry_function (see above). */ rl_compentry_func_t *rl_menu_completion_entry_function = (rl_compentry_func_t *)NULL; /* Pointer to alternative function to create matches. Function is called with TEXT, START, and END. START and END are indices in RL_LINE_BUFFER saying what the boundaries of TEXT are. If this function exists and returns NULL then call the value of rl_completion_entry_function to try to match, otherwise use the array of strings returned. */ rl_completion_func_t *rl_attempted_completion_function = (rl_completion_func_t *)NULL; /* Non-zero means to suppress normal filename completion after the user-specified completion function has been called. */ int rl_attempted_completion_over = 0; /* Set to a character indicating the type of completion being performed by rl_complete_internal, available for use by application completion functions. */ int rl_completion_type = 0; /* Up to this many items will be displayed in response to a possible-completions call. After that, we ask the user if she is sure she wants to see them all. A negative value means don't ask. */ int rl_completion_query_items = 100; int _rl_page_completions = 1; /* The basic list of characters that signal a break between words for the completer routine. The contents of this variable is what breaks words in the shell, i.e. " \t\n\"\\'`@$><=" */ const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; /* }) */ /* List of basic quoting characters. */ const char *rl_basic_quote_characters = "\"'"; /* The list of characters that signal a break between words for rl_complete_internal. The default list is the contents of rl_basic_word_break_characters. */ const char *rl_completer_word_break_characters = 0; /* Hook function to allow an application to set the completion word break characters before readline breaks up the line. Allows position-dependent word break characters. */ rl_cpvfunc_t *rl_completion_word_break_hook = (rl_cpvfunc_t *)NULL; /* List of characters which can be used to quote a substring of the line. Completion occurs on the entire substring, and within the substring rl_completer_word_break_characters are treated as any other character, unless they also appear within this list. */ const char *rl_completer_quote_characters = (const char *)NULL; /* List of characters that should be quoted in filenames by the completer. */ const char *rl_filename_quote_characters = (const char *)NULL; /* List of characters that are word break characters, but should be left in TEXT when it is passed to the completion function. The shell uses this to help determine what kind of completing to do. */ const char *rl_special_prefixes = (const char *)NULL; /* If non-zero, then disallow duplicates in the matches. */ int rl_ignore_completion_duplicates = 1; /* Non-zero means that the results of the matches are to be treated as filenames. This is ALWAYS zero on entry, and can only be changed within a completion entry finder function. */ int rl_filename_completion_desired = 0; /* Non-zero means that the results of the matches are to be quoted using double quotes (or an application-specific quoting mechanism) if the filename contains any characters in rl_filename_quote_chars. This is ALWAYS non-zero on entry, and can only be changed within a completion entry finder function. */ int rl_filename_quoting_desired = 1; /* Non-zero means we should apply filename-type quoting to all completions even if we are not otherwise treating the matches as filenames. This is ALWAYS zero on entry, and can only be changed within a completion entry finder function. */ int rl_full_quoting_desired = 0; #define QUOTING_DESIRED() \ (rl_full_quoting_desired || (rl_filename_completion_desired && rl_filename_quoting_desired)) /* This function, if defined, is called by the completer when real filename completion is done, after all the matching names have been generated. It is passed a (char**) known as matches in the code below. It consists of a NULL-terminated array of pointers to potential matching strings. The 1st element (matches[0]) is the maximal substring that is common to all matches. This function can re-arrange the list of matches as required, but all elements of the array must be free()'d if they are deleted. The main intent of this function is to implement FIGNORE a la SunOS csh. */ rl_compignore_func_t *rl_ignore_some_completions_function = (rl_compignore_func_t *)NULL; /* Set to a function to quote a filename in an application-specific fashion. Called with the text to quote, the type of match found (single or multiple) and a pointer to the quoting character to be used, which the function can reset if desired. */ rl_quote_func_t *rl_filename_quoting_function = rl_quote_filename; /* Function to call to remove quoting characters from a filename. Called before completion is attempted, so the embedded quotes do not interfere with matching names in the file system. Readline doesn't do anything with this; it's set only by applications. */ rl_dequote_func_t *rl_filename_dequoting_function = (rl_dequote_func_t *)NULL; /* Function to call to decide whether or not a word break character is quoted. If a character is quoted, it does not break words for the completer. */ rl_linebuf_func_t *rl_char_is_quoted_p = (rl_linebuf_func_t *)NULL; /* If non-zero, the completion functions don't append anything except a possible closing quote. This is set to 0 by rl_complete_internal and may be changed by an application-specific completion function. */ int rl_completion_suppress_append = 0; /* Character appended to completed words when at the end of the line. The default is a space. */ int rl_completion_append_character = ' '; /* If non-zero, the completion functions don't append any closing quote. This is set to 0 by rl_complete_internal and may be changed by an application-specific completion function. */ int rl_completion_suppress_quote = 0; /* Set to any quote character readline thinks it finds before any application completion function is called. */ int rl_completion_quote_character; /* Set to a non-zero value if readline found quoting anywhere in the word to be completed; set before any application completion function is called. */ int rl_completion_found_quote; /* If non-zero, a slash will be appended to completed filenames that are symbolic links to directory names, subject to the value of the mark-directories variable (which is user-settable). This exists so that application completion functions can override the user's preference (set via the mark-symlinked-directories variable) if appropriate. It's set to the value of _rl_complete_mark_symlink_dirs in rl_complete_internal before any application-specific completion function is called, so without that function doing anything, the user's preferences are honored. */ int rl_completion_mark_symlink_dirs; /* If non-zero, inhibit completion (temporarily). */ int rl_inhibit_completion; /* Set to the last key used to invoke one of the completion functions */ int rl_completion_invoking_key; /* If non-zero, sort the completion matches. On by default. */ int rl_sort_completion_matches = 1; /* Variables local to this file. */ /* Local variable states what happened during the last completion attempt. */ static int completion_changed_buffer; static int last_completion_failed = 0; /* The result of the query to the user about displaying completion matches */ static int completion_y_or_n; static int _rl_complete_display_matches_interrupt = 0; /*************************************/ /* */ /* Bindable completion functions */ /* */ /*************************************/ /* Complete the word at or before point. You have supplied the function that does the initial simple matching selection algorithm (see rl_completion_matches ()). The default is to do filename completion. */ int rl_complete (int ignore, int invoking_key) { rl_completion_invoking_key = invoking_key; if (rl_inhibit_completion) return (_rl_insert_char (ignore, invoking_key)); #if 0 else if (rl_last_func == rl_complete && completion_changed_buffer == 0 && last_completion_failed == 0) #else else if (rl_last_func == rl_complete && completion_changed_buffer == 0) #endif return (rl_complete_internal ('?')); else if (_rl_complete_show_all) return (rl_complete_internal ('!')); else if (_rl_complete_show_unmodified) return (rl_complete_internal ('@')); else return (rl_complete_internal (TAB)); } /* List the possible completions. See description of rl_complete (). */ int rl_possible_completions (int ignore, int invoking_key) { last_completion_failed = 0; rl_completion_invoking_key = invoking_key; return (rl_complete_internal ('?')); } int rl_insert_completions (int ignore, int invoking_key) { rl_completion_invoking_key = invoking_key; return (rl_complete_internal ('*')); } /* Return the correct value to pass to rl_complete_internal performing the same tests as rl_complete. This allows consecutive calls to an application's completion function to list possible completions and for an application-specific completion function to honor the show-all-if-ambiguous readline variable. */ int rl_completion_mode (rl_command_func_t *cfunc) { if (rl_last_func == cfunc && !completion_changed_buffer) return '?'; else if (_rl_complete_show_all) return '!'; else if (_rl_complete_show_unmodified) return '@'; else return TAB; } /********************************************/ /* */ /* Completion signal handling and cleanup */ /* */ /********************************************/ /* State to clean up and free if completion is interrupted by a signal. */ typedef struct { char **matches; char *saved_line; } complete_sigcleanarg_t; static void _rl_complete_sigcleanup (int sig, void *ptr) { complete_sigcleanarg_t *arg; if (sig == SIGINT) /* XXX - for now */ { arg = ptr; _rl_free_match_list (arg->matches); FREE (arg->saved_line); _rl_complete_display_matches_interrupt = 1; } } /************************************/ /* */ /* Completion utility functions */ /* */ /************************************/ static inline size_t vector_len (char **vector) { size_t ret; if (vector == 0 || vector[0] == 0) return (size_t)0; for (ret = 0; vector[ret]; ret++) ; return ret; } /* Reset public readline state on a signal or other event. */ void _rl_reset_completion_state (void) { rl_completion_found_quote = 0; rl_completion_quote_character = 0; } /* Set default values for readline word completion. These are the variables that application completion functions can change or inspect. */ static void set_completion_defaults (int what_to_do) { /* Only the completion entry function can change these. */ rl_filename_completion_desired = 0; rl_filename_quoting_desired = 1; rl_full_quoting_desired = 0; rl_completion_type = what_to_do; rl_completion_suppress_append = rl_completion_suppress_quote = 0; rl_completion_append_character = ' '; /* The completion entry function may optionally change this. */ rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs; /* Reset private state. */ _rl_complete_display_matches_interrupt = 0; } /* The user must press "y" or "n". Non-zero return means "y" pressed. */ static int get_y_or_n (int for_pager) { int c; /* For now, disable pager in callback mode, until we later convert to state driven functions. Have to wait until next major version to add new state definition, since it will change value of RL_STATE_DONE. */ #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) return 1; #endif for (;;) { RL_SETSTATE(RL_STATE_MOREINPUT); c = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (c == 'y' || c == 'Y' || c == ' ') return (1); if (c == 'n' || c == 'N' || c == RUBOUT) return (0); if (c == ABORT_CHAR || c < 0) _rl_abort_internal (); if (for_pager && (c == NEWLINE || c == RETURN)) return (2); if (for_pager && (c == 'q' || c == 'Q')) return (0); rl_ding (); } } static int _rl_internal_pager (int lines) { int i; fprintf (rl_outstream, "--More--"); fflush (rl_outstream); i = get_y_or_n (1); _rl_erase_entire_line (); if (i == 0) return -1; else if (i == 2) return (lines - 1); else return 0; } static int path_isdir (const char *filename) { struct stat finfo; return (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode)); } #if defined (VISIBLE_STATS) /* Return the character which best describes FILENAME. `@' for symbolic links `/' for directories `*' for executables `=' for sockets `|' for FIFOs `%' for character special devices `#' for block special devices */ static int stat_char (char *filename) { struct stat finfo; int character, r; char *f; const char *fn; /* Short-circuit a //server on cygwin, since that will always behave as a directory. */ #if __CYGWIN__ if (filename[0] == '/' && filename[1] == '/' && strchr (filename+2, '/') == 0) return '/'; #endif f = 0; if (rl_filename_stat_hook) { f = savestring (filename); (*rl_filename_stat_hook) (&f); fn = f; } else fn = filename; #if defined (HAVE_LSTAT) && defined (S_ISLNK) r = lstat (fn, &finfo); #else r = stat (fn, &finfo); #endif if (r == -1) { xfree (f); return (0); } character = 0; if (S_ISDIR (finfo.st_mode)) character = '/'; #if defined (S_ISCHR) else if (S_ISCHR (finfo.st_mode)) character = '%'; #endif /* S_ISCHR */ #if defined (S_ISBLK) else if (S_ISBLK (finfo.st_mode)) character = '#'; #endif /* S_ISBLK */ #if defined (S_ISLNK) else if (S_ISLNK (finfo.st_mode)) character = '@'; #endif /* S_ISLNK */ #if defined (S_ISSOCK) else if (S_ISSOCK (finfo.st_mode)) character = '='; #endif /* S_ISSOCK */ #if defined (S_ISFIFO) else if (S_ISFIFO (finfo.st_mode)) character = '|'; #endif else if (S_ISREG (finfo.st_mode)) { #if defined (_WIN32) && !defined (__CYGWIN__) char *ext; /* Windows doesn't do access and X_OK; check file extension instead */ ext = strrchr (fn, '.'); if (ext && (_rl_stricmp (ext, ".exe") == 0 || _rl_stricmp (ext, ".cmd") == 0 || _rl_stricmp (ext, ".bat") == 0 || _rl_stricmp (ext, ".com") == 0)) character = '*'; #else if (access (filename, X_OK) == 0) character = '*'; #endif } xfree (f); return (character); } #endif /* VISIBLE_STATS */ #if defined (COLOR_SUPPORT) static int colored_stat_start (const char *filename) { _rl_set_normal_color (); return (_rl_print_color_indicator (filename)); } static void colored_stat_end (void) { _rl_prep_non_filename_text (); _rl_put_indicator (&_rl_color_indicator[C_CLR_TO_EOL]); } static int colored_prefix_start (void) { _rl_set_normal_color (); return (_rl_print_prefix_color ()); } static void colored_prefix_end (void) { colored_stat_end (); /* for now */ } #endif /* Return the portion of PATHNAME that should be output when listing possible completions. If we are hacking filename completion, we are only interested in the basename, the portion following the final slash. Otherwise, we return what we were passed. Since printing empty strings is not very informative, if we're doing filename completion, and the basename is the empty string, we look for the previous slash and return the portion following that. If there's no previous slash, we just return what we were passed. */ static char * printable_part (char *pathname) { char *temp, *x; if (rl_filename_completion_desired == 0) /* don't need to do anything */ return (pathname); temp = strrchr (pathname, '/'); #if defined (__MSDOS__) || defined (_WIN32) if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':') temp = pathname + 1; #endif if (temp == 0 || *temp == '\0') return (pathname); else if (temp[1] == 0 && temp == pathname) return (pathname); /* If the basename is NULL, we might have a pathname like '/usr/src/'. Look for a previous slash and, if one is found, return the portion following that slash. If there's no previous slash, just return the pathname we were passed. */ else if (temp[1] == '\0') { for (x = temp - 1; x > pathname; x--) if (*x == '/') break; return ((*x == '/') ? x + 1 : pathname); } else return ++temp; } /* Compute width of STRING when displayed on screen by print_filename */ static int fnwidth (const char *string) { int width, pos; #if defined (HANDLE_MULTIBYTE) mbstate_t ps; int left, w; size_t clen; WCHAR_T wc; left = strlen (string) + 1; memset (&ps, 0, sizeof (mbstate_t)); #endif width = pos = 0; while (string[pos]) { if (CTRL_CHAR (string[pos]) || string[pos] == RUBOUT) { width += 2; pos++; } else { #if defined (HANDLE_MULTIBYTE) clen = MBRTOWC (&wc, string + pos, left - pos, &ps); if (MB_INVALIDCH (clen)) { width++; pos++; memset (&ps, 0, sizeof (mbstate_t)); } else if (MB_NULLWCH (clen)) break; else { pos += clen; w = WCWIDTH (wc); width += (w >= 0) ? w : 1; } #else width++; pos++; #endif } } return width; } #define ELLIPSIS_LEN 3 static int fnprint (const char *to_print, int prefix_bytes, const char *real_pathname) { int printed_len, w; const char *s; int common_prefix_len, print_len; #if defined (HANDLE_MULTIBYTE) mbstate_t ps; const char *end; size_t tlen; int width; WCHAR_T wc; print_len = strlen (to_print); end = to_print + print_len + 1; memset (&ps, 0, sizeof (mbstate_t)); #else print_len = strlen (to_print); #endif printed_len = common_prefix_len = 0; /* Don't print only the ellipsis if the common prefix is one of the possible completions. Only cut off prefix_bytes if we're going to be printing the ellipsis, which takes precedence over coloring the completion prefix (see print_filename() below). */ if (_rl_completion_prefix_display_length > 0 && prefix_bytes >= print_len && prefix_bytes > _rl_completion_prefix_display_length) prefix_bytes = 0; #if defined (COLOR_SUPPORT) if (_rl_colored_stats && (prefix_bytes == 0 || _rl_colored_completion_prefix <= 0)) colored_stat_start (real_pathname); #endif if (prefix_bytes && _rl_completion_prefix_display_length > 0 && prefix_bytes > _rl_completion_prefix_display_length) { char ellipsis; ellipsis = (to_print[prefix_bytes] == '.') ? '_' : '.'; for (w = 0; w < ELLIPSIS_LEN; w++) putc (ellipsis, rl_outstream); printed_len = ELLIPSIS_LEN; } #if defined (COLOR_SUPPORT) else if (prefix_bytes && _rl_completion_prefix_display_length <= 0 && _rl_colored_completion_prefix > 0) { common_prefix_len = prefix_bytes; prefix_bytes = 0; /* XXX - print color indicator start here */ colored_prefix_start (); } else common_prefix_len = prefix_bytes = 0; /* no ellipsis or color */ #endif s = to_print + prefix_bytes; while (*s) { if (CTRL_CHAR (*s)) { putc ('^', rl_outstream); putc (UNCTRL (*s), rl_outstream); printed_len += 2; s++; #if defined (HANDLE_MULTIBYTE) memset (&ps, 0, sizeof (mbstate_t)); #endif } else if (*s == RUBOUT) { putc ('^', rl_outstream); putc ('?', rl_outstream); printed_len += 2; s++; #if defined (HANDLE_MULTIBYTE) memset (&ps, 0, sizeof (mbstate_t)); #endif } else { #if defined (HANDLE_MULTIBYTE) tlen = MBRTOWC (&wc, s, end - s, &ps); if (MB_INVALIDCH (tlen)) { tlen = 1; width = 1; memset (&ps, 0, sizeof (mbstate_t)); } else if (MB_NULLWCH (tlen)) break; else { w = WCWIDTH (wc); width = (w >= 0) ? w : 1; } fwrite (s, 1, tlen, rl_outstream); s += tlen; printed_len += width; #else putc (*s, rl_outstream); s++; printed_len++; #endif } if (common_prefix_len > 0 && (s - to_print) >= common_prefix_len) { #if defined (COLOR_SUPPORT) /* printed bytes = s - to_print */ /* printed bytes should never be > but check for paranoia's sake */ colored_prefix_end (); if (_rl_colored_stats) colored_stat_start (real_pathname); /* XXX - experiment */ #endif common_prefix_len = 0; } } #if defined (COLOR_SUPPORT) /* XXX - unconditional for now */ if (_rl_colored_stats) colored_stat_end (); #endif return printed_len; } /* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we are using it, check for and output a single character for `special' filenames. Return the number of characters we output. */ static int print_filename (char *to_print, char *full_pathname, int prefix_bytes) { int printed_len, extension_char, slen, tlen; char *s, c, *new_full_pathname, *dn; extension_char = 0; #if defined (COLOR_SUPPORT) /* Defer printing if we want to prefix with a color indicator */ if (_rl_colored_stats == 0 || rl_filename_completion_desired == 0) #endif printed_len = fnprint (to_print, prefix_bytes, to_print); if (rl_filename_completion_desired && ( #if defined (VISIBLE_STATS) rl_visible_stats || #endif #if defined (COLOR_SUPPORT) _rl_colored_stats || #endif _rl_complete_mark_directories)) { /* If to_print != full_pathname, to_print is the basename of the path passed. In this case, we try to expand the directory name before checking for the stat character. */ if (to_print != full_pathname) { /* Terminate the directory name. */ c = to_print[-1]; to_print[-1] = '\0'; /* If setting the last slash in full_pathname to a NUL results in full_pathname being the empty string, we are trying to complete files in the root directory. If we pass a null string to the bash directory completion hook, for example, it will expand it to the current directory. We just want the `/'. */ if (full_pathname == 0 || *full_pathname == 0) dn = "/"; else if (full_pathname[0] != '/') dn = full_pathname; else if (full_pathname[1] == 0) dn = "//"; /* restore trailing slash to `//' */ else if (full_pathname[1] == '/' && full_pathname[2] == 0) dn = "/"; /* don't turn /// into // */ else dn = full_pathname; s = tilde_expand (dn); if (rl_directory_completion_hook) (*rl_directory_completion_hook) (&s); slen = strlen (s); tlen = strlen (to_print); new_full_pathname = (char *)xmalloc (slen + tlen + 2); strcpy (new_full_pathname, s); if (s[slen - 1] == '/') slen--; else new_full_pathname[slen] = '/'; strcpy (new_full_pathname + slen + 1, to_print); #if defined (VISIBLE_STATS) if (rl_visible_stats) extension_char = stat_char (new_full_pathname); else #endif if (_rl_complete_mark_directories) { dn = 0; if (rl_directory_completion_hook == 0 && rl_filename_stat_hook) { dn = savestring (new_full_pathname); (*rl_filename_stat_hook) (&dn); xfree (new_full_pathname); new_full_pathname = dn; } if (path_isdir (new_full_pathname)) extension_char = '/'; } /* Move colored-stats code inside fnprint() */ #if defined (COLOR_SUPPORT) if (_rl_colored_stats) printed_len = fnprint (to_print, prefix_bytes, new_full_pathname); #endif xfree (new_full_pathname); to_print[-1] = c; } else { s = tilde_expand (full_pathname); #if defined (VISIBLE_STATS) if (rl_visible_stats) extension_char = stat_char (s); else #endif if (_rl_complete_mark_directories && path_isdir (s)) extension_char = '/'; /* Move colored-stats code inside fnprint() */ #if defined (COLOR_SUPPORT) if (_rl_colored_stats) printed_len = fnprint (to_print, prefix_bytes, s); #endif } xfree (s); if (extension_char) { putc (extension_char, rl_outstream); printed_len++; } } return printed_len; } static char * rl_quote_filename (char *s, int rtype, char *qcp) { char *r; r = (char *)xmalloc (strlen (s) + 2); *r = *rl_completer_quote_characters; strcpy (r + 1, s); if (qcp) *qcp = *rl_completer_quote_characters; return r; } /* Find the bounds of the current word for completion purposes, and leave rl_point set to the end of the word. This function skips quoted substrings (characters between matched pairs of characters in rl_completer_quote_characters). First we try to find an unclosed quoted substring on which to do matching. If one is not found, we use the word break characters to find the boundaries of the current word. We call an application-specific function to decide whether or not a particular word break character is quoted; if that function returns a non-zero result, the character does not break a word. This function returns the opening quote character if we found an unclosed quoted substring, '\0' otherwise. FP, if non-null, is set to a value saying which (shell-like) quote characters we found (single quote, double quote, or backslash) anywhere in the string. DP, if non-null, is set to the value of the delimiter character that caused a word break. */ char _rl_find_completion_word (int *fp, int *dp) { int scan, end, found_quote, delimiter, pass_next, isbrk; char quote_char; const char *brkchars; end = rl_point; found_quote = delimiter = 0; quote_char = '\0'; brkchars = 0; if (rl_completion_word_break_hook) brkchars = (*rl_completion_word_break_hook) (); if (brkchars == 0) brkchars = rl_completer_word_break_characters; if (rl_completer_quote_characters) { /* We have a list of characters which can be used in pairs to quote substrings for the completer. Try to find the start of an unclosed quoted substring. */ /* FOUND_QUOTE is set so we know what kind of quotes we found. */ for (scan = pass_next = 0; scan < end; scan = MB_NEXTCHAR (rl_line_buffer, scan, 1, MB_FIND_ANY)) { if (pass_next) { pass_next = 0; continue; } /* Shell-like semantics for single quotes -- don't allow backslash to quote anything in single quotes, especially not the closing quote. If you don't like this, take out the check on the value of quote_char. */ if (quote_char != '\'' && rl_line_buffer[scan] == '\\') { pass_next = 1; found_quote |= RL_QF_BACKSLASH; continue; } if (quote_char != '\0') { /* Ignore everything until the matching close quote char. */ if (rl_line_buffer[scan] == quote_char) { /* Found matching close. Abandon this substring. */ quote_char = '\0'; rl_point = end; } } else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan])) { /* Found start of a quoted substring. */ quote_char = rl_line_buffer[scan]; rl_point = scan + 1; /* Shell-like quoting conventions. */ if (quote_char == '\'') found_quote |= RL_QF_SINGLE_QUOTE; else if (quote_char == '"') found_quote |= RL_QF_DOUBLE_QUOTE; else found_quote |= RL_QF_OTHER_QUOTE; } } } if (rl_point == end && quote_char == '\0') { /* We didn't find an unclosed quoted substring upon which to do completion, so use the word break characters to find the substring on which to complete. */ while (rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_ANY)) { scan = rl_line_buffer[rl_point]; if (strchr (brkchars, scan) == 0) continue; /* Call the application-specific function to tell us whether this word break character is quoted and should be skipped. */ if (rl_char_is_quoted_p && found_quote && (*rl_char_is_quoted_p) (rl_line_buffer, rl_point)) continue; /* Convoluted code, but it avoids an n^2 algorithm with calls to char_is_quoted. */ break; } } /* If we are at an unquoted word break, then advance past it. */ scan = rl_line_buffer[rl_point]; /* If there is an application-specific function to say whether or not a character is quoted and we found a quote character, let that function decide whether or not a character is a word break, even if it is found in rl_completer_word_break_characters. Don't bother if we're at the end of the line, though. */ if (scan) { if (rl_char_is_quoted_p) isbrk = (found_quote == 0 || (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) && strchr (brkchars, scan) != 0; else isbrk = strchr (brkchars, scan) != 0; if (isbrk) { /* If the character that caused the word break was a quoting character, then remember it as the delimiter. */ if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, scan) && (end - rl_point) > 1) delimiter = scan; /* If the character isn't needed to determine something special about what kind of completion to perform, then advance past it. */ if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0) rl_point++; } } if (fp) *fp = found_quote; if (dp) *dp = delimiter; return (quote_char); } static char ** gen_completion_matches (char *text, int start, int end, rl_compentry_func_t *our_func, int found_quote, int quote_char) { char **matches; rl_completion_found_quote = found_quote; rl_completion_quote_character = quote_char; /* If the user wants to TRY to complete, but then wants to give up and use the default completion function, they set the variable rl_attempted_completion_function. */ if (rl_attempted_completion_function) { matches = (*rl_attempted_completion_function) (text, start, end); if (RL_SIG_RECEIVED()) { _rl_free_match_list (matches); matches = 0; RL_CHECK_SIGNALS (); } if (matches || rl_attempted_completion_over) { rl_attempted_completion_over = 0; return (matches); } } /* XXX -- filename dequoting moved into rl_filename_completion_function */ /* rl_completion_matches will check for signals as well to avoid a long delay while reading a directory. */ matches = rl_completion_matches (text, our_func); if (RL_SIG_RECEIVED()) { _rl_free_match_list (matches); matches = 0; RL_CHECK_SIGNALS (); } return matches; } /* Filter out duplicates in MATCHES. This frees up the strings in MATCHES. */ static char ** remove_duplicate_matches (char **matches) { char *lowest_common; int i, j, newlen; char dead_slot; char **temp_array; /* Sort the items. */ i = vector_len (matches); /* Sort the array without matches[0], since we need it to stay in place no matter what. */ if (i && rl_sort_completion_matches) qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); /* Remember the lowest common denominator for it may be unique. */ lowest_common = savestring (matches[0]); for (i = newlen = 0; matches[i + 1]; i++) { if (strcmp (matches[i], matches[i + 1]) == 0) { xfree (matches[i]); matches[i] = (char *)&dead_slot; } else newlen++; } /* We have marked all the dead slots with (char *)&dead_slot. Copy all the non-dead entries into a new array. */ temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *)); for (i = j = 1; matches[i]; i++) { if (matches[i] != (char *)&dead_slot) temp_array[j++] = matches[i]; } temp_array[j] = (char *)NULL; if (matches[0] != (char *)&dead_slot) xfree (matches[0]); /* Place the lowest common denominator back in [0]. */ temp_array[0] = lowest_common; /* If there is one string left, and it is identical to the lowest common denominator, then the LCD is the string to insert. */ if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0) { xfree (temp_array[1]); temp_array[1] = (char *)NULL; } return (temp_array); } /* Find the common prefix of the list of matches, and put it into matches[0]. */ static int compute_lcd_of_matches (char **match_list, int matches, const char *text) { register int i, c1, c2, si; int low; /* Count of max-matched characters. */ int lx; char *dtext; /* dequoted TEXT, if needed */ size_t si1, si2; size_t len1, len2; #if defined (HANDLE_MULTIBYTE) size_t v1, v2; mbstate_t ps1, ps2; WCHAR_T wc1, wc2; #endif /* If only one match, just use that. Otherwise, compare each member of the list with the next, finding out where they stop matching. */ if (matches == 1) { match_list[0] = match_list[1]; match_list[1] = (char *)NULL; return 1; } for (i = 1, low = 100000; i < matches; i++) { #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { memset (&ps1, 0, sizeof (mbstate_t)); memset (&ps2, 0, sizeof (mbstate_t)); } #endif len1 = strlen (match_list[i]); len2 = strlen (match_list[i + 1]); for (si1 = si2 = 0; (c1 = match_list[i][si1]) && (c2 = match_list[i + 1][si2]); si1++,si2++) { if (_rl_completion_case_fold) { c1 = _rl_to_lower (c1); c2 = _rl_to_lower (c2); } #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { v1 = MBRTOWC (&wc1, match_list[i]+si1, len1 - si1, &ps1); v2 = MBRTOWC (&wc2, match_list[i+1]+si2, len2 - si2, &ps2); if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2)) { if (c1 != c2) /* do byte comparison */ break; continue; } if (_rl_completion_case_fold) { wc1 = towlower (wc1); wc2 = towlower (wc2); } if (wc1 != wc2) break; if (v1 > 1) si1 += v1 - 1; if (v2 > 1) si2 += v2 - 1; } else #endif if (c1 != c2) break; } si = MIN (si1, si2); /* use shorter of matches of different length */ if (low > si) low = si; } /* If there were multiple matches, but none matched up to even the first character, and the user typed something, use that as the value of matches[0]. */ if (low == 0 && text && *text) { match_list[0] = (char *)xmalloc (strlen (text) + 1); strcpy (match_list[0], text); } else { match_list[0] = (char *)xmalloc (low + 1); /* XXX - this might need changes in the presence of multibyte chars */ /* If we are ignoring case, try to preserve the case of the string the user typed in the face of multiple matches differing in case. */ if (_rl_completion_case_fold) { /* We're making an assumption here: IF we're completing filenames AND the application has defined a filename dequoting function AND we found a quote character AND the application has requested filename quoting THEN we assume that TEXT was dequoted before checking against the file system and needs to be dequoted here before we check against the list of matches FI */ dtext = (char *)NULL; if (QUOTING_DESIRED() && rl_completion_found_quote && rl_filename_dequoting_function) { dtext = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); text = dtext; } /* sort the list to get consistent answers. */ if (rl_sort_completion_matches) qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare); si = strlen (text); lx = (si <= low) ? si : low; /* check shorter of text and matches */ /* Try to preserve the case of what the user typed in the presence of multiple matches: check each match for something that matches what the user typed taking case into account; use it up to common length of matches if one is found. If not, just use first match. */ for (i = 1; i <= matches; i++) if (strncmp (match_list[i], text, lx) == 0) { strncpy (match_list[0], match_list[i], low); break; } /* no casematch, use first entry */ if (i > matches) strncpy (match_list[0], match_list[1], low); FREE (dtext); } else strncpy (match_list[0], match_list[1], low); match_list[0][low] = '\0'; } return matches; } static int postprocess_matches (char ***matchesp, int matching_filenames) { char *t, **matches, **temp_matches; int nmatch, i; matches = *matchesp; if (matches == 0) return 0; /* It seems to me that in all the cases we handle we would like to ignore duplicate possibilities. Scan for the text to insert being identical to the other completions. */ if (rl_ignore_completion_duplicates) { temp_matches = remove_duplicate_matches (matches); xfree (matches); matches = temp_matches; } /* If we are matching filenames, then here is our chance to do clever processing by re-examining the list. Call the ignore function with the array as a parameter. It can munge the array, deleting matches as it desires. */ if (rl_ignore_some_completions_function && matching_filenames) { for (nmatch = 1; matches[nmatch]; nmatch++) ; (void)(*rl_ignore_some_completions_function) (matches); if (matches == 0 || matches[0] == 0) { FREE (matches); *matchesp = (char **)0; return 0; } else { /* If we removed some matches, recompute the common prefix. */ for (i = 1; matches[i]; i++) ; if (i > 1 && i < nmatch) { t = matches[0]; compute_lcd_of_matches (matches, i - 1, t); FREE (t); } } } *matchesp = matches; return (1); } static int complete_get_screenwidth (void) { int cols; char *envcols; cols = _rl_completion_columns; if (cols >= 0 && cols <= _rl_screenwidth) return cols; envcols = getenv ("COLUMNS"); if (envcols && *envcols) cols = atoi (envcols); if (cols >= 0 && cols <= _rl_screenwidth) return cols; return _rl_screenwidth; } /* A convenience function for displaying a list of strings in columnar format on readline's output stream. MATCHES is the list of strings, in argv format, LEN is the number of strings in MATCHES, and MAX is the length of the longest string in MATCHES. */ void rl_display_match_list (char **matches, int len, int max) { int count, limit, printed_len, lines, cols; int i, j, k, l, common_length, sind; char *temp, *t; /* Find the length of the prefix common to all items: length as displayed characters (common_length) and as a byte index into the matches (sind) */ common_length = sind = 0; if (_rl_completion_prefix_display_length > 0) { t = printable_part (matches[0]); /* check again in case of /usr/src/ */ temp = rl_filename_completion_desired ? strrchr (t, '/') : 0; common_length = temp ? fnwidth (temp) : fnwidth (t); sind = temp ? RL_STRLEN (temp) : RL_STRLEN (t); if (common_length > max || sind > max) common_length = sind = 0; if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN) max -= common_length - ELLIPSIS_LEN; else if (_rl_colored_completion_prefix <= 0) common_length = sind = 0; } #if defined (COLOR_SUPPORT) else if (_rl_colored_completion_prefix > 0) { t = printable_part (matches[0]); temp = rl_filename_completion_desired ? strrchr (t, '/') : 0; common_length = temp ? fnwidth (temp) : fnwidth (t); sind = temp ? RL_STRLEN (temp+1) : RL_STRLEN (t); /* want portion after final slash */ if (common_length > max || sind > max) common_length = sind = 0; } #endif /* How many items of MAX length can we fit in the screen window? */ cols = complete_get_screenwidth (); max += 2; limit = cols / max; if (limit != 1 && (limit * max == cols)) limit--; /* If cols == 0, limit will end up -1 */ if (cols < _rl_screenwidth && limit < 0) limit = 1; /* Avoid a possible floating exception. If max > cols, limit will be 0 and a divide-by-zero fault will result. */ if (limit == 0) limit = 1; /* How many iterations of the printing loop? */ count = (len + (limit - 1)) / limit; /* Watch out for special case. If LEN is less than LIMIT, then just do the inner printing loop. 0 < len <= limit implies count = 1. */ /* Sort the items if they are not already sorted. */ if (rl_ignore_completion_duplicates == 0 && rl_sort_completion_matches) qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); rl_crlf (); lines = 0; if (_rl_print_completions_horizontally == 0) { /* Print the sorted items, up-and-down alphabetically, like ls. */ for (i = 1; i <= count; i++) { for (j = 0, l = i; j < limit; j++) { if (l > len || matches[l] == 0) break; else { temp = printable_part (matches[l]); printed_len = print_filename (temp, matches[l], sind); if (j + 1 < limit) { if (max <= printed_len) putc (' ', rl_outstream); else for (k = 0; k < max - printed_len; k++) putc (' ', rl_outstream); } } l += count; } rl_crlf (); #if defined (SIGWINCH) if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0) #else if (RL_SIG_RECEIVED ()) #endif return; lines++; if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count) { lines = _rl_internal_pager (lines); if (lines < 0 || _rl_complete_display_matches_interrupt) return; } } } else { /* Print the sorted items, across alphabetically, like ls -x. */ for (i = 1; matches[i]; i++) { temp = printable_part (matches[i]); printed_len = print_filename (temp, matches[i], sind); /* Have we reached the end of this line? */ #if defined (SIGWINCH) if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0) #else if (RL_SIG_RECEIVED ()) #endif return; if (matches[i+1]) { if (limit == 1 || (i && (limit > 1) && (i % limit) == 0)) { rl_crlf (); lines++; if (_rl_page_completions && lines >= _rl_screenheight - 1) { lines = _rl_internal_pager (lines); if (lines < 0 || _rl_complete_display_matches_interrupt) return; } } else if (max <= printed_len) putc (' ', rl_outstream); else for (k = 0; k < max - printed_len; k++) putc (' ', rl_outstream); } } rl_crlf (); } } /* Display MATCHES, a list of matching filenames in argv format. This handles the simple case -- a single match -- first. If there is more than one match, we compute the number of strings in the list and the length of the longest string, which will be needed by the display function. If the application wants to handle displaying the list of matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the address of a function, and we just call it. If we're handling the display ourselves, we just call rl_display_match_list. We also check that the list of matches doesn't exceed the user-settable threshold, and ask the user if he wants to see the list if there are more matches than RL_COMPLETION_QUERY_ITEMS. */ static void display_matches (char **matches) { int len, max, i; char *temp; /* Move to the last visible line of a possibly-multiple-line command. */ _rl_move_vert (_rl_vis_botlin); /* Handle simple case first. What if there is only one answer? */ if (matches[1] == 0) { temp = printable_part (matches[0]); rl_crlf (); print_filename (temp, matches[0], 0); rl_crlf (); rl_forced_update_display (); rl_display_fixed = 1; return; } /* There is more than one answer. Find out how many there are, and find the maximum printed length of a single entry. */ for (max = 0, i = 1; matches[i]; i++) { temp = printable_part (matches[i]); len = fnwidth (temp); if (len > max) max = len; } len = i - 1; /* If the caller has defined a display hook, then call that now. */ if (rl_completion_display_matches_hook) { (*rl_completion_display_matches_hook) (matches, len, max); return; } /* If there are many items, then ask the user if she really wants to see them all. */ if (rl_completion_query_items > 0 && len >= rl_completion_query_items) { rl_crlf (); fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len); fflush (rl_outstream); if ((completion_y_or_n = get_y_or_n (0)) == 0) { rl_crlf (); rl_forced_update_display (); rl_display_fixed = 1; return; } } /* We rely on the caller to set MATCHES to 0 when this returns. */ if (_rl_complete_display_matches_interrupt == 0) rl_display_match_list (matches, len, max); rl_forced_update_display (); rl_display_fixed = 1; } /* qc == pointer to quoting character, if any */ static char * make_quoted_replacement (char *match, int mtype, char *qc) { int should_quote, do_replace; char *replacement; /* If we are doing completion on quoted substrings, and any matches contain any of the completer_word_break_characters, then auto- matically prepend the substring with a quote character (just pick the first one from the list of such) if it does not already begin with a quote string. FIXME: Need to remove any such automatically inserted quote character when it no longer is necessary, such as if we change the string we are completing on and the new set of matches don't require a quoted substring. */ replacement = match; should_quote = match && rl_completer_quote_characters && QUOTING_DESIRED(); if (should_quote) should_quote = should_quote && (!qc || !*qc || (rl_completer_quote_characters && strchr (rl_completer_quote_characters, *qc))); if (should_quote) { /* If there is a single match, see if we need to quote it. This also checks whether the common prefix of several matches needs to be quoted. */ should_quote = rl_filename_quote_characters ? (_rl_strpbrk (match, rl_filename_quote_characters) != 0) : 0; /* If we saw a quote in the original word, but readline thinks the match doesn't need to be quoted, and the application has a filename quoting function, give the application a chance to quote it if needed so we don't second-guess the user. */ should_quote |= *qc == 0 && rl_completion_found_quote && mtype != NO_MATCH && rl_filename_quoting_function; do_replace = should_quote ? mtype : NO_MATCH; /* Quote the replacement, since we found an embedded word break character in a potential match. */ if (do_replace != NO_MATCH && rl_filename_quoting_function) replacement = (*rl_filename_quoting_function) (match, do_replace, qc); } return (replacement); } static void insert_match (char *match, int start, int mtype, char *qc) { char *replacement, *r; char oqc; int end, rlen; oqc = qc ? *qc : '\0'; replacement = make_quoted_replacement (match, mtype, qc); /* Now insert the match. */ if (replacement) { rlen = strlen (replacement); /* Don't double an opening quote character. */ if (qc && *qc && start && rl_line_buffer[start - 1] == *qc && replacement[0] == *qc) start--; /* If make_quoted_replacement changed the quoting character, remove the opening quote and insert the (fully-quoted) replacement. */ else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc && replacement[0] != oqc) start--; end = rl_point - 1; /* Don't double a closing quote character */ if (qc && *qc && end && rl_line_buffer[rl_point] == *qc && replacement[rlen - 1] == *qc) end++; if (_rl_skip_completed_text) { r = replacement; while (start < rl_end && *r && rl_line_buffer[start] == *r) { start++; r++; } if (start <= end || *r) _rl_replace_text (r, start, end); rl_point = start + strlen (r); } else _rl_replace_text (replacement, start, end); if (replacement != match) xfree (replacement); } } /* Append any necessary closing quote and a separator character to the just-inserted match. If the user has specified that directories should be marked by a trailing `/', append one of those instead. The default trailing character is a space. Returns the number of characters appended. If NONTRIVIAL_MATCH is set, we test for a symlink (if the OS has them) and don't add a suffix for a symlink to a directory. A nontrivial match is one that actually adds to the word being completed. The variable rl_completion_mark_symlink_dirs controls this behavior (it's initially set to the what the user has chosen, indicated by the value of _rl_complete_mark_symlink_dirs, but may be modified by an application's completion function). */ static int append_to_match (char *text, int delimiter, int quote_char, int nontrivial_match) { char temp_string[4], *filename, *fn; int temp_string_index, s; struct stat finfo; temp_string_index = 0; if (quote_char && rl_point && rl_completion_suppress_quote == 0 && rl_line_buffer[rl_point - 1] != quote_char) temp_string[temp_string_index++] = quote_char; if (delimiter) temp_string[temp_string_index++] = delimiter; else if (rl_completion_suppress_append == 0 && rl_completion_append_character) temp_string[temp_string_index++] = rl_completion_append_character; temp_string[temp_string_index++] = '\0'; if (rl_filename_completion_desired) { filename = tilde_expand (text); if (rl_filename_stat_hook) { fn = savestring (filename); (*rl_filename_stat_hook) (&fn); xfree (filename); filename = fn; } s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0) ? LSTAT (filename, &finfo) : stat (filename, &finfo); if (s == 0 && S_ISDIR (finfo.st_mode)) { if (_rl_complete_mark_directories /* && rl_completion_suppress_append == 0 */) { /* This is clumsy. Avoid putting in a double slash if point is at the end of the line and the previous character is a slash. */ if (rl_point && rl_line_buffer[rl_point] == '\0' && rl_line_buffer[rl_point - 1] == '/') ; else if (rl_line_buffer[rl_point] != '/') rl_insert_text ("/"); } } #ifdef S_ISLNK /* Don't add anything if the filename is a symlink and resolves to a directory. */ else if (s == 0 && S_ISLNK (finfo.st_mode) && path_isdir (filename)) ; #endif else { if (rl_point == rl_end && temp_string_index) rl_insert_text (temp_string); } xfree (filename); } else { if (rl_point == rl_end && temp_string_index) rl_insert_text (temp_string); } return (temp_string_index); } static void insert_all_matches (char **matches, int point, char *qc) { int i; char *rp; rl_begin_undo_group (); /* remove any opening quote character; make_quoted_replacement will add it back. */ if (qc && *qc && point && rl_line_buffer[point - 1] == *qc) point--; rl_delete_text (point, rl_point); rl_point = point; if (matches[1]) { for (i = 1; matches[i]; i++) { rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc); rl_insert_text (rp); rl_insert_text (" "); if (rp != matches[i]) xfree (rp); } } else { rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc); rl_insert_text (rp); rl_insert_text (" "); if (rp != matches[0]) xfree (rp); } rl_end_undo_group (); } void _rl_free_match_list (char **matches) { register int i; if (matches == 0) return; for (i = 0; matches[i]; i++) xfree (matches[i]); xfree (matches); } /* Compare a possibly-quoted filename TEXT from the line buffer and a possible MATCH that is the product of filename completion, which acts on the dequoted text. */ static int compare_match (char *text, const char *match) { char *temp; int r; if (QUOTING_DESIRED() && rl_completion_found_quote && rl_filename_dequoting_function) { temp = (*rl_filename_dequoting_function) (text, rl_completion_quote_character); r = strcmp (temp, match); xfree (temp); return r; } return (strcmp (text, match)); } /* Complete the word at or before point. WHAT_TO_DO says what to do with the completion. `?' means list the possible completions. TAB means do standard completion. `*' means insert all of the possible completions. `!' means to do standard completion, and list all possible completions if there is more than one. `@' means to do standard completion, and list all possible completions if there is more than one and partial completion is not possible. `$' implements a protocol for exporting completions and information about what is being completed to another process via rl_outstream. */ int rl_complete_internal (int what_to_do) { char **matches; rl_compentry_func_t *our_func; int start, end, delimiter, found_quote, i, nontrivial_lcd, do_display; char *text, *saved_line_buffer; char quote_char; int tlen, mlen, saved_last_completion_failed; complete_sigcleanarg_t cleanarg; /* state to clean up on signal */ RL_SETSTATE(RL_STATE_COMPLETING); saved_last_completion_failed = last_completion_failed; set_completion_defaults (what_to_do); saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL; our_func = rl_completion_entry_function ? rl_completion_entry_function : rl_filename_completion_function; /* We now look backwards for the start of a filename/variable word. */ end = rl_point; found_quote = delimiter = 0; quote_char = '\0'; if (rl_point) /* This (possibly) changes rl_point. If it returns a non-zero char, we know we have an open quote. */ quote_char = _rl_find_completion_word (&found_quote, &delimiter); start = rl_point; rl_point = end; text = rl_copy_text (start, end); matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char); /* If TEXT contains quote characters, it will be dequoted as part of generating the matches, and the matches will not contain any quote characters. We need to dequote TEXT before performing the comparison. Since compare_match performs the dequoting, and we only want to do it once, we don't call compare_matches after dequoting TEXT; we call strcmp directly. */ /* nontrivial_lcd is set if the common prefix adds something to the word being completed. */ if (QUOTING_DESIRED() && rl_completion_found_quote && rl_filename_dequoting_function) { char *t; t = (*rl_filename_dequoting_function) (text, rl_completion_quote_character); xfree (text); text = t; nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; } else nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; if (what_to_do == '!' || what_to_do == '@') tlen = strlen (text); if (what_to_do != '$') xfree (text); if (matches == 0 && what_to_do != '$') /* we can export no completions */ { rl_ding (); FREE (saved_line_buffer); completion_changed_buffer = 0; last_completion_failed = 1; RL_UNSETSTATE(RL_STATE_COMPLETING); _rl_reset_completion_state (); return (0); } /* If we are matching filenames, the attempted completion function will have set rl_filename_completion_desired to a non-zero value. The basic rl_filename_completion_function does this. */ i = rl_filename_completion_desired; if (postprocess_matches (&matches, i) == 0 && what_to_do != '$') /* we can export no completions */ { rl_ding (); FREE (saved_line_buffer); completion_changed_buffer = 0; last_completion_failed = 1; RL_UNSETSTATE(RL_STATE_COMPLETING); _rl_reset_completion_state (); return (0); } if (matches && matches[0] && *matches[0]) last_completion_failed = 0; do_display = 0; switch (what_to_do) { case TAB: case '!': case '@': /* Insert the first match with proper quoting. */ if (what_to_do == TAB) { if (*matches[0]) insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); } else if (*matches[0] && matches[1] == 0) /* should we perform the check only if there are multiple matches? */ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); else if (*matches[0]) /* what_to_do != TAB && multiple matches */ { mlen = *matches[0] ? strlen (matches[0]) : 0; if (mlen >= tlen) insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); } /* If there are more matches, ring the bell to indicate. If we are in vi mode, Posix.2 says to not ring the bell. If the `show-all-if-ambiguous' variable is set, display all the matches immediately. Otherwise, if this was the only match, and we are hacking files, check the file to see if it was a directory. If so, and the `mark-directories' variable is set, add a '/' to the name. If not, and we are at the end of the line, then add a space. */ if (matches[1]) { if (what_to_do == '!') { do_display = 1; break; } else if (what_to_do == '@') { if (nontrivial_lcd == 0) do_display = 1; break; } else if (rl_editing_mode != vi_mode) rl_ding (); /* There are other matches remaining. */ } else append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); break; case '*': insert_all_matches (matches, start, "e_char); break; case '?': /* Let's try to insert a single match here if the last completion failed but this attempt returned a single match. */ if (saved_last_completion_failed && matches[0] && *matches[0] && matches[1] == 0) { insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); break; } /*FALLTHROUGH*/ case '%': /* used by menu_complete */ case '|': /* add this for unconditional display */ do_display = 1; break; case '$': _rl_export_completions (matches, text, start, end); xfree (text); break; default: _rl_ttymsg ("bad value %d for what_to_do in rl_complete", what_to_do); rl_ding (); FREE (saved_line_buffer); RL_UNSETSTATE(RL_STATE_COMPLETING); _rl_free_match_list (matches); _rl_reset_completion_state (); return 1; } /* If we need to display the match list, set up to clean it up on receipt of a signal and do it here. If the application has registered a function to display the matches, let it do the work. */ if (do_display) { if (rl_completion_display_matches_hook == 0) { _rl_sigcleanup = _rl_complete_sigcleanup; cleanarg.matches = matches; cleanarg.saved_line = saved_line_buffer; _rl_sigcleanarg = &cleanarg; _rl_complete_display_matches_interrupt = 0; } display_matches (matches); if (_rl_complete_display_matches_interrupt) { matches = 0; /* Both already freed by _rl_complete_sigcleanup */ saved_line_buffer = 0; _rl_complete_display_matches_interrupt = 0; if (rl_signal_event_hook) (*rl_signal_event_hook) (); } _rl_sigcleanup = 0; _rl_sigcleanarg = 0; } _rl_free_match_list (matches); /* Check to see if the line has changed through all of this manipulation. */ if (saved_line_buffer) { completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0; xfree (saved_line_buffer); } RL_UNSETSTATE(RL_STATE_COMPLETING); _rl_reset_completion_state (); RL_CHECK_SIGNALS (); return 0; } /***************************************************************/ /* */ /* Application-callable completion match generator functions */ /* */ /***************************************************************/ /* Return an array of (char *) which is a list of completions for TEXT. If there are no completions, return a NULL pointer. The first entry in the returned array is the substitution for TEXT. The remaining entries are the possible completions. The array is terminated with a NULL pointer. ENTRY_FUNCTION is a function of two args, and returns a (char *). The first argument is TEXT. The second is a state argument; it should be zero on the first call, and non-zero on subsequent calls. It returns a NULL pointer to the caller when there are no more matches. */ char ** rl_completion_matches (const char *text, rl_compentry_func_t *entry_function) { register int i; /* Number of slots in match_list. */ size_t match_list_size; /* The list of matches. */ char **match_list; /* Number of matches actually found. */ int matches; /* Temporary string binder. */ char *string; matches = 0; match_list_size = 10; match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *)); match_list[1] = (char *)NULL; while (string = (*entry_function) (text, matches)) { if (RL_SIG_RECEIVED ()) { /* Start at 1 because we don't set matches[0] in this function. Only free the list members if we're building match list from rl_filename_completion_function, since we know that doesn't free the strings it returns. */ if (entry_function == rl_filename_completion_function) { for (i = 1; match_list[i]; i++) xfree (match_list[i]); } xfree (match_list); match_list = 0; match_list_size = 0; matches = 0; RL_CHECK_SIGNALS (); } if (matches + 1 >= match_list_size) match_list = (char **)xrealloc (match_list, ((match_list_size += 10) + 1) * sizeof (char *)); if (match_list == 0) return (match_list); match_list[++matches] = string; match_list[matches + 1] = (char *)NULL; } /* If there were any matches, then look through them finding out the lowest common denominator. That then becomes match_list[0]. */ if (matches) compute_lcd_of_matches (match_list, matches, text); else /* There were no matches. */ { xfree (match_list); match_list = (char **)NULL; } return (match_list); } /* A completion function for usernames. TEXT contains a partial username preceded by a random character (usually `~'). */ char * rl_username_completion_function (const char *text, int state) { #if defined (_WIN32) || defined (__OPENNT) || !defined (HAVE_GETPWENT) return (char *)NULL; #else /* !_WIN32 && !__OPENNT) && HAVE_GETPWENT */ static char *username = (char *)NULL; static struct passwd *entry; static int namelen, first_char, first_char_loc; char *value; if (state == 0) { FREE (username); first_char = *text; first_char_loc = first_char == '~'; username = savestring (&text[first_char_loc]); namelen = strlen (username); setpwent (); } while (entry = getpwent ()) { /* Null usernames should result in all users as possible completions. */ if (namelen == 0 || (STREQN (username, entry->pw_name, namelen))) break; } if (entry == 0) { endpwent (); return ((char *)NULL); } else { value = (char *)xmalloc (2 + strlen (entry->pw_name)); *value = *text; strcpy (value + first_char_loc, entry->pw_name); if (first_char == '~') rl_filename_completion_desired = 1; return (value); } #endif /* !_WIN32 && !__OPENNT && HAVE_GETPWENT */ } /* Return non-zero if CONVFN matches FILENAME up to the length of FILENAME (FILENAME_LEN). If _rl_completion_case_fold is set, compare without regard to the alphabetic case of characters. If _rl_completion_case_map is set, make `-' and `_' equivalent. CONVFN is the possibly-converted directory entry; FILENAME is what the user typed. */ static int complete_fncmp (const char *convfn, int convlen, const char *filename, int filename_len) { size_t len; if (filename_len == 0) return 1; if (convlen < filename_len) return 0; len = filename_len; /* Otherwise, if these match up to the length of filename, then it is a match. */ if (_rl_completion_case_fold) { /* Case-insensitive comparison treating _ and - as equivalent if _rl_completion_case_map is non-zero */ #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) return (_rl_mb_strcaseeqn (convfn, convlen, filename, filename_len, len, _rl_completion_case_map)); else #endif if ((_rl_to_lower (convfn[0]) == _rl_to_lower (filename[0])) && (convlen >= filename_len)) return (_rl_strcaseeqn (convfn, filename, len, _rl_completion_case_map)); } else { /* XXX - add new _rl_mb_streqn function (like mbsncmp) instead of relying on byte equivalence? */ if ((convfn[0] == filename[0]) && (convlen >= filename_len) && (strncmp (filename, convfn, filename_len) == 0)) return 1; } return 0; } /* Okay, now we write the entry_function for filename completion. In the general case. Note that completion in the shell is a little different because of all the pathnames that must be followed when looking up the completion for a command. */ char * rl_filename_completion_function (const char *text, int state) { static DIR *directory = (DIR *)NULL; static char *filename = (char *)NULL; static char *dirname = (char *)NULL; static char *users_dirname = (char *)NULL; static int filename_len; char *temp, *dentry, *convfn; size_t dirlen; int dentlen, convlen; int tilde_dirname; struct dirent *entry; /* If we don't have any state, then do some initialization. */ if (state == 0) { /* If we were interrupted before closing the directory or reading all of its contents, close it. */ if (directory) { closedir (directory); directory = (DIR *)NULL; } FREE (dirname); FREE (filename); FREE (users_dirname); filename = savestring (text); if (*text == 0) text = "."; dirname = savestring (text); temp = strrchr (dirname, '/'); #if defined (__MSDOS__) || defined (_WIN32) /* special hack for //X/... */ if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/') temp = strrchr (dirname + 3, '/'); #endif if (temp) { strcpy (filename, ++temp); *temp = '\0'; } #if defined (__MSDOS__) || (defined (_WIN32) && !defined (__CYGWIN__)) /* searches from current directory on the drive */ else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':') { strcpy (filename, dirname + 2); dirname[2] = '\0'; } #endif else { dirname[0] = '.'; dirname[1] = '\0'; } /* We aren't done yet. We also support the "~user" syntax. */ /* Save the version of the directory that the user typed, dequoting it if necessary. */ if (rl_completion_found_quote && rl_filename_dequoting_function) users_dirname = (*rl_filename_dequoting_function) (dirname, rl_completion_quote_character); else users_dirname = savestring (dirname); tilde_dirname = 0; if (*dirname == '~') { temp = tilde_expand (dirname); xfree (dirname); dirname = temp; if (*dirname != '~') tilde_dirname = 1; /* indicate successful tilde expansion */ } /* We have saved the possibly-dequoted version of the directory name the user typed. Now transform the directory name we're going to pass to opendir(2). The directory rewrite hook modifies only the directory name; the directory completion hook modifies both the directory name passed to opendir(2) and the version the user typed. Both the directory completion and rewrite hooks should perform any necessary dequoting. The hook functions return 1 if they modify the directory name argument. If either hook returns 0, it should not modify the directory name pointer passed as an argument. */ if (rl_directory_rewrite_hook) (*rl_directory_rewrite_hook) (&dirname); else if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname)) { xfree (users_dirname); users_dirname = savestring (dirname); } else if (rl_completion_found_quote && rl_filename_dequoting_function) { /* We already ran users_dirname through the dequoting function. If tilde_dirname == 1, we successfully performed tilde expansion on dirname. Now we need to reconcile those results. We either just copy the already-dequoted users_dirname or tilde expand it if we tilde-expanded dirname. */ temp = tilde_dirname ? tilde_expand (users_dirname) : savestring (users_dirname); xfree (dirname); dirname = temp; } directory = opendir (dirname); /* Now dequote a non-null filename. FILENAME will not be NULL, but may be empty. */ if (*filename && rl_completion_found_quote && rl_filename_dequoting_function) { /* delete single and double quotes */ temp = (*rl_filename_dequoting_function) (filename, rl_completion_quote_character); xfree (filename); filename = temp; } filename_len = strlen (filename); /* Normalize the filename if the application has set a rewrite hook. */ if (*filename && rl_completion_rewrite_hook) { temp = (*rl_completion_rewrite_hook) (filename, filename_len); if (temp != filename) { xfree (filename); filename = temp; filename_len = strlen (filename); } } rl_filename_completion_desired = 1; } /* At this point we should entertain the possibility of hacking wildcarded filenames, like /usr/man/man/te. If the directory name contains globbing characters, then build an array of directories, and then map over that list while completing. */ /* *** UNIMPLEMENTED *** */ /* Now that we have some state, we can read the directory. */ entry = (struct dirent *)NULL; convfn = dentry = 0; while (directory && (entry = readdir (directory))) { convfn = dentry = entry->d_name; convlen = dentlen = D_NAMLEN (entry); if (rl_filename_rewrite_hook) { convfn = (*rl_filename_rewrite_hook) (dentry, dentlen); convlen = (convfn == dentry) ? dentlen : strlen (convfn); } /* Special case for no filename. If the user has disabled the `match-hidden-files' variable, skip filenames beginning with `.'. All other entries except "." and ".." match. */ if (filename_len == 0) { if (_rl_match_hidden_files == 0 && HIDDEN_FILE (convfn)) { if (convfn != dentry) xfree (convfn); continue; } if (convfn[0] != '.' || (convfn[1] && (convfn[1] != '.' || convfn[2]))) break; } else if (complete_fncmp (convfn, convlen, filename, filename_len)) break; else if (convfn != dentry) xfree (convfn); } if (entry == 0) { if (directory) { closedir (directory); directory = (DIR *)NULL; } if (dirname) { xfree (dirname); dirname = (char *)NULL; } if (filename) { xfree (filename); filename = (char *)NULL; } if (users_dirname) { xfree (users_dirname); users_dirname = (char *)NULL; } return (char *)NULL; } else { /* dirname && (strcmp (dirname, ".") != 0) */ if (dirname && (dirname[0] != '.' || dirname[1])) { if (rl_complete_with_tilde_expansion && *users_dirname == '~') { dirlen = strlen (dirname); temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry)); strcpy (temp, dirname); /* Canonicalization cuts off any final slash present. We may need to add it back. */ if (dirname[dirlen - 1] != '/') { temp[dirlen++] = '/'; temp[dirlen] = '\0'; } } else { dirlen = strlen (users_dirname); temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry)); strcpy (temp, users_dirname); /* Make sure that temp has a trailing slash here. */ if (users_dirname[dirlen - 1] != '/') temp[dirlen++] = '/'; } strcpy (temp + dirlen, convfn); } else temp = savestring (convfn); if (convfn != dentry) xfree (convfn); return (temp); } } /* An initial implementation of a menu completion function a la tcsh. The first time (if the last readline command was not rl_old_menu_complete), we generate the list of matches. This code is very similar to the code in rl_complete_internal -- there should be a way to combine the two. Then, for each item in the list of matches, we insert the match in an undoable fashion, with the appropriate character appended (this happens on the second and subsequent consecutive calls to rl_old_menu_complete). When we hit the end of the match list, we restore the original unmatched text, ring the bell, and reset the counter to zero. */ int rl_old_menu_complete (int count, int invoking_key) { rl_compentry_func_t *our_func; int matching_filenames, found_quote; static char *orig_text; static char **matches = (char **)0; static int match_list_index = 0; static int match_list_size = 0; static int orig_start, orig_end; static char quote_char; static int delimiter; /* The first time through, we generate the list of matches and set things up to insert them. */ if (rl_last_func != rl_old_menu_complete) { /* Clean up from previous call, if any. */ FREE (orig_text); if (matches) _rl_free_match_list (matches); match_list_index = match_list_size = 0; matches = (char **)NULL; rl_completion_invoking_key = invoking_key; RL_SETSTATE(RL_STATE_COMPLETING); /* Only the completion entry function can change these. */ set_completion_defaults ('%'); our_func = rl_menu_completion_entry_function; if (our_func == 0) our_func = rl_completion_entry_function ? rl_completion_entry_function : rl_filename_completion_function; /* We now look backwards for the start of a filename/variable word. */ orig_end = rl_point; found_quote = delimiter = 0; quote_char = '\0'; if (rl_point) /* This (possibly) changes rl_point. If it returns a non-zero char, we know we have an open quote. */ quote_char = _rl_find_completion_word (&found_quote, &delimiter); orig_start = rl_point; rl_point = orig_end; orig_text = rl_copy_text (orig_start, orig_end); matches = gen_completion_matches (orig_text, orig_start, orig_end, our_func, found_quote, quote_char); /* If we are matching filenames, the attempted completion function will have set rl_filename_completion_desired to a non-zero value. The basic rl_filename_completion_function does this. */ matching_filenames = rl_filename_completion_desired; if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0) { rl_ding (); FREE (matches); matches = (char **)0; FREE (orig_text); orig_text = (char *)0; completion_changed_buffer = 0; RL_UNSETSTATE(RL_STATE_COMPLETING); return (0); } RL_UNSETSTATE(RL_STATE_COMPLETING); match_list_size = vector_len (matches); /* matches[0] is lcd if match_list_size > 1, but the circular buffer code below should take care of it. */ if (match_list_size > 1 && _rl_complete_show_all) display_matches (matches); } /* Now we have the list of matches. Replace the text between rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with matches[match_list_index], and add any necessary closing char. */ if (matches == 0 || match_list_size == 0) { rl_ding (); FREE (matches); matches = (char **)0; completion_changed_buffer = 0; return (0); } match_list_index += count; if (match_list_index < 0) { while (match_list_index < 0) match_list_index += match_list_size; } else match_list_index %= match_list_size; if (match_list_index == 0 && match_list_size > 1) { rl_ding (); insert_match (orig_text, orig_start, MULT_MATCH, "e_char); } else { insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); append_to_match (matches[match_list_index], delimiter, quote_char, compare_match (orig_text, matches[match_list_index])); } completion_changed_buffer = 1; return (0); } /* The current version of menu completion. The differences between this function and the original are: 1. It honors the maximum number of completions variable (completion-query-items) 2. It appends to the word as usual if there is only one match 3. It displays the common prefix if there is one, and makes it the first menu choice if the menu-complete-display-prefix option is enabled */ int rl_menu_complete (int count, int ignore) { rl_compentry_func_t *our_func; int matching_filenames, found_quote; static char *orig_text; static char **matches = (char **)0; static int match_list_index = 0; static int match_list_size = 0; static int nontrivial_lcd = 0; static int full_completion = 0; /* set to 1 if menu completion should reinitialize on next call */ static int orig_start, orig_end; static char quote_char; static int delimiter; /* The first time through, we generate the list of matches and set things up to insert them. */ if ((rl_last_func != rl_menu_complete && rl_last_func != rl_backward_menu_complete) || full_completion) { /* Clean up from previous call, if any. */ FREE (orig_text); if (matches) _rl_free_match_list (matches); match_list_index = match_list_size = 0; matches = (char **)NULL; full_completion = 0; RL_SETSTATE(RL_STATE_COMPLETING); /* Only the completion entry function can change these. */ set_completion_defaults ('%'); our_func = rl_menu_completion_entry_function; if (our_func == 0) our_func = rl_completion_entry_function ? rl_completion_entry_function : rl_filename_completion_function; /* We now look backwards for the start of a filename/variable word. */ orig_end = rl_point; found_quote = delimiter = 0; quote_char = '\0'; if (rl_point) /* This (possibly) changes rl_point. If it returns a non-zero char, we know we have an open quote. */ quote_char = _rl_find_completion_word (&found_quote, &delimiter); orig_start = rl_point; rl_point = orig_end; orig_text = rl_copy_text (orig_start, orig_end); matches = gen_completion_matches (orig_text, orig_start, orig_end, our_func, found_quote, quote_char); nontrivial_lcd = matches && compare_match (orig_text, matches[0]) != 0; /* If we are matching filenames, the attempted completion function will have set rl_filename_completion_desired to a non-zero value. The basic rl_filename_completion_function does this. */ matching_filenames = rl_filename_completion_desired; if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0) { rl_ding (); FREE (matches); matches = (char **)0; FREE (orig_text); orig_text = (char *)0; completion_changed_buffer = 0; RL_UNSETSTATE(RL_STATE_COMPLETING); return (0); } RL_UNSETSTATE(RL_STATE_COMPLETING); match_list_size = vector_len (matches); if (match_list_size == 0) { rl_ding (); FREE (matches); matches = (char **)0; match_list_index = 0; completion_changed_buffer = 0; return (0); } /* matches[0] is lcd if match_list_size > 1, but the circular buffer code below should take care of it. */ if (*matches[0]) { insert_match (matches[0], orig_start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); orig_end = orig_start + strlen (matches[0]); completion_changed_buffer = STREQ (orig_text, matches[0]) == 0; } if (match_list_size > 1 && _rl_complete_show_all) { display_matches (matches); /* If there are so many matches that the user has to be asked whether or not he wants to see the matches, menu completion is unwieldy. */ if (rl_completion_query_items > 0 && match_list_size >= rl_completion_query_items) { rl_ding (); _rl_free_match_list (matches); matches = (char **)0; full_completion = 1; return (0); } else if (_rl_menu_complete_prefix_first) { rl_ding (); return (0); } } else if (match_list_size <= 1) { append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); full_completion = 1; return (0); } else if (_rl_menu_complete_prefix_first && match_list_size > 1) { rl_ding (); return (0); } } /* Now we have the list of matches. Replace the text between rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with matches[match_list_index], and add any necessary closing char. */ if (matches == 0 || match_list_size == 0) { rl_ding (); FREE (matches); matches = (char **)0; completion_changed_buffer = 0; return (0); } match_list_index += count; if (match_list_index < 0) { while (match_list_index < 0) match_list_index += match_list_size; } else match_list_index %= match_list_size; if (match_list_index == 0 && match_list_size > 1) { rl_ding (); insert_match (matches[0], orig_start, MULT_MATCH, "e_char); } else { insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); append_to_match (matches[match_list_index], delimiter, quote_char, compare_match (orig_text, matches[match_list_index])); } completion_changed_buffer = 1; return (0); } int rl_backward_menu_complete (int count, int key) { /* Positive arguments to backward-menu-complete translate into negative arguments for menu-complete, and vice versa. */ return (rl_menu_complete (-count, key)); } /* This implements a protocol to export completions to another process or calling application via rl_outstream. MATCHES are the possible completions for TEXT, which is the text between START and END in rl_line_buffer. We print: N - the number of matches T - the word being completed S:E - the start and end offsets of T in rl_line_buffer then each match, one per line If there are no matches, MATCHES is NULL, N will be 0, and there will be no output after S:E. Since MATCHES[0] can be empty if there is no common prefix of the elements of MATCHES, applications should be prepared to deal with an empty line preceding the matches. */ static void _rl_export_completions (char **matches, char *text, int start, int end) { size_t len, i; len = vector_len (matches); if (RL_ISSTATE (RL_STATE_TERMPREPPED)) fprintf (rl_outstream, "\r\n"); fprintf (rl_outstream, "%zd\n", len); fprintf (rl_outstream, "%s\n", text); fprintf (rl_outstream, "%d:%d\n", start, end); /* : because it's not a radix character */ for (i = 0; i < len; i++) { print_filename (matches[i], matches[i], 0); fprintf (rl_outstream, "\n"); } fflush (rl_outstream); } int rl_export_completions (int count, int key) { rl_complete_internal ('$'); /* Clear the line buffer, currently requires a count argument. */ if (count > 1) { rl_delete_text (0, rl_end); /* undoable */ rl_point = rl_mark = 0; } return 0; } readline-8.3/callback.c000644 000436 000024 00000025670 14557221720 015147 0ustar00chetstaff000000 000000 /* callback.c -- functions to use readline as an X `callback' mechanism. */ /* Copyright (C) 1987-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include "rlconf.h" #if defined (READLINE_CALLBACKS) #include #ifdef HAVE_STDLIB_H # include #else # include "ansi_stdlib.h" #endif #include /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "readline.h" #include "rlprivate.h" #include "xmalloc.h" /* Private data for callback registration functions. See comments in rl_callback_read_char for more details. */ _rl_callback_func_t *_rl_callback_func = 0; _rl_callback_generic_arg *_rl_callback_data = 0; /* Applications can set this to non-zero to have readline's signal handlers installed during the entire duration of reading a complete line, as in readline-6.2. This should be used with care, because it can result in readline receiving signals and not handling them until it's called again via rl_callback_read_char, thereby stealing them from the application. By default, signal handlers are only active while readline is active. */ int rl_persistent_signal_handlers = 0; /* **************************************************************** */ /* */ /* Callback Readline Functions */ /* */ /* **************************************************************** */ /* Allow using readline in situations where a program may have multiple things to handle at once, and dispatches them via select(). Call rl_callback_handler_install() with the prompt and a function to call whenever a complete line of input is ready. The user must then call rl_callback_read_char() every time some input is available, and rl_callback_read_char() will call the user's function with the complete text read in at each end of line. The terminal is kept prepped all the time, except during calls to the user's function. Signal handlers are only installed when the application calls back into readline, so readline doesn't `steal' signals from the application. */ rl_vcpfunc_t *rl_linefunc; /* user callback function */ static int in_handler; /* terminal_prepped and signals set? */ /* Make sure the terminal is set up, initialize readline, and prompt. */ static void _rl_callback_newline (void) { rl_initialize (); if (in_handler == 0) { in_handler = 1; if (rl_prep_term_function) (*rl_prep_term_function) (_rl_meta_flag); #if defined (HANDLE_SIGNALS) if (rl_persistent_signal_handlers) rl_set_signals (); #endif } readline_internal_setup (); RL_CHECK_SIGNALS (); } /* Install a readline handler, set up the terminal, and issue the prompt. */ void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *linefunc) { rl_set_prompt (prompt); RL_SETSTATE (RL_STATE_CALLBACK); rl_linefunc = linefunc; _rl_callback_newline (); } #if defined (HANDLE_SIGNALS) #define CALLBACK_READ_RETURN() \ do { \ if (rl_persistent_signal_handlers == 0) \ { \ rl_clear_signals (); \ if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \ } \ return; \ } while (0) #else #define CALLBACK_READ_RETURN() return #endif /* Read one character, and dispatch to the handler if it ends the line. */ void rl_callback_read_char (void) { char *line; int eof, jcode; static procenv_t olevel; if (rl_linefunc == NULL) { _rl_errmsg ("readline_callback_read_char() called with no handler!"); abort (); } eof = 0; memcpy ((void *)olevel, (void *)_rl_top_level, sizeof (procenv_t)); #if defined (HAVE_POSIX_SIGSETJMP) jcode = sigsetjmp (_rl_top_level, 0); #else jcode = setjmp (_rl_top_level); #endif if (jcode) { (*rl_redisplay_function) (); _rl_want_redisplay = 0; memcpy ((void *)_rl_top_level, (void *)olevel, sizeof (procenv_t)); /* If we longjmped because of a timeout, handle it here. */ if (RL_ISSTATE (RL_STATE_TIMEOUT)) { RL_SETSTATE (RL_STATE_DONE); rl_done = 1; } CALLBACK_READ_RETURN (); } #if defined (HANDLE_SIGNALS) /* Install signal handlers only when readline has control. */ if (rl_persistent_signal_handlers == 0) rl_set_signals (); #endif do { RL_CHECK_SIGNALS (); if (RL_ISSTATE (RL_STATE_ISEARCH)) { eof = _rl_isearch_callback (_rl_iscxt); if (eof == 0 && (RL_ISSTATE (RL_STATE_ISEARCH) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) rl_callback_read_char (); CALLBACK_READ_RETURN (); } else if (RL_ISSTATE (RL_STATE_NSEARCH)) { eof = _rl_nsearch_callback (_rl_nscxt); CALLBACK_READ_RETURN (); } #if defined (VI_MODE) /* States that can occur while in state VIMOTION have to be checked before RL_STATE_VIMOTION */ else if (RL_ISSTATE (RL_STATE_CHARSEARCH)) { int k; k = _rl_callback_data->i2; eof = (*_rl_callback_func) (_rl_callback_data); /* If the function `deregisters' itself, make sure the data is cleaned up. */ if (_rl_callback_func == 0) /* XXX - just sanity check */ { if (_rl_callback_data) { _rl_callback_data_dispose (_rl_callback_data); _rl_callback_data = 0; } } /* Messy case where vi motion command can be char search */ if (RL_ISSTATE (RL_STATE_VIMOTION)) { _rl_vi_domove_motion_cleanup (k, _rl_vimvcxt); _rl_internal_char_cleanup (); CALLBACK_READ_RETURN (); } _rl_internal_char_cleanup (); } else if (RL_ISSTATE (RL_STATE_VIMOTION)) { eof = _rl_vi_domove_callback (_rl_vimvcxt); /* Should handle everything, including cleanup, numeric arguments, and turning off RL_STATE_VIMOTION */ if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) _rl_internal_char_cleanup (); CALLBACK_READ_RETURN (); } #endif else if (RL_ISSTATE (RL_STATE_NUMERICARG)) { eof = _rl_arg_callback (_rl_argcxt); if (eof == 0 && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) rl_callback_read_char (); /* XXX - this should handle _rl_last_command_was_kill better */ else if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) _rl_internal_char_cleanup (); CALLBACK_READ_RETURN (); } else if (RL_ISSTATE (RL_STATE_MULTIKEY)) { eof = _rl_dispatch_callback (_rl_kscxt); /* For now */ while ((eof == -1 || eof == -2) && RL_ISSTATE (RL_STATE_MULTIKEY) && _rl_kscxt && (_rl_kscxt->flags & KSEQ_DISPATCHED)) eof = _rl_dispatch_callback (_rl_kscxt); if (RL_ISSTATE (RL_STATE_MULTIKEY) == 0) { _rl_internal_char_cleanup (); _rl_want_redisplay = 1; } } else if (_rl_callback_func) { /* This allows functions that simply need to read an additional character (like quoted-insert) to register a function to be called when input is available. _rl_callback_data is a pointer to a struct that has the argument count originally passed to the registering function and space for any additional parameters. */ eof = (*_rl_callback_func) (_rl_callback_data); /* If the function `deregisters' itself, make sure the data is cleaned up. */ if (_rl_callback_func == 0) { if (_rl_callback_data) { _rl_callback_data_dispose (_rl_callback_data); _rl_callback_data = 0; } _rl_internal_char_cleanup (); } } else eof = readline_internal_char (); RL_CHECK_SIGNALS (); if (rl_done == 0 && _rl_want_redisplay) { (*rl_redisplay_function) (); _rl_want_redisplay = 0; } /* Make sure application hooks can see whether we saw EOF. */ if (eof > 0) { rl_eof_found = eof; RL_SETSTATE(RL_STATE_EOF); } if (rl_done) { line = readline_internal_teardown (eof); if (rl_deprep_term_function) (*rl_deprep_term_function) (); #if defined (HANDLE_SIGNALS) rl_clear_signals (); #endif in_handler = 0; if (rl_linefunc) /* just in case */ (*rl_linefunc) (line); /* If the user did not clear out the line, do it for him. */ if (rl_line_buffer[0]) _rl_init_line_state (); /* Redisplay the prompt if readline_handler_{install,remove} not called. */ if (in_handler == 0 && rl_linefunc) _rl_callback_newline (); } } while (rl_pending_input || _rl_pushed_input_available () || RL_ISSTATE (RL_STATE_MACROINPUT)); CALLBACK_READ_RETURN (); } /* Remove the handler, and make sure the terminal is in its normal state. */ void rl_callback_handler_remove (void) { rl_linefunc = NULL; RL_UNSETSTATE (RL_STATE_CALLBACK); RL_CHECK_SIGNALS (); /* Do what we need to do to manage the undo list if we haven't already done it in rl_callback_read_char(). If there's no undo list, we don't need to do anything. It doesn't matter if we try to revert all previous lines a second time; none of the history entries will have an undo list. */ if (rl_undo_list) readline_common_teardown (); /* At this point, rl_undo_list == NULL. */ if (in_handler) { in_handler = 0; if (rl_deprep_term_function) (*rl_deprep_term_function) (); #if defined (HANDLE_SIGNALS) rl_clear_signals (); #endif } } _rl_callback_generic_arg * _rl_callback_data_alloc (int count) { _rl_callback_generic_arg *arg; arg = (_rl_callback_generic_arg *)xmalloc (sizeof (_rl_callback_generic_arg)); arg->count = count; arg->i1 = arg->i2 = 0; return arg; } void _rl_callback_data_dispose (_rl_callback_generic_arg *arg) { xfree (arg); } /* Make sure that this agrees with cases in rl_callback_read_char */ void rl_callback_sigcleanup (void) { if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) return; if (RL_ISSTATE (RL_STATE_ISEARCH)) _rl_isearch_cleanup (_rl_iscxt, 0); else if (RL_ISSTATE (RL_STATE_NSEARCH)) _rl_nsearch_sigcleanup (_rl_nscxt, 0); else if (RL_ISSTATE (RL_STATE_VIMOTION)) RL_UNSETSTATE (RL_STATE_VIMOTION); else if (RL_ISSTATE (RL_STATE_NUMERICARG)) { _rl_argcxt = 0; RL_UNSETSTATE (RL_STATE_NUMERICARG); } else if (RL_ISSTATE (RL_STATE_MULTIKEY)) RL_UNSETSTATE (RL_STATE_MULTIKEY); else if (RL_ISSTATE (RL_STATE_READSTR)) _rl_readstr_sigcleanup (_rl_rscxt, 0); if (RL_ISSTATE (RL_STATE_CHARSEARCH)) RL_UNSETSTATE (RL_STATE_CHARSEARCH); _rl_callback_func = 0; } #endif readline-8.3/posixdir.h000644 000436 000024 00000004414 14141021656 015245 0ustar00chetstaff000000 000000 /* posixdir.h -- Posix directory reading includes and defines. */ /* Copyright (C) 1987,1991,2012,2019,2021 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. Bash 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 3 of the License, or (at your option) any later version. Bash 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 Bash. If not, see . */ /* This file should be included instead of or . */ #if !defined (_POSIXDIR_H_) #define _POSIXDIR_H_ #if defined (HAVE_DIRENT_H) # include # if defined (HAVE_STRUCT_DIRENT_D_NAMLEN) # define D_NAMLEN(d) ((d)->d_namlen) # else # define D_NAMLEN(d) (strlen ((d)->d_name)) # endif /* !HAVE_STRUCT_DIRENT_D_NAMLEN */ #else # if defined (HAVE_SYS_NDIR_H) # include # endif # if defined (HAVE_SYS_DIR_H) # include # endif # if defined (HAVE_NDIR_H) # include # endif # if !defined (dirent) # define dirent direct # endif /* !dirent */ # define D_NAMLEN(d) ((d)->d_namlen) #endif /* !HAVE_DIRENT_H */ /* The bash code fairly consistently uses d_fileno; make sure it's available */ #if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (HAVE_STRUCT_DIRENT_D_FILENO) # define d_fileno d_ino #endif /* Posix does not require that the d_ino field be present, and some systems do not provide it. */ #if !defined (HAVE_STRUCT_DIRENT_D_INO) || defined (BROKEN_DIRENT_D_INO) # define REAL_DIR_ENTRY(dp) 1 #else # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) #endif /* _POSIX_SOURCE */ #if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (BROKEN_DIRENT_D_INO) # define D_INO_AVAILABLE #endif /* Signal the rest of the code that it can safely use dirent.d_fileno */ #if defined (D_INO_AVAILABLE) || defined (HAVE_STRUCT_DIRENT_D_FILENO) # define D_FILENO_AVAILABLE 1 #endif #endif /* !_POSIXDIR_H_ */ readline-8.3/ansi_stdlib.h000644 000436 000024 00000002545 14410571607 015707 0ustar00chetstaff000000 000000 /* ansi_stdlib.h -- An ANSI Standard stdlib.h. */ /* A minimal stdlib.h containing extern declarations for those functions that bash uses. */ /* Copyright (C) 1993,2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. Bash 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 3 of the License, or (at your option) any later version. Bash 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 Bash. If not, see . */ #if !defined (_STDLIB_H_) #define _STDLIB_H_ 1 /* String conversion functions. */ extern int atoi (); extern double atof (); extern double strtod (); /* Memory allocation functions. */ /* Generic pointer type. */ #ifndef PTR_T # define PTR_T void * #endif /* PTR_T */ extern PTR_T malloc (); extern PTR_T realloc (); extern void free (); /* Other miscellaneous functions. */ extern void abort (); extern void exit (); extern char *getenv (); extern void qsort (); #endif /* _STDLIB_H */ readline-8.3/configure.ac000644 000436 000024 00000023263 15017402563 015527 0ustar00chetstaff000000 000000 dnl dnl Configure script for readline library dnl dnl report bugs to chet@po.cwru.edu dnl dnl Process this file with autoconf to produce a configure script. # Copyright (C) 1987-2024 Free Software Foundation, Inc. # This program 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 3 of the License, or # (at your option) any later version. # This program 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 this program. If not, see . AC_REVISION([for Readline 8.3, version 2.103]) AC_INIT(readline, 8.3, bug-readline@gnu.org) dnl make sure we are using a recent autoconf version AC_PREREQ(2.69) AC_CONFIG_SRCDIR(readline.h) AC_CONFIG_AUX_DIR(./support) AC_CONFIG_HEADERS(config.h) dnl update the value of RL_READLINE_VERSION in readline.h when this changes LIBVERSION=8.3 AC_CANONICAL_HOST AC_CANONICAL_BUILD dnl configure defaults opt_curses=no opt_shared_termcap_lib=no dnl arguments to configure AC_ARG_WITH(curses, AS_HELP_STRING([--with-curses], [use the curses library instead of the termcap library]), opt_curses=$withval) AC_ARG_WITH(shared-termcap-library, AS_HELP_STRING([--with-shared-termcap-library], [link the readline shared library against the termcap/curses shared library [[default=NO]]]), opt_shared_termcap_lib=$withval) if test "$opt_curses" = "yes"; then prefer_curses=yes fi dnl option parsing for optional features opt_multibyte=yes opt_static_libs=yes opt_shared_libs=yes opt_install_examples=yes opt_bracketed_paste_default=yes AC_ARG_ENABLE(multibyte, AS_HELP_STRING([--enable-multibyte], [enable multibyte characters if OS supports them]), opt_multibyte=$enableval) AC_ARG_ENABLE(shared, AS_HELP_STRING([--enable-shared], [build shared libraries [[default=YES]]]), opt_shared_libs=$enableval) AC_ARG_ENABLE(static, AS_HELP_STRING([--enable-static], [build static libraries [[default=YES]]]), opt_static_libs=$enableval) AC_ARG_ENABLE(install-examples, AS_HELP_STRING([--disable-install-examples], [don't install examples [[default=install]]]), opt_install_examples=$enableval) AC_ARG_ENABLE(bracketed-paste-default, AS_HELP_STRING([--disable-bracketed-paste-default], [disable bracketed paste by default [[default=enable]]]), opt_bracketed_paste_default=$enableval) if test $opt_multibyte = no; then AC_DEFINE(NO_MULTIBYTE_SUPPORT) fi if test $opt_bracketed_paste_default = yes; then BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=1' else BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=0' fi AC_SUBST(BRACKETED_PASTE) dnl load up the cross-building cache file -- add more cases and cache dnl files as necessary dnl Note that host and target machine are the same, and different than the dnl build machine. CROSS_COMPILE= if test "x$cross_compiling" = "xyes"; then case "${host}" in *-cygwin*) cross_cache=${srcdir}/cross-build/cygwin.cache ;; *-mingw*) cross_cache=${srcdir}/cross-build/mingw.cache ;; i[[3456]]86-*-beos*) cross_cache=${srcdir}/cross-build/x86-beos.cache ;; *) echo "configure: cross-compiling for $host is not supported" >&2 ;; esac if test -n "${cross_cache}" && test -r "${cross_cache}"; then echo "loading cross-build cache file ${cross_cache}" . ${cross_cache} fi unset cross_cache CROSS_COMPILE='-DCROSS_COMPILING' AC_SUBST(CROSS_COMPILE) fi echo "" echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}" echo "" # We want these before the checks, so the checks can modify their values. test -z "$CFLAGS" && want_auto_cflags=1 AC_PROG_MAKE_SET AC_PROG_CC AC_USE_SYSTEM_EXTENSIONS # If we're using gcc and the user hasn't specified CFLAGS, add -O2 to CFLAGS if test -n "$want_auto_cflags" ; then AUTO_CFLAGS="-g ${GCC:+-O2}" # STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}" STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security}" fi dnl this macro is obsolete dnl AC_PROG_GCC_TRADITIONAL AC_PROG_INSTALL AC_CHECK_TOOL(AR, ar) dnl Set default for ARFLAGS, since autoconf does not have a macro for it. dnl This allows people to set it when running configure or make test -n "$ARFLAGS" || ARFLAGS="cr" AC_PROG_RANLIB AM_PROG_INSTALL_SH MAKE_SHELL=/bin/sh AC_SUBST(MAKE_SHELL) dnl include files for gettext m4_include([m4/codeset.m4]) AC_C_CONST AC_C_INLINE AC_C_PROTOTYPES AC_C_CHAR_UNSIGNED AC_C_VOLATILE AC_TYPE_SIZE_T AC_CHECK_TYPE(ssize_t, int) AC_TYPE_MODE_T AC_HEADER_STAT AC_HEADER_DIRENT AC_CHECK_FUNCS(fcntl gettimeofday kill lstat pselect readlink select setitimer) AC_CHECK_FUNCS(fnmatch memmove putenv setenv setlocale strcasecmp \ strpbrk sysconf tcgetattr tcgetwinsize tcsetwinsize \ vsnprintf) AC_CHECK_FUNCS(isascii isxdigit) AC_CHECK_FUNCS(getpwent getpwnam getpwuid) AC_FUNC_CHOWN AC_FUNC_STRCOLL AC_CHECK_HEADERS(fcntl.h unistd.h stdlib.h varargs.h stdarg.h stdbool.h \ string.h strings.h \ limits.h locale.h pwd.h memory.h termcap.h termios.h termio.h) AC_CHECK_HEADERS(sys/ioctl.h sys/pte.h sys/stream.h sys/select.h \ sys/time.h sys/file.h) AC_CHECK_HEADERS(sys/ptem.h,,, [[ #if HAVE_SYS_STREAM_H # include #endif ]]) AC_SYS_LARGEFILE BASH_SYS_SIGNAL_VINTAGE BASH_SYS_REINSTALL_SIGHANDLERS BASH_FUNC_POSIX_SETJMP BASH_FUNC_LSTAT BASH_FUNC_STRCOLL BASH_CHECK_GETPW_FUNCS AC_HEADER_TIOCGWINSZ BASH_TYPE_SIG_ATOMIC_T BASH_HAVE_TIOCSTAT BASH_HAVE_FIONREAD BASH_CHECK_SPEED_T BASH_STRUCT_WINSIZE BASH_STRUCT_DIRENT_D_INO BASH_STRUCT_DIRENT_D_FILENO BASH_STRUCT_TIMEVAL AC_CHECK_HEADERS(libaudit.h) AC_CHECK_DECLS([AUDIT_USER_TTY],,, [[#include ]]) dnl yuck case "$host_os" in aix*) prefer_curses=yes ;; esac BASH_CHECK_LIB_TERMCAP if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then if test "$prefer_curses" = yes; then TERMCAP_LIB=-lcurses else TERMCAP_LIB=-ltermcap #default fi fi # Windows ncurses installation if test "$TERMCAP_LIB" = "-lncurses"; then AC_CHECK_HEADERS(ncurses/termcap.h) fi case "$opt_shared_termcap_lib" in [[Yy]][[Ee]][[Ss]]) SHARED_TERMCAP="$TERMCAP_LIB" ;; -l*) SHARED_TERMCAP="$opt_shared_termcap_lib" ;; esac case "$TERMCAP_LIB" in -ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;; -lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; -lncursesw) TERMCAP_PKG_CONFIG_LIB=ncursesw ;; -lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; -ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;; *) TERMCAP_PKG_CONFIG_LIB=termcap ;; esac BASH_CHECK_MULTIBYTE case "$host_cpu" in *cray*) LOCAL_CFLAGS=-DCRAY ;; *s390*) LOCAL_CFLAGS=-fsigned-char ;; esac case "$host_os" in isc*) LOCAL_CFLAGS=-Disc386 ;; hpux*) LOCAL_CFLAGS="-DTGETENT_BROKEN -DTGETFLAG_BROKEN" ;; esac # shared library configuration section # # Shared object configuration section. These values are generated by # ${srcdir}/support/shobj-conf # if test -f ${srcdir}/support/shobj-conf; then AC_MSG_CHECKING(configuration for building shared libraries) eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}` # SHARED_TERMCAP is set only if opt_shared_termcap_library is set case "$SHLIB_LIBS" in *curses*|*tinfo*) ;; *termcap*|*termlib*) ;; # common aliases *) SHLIB_LIBS="$SHLIB_LIBS $SHARED_TERMCAP" ;; esac AC_SUBST(SHOBJ_CC) AC_SUBST(SHOBJ_CFLAGS) AC_SUBST(SHOBJ_LD) AC_SUBST(SHOBJ_LDFLAGS) AC_SUBST(SHOBJ_XLDFLAGS) AC_SUBST(SHOBJ_LIBS) AC_SUBST(SHOBJ_STATUS) AC_SUBST(SHLIB_STATUS) AC_SUBST(SHLIB_XLDFLAGS) AC_SUBST(SHLIB_DOT) AC_SUBST(SHLIB_LIBPREF) AC_SUBST(SHLIB_LIBSUFF) AC_SUBST(SHLIB_LIBVERSION) AC_SUBST(SHLIB_DLLVERSION) AC_SUBST(SHLIB_LIBS) AC_MSG_RESULT($SHLIB_STATUS) # SHLIB_STATUS is either `supported' or `unsupported'. If it's # `unsupported', turn off any default shared library building if test "$SHLIB_STATUS" = 'unsupported'; then opt_shared_libs=no fi # shared library versioning # quoted for m4 so I can use character classes SHLIB_MAJOR=[`expr "$LIBVERSION" : '\([0-9]\)\..*'`] SHLIB_MINOR=[`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`] AC_SUBST(SHLIB_MAJOR) AC_SUBST(SHLIB_MINOR) fi if test "$opt_static_libs" = "yes"; then STATIC_TARGET=static STATIC_INSTALL_TARGET=install-static fi if test "$opt_shared_libs" = "yes"; then SHARED_TARGET=shared SHARED_INSTALL_TARGET=install-shared fi AC_SUBST(STATIC_TARGET) AC_SUBST(SHARED_TARGET) AC_SUBST(STATIC_INSTALL_TARGET) AC_SUBST(SHARED_INSTALL_TARGET) if test "$opt_install_examples" = "yes"; then EXAMPLES_INSTALL_TARGET=install-examples fi AC_SUBST(EXAMPLES_INSTALL_TARGET) case "$build_os" in msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file *) BUILD_DIR=`pwd` ;; esac case "$BUILD_DIR" in *\ *) BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;; *) ;; esac AC_SUBST(BUILD_DIR) # CFLAGS=${CFLAGS-"$AUTO_CFLAGS"} if test -n "$want_auto_cflags"; then CFLAGS="$AUTO_CFLAGS" fi CFLAGS="$CFLAGS $STYLE_CFLAGS" AC_SUBST(CFLAGS) AC_SUBST(LOCAL_CFLAGS) AC_SUBST(LOCAL_LDFLAGS) AC_SUBST(LOCAL_DEFS) AC_SUBST(STYLE_CFLAGS) AC_SUBST(AR) AC_SUBST(ARFLAGS) AC_SUBST(host_cpu) AC_SUBST(host_os) AC_SUBST(LIBVERSION) AC_SUBST(TERMCAP_LIB) AC_SUBST(TERMCAP_PKG_CONFIG_LIB) AC_CONFIG_FILES([Makefile doc/Makefile examples/Makefile shlib/Makefile readline.pc history.pc]) dnl Makefile uses this timestamp file to record whether config.h is up to date. AC_CONFIG_COMMANDS([stamp-h], [echo > stamp-h]) AC_OUTPUT readline-8.3/xfree.c000644 000436 000024 00000002773 13052147566 014527 0ustar00chetstaff000000 000000 /* xfree.c -- safe version of free that ignores attempts to free NUL */ /* Copyright (C) 1991-2010,2017 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) #include #endif #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include "xmalloc.h" /* **************************************************************** */ /* */ /* Memory Deallocation. */ /* */ /* **************************************************************** */ /* Use this as the function to call when adding unwind protects so we don't need to know what free() returns. */ void xfree (PTR_T string) { if (string) free (string); } readline-8.3/xmalloc.c000644 000436 000024 00000003747 14324315116 015046 0ustar00chetstaff000000 000000 /* xmalloc.c -- safe versions of malloc and realloc */ /* Copyright (C) 1991-2017 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) #include #endif #include #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include "xmalloc.h" /* **************************************************************** */ /* */ /* Memory Allocation and Deallocation. */ /* */ /* **************************************************************** */ static void memory_error_and_abort (const char * const fname) { fprintf (stderr, "%s: out of virtual memory\n", fname); exit (2); } /* Return a pointer to free()able block of memory large enough to hold BYTES number of bytes. If the memory cannot be allocated, print an error message and abort. */ PTR_T xmalloc (size_t bytes) { PTR_T temp; temp = malloc (bytes); if (temp == 0) memory_error_and_abort ("xmalloc"); return (temp); } PTR_T xrealloc (PTR_T pointer, size_t bytes) { PTR_T temp; temp = pointer ? realloc (pointer, bytes) : malloc (bytes); if (temp == 0) memory_error_and_abort ("xrealloc"); return (temp); } readline-8.3/undo.c000644 000436 000024 00000020045 14406613610 014343 0ustar00chetstaff000000 000000 /* undo.c - manage list of changes to lines, offering opportunity to undo them */ /* Copyright (C) 1987-2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_UNISTD_H) # include /* for _POSIX_VERSION */ #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include /* System-specific feature definitions and include files. */ #include "rldefs.h" /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "xmalloc.h" #include "histlib.h" /* Non-zero tells rl_delete_text and rl_insert_text to not add to the undo list. */ int _rl_doing_an_undo = 0; /* How many unclosed undo groups we currently have. */ int _rl_undo_group_level = 0; /* The current undo list for THE_LINE. */ UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL; /* **************************************************************** */ /* */ /* Undo, and Undoing */ /* */ /* **************************************************************** */ static UNDO_LIST * alloc_undo_entry (enum undo_code what, int start, int end, char *text) { UNDO_LIST *temp; temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST)); temp->what = what; temp->start = start; temp->end = end; temp->text = text; temp->next = (UNDO_LIST *)NULL; return temp; } /* Remember how to undo something. Concatenate some undos if that seems right. */ void rl_add_undo (enum undo_code what, int start, int end, char *text) { UNDO_LIST *temp; temp = alloc_undo_entry (what, start, end, text); temp->next = rl_undo_list; rl_undo_list = temp; } /* Free an UNDO_LIST */ void _rl_free_undo_list (UNDO_LIST *ul) { UNDO_LIST *release; while (ul) { release = ul; ul = ul->next; if (release->what == UNDO_DELETE) xfree (release->text); xfree (release); } } /* Free the existing undo list. */ void rl_free_undo_list (void) { UNDO_LIST *orig_list; orig_list = rl_undo_list; _rl_free_undo_list (rl_undo_list); rl_undo_list = (UNDO_LIST *)NULL; _hs_replace_history_data (-1, (histdata_t *)orig_list, (histdata_t *)NULL); if (_rl_saved_line_for_history && (UNDO_LIST *)_rl_saved_line_for_history->data == orig_list) _rl_saved_line_for_history->data = 0; } UNDO_LIST * _rl_copy_undo_entry (UNDO_LIST *entry) { UNDO_LIST *new; new = alloc_undo_entry (entry->what, entry->start, entry->end, (char *)NULL); new->text = entry->text ? savestring (entry->text) : 0; return new; } UNDO_LIST * _rl_copy_undo_list (UNDO_LIST *head) { UNDO_LIST *list, *new, *roving, *c; if (head == 0) return head; list = head; new = 0; while (list) { c = _rl_copy_undo_entry (list); if (new == 0) roving = new = c; else { roving->next = c; roving = roving->next; } list = list->next; } roving->next = 0; return new; } /* Undo the next thing in the list. Return 0 if there is nothing to undo, or non-zero if there was. */ int rl_do_undo (void) { UNDO_LIST *release, *search; int waiting_for_begin, start, end; HIST_ENTRY *cur, *temp; #define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i))) start = end = waiting_for_begin = 0; do { if (rl_undo_list == 0) return (0); _rl_doing_an_undo = 1; RL_SETSTATE(RL_STATE_UNDOING); /* To better support vi-mode, a start or end value of -1 means rl_point, and a value of -2 means rl_end. */ if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT) { start = TRANS (rl_undo_list->start); end = TRANS (rl_undo_list->end); } switch (rl_undo_list->what) { /* Undoing deletes means inserting some text. */ case UNDO_DELETE: rl_point = start; _rl_fix_point (1); rl_insert_text (rl_undo_list->text); xfree (rl_undo_list->text); break; /* Undoing inserts means deleting some text. */ case UNDO_INSERT: rl_delete_text (start, end); rl_point = start; _rl_fix_point (1); break; /* Undoing an END means undoing everything 'til we get to a BEGIN. */ case UNDO_END: waiting_for_begin++; break; /* Undoing a BEGIN means that we are done with this group. */ case UNDO_BEGIN: if (waiting_for_begin) waiting_for_begin--; else rl_ding (); break; } _rl_doing_an_undo = 0; RL_UNSETSTATE(RL_STATE_UNDOING); release = rl_undo_list; rl_undo_list = rl_undo_list->next; release->next = 0; /* XXX */ /* If we are editing a history entry, make sure the change is replicated in the history entry's line */ cur = current_history (); if (cur && cur->data && (UNDO_LIST *)cur->data == release) { temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); xfree (temp->line); FREE (temp->timestamp); xfree (temp); } /* Make sure there aren't any history entries with that undo list */ _hs_replace_history_data (-1, (histdata_t *)release, (histdata_t *)rl_undo_list); /* And make sure this list isn't anywhere in the saved line for history */ if (_rl_saved_line_for_history && _rl_saved_line_for_history->data) { /* Brute force; no finesse here */ search = (UNDO_LIST *)_rl_saved_line_for_history->data; if (search == release) _rl_saved_line_for_history->data = rl_undo_list; else { while (search->next) { if (search->next == release) { search->next = rl_undo_list; break; } search = search->next; } } } xfree (release); } while (waiting_for_begin); return (1); } #undef TRANS int _rl_fix_last_undo_of_type (int type, int start, int end) { UNDO_LIST *rl; for (rl = rl_undo_list; rl; rl = rl->next) { if (rl->what == type) { rl->start = start; rl->end = end; return 0; } } return 1; } /* Begin a group. Subsequent undos are undone as an atomic operation. */ int rl_begin_undo_group (void) { rl_add_undo (UNDO_BEGIN, 0, 0, 0); _rl_undo_group_level++; return 0; } /* End an undo group started with rl_begin_undo_group (). */ int rl_end_undo_group (void) { rl_add_undo (UNDO_END, 0, 0, 0); _rl_undo_group_level--; return 0; } /* Save an undo entry for the text from START to END. */ int rl_modifying (int start, int end) { if (start > end) { SWAP (start, end); } if (start != end) { char *temp = rl_copy_text (start, end); rl_begin_undo_group (); rl_add_undo (UNDO_DELETE, start, end, temp); rl_add_undo (UNDO_INSERT, start, end, (char *)NULL); rl_end_undo_group (); } return 0; } /* Revert the current line to its previous state. */ int rl_revert_line (int count, int key) { if (rl_undo_list == 0) rl_ding (); else { while (rl_undo_list) rl_do_undo (); #if defined (VI_MODE) if (rl_editing_mode == vi_mode) rl_point = rl_mark = 0; /* rl_end should be set correctly */ #endif } return 0; } /* Do some undoing of things that were done. */ int rl_undo_command (int count, int key) { if (count < 0) return 0; /* Nothing to do. */ while (count) { if (rl_do_undo ()) count--; else { rl_ding (); break; } } return 0; } readline-8.3/rlconf.h000644 000436 000024 00000005744 14536346511 014706 0ustar00chetstaff000000 000000 /* rlconf.h -- readline configuration definitions */ /* Copyright (C) 1992-2015 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RLCONF_H_) #define _RLCONF_H_ /* Define this if you want the vi-mode editing available. */ #define VI_MODE /* Define this to get an indication of file type when listing completions. */ #define VISIBLE_STATS /* Define this to get support for colors when listing completions and in other places. */ #define COLOR_SUPPORT /* This definition is needed by readline.c, rltty.c, and signals.c. */ /* If on, then readline handles signals in a way that doesn't suck. */ #define HANDLE_SIGNALS /* Ugly but working hack for binding prefix meta. */ #define PREFIX_META_HACK /* The next-to-last-ditch effort file name for a user-specific init file. */ #define DEFAULT_INPUTRC "~/.inputrc" /* The ultimate last-ditch filename for an init file -- system-wide. */ #define SYS_INPUTRC "/etc/inputrc" /* If defined, expand tabs to spaces. */ #define DISPLAY_TABS /* If defined, use the terminal escape sequence to move the cursor forward over a character when updating the line rather than rewriting it. */ /* #define HACK_TERMCAP_MOTION */ /* The string inserted by the `insert comment' command. */ #define RL_COMMENT_BEGIN_DEFAULT "#" /* Define this if you want code that allows readline to be used in an X `callback' style. */ #define READLINE_CALLBACKS /* Define this if you want the cursor to indicate insert or overwrite mode. */ /* #define CURSOR_MODE */ /* Define this if you want to enable code that talks to the Linux kernel tty auditing system. */ /* #define ENABLE_TTY_AUDIT_SUPPORT */ /* Defaults for the various editing mode indicators, inserted at the beginning of the last (maybe only) line of the prompt if show-mode-in-prompt is on */ #define RL_EMACS_MODESTR_DEFAULT "@" #define RL_EMACS_MODESTR_DEFLEN 1 #define RL_VI_INS_MODESTR_DEFAULT "(ins)" #define RL_VI_INS_MODESTR_DEFLEN 5 #define RL_VI_CMD_MODESTR_DEFAULT "(cmd)" #define RL_VI_CMD_MODESTR_DEFLEN 5 /* Do you want readline to assume it's running in an ANSI-compatible terminal by default? If set to 0, readline tries to check and verify whether or not it is. */ #define RL_ANSI_TERM_DEFAULT 1 /* for now */ #endif /* _RLCONF_H_ */ readline-8.3/shell.c000644 000436 000024 00000011235 15020315163 014501 0ustar00chetstaff000000 000000 /* shell.c -- readline utility functions that are normally provided by bash when readline is linked as part of the shell. */ /* Copyright (C) 1997-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_STRING_H) # include #else # include #endif /* !HAVE_STRING_H */ #if defined (HAVE_LIMITS_H) # include #endif #if defined (HAVE_FCNTL_H) #include #endif #if defined (HAVE_PWD_H) #include #endif #include #include "rlstdc.h" #include "rlshell.h" #include "rldefs.h" #include "xmalloc.h" #if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS) extern struct passwd *getpwuid (uid_t); #endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */ #ifndef CHAR_BIT # define CHAR_BIT 8 #endif /* Nonzero if the integer type T is signed. */ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) /* Bound on length of the string representing an integer value of type T. Subtract one for the sign bit if T is signed; 302 / 1000 is log10 (2) rounded up; add one for integer division truncation; add one more for a minus sign if t is signed. */ #define INT_STRLEN_BOUND(t) \ ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \ + 1 + TYPE_SIGNED (t)) /* All of these functions are resolved from bash if we are linking readline as part of bash. */ /* Does shell-like quoting using single quotes. */ char * sh_single_quote (char *string) { register int c; char *result, *r, *s; result = (char *)xmalloc (3 + (4 * strlen (string))); r = result; *r++ = '\''; for (s = string; s && (c = *s); s++) { *r++ = c; if (c == '\'') { *r++ = '\\'; /* insert escaped single quote */ *r++ = '\''; *r++ = '\''; /* start new quoted string */ } } *r++ = '\''; *r = '\0'; return (result); } /* Set the environment variables LINES and COLUMNS to lines and cols, respectively. */ static char setenv_buf[INT_STRLEN_BOUND (int) + 1]; #if defined (HAVE_PUTENV) && !defined (HAVE_SETENV) static char putenv_buf1[INT_STRLEN_BOUND (int) + 6 + 1]; /* sizeof("LINES=") == 6 */ static char putenv_buf2[INT_STRLEN_BOUND (int) + 8 + 1]; /* sizeof("COLUMNS=") == 8 */ #endif void sh_set_lines_and_columns (int lines, int cols) { #if defined (HAVE_SETENV) sprintf (setenv_buf, "%d", lines); setenv ("LINES", setenv_buf, 1); sprintf (setenv_buf, "%d", cols); setenv ("COLUMNS", setenv_buf, 1); #else /* !HAVE_SETENV */ # if defined (HAVE_PUTENV) sprintf (putenv_buf1, "LINES=%d", lines); putenv (putenv_buf1); sprintf (putenv_buf2, "COLUMNS=%d", cols); putenv (putenv_buf2); # endif /* HAVE_PUTENV */ #endif /* !HAVE_SETENV */ } char * sh_get_env_value (const char *varname) { return ((char *)getenv (varname)); } char * sh_get_home_dir (void) { static char *home_dir = (char *)NULL; struct passwd *entry; if (home_dir) return (home_dir); home_dir = (char *)NULL; #if defined (HAVE_GETPWUID) # if defined (__TANDEM) entry = getpwnam (getlogin ()); # else entry = getpwuid (getuid ()); # endif if (entry) home_dir = savestring (entry->pw_dir); #endif #if defined (HAVE_GETPWENT) endpwent (); /* some systems need this */ #endif return (home_dir); } #if !defined (O_NDELAY) # if defined (FNDELAY) # define O_NDELAY FNDELAY # endif #endif int sh_unset_nodelay_mode (int fd) { #if defined (HAVE_FCNTL) int flags, bflags; if ((flags = fcntl (fd, F_GETFL, 0)) < 0) return -1; bflags = 0; #ifdef O_NONBLOCK bflags |= O_NONBLOCK; #endif #ifdef O_NDELAY bflags |= O_NDELAY; #endif if (flags & bflags) { flags &= ~bflags; return (fcntl (fd, F_SETFL, flags)); } #endif return 0; } readline-8.3/CHANGELOG000644 000436 000024 00000113425 14650201561 014450 0ustar00chetstaff000000 000000 [Readline-specific changelog. Descriptions of changes to the source are found in the bash changelog.] 6/9 --- Makefile.in - quote value of ${INSTALL_DATA} when passing it to makes in subdirectories 7/1 --- Makefile.in - don't pass INSTALL_DATA to a make in the `doc' subdirectory; let autoconf set the value itself in the Makefile - removed a stray `-' before $(RANLIB) in the `install' recipe doc/Makefile.in - add a VPATH assignment so the documentation is not remade if it's already up-to-date in the distribution configure.in - call AC_SUBST(LOCAL_LDFLAGS), since Makefile.in contains @LOCAL_LDFLAGS@ 7/9 --- config.h.in - add define lines for STRUCT_WINSIZE_IN_SYS_IOCTL and STRUCT_WINSIZE_IN_TERMIOS configure.in - call BASH_STRUCT_WINSIZE to look for the definition of `struct winsize' 7/17 ---- configure.in - call AC_MINIX config.h.in - add define line for AC_MINIX 7/18 ---- Makefile.in - add `install-shared' and `uninstall-shared' targets 8/4 --- Makefile.in - install and uninstall libhistory.a in the `install' and `uninstall' targets 9/4 --- configure.in - bumped LIBVERSION up to 2.1.1, indicating that this is patch level 1 to release 2.1 9/16 ---- Makefile.in - `make distclean' now descends into the `examples' subdir doc/Makefile.in - the `distclean' and `maintainer-clean' targets should remove Makefile examples/Makefile.in - added the various clean targets 4/2 --- configure.in - bumped LIBVERSION up to 2.2 4/18 ---- [readline-2.2 released] 4/20 ---- Makefile.in - make `libhistory.a' a dependency of `install' - fixed a typo in the recipe for `install' that copied libreadline.a to libhistory.old right after installing it 4/27 ---- doc/Makefile.in - install {readline,history}.info out of the source directory if they are not found in the current (build) directory -- only an issue if the libraries are built in a different directory than the source directory 5/1 --- support/shobj-conf - script from the bash distribution to do shared object and library configuration shlib/Makefile.in - new directory and makefile to handle building shared versions of libreadline and libhistory, controlled by support/shobj-conf 5/7 --- doc/Makefile.in - set SHELL to /bin/sh, rather than relying on make to be correct 5/14 ---- savestring.c - new file, moved from shell.c, for backwards compatibility Makefile.in, shlib/Makefile.in - make sure savestring.c is compiled and added to libreadline and libhistory [THERE ARE NO MORE #ifdef SHELL LINES IN THE C SOURCE FILES.] 5/15 ---- README - updated description of shared library creation for the new scheme [THERE ARE NO MORE #ifdef SHELL LINES IN ANY OF THE SOURCE FILES.] Makefile.in - bumped SHLIB_MAJOR up to 4 since we've augmented the library API - rlconf.h is now one of the installed headers, so applications can find out whether things like vi-mode are available in the installed libreadline 5/20 ---- configure.in - changed RL_LIBRARY_VERSION to 4.0 to match the version of the installed shared libraries 6/5 --- rlstdc.h - new file Makefile.in - rlstdc.h is now one of the installed headers 8/3 --- shlib/Makefile.in - made the suffix rule that creates xx.so from xx.c write the compiler output to `a.o', which is then mv'd to xx.so, because some compilers (Sun WSpro 4.2, for example) don't allow any suffixes other than `.o' for `cc -c' (not even `a.out') 9/15 ---- Makefile.in - AR and ARFLAGS are now substituted by configure, used in recipes that build the libraries configure.in - use AC_CHECK_PROG to check for ar - set ARFLAGS if it has not already been set in the environment 10/5 ---- Makefile.in - removed savestring.o from object file list 10/28 ----- shlib/Makefile.in - don't use a fixed filename in the .c.so suffix rule to avoid problems with parallel makes 12/21 ----- support/shlib-install - new script to install shared readline and history libraries shlib/Makefile.in - changed to call shlib-install for install and uninstall targets [readline-4.0-beta1 frozen] 12/22 ----- configure.in - call AC_SUBST for SHOBJ_XLDFLAGS and SHLIB_LIBS shlib/Makefile.in - SHOBJ_XLDFLAGS and SHLIB_LIBS are now substituted by configure - add $(SHLIB_LIBS) at end of command line that builds the shared libraries (currently needed only by AIX 4.2) 12/31 ----- MANIFEST, MANIFEST.doc - the TOC html files are no longer generated and no longer part of the distribution 2/18/1999 --------- configure.in - set MAKE_SHELL to /bin/sh and substitute into the Makefiles Makefile.in,{doc,examples,shlib}/Makefile.in - set SHELL from @MAKE_SHELL@ [readline-4.0 released] 3/11 ---- doc/Makefile.in - removed references to HTMLTOC, since separate HTML table-of-contents files are no longer created examples/Makefile.in - remove `*.exe' in clean target for MS-DOS Makefile.in - make `readline' target depend on ./libreadline.a - configure now substitutes TERMCAP_LIB into Makefile.in - use ${TERMCAP_LIB} instead of -ltermcap in recipe for `readline' - clean target now removes readline and readline.exe in case they get built configure.in - use `pwd.exe' to set BUILD_DIR on MS-DOS DJGPP 3/15 ---- support/shlib-install - Irix 5.x and Irix 6.x should install shared libraries like Solaris 2 - changes for installing on hp-ux 1[01].x 3/23 ---- configure.in - make sure that the $CC argument to shobj-conf is quoted 4/8 --- xmalloc.h, rlprivate.h, rlshell.h - new files Makefile.in,shlib/Makefile.in - add dependencies on xmalloc.h, rlshell.h - add xmalloc.h, rlprivate.h, rlshell.h to list of header files MANIFEST - add xmalloc.h, rlprivate.h, rlshell.h 4/9 --- Makefile.in,shlib/Makefile.in - add dependencies on rlprivate.h 4/13 ---- doc/Makefile.in - add variable, PSDVI, which is the desired resolution of the generated postscript files. Set to 300 because I don't have any 600-dpi printers - set LANGUAGE= before calling makeinfo, so messages are in English - add rluserman.{info,dvi,ps,html} to appropriate variables - add rules to create rluserman.{info,dvi,ps,html} - install and uninstall rluserman.info, but don't update the directory file in $(infodir) yet MANIFEST - add doc/rluserman.{texinfo,info,dvi,ps,html} 4/30 ---- configure.in - updated library version to 4.1 5/3 --- configure.in - SHLIB_MAJOR and SHLIB_MINOR shared library version numbers are constructed from $LIBRARY_VERSION and substituted into Makefiles 5/5 --- support/shlib-install - OSF/1 installs shared libraries like Solaris Makefile.in - broke the header file install and uninstall into two new targets: install-headers and uninstall-headers - install and uninstall depend on install-headers and uninstall-headers respectively - changed install-shared and uninstall-shared targets to depend on install-headers and uninstall-headers, respectively, so users may choose to install only the shared libraries. I'm not sure about the uninstall one yet -- maybe it should check whether or not the static libraries are installed and not remove the header files if they are 9/3 --- configure.in, config.h.in - added test for memmove (for later use) - changed version to 4.1-beta1 9/13 ---- examples/rlfe.c - Per Bothner's `rlfe' readline front-end program examples/Makefile.in - added rules to build rlfe 9/21 ---- support/shlib-install - changes to handle FreeBSD-3.x elf or a.out shared libraries, which have different semantics and need different naming conventions 1/24/2000 --------- doc/Makefile.in - remove *.bt and *.bts on `make clean' 2/4 --- configure.in - changed LIBVERSION to 4.1-beta5 3/17/2000 --------- [readline-4.1 released] 3/23 ---- Makefile.in - remove the `-t' argument to ranlib in the install recipe; some ranlibs don't have it and attempt to create a file named `-t' 3/27 ---- support/shlib-install - install shared libraries unwritable by anyone on HP-UX - changed symlinks to relative pathnames on all platforms shlib/Makefile.in - added missing `includedir' assignment, substituted by configure Makefile.in - added missing @SET_MAKE@ so configure can set $MAKE appropriately configure.in - add call to AC_PROG_MAKE_SET 8/30 ---- shlib/Makefile.in - change the soname bound into the shared libraries, so it includes only the major version number. If it includes the minor version, programs depending on it must be rebuilt (which may or may not be a bad thing) 9/6 --- examples/rlfe.c - add -l option to log input and output (-a option appends to logfile) - add -n option to set readline application name - add -v, -h options for version and help information - change a few things because getopt() is now used to parse arguments 9/12 ---- support/shlib-install - fix up the libname on HPUX 11 10/18 ----- configure.in - changed library version to 4.2-alpha 10/30 ----- configure.in - add -fsigned-char to LOCAL_CFLAGS for Linux running on the IBM S/390 Makefile.in - added new file, rltypedefs.h, installed by default with `make install' 11/2 ---- compat.c - new file, with backwards-compatibility function definitions Makefile.in,shlib/Makefile.in - make sure that compat.o/compat.so are built and linked apppropriately support/shobj-conf - picked up bash version, which means that shared libs built on linux and BSD/OS 4.x will have an soname that does not include the minor version number 11/13 ----- examples/rlfe.c - rlfe can perform filename completion for relative pathnames in the inferior process's context if the OS supports /proc/PID/cwd (linux does it OK, Solaris is slightly warped, none of the BSDs have it) 11/17/2000 ---------- [readline-4.2-alpha released] 11/27 ----- Makefile.in,shlib/Makefile.in - added dependencies for rltypedefs.h shlib/Makefile.in - changed dependencies on histlib.h to $(topdir)/histlib.h 1/22 ---- configure.in - changed release version to 4.2-beta 2/2 --- examples/Makefile.in - build histexamp as part of the examples 2/5 --- doc/Makefile.in - don't remove the dvi, postscript, html, info, and text `objects' on a `make distclean', only on a `make maintainer-clean' 3/6 --- doc/history.{0,3}, doc/history_3.ps - new manual page for history library doc/Makefile.in - rules to install and uninstall history.3 in ${man3dir} - rules to build history.0 and history_3.ps 4/2 --- configure.in - changed LIBVERSION to `4.2' 4/5 --- [readline-4.2 frozen] 4/9 --- [readline-4.2 released] 5/2 --- Makefile.in,{doc,examples,shlib}/Makefile.in - added support for DESTDIR installation root prefix, to support building packages doc/Makefile.in - add an info `dir' file entry for rluserman.info on `make install' - change man1ext to `.1' and man3ext to `.3' - install man pages with a $(man3ext) extension in the target directory - add support for installing html documentation if `htmldir' has a value Makefile.in - on `make install', install from the `shlib' directory, too - on `make uninstall', uninstall in the `doc' and `shlib' subdirectories, too support/shlib-install - add `freebsdelf*', `freebsdaout*', Hurd, `sysv4*', `sysv5*', `dgux*' targets for symlink creation 5/7 --- configure.in, config.h.in - check for , define HAVE_LIMITS_H if found 5/8 --- aclocal.m4 - pick up change to BASH_CHECK_LIB_TERMCAP that adds check for libtinfo (termcap-specific portion of ncurses-5.2) 5/9 --- configure.in - call AC_C_CONST to find out whether or not the compiler supports `const' config.h.in - placeholder for `const' define, if any 5/10 ---- configure.in - fix AC_CHECK_PROG(ar, ...) test to specify right value for the case where ar is not found; should produce a better error message 5/14 ---- configure.in,config.h.in - check for vsnprintf, define HAVE_VSNPRINTF if found 5/21 ---- configure.in, config.h.in - add checks for size_t, ssize_t 5/30 ---- configure.in - update autoconf to version 2.50, use in AC_PREREQ - changed AC_INIT to new flavor - added AC_CONFIG_SRCDIR - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS - call AC_C_PROTOTYPES - AC_RETSIGTYPE -> AC_TYPE_SIGNAL 8/22 ---- configure.in - updated the version number to 4.2a Makefile.in,shlib/Makefile.in - make sure tilde.o is built -DREADLINE_LIBRARY when being built as part of the standalone library, so it picks up the right include files 8/23 ---- support/shlib-install - support for Darwin/MacOS X shared library installation 9/24 ---- examples/readlinebuf.h - a new file, a C++ streambuf interface that uses readline for I/O. Donated by Dimitris Vyzovitis 10/9 ---- configure.in - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ [readline-4.2a-beta1 frozen] 10/15 ----- configure.in, config.h.in - check for , define HAVE_MEMORY_H if found - check for , define HAVE_STRINGS_H if found 10/18 ----- configure.in, config.h.in - check for isascii, define HAVE_ISASCII if found configure.in - changed the macro names from bash as appropriate: BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T 10/22 ----- configure.in - check for isxdigit with AC_CHECK_FUNCS config.h.in - new define for HAVE_ISXDIGIT 10/29 ----- configure.in, config.h.in - check for strpbrk with AC_CHECK_FUNCS, define HAVE_STRPBRK if found 11/1 ---- Makefile.in - make sure DESTDIR is passed to install and uninstall makes in subdirectories - when saving old copies of installed libraries, make sure we use DESTDIR for the old installation tree [readline-4.2a-rc1 frozen] 11/2 ---- Makefile.in, shlib/Makefile.in - don't put -I$(includedir) into CFLAGS 11/15 ----- [readline-4.2a released] 11/20 ----- examples/rlcat.c - new file examples/Makefile.in - changes for rlcat 11/28 ----- configure.in - default TERMCAP_LIB to -lcurses if $prefer_curses == yes (as when --with-curses is supplied) examples/Makefile.in - substitute @LDFLAGS@ in LDFLAGS assignment 11/29 ----- config.h.in - add necessary defines for multibyte include files and functions - add code to define HANDLE_MULTIBYTE if prerequisites are met configure.in - call BASH_CHECK_MULTIBYTE 12/14 ----- config.h.in - add #undef PROTOTYPES, filled in by AC_C_PROTOTYPES 12/17 ----- config.h.in - moved HANDLE_MULTIBYTE code to rlmbutil.h rlmbutil.h, mbutil.c - new files Makefile.in, shlib/Makefile.in - added rules for mbutil.c 12/20 ----- configure.in - added --enable-shared, --enable-static options to configure to say which libraries are built by default (both default to yes) - if SHLIB_STATUS == 'unsupported', turn off default shared library building - substitute new STATIC_TARGET, SHARED_TARGET, STATIC_INSTALL_TARGET, and SHARED_INSTALL_TARGET Makefile.in - `all' target now depends on (substituted) @STATIC_TARGET@ and @SHARED_TARGET@ - `install' target now depends on (substituted) @STATIC_INSTALL_TARGET@ and @SHARED_INSTALL_TARGET@ INSTALL, README - updated with new info about --enable-shared and --enable-static 1/10/2002 --------- configure.in - bumped the library version number to 4.3 1/24 ---- Makefile.in,shlib/Makefile.in - changes for new file, text.c, with character and text handling functions from readline.c 2/20 ---- {configure.config.h}.in - call AC_C_CHAR_UNSIGNED, define __CHAR_UNSIGNED__ if chars are unsigned by default 5/20 ---- doc/Makefile.in - new maybe-clean target that removes the generated documentation if the build directory differs from the source directory - distclean target now depends on maybe-clean 7/17 ---- [readline-4.3 released] 7/18 ---- shlib/Makefile.in - fix bad dependency: text.so: terminal.c, make it depend on text.c 8/7 --- support/shlib-install - break `linux' out into its own stanza: it seems that linux distributions are all moving to the following scheme: libreadline.so.4.3 installed version libreadline.so.4 -> libreadline.so.4.3 symlink libreadline.so -> libreadline.so.4 symlink 10/29 ----- support/shlib-install - change INSTALL_LINK[12] to use `&&' instead of `;' so it only tries the link if the cd succeeds; put ${echo} in there, too - use $LN instead of `ln -s' so it works on machines without symlinks - change special linux stanza to use cd before ln also - change to use $INSTALL_LINK1 and $INSTALL_LINK2 appropriately instead of explicit commands in various stanzas 2/1 --- config.h.in - add HAVE_MBRTOWC and HAVE_MBRLEN - add NO_MULTIBYTE_SUPPORT for new configure argument - add STDC_HEADERS configure.in - new argument --enable-multibyte (enabled by default), allows multibyte support to be turned off even on systems that support it - add check for ansi stdc headers with call to AC_HEADER_STDC 2/3 --- configure.in - add call to BASH_FUNC_CTYPE_NONASCII config.h.in - add CTYPE_NON_ASCII 2/20 ---- doc/manvers.texinfo - renamed to version.texi to match other GNU software - UPDATE-MONTH variable is now `UPDATED-MONTH' doc/{hist,rlman,rluserman}.texinfo - include version.texi doc/{rltech,rluser,hstech,hsuser}.texi - changed the suffix from `texinfo' to `texi' doc/Makefile.in - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi doc/{rlman,rluserman}.texinfo - changed the suffix from `texinfo' to `texi' doc/hist.texinfo - renamed to history.texi to be more consistent 6/11 ---- shlib/Makefile.in - have configure substitute value of `@LDFLAGS@' into the assignment to SHLIB_XLDFLAGS 6/16 ---- configure.in - readline and history libraries are now at version 5.0 8/18 ---- support/shlib-install - support for FreeBSD-gnu (from Robert Millan) 12/4 ---- Makefile.in - add variables for localedir and the PACKAGE_* variables, auto-set by configure 12/9 ---- Makefile.in - use mkinstalldirs instead of mkdirs 4/22 ---- Makefile.in - separate doc install/uninstall out into two new targets: install-doc and uninstall-doc - make install-doc and uninstall-doc prerequisites of appropriate install and uninstall targets examples/rl-fgets.c - new example from Harold Levy that wraps fgets replacement functions that call readline in a shared library that can be interposed with LD_PRELOAD 7/27 ---- [readline-5.0 released] 11/15 ----- examples/rlfe/{ChangeLog,Makefile.in,README,config.h.in,configure,configure.in,extern.h,os.h,pty.c,rlfe.c,screen.h} - new version of rlfe, rlfe-0.4, from Per Bothner; now a standalone application 11/16 ----- shlib/Makefile.in - substitute TERMCAP_LIB in from configure configure.in - if SHLIB_LIBS doesn't include a termcap library (curses, ncurses, termcap, termlib), append the value of $TERMCAP_LIB to it 11/30 ----- configure.in - take out change from 11/16; it doesn't work for some systems (e.g., SunOS 4.x and Solaris 2.6) - add support for --enable-purify configure argument - pass TERMCAP_LIB in environment when calling shobj-conf examples/Makefile.in - add support for building examples with purify 1/23/2005 --------- configure.in - set BUILD_DIR to contain backslashes to escape any spaces in the directory name -- this is what make will accept in targets and prerequisites, so it's better than trying to use double quotes 2/25 ---- configure.in - change check for sys/ptem.h to include sys/stream.h if present, to avoid the `present but cannot be compiled' messages on Solaris and SVR4.2 (does anyone still use SVR4.2?) 5/7 --- configure.in - add cross-compiling support from the bash configure.in, which cygwin and mingw have apparently adopted - add check for pwd.h, fcntl.h - add checks for fcntl, kill system calls - add checks for getpw{ent,nam,uid} C library functions - pass a compile-time option through to Makefiles if cross-compiling config.h.in - add HAVE_PWD_H for , HAVE_FCNTL_H for - add HAVE_FCNTL, HAVE_KILL for respective system calls - add HAVE_GETPW{ENT,NAM,UID} for passwd functions Makefile.in,shlib/Makefile.in - @CROSS_COMPILE@ is substituted into DEFS (equal to -DCROSS_COMPILING if bash is being cross-compiled) 8/2 --- examples/Makefile.in - use $(READLINE_LIB) instead of -lreadline to get around MacOS X 10.4's preference for (incompatible) shared libraries over static libraries in the load path 8/11 ---- support/shobj-conf - new variable: SHLIB_LIBPREF, prefix for shared library name (defaults to `lib' - new variable: SHLIB_DLLVERSION, used on Cygwin to set the library version number - new variable: SHLIB_DOT, separator character between library name and suffix and version information (defaults to `.') - new stanza for cygwin to generate windows-compatible dll support/shlib-install - add new option `-b bindir' for systems like cygwin/windows that require it - new stanza for cygwin that installs a dll into $bindir and an implied link library into $libdir configure.in - substitute new variables from shobj-conf shlib/Makefile.in - substitute bindir, SHLIB_DOT, SHLIB_LIBPREF, SHLIB_DLLVERSION from configure - pass `-b $(bindir)' to shlib-install for install and uninstall targets - library names now use $SHLIB_LIBPREF and $SHLIB_DOT INSTALL,README - document new SHLIB_DOT, SHLIB_LIBPREF, and SHLIB_DLLVERSION variables 10/4 ---- [readline-5.1-beta1 frozen] 12/1 ---- configure.in - changed release status to `release' [readline-5.1 frozen] 12/9 ---- [readline-5.1 released] 12/14 ----- examples/rlfe/Makefile.in - add @LIBS@ to LIBS assignment to pick up extra libraries from configure 1/3/2006 -------- support/shlib-install - Install shared libraries with execute bit set on Linux 6/9 --- [readline-5.2-alpha frozen] 6/26 ---- configure.in - set CROSS_COMPILE to the empty string by default, so we don't inherit a random value from the environment 7/8 --- [readline-5.2-alpha released] [readline-5.2-beta released] 9/12 ---- config.h.in - add defines for wcscoll, iswctype, iswupper, iswlower, towupper, towlower functions - replace define for wctomb with one for wcrtomb - add defines for wchar_t, wint_t, wctype_t types 10/11 ----- [readline-5.2 released] 11/9 ---- examples/rlfe/{configure.in,Makefile.in,config.h.in,rlfe.c,pty.c} - portability fixes from Mike Frysinger 11/21 ----- Makefile.in - add `install-examples' and `uninstall-examples' targets examples/Makefile.in - add correct variables to build examples on Windows - add appropriate rules to install and uninstall example sources in $(datadir)/readline 11/27 ----- config.h.in - move #undef of HAVE_STRCOLL out of config.h.in, since autoconf tries to substitute it based on configure tests 4/27/2007 --------- examples/autoconf - new directory with example autoconf macros to detect readline and return information about the installed version 6/13 ---- support/shlib-install - changes to support AIX 5.x shared library installation 3/20/2008 --------- support/shlib-install - add support for NetBSD and Interix shared library installation 4/22 ---- support/wcwidth.c - updated implementation from 2007-05 7/18 ---- support/shlib-install - support for mingw32, contributed by Carlo Bramix 8/4 --- configure.in - changed to readline-6.0 8/18 ---- support/config.{guess,sub} - updated to newer versions from autoconf-2.62 distribution 3/5/2009 -------- support/shlib-install - take a new -V host_vendor argument - add ${host_vendor} to string tested in case statement for symlink creation section - add support for FreeBSD/gentoo, which uses Linux library naming scheme - change FreeBSD symlink rules, since FreeBSD 7+ has only ELF shared libraries. DragonflyBSD rules are the same. Fix from Timothy Redaelli shlib/Makefile.in - add definition of host_vendor, substituted by configure - add -V host_vendor argument to all invocations of shlib-install. Fix from Timothy Redaelli 3/10 ---- configure.in - add call to AC_SYS_LARGEFILE for readdir and largefile support on Linux config.h.in - add _FILE_OFFSET_BITS define 4/19 ---- Makefile.in - add targets for making and installing documentation required by GNU coding standards. Fix from Joseph Myers posixselect.h - pick up from bash. Inspired by Mike Frysinger 10/28 ----- support/shlib-install - decrease the default version of FreeBSD that installs shared libraries to 4.x. Advice from Peter Jeremy 12/18 ----- [readline-6.1-rc1 released] 12/23 ----- doc/Makefile.in - make sure $(topdir) is not ".." before removing all of the formatted documentation in `make distclean'. $(topdir) is set to `..' if readline is being built in the source directory. Fixes problem noticed by THOUMIN Damien 12/29 ----- [readline-6.1 frozen] 2/5/2010 -------- examples/Makefile.in - make sure to install example C files using $(srcdir)/$$f in case we're building outside the source directory. Bug report and fix from Peter Breitenlohner 7/25 ---- xfree.c - new file with xfree() implementation, moved from xmalloc.c 12/28 ----- {examples,shlib}/Makefile.in - Cygwin-based changes from Eric Blake 3/26/2011 --------- Makefile.in - don't ignore failures when building, installing, or cleaning in the shlib subdirectory. Sample patch from Mike Frysinger shlib/Makefile.in - split the install and uninstall targets into install-supported and install-unsupported targets that depend on the value of SHLIB_STATUS 4/2 --- {,shlib}/Makefile.in - add dependency for callback.o/callback.so on xmalloc.h. From Jan Kratochvil {,doc,examples,shlib}/Makefile.in - fix typo: htm target should be html. From Jan Kratochvil - remove `.' from VPATH. From Jan Kratochvil examples/rlfe/configure.in - quote AC_PROGRAM_SOURCE. From Jan Kratochvil 5/17 ---- config.h.in - WCWIDTH_BROKEN: new define, picked up from bash, defined on systems where wcwidth returns 1 for Unicode combining characters 11/28 ----- support/shlib-install - make sure solaris2 systems make the installed shared library executable. ldd warns about it otherwise. Bug and fix from Tim Mooney examples/hist_erasedups.c - new example program, shows how to erase duplicates from the history list examples/hist_purgecmd.c - new example program, shows how to remove all entries matching a string or pattern from the history list 1/12/2012 --------- colors.[ch],parse-colors.[ch]} - new files, part of color infrastructure support Makefile.in,shlib/Makefile.in - arrange to have colors.o and parse-colors.o added to library (static and shared versions) {configure,config.h}.in - check for stdbool.h, define HAVE_STDBOOL_H if found rldefs.h - COLOR_SUPPORT: if defined, compile in colors.c and parse-colors.c for color support 1/18 ---- {configure,config.h}.in - new check: check for AUDIT_USER_TTY defined in , define HAVE_DECL_AUDIT_USER_TTY if both are found 8/7 --- configure.in - AC_CANONICAL_BUILD: call to set the build_xxx variables - use $build_os instead of $host_os to decide when DJGPP should run `pwd.exe' to figure out the build directory. Report and fix from Yao Qi 8/29 ---- configure.ac - new name for configure.in MANIFEST,Makefile.in - configure.in -> configure.ac 1/5/2013 -------- configure.ac - move version number up to 6.3 1/31 ---- configure.ac - use AC_CHECK_TOOL instead of AC_CHECK_PROG to check for ar, since it will find $host-prefixed versions of utilities. Report and fix from Mike Frysinger 3/4 --- Makefile.in - PACKAGE_TARNAME, docdir: new variables substituted by autoconf - OTHER_DOCS,OTHER_INSTALLED_DOCS: new variables with auxiliary documentation files to be installed into $(docdir) - install: add new rule to install $(OTHER_DOCS) - uninstall: add new rule to uninstall $(docdir)/$(OTHER_INSTALLED_DOCS) 4/29 ---- Makefile.in - installdirs: make sure to create $(DESTDIR)$(docdir). Report from 1/27/2014 --------- Makefile.in - install-examples: should not depend on `shared', since the examples themselves are not built using shared libraries. Report from support/shobj-conf - [from bash] darwin: changed the install_name embedded into the shared library to contain only the major version number, not the minor one. The idea is that the minor versions should all be API/ABI compatible, and it is better to link automatically with the latest one. Idea from Max Horn 2/26/2014 --------- [readline-6.3 released] 3/14 ---- shlib/Makefile.in - fix typo in dependency list for vi_mode.so: it should not depend on just $(topdir). Report and fix from Natanael Copa 4/15 ---- {.,shlib,examples}/Makefile.in - make sure $(INCLUDES) appears before $(CPPFLAGS) in the various CFLAGS assignments so readline looks in its own source and build directories (INCLUDES) before some directories specified by the user or builder (CPPFLAGS). Report and fix from Max Horn 6/2 --- config.h.in - use correct symbols: HAVE_STRUCT_DIRENT_D_INO, HAVE_STRUCT_DIRENT_D_FILENO HAVE_STRUCT_DIRENT_D_NAMLEN. They don't really matter, but they are what posixdir.h looks for. Report from Ross Burton 6/11 ---- readline.pc.in - new file, config file for pkgconfig. Patch to add from Jirka Klimes {MANIFEST,configure.ac,Makefile.in} - readline.pc: changes to create file for pkgconfig 10/13 ----- doc/Makefile.in - readline.pdf, history.pdf, rluserman.pdf: use texi2dvi --pdf to generate these. Suggestion from Siep Kroonenberg 11/29 ----- config.h.in - HAVE_PSELECT: define if pselect(2) available configure.ac - check for pselect(2), define HAVE_PSELECT if found 12/29 ----- configure.ac - bump version number up to 6.4 1/6/2015 -------- configure.ac,config.h.in - look for ncurses/termcap.h, define HAVE_NCURSES_TERMCAP_H 4/20 ---- configure.ac - add template definitions set by AC_USE_SYSTEM_EXTENSIONS from a report from Andreas Schwab 4/24 ---- configure.ac,config.h.in - add check for sys/ioctl.h to AC_CHECK_HEADERS, define HAVE_SYS_IOCTL_H if found 5/29 ---- configure.ac - bump library version to 7.0 because of addition of rl_callback_sigcleanup 8/26 ---- configure.ac,Makefile.in,examples/Makefile.in - remove references to purify 11/21 ----- configure.ac,config.h.in - fnmatch: check for libc function, define HAVE_FNMATCH if found. Now used by vi-mode history search functions 7/12 ---- Makefile.in,examples/Makefile.in - add support for building with address sanitizer, using new target `asan' 4/23/2018 --------- configure.ac - TERMCAP_PKG_CONFIG_LIB: new variable, defined from TERMCAP_LIB, defaults to termcap readline.pc.in - change Requires.private to use TERMCAP_PKG_CONFIG_LIB instead of hardcoded `tinfo'. Report and fix from Thomas Petazzoni 5/4 --- Makefile.in - new targets to install and uninstall the `readline.pc' pkgconfig file - install-{static,shared}: add install-pc to the list of prereqs - uninstall{,-shared}: add uninstall-pc to list of prereqs. Change from Thomas Petazzoni configure.ac,Makefile.in - add new configure option to optionally disable installing the source code examples. From Thomas Petazzoni 5/23 ---- Makefile.in - install-pc: make sure we install readline.pc into an existing pkgconfig directory. Report from ilove zfs 5/24 ---- Makefile.in - installdirs: create $(pkgconfigdir) if it doesn't exist 4/8/2019 -------- readline.pc.in - change CFLAGS to include ${includedir} instead of ${includedir}/readline, to support the recommended `#include '. Report and fix from Andrea Bolognani 5/13 ---- configure.ac - hpux: add -DTGETENT_BROKEN to LOCAL_CFLAGS 8/28 ---- configure.ac - hpux: add -DTGETFLAG_BROKEN to LOCAL_CFLAGS 9/6 --- examples/autoconf/RL_LIB_READLINE_VERSION - include in the AC_TRY_RUN block to accommodate compilers that treat functions without an existing prototype as fatal errors. Report and fix from Florian Weimer 12/13 ----- support/shlib-install - remove old code for FreeBSD and Dragonfly; they are ELF-only now and can use the same code as Linux. Fix from Baptiste Daroussin 5/20/2020 --------- configure.ac - bumped version number up to 8.1 6/15 ---- configure.ac - add -Wno-parentheses -Wno-format-security to CFLAGS if gcc (or clang) is the compiler 10/29 ----- configure.ac - --enable-bracketed-paste-default: new invocation option, toggles the default value of enable-bracketed-paste (on by default) INSTALL - document new --enable-bracketed-paste-default configure option 12/4 ---- [readline-8.1 frozen] 8/17/2021 --------- configure.ac - use `:+' when testing the value of $GCC, since autoconf seems to set it to the empty string if gcc isn't the compiler. Reported by Osipov, Michael (LDA IT PLM) 9/2 --- configure.ac - AC_HELP_STRING -> AS_HELP_STRING - AC_OUTPUT: split into AC_CONFIG_FILES and AC_CONFIG_COMMANDS, call AC_OUTPUT without any parameters 9/3 --- configure.ac, config.h.in - AC_TYPE_SIGNAL,BASH_TYPE_SIGHANDLER: remove calls, remove mention of RETSIGTYPE and VOID_SIGHANDLER - AC_HEADER_TIME: removed - AC_USE_SYSTEM_EXTENSIONS: use instead of AC_AIX and AC_MINIX - AC_HEADER_STDC: removed - BASH_FUNC_CTYPE_NONASCII: removed 11/25 ----- history.pc.in - pkgconfig file for history library. From Siteshwar Vashisht configure.ac,MANIFEST,Makefile.in - support for creating history.pc 3/29/2022 --------- configure.ac - new option: --with-shared-termcap-library: use to force the shared readline library to be linked against a shared termcap/curses library that configure finds. If the argument begins with `-l', use that library instead; updated INSTALL accordingly 11/25/2022 ---------- gettimeofday.c - add file from bash's lib/sh/gettimeofday.c, only compiled in if HAVE_GETTIMEOFDAY is not defined Makefile.in - gettimeofday.o: link in, it will not define any symbols if HAVE_GETTIMEOFDAY is defined. This is for systems like _WIN32 that don't have gettimeofday() 3/6/2024 -------- config.h.in - added more defines that bash aclocal.m4 BASH_CHECK_MULTIBYTE checks for 5/10 ---- examples/rlfe - lots of updates to configure.ac to make it build on modern systems and more-or-less work with autoconf-2.72 (still warnings about obsolete macros) - add prototypes and declarations to pty.c 5/11 ---- configure.ac - AC_PROG_GCC_TRADITIONAL: remove - need to note in CHANGES that configure now supports --enable-year2038. THIS IS AN ABI CHANGE IF YOU ENABLE IT 7/7 --- configure.ac - add ncursesw as a possible value for TERMCAP_PKG_CONFIG_LIB, with corresponding changes to aclocal.m4, which is shared with bash 7/24 ---- configure.ac,Makefile.in - STYLE_CFLAGS: set like bash if we're using gcc or clang; add to CCFLAGS so we can compile -Wno-parentheses by default readline-8.3/keymaps.c000644 000436 000024 00000007750 13207062672 015063 0ustar00chetstaff000000 000000 /* keymaps.c -- Functions and keymaps for the GNU Readline library. */ /* Copyright (C) 1988,1989-2009,2017 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include /* for FILE * definition for readline.h */ #include "readline.h" #include "rlconf.h" #include "emacs_keymap.c" #if defined (VI_MODE) #include "vi_keymap.c" #endif #include "xmalloc.h" /* **************************************************************** */ /* */ /* Functions for manipulating Keymaps. */ /* */ /* **************************************************************** */ /* Return a new, empty keymap. Free it with free() when you are done. */ Keymap rl_make_bare_keymap (void) { register int i; Keymap keymap; keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); for (i = 0; i < KEYMAP_SIZE; i++) { keymap[i].type = ISFUNC; keymap[i].function = (rl_command_func_t *)NULL; } #if 0 for (i = 'A'; i < ('Z' + 1); i++) { keymap[i].type = ISFUNC; keymap[i].function = rl_do_lowercase_version; } #endif return (keymap); } /* A convenience function that returns 1 if there are no keys bound to functions in KEYMAP */ int rl_empty_keymap (Keymap keymap) { int i; for (i = 0; i < ANYOTHERKEY; i++) { if (keymap[i].type != ISFUNC || keymap[i].function) return 0; } return 1; } /* Return a new keymap which is a copy of MAP. Just copies pointers, does not copy text of macros or descend into child keymaps. */ Keymap rl_copy_keymap (Keymap map) { register int i; Keymap temp; temp = rl_make_bare_keymap (); for (i = 0; i < KEYMAP_SIZE; i++) { temp[i].type = map[i].type; temp[i].function = map[i].function; } return (temp); } /* Return a new keymap with the printing characters bound to rl_insert, the uppercase Meta characters bound to run their lowercase equivalents, and the Meta digits bound to produce numeric arguments. */ Keymap rl_make_keymap (void) { register int i; Keymap newmap; newmap = rl_make_bare_keymap (); /* All ASCII printing characters are self-inserting. */ for (i = ' '; i < 127; i++) newmap[i].function = rl_insert; newmap[TAB].function = rl_insert; newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */ newmap[CTRL('H')].function = rl_rubout; #if KEYMAP_SIZE > 128 /* Printing characters in ISO Latin-1 and some 8-bit character sets. */ for (i = 128; i < 256; i++) newmap[i].function = rl_insert; #endif /* KEYMAP_SIZE > 128 */ return (newmap); } /* Free the storage associated with MAP. */ void rl_discard_keymap (Keymap map) { int i; if (map == 0) return; for (i = 0; i < KEYMAP_SIZE; i++) { switch (map[i].type) { case ISFUNC: break; case ISKMAP: rl_discard_keymap ((Keymap)map[i].function); xfree ((char *)map[i].function); break; case ISMACR: xfree ((char *)map[i].function); break; } } } /* Convenience function that discards, then frees, MAP. */ void rl_free_keymap (Keymap map) { rl_discard_keymap (map); xfree ((char *)map); } readline-8.3/doc/000755 000436 000024 00000000000 15030514143 013771 5ustar00chetstaff000000 000000 readline-8.3/readline.c000644 000436 000024 00000131761 15020315136 015164 0ustar00chetstaff000000 000000 /* readline.c -- a general facility for reading lines of input with emacs style editing and completion. */ /* Copyright (C) 1987-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include "posixstat.h" #include #if defined (HAVE_SYS_FILE_H) # include #endif /* HAVE_SYS_FILE_H */ #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_LOCALE_H) # include #endif #include #include "posixjmp.h" #include #if !defined (errno) extern int errno; #endif /* !errno */ /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "rlmbutil.h" #if defined (__EMX__) # define INCL_DOSPROCESS # include #endif /* __EMX__ */ /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "rlshell.h" #include "xmalloc.h" #if defined (COLOR_SUPPORT) # include "parse-colors.h" #endif #ifndef RL_LIBRARY_VERSION # define RL_LIBRARY_VERSION "8.1" #endif #ifndef RL_READLINE_VERSION # define RL_READLINE_VERSION 0x0801 #endif /* Forward declarations used in this file. */ static char *readline_internal (void); static void readline_initialize_everything (void); static void run_startup_hooks (void); static void bind_arrow_keys_internal (Keymap); static void bind_arrow_keys (void); static void bind_bracketed_paste_prefix (void); static void readline_default_bindings (void); static void reset_default_bindings (void); static int _rl_subseq_result (int, Keymap, int, int); static int _rl_subseq_getchar (int); /* **************************************************************** */ /* */ /* Line editing input utility */ /* */ /* **************************************************************** */ const char *rl_library_version = RL_LIBRARY_VERSION; int rl_readline_version = RL_READLINE_VERSION; /* True if this is `real' readline as opposed to some stub substitute. */ int rl_gnu_readline_p = 1; /* A pointer to the keymap that is currently in use. By default, it is the standard emacs keymap. */ Keymap _rl_keymap = emacs_standard_keymap; /* The current style of editing. */ int rl_editing_mode = emacs_mode; /* The current insert mode: input (the default) or overwrite */ int rl_insert_mode = RL_IM_DEFAULT; /* Non-zero if we called this function from _rl_dispatch(). It's present so functions can find out whether they were called from a key binding or directly from an application. */ int rl_dispatching; /* Non-zero if the previous command was a kill command. */ int _rl_last_command_was_kill = 0; /* The current value of the numeric argument specified by the user. */ int rl_numeric_arg = 1; /* Non-zero if an argument was typed. */ int rl_explicit_arg = 0; /* Temporary value used while generating the argument. */ int rl_arg_sign = 1; /* Non-zero means we have been called at least once before. */ static int rl_initialized; #if 0 /* If non-zero, this program is running in an EMACS buffer. */ static int running_in_emacs; #endif /* Flags word encapsulating the current readline state. */ unsigned long rl_readline_state = RL_STATE_NONE; /* The current offset in the current input line. */ int rl_point; /* Mark in the current input line. */ int rl_mark; /* Length of the current input line. */ int rl_end; /* Make this non-zero to return the current input_line. */ int rl_done; /* If non-zero when readline_internal returns, it means we found EOF */ int rl_eof_found = 0; /* The last function executed by readline. */ rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL; /* Top level environment for readline_internal (). */ procenv_t _rl_top_level; /* The streams we interact with. */ FILE *_rl_in_stream, *_rl_out_stream; /* The names of the streams that we do input and output to. */ FILE *rl_instream = (FILE *)NULL; FILE *rl_outstream = (FILE *)NULL; /* Non-zero means echo characters as they are read. Defaults to no echo; set to 1 if there is a controlling terminal, we can get its attributes, and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings for the code that sets it. */ int _rl_echoing_p = 0; /* Current prompt. */ char *rl_prompt = (char *)NULL; int rl_visible_prompt_length = 0; /* Set to non-zero by calling application if it has already printed rl_prompt and does not want readline to do it the first time. */ int rl_already_prompted = 0; /* The number of characters read in order to type this complete command. */ int rl_key_sequence_length = 0; /* If non-zero, then this is the address of a function to call just before readline_internal_setup () prints the first prompt. */ rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL; /* Any readline function can set this and have it run just before the user's rl_startup_hook. */ rl_hook_func_t *_rl_internal_startup_hook = (rl_hook_func_t *)NULL; /* If non-zero, this is the address of a function to call just before readline_internal_setup () returns and readline_internal starts reading input characters. */ rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL; /* What we use internally. You should always refer to RL_LINE_BUFFER. */ static char *the_line; /* The character that can generate an EOF. Really read from the terminal driver... just defaulted here. */ int _rl_eof_char = CTRL ('D'); /* Non-zero makes this the next keystroke to read. */ int rl_pending_input = 0; /* Pointer to a useful terminal name. */ const char *rl_terminal_name = (const char *)NULL; /* Non-zero means to always use horizontal scrolling in line display. */ int _rl_horizontal_scroll_mode = 0; /* Non-zero means to display an asterisk at the starts of history lines which have been modified. */ int _rl_mark_modified_lines = 0; /* The style of `bell' notification preferred. This can be set to NO_BELL, AUDIBLE_BELL, or VISIBLE_BELL. */ int _rl_bell_preference = AUDIBLE_BELL; /* String inserted into the line by rl_insert_comment (). */ char *_rl_comment_begin; /* Keymap holding the function currently being executed. */ Keymap rl_executing_keymap; /* The function currently being executed. */ rl_command_func_t *_rl_executing_func; /* Keymap we're currently using to dispatch. */ Keymap _rl_dispatching_keymap; /* Non-zero means to erase entire line, including prompt, on empty input lines. */ int rl_erase_empty_line = 0; /* Non-zero means to read only this many characters rather than up to a character bound to accept-line. */ int rl_num_chars_to_read = 0; /* Line buffer and maintenance. */ char *rl_line_buffer = (char *)NULL; int rl_line_buffer_len = 0; /* Key sequence `contexts' */ _rl_keyseq_cxt *_rl_kscxt = 0; int rl_executing_key; char *rl_executing_keyseq = 0; size_t _rl_executing_keyseq_size = 0; struct _rl_cmd _rl_pending_command; struct _rl_cmd *_rl_command_to_execute = (struct _rl_cmd *)NULL; /* Timeout (specified in milliseconds) when reading characters making up an ambiguous multiple-key sequence */ int _rl_keyseq_timeout = 500; #define RESIZE_KEYSEQ_BUFFER() \ do \ { \ if (rl_key_sequence_length + 2 >= _rl_executing_keyseq_size) \ { \ _rl_executing_keyseq_size += 16; \ rl_executing_keyseq = xrealloc (rl_executing_keyseq, _rl_executing_keyseq_size); \ } \ } \ while (0); /* Forward declarations used by the display, termcap, and history code. */ /* **************************************************************** */ /* */ /* `Forward' declarations */ /* */ /* **************************************************************** */ /* Non-zero means do not parse any lines other than comments and parser directives. */ unsigned char _rl_parsing_conditionalized_out = 0; /* Non-zero means to convert characters with the meta bit set to escape-prefixed characters so we can indirect through emacs_meta_keymap or vi_escape_keymap. */ int _rl_convert_meta_chars_to_ascii = 1; /* Non-zero means to output characters with the meta bit set directly rather than as a meta-prefixed escape sequence. */ int _rl_output_meta_chars = 0; /* Non-zero means to look at the termios special characters and bind them to equivalent readline functions at startup. */ int _rl_bind_stty_chars = 1; /* Non-zero means to go through the history list at every newline (or whenever rl_done is set and readline returns) and revert each line to its initial state. */ int _rl_revert_all_at_newline = 0; /* Non-zero means to honor the termios ECHOCTL bit and echo control characters corresponding to keyboard-generated signals. */ int _rl_echo_control_chars = 1; /* Non-zero means to prefix the displayed prompt with a character indicating the editing mode: @ for emacs, : for vi-command, + for vi-insert. */ int _rl_show_mode_in_prompt = 0; /* Non-zero means to attempt to put the terminal in `bracketed paste mode', where it will prefix pasted text with an escape sequence and send another to mark the end of the paste. */ int _rl_enable_bracketed_paste = BRACKETED_PASTE_DEFAULT; int _rl_enable_active_region = BRACKETED_PASTE_DEFAULT; /* **************************************************************** */ /* */ /* Top Level Functions */ /* */ /* **************************************************************** */ /* Non-zero means treat 0200 bit in terminal input as Meta bit. */ int _rl_meta_flag = 0; /* Forward declaration */ /* Set up the prompt and expand it. Called from readline() and rl_callback_handler_install (). */ int rl_set_prompt (const char *prompt) { FREE (rl_prompt); rl_prompt = prompt ? savestring (prompt) : (char *)NULL; rl_display_prompt = rl_prompt ? rl_prompt : ""; rl_visible_prompt_length = rl_expand_prompt (rl_prompt); return 0; } /* Read a line of input. Prompt with PROMPT. An empty PROMPT means none. A return value of NULL means that EOF was encountered. */ char * readline (const char *prompt) { char *value; #if 0 int in_callback; #endif /* If we are at EOF return a NULL string. */ if (rl_pending_input == EOF) { rl_clear_pending_input (); return ((char *)NULL); } #if 0 /* If readline() is called after installing a callback handler, temporarily turn off the callback state to avoid ensuing messiness. Patch supplied by the gdb folks. XXX -- disabled. This can be fooled and readline left in a strange state by a poorly-timed longjmp. */ if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK)) RL_UNSETSTATE (RL_STATE_CALLBACK); #endif rl_set_prompt (prompt); rl_initialize (); if (rl_prep_term_function) (*rl_prep_term_function) (_rl_meta_flag); #if defined (HANDLE_SIGNALS) rl_set_signals (); #endif value = readline_internal (); if (rl_deprep_term_function) (*rl_deprep_term_function) (); #if defined (HANDLE_SIGNALS) rl_clear_signals (); #endif #if 0 if (in_callback) RL_SETSTATE (RL_STATE_CALLBACK); #endif #if HAVE_DECL_AUDIT_USER_TTY && defined (HAVE_LIBAUDIT_H) && defined (ENABLE_TTY_AUDIT_SUPPORT) if (value) _rl_audit_tty (value); #endif return (value); } static void run_startup_hooks (void) { if (rl_startup_hook) (*rl_startup_hook) (); if (_rl_internal_startup_hook) (*_rl_internal_startup_hook) (); } #if defined (READLINE_CALLBACKS) # define STATIC_CALLBACK #else # define STATIC_CALLBACK static #endif STATIC_CALLBACK void readline_internal_setup (void) { char *nprompt; _rl_in_stream = rl_instream; _rl_out_stream = rl_outstream; /* Enable the meta key only for the duration of readline(), if this terminal has one and the terminal has been initialized */ if (_rl_enable_meta & RL_ISSTATE (RL_STATE_TERMPREPPED)) _rl_enable_meta_key (); run_startup_hooks (); rl_deactivate_mark (); #if defined (VI_MODE) if (rl_editing_mode == vi_mode) rl_vi_insertion_mode (1, 'i'); /* don't want to reset last */ else #endif /* VI_MODE */ if (_rl_show_mode_in_prompt) _rl_reset_prompt (); /* If we're not echoing, we still want to at least print a prompt, because rl_redisplay will not do it for us. If the calling application has a custom redisplay function, though, let that function handle it. */ if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay) { if (rl_prompt && rl_already_prompted == 0) { nprompt = _rl_strip_prompt (rl_prompt); fprintf (_rl_out_stream, "%s", nprompt); fflush (_rl_out_stream); xfree (nprompt); } } else { if (rl_prompt && rl_already_prompted) rl_on_new_line_with_prompt (); else rl_on_new_line (); (*rl_redisplay_function) (); } if (rl_pre_input_hook) (*rl_pre_input_hook) (); RL_CHECK_SIGNALS (); } STATIC_CALLBACK void readline_common_teardown (void) { char *temp; HIST_ENTRY *entry; /* Restore the original of this history line, iff the line that we are editing was originally in the history, AND the line has changed. */ entry = current_history (); /* We don't want to do this if we executed functions that call history_set_pos to set the history offset to the line containing the non-incremental search string. */ if (entry && rl_undo_list) { temp = savestring (the_line); rl_revert_line (1, 0); entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL); _rl_free_history_entry (entry); strcpy (the_line, temp); xfree (temp); } if (_rl_revert_all_at_newline) _rl_revert_all_lines (); /* At any rate, it is highly likely that this line has an undo list. Get rid of it now. */ if (rl_undo_list) rl_free_undo_list (); } STATIC_CALLBACK char * readline_internal_teardown (int eof) { RL_CHECK_SIGNALS (); if (eof) RL_SETSTATE (RL_STATE_EOF); /* XXX */ readline_common_teardown (); /* Disable the meta key, if this terminal has one and we were told to use it. The check whether or not we sent the enable string is in _rl_disable_meta_key(); the flag is set in _rl_enable_meta_key */ _rl_disable_meta_key (); /* Restore normal cursor, if available. */ _rl_set_insert_mode (RL_IM_INSERT, 0); return (eof ? (char *)NULL : savestring (the_line)); } void _rl_internal_char_cleanup (void) { if (_rl_keep_mark_active) _rl_keep_mark_active = 0; else if (rl_mark_active_p ()) rl_deactivate_mark (); #if defined (VI_MODE) /* In vi mode, when you exit insert mode, the cursor moves back over the previous character. We explicitly check for that here. */ if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) rl_vi_check (); #endif /* VI_MODE */ #if defined (HANDLE_MULTIBYTE) if (rl_num_chars_to_read && _rl_mbstrlen (rl_line_buffer) >= rl_num_chars_to_read) #else if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read) #endif { (*rl_redisplay_function) (); _rl_want_redisplay = 0; rl_newline (1, '\n'); } if (rl_done == 0) { (*rl_redisplay_function) (); _rl_want_redisplay = 0; } /* If the application writer has told us to erase the entire line if the only character typed was something bound to rl_newline, do so. */ if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline && rl_point == 0 && rl_end == 0) _rl_erase_entire_line (); } STATIC_CALLBACK int #if defined (READLINE_CALLBACKS) readline_internal_char (void) #else readline_internal_charloop (void) #endif { static int lastc, eof_found; int c, code, lk, r; static procenv_t olevel; lastc = EOF; #if !defined (READLINE_CALLBACKS) eof_found = 0; while (rl_done == 0) { #endif lk = _rl_last_command_was_kill; /* Save and restore _rl_top_level even though most of the time it doesn't matter. */ memcpy ((void *)olevel, (void *)_rl_top_level, sizeof (procenv_t)); #if defined (HAVE_POSIX_SIGSETJMP) code = sigsetjmp (_rl_top_level, 0); #else code = setjmp (_rl_top_level); #endif if (code) { (*rl_redisplay_function) (); _rl_want_redisplay = 0; if (RL_ISSTATE (RL_STATE_CALLBACK)) memcpy ((void *)_rl_top_level, (void *)olevel, sizeof (procenv_t)); /* If we longjmped because of a timeout, handle it here. */ if (RL_ISSTATE (RL_STATE_TIMEOUT)) { RL_SETSTATE (RL_STATE_DONE); return (rl_done = 1); } /* If we get here, we're not being called from something dispatched from _rl_callback_read_char(), which sets up its own value of _rl_top_level (saving and restoring the old, of course), so we can just return here. */ if (RL_ISSTATE (RL_STATE_CALLBACK)) return (0); } if (rl_pending_input == 0) { /* Then initialize the argument and number of keys read. */ _rl_reset_argument (); rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; } RL_SETSTATE(RL_STATE_READCMD); c = rl_read_key (); RL_UNSETSTATE(RL_STATE_READCMD); /* look at input.c:rl_getc() for the circumstances under which this will be returned; punt immediately on read error without converting it to a newline; assume that rl_read_key has already called the signal handler. */ if (c == READERR) { #if defined (READLINE_CALLBACKS) RL_SETSTATE(RL_STATE_DONE); return (rl_done = 1); #else RL_SETSTATE(RL_STATE_EOF); eof_found = 1; break; #endif } /* EOF typed to a non-blank line is ^D the first time, EOF the second time in a row. This won't return any partial line read from the tty. If we want to change this, to force any existing line to be returned when read(2) reads EOF, for example, this is the place to change. */ if (c == EOF && rl_end) { if (RL_SIG_RECEIVED ()) { RL_CHECK_SIGNALS (); if (rl_signal_event_hook) (*rl_signal_event_hook) (); /* XXX */ } /* XXX - reading two consecutive EOFs returns EOF */ if (RL_ISSTATE (RL_STATE_TERMPREPPED)) { if (lastc == _rl_eof_char || lastc == EOF) rl_end = 0; else c = _rl_eof_char; } else c = NEWLINE; } /* The character _rl_eof_char typed to blank line, and not as the previous character is interpreted as EOF. This doesn't work when READLINE_CALLBACKS is defined, so hitting a series of ^Ds will erase all the chars on the line and then return EOF. */ if (((c == _rl_eof_char && lastc != c) || c == EOF) && rl_end == 0) { #if defined (READLINE_CALLBACKS) RL_SETSTATE(RL_STATE_DONE); return (rl_done = 1); #else RL_SETSTATE(RL_STATE_EOF); eof_found = 1; break; #endif } lastc = c; r = _rl_dispatch ((unsigned char)c, _rl_keymap); RL_CHECK_SIGNALS (); if (_rl_command_to_execute) { (*rl_redisplay_function) (); rl_executing_keymap = _rl_command_to_execute->map; rl_executing_key = _rl_command_to_execute->key; _rl_executing_func = _rl_command_to_execute->func; rl_dispatching = 1; RL_SETSTATE(RL_STATE_DISPATCHING); r = (*(_rl_command_to_execute->func)) (_rl_command_to_execute->count, _rl_command_to_execute->key); _rl_command_to_execute = 0; RL_UNSETSTATE(RL_STATE_DISPATCHING); rl_dispatching = 0; RL_CHECK_SIGNALS (); } /* If there was no change in _rl_last_command_was_kill, then no kill has taken place. Note that if input is pending we are reading a prefix command, so nothing has changed yet. */ if (rl_pending_input == 0 && lk == _rl_last_command_was_kill) _rl_last_command_was_kill = 0; _rl_internal_char_cleanup (); #if defined (READLINE_CALLBACKS) memcpy ((void *)_rl_top_level, (void *)olevel, sizeof (procenv_t)); return 0; #else } return (eof_found); #endif } #if defined (READLINE_CALLBACKS) static int readline_internal_charloop (void) { int eof = 1; while (rl_done == 0) eof = readline_internal_char (); return (eof); } #endif /* READLINE_CALLBACKS */ /* Read a line of input from the global rl_instream, doing output on the global rl_outstream. If rl_prompt is non-null, then that is our prompt. */ static char * readline_internal (void) { readline_internal_setup (); rl_eof_found = readline_internal_charloop (); return (readline_internal_teardown (rl_eof_found)); } void _rl_init_line_state (void) { rl_point = rl_end = rl_mark = 0; the_line = rl_line_buffer; the_line[0] = 0; } void _rl_set_the_line (void) { the_line = rl_line_buffer; } #if defined (READLINE_CALLBACKS) _rl_keyseq_cxt * _rl_keyseq_cxt_alloc (void) { _rl_keyseq_cxt *cxt; cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt)); cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0; cxt->okey = 0; cxt->ocxt = _rl_kscxt; cxt->childval = 42; /* sentinel value */ return cxt; } void _rl_keyseq_cxt_dispose (_rl_keyseq_cxt *cxt) { xfree (cxt); } void _rl_keyseq_chain_dispose (void) { _rl_keyseq_cxt *cxt; while (_rl_kscxt) { cxt = _rl_kscxt; _rl_kscxt = _rl_kscxt->ocxt; _rl_keyseq_cxt_dispose (cxt); } } #endif static int _rl_subseq_getchar (int key) { int k; if (key == ESC) RL_SETSTATE(RL_STATE_METANEXT); RL_SETSTATE(RL_STATE_MOREINPUT); k = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (key == ESC) RL_UNSETSTATE(RL_STATE_METANEXT); return k; } #if defined (READLINE_CALLBACKS) int _rl_dispatch_callback (_rl_keyseq_cxt *cxt) { int nkey, r; /* For now */ /* The first time this context is used, we want to read input and dispatch on it. When traversing the chain of contexts back `up', we want to use the value from the next context down. We're simulating recursion using a chain of contexts. */ if ((cxt->flags & KSEQ_DISPATCHED) == 0) { nkey = _rl_subseq_getchar (cxt->okey); if (nkey < 0) { _rl_abort_internal (); return -1; } r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg); cxt->flags |= KSEQ_DISPATCHED; } else r = cxt->childval; /* For now */ if (r != -3) /* don't do this if we indicate there will be other matches */ r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); RL_CHECK_SIGNALS (); /* We only treat values < 0 specially to simulate recursion. */ if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */ { _rl_keyseq_chain_dispose (); RL_UNSETSTATE (RL_STATE_MULTIKEY); return r; } if (r != -3) /* magic value that says we added to the chain */ _rl_kscxt = cxt->ocxt; if (_rl_kscxt) _rl_kscxt->childval = r; if (r != -3) _rl_keyseq_cxt_dispose (cxt); return r; } #endif /* READLINE_CALLBACKS */ /* Do the command associated with KEY in MAP. If the associated command is really a keymap, then read another key, and dispatch into that map. */ int _rl_dispatch (register int key, Keymap map) { _rl_dispatching_keymap = map; return _rl_dispatch_subseq (key, map, 0); } int _rl_dispatch_subseq (register int key, Keymap map, int got_subseq) { int r, newkey; char *macro; rl_command_func_t *func; #if defined (READLINE_CALLBACKS) _rl_keyseq_cxt *cxt; #endif if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) { if (map[ESC].type == ISKMAP) { if (RL_ISSTATE (RL_STATE_MACRODEF)) _rl_add_macro_char (ESC); RESIZE_KEYSEQ_BUFFER (); rl_executing_keyseq[rl_key_sequence_length++] = ESC; map = FUNCTION_TO_KEYMAP (map, ESC); key = UNMETA (key); return (_rl_dispatch (key, map)); } else rl_ding (); return 0; } if (RL_ISSTATE (RL_STATE_MACRODEF)) _rl_add_macro_char (key); r = 0; switch (map[key].type) { case ISFUNC: func = map[key].function; if (func) { /* Special case rl_do_lowercase_version (). */ if (func == rl_do_lowercase_version) { /* Should we do anything special if key == ANYOTHERKEY? */ newkey = _rl_to_lower ((unsigned char)key); if (newkey != key) return (_rl_dispatch (newkey, map)); else { rl_ding (); /* gentle failure */ return 0; } } rl_executing_keymap = map; rl_executing_key = key; _rl_executing_func = func; RESIZE_KEYSEQ_BUFFER(); rl_executing_keyseq[rl_key_sequence_length++] = key; rl_executing_keyseq[rl_key_sequence_length] = '\0'; rl_dispatching = 1; RL_SETSTATE(RL_STATE_DISPATCHING); r = (*func) (rl_numeric_arg * rl_arg_sign, key); RL_UNSETSTATE(RL_STATE_DISPATCHING); rl_dispatching = 0; /* If we have input pending, then the last command was a prefix command. Don't change the state of rl_last_func. Otherwise, remember the last command executed in this variable. */ #if defined (VI_MODE) if (rl_pending_input == 0 && map[key].function != rl_digit_argument && map[key].function != rl_vi_arg_digit) #else if (rl_pending_input == 0 && map[key].function != rl_digit_argument) #endif rl_last_func = map[key].function; RL_CHECK_SIGNALS (); } else if (map[ANYOTHERKEY].function) { /* OK, there's no function bound in this map, but there is a shadow function that was overridden when the current keymap was created. Return -2 to note that. */ if (RL_ISSTATE (RL_STATE_MACROINPUT)) _rl_prev_macro_key (); else _rl_unget_char (key); if (rl_key_sequence_length > 0) rl_executing_keyseq[--rl_key_sequence_length] = '\0'; return -2; } else if (got_subseq) { /* Return -1 to note that we're in a subsequence, but we don't have a matching key, nor was one overridden. This means we need to back up the recursion chain and find the last subsequence that is bound to a function. */ if (RL_ISSTATE (RL_STATE_MACROINPUT)) _rl_prev_macro_key (); else _rl_unget_char (key); if (rl_key_sequence_length > 0) rl_executing_keyseq[--rl_key_sequence_length] = '\0'; return -1; } else { #if defined (READLINE_CALLBACKS) RL_UNSETSTATE (RL_STATE_MULTIKEY); _rl_keyseq_chain_dispose (); #endif _rl_abort_internal (); return -1; } break; case ISKMAP: if (map[key].function != 0) { #if defined (VI_MODE) /* The only way this test will be true is if a subsequence has been bound starting with ESC, generally the arrow keys. What we do is check whether there's input in the queue, which there generally will be if an arrow key has been pressed, and, if there's not, just dispatch to (what we assume is) rl_vi_movement_mode right away. This is essentially an input test with a zero timeout (by default) or a timeout determined by the value of `keyseq-timeout' */ /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued takes microseconds, so multiply by 1000 */ if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap && (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available () == 0 && _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0) return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); /* This is a very specific test. It can possibly be generalized in the future, but for now it handles a specific case of ESC being the last character in a keyboard macro. */ if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap && (RL_ISSTATE (RL_STATE_INPUTPENDING) == 0) && (RL_ISSTATE (RL_STATE_MACROINPUT) && _rl_peek_macro_key () == 0) && _rl_pushed_input_available () == 0 && _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0) return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); #endif RESIZE_KEYSEQ_BUFFER (); rl_executing_keyseq[rl_key_sequence_length++] = key; _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key); /* Allocate new context here. Use linked contexts (linked through cxt->ocxt) to simulate recursion */ #if defined (READLINE_CALLBACKS) # if defined (VI_MODE) /* If we're redoing a vi mode command and we know there is a shadowed function corresponding to this key, just call it -- all the redoable vi mode commands already have all the input they need, and rl_vi_redo assumes that one call to rl_dispatch is sufficient to complete the command. */ if (_rl_vi_redoing && RL_ISSTATE (RL_STATE_CALLBACK) && map[ANYOTHERKEY].function != 0) return (_rl_subseq_result (-2, map, key, got_subseq)); # endif if (RL_ISSTATE (RL_STATE_CALLBACK)) { /* Return 0 only the first time, to indicate success to _rl_callback_read_char. The rest of the time, we're called from _rl_dispatch_callback, so we return -3 to indicate special handling is necessary. */ r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0; cxt = _rl_keyseq_cxt_alloc (); if (got_subseq) cxt->flags |= KSEQ_SUBSEQ; cxt->okey = key; cxt->oldmap = map; cxt->dmap = _rl_dispatching_keymap; cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function; RL_SETSTATE (RL_STATE_MULTIKEY); _rl_kscxt = cxt; return r; /* don't indicate immediate success */ } #endif /* Tentative inter-character timeout for potential multi-key sequences? If no input within timeout, abort sequence and act as if we got non-matching input. */ /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued takes microseconds, so multiply by 1000 */ if (_rl_keyseq_timeout > 0 && (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available () == 0 && _rl_dispatching_keymap[ANYOTHERKEY].function && _rl_input_queued (_rl_keyseq_timeout*1000) == 0) { if (rl_key_sequence_length > 0) rl_executing_keyseq[--rl_key_sequence_length] = '\0'; return (_rl_subseq_result (-2, map, key, got_subseq)); } newkey = _rl_subseq_getchar (key); if (newkey < 0) { _rl_abort_internal (); return -1; } r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function); return _rl_subseq_result (r, map, key, got_subseq); } else { _rl_abort_internal (); /* XXX */ return -1; } break; case ISMACR: if (map[key].function != 0) { rl_executing_keyseq[rl_key_sequence_length] = '\0'; macro = savestring ((char *)map[key].function); _rl_with_macro_input (macro); return 0; } break; } #if defined (VI_MODE) if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && key != ANYOTHERKEY && _rl_dispatching_keymap == vi_movement_keymap && _rl_vi_textmod_command (key)) _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); #endif return (r); } static int _rl_subseq_result (int r, Keymap map, int key, int got_subseq) { Keymap m; int type, nt; rl_command_func_t *func, *nf; if (r == -2) /* We didn't match anything, and the keymap we're indexed into shadowed a function previously bound to that prefix. Call the function. The recursive call to _rl_dispatch_subseq has already taken care of pushing any necessary input back onto the input queue with _rl_unget_char. */ { m = _rl_dispatching_keymap; type = m[ANYOTHERKEY].type; func = m[ANYOTHERKEY].function; if (type == ISFUNC && func == rl_do_lowercase_version) { int newkey = _rl_to_lower ((unsigned char)key); /* check that there is actually a lowercase version to avoid infinite recursion */ r = (newkey != key) ? _rl_dispatch (newkey, map) : 1; } else if (type == ISFUNC) { /* If we shadowed a function, whatever it is, we somehow need a keymap with map[key].func == shadowed-function. Let's use this one. Then we can dispatch using the original key, since there are commands (e.g., in vi mode) for which it matters. */ nt = m[key].type; nf = m[key].function; m[key].type = type; m[key].function = func; /* Don't change _rl_dispatching_keymap, set it here */ _rl_dispatching_keymap = map; /* previous map */ r = _rl_dispatch_subseq (key, m, 0); m[key].type = nt; m[key].function = nf; } else /* We probably shadowed a keymap, so keep going. */ r = _rl_dispatch (ANYOTHERKEY, m); } else if (r < 0 && map[ANYOTHERKEY].function) { /* We didn't match (r is probably -1), so return something to tell the caller that it should try ANYOTHERKEY for an overridden function. */ if (RL_ISSTATE (RL_STATE_MACROINPUT)) _rl_prev_macro_key (); else _rl_unget_char (key); if (rl_key_sequence_length > 0) rl_executing_keyseq[--rl_key_sequence_length] = '\0'; _rl_dispatching_keymap = map; return -2; } else if (r < 0 && got_subseq) /* XXX */ { /* OK, back up the chain. */ if (RL_ISSTATE (RL_STATE_MACROINPUT)) _rl_prev_macro_key (); else _rl_unget_char (key); if (rl_key_sequence_length > 0) rl_executing_keyseq[--rl_key_sequence_length] = '\0'; _rl_dispatching_keymap = map; return -1; } return r; } /* **************************************************************** */ /* */ /* Initializations */ /* */ /* **************************************************************** */ /* Initialize readline (and terminal if not already). */ int rl_initialize (void) { /* Initialize the timeout first to get the precise start time. */ _rl_timeout_init (); /* If we have never been called before, initialize the terminal and data structures. */ if (rl_initialized == 0) { RL_SETSTATE(RL_STATE_INITIALIZING); readline_initialize_everything (); RL_UNSETSTATE(RL_STATE_INITIALIZING); rl_initialized++; RL_SETSTATE(RL_STATE_INITIALIZED); } else _rl_reset_locale (); /* check current locale and set locale variables */ /* Initialize the current line information. */ _rl_init_line_state (); /* We aren't done yet. We haven't even gotten started yet! */ rl_done = 0; rl_eof_found = 0; RL_UNSETSTATE(RL_STATE_DONE|RL_STATE_TIMEOUT|RL_STATE_EOF); /* Tell the history routines what is going on. */ _rl_start_using_history (); /* Make the display buffer match the state of the line. */ rl_reset_line_state (); /* No such function typed yet. */ rl_last_func = (rl_command_func_t *)NULL; /* Parsing of key-bindings begins in an enabled state. */ _rl_parsing_conditionalized_out = 0; #if defined (VI_MODE) if (rl_editing_mode == vi_mode) _rl_vi_initialize_line (); #endif /* Each line starts in insert mode (the default). */ _rl_set_insert_mode (RL_IM_DEFAULT, 1); return 0; } #if 0 #if defined (__EMX__) static void _emx_build_environ (void) { TIB *tibp; PIB *pibp; char *t, **tp; int c; DosGetInfoBlocks (&tibp, &pibp); t = pibp->pib_pchenv; for (c = 1; *t; c++) t += strlen (t) + 1; tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *)); t = pibp->pib_pchenv; while (*t) { *tp++ = t; t += strlen (t) + 1; } *tp = 0; } #endif /* __EMX__ */ #endif /* Initialize the entire state of the world. */ static void readline_initialize_everything (void) { #if 0 #if defined (__EMX__) if (environ == 0) _emx_build_environ (); #endif #endif #if 0 /* Find out if we are running in Emacs -- UNUSED. */ running_in_emacs = sh_get_env_value ("EMACS") != (char *)0; #endif /* Set up input and output if they are not already set up. */ if (!rl_instream) rl_instream = stdin; if (!rl_outstream) rl_outstream = stdout; /* Bind _rl_in_stream and _rl_out_stream immediately. These values may change, but they may also be used before readline_internal () is called. */ _rl_in_stream = rl_instream; _rl_out_stream = rl_outstream; /* Allocate data structures. */ if (rl_line_buffer == 0) rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE); /* Initialize the terminal interface. */ if (rl_terminal_name == 0) rl_terminal_name = sh_get_env_value ("TERM"); _rl_init_terminal_io (rl_terminal_name); /* Bind tty characters to readline functions. */ readline_default_bindings (); /* Initialize the function names. */ rl_initialize_funmap (); /* Decide whether we should automatically go into eight-bit mode. */ _rl_init_eightbit (); /* Read in the init file. */ rl_read_init_file ((char *)NULL); /* XXX */ if (_rl_horizontal_scroll_mode && _rl_term_autowrap) { _rl_screenwidth--; _rl_screenchars -= _rl_screenheight; } /* Override the effect of any `set keymap' assignments in the inputrc file. */ rl_set_keymap_from_edit_mode (); /* Try to bind a common arrow key prefix, if not already bound. */ bind_arrow_keys (); /* Bind the bracketed paste prefix assuming that the user will enable it on terminals that support it. */ bind_bracketed_paste_prefix (); /* If the completion parser's default word break characters haven't been set yet, then do so now. */ if (rl_completer_word_break_characters == 0) rl_completer_word_break_characters = rl_basic_word_break_characters; #if defined (COLOR_SUPPORT) if (_rl_colored_stats || _rl_colored_completion_prefix) _rl_parse_colors (); #endif rl_executing_keyseq = xmalloc (_rl_executing_keyseq_size = 16); rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; } /* If this system allows us to look at the values of the regular input editing characters, then bind them to their readline equivalents, iff the characters are not bound to keymaps. */ static void readline_default_bindings (void) { if (_rl_bind_stty_chars) rl_tty_set_default_bindings (_rl_keymap); } #if defined (DEBUG) /* Reset the default bindings for the terminal special characters we're interested in back to rl_insert and read the new ones. */ static void reset_default_bindings (void) { if (_rl_bind_stty_chars) { rl_tty_unset_default_bindings (_rl_keymap); rl_tty_set_default_bindings (_rl_keymap); } } #endif /* Bind some common arrow key sequences in MAP. */ static void bind_arrow_keys_internal (Keymap map) { Keymap xkeymap; xkeymap = _rl_keymap; _rl_keymap = map; #if defined (__MSDOS__) rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history); rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char); rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char); rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history); #endif rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history); rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history); rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char); rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char); rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line); rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line); rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history); rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history); rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char); rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char); rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line); rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line); /* Key bindings for control-arrow keys */ rl_bind_keyseq_if_unbound ("\033[1;5C", rl_forward_word); rl_bind_keyseq_if_unbound ("\033[1;5D", rl_backward_word); rl_bind_keyseq_if_unbound ("\033[3;5~", rl_kill_word); /* Key bindings for alt-arrow keys */ rl_bind_keyseq_if_unbound ("\033[1;3C", rl_forward_word); rl_bind_keyseq_if_unbound ("\033[1;3D", rl_backward_word); #if defined (__MINGW32__) rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history); rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history); rl_bind_keyseq_if_unbound ("\340M", rl_forward_char); rl_bind_keyseq_if_unbound ("\340K", rl_backward_char); rl_bind_keyseq_if_unbound ("\340G", rl_beg_of_line); rl_bind_keyseq_if_unbound ("\340O", rl_end_of_line); rl_bind_keyseq_if_unbound ("\340S", rl_delete); rl_bind_keyseq_if_unbound ("\340R", rl_overwrite_mode); /* These may or may not work because of the embedded NUL. */ rl_bind_keyseq_if_unbound ("\\000H", rl_get_previous_history); rl_bind_keyseq_if_unbound ("\\000P", rl_get_next_history); rl_bind_keyseq_if_unbound ("\\000M", rl_forward_char); rl_bind_keyseq_if_unbound ("\\000K", rl_backward_char); rl_bind_keyseq_if_unbound ("\\000G", rl_beg_of_line); rl_bind_keyseq_if_unbound ("\\000O", rl_end_of_line); rl_bind_keyseq_if_unbound ("\\000S", rl_delete); rl_bind_keyseq_if_unbound ("\\000R", rl_overwrite_mode); #endif _rl_keymap = xkeymap; } /* Try and bind the common arrow key prefixes after giving termcap and the inputrc file a chance to bind them and create `real' keymaps for the arrow key prefix. */ static void bind_arrow_keys (void) { bind_arrow_keys_internal (emacs_standard_keymap); #if defined (VI_MODE) bind_arrow_keys_internal (vi_movement_keymap); /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC in vi command mode while still allowing the arrow keys to work. */ if (vi_movement_keymap[ESC].type == ISKMAP) rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap); bind_arrow_keys_internal (vi_insertion_keymap); #endif } static void bind_bracketed_paste_prefix (void) { Keymap xkeymap; xkeymap = _rl_keymap; _rl_keymap = emacs_standard_keymap; rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_bracketed_paste_begin); #if defined (VI_MODE) _rl_keymap = vi_insertion_keymap; rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_bracketed_paste_begin); /* XXX - is there a reason to do this in the vi command keymap? */ #endif _rl_keymap = xkeymap; } /* **************************************************************** */ /* */ /* Saving and Restoring Readline's state */ /* */ /* **************************************************************** */ int rl_save_state (struct readline_state *sp) { if (sp == 0) return -1; sp->point = rl_point; sp->end = rl_end; sp->mark = rl_mark; sp->buffer = rl_line_buffer; sp->buflen = rl_line_buffer_len; sp->ul = rl_undo_list; sp->prompt = rl_prompt; sp->rlstate = rl_readline_state; sp->done = rl_done; sp->kmap = _rl_keymap; sp->lastfunc = rl_last_func; sp->insmode = rl_insert_mode; sp->edmode = rl_editing_mode; sp->kseq = rl_executing_keyseq; sp->kseqlen = rl_key_sequence_length; sp->inf = rl_instream; sp->outf = rl_outstream; sp->pendingin = rl_pending_input; sp->macro = rl_executing_macro; sp->catchsigs = rl_catch_signals; sp->catchsigwinch = rl_catch_sigwinch; sp->entryfunc = rl_completion_entry_function; sp->menuentryfunc = rl_menu_completion_entry_function; sp->ignorefunc = rl_ignore_some_completions_function; sp->attemptfunc = rl_attempted_completion_function; sp->wordbreakchars = rl_completer_word_break_characters; return (0); } int rl_restore_state (struct readline_state *sp) { if (sp == 0) return -1; rl_point = sp->point; rl_end = sp->end; rl_mark = sp->mark; the_line = rl_line_buffer = sp->buffer; rl_line_buffer_len = sp->buflen; rl_undo_list = sp->ul; rl_prompt = sp->prompt; rl_readline_state = sp->rlstate; rl_done = sp->done; _rl_keymap = sp->kmap; rl_last_func = sp->lastfunc; rl_insert_mode = sp->insmode; rl_editing_mode = sp->edmode; rl_executing_keyseq = sp->kseq; rl_key_sequence_length = sp->kseqlen; rl_instream = sp->inf; rl_outstream = sp->outf; rl_pending_input = sp->pendingin; rl_executing_macro = sp->macro; rl_catch_signals = sp->catchsigs; rl_catch_sigwinch = sp->catchsigwinch; rl_completion_entry_function = sp->entryfunc; rl_menu_completion_entry_function = sp->menuentryfunc; rl_ignore_some_completions_function = sp->ignorefunc; rl_attempted_completion_function = sp->attemptfunc; rl_completer_word_break_characters = sp->wordbreakchars; rl_deactivate_mark (); return (0); } /* Functions to manage the string that is the current key sequence. */ void _rl_init_executing_keyseq (void) { rl_executing_keyseq[rl_key_sequence_length = 0] = '\0'; } void _rl_term_executing_keyseq (void) { rl_executing_keyseq[rl_key_sequence_length] = '\0'; } void _rl_end_executing_keyseq (void) { if (rl_key_sequence_length > 0) rl_executing_keyseq[--rl_key_sequence_length] = '\0'; } void _rl_add_executing_keyseq (int key) { RESIZE_KEYSEQ_BUFFER (); rl_executing_keyseq[rl_key_sequence_length++] = key; } /* `delete' the last character added to the executing key sequence. Use this before calling rl_execute_next to avoid keys being added twice. */ void _rl_del_executing_keyseq (void) { if (rl_key_sequence_length > 0) rl_key_sequence_length--; } readline-8.3/mbutil.c000644 000436 000024 00000036471 14657142765 014724 0ustar00chetstaff000000 000000 /* mbutil.c -- readline multibyte character utility functions */ /* Copyright (C) 2001-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include #include "posixjmp.h" #if defined (HAVE_UNISTD_H) # include /* for _POSIX_VERSION */ #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include #include /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "rlmbutil.h" #if defined (TIOCSTAT_IN_SYS_IOCTL) # include #endif /* TIOCSTAT_IN_SYS_IOCTL */ /* Some standard library routines. */ #include "readline.h" #include "rlprivate.h" #include "xmalloc.h" /* Declared here so it can be shared between the readline and history libraries. */ #if defined (HANDLE_MULTIBYTE) int rl_byte_oriented = 0; #else int rl_byte_oriented = 1; #endif /* Ditto */ int _rl_utf8locale = 0; /* **************************************************************** */ /* */ /* Multibyte Character Utility Functions */ /* */ /* **************************************************************** */ #if defined(HANDLE_MULTIBYTE) /* **************************************************************** */ /* */ /* UTF-8 specific Character Utility Functions */ /* */ /* **************************************************************** */ /* Return the length in bytes of the possibly-multibyte character beginning at S. Encoding is UTF-8. */ static int _rl_utf8_mblen (const char *s, size_t n) { unsigned char c, c1, c2, c3; if (s == 0) return (0); /* no shift states */ if (n <= 0) return (-1); c = (unsigned char)*s; if (c < 0x80) return (c != 0); if (c >= 0xc2) { c1 = (unsigned char)s[1]; if (c < 0xe0) { if (n == 1) return -2; if (n >= 2 && (c1 ^ 0x80) < 0x40) return 2; } else if (c < 0xf0) { if (n == 1) return -2; if ((c1 ^ 0x80) < 0x40 && (c >= 0xe1 || c1 >= 0xa0) && (c != 0xed || c1 < 0xa0)) { if (n == 2) return -2; c2 = (unsigned char)s[2]; if ((c2 ^ 0x80) < 0x40) return 3; } } else if (c < 0xf4) { if (n == 1) return -2; if (((c1 ^ 0x80) < 0x40) && (c >= 0xf1 || c1 >= 0x90) && (c < 0xf4 || (c == 0xf4 && c1 < 0x90))) { if (n == 2) return -2; c2 = (unsigned char)s[2]; if ((c2 ^ 0x80) < 0x40) { if (n == 3) return -2; c3 = (unsigned char)s[3]; if ((c3 ^ 0x80) < 0x40) return 4; } } } } /* invalid or incomplete multibyte character */ return -1; } static size_t _rl_utf8_mbstrlen (const char *s) { size_t clen, nc; int mb_cur_max; nc = 0; mb_cur_max = MB_CUR_MAX; while (*s && (clen = (size_t)_rl_utf8_mblen(s, mb_cur_max)) != 0) { if (MB_INVALIDCH (clen)) clen = 1; s += clen; nc++; } return nc; } static size_t _rl_gen_mbstrlen (const char *s) { size_t clen, nc; mbstate_t mbs = { 0 }, mbsbak = { 0 }; int f, mb_cur_max; nc = 0; mb_cur_max = MB_CUR_MAX; while (*s && (clen = (f = _rl_is_basic (*s)) ? 1 : mbrlen(s, mb_cur_max, &mbs)) != 0) { if (MB_INVALIDCH(clen)) { clen = 1; /* assume single byte */ mbs = mbsbak; } if (f == 0) mbsbak = mbs; s += clen; nc++; } return nc; } size_t _rl_mbstrlen (const char *s) { if (MB_CUR_MAX == 1) return (strlen (s)); else if (_rl_utf8locale) return (_rl_utf8_mbstrlen (s)); else return (_rl_gen_mbstrlen (s)); } static int _rl_find_next_mbchar_internal (const char *string, int seed, int count, int find_non_zero) { size_t tmp, len; mbstate_t ps; int point; WCHAR_T wc; tmp = 0; memset(&ps, 0, sizeof (mbstate_t)); if (seed < 0) seed = 0; if (count <= 0) return seed; point = seed + _rl_adjust_point (string, seed, &ps); /* if _rl_adjust_point returns -1, the character or string is invalid. treat as a byte. */ if (point == seed - 1) /* invalid */ return seed + 1; /* if this is true, means that seed was not pointing to a byte indicating the beginning of a multibyte character. Correct the point and consume one char. */ if (seed < point) count--; while (count > 0) { len = strlen (string + point); if (len == 0) break; if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point])) { tmp = 1; wc = (WCHAR_T) string[point]; memset(&ps, 0, sizeof(mbstate_t)); } else tmp = MBRTOWC (&wc, string+point, len, &ps); if (MB_INVALIDCH ((size_t)tmp)) { /* invalid bytes. assume a byte represents a character */ point++; count--; /* reset states. */ memset(&ps, 0, sizeof(mbstate_t)); } else if (MB_NULLWCH (tmp)) break; /* found wide '\0' */ else { /* valid bytes */ point += tmp; if (find_non_zero) { if (WCWIDTH (wc) == 0) continue; else count--; } else count--; } } if (find_non_zero) { len = strlen (string + point); tmp = MBRTOWC (&wc, string + point, len, &ps); while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && WCWIDTH (wc) == 0) { point += tmp; len -= tmp; tmp = MBRTOWC (&wc, string + point, len, &ps); } } return point; } static inline int _rl_test_nonzero (const char *string, int ind, int len) { size_t tmp; WCHAR_T wc; mbstate_t ps; memset (&ps, 0, sizeof (mbstate_t)); tmp = MBRTOWC (&wc, string + ind, len - ind, &ps); /* treat invalid multibyte sequences as non-zero-width */ return (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp) || WCWIDTH (wc) > 0); } /* experimental -- needs to handle zero-width characters better */ static int _rl_find_prev_utf8char (const char *string, int seed, int find_non_zero) { unsigned char b; int save, prev; size_t len; if (find_non_zero) len = RL_STRLEN (string); prev = seed - 1; while (prev >= 0) { b = (unsigned char)string[prev]; if (UTF8_SINGLEBYTE (b)) return (prev); save = prev; /* Move back until we're not in the middle of a multibyte char */ #if 0 if (UTF8_MBCHAR (b)) { while (prev > 0 && (b = (unsigned char)string[--prev]) && UTF8_MBCHAR (b)) ; } #else while (prev > 0 && (b = (unsigned char)string[--prev]) && UTF8_MBFIRSTCHAR (b) == 0) ; #endif if (UTF8_MBFIRSTCHAR (b)) { if (find_non_zero) { if (_rl_test_nonzero (string, prev, len)) return (prev); else /* valid but WCWIDTH (wc) == 0 */ prev = prev - 1; } else return (prev); } else return (save); /* invalid utf-8 multibyte sequence */ } return ((prev < 0) ? 0 : prev); } /*static*/ int _rl_find_prev_mbchar_internal (const char *string, int seed, int find_non_zero) { mbstate_t ps; int prev, non_zero_prev, point, length; size_t tmp; WCHAR_T wc; if (_rl_utf8locale) return (_rl_find_prev_utf8char (string, seed, find_non_zero)); memset(&ps, 0, sizeof(mbstate_t)); length = strlen(string); if (seed < 0) return 0; else if (length < seed) return length; prev = non_zero_prev = point = 0; while (point < seed) { if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point])) { tmp = 1; wc = (WCHAR_T) string[point]; memset(&ps, 0, sizeof(mbstate_t)); } else tmp = MBRTOWC (&wc, string + point, length - point, &ps); if (MB_INVALIDCH ((size_t)tmp)) { /* in this case, bytes are invalid or too short to compose multibyte char, so assume that the first byte represents a single character anyway. */ tmp = 1; /* clear the state of the byte sequence, because in this case effect of mbstate is undefined */ memset(&ps, 0, sizeof (mbstate_t)); /* Since we're assuming that this byte represents a single non-zero-width character, don't forget about it. */ prev = point; } else if (MB_NULLWCH (tmp)) break; /* Found '\0' char. Can this happen? */ else { if (find_non_zero) { if (WCWIDTH (wc) != 0) prev = point; } else prev = point; } point += tmp; } return prev; } /* return the number of bytes parsed from the multibyte sequence starting at src, if a non-L'\0' wide character was recognized. It returns 0, if a L'\0' wide character was recognized. It returns (size_t)(-1), if an invalid multibyte sequence was encountered. It returns (size_t)(-2) if it couldn't parse a complete multibyte character. */ int _rl_get_char_len (const char *src, mbstate_t *ps) { size_t tmp, l; int mb_cur_max; /* Look at no more than MB_CUR_MAX characters */ l = strlen (src); if (_rl_utf8locale && l >= 0 && UTF8_SINGLEBYTE(*src)) tmp = (*src != 0) ? 1 : 0; else { mb_cur_max = MB_CUR_MAX; tmp = mbrlen(src, (l < mb_cur_max) ? l : mb_cur_max, ps); } if (tmp == (size_t)(-2)) { /* too short to compose multibyte char */ if (ps) memset (ps, 0, sizeof(mbstate_t)); return -2; } else if (tmp == (size_t)(-1)) { /* invalid to compose multibyte char */ /* initialize the conversion state */ if (ps) memset (ps, 0, sizeof(mbstate_t)); return -1; } else if (tmp == (size_t)0) return 0; else return (int)tmp; } /* compare the specified two characters. If the characters matched, return 1. Otherwise return 0. */ int _rl_compare_chars (const char *buf1, int pos1, mbstate_t *ps1, const char *buf2, int pos2, mbstate_t *ps2) { int i, w1, w2; if ((w1 = _rl_get_char_len (&buf1[pos1], ps1)) <= 0 || (w2 = _rl_get_char_len (&buf2[pos2], ps2)) <= 0 || (w1 != w2) || (buf1[pos1] != buf2[pos2])) return 0; for (i = 1; i < w1; i++) if (buf1[pos1+i] != buf2[pos2+i]) return 0; return 1; } /* adjust pointed byte and find mbstate of the point of string. adjusted point will be point <= adjusted_point, and returns differences of the byte(adjusted_point - point). if point is invalid (point < 0 || more than string length), it returns -1 */ int _rl_adjust_point (const char *string, int point, mbstate_t *ps) { size_t tmp; int length, pos; tmp = 0; pos = 0; length = strlen(string); if (point < 0) return -1; if (length < point) return -1; while (pos < point) { if (_rl_utf8locale && UTF8_SINGLEBYTE(string[pos])) tmp = 1; else tmp = mbrlen (string + pos, length - pos, ps); if (MB_INVALIDCH ((size_t)tmp)) { /* in this case, bytes are invalid or too short to compose multibyte char, so assume that the first byte represents a single character anyway. */ pos++; /* clear the state of the byte sequence, because in this case effect of mbstate is undefined */ if (ps) memset (ps, 0, sizeof (mbstate_t)); } else if (MB_NULLWCH (tmp)) pos++; else pos += tmp; } return (pos - point); } int _rl_is_mbchar_matched (const char *string, int seed, int end, char *mbchar, int length) { int i; if ((end - seed) < length) return 0; for (i = 0; i < length; i++) if (string[seed + i] != mbchar[i]) return 0; return 1; } WCHAR_T _rl_char_value (const char *buf, int ind) { size_t tmp; WCHAR_T wc; mbstate_t ps; size_t l; if (MB_LEN_MAX == 1 || rl_byte_oriented) return ((WCHAR_T) buf[ind]); if (_rl_utf8locale && UTF8_SINGLEBYTE(buf[ind])) return ((WCHAR_T) buf[ind]); l = strlen (buf); if (ind + 1 >= l) return ((WCHAR_T) buf[ind]); if (l < ind) /* Sanity check */ l = strlen (buf+ind); memset (&ps, 0, sizeof (mbstate_t)); tmp = MBRTOWC (&wc, buf + ind, l - ind, &ps); if (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp)) return ((WCHAR_T) buf[ind]); return wc; } #endif /* HANDLE_MULTIBYTE */ /* Find next `count' characters started byte point of the specified seed. If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte characters. */ #undef _rl_find_next_mbchar int _rl_find_next_mbchar (const char *string, int seed, int count, int flags) { #if defined (HANDLE_MULTIBYTE) return _rl_find_next_mbchar_internal (string, seed, count, flags); #else return (seed + count); #endif } /* Find previous character started byte point of the specified seed. Returned point will be point <= seed. If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte characters. */ #undef _rl_find_prev_mbchar int _rl_find_prev_mbchar (const char *string, int seed, int flags) { #if defined (HANDLE_MULTIBYTE) return _rl_find_prev_mbchar_internal (string, seed, flags); #else return ((seed == 0) ? seed : seed - 1); #endif } /* Compare the first N characters of S1 and S2 without regard to case. If FLAGS&1, apply the mapping specified by completion-map-case and make `-' and `_' equivalent. Returns 1 if the strings are equal. */ int _rl_mb_strcaseeqn (const char *s1, size_t l1, const char *s2, size_t l2, size_t n, int flags) { size_t v1, v2; mbstate_t ps1, ps2; WCHAR_T wc1, wc2; memset (&ps1, 0, sizeof (mbstate_t)); memset (&ps2, 0, sizeof (mbstate_t)); do { v1 = MBRTOWC(&wc1, s1, l1, &ps1); v2 = MBRTOWC(&wc2, s2, l2, &ps2); if (v1 == 0 && v2 == 0) return 1; else if (MB_INVALIDCH(v1) || MB_INVALIDCH(v2)) { int d; d = _rl_to_lower (*s1) - _rl_to_lower (*s2); /* do byte comparison */ if ((flags & 1) && (*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_')) d = 0; /* case insensitive character mapping */ if (d != 0) return 0; s1++; s2++; n--; continue; } wc1 = towlower(wc1); wc2 = towlower(wc2); s1 += v1; s2 += v1; n -= v1; if ((flags & 1) && (wc1 == L'-' || wc1 == L'_') && (wc2 == L'-' || wc2 == L'_')) continue; if (wc1 != wc2) return 0; } while (n != 0); return 1; } /* Return 1 if the multibyte characters pointed to by S1 and S2 are equal without regard to case. If FLAGS&1, apply the mapping specified by completion-map-case and make `-' and `_' equivalent. */ int _rl_mb_charcasecmp (const char *s1, mbstate_t *ps1, const char *s2, mbstate_t *ps2, int flags) { int d; size_t v1, v2; wchar_t wc1, wc2; d = MB_CUR_MAX; v1 = MBRTOWC(&wc1, s1, d, ps1); v2 = MBRTOWC(&wc2, s2, d, ps2); if (v1 == 0 && v2 == 0) return 1; else if (MB_INVALIDCH(v1) || MB_INVALIDCH(v2)) { if ((flags & 1) && (*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_')) return 1; return (_rl_to_lower (*s1) == _rl_to_lower (*s2)); } wc1 = towlower(wc1); wc2 = towlower(wc2); if ((flags & 1) && (wc1 == L'-' || wc1 == L'_') && (wc2 == L'-' || wc2 == L'_')) return 1; return (wc1 == wc2); } readline-8.3/COPYING000644 000436 000024 00000104513 11050304560 014261 0ustar00chetstaff000000 000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . readline-8.3/display.c000644 000436 000024 00000363236 15005143240 015050 0ustar00chetstaff000000 000000 /* display.c -- readline redisplay facility. */ /* Copyright (C) 1987-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #include "posixstat.h" #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include #ifdef __MSDOS__ # include #endif /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "rlmbutil.h" /* Termcap library stuff. */ #include "tcap.h" /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "xmalloc.h" static void putc_face (int, int, char *); static void puts_face (const char *, const char *, int); static void norm_face (char *, int); static void update_line (char *, char *, char *, char *, int, int, int, int); static void space_to_eol (int); static void delete_chars (int); static void insert_some_chars (char *, int, int); static void open_some_spaces (int); static void cr (void); static void redraw_prompt (char *); static void _rl_move_cursor_relative (int, const char *, const char *); /* Values for FLAGS */ #define PMT_MULTILINE 0x01 static char *expand_prompt (char *, int, int *, int *, int *, int *); #define DEFAULT_LINE_BUFFER_SIZE 1024 /* State of visible and invisible lines. */ struct line_state { char *line; char *lface; int *lbreaks; int lbsize; #if defined (HANDLE_MULTIBYTE) int wbsize; int *wrapped_line; #endif }; /* The line display buffers. One is the line currently displayed on the screen. The other is the line about to be displayed. */ static struct line_state line_state_array[2]; static struct line_state *line_state_visible = &line_state_array[0]; static struct line_state *line_state_invisible = &line_state_array[1]; static int line_structures_initialized = 0; /* Backwards-compatible names. */ #define inv_lbreaks (line_state_invisible->lbreaks) #define inv_lbsize (line_state_invisible->lbsize) #define vis_lbreaks (line_state_visible->lbreaks) #define vis_lbsize (line_state_visible->lbsize) #define visible_line (line_state_visible->line) #define vis_face (line_state_visible->lface) #define invisible_line (line_state_invisible->line) #define inv_face (line_state_invisible->lface) #if defined (HANDLE_MULTIBYTE) static int _rl_col_width (const char *, int, int, int); #else # define _rl_col_width(l, s, e, f) (((e) <= (s)) ? 0 : (e) - (s)) #endif /* Heuristic used to decide whether it is faster to move from CUR to NEW by backing up or outputting a carriage return and moving forward. CUR and NEW are either both buffer positions or absolute screen positions. */ #define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new))) /* _rl_last_c_pos is an absolute cursor position in multibyte locales and a buffer index in others. This macro is used when deciding whether the current cursor position is in the middle of a prompt string containing invisible characters. XXX - might need to take `modmark' into account. */ /* XXX - only valid when tested against _rl_last_c_pos; buffer indices need to use prompt_last_invisible directly. */ #define PROMPT_ENDING_INDEX \ ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1) #define FACE_NORMAL '0' #define FACE_STANDOUT '1' #define FACE_INVALID ((char)1) /* **************************************************************** */ /* */ /* Display stuff */ /* */ /* **************************************************************** */ /* This is the stuff that is hard for me. I never seem to write good display routines in C. Let's see how I do this time. */ /* (PWP) Well... Good for a simple line updater, but totally ignores the problems of input lines longer than the screen width. update_line and the code that calls it makes a multiple line, automatically wrapping line update. Careful attention needs to be paid to the vertical position variables. */ /* Keep two buffers; one which reflects the current contents of the screen, and the other to draw what we think the new contents should be. Then compare the buffers, and make whatever changes to the screen itself that we should. Finally, make the buffer that we just drew into be the one which reflects the current contents of the screen, and place the cursor where it belongs. Commands that want to can fix the display themselves, and then let this function know that the display has been fixed by setting the RL_DISPLAY_FIXED variable. This is good for efficiency. */ /* Application-specific redisplay function. */ rl_voidfunc_t *rl_redisplay_function = rl_redisplay; /* Global variables declared here. */ /* What YOU turn on when you have handled all redisplay yourself. */ int rl_display_fixed = 0; /* The stuff that gets printed out before the actual text of the line. This is usually pointing to rl_prompt. */ char *rl_display_prompt = (char *)NULL; /* Variables used to include the editing mode in the prompt. */ char *_rl_emacs_mode_str; int _rl_emacs_modestr_len; char *_rl_vi_ins_mode_str; int _rl_vi_ins_modestr_len; char *_rl_vi_cmd_mode_str; int _rl_vi_cmd_modestr_len; /* Pseudo-global variables declared here. */ /* Hints for other parts of readline to give to the display engine. */ int _rl_suppress_redisplay = 0; int _rl_want_redisplay = 0; /* The visible cursor position. If you print some text, adjust this. */ /* NOTE: _rl_last_c_pos is used as a buffer index when not in a locale supporting multibyte characters, and an absolute cursor position when in such a locale. This is an artifact of the donated multibyte support. Care must be taken when modifying its value. */ int _rl_last_c_pos = 0; int _rl_last_v_pos = 0; /* Number of physical lines consumed by the current line buffer currently on screen minus 1. */ int _rl_vis_botlin = 0; static int _rl_quick_redisplay = 0; /* This is a hint update_line gives to rl_redisplay that it has adjusted the value of _rl_last_c_pos *and* taken the presence of any invisible chars in the prompt into account. rl_redisplay notes this and does not do the adjustment itself. */ static int cpos_adjusted; /* The index into the line buffer corresponding to the cursor position */ static int cpos_buffer_position; /* A flag to note when we're displaying the first line of the prompt */ static int displaying_prompt_first_line; /* The number of multibyte characters in the prompt, if any */ static int prompt_multibyte_chars; static int _rl_inv_botlin = 0; /* Variables used only in this file. */ /* The last left edge of text that was displayed. This is used when doing horizontal scrolling. It shifts in thirds of a screenwidth. */ static int last_lmargin; /* A buffer for `modeline' messages. */ static char *msg_buf = 0; static int msg_bufsiz = 0; /* Non-zero forces the redisplay even if we thought it was unnecessary. */ static int forced_display; /* Default and initial buffer size. Can grow. */ static int line_size = 0; /* Set to a non-zero value if horizontal scrolling has been enabled automatically because the terminal was resized to height 1. */ static int horizontal_scrolling_autoset = 0; /* explicit initialization */ /* Variables to keep track of the expanded prompt string, which may include invisible characters. */ static char *local_prompt, *local_prompt_prefix; static int local_prompt_len; static int prompt_prefix_length; /* Number of chars in the buffer that contribute to visible chars on the screen. This might be different from the number of physical chars in the presence of multibyte characters */ static int prompt_visible_length; /* The number of invisible characters in the line currently being displayed on the screen. */ static int visible_wrap_offset; /* The number of invisible characters in the prompt string. Static so it can be shared between rl_redisplay and update_line */ static int wrap_offset; /* The index of the last invisible character in the prompt string. */ static int prompt_last_invisible; /* The length (buffer offset) of the first line of the last (possibly multi-line) buffer displayed on the screen. */ static int visible_first_line_len; /* Number of invisible characters on the first physical line of the prompt. Only valid when the number of physical characters in the prompt exceeds (or is equal to) _rl_screenwidth. */ static int prompt_invis_chars_first_line; static int prompt_last_screen_line; static int prompt_physical_chars; /* An array of indexes into the prompt string where we will break physical screen lines. It's easier to compute in expand_prompt and use later in rl_redisplay instead of having rl_redisplay try to guess about invisible characters in the prompt or use heuristics about where they are. */ static int *local_prompt_newlines; /* An array saying how many invisible characters are in each line of the prompt. */ static int *local_prompt_invis_chars; /* set to a non-zero value by rl_redisplay if we are marking modified history lines and the current line is so marked. */ static int modmark; static int line_totbytes; /* Variables to save and restore prompt and display information. */ /* These are getting numerous enough that it's time to create a struct. */ static char *saved_local_prompt; static char *saved_local_prefix; static int *saved_local_prompt_newlines; static int *saved_local_prompt_invis_chars; static int saved_last_invisible; static int saved_visible_length; static int saved_prefix_length; static int saved_local_length; static int saved_invis_chars_first_line; static int saved_physical_chars; /* Return a string indicating the editing mode, for use in the prompt. */ static char * prompt_modestr (int *lenp) { if (rl_editing_mode == emacs_mode) { if (lenp) *lenp = _rl_emacs_mode_str ? _rl_emacs_modestr_len : RL_EMACS_MODESTR_DEFLEN; return _rl_emacs_mode_str ? _rl_emacs_mode_str : RL_EMACS_MODESTR_DEFAULT; } else if (_rl_keymap == vi_insertion_keymap) { if (lenp) *lenp = _rl_vi_ins_mode_str ? _rl_vi_ins_modestr_len : RL_VI_INS_MODESTR_DEFLEN; return _rl_vi_ins_mode_str ? _rl_vi_ins_mode_str : RL_VI_INS_MODESTR_DEFAULT; /* vi insert mode */ } else { if (lenp) *lenp = _rl_vi_cmd_mode_str ? _rl_vi_cmd_modestr_len : RL_VI_CMD_MODESTR_DEFLEN; return _rl_vi_cmd_mode_str ? _rl_vi_cmd_mode_str : RL_VI_CMD_MODESTR_DEFAULT; /* vi command mode */ } } /* Expand the prompt string S and return the number of visible characters in *LP, if LP is not null. This is currently more-or-less a placeholder for expansion. LIP, if non-null is a place to store the index of the last invisible character in the returned string. NIFLP, if non-zero, is a place to store the number of invisible characters in the first prompt line. The previous are used as byte counts -- indexes into a character buffer. *VLP gets the number of physical characters in the expanded prompt (visible length) */ /* Current implementation: \001 (^A) start non-visible characters \002 (^B) end non-visible characters all characters except \001 and \002 (following a \001) are copied to the returned string; all characters except those between \001 and \002 are assumed to be `visible'. */ /* Possible values for FLAGS: PMT_MULTILINE caller indicates that this is part of a multiline prompt */ /* This approximates the number of lines the prompt will take when displayed */ #define APPROX_DIV(n, d) (((n) < (d)) ? 1 : ((n) / (d)) + 1) static char * expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp) { char *r, *ret, *p, *igstart, *nprompt, *ms; int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars; int mlen, newlines, newlines_guess, bound, can_add_invis, lastinvis; int mb_cur_max; /* We only expand the mode string for the last line of a multiline prompt (a prompt with embedded newlines). */ ms = (((pmt == rl_prompt) ^ (flags & PMT_MULTILINE)) && _rl_show_mode_in_prompt) ? prompt_modestr (&mlen) : 0; if (ms) { l = strlen (pmt); nprompt = (char *)xmalloc (l + mlen + 1); memcpy (nprompt, ms, mlen); strcpy (nprompt + mlen, pmt); } else nprompt = pmt; can_add_invis = 0; mb_cur_max = MB_CUR_MAX; if (_rl_screenwidth == 0) _rl_get_screen_size (0, 0); /* avoid division by zero */ /* Short-circuit if we can. We can do this if we are treating the prompt as a sequence of bytes and there are no invisible characters in the prompt to deal with. Since we populate local_prompt_newlines, we have to run through the rest of the function if this prompt looks like it's going to be longer than one screen line. */ if ((mb_cur_max <= 1 || rl_byte_oriented) && strchr (nprompt, RL_PROMPT_START_IGNORE) == 0) { l = strlen (nprompt); if (l < (_rl_screenwidth > 0 ? _rl_screenwidth : 80)) { r = (nprompt == pmt) ? savestring (pmt) : nprompt; if (lp) *lp = l; if (lip) *lip = 0; if (niflp) *niflp = 0; if (vlp) *vlp = l; local_prompt_newlines = (int *) xrealloc (local_prompt_newlines, sizeof (int) * 2); local_prompt_invis_chars = (int *) xrealloc (local_prompt_invis_chars, sizeof (int) * 2); local_prompt_newlines[0] = local_prompt_invis_chars[0] = 0; local_prompt_newlines[1] = -1; return r; } } l = strlen (nprompt); /* XXX */ r = ret = (char *)xmalloc (l + 1); /* Guess at how many screen lines the prompt will take to size the array that keeps track of where the line wraps happen */ newlines_guess = (_rl_screenwidth > 0) ? APPROX_DIV(l, _rl_screenwidth) : APPROX_DIV(l, 80); local_prompt_newlines = (int *) xrealloc (local_prompt_newlines, sizeof (int) * (newlines_guess + 1)); local_prompt_newlines[newlines = 0] = 0; local_prompt_invis_chars = (int *) xrealloc (local_prompt_invis_chars, sizeof (int) * (newlines_guess + 1)); local_prompt_invis_chars[0] = 0; for (rl = 1; rl <= newlines_guess; rl++) { local_prompt_newlines[rl] = -1; local_prompt_invis_chars[rl] = 0; } rl = physchars = 0; /* mode string now part of nprompt */ invfl = 0; /* invisible chars in first line of prompt */ invflset = 0; /* we only want to set invfl once */ igstart = 0; /* we're not ignoring any characters yet */ for (ignoring = last = ninvis = lastinvis = 0, p = nprompt; p && *p; p++) { /* This code strips the invisible character string markers RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */ if (ignoring == 0 && *p == RL_PROMPT_START_IGNORE) /* XXX - check ignoring? */ { ignoring = 1; igstart = p; continue; } else if (ignoring && *p == RL_PROMPT_END_IGNORE) { ignoring = 0; /* If we have a run of invisible characters, adjust local_prompt_newlines to add them, since update_line expects them to be counted before wrapping the line. */ if (can_add_invis) { local_prompt_newlines[newlines] = r - ret; /* If we're adding to the number of invisible characters on the first line of the prompt, but we've already set the number of invisible characters on that line, we need to adjust the counter. */ if (invflset && newlines == 1) invfl = ninvis; local_prompt_invis_chars[newlines - 1] = ninvis - lastinvis; lastinvis = ninvis; } if (p != (igstart + 1)) last = r - ret - 1; continue; } else { #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) { pind = p - nprompt; ind = _rl_find_next_mbchar (nprompt, pind, 1, MB_FIND_NONZERO); l = ind - pind; while (l--) *r++ = *p++; if (!ignoring) { /* rl ends up being assigned to prompt_visible_length, which is the number of characters in the buffer that contribute to characters on the screen, which might not be the same as the number of physical characters on the screen in the presence of multibyte characters */ rl += ind - pind; physchars += _rl_col_width (nprompt, pind, ind, 0); } else ninvis += ind - pind; p--; /* compensate for later increment */ } else #endif { *r++ = *p; if (!ignoring) { rl++; /* visible length byte counter */ physchars++; } else ninvis++; /* invisible chars byte counter */ } if (invflset == 0 && physchars >= _rl_screenwidth) { invfl = ninvis; invflset = 1; } if (physchars >= (bound = (newlines + 1) * _rl_screenwidth) && local_prompt_newlines[newlines+1] == -1) { int new; if (physchars > bound) /* should rarely happen */ { #if defined (HANDLE_MULTIBYTE) *r = '\0'; /* need null-termination for strlen */ if (mb_cur_max > 1 && rl_byte_oriented == 0) new = _rl_find_prev_mbchar (ret, r - ret, MB_FIND_ANY); else #endif new = r - ret - (physchars - bound); /* XXX */ } else new = r - ret; local_prompt_newlines[++newlines] = new; local_prompt_invis_chars[newlines - 1] = ninvis - lastinvis; lastinvis = ninvis; } /* What if a physical character of width >= 2 is split? There is code that wraps before the physical screen width if the character width would exceed it, but it needs to be checked against this code and local_prompt_newlines[]. */ if (ignoring == 0) can_add_invis = (physchars == bound); } } if (rl <= _rl_screenwidth) invfl = ninvis; /* Make sure we account for invisible characters on the last line. */ local_prompt_invis_chars[newlines] = ninvis - lastinvis; *r = '\0'; if (lp) *lp = rl; if (lip) *lip = last; if (niflp) *niflp = invfl; if (vlp) *vlp = physchars; if (nprompt != pmt) xfree (nprompt); return ret; } /* Just strip out RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE from PMT and return the rest of PMT. */ char * _rl_strip_prompt (char *pmt) { char *ret; ret = expand_prompt (pmt, 0, (int *)NULL, (int *)NULL, (int *)NULL, (int *)NULL); return ret; } void _rl_reset_prompt (void) { rl_visible_prompt_length = rl_expand_prompt (rl_prompt); } /* * Expand the prompt string into the various display components, if * necessary. * * local_prompt = expanded last line of string in rl_display_prompt * (portion after the final newline) * local_prompt_prefix = portion before last newline of rl_display_prompt, * expanded via expand_prompt * prompt_visible_length = number of visible characters in local_prompt * prompt_prefix_length = number of visible characters in local_prompt_prefix * * It also tries to keep track of the number of invisible characters in the * prompt string, and where they are. * * This function is called once per call to readline(). It may also be * called arbitrarily to expand the primary prompt. * * The return value is the number of visible characters on the last line * of the (possibly multi-line) prompt. In this case, multi-line means * there are embedded newlines in the prompt string itself, not that the * number of physical characters exceeds the screen width and the prompt * wraps. */ int rl_expand_prompt (char *prompt) { char *p, *t; int c; /* Clear out any saved values. */ FREE (local_prompt); FREE (local_prompt_prefix); /* Set default values for variables expand_prompt sets */ local_prompt = local_prompt_prefix = (char *)0; local_prompt_len = 0; prompt_last_invisible = prompt_invis_chars_first_line = 0; prompt_visible_length = prompt_physical_chars = 0; if (local_prompt_invis_chars == 0) local_prompt_invis_chars = (int *)xmalloc (sizeof (int)); local_prompt_invis_chars[0] = 0; if (prompt == 0 || *prompt == 0) { local_prompt = xmalloc (sizeof (char)); local_prompt[0] = '\0'; return (0); } p = strrchr (prompt, '\n'); if (p == 0) { /* The prompt is only one logical line, though it might wrap. */ local_prompt = expand_prompt (prompt, 0, &prompt_visible_length, &prompt_last_invisible, &prompt_invis_chars_first_line, &prompt_physical_chars); local_prompt_prefix = (char *)0; local_prompt_len = local_prompt ? strlen (local_prompt) : 0; return (prompt_visible_length); } else { /* The prompt spans multiple lines. */ t = ++p; c = *t; *t = '\0'; /* The portion of the prompt string up to and including the final newline is now null-terminated. */ local_prompt_prefix = expand_prompt (prompt, PMT_MULTILINE, &prompt_prefix_length, (int *)NULL, (int *)NULL, (int *)NULL); *t = c; local_prompt = expand_prompt (p, PMT_MULTILINE, &prompt_visible_length, &prompt_last_invisible, &prompt_invis_chars_first_line, &prompt_physical_chars); local_prompt_len = local_prompt ? strlen (local_prompt) : 0; return (prompt_prefix_length); } } /* Allocate the various line structures, making sure they can hold MINSIZE bytes. If the existing line size can accommodate MINSIZE bytes, don't do anything. */ static void realloc_line (int minsize) { size_t minimum_size; size_t newsize, delta; minimum_size = DEFAULT_LINE_BUFFER_SIZE; if (minsize < minimum_size) minsize = minimum_size; if (minsize <= _rl_screenwidth) /* XXX - for gdb */ minsize = _rl_screenwidth + 1; if (line_size >= minsize) return; newsize = minimum_size; while (newsize < minsize) newsize *= 2; visible_line = (char *)xrealloc (visible_line, newsize); vis_face = (char *)xrealloc (vis_face, newsize); invisible_line = (char *)xrealloc (invisible_line, newsize); inv_face = (char *)xrealloc (inv_face, newsize); delta = newsize - line_size; memset (visible_line + line_size, 0, delta); memset (vis_face + line_size, FACE_NORMAL, delta); memset (invisible_line + line_size, 1, delta); memset (inv_face + line_size, FACE_INVALID, delta); line_size = newsize; } /* Initialize the VISIBLE_LINE and INVISIBLE_LINE arrays, and their associated arrays of line break markers. MINSIZE is the minimum size of VISIBLE_LINE and INVISIBLE_LINE; if it is greater than LINE_SIZE, LINE_SIZE is increased. If the lines have already been allocated, this ensures that they can hold at least MINSIZE characters. */ static void init_line_structures (int minsize) { if (invisible_line == 0) /* initialize it */ { if (line_size > minsize) minsize = line_size; } realloc_line (minsize); if (vis_lbreaks == 0) { /* should be enough. */ inv_lbsize = vis_lbsize = 256; #if defined (HANDLE_MULTIBYTE) line_state_visible->wbsize = vis_lbsize; line_state_visible->wrapped_line = (int *)xmalloc (line_state_visible->wbsize * sizeof (int)); line_state_invisible->wbsize = inv_lbsize; line_state_invisible->wrapped_line = (int *)xmalloc (line_state_invisible->wbsize * sizeof (int)); #endif inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int)); vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int)); inv_lbreaks[0] = vis_lbreaks[0] = 0; } line_structures_initialized = 1; } /* Convenience functions to add chars to the invisible line that update the face information at the same time. */ static void /* XXX - change this */ invis_addc (int *outp, char c, char face) { realloc_line (*outp + 1); invisible_line[*outp] = c; inv_face[*outp] = face; *outp += 1; } static void invis_adds (int *outp, const char *str, int n, char face) { int i; for (i = 0; i < n; i++) invis_addc (outp, str[i], face); } static void invis_nul (int *outp) { invis_addc (outp, '\0', 0); *outp -= 1; } static void set_active_region (int *beg, int *end) { if (rl_point >= 0 && rl_point <= rl_end && rl_mark >= 0 && rl_mark <= rl_end) { *beg = (rl_mark < rl_point) ? rl_mark : rl_point; *end = (rl_mark < rl_point) ? rl_point : rl_mark; } } /* Do whatever tests are necessary and tell update_line that it can do a quick, dumb redisplay on the assumption that there are so many differences between the old and new lines that it would be a waste to compute all the differences. Right now, it just sets _rl_quick_redisplay if the current visible line is a single line (so we don't have to move vertically or mess with line wrapping). */ void _rl_optimize_redisplay (void) { if (_rl_vis_botlin == 0) _rl_quick_redisplay = 1; } /* Useful shorthand used by rl_redisplay, update_line, rl_move_cursor_relative */ #define INVIS_FIRST() (local_prompt_invis_chars[0]) #define WRAP_OFFSET(line, offset) ((line <= prompt_last_screen_line) ? local_prompt_invis_chars[line] : 0) #define W_OFFSET(line, offset) ((line) == 0 ? offset : 0) #define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l])) #define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l]) #define VIS_CHARS(line) (visible_line + vis_lbreaks[line]) #define VIS_FACE(line) (vis_face + vis_lbreaks[line]) #define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line) #define VIS_LINE_FACE(line) ((line) > _rl_vis_botlin) ? "" : VIS_FACE(line) #define INV_LINE(line) (invisible_line + inv_lbreaks[line]) #define INV_LINE_FACE(line) (inv_face + inv_lbreaks[line]) #define INV_CHARS_CURRENT_PROMPT_LINE(line) \ (local_prompt_invis_chars[line] > 0) #define OLD_CPOS_IN_PROMPT() (cpos_adjusted == 0 && \ _rl_last_c_pos != o_cpos && \ _rl_last_c_pos > wrap_offset && \ o_cpos < prompt_last_invisible) /* Basic redisplay algorithm. See comments inline. */ void rl_redisplay (void) { int in, out, c, linenum, cursor_linenum; int inv_botlin, lb_botlin, lb_linenum, o_cpos; int newlines, lpos, temp, num; char *prompt_this_line; char cur_face; int hl_begin, hl_end; int short_circuit; int mb_cur_max = MB_CUR_MAX; #if defined (HANDLE_MULTIBYTE) WCHAR_T wc; size_t wc_bytes; int wc_width; mbstate_t ps; int _rl_wrapped_multicolumn = 0; #endif if (_rl_echoing_p == 0) return; /* Block keyboard interrupts because this function manipulates global data structures. */ _rl_block_sigint (); RL_SETSTATE (RL_STATE_REDISPLAYING); cur_face = FACE_NORMAL; /* Can turn this into an array for multiple highlighted objects in addition to the region */ hl_begin = hl_end = -1; if (rl_mark_active_p ()) set_active_region (&hl_begin, &hl_end); if (!rl_display_prompt) rl_display_prompt = ""; if (line_structures_initialized == 0) { init_line_structures (0); rl_on_new_line (); } else if (line_size <= _rl_screenwidth) init_line_structures (_rl_screenwidth + 1); /* Enable horizontal scrolling automatically for terminals of height 1 where wrapping lines doesn't work. Disable it as soon as the terminal height is increased again if it was automatically enabled. */ if (_rl_screenheight <= 1) { if (_rl_horizontal_scroll_mode == 0) horizontal_scrolling_autoset = 1; _rl_horizontal_scroll_mode = 1; } else if (horizontal_scrolling_autoset) _rl_horizontal_scroll_mode = 0; /* Draw the line into the buffer. */ cpos_buffer_position = -1; prompt_multibyte_chars = prompt_visible_length - prompt_physical_chars; out = inv_botlin = 0; /* Mark the line as modified or not. We only do this for history lines. */ modmark = 0; if (_rl_mark_modified_lines && current_history () && rl_undo_list) { invis_addc (&out, '*', cur_face); invis_nul (&out); modmark = 1; } /* If someone thought that the redisplay was handled, but the currently visible line has a different modification state than the one about to become visible, then correct the caller's misconception. */ if (visible_line[0] != invisible_line[0]) rl_display_fixed = 0; /* If the prompt to be displayed is the `primary' readline prompt (the one passed to readline()), use the values we have already expanded. If not, use what's already in rl_display_prompt. WRAP_OFFSET is the number of non-visible characters (bytes) in the prompt string. */ /* This is where we output the characters in the prompt before the last newline, if any. If there aren't any embedded newlines, we don't write anything. Copy the last line of the prompt string into the line in any case */ if (rl_display_prompt == rl_prompt || local_prompt) { if (local_prompt_prefix && forced_display) _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix)); if (local_prompt_len > 0) invis_adds (&out, local_prompt, local_prompt_len, cur_face); invis_nul (&out); wrap_offset = local_prompt_len - prompt_visible_length; } else { int pmtlen; prompt_this_line = strrchr (rl_display_prompt, '\n'); if (!prompt_this_line) prompt_this_line = rl_display_prompt; else { prompt_this_line++; pmtlen = prompt_this_line - rl_display_prompt; /* temp var */ if (forced_display) { _rl_output_some_chars (rl_display_prompt, pmtlen); /* Make sure we are at column zero even after a newline, regardless of the state of terminal output processing. */ if (pmtlen < 2 || prompt_this_line[-2] != '\r') cr (); } } prompt_physical_chars = pmtlen = strlen (prompt_this_line); /* XXX */ invis_adds (&out, prompt_this_line, pmtlen, cur_face); invis_nul (&out); wrap_offset = prompt_invis_chars_first_line = 0; } #if defined (HANDLE_MULTIBYTE) #define CHECK_INV_LBREAKS() \ do { \ if (newlines >= (inv_lbsize - 2)) \ { \ inv_lbsize *= 2; \ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ } \ if (newlines >= (line_state_invisible->wbsize - 2)) \ { \ line_state_invisible->wbsize *= 2; \ line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, line_state_invisible->wbsize * sizeof(int)); \ } \ } while (0) #else #define CHECK_INV_LBREAKS() \ do { \ if (newlines >= (inv_lbsize - 2)) \ { \ inv_lbsize *= 2; \ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ } \ } while (0) #endif /* !HANDLE_MULTIBYTE */ #if defined (HANDLE_MULTIBYTE) #define CHECK_LPOS() \ do { \ lpos++; \ if (lpos >= _rl_screenwidth) \ { \ if (newlines >= (inv_lbsize - 2)) \ { \ inv_lbsize *= 2; \ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ } \ inv_lbreaks[++newlines] = out; \ if (newlines >= (line_state_invisible->wbsize - 2)) \ { \ line_state_invisible->wbsize *= 2; \ line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, line_state_invisible->wbsize * sizeof(int)); \ } \ line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; \ lpos = 0; \ } \ } while (0) #else #define CHECK_LPOS() \ do { \ lpos++; \ if (lpos >= _rl_screenwidth) \ { \ if (newlines >= (inv_lbsize - 2)) \ { \ inv_lbsize *= 2; \ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ } \ inv_lbreaks[++newlines] = out; \ lpos = 0; \ } \ } while (0) #endif /* inv_lbreaks[i] is where line i starts in the buffer. */ inv_lbreaks[newlines = 0] = 0; /* lpos is a physical cursor position, so it needs to be adjusted by the number of invisible characters in the prompt, per line. We compute the line breaks in the prompt string in expand_prompt, taking invisible characters into account, and if lpos exceeds the screen width, we copy the data in the loop below. */ lpos = local_prompt ? prompt_physical_chars + modmark : 0; #if defined (HANDLE_MULTIBYTE) memset (line_state_invisible->wrapped_line, 0, line_state_invisible->wbsize * sizeof (int)); num = 0; #endif /* prompt_invis_chars_first_line is the number of invisible characters (bytes) in the first physical line of the prompt. wrap_offset - prompt_invis_chars_first_line is usually the number of invis chars on the second (or, more generally, last) line. */ /* XXX - There is code that assumes that all the invisible characters occur on the first and last prompt lines; change that to use local_prompt_invis_chars */ /* what if lpos is already >= _rl_screenwidth before we start drawing the contents of the command line? */ if (lpos >= _rl_screenwidth) { temp = 0; /* first copy the linebreaks array we computed in expand_prompt */ while (local_prompt_newlines[newlines+1] != -1) { temp = local_prompt_newlines[newlines+1]; inv_lbreaks[++newlines] = temp; } /* Now set lpos from the last newline */ /* XXX - change to use local_prompt_invis_chars[] */ if (mb_cur_max > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0) lpos = _rl_col_width (local_prompt, temp, local_prompt_len, 1) - (wrap_offset - prompt_invis_chars_first_line); else lpos -= (_rl_screenwidth * newlines); } prompt_last_screen_line = newlines; /* Draw the rest of the line (after the prompt) into invisible_line, keeping track of where the cursor is (cpos_buffer_position), the number of the line containing the cursor (lb_linenum), the last line number (lb_botlin and inv_botlin). It maintains an array of line breaks for display (inv_lbreaks). This handles expanding tabs for display and displaying meta characters. */ lb_linenum = 0; #if defined (HANDLE_MULTIBYTE) in = 0; if (mb_cur_max > 1 && rl_byte_oriented == 0) { memset (&ps, 0, sizeof (mbstate_t)); if (_rl_utf8locale && UTF8_SINGLEBYTE(rl_line_buffer[0])) { wc = (WCHAR_T)rl_line_buffer[0]; wc_bytes = 1; } else wc_bytes = MBRTOWC (&wc, rl_line_buffer, rl_end, &ps); } else wc_bytes = 1; while (in < rl_end) #else for (in = 0; in < rl_end; in++) #endif { if (in == hl_begin) cur_face = FACE_STANDOUT; else if (in == hl_end) cur_face = FACE_NORMAL; c = (unsigned char)rl_line_buffer[in]; #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) { if (MB_INVALIDCH (wc_bytes)) { /* Byte sequence is invalid or shortened. Assume that the first byte represents a character. */ wc_bytes = 1; /* Assume that a character occupies a single column. */ wc_width = 1; memset (&ps, 0, sizeof (mbstate_t)); } else if (MB_NULLWCH (wc_bytes)) break; /* Found '\0' */ else { temp = WCWIDTH (wc); wc_width = (temp >= 0) ? temp : 1; } } else wc_width = 1; /* make sure it's set for the META_CHAR check */ #endif if (in == rl_point) { cpos_buffer_position = out; lb_linenum = newlines; } #if defined (HANDLE_MULTIBYTE) if (META_CHAR (c) && wc_bytes == 1 && wc_width == 1) #else if (META_CHAR (c)) #endif { #if 0 /* TAG: readline-8.4 20230227 */ /* https://savannah.gnu.org/support/index.php?110830 asking for non-printing meta characters to be printed using an escape sequence. */ /* isprint(c) handles bytes up to UCHAR_MAX */ if (_rl_output_meta_chars == 0 || isprint (c) == 0) #else if (_rl_output_meta_chars == 0) #endif { char obuf[5]; int olen; #if defined (HAVE_VSNPRINTF) olen = snprintf (obuf, sizeof (obuf), "\\%o", c); #else olen = sprintf (obuf, "\\%o", c); #endif for (temp = 0; temp < olen; temp++) { invis_addc (&out, obuf[temp], cur_face); CHECK_LPOS (); } } else { invis_addc (&out, c, cur_face); CHECK_LPOS(); } } #if defined (DISPLAY_TABS) else if (c == '\t') { register int newout; newout = out + 8 - lpos % 8; temp = newout - out; if (lpos + temp >= _rl_screenwidth) { register int temp2; temp2 = _rl_screenwidth - lpos; CHECK_INV_LBREAKS (); inv_lbreaks[++newlines] = out + temp2; #if defined (HANDLE_MULTIBYTE) line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; #endif lpos = temp - temp2; while (out < newout) invis_addc (&out, ' ', cur_face); } else { while (out < newout) invis_addc (&out, ' ', cur_face); lpos += temp; } } #endif else if (c == '\n' && _rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) { invis_addc (&out, '\0', cur_face); CHECK_INV_LBREAKS (); inv_lbreaks[++newlines] = out; #if defined (HANDLE_MULTIBYTE) line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; #endif lpos = 0; } else if (CTRL_CHAR (c) || c == RUBOUT) { invis_addc (&out, '^', cur_face); CHECK_LPOS(); invis_addc (&out, CTRL_CHAR (c) ? UNCTRL (c) : '?', cur_face); CHECK_LPOS(); } else { #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) { register int i; _rl_wrapped_multicolumn = 0; if (_rl_screenwidth < lpos + wc_width) for (i = lpos; i < _rl_screenwidth; i++) { /* The space will be removed in update_line() */ invis_addc (&out, ' ', cur_face); _rl_wrapped_multicolumn++; CHECK_LPOS(); } if (in == rl_point) { cpos_buffer_position = out; lb_linenum = newlines; } for (i = in; i < in+wc_bytes; i++) invis_addc (&out, rl_line_buffer[i], cur_face); for (i = 0; i < wc_width; i++) CHECK_LPOS(); } else { invis_addc (&out, c, cur_face); CHECK_LPOS(); } #else invis_addc (&out, c, cur_face); CHECK_LPOS(); #endif } #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) { in += wc_bytes; if (_rl_utf8locale && UTF8_SINGLEBYTE(rl_line_buffer[in])) { wc = (WCHAR_T)rl_line_buffer[in]; wc_bytes = 1; memset (&ps, 0, sizeof (mbstate_t)); /* re-init state */ } else wc_bytes = MBRTOWC (&wc, rl_line_buffer + in, rl_end - in, &ps); } else in++; #endif } invis_nul (&out); line_totbytes = out; if (cpos_buffer_position < 0) { cpos_buffer_position = out; lb_linenum = newlines; } /* If we are switching from one line to multiple wrapped lines, we don't want to do a dumb update (or we want to make it smarter). */ if (_rl_quick_redisplay && newlines > 0) _rl_quick_redisplay = 0; inv_botlin = lb_botlin = _rl_inv_botlin = newlines; CHECK_INV_LBREAKS (); inv_lbreaks[newlines+1] = out; #if defined (HANDLE_MULTIBYTE) /* This should be 0 anyway */ line_state_invisible->wrapped_line[newlines+1] = _rl_wrapped_multicolumn; #endif cursor_linenum = lb_linenum; /* CPOS_BUFFER_POSITION == position in buffer where cursor should be placed. CURSOR_LINENUM == line number where the cursor should be placed. */ /* PWP: now is when things get a bit hairy. The visible and invisible line buffers are really multiple lines, which would wrap every (screenwidth - 1) characters. Go through each in turn, finding the changed region and updating it. The line order is top to bottom. */ /* If we can move the cursor up and down, then use multiple lines, otherwise, let long lines display in a single terminal line, and horizontally scroll it. */ displaying_prompt_first_line = 1; if (_rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up) { int nleft, pos, changed_screen_line, tx; if (!rl_display_fixed || forced_display) { forced_display = 0; /* If we have more than a screenful of material to display, then only display a screenful. We should display the last screen, not the first. */ if (out >= _rl_screenchars) { #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) out = _rl_find_prev_mbchar (invisible_line, _rl_screenchars, MB_FIND_ANY); else #endif out = _rl_screenchars - 1; } /* The first line is at character position 0 in the buffer. The second and subsequent lines start at inv_lbreaks[N], offset by OFFSET (which has already been calculated above). */ /* We don't want to highlight anything that's going to be off the top of the display; if the current line takes up more than an entire screen, just mark the lines that won't be displayed as having a `normal' face. It's imperfect, but better than display corruption. */ if (rl_mark_active_p () && inv_botlin > _rl_screenheight) { int extra; extra = inv_botlin - _rl_screenheight; for (linenum = 0; linenum <= extra; linenum++) norm_face (INV_LINE_FACE(linenum), INV_LLEN (linenum)); } /* XXX - experimental new code */ /* Now that _rl_last_v_pos is a logical count, not bounded by the number of physical screen lines, this is a start at being able to redisplay lines that consume more than the number of physical screen lines in more than a simple `move-to-the-next-line' way. If the new line has more lines than there are physical screen lines, and the cursor would be off the top of the screen if we displayed all the new lines, clear the screen without killing the scrollback buffer, clear out the visible line so we do a complete redraw, and make the loop break when we have displayed a physical screen full of lines. Do the same if we are going to move the cursor to a line that's greater than the number of physical screen lines when we weren't before. SHORT_CIRCUIT says where to break the loop. Pretty simple right now. */ short_circuit = -1; if (inv_botlin >= _rl_screenheight) { int extra; extra = inv_botlin - _rl_screenheight; /* lines off the top */ /* cursor in portion of line that would be off screen or in the lines that exceed the number of physical screen lines. */ if (cursor_linenum <= extra || (cursor_linenum >= _rl_screenheight && _rl_vis_botlin <= _rl_screenheight)) { if (cursor_linenum <= extra) short_circuit = _rl_screenheight; _rl_clear_screen (0); if (visible_line) memset (visible_line, 0, line_size); rl_on_new_line (); } /* The cursor is beyond the number of lines that would be off the top, but we still want to display only the first _RL_SCREENHEIGHT lines starting at the beginning of the line. */ else if (cursor_linenum > extra && cursor_linenum <= _rl_screenheight && _rl_vis_botlin <= _rl_screenheight) short_circuit = _rl_screenheight; } /* For each line in the buffer, do the updating display. */ for (linenum = 0; linenum <= inv_botlin; linenum++) { if (short_circuit >= 0 && linenum == short_circuit) break; /* This can lead us astray if we execute a program that changes the locale from a non-multibyte to a multibyte one. */ o_cpos = _rl_last_c_pos; cpos_adjusted = 0; update_line (VIS_LINE(linenum), VIS_LINE_FACE(linenum), INV_LINE(linenum), INV_LINE_FACE(linenum), linenum, VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin); /* update_line potentially changes _rl_last_c_pos, but doesn't take invisible characters into account, since _rl_last_c_pos is an absolute cursor position in a multibyte locale. We choose to (mostly) compensate for that here, rather than change update_line itself. There are several cases in which update_line adjusts _rl_last_c_pos itself (so it can pass _rl_move_cursor_relative accurate values); it communicates this back by setting cpos_adjusted. If we assume that _rl_last_c_pos is correct (an absolute cursor position) each time update_line is called, then we can assume in our calculations that o_cpos does not need to be adjusted by wrap_offset. */ if (linenum == 0 && (mb_cur_max > 1 && rl_byte_oriented == 0) && OLD_CPOS_IN_PROMPT()) _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */ else if (cpos_adjusted == 0 && linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth && (mb_cur_max > 1 && rl_byte_oriented == 0) && _rl_last_c_pos != o_cpos && _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line)) /* XXX - rethink this last one */ /* This assumes that all the invisible characters are split between the first and last lines of the prompt, if the prompt consumes more than two lines. It's usually right */ /* XXX - not sure this is ever executed */ /* XXX - use local_prompt_invis_chars[linenum] */ _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line); /* If this is the line with the prompt, we might need to compensate for invisible characters in the new line. Do this only if there is not more than one new line (which implies that we completely overwrite the old visible line) and the new line is shorter than the old. Make sure we are at the end of the new line before clearing. */ if (linenum == 0 && inv_botlin == 0 && _rl_last_c_pos == out && (wrap_offset > visible_wrap_offset) && (_rl_last_c_pos < visible_first_line_len)) { if (mb_cur_max > 1 && rl_byte_oriented == 0) nleft = _rl_screenwidth - _rl_last_c_pos; else nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos; if (nleft) _rl_clear_to_eol (nleft); } #if 0 /* This segment is intended to handle the case where the old visible prompt has invisible characters and the new line to be displayed needs to clear the rest of the old characters out (e.g., when printing the i-search prompt): in general, the case of the new line being shorter than the old. We need to be at the end of the new line and the old line needs to be longer than the current cursor position. It's not perfect, since it uses the byte length of the first line, but this will at worst result in some extra clear-to-end-of-lines. We can't use the prompt length variables because they may not correspond to the visible line (see printing the i-search prompt above). The tests for differing numbers of invisible characters may not matter and can probably be removed. */ else if (linenum == 0 && linenum == prompt_last_screen_line && _rl_last_c_pos == out && _rl_last_c_pos < visible_first_line_len && visible_wrap_offset && visible_wrap_offset != wrap_offset) { if (mb_cur_max > 1 && rl_byte_oriented == 0) nleft = _rl_screenwidth - _rl_last_c_pos; else nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos; if (nleft) _rl_clear_to_eol (nleft); } #endif /* Since the new first line is now visible, save its length. */ if (linenum == 0) visible_first_line_len = (inv_botlin > 0) ? inv_lbreaks[1] : out - wrap_offset; } /* We may have deleted some lines. If so, clear the left over blank ones at the bottom out. */ if (_rl_vis_botlin > inv_botlin) { char *tt; for (; linenum <= _rl_vis_botlin; linenum++) { tt = VIS_CHARS (linenum); _rl_move_vert (linenum); _rl_move_cursor_relative (0, tt, VIS_FACE(linenum)); _rl_clear_to_eol ((linenum == _rl_vis_botlin) ? strlen (tt) : _rl_screenwidth); } } _rl_vis_botlin = (short_circuit >= 0) ? short_circuit : inv_botlin; /* CHANGED_SCREEN_LINE is set to 1 if we have moved to a different screen line during this redisplay. */ changed_screen_line = _rl_last_v_pos != cursor_linenum; if (changed_screen_line) { int physpos; /* The physpos calculation is to account for lines with differing numbers of invisible characters. */ if (mb_cur_max == 1 || rl_byte_oriented) physpos = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset); /* Move to the line where the cursor will be. */ _rl_move_vert (cursor_linenum); /* If we moved up to the line with the prompt using _rl_term_up, the physical cursor position on the screen stays the same, but the buffer position needs to be adjusted to account for invisible characters. */ if ((mb_cur_max == 1 || rl_byte_oriented) && cursor_linenum == prompt_last_screen_line) _rl_last_c_pos = physpos + WRAP_OFFSET (cursor_linenum, wrap_offset); } /* Now we move the cursor to where it needs to be. First, make sure we are on the correct line (cursor_linenum). */ /* We have to reprint the prompt if it contains invisible characters, since it's not generally OK to just reprint the characters from the current cursor position. But we only need to reprint it if the cursor is before the last invisible character in the prompt string. */ /* XXX - why not use local_prompt_len? */ nleft = prompt_visible_length + wrap_offset; if (cursor_linenum == prompt_last_screen_line) { int pmt_offset = local_prompt_newlines ? local_prompt_newlines[cursor_linenum] : 0; int curline_invchars = local_prompt_invis_chars ? local_prompt_invis_chars[cursor_linenum] : wrap_offset; int cursor_bufpos; /* cursor_bufpos is where the portion of the prompt that appears on the current screen line begins in the buffer. It is a buffer position, an index into curline (local_prompt + pmt_offset) */ cursor_bufpos = pmt_offset; if (mb_cur_max == 1 || rl_byte_oriented) cursor_bufpos += _rl_last_c_pos; else cursor_bufpos += _rl_last_c_pos + curline_invchars; if (local_prompt && local_prompt_invis_chars[cursor_linenum] && _rl_last_c_pos > 0 && cursor_bufpos <= prompt_last_invisible) { _rl_cr (); if (modmark) _rl_output_some_chars ("*", 1); /* If the number of characters in local_prompt is greater than the screen width, the prompt wraps. We only want to print the portion after the line wrap. */ /* Make sure we set _rl_last_c_pos based on the number of characters we actually output, since we start at column 0. */ if (cursor_linenum > 0 && pmt_offset > 0 && nleft > pmt_offset) _rl_output_some_chars (local_prompt + pmt_offset, nleft - pmt_offset); else { _rl_output_some_chars (local_prompt, nleft); pmt_offset = 0; /* force for calculation below */ } if (mb_cur_max > 1 && rl_byte_oriented == 0) /* Start width calculation where we started output. */ _rl_last_c_pos = _rl_col_width (local_prompt, pmt_offset, nleft, 1) - WRAP_OFFSET(cursor_linenum, wrap_offset) + modmark; else /* Index into invisible_line+inv_lbreaks[cursor_linenum], since that's what we use in the call to _rl_move_cursor_relative below. */ _rl_last_c_pos = nleft + modmark - inv_lbreaks[cursor_linenum]; /* buffer position */ } } /* Where on that line? And where does that line start in the buffer? */ pos = inv_lbreaks[cursor_linenum]; /* nleft == number of characters (bytes) in the line buffer between the start of the line and the desired cursor position. */ nleft = cpos_buffer_position - pos; /* NLEFT is now a number of characters in a buffer. When in a multibyte locale, however, _rl_last_c_pos is an absolute cursor position that doesn't take invisible characters in the prompt into account. We use a fudge factor to compensate. */ /* Since _rl_backspace() doesn't know about invisible characters in the prompt, and there's no good way to tell it, we compensate for those characters here and call _rl_backspace() directly if necessary */ /* XXX - might need to check cursor_linenum == prompt_last_screen_line like above. */ if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos) { /* TX == new physical cursor position in multibyte locale. */ if (mb_cur_max > 1 && rl_byte_oriented == 0) tx = _rl_col_width (&visible_line[pos], 0, nleft, 1) - visible_wrap_offset; else tx = nleft; if (tx >= 0 && _rl_last_c_pos > tx) { _rl_backspace (_rl_last_c_pos - tx); /* XXX */ _rl_last_c_pos = tx; } } /* We need to note that in a multibyte locale we are dealing with _rl_last_c_pos as an absolute cursor position, but moving to a point specified by a buffer position (NLEFT) that doesn't take invisible characters into account. */ if (mb_cur_max > 1 && rl_byte_oriented == 0) _rl_move_cursor_relative (nleft, &invisible_line[pos], &inv_face[pos]); else if (nleft != _rl_last_c_pos) _rl_move_cursor_relative (nleft, &invisible_line[pos], &inv_face[pos]); } } else /* Do horizontal scrolling. Much simpler */ { #define M_OFFSET(margin, offset) ((margin) == 0 ? offset : 0) int lmargin, ndisp, nleft, phys_c_pos, t; /* Always at top line. */ _rl_last_v_pos = 0; /* Compute where in the buffer the displayed line should start. This will be LMARGIN. */ /* The number of characters that will be displayed before the cursor. */ ndisp = cpos_buffer_position - wrap_offset; nleft = prompt_visible_length + wrap_offset; /* Where the new cursor position will be on the screen. This can be longer than SCREENWIDTH; if it is, lmargin will be adjusted. */ phys_c_pos = cpos_buffer_position - (last_lmargin ? last_lmargin : wrap_offset); t = _rl_screenwidth / 3; /* If the number of characters had already exceeded the screenwidth, last_lmargin will be > 0. */ /* If the number of characters to be displayed is more than the screen width, compute the starting offset so that the cursor is about two-thirds of the way across the screen. */ if (phys_c_pos > _rl_screenwidth - 2) { lmargin = cpos_buffer_position - (2 * t); if (lmargin < 0) lmargin = 0; /* If the left margin would be in the middle of a prompt with invisible characters, don't display the prompt at all. */ if (wrap_offset && lmargin > 0 && lmargin < nleft) lmargin = nleft; } else if (ndisp < _rl_screenwidth - 2) /* XXX - was -1 */ lmargin = 0; else if (phys_c_pos < 1) { /* If we are moving back towards the beginning of the line and the last margin is no longer correct, compute a new one. */ lmargin = ((cpos_buffer_position - 1) / t) * t; /* XXX */ if (wrap_offset && lmargin > 0 && lmargin < nleft) lmargin = nleft; } else lmargin = last_lmargin; displaying_prompt_first_line = lmargin < nleft; /* If the first character on the screen isn't the first character in the display line, indicate this with a special character. */ if (lmargin > 0) invisible_line[lmargin] = '<'; /* If SCREENWIDTH characters starting at LMARGIN do not encompass the whole line, indicate that with a special character at the right edge of the screen. If LMARGIN is 0, we need to take the wrap offset into account. */ t = lmargin + M_OFFSET (lmargin, wrap_offset) + _rl_screenwidth; if (t > 0 && t < out) invisible_line[t - 1] = '>'; if (rl_display_fixed == 0 || forced_display || lmargin != last_lmargin) { forced_display = 0; o_cpos = _rl_last_c_pos; cpos_adjusted = 0; update_line (&visible_line[last_lmargin], &vis_face[last_lmargin], &invisible_line[lmargin], &inv_face[lmargin], 0, _rl_screenwidth + visible_wrap_offset, _rl_screenwidth + (lmargin ? 0 : wrap_offset), 0); if ((mb_cur_max > 1 && rl_byte_oriented == 0) && displaying_prompt_first_line && OLD_CPOS_IN_PROMPT()) _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */ /* If the visible new line is shorter than the old, but the number of invisible characters is greater, and we are at the end of the new line, we need to clear to eol. */ t = _rl_last_c_pos - M_OFFSET (lmargin, wrap_offset); if ((M_OFFSET (lmargin, wrap_offset) > visible_wrap_offset) && (_rl_last_c_pos == out) && displaying_prompt_first_line && t < visible_first_line_len) { nleft = _rl_screenwidth - t; _rl_clear_to_eol (nleft); } visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset); if (visible_first_line_len > _rl_screenwidth) visible_first_line_len = _rl_screenwidth; _rl_move_cursor_relative (cpos_buffer_position - lmargin, &invisible_line[lmargin], &inv_face[lmargin]); last_lmargin = lmargin; } } fflush (rl_outstream); /* Swap visible and non-visible lines. */ { struct line_state *vtemp = line_state_visible; line_state_visible = line_state_invisible; line_state_invisible = vtemp; rl_display_fixed = 0; /* If we are displaying on a single line, and last_lmargin is > 0, we are not displaying any invisible characters, so set visible_wrap_offset to 0. */ if (_rl_horizontal_scroll_mode && last_lmargin) visible_wrap_offset = 0; else visible_wrap_offset = wrap_offset; _rl_quick_redisplay = 0; } RL_UNSETSTATE (RL_STATE_REDISPLAYING); _rl_release_sigint (); } static void putc_face (int c, int face, char *cur_face) { char cf; cf = *cur_face; if (cf != face) { if (cf != FACE_NORMAL && cf != FACE_STANDOUT) return; if (face != FACE_NORMAL && face != FACE_STANDOUT) return; if (face == FACE_STANDOUT && cf == FACE_NORMAL) _rl_region_color_on (); if (face == FACE_NORMAL && cf == FACE_STANDOUT) _rl_region_color_off (); *cur_face = face; } if (c != EOF) putc (c, rl_outstream); } static void puts_face (const char *str, const char *face, int n) { int i; char cur_face; for (cur_face = FACE_NORMAL, i = 0; i < n; i++) putc_face ((unsigned char) str[i], face[i], &cur_face); putc_face (EOF, FACE_NORMAL, &cur_face); } static void norm_face (char *face, int n) { memset (face, FACE_NORMAL, n); } #define ADJUST_CPOS(x) do { _rl_last_c_pos -= (x) ; cpos_adjusted = 1; } while (0) /* PWP: update_line() is based on finding the middle difference of each line on the screen; vis: /old first difference /beginning of line | /old last same /old EOL v v v v old: eddie> Oh, my little gruntle-buggy is to me, as lurgid as new: eddie> Oh, my little buggy says to me, as lurgid as ^ ^ ^ ^ \beginning of line | \new last same \new end of line \new first difference All are character pointers for the sake of speed. Special cases for no differences, as well as for end of line additions must be handled. Could be made even smarter, but this works well enough */ static void update_line (char *old, char *old_face, char *new, char *new_face, int current_line, int omax, int nmax, int inv_botlin) { char *ofd, *ols, *oe, *nfd, *nls, *ne; char *ofdf, *nfdf, *olsf, *nlsf; int temp, lendiff, wsatend, od, nd, o_cpos; int current_invis_chars; int col_lendiff, col_temp; int bytes_to_insert; int mb_cur_max = MB_CUR_MAX; #if defined (HANDLE_MULTIBYTE) mbstate_t ps_new, ps_old; int new_offset, old_offset; #endif /* If we're at the right edge of a terminal that supports xn, we're ready to wrap around, so do so. This fixes problems with knowing the exact cursor position and cut-and-paste with certain terminal emulators. In this calculation, TEMP is the physical screen position of the cursor. */ if (mb_cur_max > 1 && rl_byte_oriented == 0) temp = _rl_last_c_pos; else temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset); if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode && _rl_last_v_pos == current_line - 1) { /* We're going to wrap around by writing the first character of NEW to the screen and dealing with changes to what's visible by modifying OLD to match it. Complicated by the presence of multi-width characters at the end of the line or beginning of the new one. */ /* old is always somewhere in visible_line; new is always somewhere in invisible_line. These should always be null-terminated. */ #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) { WCHAR_T wc; mbstate_t ps; int oldwidth, newwidth; int oldbytes, newbytes; size_t ret; /* This fixes only double-column characters, but if the wrapped character consumes more than three columns, spaces will be inserted in the string buffer. */ /* XXX remember that we are working on the invisible line right now; we don't swap visible and invisible until just before rl_redisplay returns */ /* This will remove the extra placeholder space we added with _rl_wrapped_multicolumn */ if (current_line < line_state_invisible->wbsize && line_state_invisible->wrapped_line[current_line] > 0) _rl_clear_to_eol (line_state_invisible->wrapped_line[current_line]); /* 1. how many screen positions does first char in old consume? */ memset (&ps, 0, sizeof (mbstate_t)); ret = MBRTOWC (&wc, old, mb_cur_max, &ps); oldbytes = ret; if (MB_INVALIDCH (ret)) { oldwidth = 1; oldbytes = 1; } else if (MB_NULLWCH (ret)) oldwidth = 0; else oldwidth = WCWIDTH (wc); if (oldwidth < 0) oldwidth = 1; /* 2. how many screen positions does the first char in new consume? */ memset (&ps, 0, sizeof (mbstate_t)); ret = MBRTOWC (&wc, new, mb_cur_max, &ps); newbytes = ret; if (MB_INVALIDCH (ret)) { newwidth = 1; newbytes = 1; } else if (MB_NULLWCH (ret)) newwidth = 0; else newwidth = WCWIDTH (wc); if (newwidth < 0) newwidth = 1; /* 3. if the new width is less than the old width, we need to keep going in new until we have consumed at least that many screen positions, and figure out how many bytes that will take */ while (newbytes < nmax && newwidth < oldwidth) { int t; ret = MBRTOWC (&wc, new+newbytes, mb_cur_max, &ps); if (MB_INVALIDCH (ret)) { newwidth += 1; newbytes += 1; } else if (MB_NULLWCH (ret)) break; else { t = WCWIDTH (wc); newwidth += (t >= 0) ? t : 1; newbytes += ret; } } /* 4. If the new width is more than the old width, keep going in old until we have consumed exactly that many screen positions, and figure out how many bytes that will take. This is an optimization */ while (oldbytes < omax && oldwidth < newwidth) { int t; ret = MBRTOWC (&wc, old+oldbytes, mb_cur_max, &ps); if (MB_INVALIDCH (ret)) { oldwidth += 1; oldbytes += 1; } else if (MB_NULLWCH (ret)) break; else { t = WCWIDTH (wc); oldwidth += (t >= 0) ? t : 1; oldbytes += ret; } } /* 5. write the first newbytes of new, which takes newwidth. This is where the screen wrapping takes place, and we are now writing characters onto the new line. We need to fix up old so it accurately reflects what is on the screen after the _rl_output_some_chars below. */ if (newwidth > 0) { int i, j; puts_face (new, new_face, newbytes); _rl_last_c_pos = newwidth; _rl_last_v_pos++; /* 5a. If the number of screen positions doesn't match, punt and do a dumb update. 5b. If the number of bytes is greater in the new line than the old, do a dumb update, because there is no guarantee we can extend the old line enough to fit the new bytes. */ if (newwidth != oldwidth || newbytes > oldbytes) { oe = old + omax; ne = new + nmax; nd = newbytes; nfd = new + nd; ofdf = old_face + oldbytes; nfdf = new_face + newbytes; goto dumb_update; } if (oldbytes != 0 && newbytes != 0) { /* We have written as many bytes from new as we need to consume the first character of old. Fix up `old' so it reflects the new screen contents. We use +1 in the memmove call to copy the trailing NUL. */ /* (strlen(old+oldbytes) == (omax - oldbytes - 1)) */ /* Don't bother trying to fit the bytes if the number of bytes doesn't change. */ if (oldbytes != newbytes) { memmove (old+newbytes, old+oldbytes, strlen (old+oldbytes) + 1); memmove (old_face+newbytes, old_face+oldbytes, strlen (old+oldbytes) + 1); } memcpy (old, new, newbytes); memcpy (old_face, new_face, newbytes); j = newbytes - oldbytes; omax += j; /* Fix up indices if we copy data from one line to another */ for (i = current_line+1; j != 0 && i <= inv_botlin+1 && i <=_rl_vis_botlin+1; i++) vis_lbreaks[i] += j; } } else { putc (' ', rl_outstream); _rl_last_c_pos = 1; _rl_last_v_pos++; if (old[0] && new[0]) { old[0] = new[0]; old_face[0] = new_face[0]; } } } else #endif { if (new[0]) puts_face (new, new_face, 1); else putc (' ', rl_outstream); _rl_last_c_pos = 1; _rl_last_v_pos++; if (old[0] && new[0]) { old[0] = new[0]; old_face[0] = new_face[0]; } } } /* We know that we are dealing with a single screen line here */ if (_rl_quick_redisplay) { nfd = new; nfdf = new_face; ofd = old; ofdf = old_face; for (od = 0, oe = ofd; od < omax && *oe; oe++, od++); for (nd = 0, ne = nfd; nd < nmax && *ne; ne++, nd++); od = nd = 0; _rl_move_cursor_relative (0, old, old_face); bytes_to_insert = ne - nfd; if (bytes_to_insert < local_prompt_len) /* ??? */ goto dumb_update; /* output the prompt, output the line contents, clear the rest */ _rl_output_some_chars (nfd, local_prompt_len); if (mb_cur_max > 1 && rl_byte_oriented == 0) _rl_last_c_pos = prompt_physical_chars; else _rl_last_c_pos = local_prompt_len; bytes_to_insert -= local_prompt_len; if (bytes_to_insert > 0) { puts_face (new+local_prompt_len, nfdf+local_prompt_len, bytes_to_insert); if (mb_cur_max > 1 && rl_byte_oriented) _rl_last_c_pos += _rl_col_width (new, local_prompt_len, ne-new, 1); else _rl_last_c_pos += bytes_to_insert; } /* See comments at dumb_update: for an explanation of this heuristic */ if (nmax < omax) goto clear_rest_of_line; /* XXX - need to use WRAP_OFFSET(current_line, wrap_offset) instead of W_OFFSET - XXX */ else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset))) goto clear_rest_of_line; else return; } /* Find first difference. */ #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) { /* See if the old line is a subset of the new line, so that the only change is adding characters. */ temp = (omax < nmax) ? omax : nmax; if (memcmp (old, new, temp) == 0 && memcmp (old_face, new_face, temp) == 0) { new_offset = old_offset = temp; /* adding at the end */ ofd = old + temp; ofdf = old_face + temp; nfd = new + temp; nfdf = new_face + temp; } else { memset (&ps_new, 0, sizeof(mbstate_t)); memset (&ps_old, 0, sizeof(mbstate_t)); /* Are the old and new lines the same? */ if (omax == nmax && memcmp (new, old, omax) == 0 && memcmp (new_face, old_face, omax) == 0) { old_offset = omax; new_offset = nmax; ofd = old + omax; ofdf = old_face + omax; nfd = new + nmax; nfdf = new_face + nmax; } else { /* Go through the line from the beginning and find the first difference. We assume that faces change at (possibly multi- byte) character boundaries. */ new_offset = old_offset = 0; for (ofd = old, ofdf = old_face, nfd = new, nfdf = new_face; (ofd - old < omax) && *ofd && _rl_compare_chars(old, old_offset, &ps_old, new, new_offset, &ps_new) && *ofdf == *nfdf; ) { old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY); new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY); ofd = old + old_offset; ofdf = old_face + old_offset; nfd = new + new_offset; nfdf = new_face + new_offset; } } } } else #endif for (ofd = old, ofdf = old_face, nfd = new, nfdf = new_face; (ofd - old < omax) && *ofd && (*ofd == *nfd) && (*ofdf == *nfdf); ofd++, nfd++, ofdf++, nfdf++) ; /* Move to the end of the screen line. ND and OD are used to keep track of the distance between ne and new and oe and old, respectively, to move a subtraction out of each loop. */ for (od = ofd - old, oe = ofd; od < omax && *oe; oe++, od++); for (nd = nfd - new, ne = nfd; nd < nmax && *ne; ne++, nd++); /* If no difference, continue to next line. */ if (ofd == oe && nfd == ne) return; #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0 && _rl_utf8locale) { WCHAR_T wc; mbstate_t ps = { 0 }; int t; /* If the first character in the difference is a zero-width character, assume it's a combining character and back one up so the two base characters no longer compare equivalently. */ t = MBRTOWC (&wc, ofd, mb_cur_max, &ps); #if 0 if (t > 0 && UNICODE_COMBINING_CHAR (wc) && WCWIDTH (wc) == 0) #else if (t > 0 && IS_COMBINING_CHAR (wc)) #endif { old_offset = _rl_find_prev_mbchar (old, ofd - old, MB_FIND_ANY); new_offset = _rl_find_prev_mbchar (new, nfd - new, MB_FIND_ANY); ofd = old + old_offset; /* equal by definition */ ofdf = old_face + old_offset; nfd = new + new_offset; nfdf = new_face + new_offset; } } #endif wsatend = 1; /* flag for trailing whitespace */ #if defined (HANDLE_MULTIBYTE) /* Find the last character that is the same between the two lines. This bounds the region that needs to change. */ /* In this case, `last character' means the one farthest from the end of the line. */ if (mb_cur_max > 1 && rl_byte_oriented == 0) { ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY); olsf = old_face + (ols - old); nls = new + _rl_find_prev_mbchar (new, ne - new, MB_FIND_ANY); nlsf = new_face + (nls - new); while ((ols > ofd) && (nls > nfd)) { memset (&ps_old, 0, sizeof (mbstate_t)); memset (&ps_new, 0, sizeof (mbstate_t)); if (_rl_compare_chars (old, ols - old, &ps_old, new, nls - new, &ps_new) == 0 || *olsf != *nlsf) break; if (*ols != ' ') wsatend = 0; ols = old + _rl_find_prev_mbchar (old, ols - old, MB_FIND_ANY); olsf = old_face + (ols - old); nls = new + _rl_find_prev_mbchar (new, nls - new, MB_FIND_ANY); nlsf = new_face + (nls - new); } } else { #endif /* HANDLE_MULTIBYTE */ ols = oe - 1; /* find last same */ olsf = old_face + (ols - old); nls = ne - 1; nlsf = new_face + (nls - new); while ((ols > ofd) && (nls > nfd) && (*ols == *nls) && (*olsf == *nlsf)) { if (*ols != ' ') wsatend = 0; ols--; olsf--; nls--; nlsf--; } #if defined (HANDLE_MULTIBYTE) } #endif if (wsatend) { ols = oe; olsf = old_face + (ols - old); nls = ne; nlsf = new_face + (nls - new); } #if defined (HANDLE_MULTIBYTE) /* This may not work for stateful encoding, but who cares? To handle stateful encoding properly, we have to scan each string from the beginning and compare. */ else if (_rl_compare_chars (ols, 0, NULL, nls, 0, NULL) == 0 || *olsf != *nlsf) #else else if (*ols != *nls || *olsf != *nlsf) #endif { if (*ols) /* don't step past the NUL */ { if (mb_cur_max > 1 && rl_byte_oriented == 0) ols = old + _rl_find_next_mbchar (old, ols - old, 1, MB_FIND_ANY); else ols++; } if (*nls) { if (mb_cur_max > 1 && rl_byte_oriented == 0) nls = new + _rl_find_next_mbchar (new, nls - new, 1, MB_FIND_ANY); else nls++; } olsf = old_face + (ols - old); nlsf = new_face + (nls - new); } /* count of invisible characters in the current invisible line. */ current_invis_chars = WRAP_OFFSET (current_line, wrap_offset); if (_rl_last_v_pos != current_line) { _rl_move_vert (current_line); /* We have moved up to a new screen line. This line may or may not have invisible characters on it, but we do our best to recalculate visible_wrap_offset based on what we know. */ /* This first clause handles the case where the prompt has been recalculated (e.g., by rl_message) but the old prompt is still on the visible line because we haven't overwritten it yet. We want to somehow use the old prompt information, but we only want to do this once. */ if (current_line == 0 && saved_local_prompt && old[0] == saved_local_prompt[0] && memcmp (old, saved_local_prompt, saved_local_length) == 0) visible_wrap_offset = saved_invis_chars_first_line; /* This clause handles the opposite: the prompt has been restored (e.g., by rl_clear_message) but the old saved_local_prompt (now NULL, so we can't directly check it) is still on the visible line because we haven't overwritten it yet. We guess that there aren't any invisible characters in any of the prompts we put in with rl_message */ else if (current_line == 0 && local_prompt && new[0] == local_prompt[0] && (memcmp (new, local_prompt, local_prompt_len) == 0) && (memcmp (old, local_prompt, local_prompt_len) != 0)) visible_wrap_offset = 0; else if (current_line == 0) visible_wrap_offset = prompt_invis_chars_first_line; /* XXX */ #if 0 /* XXX - not yet */ else if (current_line == prompt_last_screen_line && wrap_offset > prompt_invis_chars_first_line) visible_wrap_offset = wrap_offset - prompt_invis_chars_first_line #endif if ((mb_cur_max == 1 || rl_byte_oriented) && current_line == 0 && visible_wrap_offset) _rl_last_c_pos += visible_wrap_offset; } /* If this is the first line and there are invisible characters in the prompt string, and the prompt string has not changed, and the current cursor position is before the last invisible character in the prompt, and the index of the character to move to is past the end of the prompt string, then redraw the entire prompt string. We can only do this reliably if the terminal supports a `cr' capability. This can also happen if the prompt string has changed, and the first difference in the line is in the middle of the prompt string, after a sequence of invisible characters (worst case) and before the end of the prompt. In this case, we have to redraw the entire prompt string so that the entire sequence of invisible characters is drawn. We need to handle the worst case, when the difference is after (or in the middle of) a sequence of invisible characters that changes the text color and before the sequence that restores the text color to normal. Then we have to make sure that the lines still differ -- if they don't, we can return immediately. This is not an efficiency hack -- there is a problem with redrawing portions of the prompt string if they contain terminal escape sequences (like drawing the `unbold' sequence without a corresponding `bold') that manifests itself on certain terminals. */ lendiff = local_prompt_len; if (lendiff > nmax) lendiff = nmax; od = ofd - old; /* index of first difference in visible line */ nd = nfd - new; /* nd, od are buffer indexes */ if (current_line == 0 && !_rl_horizontal_scroll_mode && _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 && (((od > 0 || nd > 0) && (od <= prompt_last_invisible || nd <= prompt_last_invisible)) || ((od >= lendiff) && _rl_last_c_pos < PROMPT_ENDING_INDEX))) { _rl_cr (); if (modmark) _rl_output_some_chars ("*", 1); _rl_output_some_chars (local_prompt, lendiff); if (mb_cur_max > 1 && rl_byte_oriented == 0) { /* If we just output the entire prompt string we can take advantage of knowing the number of physical characters in the prompt. If the prompt wraps lines (lendiff clamped at nmax), we can't. */ if (lendiff == local_prompt_len) _rl_last_c_pos = prompt_physical_chars + modmark; else /* We take wrap_offset into account here so we can pass correct information to _rl_move_cursor_relative. */ /* XXX - can use local_prompt_invis_chars[0] instead of wrap_offset */ _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff, 1) - wrap_offset + modmark; cpos_adjusted = 1; } else _rl_last_c_pos = lendiff + modmark; /* Now if we have printed the prompt string because the first difference was within the prompt, see if we need to recompute where the lines differ. Check whether where we are now is past the last place where the old and new lines are the same and short-circuit now if we are. */ if ((od <= prompt_last_invisible || nd <= prompt_last_invisible) && omax == nmax && lendiff > (ols-old) && lendiff > (nls-new)) return; /* XXX - we need to fix up our calculations if we are now past the old ofd/nfd and the prompt length (or line length) has changed. We punt on the problem and do a dumb update. We'd like to be able to just output the prompt from the beginning of the line up to the first difference, but you don't know the number of invisible characters in that case. This needs a lot of work to be efficient, but it usually doesn't matter. */ if ((od <= prompt_last_invisible || nd <= prompt_last_invisible)) { nfd = new + lendiff; /* number of characters we output above */ nfdf = new_face + lendiff; nd = lendiff; /* Do a dumb update and return */ dumb_update: temp = ne - nfd; if (temp > 0) { puts_face (nfd, nfdf, temp); if (mb_cur_max > 1 && rl_byte_oriented == 0) { _rl_last_c_pos += _rl_col_width (new, nd, ne - new, 1); /* Need to adjust here based on wrap_offset. Guess that if this is the line containing the last line of the prompt we need to adjust by wrap_offset-prompt_invis_chars_first_line on the assumption that this is the number of invisible characters in the last line of the prompt. */ /* XXX - CHANGE THIS USING local_prompt_invis_chars[current_line] */ if (wrap_offset > prompt_invis_chars_first_line && current_line == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth && _rl_horizontal_scroll_mode == 0) ADJUST_CPOS (wrap_offset - prompt_invis_chars_first_line); /* If we just output a new line including the prompt, and the prompt includes invisible characters, we need to account for them in the _rl_last_c_pos calculation, since _rl_col_width does not. This happens when other code does a goto dumb_update; */ else if (current_line == 0 && nfd == new && prompt_invis_chars_first_line && local_prompt_len <= temp && wrap_offset >= prompt_invis_chars_first_line && _rl_horizontal_scroll_mode == 0) ADJUST_CPOS (prompt_invis_chars_first_line); /* XXX - This is experimental. It's a start at supporting prompts where a non-terminal line contains the last invisible characters. We assume that we can use the local_prompt_invis_chars array and that the current line is completely filled with characters to _rl_screenwidth, so we can either adjust by the number of bytes in the current line or just go straight to _rl_screenwidth */ else if (current_line > 0 && current_line < prompt_last_screen_line && INV_CHARS_CURRENT_PROMPT_LINE(current_line) && _rl_horizontal_scroll_mode == 0) { _rl_last_c_pos = _rl_screenwidth; cpos_adjusted = 1; } } else _rl_last_c_pos += temp; } /* This is a useful heuristic, but what we really want is to clear if the new number of visible screen characters is less than the old number of visible screen characters. If the prompt has changed, we don't really have enough information about the visible line to know for sure, so we use another heuristic calclulation below. */ if (nmax < omax) goto clear_rest_of_line; /* XXX */ /* XXX - use WRAP_OFFSET(current_line, wrap_offset) here instead of W_OFFSET since current_line == 0 */ else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset))) goto clear_rest_of_line; else return; } } o_cpos = _rl_last_c_pos; /* When this function returns, _rl_last_c_pos is correct, and an absolute cursor position in multibyte mode, but a buffer index when not in a multibyte locale. */ _rl_move_cursor_relative (od, old, old_face); #if defined (HANDLE_MULTIBYTE) /* We need to indicate that the cursor position is correct in the presence of invisible characters in the prompt string. Let's see if setting this when we make sure we're at the end of the drawn prompt string works. */ if (current_line == 0 && mb_cur_max > 1 && rl_byte_oriented == 0 && (_rl_last_c_pos > 0 || o_cpos > 0) && _rl_last_c_pos == prompt_physical_chars) cpos_adjusted = 1; #endif /* if (len (new) > len (old)) lendiff == difference in buffer (bytes) col_lendiff == difference on screen (columns) When not using multibyte characters, these are equal */ lendiff = (nls - nfd) - (ols - ofd); if (mb_cur_max > 1 && rl_byte_oriented == 0) { int newchars, newwidth, newind; int oldchars, oldwidth, oldind; newchars = nls - new; oldchars = ols - old; /* If we can do it, try to adjust nls and ols so that nls-new will contain the entire new prompt string. That way we can use prompt_physical_chars and not have to recompute column widths. _rl_col_width adds wrap_offset and expects the caller to compensate, which we do below, so we do the same thing if we don't call _rl_col_width. We don't have to compare, since we know the characters are the same. The check of differing numbers of invisible chars may be extraneous. XXX - experimental */ if (current_line == 0 && nfd == new && newchars > prompt_last_invisible && newchars <= local_prompt_len && local_prompt_len <= nmax && current_invis_chars != visible_wrap_offset) { while (newchars < nmax && oldchars < omax && newchars < local_prompt_len) { #if defined (HANDLE_MULTIBYTE) newind = _rl_find_next_mbchar (new, newchars, 1, MB_FIND_NONZERO); oldind = _rl_find_next_mbchar (old, oldchars, 1, MB_FIND_NONZERO); nls += newind - newchars; ols += oldind - oldchars; newchars = newind; oldchars = oldind; #else nls++; ols++; newchars++; oldchars++; #endif } newwidth = (newchars == local_prompt_len) ? prompt_physical_chars + wrap_offset : _rl_col_width (new, 0, nls - new, 1); /* if we changed nls and ols, we need to recompute lendiff */ lendiff = (nls - nfd) - (ols - ofd); nlsf = new_face + (nls - new); olsf = old_face + (ols - old); } else newwidth = _rl_col_width (new, nfd - new, nls - new, 1); oldwidth = _rl_col_width (old, ofd - old, ols - old, 1); col_lendiff = newwidth - oldwidth; } else col_lendiff = lendiff; /* col_lendiff uses _rl_col_width(), which doesn't know about whether or not the multibyte characters it counts are invisible, so unless we're printing the entire prompt string (in which case we can use prompt_physical_chars) the count is short by the number of bytes in the invisible multibyte characters - the number of multibyte characters. We don't have a good way to solve this without moving to something like a bitmap that indicates which characters are visible and which are invisible. We fix it up (imperfectly) in the caller and by trying to use the entire prompt string wherever we can. */ /* If we are changing the number of invisible characters in a line, and the spot of first difference is before the end of the invisible chars, lendiff needs to be adjusted. */ if (current_line == 0 && current_invis_chars != visible_wrap_offset) { if (mb_cur_max > 1 && rl_byte_oriented == 0) { lendiff += visible_wrap_offset - current_invis_chars; col_lendiff += visible_wrap_offset - current_invis_chars; } else { lendiff += visible_wrap_offset - current_invis_chars; col_lendiff = lendiff; } } /* We use temp as a count of the number of bytes from the first difference to the end of the new line. col_temp is the corresponding number of screen columns. A `dumb' update moves to the spot of first difference and writes TEMP bytes. */ /* Insert (diff (len (old), len (new)) ch. */ temp = ne - nfd; if (mb_cur_max > 1 && rl_byte_oriented == 0) col_temp = _rl_col_width (new, nfd - new, ne - new, 1); else col_temp = temp; /* how many bytes from the new line buffer to write to the display */ bytes_to_insert = nls - nfd; /* col_lendiff > 0 if we are adding characters to the line */ if (col_lendiff > 0) /* XXX - was lendiff */ { /* Non-zero if we're increasing the number of lines. */ int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin; /* If col_lendiff is > 0, implying that the new string takes up more screen real estate than the old, but lendiff is < 0, meaning that it takes fewer bytes, we need to just output the characters starting from the first difference. These will overwrite what is on the display, so there's no reason to do a smart update. This can really only happen in a multibyte environment. */ if (lendiff < 0) { puts_face (nfd, nfdf, temp); _rl_last_c_pos += col_temp; /* If nfd begins before any invisible characters in the prompt, adjust _rl_last_c_pos to account for wrap_offset and set cpos_adjusted to let the caller know. */ if (current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ return; } /* Sometimes it is cheaper to print the characters rather than use the terminal's capabilities. If we're growing the number of lines, make sure we actually cause the new line to wrap around on auto-wrapping terminals. */ else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl)) { /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and _rl_horizontal_scroll_mode == 1, inserting the characters with _rl_term_IC or _rl_term_ic will screw up the screen because of the invisible characters. We need to just draw them. */ /* The same thing happens if we're trying to draw before the last invisible character in the prompt string or we're increasing the number of invisible characters in the line and we're not drawing the entire prompt string. */ if (*ols && ((_rl_horizontal_scroll_mode && _rl_last_c_pos == 0 && lendiff > prompt_visible_length && current_invis_chars > 0) == 0) && (((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible) && (col_lendiff < prompt_visible_length)) == 0) && (visible_wrap_offset >= current_invis_chars)) { open_some_spaces (col_lendiff); puts_face (nfd, nfdf, bytes_to_insert); if (mb_cur_max > 1 && rl_byte_oriented == 0) _rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1); else _rl_last_c_pos += bytes_to_insert; } else if ((mb_cur_max == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0) { /* At the end of a line the characters do not have to be "inserted". They can just be placed on the screen. */ puts_face (nfd, nfdf, temp); _rl_last_c_pos += col_temp; return; } else /* just write from first difference to end of new line */ { puts_face (nfd, nfdf, temp); _rl_last_c_pos += col_temp; /* If nfd begins before the last invisible character in the prompt, adjust _rl_last_c_pos to account for wrap_offset and set cpos_adjusted to let the caller know. */ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ return; } if (bytes_to_insert > lendiff) { /* If nfd begins before the last invisible character in the prompt, adjust _rl_last_c_pos to account for wrap_offset and set cpos_adjusted to let the caller know. */ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ } } else { /* cannot insert chars, write to EOL */ puts_face (nfd, nfdf, temp); _rl_last_c_pos += col_temp; /* If we're in a multibyte locale and were before the last invisible char in the current line (which implies we just output some invisible characters) we need to adjust _rl_last_c_pos, since it represents a physical character position. */ /* The current_line*rl_screenwidth+prompt_invis_chars_first_line is a crude attempt to compute how far into the new line buffer we are. It doesn't work well in the face of multibyte characters and needs to be rethought. XXX */ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == prompt_last_screen_line && wrap_offset && displaying_prompt_first_line && wrap_offset != prompt_invis_chars_first_line && ((nfd-new) < (prompt_last_invisible-(current_line*_rl_screenwidth+prompt_invis_chars_first_line)))) ADJUST_CPOS (wrap_offset - prompt_invis_chars_first_line); /* What happens if wrap_offset == prompt_invis_chars_first_line and we are drawing the first line (current_line == 0), or if we are drawing the first line and changing the number of invisible characters in the line? If we're starting to draw before the last invisible character in the prompt, we need to adjust by _rl_last_c_pos -= prompt_invis_chars_first_line. This can happen when we finish reading a digit argument (with the "(arg: N)" prompt) and are switching back to displaying a line with a prompt containing invisible characters, since we have to redraw the entire prompt string. */ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && wrap_offset && displaying_prompt_first_line && wrap_offset == prompt_invis_chars_first_line && visible_wrap_offset != current_invis_chars && visible_wrap_offset != prompt_invis_chars_first_line && ((nfd-new) < prompt_last_invisible)) ADJUST_CPOS (prompt_invis_chars_first_line); } } else /* Delete characters from line. */ { /* If possible and inexpensive to use terminal deletion, then do so. */ if (_rl_term_dc && (2 * col_temp) >= -col_lendiff) { /* If all we're doing is erasing the invisible characters in the prompt string, don't bother. It screws up the assumptions about what's on the screen. */ if (_rl_horizontal_scroll_mode && _rl_last_c_pos == 0 && displaying_prompt_first_line && -lendiff == visible_wrap_offset) col_lendiff = 0; /* If we have moved lmargin and we're shrinking the line, we've already moved the cursor to the first character of the new line, so deleting -col_lendiff characters will mess up the cursor position calculation */ if (_rl_horizontal_scroll_mode && displaying_prompt_first_line == 0 && col_lendiff && _rl_last_c_pos < -col_lendiff) col_lendiff = 0; if (col_lendiff) delete_chars (-col_lendiff); /* delete (diff) characters */ /* Copy (new) chars to screen from first diff to last match, overwriting what is there. */ if (bytes_to_insert > 0) { /* If nfd begins at the prompt, or before the invisible characters in the prompt, we need to adjust _rl_last_c_pos in a multibyte locale to account for the wrap offset and set cpos_adjusted accordingly. */ puts_face (nfd, nfdf, bytes_to_insert); if (mb_cur_max > 1 && rl_byte_oriented == 0) { /* This still doesn't take into account whether or not the characters that this counts are invisible. */ _rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1); if (current_line == 0 && wrap_offset && displaying_prompt_first_line && prompt_invis_chars_first_line && _rl_last_c_pos >= prompt_invis_chars_first_line && ((nfd - new) <= prompt_last_invisible)) ADJUST_CPOS (prompt_invis_chars_first_line); #if 1 #ifdef HANDLE_MULTIBYTE /* If we write a non-space into the last screen column, remove the note that we added a space to compensate for a multibyte double-width character that didn't fit, since it's only valid for what was previously there. */ /* XXX - watch this */ if (_rl_last_c_pos == _rl_screenwidth && line_state_invisible->wrapped_line[current_line+1] && nfd[bytes_to_insert-1] != ' ') line_state_invisible->wrapped_line[current_line+1] = 0; #endif #endif } else _rl_last_c_pos += bytes_to_insert; /* XXX - we only want to do this if we are at the end of the line so we move there with _rl_move_cursor_relative */ if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new))) { _rl_move_cursor_relative (ne-new, new, new_face); goto clear_rest_of_line; } } } /* Otherwise, print over the existing material. */ else { if (temp > 0) { /* If nfd begins at the prompt, or before the invisible characters in the prompt, we need to adjust _rl_last_c_pos in a multibyte locale to account for the wrap offset and set cpos_adjusted accordingly. */ puts_face (nfd, nfdf, temp); _rl_last_c_pos += col_temp; /* XXX */ if (mb_cur_max > 1 && rl_byte_oriented == 0) { if (current_line == 0 && wrap_offset && displaying_prompt_first_line && _rl_last_c_pos > wrap_offset && ((nfd - new) <= prompt_last_invisible)) ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */ } } clear_rest_of_line: lendiff = (oe - old) - (ne - new); if (mb_cur_max > 1 && rl_byte_oriented == 0) col_lendiff = _rl_col_width (old, 0, oe - old, 1) - _rl_col_width (new, 0, ne - new, 1); else col_lendiff = lendiff; /* If we've already printed over the entire width of the screen, including the old material, then col_lendiff doesn't matter and space_to_eol will insert too many spaces. XXX - maybe we should adjust col_lendiff based on the difference between _rl_last_c_pos and _rl_screenwidth */ if (col_lendiff && ((mb_cur_max == 1 || rl_byte_oriented) || (_rl_last_c_pos < _rl_screenwidth))) { if (_rl_term_autowrap && current_line < inv_botlin) space_to_eol (col_lendiff); else _rl_clear_to_eol (col_lendiff); } } } } /* Tell the update routines that we have moved onto a new (empty) line. */ int rl_on_new_line (void) { if (visible_line) visible_line[0] = '\0'; _rl_last_c_pos = _rl_last_v_pos = 0; _rl_vis_botlin = last_lmargin = 0; if (vis_lbreaks) vis_lbreaks[0] = vis_lbreaks[1] = 0; visible_wrap_offset = 0; return 0; } /* Clear all screen lines occupied by the current readline line buffer (visible line) */ int rl_clear_visible_line (void) { int curr_line; /* Make sure we move to column 0 so we clear the entire line */ _rl_cr (); _rl_last_c_pos = 0; /* Move to the last screen line of the current visible line */ _rl_move_vert (_rl_vis_botlin); /* And erase screen lines going up to line 0 (first visible line) */ for (curr_line = _rl_last_v_pos; curr_line >= 0; curr_line--) { _rl_move_vert (curr_line); _rl_clear_to_eol (_rl_screenwidth); _rl_cr (); /* in case we use space_to_eol() */ } return 0; } /* Tell the update routines that we have moved onto a new line with the prompt already displayed. Code originally from the version of readline distributed with CLISP. rl_expand_prompt must have already been called (explicitly or implicitly). This still doesn't work exactly right; it should use expand_prompt() */ int rl_on_new_line_with_prompt (void) { int prompt_size, i, l, real_screenwidth, newlines; char *prompt_last_line, *lprompt; /* Initialize visible_line and invisible_line to ensure that they can hold the already-displayed prompt. */ prompt_size = strlen (rl_prompt) + 1; init_line_structures (prompt_size); /* Make sure the line structures hold the already-displayed prompt for redisplay. */ lprompt = local_prompt ? local_prompt : rl_prompt; strcpy (visible_line, lprompt); strcpy (invisible_line, lprompt); /* If the prompt contains newlines, take the last tail. */ prompt_last_line = strrchr (rl_prompt, '\n'); if (!prompt_last_line) prompt_last_line = rl_prompt; l = strlen (prompt_last_line); if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l, 1); /* XXX */ else _rl_last_c_pos = l; /* Dissect prompt_last_line into screen lines. Note that here we have to use the real screenwidth. Readline's notion of screenwidth might be one less, see terminal.c. */ real_screenwidth = _rl_screenwidth + (_rl_term_autowrap ? 0 : 1); _rl_last_v_pos = l / real_screenwidth; /* If the prompt length is a multiple of real_screenwidth, we don't know whether the cursor is at the end of the last line, or already at the beginning of the next line. Output a newline just to be safe. */ if (l > 0 && (l % real_screenwidth) == 0) _rl_output_some_chars ("\n", 1); last_lmargin = 0; newlines = 0; i = 0; while (i <= l) { _rl_vis_botlin = newlines; vis_lbreaks[newlines++] = i; i += real_screenwidth; } vis_lbreaks[newlines] = l; visible_wrap_offset = 0; rl_display_prompt = rl_prompt; /* XXX - make sure it's set */ return 0; } /* Actually update the display, period. */ int rl_forced_update_display (void) { if (visible_line) memset (visible_line, 0, line_size); rl_on_new_line (); forced_display++; (*rl_redisplay_function) (); return 0; } /* Redraw only the last line of a multi-line prompt. */ void rl_redraw_prompt_last_line (void) { char *t; t = strrchr (rl_display_prompt, '\n'); if (t) redraw_prompt (++t); else rl_forced_update_display (); } /* Move the cursor from _rl_last_c_pos to NEW, which are buffer indices. (Well, when we don't have multibyte characters, _rl_last_c_pos is a buffer index.) DATA is the contents of the screen line of interest; i.e., where the movement is being done. DATA is always the visible line or the invisible line */ static void _rl_move_cursor_relative (int new, const char *data, const char *dataf) { register int i; int woff; /* number of invisible chars on current line */ int cpos, dpos; /* current and desired cursor positions */ int adjust; int in_invisline; int mb_cur_max = MB_CUR_MAX; woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset); cpos = _rl_last_c_pos; if (cpos == 0 && cpos == new) return; #if defined (HANDLE_MULTIBYTE) /* If we have multibyte characters, NEW is indexed by the buffer point in a multibyte string, but _rl_last_c_pos is the display position. In this case, NEW's display position is not obvious and must be calculated. We need to account for invisible characters in this line, as long as we are past them and they are counted by _rl_col_width. */ if (mb_cur_max > 1 && rl_byte_oriented == 0) { adjust = 1; /* Try to short-circuit common cases and eliminate a bunch of multibyte character function calls. */ /* 1. prompt string */ if (new == local_prompt_len && memcmp (data, local_prompt, new) == 0) { dpos = prompt_physical_chars; cpos_adjusted = 1; adjust = 0; } /* 2. prompt_string + line contents */ else if (new > local_prompt_len && local_prompt && memcmp (data, local_prompt, local_prompt_len) == 0) { dpos = prompt_physical_chars + _rl_col_width (data, local_prompt_len, new, 1); cpos_adjusted = 1; adjust = 0; } else dpos = _rl_col_width (data, 0, new, 1); if (displaying_prompt_first_line == 0) adjust = 0; /* yet another special case: printing the last line of a prompt with multibyte characters and invisible characters whose printable length exceeds the screen width with the last invisible character (prompt_last_invisible) in the last line. IN_INVISLINE is the offset of DATA in invisible_line */ in_invisline = 0; if (data > invisible_line && _rl_inv_botlin < inv_lbsize && data < invisible_line+inv_lbreaks[_rl_inv_botlin+1]) in_invisline = data - invisible_line; /* Use NEW when comparing against the last invisible character in the prompt string, since they're both buffer indices and DPOS is a desired display position. */ /* NEW is relative to the current displayed line, while PROMPT_LAST_INVISIBLE is relative to the entire (wrapped) line. Need a way to reconcile these two variables by turning NEW into a buffer position relative to the start of the line */ if (adjust && ((new > prompt_last_invisible) || /* XXX - don't use woff here */ (new+in_invisline > prompt_last_invisible) || /* invisible line */ (prompt_physical_chars >= _rl_screenwidth && /* visible line */ _rl_last_v_pos == prompt_last_screen_line && wrap_offset >= woff && dpos >= woff && new > (prompt_last_invisible-(vis_lbreaks[_rl_last_v_pos])-wrap_offset)))) /* XXX last comparison might need to be >= */ { dpos -= woff; /* Since this will be assigned to _rl_last_c_pos at the end (more precisely, _rl_last_c_pos == dpos when this function returns), let the caller know. */ cpos_adjusted = 1; } } else #endif dpos = new; /* If we don't have to do anything, then return. */ if (cpos == dpos) return; /* It may be faster to output a CR, and then move forwards instead of moving backwards. */ /* i == current physical cursor position. */ #if defined (HANDLE_MULTIBYTE) if (mb_cur_max > 1 && rl_byte_oriented == 0) i = _rl_last_c_pos; else #endif i = _rl_last_c_pos - woff; if (dpos == 0 || CR_FASTER (dpos, _rl_last_c_pos) || (_rl_term_autowrap && i == _rl_screenwidth)) { _rl_cr (); cpos = _rl_last_c_pos = 0; } if (cpos < dpos) { /* Move the cursor forward. We do it by printing the command to move the cursor forward if there is one, else print that portion of the output buffer again. Which is cheaper? */ /* The above comment is left here for posterity. It is faster to print one character (non-control) than to print a control sequence telling the terminal to move forward one character. That kind of control is for people who don't know what the data is underneath the cursor. */ /* However, we need a handle on where the current display position is in the buffer for the immediately preceding comment to be true. In multibyte locales, we don't currently have that info available. Without it, we don't know where the data we have to display begins in the buffer and we have to go back to the beginning of the screen line. In this case, we can use the terminal sequence to move forward if it's available. */ if (mb_cur_max > 1 && rl_byte_oriented == 0) { if (_rl_term_forward_char) { for (i = cpos; i < dpos; i++) tputs (_rl_term_forward_char, 1, _rl_output_character_function); } else { _rl_cr (); puts_face (data, dataf, new); } } else puts_face (data + cpos, dataf + cpos, new - cpos); } #if defined (HANDLE_MULTIBYTE) /* NEW points to the buffer point, but _rl_last_c_pos is the display point. The byte length of the string is probably bigger than the column width of the string, which means that if NEW == _rl_last_c_pos, then NEW's display point is less than _rl_last_c_pos. */ #endif else if (cpos > dpos) _rl_backspace (cpos - dpos); _rl_last_c_pos = dpos; } /* PWP: move the cursor up or down. */ void _rl_move_vert (int to) { register int delta, i; if (_rl_last_v_pos == to) return; #if 0 /* If we're being asked to move to a line beyond the screen height, and we're currently at the last physical line, issue a newline and let the terminal take care of scrolling the display. */ if (to >= _rl_screenheight) { if (_rl_last_v_pos == _rl_screenheight) { putc ('\n', rl_outstream); _rl_cr (); _rl_last_c_pos = 0; } return; } #endif if ((delta = to - _rl_last_v_pos) > 0) { for (i = 0; i < delta; i++) putc ('\n', rl_outstream); _rl_cr (); _rl_last_c_pos = 0; } else { /* delta < 0 */ #ifdef __DJGPP__ int row, col; fflush (rl_outstream); ScreenGetCursor (&row, &col); ScreenSetCursor (row + delta, col); i = -delta; #else if (_rl_term_up && *_rl_term_up) for (i = 0; i < -delta; i++) tputs (_rl_term_up, 1, _rl_output_character_function); #endif /* !__DJGPP__ */ } _rl_last_v_pos = to; /* Now TO is here */ } /* Physically print C on rl_outstream. This is for functions which know how to optimize the display. Return the number of characters output. */ int rl_show_char (int c) { int n = 1; if (META_CHAR (c) && (_rl_output_meta_chars == 0)) { fprintf (rl_outstream, "M-"); n += 2; c = UNMETA (c); } #if defined (DISPLAY_TABS) if ((CTRL_CHAR (c) && c != '\t') || c == RUBOUT) #else if (CTRL_CHAR (c) || c == RUBOUT) #endif /* !DISPLAY_TABS */ { fprintf (rl_outstream, "C-"); n += 2; c = CTRL_CHAR (c) ? UNCTRL (c) : '?'; } putc (c, rl_outstream); fflush (rl_outstream); return n; } int rl_character_len (int c, int pos) { unsigned char uc; uc = (unsigned char)c; if (META_CHAR (uc)) return ((_rl_output_meta_chars == 0) ? 4 : 1); if (uc == '\t') { #if defined (DISPLAY_TABS) return (((pos | 7) + 1) - pos); #else return (2); #endif /* !DISPLAY_TABS */ } if (CTRL_CHAR (c) || c == RUBOUT) return (2); return ((ISPRINT (uc)) ? 1 : 2); } /* How to print things in the "echo-area". The prompt is treated as a mini-modeline. */ static int msg_saved_prompt = 0; int rl_message (const char *format, ...) { va_list args; #if defined (HAVE_VSNPRINTF) int bneed; #endif va_start (args, format); if (msg_buf == 0) msg_buf = xmalloc (msg_bufsiz = 128); #if defined (HAVE_VSNPRINTF) bneed = vsnprintf (msg_buf, msg_bufsiz, format, args); if (bneed >= msg_bufsiz - 1) { msg_bufsiz = bneed + 1; msg_buf = xrealloc (msg_buf, msg_bufsiz); va_end (args); va_start (args, format); vsnprintf (msg_buf, msg_bufsiz - 1, format, args); } #else vsprintf (msg_buf, format, args); msg_buf[msg_bufsiz - 1] = '\0'; /* overflow? */ #endif va_end (args); if (saved_local_prompt == 0) { rl_save_prompt (); msg_saved_prompt = 1; } else if (local_prompt != saved_local_prompt) { FREE (local_prompt); FREE (local_prompt_prefix); local_prompt = (char *)NULL; } rl_display_prompt = msg_buf; local_prompt = expand_prompt (msg_buf, 0, &prompt_visible_length, &prompt_last_invisible, &prompt_invis_chars_first_line, &prompt_physical_chars); local_prompt_prefix = (char *)NULL; local_prompt_len = local_prompt ? strlen (local_prompt) : 0; (*rl_redisplay_function) (); return 0; } /* How to clear things from the "echo-area". */ int rl_clear_message (void) { rl_display_prompt = rl_prompt; if (msg_saved_prompt) { rl_restore_prompt (); msg_saved_prompt = 0; } (*rl_redisplay_function) (); return 0; } int rl_reset_line_state (void) { rl_on_new_line (); rl_display_prompt = rl_prompt ? rl_prompt : ""; forced_display = 1; return 0; } /* Save all of the variables associated with the prompt and its display. Most of the complexity is dealing with the invisible characters in the prompt string and where they are. There are enough of these that I should consider a struct. */ void rl_save_prompt (void) { saved_local_prompt = local_prompt; saved_local_prefix = local_prompt_prefix; saved_prefix_length = prompt_prefix_length; saved_local_length = local_prompt_len; saved_last_invisible = prompt_last_invisible; saved_visible_length = prompt_visible_length; saved_invis_chars_first_line = prompt_invis_chars_first_line; saved_physical_chars = prompt_physical_chars; saved_local_prompt_newlines = local_prompt_newlines; saved_local_prompt_invis_chars = local_prompt_invis_chars; local_prompt = local_prompt_prefix = (char *)0; local_prompt_len = 0; local_prompt_newlines = (int *)0; local_prompt_invis_chars = (int *)0; prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0; prompt_invis_chars_first_line = prompt_physical_chars = 0; } void rl_restore_prompt (void) { FREE (local_prompt); FREE (local_prompt_prefix); FREE (local_prompt_newlines); FREE (local_prompt_invis_chars); local_prompt = saved_local_prompt; local_prompt_prefix = saved_local_prefix; local_prompt_len = saved_local_length; local_prompt_newlines = saved_local_prompt_newlines; local_prompt_invis_chars = saved_local_prompt_invis_chars; prompt_prefix_length = saved_prefix_length; prompt_last_invisible = saved_last_invisible; prompt_visible_length = saved_visible_length; prompt_invis_chars_first_line = saved_invis_chars_first_line; prompt_physical_chars = saved_physical_chars; /* can test saved_local_prompt to see if prompt info has been saved. */ saved_local_prompt = saved_local_prefix = (char *)0; saved_local_length = 0; saved_last_invisible = saved_visible_length = saved_prefix_length = 0; saved_invis_chars_first_line = saved_physical_chars = 0; saved_local_prompt_newlines = saved_local_prompt_invis_chars = 0; } char * _rl_make_prompt_for_search (int pchar) { int len; char *pmt, *p; rl_save_prompt (); /* We've saved the prompt, and can do anything with the various prompt strings we need before they're restored. We want the unexpanded portion of the prompt string after any final newline. */ p = rl_prompt ? strrchr (rl_prompt, '\n') : 0; if (p == 0) { len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0; pmt = (char *)xmalloc (len + 2); if (len) strcpy (pmt, rl_prompt); pmt[len] = pchar; pmt[len+1] = '\0'; } else { p++; len = strlen (p); pmt = (char *)xmalloc (len + 2); if (len) strcpy (pmt, p); pmt[len] = pchar; pmt[len+1] = '\0'; } /* will be overwritten by expand_prompt, called from rl_message */ prompt_physical_chars = saved_physical_chars + 1; return pmt; } /* Quick redisplay hack when erasing characters at the end of the line. */ void _rl_erase_at_end_of_line (int l) { register int i; _rl_backspace (l); for (i = 0; i < l; i++) putc (' ', rl_outstream); _rl_backspace (l); for (i = 0; i < l; i++) visible_line[--_rl_last_c_pos] = '\0'; rl_display_fixed++; } /* Clear to the end of the line. COUNT is the minimum number of character spaces to clear, but we use a terminal escape sequence if available. */ void _rl_clear_to_eol (int count) { #ifndef __MSDOS__ if (_rl_term_clreol) tputs (_rl_term_clreol, 1, _rl_output_character_function); else #endif if (count) space_to_eol (count); } /* Clear to the end of the line using spaces. COUNT is the minimum number of character spaces to clear, */ static void space_to_eol (int count) { register int i; for (i = 0; i < count; i++) putc (' ', rl_outstream); _rl_last_c_pos += count; } void _rl_clear_screen (int clrscr) { #if defined (__DJGPP__) ScreenClear (); ScreenSetCursor (0, 0); #else if (_rl_term_clrpag) { tputs (_rl_term_clrpag, 1, _rl_output_character_function); if (clrscr && _rl_term_clrscroll) tputs (_rl_term_clrscroll, 1, _rl_output_character_function); } else rl_crlf (); #endif /* __DJGPP__ */ } /* Insert COUNT characters from STRING to the output stream at column COL. */ static void insert_some_chars (char *string, int count, int col) { open_some_spaces (col); _rl_output_some_chars (string, count); } /* Insert COL spaces, keeping the cursor at the same position. We follow the ncurses documentation and use either im/ei with explicit spaces, or IC/ic by itself. We assume there will either be ei or we don't need to use it. */ static void open_some_spaces (int col) { #if !defined (__MSDOS__) && (!defined (__MINGW32__) || defined (NCURSES_VERSION)) char *buffer; register int i; /* If IC is defined, then we do not have to "enter" insert mode. */ if (_rl_term_IC) { buffer = tgoto (_rl_term_IC, 0, col); tputs (buffer, 1, _rl_output_character_function); } else if (_rl_term_im && *_rl_term_im) { tputs (_rl_term_im, 1, _rl_output_character_function); /* just output the desired number of spaces */ for (i = col; i--; ) _rl_output_character_function (' '); /* If there is a string to turn off insert mode, use it now. */ if (_rl_term_ei && *_rl_term_ei) tputs (_rl_term_ei, 1, _rl_output_character_function); /* and move back the right number of spaces */ _rl_backspace (col); } else if (_rl_term_ic && *_rl_term_ic) { /* If there is a special command for inserting characters, then use that first to open up the space. */ for (i = col; i--; ) tputs (_rl_term_ic, 1, _rl_output_character_function); } #endif /* !__MSDOS__ && (!__MINGW32__ || NCURSES_VERSION)*/ } /* Delete COUNT characters from the display line. */ static void delete_chars (int count) { if (count > _rl_screenwidth) /* XXX */ return; #if !defined (__MSDOS__) && (!defined (__MINGW32__) || defined (NCURSES_VERSION)) if (_rl_term_DC && *_rl_term_DC) { char *buffer; buffer = tgoto (_rl_term_DC, count, count); tputs (buffer, count, _rl_output_character_function); } else { if (_rl_term_dc && *_rl_term_dc) while (count--) tputs (_rl_term_dc, 1, _rl_output_character_function); } #endif /* !__MSDOS__ && (!__MINGW32__ || NCURSES_VERSION)*/ } void _rl_update_final (void) { int full_lines, woff, botline_length; if (line_structures_initialized == 0) return; full_lines = 0; /* If the cursor is the only thing on an otherwise-blank last line, compensate so we don't print an extra CRLF. */ if (_rl_vis_botlin && _rl_last_c_pos == 0 && visible_line[vis_lbreaks[_rl_vis_botlin]] == 0) { _rl_vis_botlin--; full_lines = 1; } _rl_move_vert (_rl_vis_botlin); woff = W_OFFSET(_rl_vis_botlin, wrap_offset); /* XXX - WRAP_OFFSET? */ botline_length = VIS_LLEN(_rl_vis_botlin) - woff; /* If we've wrapped lines, remove the final xterm line-wrap flag. */ if (full_lines && _rl_term_autowrap && botline_length == _rl_screenwidth) { char *last_line, *last_face; /* LAST_LINE includes invisible characters, so if you want to get the last character of the first line, you have to take WOFF into account. This needs to be done both for calls to _rl_move_cursor_relative, which takes a buffer position as the first argument, and any direct subscripts of LAST_LINE. */ last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]]; /* = VIS_CHARS(_rl_vis_botlin); */ last_face = &vis_face[vis_lbreaks[_rl_vis_botlin]]; /* = VIS_CHARS(_rl_vis_botlin); */ cpos_buffer_position = -1; /* don't know where we are in buffer */ _rl_move_cursor_relative (_rl_screenwidth - 1 + woff, last_line, last_face); /* XXX */ _rl_clear_to_eol (0); puts_face (&last_line[_rl_screenwidth - 1 + woff], &last_face[_rl_screenwidth - 1 + woff], 1); } if ((_rl_vis_botlin == 0 && botline_length == 0) || botline_length > 0 || _rl_last_c_pos > 0) rl_crlf (); _rl_vis_botlin = 0; fflush (rl_outstream); rl_display_fixed++; } /* Move to the start of the current line. */ static void cr (void) { _rl_cr (); _rl_last_c_pos = 0; } /* Redraw the last line of a multi-line prompt that may possibly contain terminal escape sequences. Called with the cursor at column 0 of the line to draw the prompt on. */ static void redraw_prompt (char *t) { char *oldp; oldp = rl_display_prompt; rl_save_prompt (); rl_display_prompt = t; local_prompt = expand_prompt (t, PMT_MULTILINE, &prompt_visible_length, &prompt_last_invisible, &prompt_invis_chars_first_line, &prompt_physical_chars); local_prompt_prefix = (char *)NULL; local_prompt_len = local_prompt ? strlen (local_prompt) : 0; rl_forced_update_display (); rl_display_prompt = oldp; rl_restore_prompt(); } /* Redisplay the current line after a SIGWINCH is received. */ void _rl_redisplay_after_sigwinch (void) { char *t; /* Clear the last line (assuming that the screen size change will result in either more or fewer characters on that line only) and put the cursor at column 0. Make sure the right thing happens if we have wrapped to a new screen line. */ if (_rl_term_cr) { rl_clear_visible_line (); if (_rl_last_v_pos > 0) _rl_move_vert (0); } else rl_crlf (); if (_rl_screenwidth < prompt_visible_length) _rl_reset_prompt (); /* update local_prompt_newlines array */ /* Redraw only the last line of a multi-line prompt. */ t = strrchr (rl_display_prompt, '\n'); if (t) redraw_prompt (++t); else rl_forced_update_display (); } void _rl_clean_up_for_exit (void) { if (_rl_echoing_p) { if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */ _rl_move_vert (_rl_vis_botlin); _rl_vis_botlin = 0; fflush (rl_outstream); rl_restart_output (1, 0); } } void _rl_erase_entire_line (void) { cr (); _rl_clear_to_eol (0); cr (); fflush (rl_outstream); } void _rl_ttyflush (void) { fflush (rl_outstream); } /* return the `current display line' of the cursor -- the number of lines to move up to get to the first screen line of the current readline line. */ int _rl_current_display_line (void) { int ret, nleft; /* Find out whether or not there might be invisible characters in the editing buffer. */ if (rl_display_prompt == rl_prompt) nleft = _rl_last_c_pos - _rl_screenwidth - rl_visible_prompt_length; else nleft = _rl_last_c_pos - _rl_screenwidth; if (nleft > 0) ret = 1 + nleft / _rl_screenwidth; else ret = 0; return ret; } void _rl_refresh_line (void) { rl_clear_visible_line (); rl_redraw_prompt_last_line (); rl_keep_mark_active (); } #if defined (HANDLE_MULTIBYTE) /* Calculate the number of screen columns occupied by STR from START to END. In the case of multibyte characters with stateful encoding, we have to scan from the beginning of the string to take the state into account. */ static int _rl_col_width (const char *str, int start, int end, int flags) { WCHAR_T wc; mbstate_t ps; int tmp, point, width, max; if (end <= start) return 0; if (MB_CUR_MAX == 1 || rl_byte_oriented) /* this can happen in some cases where it's inconvenient to check */ return (end - start); memset (&ps, 0, sizeof (mbstate_t)); point = 0; max = end; /* Try to short-circuit common cases. The adjustment to remove wrap_offset is done by the caller. */ /* 1. prompt string */ if (flags && start == 0 && end == local_prompt_len && memcmp (str, local_prompt, local_prompt_len) == 0) return (prompt_physical_chars + wrap_offset); /* 2. prompt string + line contents */ else if (flags && start == 0 && local_prompt_len > 0 && end > local_prompt_len && local_prompt && memcmp (str, local_prompt, local_prompt_len) == 0) { tmp = prompt_physical_chars + wrap_offset; /* XXX - try to call ourselves recursively with non-prompt portion */ tmp += _rl_col_width (str, local_prompt_len, end, flags); return (tmp); } while (point < start) { if (_rl_utf8locale && UTF8_SINGLEBYTE(str[point])) { memset (&ps, 0, sizeof (mbstate_t)); tmp = 1; } else tmp = mbrlen (str + point, max, &ps); if (MB_INVALIDCH ((size_t)tmp)) { /* In this case, the bytes are invalid or too short to compose a multibyte character, so we assume that the first byte represents a single character. */ point++; max--; /* Clear the state of the byte sequence, because in this case the effect of mbstate is undefined. */ memset (&ps, 0, sizeof (mbstate_t)); } else if (MB_NULLWCH (tmp)) break; /* Found '\0' */ else { point += tmp; max -= tmp; } } /* If START is not a byte that starts a character, then POINT will be greater than START. In this case, assume that (POINT - START) gives a byte count that is the number of columns of difference. */ width = point - start; while (point < end) { if (_rl_utf8locale && UTF8_SINGLEBYTE(str[point])) { tmp = 1; wc = (WCHAR_T) str[point]; } else tmp = MBRTOWC (&wc, str + point, max, &ps); if (MB_INVALIDCH ((size_t)tmp)) { /* In this case, the bytes are invalid or too short to compose a multibyte character, so we assume that the first byte represents a single character. */ point++; max--; /* and assume that the byte occupies a single column. */ width++; /* Clear the state of the byte sequence, because in this case the effect of mbstate is undefined. */ memset (&ps, 0, sizeof (mbstate_t)); } else if (MB_NULLWCH (tmp)) break; /* Found '\0' */ else { point += tmp; max -= tmp; tmp = WCWIDTH(wc); width += (tmp >= 0) ? tmp : 1; } } width += point - end; return width; } #endif /* HANDLE_MULTIBYTE */ readline-8.3/terminal.c000644 000436 000024 00000066176 15022315505 015225 0ustar00chetstaff000000 000000 /* terminal.c -- controlling the terminal with termcap. */ /* Copyright (C) 1996-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include "posixstat.h" #include #if defined (HAVE_SYS_FILE_H) # include #endif /* HAVE_SYS_FILE_H */ #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_LOCALE_H) # include #endif #include /* System-specific feature definitions and include files. */ #include "rldefs.h" #ifdef __MSDOS__ # include #endif #include "rltty.h" #if defined (HAVE_SYS_IOCTL_H) # include /* include for declaration of ioctl */ #endif #include "tcap.h" /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "rlshell.h" #include "xmalloc.h" #if defined (_WIN32) # include # include static void _win_get_screensize (int *, int *); #endif #if defined (__EMX__) static void _emx_get_screensize (int *, int *); #endif /* If the calling application sets this to a non-zero value, readline will use the $LINES and $COLUMNS environment variables to set its idea of the window size before interrogating the kernel. */ int rl_prefer_env_winsize = 0; /* If this is non-zero, readline will set LINES and COLUMNS in the environment when it handles SIGWINCH. */ int rl_change_environment = 1; /* **************************************************************** */ /* */ /* Terminal and Termcap */ /* */ /* **************************************************************** */ #ifndef __MSDOS__ static char *term_buffer = (char *)NULL; static char *term_string_buffer = (char *)NULL; #endif static int tcap_initialized; /* Systems for which PC/BC/UP are defined in the curses library and need an extern definition here. */ #if !defined (__linux__) && !defined (__gnu_hurd__) && !defined (NCURSES_VERSION) # if defined (__EMX__) || defined (NEED_EXTERN_PC) extern # endif /* __EMX__ || NEED_EXTERN_PC */ char PC, *BC, *UP; #endif /* !__linux__ && !NCURSES_VERSION */ /* Some strings to control terminal actions. These are output by tputs (). */ char *_rl_term_clreol; char *_rl_term_clrpag; char *_rl_term_clrscroll; char *_rl_term_ho; char *_rl_term_cr; char *_rl_term_backspace; char *_rl_term_goto; char *_rl_term_pc; /* Non-zero if we determine that the terminal can do character insertion. */ int _rl_terminal_can_insert = 0; /* How to insert characters. */ char *_rl_term_im; char *_rl_term_ei; char *_rl_term_ic; char *_rl_term_ip; char *_rl_term_IC; /* How to delete characters. */ char *_rl_term_dc; char *_rl_term_DC; /* How to move forward a char, non-destructively */ char *_rl_term_forward_char; /* How to go up a line. */ char *_rl_term_up; /* A visible bell; char if the terminal can be made to flash the screen. */ static char *_rl_visible_bell; /* Non-zero means the terminal can auto-wrap lines. */ int _rl_term_autowrap = -1; /* Non-zero means that this terminal has a meta key. */ static int term_has_meta; /* The sequences to write to turn on and off the meta key, if this terminal has one. */ static char *_rl_term_mm; static char *_rl_term_mo; /* The sequences to enter and exit standout mode. */ static char *_rl_term_so; static char *_rl_term_se; /* The key sequences output by the arrow keys, if this terminal has any. */ static char *_rl_term_ku; static char *_rl_term_kd; static char *_rl_term_kr; static char *_rl_term_kl; /* How to initialize and reset the arrow keys, if this terminal has any. */ static char *_rl_term_ks; static char *_rl_term_ke; /* The key sequences sent by the Home and End keys, if any. */ static char *_rl_term_kh; static char *_rl_term_kH; static char *_rl_term_at7; /* @7 */ /* Delete key */ static char *_rl_term_kD; /* Insert key */ static char *_rl_term_kI; /* Page up and page down keys */ static char *_rl_term_kP; static char *_rl_term_kN; /* Cursor control */ static char *_rl_term_vs; /* very visible */ static char *_rl_term_ve; /* normal */ /* Bracketed paste */ static char *_rl_term_BE; /* enable */ static char *_rl_term_BD; /* disable */ static char *_rl_term_PS; /* paste start */ static char *_rl_term_PE; /* paste end */ /* User-settable color sequences to begin and end the active region. Defaults are rl_term_so and rl_term_se on non-dumb terminals. */ char *_rl_active_region_start_color = NULL; char *_rl_active_region_end_color = NULL; /* It's not clear how HPUX is so broken here. */ #ifdef TGETENT_BROKEN # define TGETENT_SUCCESS 0 #else # define TGETENT_SUCCESS 1 #endif #ifdef TGETFLAG_BROKEN # define TGETFLAG_SUCCESS 0 #else # define TGETFLAG_SUCCESS 1 #endif #define TGETFLAG(cap) (tgetflag (cap) == TGETFLAG_SUCCESS) static void bind_termcap_arrow_keys (Keymap); /* Variables that hold the screen dimensions, used by the display code. */ int _rl_screenwidth, _rl_screenheight, _rl_screenchars; /* Non-zero means the user wants to enable the keypad. */ int _rl_enable_keypad; /* Non-zero means the user wants to enable a meta key. */ int _rl_enable_meta = 1; /* Non-zero means this is an ANSI-compatible terminal; assume it is. */ int _rl_term_isansi = RL_ANSI_TERM_DEFAULT; #if defined (__EMX__) static void _emx_get_screensize (int *swp, int *shp) { int sz[2]; _scrsize (sz); if (swp) *swp = sz[0]; if (shp) *shp = sz[1]; } #endif #if defined (_WIN32) static void _win_get_screensize (int *swp, int *shp) { HANDLE hConOut; CONSOLE_SCREEN_BUFFER_INFO scr; hConOut = GetStdHandle (STD_OUTPUT_HANDLE); if (hConOut != INVALID_HANDLE_VALUE) { if (GetConsoleScreenBufferInfo (hConOut, &scr)) { *swp = scr.dwSize.X; *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1; } } } #endif int _rl_tcgetwinsize (int tty, struct winsize *wp) { #if defined (HAVE_TCGETWINSIZE) return (tcgetwinsize (tty, wp)); #elif defined (TIOCGWINSZ) return (ioctl (tty, TIOCGWINSZ, wp)); #else return -1; #endif } void _rl_tcsetwinsize (int tty, struct winsize *wp) { #if defined (HAVE_TCGETWINSIZE) tcsetwinsize (tty, wp); #elif defined (TIOCGWINSZ) ioctl (tty, TIOCSWINSZ, wp); #else ; #endif } /* Get readline's idea of the screen size. TTY is a file descriptor open to the terminal. If IGNORE_ENV is true, we do not pay attention to the values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being non-null serve to check whether or not we have initialized termcap. */ void _rl_get_screen_size (int tty, int ignore_env) { char *ss; #if defined (TIOCGWINSZ) || defined (HAVE_TCGETWINSIZE) struct winsize window_size; #endif /* TIOCGWINSZ || HAVE_TCGETWINSIZE */ int wr, wc; wr = wc = -1; #if defined (TIOCGWINSZ) || defined (HAVE_TCGETWINSIZE) if (_rl_tcgetwinsize (tty, &window_size) == 0) { wc = (int) window_size.ws_col; wr = (int) window_size.ws_row; } #endif /* TIOCGWINSZ || HAVE_TCGETWINSIZE */ #if defined (__EMX__) _emx_get_screensize (&wc, &wr); #elif defined (_WIN32) && !defined (__CYGWIN__) _win_get_screensize (&wc, &wr); #endif if (ignore_env || rl_prefer_env_winsize == 0) { _rl_screenwidth = wc; _rl_screenheight = wr; } else _rl_screenwidth = _rl_screenheight = -1; /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV is unset. If we prefer the environment, check it first before assigning the value returned by the kernel. */ if (_rl_screenwidth <= 0) { if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS"))) _rl_screenwidth = atoi (ss); if (_rl_screenwidth <= 0) _rl_screenwidth = wc; #if defined (__DJGPP__) if (_rl_screenwidth <= 0) _rl_screenwidth = ScreenCols (); #else if (_rl_screenwidth <= 0 && term_string_buffer) _rl_screenwidth = tgetnum ("co"); #endif } /* Environment variable LINES overrides setting of "li" if IGNORE_ENV is unset. */ if (_rl_screenheight <= 0) { if (ignore_env == 0 && (ss = sh_get_env_value ("LINES"))) _rl_screenheight = atoi (ss); if (_rl_screenheight <= 0) _rl_screenheight = wr; #if defined (__DJGPP__) if (_rl_screenheight <= 0) _rl_screenheight = ScreenRows (); #else if (_rl_screenheight <= 0 && term_string_buffer) _rl_screenheight = tgetnum ("li"); #endif } /* If all else fails, default to 80x24 terminal. */ if (_rl_screenwidth <= 1) _rl_screenwidth = 80; if (_rl_screenheight <= 0) _rl_screenheight = 24; /* If we're being compiled as part of bash, set the environment variables $LINES and $COLUMNS to new values. Otherwise, just do a pair of putenv () or setenv () calls. */ if (rl_change_environment) sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth); if (_rl_term_autowrap == 0) _rl_screenwidth--; _rl_screenchars = _rl_screenwidth * _rl_screenheight; } void _rl_set_screen_size (int rows, int cols) { if (_rl_term_autowrap == -1) _rl_init_terminal_io (rl_terminal_name); if (rows > 0) _rl_screenheight = rows; if (cols > 0) { _rl_screenwidth = cols; if (_rl_term_autowrap == 0) _rl_screenwidth--; } if (rows > 0 || cols > 0) _rl_screenchars = _rl_screenwidth * _rl_screenheight; } void rl_set_screen_size (int rows, int cols) { _rl_set_screen_size (rows, cols); } void rl_get_screen_size (int *rows, int *cols) { if (rows) *rows = _rl_screenheight; if (cols) *cols = _rl_screenwidth; } void rl_reset_screen_size (void) { _rl_get_screen_size (fileno (rl_instream), 0); } void _rl_sigwinch_resize_terminal (void) { _rl_get_screen_size (fileno (rl_instream), 1); } void rl_resize_terminal (void) { int width, height; width = _rl_screenwidth; height = _rl_screenheight; _rl_get_screen_size (fileno (rl_instream), 1); if (_rl_echoing_p && (width != _rl_screenwidth || height != _rl_screenheight)) { if (CUSTOM_REDISPLAY_FUNC ()) rl_forced_update_display (); else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0) _rl_redisplay_after_sigwinch (); } } struct _tc_string { const char * const tc_var; char **tc_value; }; /* This should be kept sorted, just in case we decide to change the search algorithm to something smarter. */ static const struct _tc_string tc_strings[] = { { "@7", &_rl_term_at7 }, { "BD", &_rl_term_BD }, { "BE", &_rl_term_BE }, { "DC", &_rl_term_DC }, { "E3", &_rl_term_clrscroll }, { "IC", &_rl_term_IC }, { "PE", &_rl_term_PE }, { "PS", &_rl_term_PS }, { "ce", &_rl_term_clreol }, { "cl", &_rl_term_clrpag }, { "cr", &_rl_term_cr }, { "dc", &_rl_term_dc }, { "ei", &_rl_term_ei }, { "ho", &_rl_term_ho }, { "ic", &_rl_term_ic }, { "im", &_rl_term_im }, { "kD", &_rl_term_kD }, /* delete */ { "kH", &_rl_term_kH }, /* home down ?? */ { "kI", &_rl_term_kI }, /* insert */ { "kN", &_rl_term_kN }, /* page down */ { "kP", &_rl_term_kP }, /* page up */ { "kd", &_rl_term_kd }, { "ke", &_rl_term_ke }, /* end keypad mode */ { "kh", &_rl_term_kh }, /* home */ { "kl", &_rl_term_kl }, { "kr", &_rl_term_kr }, { "ks", &_rl_term_ks }, /* start keypad mode */ { "ku", &_rl_term_ku }, { "le", &_rl_term_backspace }, { "mm", &_rl_term_mm }, { "mo", &_rl_term_mo }, { "nd", &_rl_term_forward_char }, { "pc", &_rl_term_pc }, { "se", &_rl_term_se }, { "so", &_rl_term_so }, { "up", &_rl_term_up }, { "vb", &_rl_visible_bell }, { "vs", &_rl_term_vs }, { "ve", &_rl_term_ve }, }; #define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string)) /* Read the desired terminal capability strings into BP. The capabilities are described in the TC_STRINGS table. */ static void get_term_capabilities (char **bp) { #if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */ register int i; for (i = 0; i < NUM_TC_STRINGS; i++) *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp); #endif tcap_initialized = 1; } struct _term_name { const char * const name; size_t len; }; /* Non-exhaustive list of ANSI/ECMA terminals. */ static const struct _term_name ansiterms[] = { { "xterm", 5 }, { "rxvt", 4 }, { "eterm", 5 }, { "screen", 6 }, { "tmux", 4 }, { "vt100", 5 }, { "vt102", 5 }, { "vt220", 5 }, { "vt320", 5 }, { "ansi", 4 }, { "scoansi", 7 }, { "cygwin", 6 }, { "linux", 5 }, { "konsole", 7 }, { "bvterm", 6 }, { 0, 0 } }; static inline int iscsi (const char *s) { return ((s[0] == ESC && s[1] == '[') ? 2 : ((unsigned char)s[0] == 0x9b) ? 1 : 0); } static int _rl_check_ansi_terminal (const char *terminal_name) { int i; size_t len; for (i = 0; ansiterms[i].name; i++) if (STREQN (terminal_name, ansiterms[i].name, ansiterms[i].len)) return 1; if (_rl_term_clreol == 0 || _rl_term_forward_char == 0 || _rl_term_ho == 0 || _rl_term_up == 0) return 0; /* check some common capabilities */ if (((len = iscsi (_rl_term_clreol)) && _rl_term_clreol[len] == 'K') && /* ce */ ((len = iscsi (_rl_term_forward_char)) && _rl_term_forward_char[len] == 'C') && /* nd */ ((len = iscsi (_rl_term_ho)) && _rl_term_ho[len] == 'H') && /* ho */ ((len = iscsi (_rl_term_up)) && _rl_term_up[len] == 'A')) /* up */ return 1; return 0; } int _rl_init_terminal_io (const char *terminal_name) { const char *term; char *buffer; int tty, tgetent_ret, dumbterm, reset_region_colors; term = terminal_name ? terminal_name : sh_get_env_value ("TERM"); _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = _rl_term_clrscroll = (char *)NULL; tty = rl_instream ? fileno (rl_instream) : 0; if (term == 0) term = "dumb"; _rl_term_isansi = RL_ANSI_TERM_DEFAULT; dumbterm = STREQ (term, "dumb") || STREQ (term, "vt52") || STREQ (term, "adm3a"); if (dumbterm) _rl_term_isansi = 0; reset_region_colors = 1; #ifdef __MSDOS__ _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; _rl_term_mm = _rl_term_mo = (char *)NULL; _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0; _rl_term_cr = "\r"; _rl_term_backspace = (char *)NULL; _rl_term_ho = (char *)NULL; _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL; _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL; _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL; _rl_term_kN = _rl_term_kP = (char *)NULL; _rl_term_so = _rl_term_se = (char *)NULL; _rl_term_BD = _rl_term_BE = _rl_term_PE = _rl_term_PS = (char *)NULL; #if defined(HACK_TERMCAP_MOTION) _rl_term_forward_char = (char *)NULL; #endif _rl_get_screen_size (tty, 0); #else /* !__MSDOS__ */ /* I've separated this out for later work on not calling tgetent at all if the calling application has supplied a custom redisplay function, (and possibly if the application has supplied a custom input function). */ if (CUSTOM_REDISPLAY_FUNC()) { tgetent_ret = -1; } else { if (term_string_buffer == 0) term_string_buffer = (char *)xmalloc(2032); if (term_buffer == 0) term_buffer = (char *)xmalloc(4080); buffer = term_string_buffer; tgetent_ret = tgetent (term_buffer, term); } if (tgetent_ret != TGETENT_SUCCESS) { FREE (term_string_buffer); FREE (term_buffer); buffer = term_buffer = term_string_buffer = (char *)NULL; _rl_term_autowrap = 0; /* used by _rl_get_screen_size */ /* Allow calling application to set default height and width, using rl_set_screen_size */ if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) { #if defined (__EMX__) _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); _rl_screenwidth--; #else /* !__EMX__ */ _rl_get_screen_size (tty, 0); #endif /* !__EMX__ */ } /* Defaults. */ if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) { _rl_screenwidth = 79; _rl_screenheight = 24; } /* Everything below here is used by the redisplay code (tputs). */ _rl_screenchars = _rl_screenwidth * _rl_screenheight; _rl_term_cr = "\r"; _rl_term_ho = (char *)NULL; _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL; _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL; _rl_term_kN = _rl_term_kP = (char *)NULL; _rl_term_mm = _rl_term_mo = (char *)NULL; _rl_term_ve = _rl_term_vs = (char *)NULL; _rl_term_forward_char = (char *)NULL; _rl_term_so = _rl_term_se = (char *)NULL; _rl_terminal_can_insert = term_has_meta = 0; _rl_term_isansi = 0; /* not an ANSI terminal */ /* Assume generic unknown terminal can't handle the enable/disable escape sequences */ _rl_term_BD = _rl_term_BE = _rl_term_PE = _rl_term_PS = (char *)NULL; _rl_enable_bracketed_paste = 0; /* No terminal so/se capabilities. */ _rl_enable_active_region = 0; _rl_reset_region_color (0, NULL); _rl_reset_region_color (1, NULL); /* Reasonable defaults for tgoto(). Readline currently only uses tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we change that later... */ PC = '\0'; BC = _rl_term_backspace = "\b"; UP = _rl_term_up; return 0; } get_term_capabilities (&buffer); /* Set up the variables that the termcap library expects the application to provide. */ PC = _rl_term_pc ? *_rl_term_pc : 0; BC = _rl_term_backspace; UP = _rl_term_up; if (_rl_term_cr == 0) _rl_term_cr = "\r"; _rl_term_autowrap = TGETFLAG ("am") && TGETFLAG ("xn"); /* Allow calling application to set default height and width, using rl_set_screen_size */ if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) _rl_get_screen_size (tty, 0); /* "An application program can assume that the terminal can do character insertion if *any one of* the capabilities `IC', `im', `ic' or `ip' is provided." But we can't do anything if only `ip' is provided, so... */ _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic); /* Check to see if this terminal has a meta key and clear the capability variables if there is none. */ term_has_meta = TGETFLAG ("km"); if (term_has_meta == 0) _rl_term_mm = _rl_term_mo = (char *)NULL; #endif /* !__MSDOS__ */ /* Attempt to find and bind the arrow keys. Do not override already bound keys in an overzealous attempt, however. */ bind_termcap_arrow_keys (emacs_standard_keymap); #if defined (VI_MODE) bind_termcap_arrow_keys (vi_movement_keymap); bind_termcap_arrow_keys (vi_insertion_keymap); #endif /* VI_MODE */ if (dumbterm == 0 && _rl_term_isansi == 0) _rl_term_isansi = _rl_check_ansi_terminal (terminal_name); /* There's no way to determine whether or not a given terminal supports bracketed paste mode, so we assume a non-ANSI terminal (as best as we can determine) does not. */ if (_rl_term_isansi == 0) _rl_enable_bracketed_paste = _rl_enable_active_region = 0; if (reset_region_colors) { _rl_reset_region_color (0, _rl_term_so); _rl_reset_region_color (1, _rl_term_se); } return 0; } /* Bind the arrow key sequences from the termcap description in MAP. */ static void bind_termcap_arrow_keys (Keymap map) { Keymap xkeymap; xkeymap = _rl_keymap; _rl_keymap = map; rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history); rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history); rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char); rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char); rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */ rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */ rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete); rl_bind_keyseq_if_unbound (_rl_term_kI, rl_overwrite_mode); /* Insert */ rl_bind_keyseq_if_unbound (_rl_term_kN, rl_history_search_forward); /* Page Down */ rl_bind_keyseq_if_unbound (_rl_term_kP, rl_history_search_backward); /* Page Up */ _rl_keymap = xkeymap; } char * rl_get_termcap (const char *cap) { register int i; if (tcap_initialized == 0) return ((char *)NULL); for (i = 0; i < NUM_TC_STRINGS; i++) { if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0) return *(tc_strings[i].tc_value); } return ((char *)NULL); } /* Re-initialize the terminal considering that the TERM/TERMCAP variable has changed. */ int rl_reset_terminal (const char *terminal_name) { _rl_screenwidth = _rl_screenheight = 0; _rl_init_terminal_io (terminal_name); return 0; } /* A function for the use of tputs () */ #ifdef _MINIX void _rl_output_character_function (int c) { putc (c, _rl_out_stream); } #else /* !_MINIX */ int _rl_output_character_function (int c) { return putc (c, _rl_out_stream); } #endif /* !_MINIX */ /* Write COUNT characters from STRING to the output stream. */ void _rl_output_some_chars (const char *string, int count) { fwrite (string, 1, count, _rl_out_stream); } /* Move the cursor back. */ int _rl_backspace (int count) { register int i; #ifndef __MSDOS__ if (_rl_term_backspace) for (i = 0; i < count; i++) tputs (_rl_term_backspace, 1, _rl_output_character_function); else #endif for (i = 0; i < count; i++) putc ('\b', _rl_out_stream); return 0; } /* Move to the start of the next line. */ int rl_crlf (void) { #if defined (NEW_TTY_DRIVER) || defined (__MINT__) if (_rl_term_cr) tputs (_rl_term_cr, 1, _rl_output_character_function); #endif /* NEW_TTY_DRIVER || __MINT__ */ putc ('\n', _rl_out_stream); return 0; } void _rl_cr (void) { #if defined (__MSDOS__) putc ('\r', rl_outstream); #else tputs (_rl_term_cr, 1, _rl_output_character_function); #endif } /* Ring the terminal bell. */ int rl_ding (void) { if (_rl_echoing_p) { switch (_rl_bell_preference) { case NO_BELL: default: break; case VISIBLE_BELL: if (_rl_visible_bell) { #ifdef __DJGPP__ ScreenVisualBell (); #else tputs (_rl_visible_bell, 1, _rl_output_character_function); #endif break; } /* FALLTHROUGH */ case AUDIBLE_BELL: fprintf (stderr, "\007"); fflush (stderr); break; } return (0); } return (-1); } /* **************************************************************** */ /* */ /* Entering and leaving terminal standout mode */ /* */ /* **************************************************************** */ void _rl_standout_on (void) { #ifndef __MSDOS__ if (_rl_term_so && _rl_term_se) tputs (_rl_term_so, 1, _rl_output_character_function); #endif } void _rl_standout_off (void) { #ifndef __MSDOS__ if (_rl_term_so && _rl_term_se) tputs (_rl_term_se, 1, _rl_output_character_function); #endif } /* **************************************************************** */ /* */ /* Controlling color for a portion of the line */ /* */ /* **************************************************************** */ /* Reset the region color variables to VALUE depending on WHICH (0 == start, 1 == end). This is where all the memory allocation for the color variable strings is performed. We might want to pass a flag saying whether or not to translate VALUE like a key sequence, but it doesn't really matter. */ int _rl_reset_region_color (int which, const char *value) { int len; if (which == 0) { xfree (_rl_active_region_start_color); if (value && *value) { _rl_active_region_start_color = (char *)xmalloc (2 * strlen (value) + 1); rl_translate_keyseq (value, _rl_active_region_start_color, &len); _rl_active_region_start_color[len] = '\0'; } else _rl_active_region_start_color = NULL; } else { xfree (_rl_active_region_end_color); if (value && *value) { _rl_active_region_end_color = (char *)xmalloc (2 * strlen (value) + 1); rl_translate_keyseq (value, _rl_active_region_end_color, &len); _rl_active_region_end_color[len] = '\0'; } else _rl_active_region_end_color = NULL; } return 0; } void _rl_region_color_on (void) { #ifndef __MSDOS__ if (_rl_active_region_start_color && _rl_active_region_end_color) tputs (_rl_active_region_start_color, 1, _rl_output_character_function); #endif } void _rl_region_color_off (void) { #ifndef __MSDOS__ if (_rl_active_region_start_color && _rl_active_region_end_color) tputs (_rl_active_region_end_color, 1, _rl_output_character_function); #endif } /* **************************************************************** */ /* */ /* Controlling the Meta Key and Keypad */ /* */ /* **************************************************************** */ static int enabled_meta = 0; /* flag indicating we enabled meta mode */ void _rl_enable_meta_key (void) { #if !defined (__DJGPP__) if (term_has_meta && _rl_term_mm) { tputs (_rl_term_mm, 1, _rl_output_character_function); enabled_meta = 1; } #endif } void _rl_disable_meta_key (void) { #if !defined (__DJGPP__) if (term_has_meta && _rl_term_mo && enabled_meta) { tputs (_rl_term_mo, 1, _rl_output_character_function); enabled_meta = 0; } #endif } void _rl_control_keypad (int on) { #if !defined (__DJGPP__) if (on && _rl_term_ks) tputs (_rl_term_ks, 1, _rl_output_character_function); else if (!on && _rl_term_ke) tputs (_rl_term_ke, 1, _rl_output_character_function); #endif } /* **************************************************************** */ /* */ /* Controlling the Cursor */ /* */ /* **************************************************************** */ /* Set the cursor appropriately depending on IM, which is one of the insert modes (insert or overwrite). Insert mode gets the normal cursor. Overwrite mode gets a very visible cursor. Only does anything if we have both capabilities. */ void _rl_set_cursor (int im, int force) { #ifndef __MSDOS__ if (_rl_term_ve && _rl_term_vs) { if (force || im != rl_insert_mode) { if (im == RL_IM_OVERWRITE) tputs (_rl_term_vs, 1, _rl_output_character_function); else tputs (_rl_term_ve, 1, _rl_output_character_function); } } #endif } readline-8.3/parens.c000644 000436 000024 00000011426 14411044303 014662 0ustar00chetstaff000000 000000 /* parens.c -- implementation of matching parentheses feature. */ /* Copyright (C) 1987, 1989, 1992-2015, 2017, 2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (__TANDEM) # include #endif #include "rlconf.h" #if defined (HAVE_CONFIG_H) # include #endif #include #include #if defined (HAVE_UNISTD_H) # include #endif #include "rlstdc.h" #include "posixselect.h" #if defined (HAVE_STRING_H) # include #else /* !HAVE_STRING_H */ # include #endif /* !HAVE_STRING_H */ #include "readline.h" #include "rlprivate.h" static int find_matching_open (char *, int, int); /* Non-zero means try to blink the matching open parenthesis when the close parenthesis is inserted. */ int rl_blink_matching_paren = 0; static int _paren_blink_usec = 500000; /* Change emacs_standard_keymap to have bindings for paren matching when ON_OR_OFF is 1, change them back to self_insert when ON_OR_OFF == 0. */ void _rl_enable_paren_matching (int on_or_off) { if (on_or_off) { /* ([{ */ rl_bind_key_in_map (')', rl_insert_close, emacs_standard_keymap); rl_bind_key_in_map (']', rl_insert_close, emacs_standard_keymap); rl_bind_key_in_map ('}', rl_insert_close, emacs_standard_keymap); #if defined (VI_MODE) /* ([{ */ rl_bind_key_in_map (')', rl_insert_close, vi_insertion_keymap); rl_bind_key_in_map (']', rl_insert_close, vi_insertion_keymap); rl_bind_key_in_map ('}', rl_insert_close, vi_insertion_keymap); #endif } else { /* ([{ */ rl_bind_key_in_map (')', rl_insert, emacs_standard_keymap); rl_bind_key_in_map (']', rl_insert, emacs_standard_keymap); rl_bind_key_in_map ('}', rl_insert, emacs_standard_keymap); #if defined (VI_MODE) /* ([{ */ rl_bind_key_in_map (')', rl_insert, vi_insertion_keymap); rl_bind_key_in_map (']', rl_insert, vi_insertion_keymap); rl_bind_key_in_map ('}', rl_insert, vi_insertion_keymap); #endif } } int rl_set_paren_blink_timeout (int u) { int o; o = _paren_blink_usec; if (u > 0) _paren_blink_usec = u; return (o); } int rl_insert_close (int count, int invoking_key) { if (rl_explicit_arg || !rl_blink_matching_paren) _rl_insert_char (count, invoking_key); else { #if defined (HAVE_SELECT) int orig_point, match_point, ready; struct timeval timer; fd_set readfds; _rl_insert_char (1, invoking_key); (*rl_redisplay_function) (); match_point = find_matching_open (rl_line_buffer, rl_point - 2, invoking_key); /* Emacs might message or ring the bell here, but I don't. */ if (match_point < 0) return 1; FD_ZERO (&readfds); FD_SET (fileno (rl_instream), &readfds); USEC_TO_TIMEVAL (_paren_blink_usec, timer); orig_point = rl_point; rl_point = match_point; (*rl_redisplay_function) (); # if defined (RL_TIMEOUT_USE_SELECT) ready = _rl_timeout_select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer, NULL); # else ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer); # endif rl_point = orig_point; #else /* !HAVE_SELECT */ _rl_insert_char (count, invoking_key); #endif /* !HAVE_SELECT */ } return 0; } static int find_matching_open (char *string, int from, int closer) { register int i; int opener, level, delimiter; switch (closer) { case ']': opener = '['; break; case '}': opener = '{'; break; case ')': opener = '('; break; default: return (-1); } level = 1; /* The closer passed in counts as 1. */ delimiter = 0; /* Delimited state unknown. */ for (i = from; i > -1; i--) { if (delimiter && (string[i] == delimiter)) delimiter = 0; else if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, string[i])) delimiter = string[i]; else if (!delimiter && (string[i] == closer)) level++; else if (!delimiter && (string[i] == opener)) level--; if (!level) break; } return (i); } readline-8.3/README000644 000436 000024 00000017722 14714700606 014126 0ustar00chetstaff000000 000000 Introduction ============ This is the Gnu Readline library, version 8.3. The Readline library provides a set of functions for use by applications that allow users to edit command lines as they are typed in. Both Emacs and vi editing modes are available. The Readline library includes additional functions to maintain a list of previously-entered command lines, to recall and perhaps reedit those lines, and perform csh-like history expansion on previous commands. The history facilities are also placed into a separate library, the History library, as part of the build process. The History library may be used without Readline in applications which desire its capabilities. The Readline library is free software, distributed under the terms of the [GNU] General Public License as published by the Free Software Foundation, version 3 of the License. For more information, see the file COPYING. To build the library, try typing `./configure', then `make'. The configuration process is automated, so no further intervention should be necessary. Readline builds with `gcc' by default if it is available. If you want to use `cc' instead, type CC=cc ./configure if you are using a Bourne-style shell. If you are not, the following may work: env CC=cc ./configure Read the file INSTALL in this directory for more information about how to customize and control the build process, including how to build readline in a directory other than the source directory. The file rlconf.h contains C preprocessor defines that enable and disable certain Readline features. The special make target `everything' will build the static and shared libraries (if the target platform supports them) and the examples. Examples ======== There are several example programs that use Readline features in the examples directory. The `rl' program is of particular interest. It is a command-line interface to Readline, suitable for use in shell scripts in place of `read' (but look at bash's `read -e' first). Shared Libraries ================ There is skeletal support for building shared versions of the Readline and History libraries. The configure script creates a Makefile in the `shlib' subdirectory, and typing `make shared' will cause shared versions of the Readline and History libraries to be built on supported platforms. If `configure' is given the `--enable-shared' option, it will attempt to build the shared libraries by default on supported platforms. Configure calls the script support/shobj-conf to test whether or not shared library creation is supported and to generate the values of variables that are substituted into shlib/Makefile. If you try to build shared libraries on an unsupported platform, `make' will display a message asking you to update support/shobj-conf for your platform. If you need to update support/shobj-conf, you will need to create a `stanza' for your operating system and compiler. The script uses the value of host_os and ${CC} as determined by configure. For instance, FreeBSD 4.2 with any version of gcc is identified as `freebsd4.2-gcc*'. In the stanza for your operating system-compiler pair, you will need to define several variables. They are: SHOBJ_CC The C compiler used to compile source files into shareable object files. This is normally set to the value of ${CC} by configure, and should not need to be changed. SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create position-independent code. If you are using gcc, this should probably be set to `-fpic'. SHOBJ_LD The link editor to be used to create the shared library from the object files created by $SHOBJ_CC. If you are using gcc, a value of `gcc' will probably work. SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation. If you are using gcc, `-shared' may be all that is necessary. These should be the flags needed for generic shared object creation. SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library creation. Many systems use the -R option to the link editor to embed a path within the library for run-time library searches. A reasonable value for such systems would be `-R$(libdir)'. SHLIB_LIBS Any additional libraries that shared libraries should be linked against when they are created. SHLIB_LIBPREF The prefix to use when generating the filename of the shared library. The default is `lib'; Cygwin uses `cyg'. SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when generating the filename of the shared library. Many systems use `so'; HP-UX uses `sl'. SHLIB_LIBVERSION The string to append to the filename to indicate the version of the shared library. It should begin with $(SHLIB_LIBSUFF), and possibly include version information that allows the run-time loader to load the version of the shared library appropriate for a particular program. Systems using shared libraries similar to SunOS 4.x use major and minor library version numbers; for those systems a value of `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate. Systems based on System V Release 4 don't use minor version numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems. Other Unix versions use different schemes. SHLIB_DLLVERSION The version number for shared libraries that determines API compatibility between readline versions and the underlying system. Used only on Cygwin. Defaults to $SHLIB_MAJOR, but can be overridden at configuration time by defining DLLVERSION in the environment. SHLIB_DOT The character used to separate the name of the shared library from the suffix and version information. The default is `.'; systems like Cygwin which don't separate version information from the library name should set this to the empty string. SHLIB_STATUS Set this to `supported' when you have defined the other necessary variables. Make uses this to determine whether or not shared library creation should be attempted. You should look at the existing stanzas in support/shobj-conf for ideas. Once you have updated support/shobj-conf, re-run configure and type `make shared'. The shared libraries will be created in the shlib subdirectory. If shared libraries are created, `make install' will install them. You may install only the shared libraries by running `make install-shared' from the top-level build directory. Running `make install' in the shlib subdirectory will also work. If you don't want to install any created shared libraries, run `make install-static'. Documentation ============= The documentation for the Readline and History libraries appears in the `doc' subdirectory. There are three texinfo files and a Unix-style manual page describing the facilities available in the Readline library. The texinfo files include both user and programmer's manuals. HTML versions of the manuals appear in the `doc' subdirectory as well. Usage ===== Our position on the use of Readline through a shared-library linking mechanism is that there is no legal difference between shared-library linking and static linking--either kind of linking combines various modules into a single larger work. The conditions for using Readline in a larger work are stated in section 3 of the GNU GPL. Reporting Bugs ============== Bug reports for Readline should be sent to: bug-readline@gnu.org When reporting a bug, please include the following information: * the version number and release status of Readline (e.g., 4.2-release) * the machine and OS that it is running on * a list of the compilation flags or the contents of `config.h', if appropriate * a description of the bug * a recipe for recreating the bug reliably * a fix for the bug if you have one! If you would like to contact the Readline maintainer directly, send mail to bash-maintainers@gnu.org. Since Readline is developed along with bash, the bug-bash@gnu.org mailing list (mirrored to the Usenet newsgroup gnu.bash.bug) often contains Readline bug reports and fixes. Chet Ramey chet.ramey@case.edu readline-8.3/rlstdc.h000644 000436 000024 00000003017 14411037710 014673 0ustar00chetstaff000000 000000 /* stdc.h -- macros to make source compile on both ANSI C and K&R C compilers. */ /* Copyright (C) 1993-2009,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RL_STDC_H_) #define _RL_STDC_H_ /* Adapted from BSD /usr/include/sys/cdefs.h. */ /* A function can be defined using prototypes and compile on both ANSI C and traditional C compilers with something like this: extern char *func PARAMS((char *, char *, int)); */ #if !defined (PARAMS) # if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) # define PARAMS(protos) protos # else # define PARAMS(protos) () # endif #endif #ifndef __attribute__ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) # define __attribute__(x) # endif #endif #endif /* !_RL_STDC_H_ */ readline-8.3/posixselect.h000644 000436 000024 00000002552 14340175612 015752 0ustar00chetstaff000000 000000 /* posixselect.h -- wrapper for select(2) includes and definitions */ /* Copyright (C) 2009 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. Bash 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 3 of the License, or (at your option) any later version. Bash 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 Bash. If not, see . */ #ifndef _POSIXSELECT_H_ #define _POSIXSELECT_H_ #if defined (FD_SET) && !defined (HAVE_SELECT) && !defined (_WIN32) # define HAVE_SELECT 1 #endif #if defined (HAVE_SELECT) # if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX) # include "posixtime.h" # endif #endif /* HAVE_SELECT */ #if defined (HAVE_SYS_SELECT_H) # include #endif #ifndef USEC_PER_SEC # define USEC_PER_SEC 1000000 #endif #define USEC_TO_TIMEVAL(us, tv) \ do { \ (tv).tv_sec = (us) / USEC_PER_SEC; \ (tv).tv_usec = (us) % USEC_PER_SEC; \ } while (0) #endif /* _POSIXSELECT_H_ */ readline-8.3/history.c000644 000436 000024 00000046345 15020315127 015105 0ustar00chetstaff000000 000000 /* history.c -- standalone history library */ /* Copyright (C) 1989-2025 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. History 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 3 of the License, or (at your option) any later version. History 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 History. If not, see . */ /* The goal is to make the implementation transparent, so that you don't have to know what data types are used, just what functions you can call. I think I have done that. */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_UNISTD_H) # ifdef _MINIX # include # endif # include #endif #include "posixtime.h" #include #include "history.h" #include "histlib.h" #include "xmalloc.h" #if !defined (errno) extern int errno; #endif /* How big to make the_history when we first allocate it. */ #define DEFAULT_HISTORY_INITIAL_SIZE 502 #define MAX_HISTORY_INITIAL_SIZE 8192 /* The number of slots to increase the_history by. */ #define DEFAULT_HISTORY_GROW_SIZE 256 static char *hist_inittime (void); static int history_list_grow_size (void); static void history_list_resize (int); /* XXX - size_t? */ static void advance_history (void); /* **************************************************************** */ /* */ /* History Functions */ /* */ /* **************************************************************** */ /* An array of HIST_ENTRY. This is where we store the history. the_history is a roving pointer somewhere into this, so the user-visible history list is a window into real_history starting at the_history and extending history_length entries. */ static HIST_ENTRY **real_history = (HIST_ENTRY **)NULL; /* The current number of slots allocated to the input_history. */ static int real_history_size = 0; /* A pointer to somewhere in real_history, where the user-visible history starts. */ static HIST_ENTRY **the_history = (HIST_ENTRY **)NULL; /* Non-zero means that we have enforced a limit on the amount of history that we save. */ static int history_stifled; /* The number of history entries available for user use, starting at the_history. real_history_size - history_size == the_history - real_history */ static int history_size; /* If HISTORY_STIFLED is non-zero, then this is the maximum number of entries to remember. */ int history_max_entries; int max_input_history; /* backwards compatibility */ /* The current location of the interactive history pointer. Just makes life easier for outside callers. */ int history_offset; /* The number of strings currently stored in the history list. This is always <= real_history_length */ int history_length; /* The logical `base' of the history array. It defaults to 1. */ int history_base = 1; /* Compute the number of bits required to store a given nonnegative integer. NOTE: _bit_length(0) == 0 */ static inline unsigned _bit_length(unsigned n) { /* This implementation is for simplicity, not for performance, but it is fast enough for our purposes here. */ unsigned count = 0; while (n) { n >>= 1; count++; } return count; } /* Compute a grow size that adjusts to the size of the history. We aim to grow by roughly sqrt(history_size) in order to amortize the cost of realloc() and memmove(). This reduces the total cost of the memmoves from O(N^2) to O(N*sqrt(N)). */ static int history_list_grow_size (void) { int width, r; /* Handle small positive values and guard against history_length accidentally being negative. */ const int MIN_BITS = 10; if (history_length < (1 << MIN_BITS)) return DEFAULT_HISTORY_GROW_SIZE; /* For other values, we just want something easy to compute that grows roughly as sqrt(N), where N=history_length. We use approximately 2^((k+1)/2), where k is the bit length of N. This bounds the value between sqrt(2N) and 2*sqrt(N). */ width = MIN_BITS + _bit_length(history_length >> MIN_BITS); /* If width is odd then this is 2^((width+1)/2). An even width gives a value of 3*2^((width-2)/2) ~ 1.06*2^((width+1)/2). */ r = (1 << (width / 2)) + (1 << ((width - 1) / 2)); /* Make sure we always expand the list by at least DEFAULT_HISTORY_GROW_SIZE */ return ((r < DEFAULT_HISTORY_GROW_SIZE) ? DEFAULT_HISTORY_GROW_SIZE : r); } /* Return the current HISTORY_STATE of the history. */ HISTORY_STATE * history_get_history_state (void) { HISTORY_STATE *state; state = (HISTORY_STATE *)xmalloc (sizeof (HISTORY_STATE)); state->entries = the_history; state->offset = history_offset; state->length = history_length; state->size = history_size; state->flags = 0; if (history_stifled) state->flags |= HS_STIFLED; return (state); } /* Set the state of the current history array to STATE. */ void history_set_history_state (HISTORY_STATE *state) { the_history = state->entries; history_offset = state->offset; history_length = state->length; history_size = state->size; if (state->flags & HS_STIFLED) history_stifled = 1; } /* Begin a session in which the history functions might be used. This initializes interactive variables. */ void using_history (void) { history_offset = history_length; } /* Return the number of bytes that the primary history entries are using. This just adds up the lengths of the_history->lines and the associated timestamps. */ int history_total_bytes (void) { int i, result; for (i = result = 0; the_history && the_history[i]; i++) result += HISTENT_BYTES (the_history[i]); return (result); } /* Returns the magic number which says what history element we are looking at now. In this implementation, it returns history_offset. */ int where_history (void) { return (history_offset); } /* Make the current history item be the one at POS, an absolute index. Returns zero if POS is out of range, else non-zero. */ int history_set_pos (int pos) { if (pos > history_length || pos < 0 || !the_history) return (0); history_offset = pos; return (1); } /* Are we currently at the end of the history list? */ int _hs_at_end_of_history (void) { return (the_history == 0 || history_offset == history_length); } /* Return the current history array. The caller has to be careful, since this is the actual array of data, and could be bashed or made corrupt easily. The array is terminated with a NULL pointer. */ HIST_ENTRY ** history_list (void) { return (the_history); } /* Return the history entry at the current position, as determined by history_offset. If there is no entry there, return a NULL pointer. */ HIST_ENTRY * current_history (void) { return ((history_offset == history_length) || the_history == 0) ? (HIST_ENTRY *)NULL : the_history[history_offset]; } /* Back up history_offset to the previous history entry, and return a pointer to that entry. If there is no previous entry then return a NULL pointer. */ HIST_ENTRY * previous_history (void) { return history_offset ? the_history[--history_offset] : (HIST_ENTRY *)NULL; } /* Move history_offset forward to the next history entry, and return a pointer to that entry. If there is no next entry then return a NULL pointer. */ HIST_ENTRY * next_history (void) { return (history_offset == history_length) ? (HIST_ENTRY *)NULL : the_history[++history_offset]; } /* Return the history entry which is logically at OFFSET in the history array. OFFSET is relative to history_base. */ HIST_ENTRY * history_get (int offset) { int local_index; local_index = offset - history_base; return (local_index >= history_length || local_index < 0 || the_history == 0) ? (HIST_ENTRY *)NULL : the_history[local_index]; } HIST_ENTRY * alloc_history_entry (char *string, char *ts) { HIST_ENTRY *temp; temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); temp->line = string ? savestring (string) : string; temp->data = (char *)NULL; temp->timestamp = ts; return temp; } time_t history_get_time (HIST_ENTRY *hist) { char *ts; time_t t; if (hist == 0 || hist->timestamp == 0) return 0; ts = hist->timestamp; if (ts[0] != history_comment_char) return 0; errno = 0; t = (time_t) strtol (ts + 1, (char **)NULL, 10); /* XXX - should use strtol() here */ if (errno == ERANGE) return (time_t)0; return t; } static char * hist_inittime (void) { time_t t; char ts[64], *ret; t = getnow (); #if defined (HAVE_VSNPRINTF) /* assume snprintf if vsnprintf exists */ snprintf (ts, sizeof (ts) - 1, "X%lu", (unsigned long) t); #else sprintf (ts, "X%lu", (unsigned long) t); #endif ret = savestring (ts); ret[0] = history_comment_char; return ret; } /* Ensure space for new history entries by resetting the start pointer (the_history) and resizing real_history if necessary. */ static void history_list_resize (int new_size) { /* Do nothing there is already enough user space. history_length is always <= real_history_size */ if (new_size < history_length) return; /* If we need to, reset the_history to the start of real_history and start over. */ if (the_history != real_history) memmove (real_history, the_history, history_length * sizeof (HIST_ENTRY *)); /* Don't bother if real_history_size is already big enough, since at this point the_history == real_history and we will set history_size to real_history_size. We don't shrink the history list. */ if (new_size > real_history_size) { real_history = (HIST_ENTRY **) xrealloc (real_history, new_size * sizeof (HIST_ENTRY *)); real_history_size = new_size; } the_history = real_history; history_size = real_history_size; if (history_size > history_length) memset (real_history + history_length, 0, (history_size - history_length) * sizeof (HIST_ENTRY *)); } static void advance_history (void) { /* Advance 'the_history' pointer to simulate dropping the first entry. */ the_history++; history_size--; /* If full, move all the entries (and trailing NULL) to the beginning. */ if (history_length == history_size) history_list_resize (history_length + history_list_grow_size ()); } /* Place STRING at the end of the history list. The data field is set to NULL. */ void add_history (const char *string) { HIST_ENTRY *temp; int new_length; if (history_stifled && (history_length == history_max_entries)) { /* If the history is stifled, and history_length is zero, and it equals history_max_entries, we don't save items. */ if (history_length == 0) return; /* If there is something in the slot, then remove it. */ if (the_history[0]) (void) free_history_entry (the_history[0]); /* Advance the pointer into real_history, resizing if necessary. */ advance_history (); new_length = history_length; history_base++; } else { if (history_size == 0) { int initial_size; if (history_stifled && history_max_entries > 0) initial_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE) ? MAX_HISTORY_INITIAL_SIZE : history_max_entries + 2; else initial_size = DEFAULT_HISTORY_INITIAL_SIZE; history_list_resize (initial_size); new_length = 1; } else { if (history_length == (history_size - 1)) history_list_resize (real_history_size + history_list_grow_size ()); new_length = history_length + 1; } } temp = alloc_history_entry ((char *)string, hist_inittime ()); the_history[new_length] = (HIST_ENTRY *)NULL; the_history[new_length - 1] = temp; history_length = new_length; } /* Change the time stamp of the most recent history entry to STRING. */ void add_history_time (const char *string) { HIST_ENTRY *hs; if (string == 0 || history_length < 1) return; hs = the_history[history_length - 1]; FREE (hs->timestamp); hs->timestamp = savestring (string); } /* Free HIST and return the data so the calling application can free it if necessary and desired. */ histdata_t free_history_entry (HIST_ENTRY *hist) { histdata_t x; if (hist == 0) return ((histdata_t) 0); FREE (hist->line); FREE (hist->timestamp); x = hist->data; xfree (hist); return (x); } HIST_ENTRY * copy_history_entry (HIST_ENTRY *hist) { HIST_ENTRY *ret; char *ts; if (hist == 0) return hist; ret = alloc_history_entry (hist->line, (char *)NULL); ts = hist->timestamp ? savestring (hist->timestamp) : hist->timestamp; ret->timestamp = ts; ret->data = hist->data; return ret; } /* Make the history entry at WHICH have LINE and DATA. This returns the old entry so you can dispose of the data. In the case of an invalid WHICH, a NULL pointer is returned. */ HIST_ENTRY * replace_history_entry (int which, const char *line, histdata_t data) { HIST_ENTRY *temp, *old_value; if (which < 0 || which >= history_length) return ((HIST_ENTRY *)NULL); temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); old_value = the_history[which]; temp->line = savestring (line); temp->data = data; temp->timestamp = old_value->timestamp ? savestring (old_value->timestamp) : 0; the_history[which] = temp; return (old_value); } /* Append LINE to the history line at offset WHICH, adding a newline to the end of the current line first. This can be used to construct multi-line history entries while reading lines from the history file. */ void _hs_append_history_line (int which, const char *line) { HIST_ENTRY *hent; size_t newlen, curlen, minlen; char *newline; hent = the_history[which]; curlen = strlen (hent->line); minlen = curlen + strlen (line) + 2; /* min space needed */ if (curlen > 256) /* XXX - for now */ { newlen = 512; /* now realloc in powers of 2 */ /* we recalcluate every time; the operations are cheap */ while (newlen < minlen) newlen <<= 1; } else newlen = minlen; /* Assume that realloc returns the same pointer and doesn't try a new alloc/copy if the new size is the same as the one last passed. */ newline = realloc (hent->line, newlen); if (newline) { hent->line = newline; hent->line[curlen++] = '\n'; strcpy (hent->line + curlen, line); } } /* Replace the DATA in the specified history entries, replacing OLD with NEW. WHICH says which one(s) to replace: WHICH == -1 means to replace all of the history entries where entry->data == OLD; WHICH == -2 means to replace the `newest' history entry where entry->data == OLD; and WHICH >= 0 means to replace that particular history entry's data, as long as it matches OLD. */ void _hs_replace_history_data (int which, histdata_t *old, histdata_t *new) { HIST_ENTRY *entry; int i, last; if (which < -2 || which >= history_length || history_length == 0 || the_history == 0) return; if (which >= 0) { entry = the_history[which]; if (entry && entry->data == old) entry->data = new; return; } last = -1; for (i = history_length - 1; i >= 0; i--) { entry = the_history[i]; if (entry == 0) continue; if (entry->data == old) { last = i; if (which == -1) entry->data = new; } } if (which == -2 && last >= 0) { entry = the_history[last]; entry->data = new; /* XXX - we don't check entry->old */ } } int _hs_search_history_data (histdata_t *needle) { int i; HIST_ENTRY *entry; if (history_length == 0 || the_history == 0) return -1; for (i = history_length - 1; i >= 0; i--) { entry = the_history[i]; if (entry == 0) continue; if (entry->data == needle) return i; } return -1; } /* Remove history element WHICH from the history. The removed element is returned to you so you can free the line, data, and containing structure. */ HIST_ENTRY * remove_history (int which) { HIST_ENTRY *return_value; #if 1 int nentries; HIST_ENTRY **start, **end; #else int i; #endif if (which < 0 || which >= history_length || history_length == 0 || the_history == 0) return ((HIST_ENTRY *)NULL); return_value = the_history[which]; #if 1 /* Copy the rest of the entries, moving down one slot. Copy includes trailing NULL. */ nentries = history_length - which; start = the_history + which; end = start + 1; memmove (start, end, nentries * sizeof (HIST_ENTRY *)); #else for (i = which; i < history_length; i++) the_history[i] = the_history[i + 1]; #endif history_length--; return (return_value); } HIST_ENTRY ** remove_history_range (int first, int last) { HIST_ENTRY **return_value; register int i; int nentries; HIST_ENTRY **start, **end; if (the_history == 0 || history_length == 0) return ((HIST_ENTRY **)NULL); if (first < 0 || first >= history_length || last < 0 || last >= history_length) return ((HIST_ENTRY **)NULL); if (first > last) return (HIST_ENTRY **)NULL; nentries = last - first + 1; return_value = (HIST_ENTRY **)malloc ((nentries + 1) * sizeof (HIST_ENTRY *)); if (return_value == 0) return return_value; /* Return all the deleted entries in a list */ for (i = first ; i <= last; i++) return_value[i - first] = the_history[i]; return_value[i - first] = (HIST_ENTRY *)NULL; /* Copy the rest of the entries, moving down NENTRIES slots. Copy includes trailing NULL. */ start = the_history + first; end = the_history + last + 1; memmove (start, end, (history_length - last) * sizeof (HIST_ENTRY *)); history_length -= nentries; return (return_value); } /* Stifle the history list, remembering only MAX number of lines. */ void stifle_history (int max) { register int i, j; if (max < 0) max = 0; if (history_length > max) { /* This loses because we cannot free the data. */ for (i = 0, j = history_length - max; i < j; i++) free_history_entry (the_history[i]); history_base = i; for (j = 0, i = history_length - max; j < max; i++, j++) the_history[j] = the_history[i]; the_history[j] = (HIST_ENTRY *)NULL; history_length = j; } history_stifled = 1; max_input_history = history_max_entries = max; } /* Stop stifling the history. This returns the previous maximum number of history entries. The value is positive if the history was stifled, negative if it wasn't. */ int unstifle_history (void) { if (history_stifled) { history_stifled = 0; return (history_max_entries); } else return (-history_max_entries); } int history_is_stifled (void) { return (history_stifled); } void clear_history (void) { register int i; /* This loses because we cannot free the data. */ for (i = 0; i < history_length; i++) { free_history_entry (the_history[i]); the_history[i] = (HIST_ENTRY *)NULL; } history_offset = history_length = 0; history_base = 1; /* reset history base to default */ } readline-8.3/rltypedefs.h000644 000436 000024 00000005770 14462002506 015572 0ustar00chetstaff000000 000000 /* rltypedefs.h -- Type declarations for readline functions. */ /* Copyright (C) 2000-2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #ifndef _RL_TYPEDEFS_H_ #define _RL_TYPEDEFS_H_ #ifdef __cplusplus extern "C" { #endif /* Old-style, attempt to mark as deprecated in some way people will notice. */ #if !defined (_FUNCTION_DEF) && defined (WANT_OBSOLETE_TYPEDEFS) # define _FUNCTION_DEF typedef int Function () __attribute__((deprecated)); typedef void VFunction () __attribute__((deprecated)); typedef char *CPFunction () __attribute__((deprecated)); typedef char **CPPFunction () __attribute__((deprecated)); #endif /* _FUNCTION_DEF && WANT_OBSOLETE_TYPEDEFS */ /* New style. */ #if !defined (_RL_FUNCTION_TYPEDEF) # define _RL_FUNCTION_TYPEDEF /* Bindable functions */ typedef int rl_command_func_t (int, int); /* Typedefs for the completion system */ typedef char *rl_compentry_func_t (const char *, int); typedef char **rl_completion_func_t (const char *, int, int); typedef char *rl_quote_func_t (char *, int, char *); typedef char *rl_dequote_func_t (char *, int); typedef int rl_compignore_func_t (char **); typedef void rl_compdisp_func_t (char **, int, int); /* Functions for displaying key bindings. Currently only one. */ typedef void rl_macro_print_func_t (const char *, const char *, int, const char *); /* Type for input and pre-read hook functions like rl_event_hook */ typedef int rl_hook_func_t (void); /* Input function type */ typedef int rl_getc_func_t (FILE *); /* Generic function that takes a character buffer (which could be the readline line buffer) and an index into it (which could be rl_point) and returns an int. */ typedef int rl_linebuf_func_t (char *, int); /* `Generic' function pointer typedefs */ typedef int rl_intfunc_t (int); #define rl_ivoidfunc_t rl_hook_func_t typedef int rl_icpfunc_t (char *); typedef int rl_icppfunc_t (char **); typedef void rl_voidfunc_t (void); typedef void rl_vintfunc_t (int); typedef void rl_vcpfunc_t (char *); typedef void rl_vcppfunc_t (char **); typedef char *rl_cpvfunc_t (void); typedef char *rl_cpifunc_t (int); typedef char *rl_cpcpfunc_t (char *); typedef char *rl_cpcppfunc_t (char **); #endif /* _RL_FUNCTION_TYPEDEF */ #ifdef __cplusplus } #endif #endif /* _RL_TYPEDEFS_H_ */ readline-8.3/history.pc.in000644 000436 000024 00000000453 14147753562 015702 0ustar00chetstaff000000 000000 prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: History Description: Gnu History library for managing previously-entered lines URL: http://tiswww.cwru.edu/php/chet/readline/rltop.html Version: @LIBVERSION@ Libs: -L${libdir} -lhistory Cflags: -I${includedir} readline-8.3/USAGE000644 000436 000024 00000003751 06746073640 014041 0ustar00chetstaff000000 000000 From rms@gnu.org Thu Jul 22 20:37:55 1999 Flags: 10 Return-Path: rms@gnu.org Received: from arthur.INS.CWRU.Edu (root@arthur.INS.CWRU.Edu [129.22.8.215]) by odin.INS.CWRU.Edu with ESMTP (8.8.6+cwru/CWRU-2.4-ins) id UAA25349; Thu, 22 Jul 1999 20:37:54 -0400 (EDT) (from rms@gnu.org for ) Received: from nike.ins.cwru.edu (root@nike.INS.CWRU.Edu [129.22.8.219]) by arthur.INS.CWRU.Edu with ESMTP (8.8.8+cwru/CWRU-3.6) id UAA05311; Thu, 22 Jul 1999 20:37:51 -0400 (EDT) (from rms@gnu.org for ) Received: from pele.santafe.edu (pele.santafe.edu [192.12.12.119]) by nike.ins.cwru.edu with ESMTP (8.8.7/CWRU-2.5-bsdi) id UAA13350; Thu, 22 Jul 1999 20:37:50 -0400 (EDT) (from rms@gnu.org for ) Received: from wijiji.santafe.edu (wijiji [192.12.12.5]) by pele.santafe.edu (8.9.1/8.9.1) with ESMTP id SAA10831 for ; Thu, 22 Jul 1999 18:37:47 -0600 (MDT) Received: (from rms@localhost) by wijiji.santafe.edu (8.9.1b+Sun/8.9.1) id SAA01089; Thu, 22 Jul 1999 18:37:46 -0600 (MDT) Date: Thu, 22 Jul 1999 18:37:46 -0600 (MDT) Message-Id: <199907230037.SAA01089@wijiji.santafe.edu> X-Authentication-Warning: wijiji.santafe.edu: rms set sender to rms@gnu.org using -f From: Richard Stallman To: chet@nike.ins.cwru.edu Subject: Use of Readline Reply-to: rms@gnu.org I think Allbery's suggestion is a good one. So please add this text in a suitable place. Please don't put it in the GPL itself; that should be the same as the GPL everywhere else. Putting it in the README and/or the documentation would be a good idea. ====================================================================== Our position on the use of Readline through a shared-library linking mechanism is that there is no legal difference between shared-library linking and static linking--either kind of linking combines various modules into a single larger work. The conditions for using Readline in a larger work are stated in section 3 of the GNU GPL. readline-8.3/Makefile.in000644 000436 000024 00000046126 15017402472 015310 0ustar00chetstaff000000 000000 ## -*- text -*- ## # Master Makefile for the GNU readline library. # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This program 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 3 of the License, or # (at your option) any later version. # This program 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 this program. If not, see . RL_LIBRARY_VERSION = @LIBVERSION@ RL_LIBRARY_NAME = readline PACKAGE = @PACKAGE_NAME@ VERSION = @PACKAGE_VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ BUILD_DIR = @BUILD_DIR@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ install_sh = @install_sh@ CC = @CC@ RANLIB = @RANLIB@ AR = @AR@ ARFLAGS = @ARFLAGS@ RM = rm -f CP = cp MV = mv @SET_MAKE@ SHELL = @MAKE_SHELL@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ bindir = @bindir@ libdir = @libdir@ mandir = @mandir@ includedir = @includedir@ datadir = @datadir@ localedir = @localedir@ pkgconfigdir = ${libdir}/pkgconfig infodir = @infodir@ docdir = @docdir@ man3dir = $(mandir)/man3 # Support an alternate destination root directory for package building DESTDIR = # Programs to make tags files. ETAGS = etags CTAGS = ctags -w CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' @BRACKETED_PASTE@ CPPFLAGS = @CPPFLAGS@ STYLE_CFLAGS = @STYLE_CFLAGS@ DEFS = @DEFS@ @CROSS_COMPILE@ LOCAL_DEFS = @LOCAL_DEFS@ TERMCAP_LIB = @TERMCAP_LIB@ # For libraries which include headers from other libraries. INCLUDES = -I. -I$(srcdir) XCCFLAGS = $(ASAN_CFLAGS) $(DEFS) $(LOCAL_DEFS) $(INCLUDES) $(CPPFLAGS) CCFLAGS = $(XCCFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) $(STYLE_CFLAGS) # could add -Werror here GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \ -Wwrite-strings -Wstrict-prototypes \ -Wmissing-prototypes -Wno-implicit -pedantic GCC_LINT_CFLAGS = $(XCCFLAGS) $(GCC_LINT_FLAGS) @CFLAGS@ @LOCAL_CFLAGS@ ASAN_XCFLAGS = -fsanitize=address -fno-omit-frame-pointer ASAN_XLDFLAGS = -fsanitize=address UBSAN_XCFLAGS = -fsanitize=undefined -fsanitize-recover -fstack-protector UBSAN_XLDFLAGS = -fsanitize=undefined install_examples = @EXAMPLES_INSTALL_TARGET@ .c.o: ${RM} $@ $(CC) -c $(CCFLAGS) $< # The name of the main library target. LIBRARY_NAME = libreadline.a STATIC_LIBS = libreadline.a libhistory.a # The C code source files for this library. CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \ $(srcdir)/vi_mode.c $(srcdir)/parens.c $(srcdir)/rltty.c \ $(srcdir)/complete.c $(srcdir)/bind.c $(srcdir)/isearch.c \ $(srcdir)/display.c $(srcdir)/signals.c $(srcdir)/emacs_keymap.c \ $(srcdir)/vi_keymap.c $(srcdir)/util.c $(srcdir)/kill.c \ $(srcdir)/undo.c $(srcdir)/macro.c $(srcdir)/input.c \ $(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c $(srcdir)/xfree.c \ $(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \ $(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \ $(srcdir)/shell.c $(srcdir)/savestring.c $(srcdir)/tilde.c \ $(srcdir)/text.c $(srcdir)/misc.c $(srcdir)/compat.c \ $(srcdir)/mbutil.c $(srcdir)/gettimeofday.c # The header files for this library. HSOURCES = $(srcdir)/readline.h $(srcdir)/rldefs.h $(srcdir)/chardefs.h \ $(srcdir)/keymaps.h $(srcdir)/history.h $(srcdir)/histlib.h \ $(srcdir)/posixstat.h $(srcdir)/posixdir.h $(srcdir)/posixjmp.h \ $(srcdir)/tilde.h $(srcdir)/rlconf.h $(srcdir)/rltty.h \ $(srcdir)/ansi_stdlib.h $(srcdir)/tcap.h $(srcdir)/rlstdc.h \ $(srcdir)/xmalloc.h $(srcdir)/rlprivate.h $(srcdir)/rlshell.h \ $(srcdir)/rltypedefs.h $(srcdir)/rlmbutil.h \ $(srcdir)/colors.h $(srcdir)/parse-colors.h HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o mbutil.o TILDEOBJ = tilde.o COLORSOBJ = colors.o parse-colors.o OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \ rltty.o complete.o bind.o isearch.o display.o signals.o \ util.o kill.o undo.o macro.o input.o callback.o terminal.o \ text.o nls.o misc.o $(HISTOBJ) $(TILDEOBJ) $(COLORSOBJ) \ xmalloc.o xfree.o compat.o gettimeofday.o # The texinfo files which document this library. DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo DOCOBJECT = doc/readline.dvi DOCSUPPORT = doc/Makefile DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT) CREATED_MAKEFILES = Makefile doc/Makefile examples/Makefile shlib/Makefile CREATED_CONFIGURE = config.status config.h config.cache config.log \ stamp-config stamp-h readline.pc history.pc CREATED_TAGS = TAGS tags INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h \ rlstdc.h rlconf.h rltypedefs.h OTHER_DOCS = $(srcdir)/CHANGES $(srcdir)/INSTALL $(srcdir)/README OTHER_INSTALLED_DOCS = CHANGES INSTALL README ########################################################################## TARGETS = @STATIC_TARGET@ @SHARED_TARGET@ INSTALL_TARGETS = @STATIC_INSTALL_TARGET@ @SHARED_INSTALL_TARGET@ all: $(TARGETS) everything: all examples asan: ${MAKE} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' everything static: $(STATIC_LIBS) libreadline.a: $(OBJECTS) $(RM) $@ $(AR) $(ARFLAGS) $@ $(OBJECTS) -test -n "$(RANLIB)" && $(RANLIB) $@ libhistory.a: $(HISTOBJ) xmalloc.o xfree.o $(RM) $@ $(AR) $(ARFLAGS) $@ $(HISTOBJ) xmalloc.o xfree.o -test -n "$(RANLIB)" && $(RANLIB) $@ # Since tilde.c is shared between readline and bash, make sure we compile # it with the right flags when it's built as part of readline tilde.o: tilde.c rm -f $@ $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -c $(srcdir)/tilde.c readline: $(OBJECTS) readline.h rldefs.h chardefs.h ./libreadline.a $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -o $@ $(top_srcdir)/examples/rl.c ./libreadline.a ${TERMCAP_LIB} lint: force $(MAKE) CCFLAGS='$(GCC_LINT_CFLAGS)' static Makefile makefile: config.status $(srcdir)/Makefile.in CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status Makefiles makefiles: config.status $(srcdir)/Makefile.in @for mf in $(CREATED_MAKEFILES); do \ CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \ done config.status: configure $(SHELL) ./config.status --recheck config.h: stamp-h stamp-h: config.status $(srcdir)/config.h.in CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status echo > $@ #$(srcdir)/configure: $(srcdir)/configure.ac ## Comment-me-out in distribution # cd $(srcdir) && autoconf ## Comment-me-out in distribution shared: force -test -d shlib || mkdir shlib ( cd shlib ; ${MAKE} all ) documentation: force -test -d doc || mkdir doc -( cd doc && $(MAKE) ) examples: force -test -d examples || mkdir examples -(cd examples && ${MAKE} all ) force: install: $(INSTALL_TARGETS) install-headers: installdirs ${INSTALLED_HEADERS} for f in ${INSTALLED_HEADERS}; do \ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(includedir)/readline ; \ done uninstall-headers: -test -n "$(includedir)" && cd $(DESTDIR)$(includedir)/readline && \ ${RM} ${INSTALLED_HEADERS} maybe-uninstall-headers: uninstall-headers install-pc: installdirs -$(INSTALL_DATA) $(BUILD_DIR)/readline.pc $(DESTDIR)$(pkgconfigdir)/readline.pc -$(INSTALL_DATA) $(BUILD_DIR)/history.pc $(DESTDIR)$(pkgconfigdir)/history.pc uninstall-pc: -test -n "$(pkgconfigdir)" && cd $(DESTDIR)$(pkgconfigdir) && \ ${RM} readline.pc history.pc maybe-uninstall-pc: uninstall-pc install-static: installdirs $(STATIC_LIBS) install-headers install-doc ${install_examples} install-pc -$(MV) $(DESTDIR)$(libdir)/libreadline.a $(DESTDIR)$(libdir)/libreadline.old $(INSTALL_DATA) libreadline.a $(DESTDIR)$(libdir)/libreadline.a -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libreadline.a -$(MV) $(DESTDIR)$(libdir)/libhistory.a $(DESTDIR)$(libdir)/libhistory.old $(INSTALL_DATA) libhistory.a $(DESTDIR)$(libdir)/libhistory.a -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libhistory.a installdirs: $(srcdir)/support/mkinstalldirs -$(SHELL) $(srcdir)/support/mkinstalldirs $(DESTDIR)$(includedir) \ $(DESTDIR)$(includedir)/readline $(DESTDIR)$(libdir) \ $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir) $(DESTDIR)$(docdir) \ $(DESTDIR)$(pkgconfigdir) uninstall: uninstall-headers uninstall-doc uninstall-examples uninstall-pc -test -n "$(DESTDIR)$(libdir)" && cd $(DESTDIR)$(libdir) && \ ${RM} libreadline.a libreadline.old libhistory.a libhistory.old $(SHARED_LIBS) -( cd shlib; ${MAKE} DESTDIR=${DESTDIR} uninstall ) install-shared: installdirs install-headers shared install-doc install-pc ( cd shlib ; ${MAKE} DESTDIR=${DESTDIR} install ) uninstall-shared: maybe-uninstall-headers maybe-uninstall-pc -( cd shlib; ${MAKE} DESTDIR=${DESTDIR} uninstall ) install-examples: installdirs install-headers -( cd examples ; ${MAKE} DESTDIR=${DESTDIR} install ) uninstall-examples: maybe-uninstall-headers -( cd examples; ${MAKE} DESTDIR=${DESTDIR} uninstall ) install-doc: installdirs $(INSTALL_DATA) $(OTHER_DOCS) $(DESTDIR)$(docdir) -( if test -d doc ; then \ cd doc && \ ${MAKE} infodir=$(infodir) DESTDIR=${DESTDIR} install; \ fi ) uninstall-doc: -( cd $(DESTDIR)$(docdir) && ${RM} ${OTHER_INSTALLED_DOCS} ) -( if test -d doc ; then \ cd doc && \ ${MAKE} infodir=$(infodir) DESTDIR=${DESTDIR} uninstall; \ fi ) TAGS: force -( cd $(srcdir) && $(ETAGS) $(CSOURCES) $(HSOURCES) ) tags: force -( cd $(srcdir) && $(CTAGS) $(CSOURCES) $(HSOURCES) ) .PHONY: clean maintainer-clean distclean mostlyclean mostlyclean: force $(RM) $(OBJECTS) $(STATIC_LIBS) $(RM) readline readline.exe ( cd shlib && $(MAKE) $@ ) -( cd doc && $(MAKE) $@ ) -( cd examples && $(MAKE) $@ ) clean: mostlyclean ( cd shlib && $(MAKE) $@ ) -( cd doc && $(MAKE) $@ ) -( cd examples && $(MAKE) $@ ) distclean maintainer-clean: clean ( cd shlib && $(MAKE) $@ ) -( cd doc && $(MAKE) $@ ) -( cd examples && $(MAKE) $@ ) $(RM) Makefile $(RM) $(CREATED_CONFIGURE) $(RM) $(CREATED_TAGS) readline.pc: config.status $(srcdir)/readline.pc.in $(SHELL) config.status history.pc: config.status $(srcdir)/history.pc.in $(SHELL) config.status info dvi html pdf ps: -( cd doc && $(MAKE) $@ ) install-info: install-dvi: install-html: install-pdf: install-ps: check: installcheck: dist: force @echo Readline distributions are created using $(srcdir)/support/mkdist. @echo Here is a sample of the necessary commands: @echo bash $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r $(RL_LIBRARY_NAME) $(RL_LIBRARY_VERSION) @echo tar cf $(RL_LIBRARY_NAME)-${RL_LIBRARY_VERSION}.tar ${RL_LIBRARY_NAME}-$(RL_LIBRARY_VERSION) @echo gzip $(RL_LIBRARY_NAME)-$(RL_LIBRARY_VERSION).tar # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Dependencies bind.o: ansi_stdlib.h posixstat.h bind.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h bind.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h bind.o: history.h callback.o: rlconf.h callback.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h callback.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h compat.o: ${BUILD_DIR}/config.h compat.o: rlstdc.h rltypedefs.h complete.o: ansi_stdlib.h posixdir.h posixstat.h complete.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h complete.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h display.o: ansi_stdlib.h posixstat.h display.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h display.o: tcap.h display.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h display.o: history.h rlstdc.h funmap.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h funmap.o: rlconf.h ansi_stdlib.h rlstdc.h funmap.o: ${BUILD_DIR}/config.h histexpand.o: ansi_stdlib.h histexpand.o: history.h histlib.h rlstdc.h rltypedefs.h histexpand.o: ${BUILD_DIR}/config.h histfile.o: ansi_stdlib.h histfile.o: history.h histlib.h rlstdc.h rltypedefs.h histfile.o: ${BUILD_DIR}/config.h history.o: ansi_stdlib.h history.o: history.h histlib.h rlstdc.h rltypedefs.h history.o: ${BUILD_DIR}/config.h histsearch.o: ansi_stdlib.h histsearch.o: history.h histlib.h rlstdc.h rltypedefs.h histsearch.o: ${BUILD_DIR}/config.h input.o: ansi_stdlib.h input.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h input.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h isearch.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h isearch.o: ansi_stdlib.h history.h rlstdc.h keymaps.o: emacs_keymap.c vi_keymap.c keymaps.o: keymaps.h rltypedefs.h chardefs.h rlconf.h ansi_stdlib.h keymaps.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h keymaps.o: ${BUILD_DIR}/config.h rlstdc.h kill.o: ansi_stdlib.h kill.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h kill.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h kill.o: history.h rlstdc.h macro.o: ansi_stdlib.h macro.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h macro.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h macro.o: history.h rlstdc.h mbutil.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h mbutil.o: readline.h keymaps.h rltypedefs.h chardefs.h rlstdc.h misc.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h misc.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h misc.o: history.h rlstdc.h ansi_stdlib.h nls.o: ansi_stdlib.h nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h nls.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h nls.o: history.h rlstdc.h parens.o: rlconf.h parens.o: ${BUILD_DIR}/config.h parens.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h readline.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h readline.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h readline.o: history.h rlstdc.h readline.o: posixstat.h ansi_stdlib.h posixjmp.h rltty.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h rltty.o: rltty.h rltty.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h savestring.o: ${BUILD_DIR}/config.h search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h search.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h search.o: ansi_stdlib.h history.h rlstdc.h shell.o: ${BUILD_DIR}/config.h shell.o: ansi_stdlib.h signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h signals.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h signals.o: history.h rlstdc.h terminal.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h terminal.o: tcap.h terminal.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h terminal.o: history.h rlstdc.h text.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h text.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h text.o: history.h rlstdc.h ansi_stdlib.h tilde.o: ansi_stdlib.h tilde.o: ${BUILD_DIR}/config.h tilde.o: tilde.h undo.o: ansi_stdlib.h undo.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h undo.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h undo.o: history.h rlstdc.h util.o: posixjmp.h ansi_stdlib.h util.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h util.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h vi_mode.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h vi_mode.o: history.h ansi_stdlib.h rlstdc.h xfree.o: ${BUILD_DIR}/config.h xfree.o: ansi_stdlib.h xmalloc.o: ${BUILD_DIR}/config.h xmalloc.o: ansi_stdlib.h gettimeofday.o: ${BUILD_DIR}/config.h gettimeofday.o: posixtime.h colors.o: ${BUILD_DIR}/config.h colors.h colors.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h colors.o: rlconf.h colors.o: ansi_stdlib.h posixstat.h parse-colors.o: ${BUILD_DIR}/config.h colors.h parse-colors.h parse-colors.o: rldefs.h rlconf.h parse-colors.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h bind.o: rlshell.h histfile.o: rlshell.h nls.o: rlshell.h readline.o: rlshell.h shell.o: rlshell.h terminal.o: rlshell.h histexpand.o: rlshell.h bind.o: rlprivate.h callback.o: rlprivate.h complete.o: rlprivate.h display.o: rlprivate.h input.o: rlprivate.h isearch.o: rlprivate.h kill.o: rlprivate.h macro.o: rlprivate.h mbutil.o: rlprivate.h misc.o: rlprivate.h nls.o: rlprivate.h parens.o: rlprivate.h readline.o: rlprivate.h rltty.o: rlprivate.h search.o: rlprivate.h signals.o: rlprivate.h terminal.o: rlprivate.h text.o: rlprivate.h undo.o: rlprivate.h util.o: rlprivate.h vi_mode.o: rlprivate.h colors.o: rlprivate.h parse-colors.o: rlprivate.h bind.o: xmalloc.h callback.o: xmalloc.h complete.o: xmalloc.h display.o: xmalloc.h funmap.o: xmalloc.h histexpand.o: xmalloc.h histfile.o: xmalloc.h history.o: xmalloc.h input.o: xmalloc.h isearch.o: xmalloc.h keymaps.o: xmalloc.h kill.o: xmalloc.h macro.o: xmalloc.h mbutil.o: xmalloc.h misc.o: xmalloc.h readline.o: xmalloc.h savestring.o: xmalloc.h search.o: xmalloc.h shell.o: xmalloc.h terminal.o: xmalloc.h text.o: xmalloc.h tilde.o: xmalloc.h undo.o: xmalloc.h util.o: xmalloc.h vi_mode.o: xmalloc.h xfree.o: xmalloc.h xmalloc.o: xmalloc.h colors.o: xmalloc.h parse-colors.o: xmalloc.h complete.o: rlmbutil.h display.o: rlmbutil.h histexpand.o: rlmbutil.h input.o: rlmbutil.h isearch.o: rlmbutil.h mbutil.o: rlmbutil.h misc.o: rlmbutil.h readline.o: rlmbutil.h search.o: rlmbutil.h text.o: rlmbutil.h vi_mode.o: rlmbutil.h bind.o: $(srcdir)/bind.c callback.o: $(srcdir)/callback.c compat.o: $(srcdir)/compat.c complete.o: $(srcdir)/complete.c display.o: $(srcdir)/display.c funmap.o: $(srcdir)/funmap.c input.o: $(srcdir)/input.c isearch.o: $(srcdir)/isearch.c keymaps.o: $(srcdir)/keymaps.c $(srcdir)/emacs_keymap.c $(srcdir)/vi_keymap.c kill.o: $(srcdir)/kill.c macro.o: $(srcdir)/macro.c mbutil.o: $(srcdir)/mbutil.c misc.o: $(srcdir)/misc.c nls.o: $(srcdir)/nls.c parens.o: $(srcdir)/parens.c readline.o: $(srcdir)/readline.c rltty.o: $(srcdir)/rltty.c savestring.o: $(srcdir)/savestring.c search.o: $(srcdir)/search.c shell.o: $(srcdir)/shell.c signals.o: $(srcdir)/signals.c terminal.o: $(srcdir)/terminal.c text.o: $(srcdir)/text.c tilde.o: $(srcdir)/tilde.c undo.o: $(srcdir)/undo.c util.o: $(srcdir)/util.c vi_mode.o: $(srcdir)/vi_mode.c xfree.o: $(srcdir)/xfree.c xmalloc.o: $(srcdir)/xmalloc.c colors.o: $(srcdir)/parse-colors.c parse-colors.o: $(srcdir)/parse-colors.c histexpand.o: $(srcdir)/histexpand.c histfile.o: $(srcdir)/histfile.c history.o: $(srcdir)/history.c histsearch.o: $(srcdir)/histsearch.c bind.o: bind.c callback.o: callback.c compat.o: compat.c complete.o: complete.c display.o: display.c funmap.o: funmap.c input.o: input.c isearch.o: isearch.c keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c kill.o: kill.c macro.o: macro.c mbutil.o: mbutil.c misc.o: misc.c nls.o: nls.c parens.o: parens.c readline.o: readline.c rltty.o: rltty.c savestring.o: savestring.c search.o: search.c shell.o: shell.c signals.o: signals.c terminal.o: terminal.c text.o: text.c tilde.o: tilde.c undo.o: undo.c util.o: util.c vi_mode.o: vi_mode.c xfree.o: xfree.c xmalloc.o: xmalloc.c histexpand.o: histexpand.c histfile.o: histfile.c history.o: history.c histsearch.o: histsearch.c readline-8.3/rlprivate.h000644 000436 000024 00000050674 14762703146 015437 0ustar00chetstaff000000 000000 /* rlprivate.h -- functions and variables global to the readline library, but not intended for use by applications. */ /* Copyright (C) 1999-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RL_PRIVATE_H_) #define _RL_PRIVATE_H_ #include "rlconf.h" /* for VISIBLE_STATS */ #include "rlstdc.h" #include "posixjmp.h" /* defines procenv_t */ #include "rlmbutil.h" /* for HANDLE_MULTIBYTE */ /************************************************************************* * * * Convenience definitions * * * *************************************************************************/ #define EMACS_MODE() (rl_editing_mode == emacs_mode) #define VI_COMMAND_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) #define VI_INSERT_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_insertion_keymap) #define RL_CHECK_SIGNALS() \ do { \ if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \ } while (0) #define RL_SIG_RECEIVED() (_rl_caught_signal != 0) #define RL_SIGINT_RECEIVED() (_rl_caught_signal == SIGINT) #define RL_SIGWINCH_RECEIVED() (_rl_caught_signal == SIGWINCH) #define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay) #define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc) /************************************************************************* * * * Global structs undocumented in texinfo manual and not in readline.h * * * *************************************************************************/ /* search types */ #define RL_SEARCH_ISEARCH 0x01 /* incremental search */ #define RL_SEARCH_NSEARCH 0x02 /* non-incremental search */ #define RL_SEARCH_CSEARCH 0x04 /* intra-line char search */ /* search flags */ #define SF_REVERSE 0x01 #define SF_FOUND 0x02 #define SF_FAILED 0x04 #define SF_CHGKMAP 0x08 #define SF_PATTERN 0x10 #define SF_NOCASE 0x20 /* unused so far */ #define SF_FREEPMT 0x40 /* saved prompt separately, need to free it */ typedef struct __rl_search_context { int type; int sflags; char *search_string; int search_string_index; int search_string_size; char **lines; char *allocated_line; int hlen; int hindex; int save_point; int save_mark; int save_line; int last_found_line; char *prev_line_found; UNDO_LIST *save_undo_list; Keymap keymap; /* used when dispatching commands in search string */ Keymap okeymap; /* original keymap */ int history_pos; int direction; int prevc; int lastc; #if defined (HANDLE_MULTIBYTE) char mb[MB_LEN_MAX]; char pmb[MB_LEN_MAX]; #endif char *sline; int sline_len; int sline_index; char *search_terminators; } _rl_search_cxt; /* readstr flags */ #define READSTR_NOSPACE 0x01 /* don't insert space, use for completion */ #define READSTR_FREEPMT 0x02 /* called rl_save_prompt, need to free it ourselves */ typedef struct __rl_readstr_context { int flags; int prevc; int lastc; #if defined (HANDLE_MULTIBYTE) char mb[MB_LEN_MAX]; char pmb[MB_LEN_MAX]; #endif int save_point; int save_mark; int save_line; int (*compfunc) (struct __rl_readstr_context *, int); } _rl_readstr_cxt; struct _rl_cmd { Keymap map; int count; int key; rl_command_func_t *func; }; extern struct _rl_cmd _rl_pending_command; extern struct _rl_cmd *_rl_command_to_execute; /* Callback data for reading numeric arguments */ #define NUM_SAWMINUS 0x01 #define NUM_SAWDIGITS 0x02 #define NUM_READONE 0x04 typedef int _rl_arg_cxt; /* A context for reading key sequences longer than a single character when using the callback interface. */ #define KSEQ_DISPATCHED 0x01 #define KSEQ_SUBSEQ 0x02 #define KSEQ_RECURSIVE 0x04 typedef struct __rl_keyseq_context { int flags; int subseq_arg; int subseq_retval; /* XXX */ int okey; Keymap dmap; Keymap oldmap; struct __rl_keyseq_context *ocxt; int childval; } _rl_keyseq_cxt; /* vi-mode commands that use result of motion command to define boundaries */ #define VIM_DELETE 0x01 #define VIM_CHANGE 0x02 #define VIM_YANK 0x04 /* various states for vi-mode commands that use motion commands. reflects RL_READLINE_STATE */ #define VMSTATE_READ 0x01 #define VMSTATE_NUMARG 0x02 typedef struct __rl_vimotion_context { int op; int state; int flags; /* reserved */ _rl_arg_cxt ncxt; int numeric_arg; int start, end; /* rl_point, rl_end */ int key, motion; /* initial key, motion command */ } _rl_vimotion_cxt; /* fill in more as needed */ /* `Generic' callback data and functions */ typedef struct __rl_callback_generic_arg { int count; int i1, i2; /* add here as needed */ } _rl_callback_generic_arg; typedef int _rl_callback_func_t (_rl_callback_generic_arg *); typedef void _rl_sigcleanup_func_t (int, void *); /************************************************************************* * * * Global functions undocumented in texinfo manual and not in readline.h * * * *************************************************************************/ /************************************************************************* * * * Global variables undocumented in texinfo manual and not in readline.h * * * *************************************************************************/ /* complete.c */ extern int rl_complete_with_tilde_expansion; #if defined (VISIBLE_STATS) extern int rl_visible_stats; #endif /* VISIBLE_STATS */ #if defined (COLOR_SUPPORT) extern int _rl_colored_stats; extern int _rl_colored_completion_prefix; #endif /* readline.c */ extern int rl_line_buffer_len; extern int rl_arg_sign; extern int rl_visible_prompt_length; extern int rl_byte_oriented; /* display.c */ extern int rl_display_fixed; /* parens.c */ extern int rl_blink_matching_paren; /************************************************************************* * * * Global functions and variables unused and undocumented * * * *************************************************************************/ /* kill.c */ extern int rl_set_retained_kills (int); /* terminal.c */ extern void _rl_set_screen_size (int, int); /* undo.c */ extern int _rl_fix_last_undo_of_type (int, int, int); /* util.c */ extern char *_rl_savestring (const char *); /************************************************************************* * * * Functions and variables private to the readline library * * * *************************************************************************/ /* NOTE: Functions and variables prefixed with `_rl_' are pseudo-global: they are global so they can be shared between files in the readline library, but are not intended to be visible to readline callers. */ /************************************************************************* * Undocumented private functions * *************************************************************************/ #if defined (READLINE_CALLBACKS) /* readline.c */ extern void readline_internal_setup (void); extern void readline_common_teardown (void); extern char *readline_internal_teardown (int); extern int readline_internal_char (void); extern _rl_keyseq_cxt *_rl_keyseq_cxt_alloc (void); extern void _rl_keyseq_cxt_dispose (_rl_keyseq_cxt *); extern void _rl_keyseq_chain_dispose (void); extern int _rl_dispatch_callback (_rl_keyseq_cxt *); /* callback.c */ extern _rl_callback_generic_arg *_rl_callback_data_alloc (int); extern void _rl_callback_data_dispose (_rl_callback_generic_arg *); #endif /* READLINE_CALLBACKS */ /* bind.c */ extern char *_rl_untranslate_macro_value (char *, int); /* complete.c */ extern void _rl_reset_completion_state (void); extern char _rl_find_completion_word (int *, int *); extern void _rl_free_match_list (char **); /* display.c */ extern char *_rl_strip_prompt (char *); extern void _rl_reset_prompt (void); extern void _rl_move_vert (int); extern void _rl_save_prompt (void); extern void _rl_restore_prompt (void); extern char *_rl_make_prompt_for_search (int); extern void _rl_erase_at_end_of_line (int); extern void _rl_clear_to_eol (int); extern void _rl_clear_screen (int); extern void _rl_update_final (void); extern void _rl_optimize_redisplay (void); extern void _rl_redisplay_after_sigwinch (void); extern void _rl_clean_up_for_exit (void); extern void _rl_erase_entire_line (void); extern int _rl_current_display_line (void); extern void _rl_refresh_line (void); /* input.c */ extern int _rl_any_typein (void); extern int _rl_input_available (void); extern int _rl_nchars_available (void); extern int _rl_input_queued (int); extern void _rl_insert_typein (int); extern int _rl_unget_char (int); extern int _rl_pushed_input_available (void); extern int _rl_timeout_init (void); extern int _rl_timeout_handle_sigalrm (void); #if defined (_POSIXSELECT_H_) /* use as a sentinel for fd_set, struct timeval, and sigset_t definitions */ #if defined (__MINGW32__) /* still doesn't work; no alarm() so we provide a non-working stub. */ # define RL_TIMEOUT_USE_SIGALRM #elif defined (HAVE_SELECT) || defined (HAVE_PSELECT) # define RL_TIMEOUT_USE_SELECT #elif defined (_MSC_VER) /* can't use select/pselect or SIGALRM, so no timeouts */ #else # define RL_TIMEOUT_USE_SIGALRM #endif #endif #if defined (RL_TIMEOUT_USE_SELECT) extern int _rl_timeout_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *, const sigset_t *); #endif /* isearch.c */ extern _rl_search_cxt *_rl_scxt_alloc (int, int); extern void _rl_scxt_dispose (_rl_search_cxt *, int); extern int _rl_isearch_dispatch (_rl_search_cxt *, int); extern int _rl_isearch_callback (_rl_search_cxt *); extern int _rl_isearch_cleanup (_rl_search_cxt *, int); extern int _rl_search_getchar (_rl_search_cxt *); /* kill.c */ #ifndef BRACKETED_PASTE_DEFAULT # define BRACKETED_PASTE_DEFAULT 1 /* XXX - for now */ #endif #define BRACK_PASTE_PREF "\033[200~" #define BRACK_PASTE_SUFF "\033[201~" #define BRACK_PASTE_LAST '~' #define BRACK_PASTE_SLEN 6 #define BRACK_PASTE_INIT "\033[?2004h" #define BRACK_PASTE_FINI "\033[?2004l\r" extern int _rl_read_bracketed_paste_prefix (int); extern char *_rl_bracketed_text (size_t *); extern int _rl_bracketed_read_key (void); extern int _rl_bracketed_read_mbstring (char *, int); /* macro.c */ extern void _rl_with_macro_input (char *); extern int _rl_peek_macro_key (void); extern int _rl_next_macro_key (void); extern int _rl_prev_macro_key (void); extern void _rl_push_executing_macro (void); extern void _rl_pop_executing_macro (void); extern void _rl_add_macro_char (int); extern void _rl_kill_kbd_macro (void); /* misc.c */ extern int _rl_arg_overflow (void); extern void _rl_arg_init (void); extern int _rl_arg_getchar (void); extern int _rl_arg_callback (_rl_arg_cxt); extern void _rl_reset_argument (void); extern void _rl_start_using_history (void); #if defined (HIST_ENTRY_DEFINED) extern HIST_ENTRY *_rl_alloc_saved_line (void); extern void _rl_free_saved_line (HIST_ENTRY *); extern void _rl_unsave_line (HIST_ENTRY *); #endif extern int _rl_free_saved_history_line (void); extern int _rl_maybe_replace_line (int); extern void _rl_set_insert_mode (int, int); extern void _rl_revert_previous_lines (void); extern void _rl_revert_all_lines (void); /* nls.c */ extern char *_rl_init_locale (void); extern int _rl_init_eightbit (void); extern void _rl_reset_locale (void); /* parens.c */ extern void _rl_enable_paren_matching (int); /* readline.c */ extern void _rl_init_line_state (void); extern void _rl_set_the_line (void); extern int _rl_dispatch (int, Keymap); extern int _rl_dispatch_subseq (int, Keymap, int); extern void _rl_internal_char_cleanup (void); extern void _rl_init_executing_keyseq (void); extern void _rl_term_executing_keyseq (void); extern void _rl_end_executing_keyseq (void); extern void _rl_add_executing_keyseq (int); extern void _rl_del_executing_keyseq (void); extern rl_command_func_t *_rl_executing_func; /* rltty.c */ extern int _rl_disable_tty_signals (void); extern int _rl_restore_tty_signals (void); /* search.c */ extern int _rl_nsearch_callback (_rl_search_cxt *); extern int _rl_nsearch_cleanup (_rl_search_cxt *, int); extern int _rl_nsearch_sigcleanup (_rl_search_cxt *, int); extern void _rl_free_saved_search_line (void); /* signals.c */ extern void _rl_signal_handler (int); extern void _rl_block_sigint (void); extern void _rl_release_sigint (void); extern void _rl_block_sigwinch (void); extern void _rl_release_sigwinch (void); extern void _rl_state_sigcleanup (void); /* terminal.c */ extern void _rl_get_screen_size (int, int); extern void _rl_sigwinch_resize_terminal (void); extern int _rl_init_terminal_io (const char *); #ifdef _MINIX extern void _rl_output_character_function (int); #else extern int _rl_output_character_function (int); #endif extern void _rl_cr (void); extern void _rl_output_some_chars (const char *, int); extern int _rl_backspace (int); extern void _rl_enable_meta_key (void); extern void _rl_disable_meta_key (void); extern void _rl_control_keypad (int); extern void _rl_set_cursor (int, int); extern void _rl_standout_on (void); extern void _rl_standout_off (void); extern int _rl_reset_region_color (int, const char *); extern void _rl_region_color_on (void); extern void _rl_region_color_off (void); /* text.c */ extern void _rl_fix_point (int); extern void _rl_fix_mark (void); extern int _rl_replace_text (const char *, int, int); extern int _rl_forward_char_internal (int); extern int _rl_backward_char_internal (int); extern int _rl_insert_char (int, int); extern int _rl_overwrite_char (int, int); extern int _rl_overwrite_rubout (int, int); extern int _rl_rubout_char (int, int); #if defined (HANDLE_MULTIBYTE) extern int _rl_char_search_internal (int, int, char *, int); #else extern int _rl_char_search_internal (int, int, int); #endif extern int _rl_set_mark_at_pos (int); extern _rl_readstr_cxt *_rl_rscxt_alloc (int); extern void _rl_rscxt_dispose (_rl_readstr_cxt *, int); extern void _rl_free_saved_readstr_line (void); extern void _rl_unsave_saved_readstr_line (void); extern _rl_readstr_cxt *_rl_readstr_init (int, int); extern int _rl_readstr_cleanup (_rl_readstr_cxt *, int); extern int _rl_readstr_sigcleanup (_rl_readstr_cxt *, int); extern void _rl_readstr_restore (_rl_readstr_cxt *); extern int _rl_readstr_getchar (_rl_readstr_cxt *); extern int _rl_readstr_dispatch (_rl_readstr_cxt *, int); /* undo.c */ extern UNDO_LIST *_rl_copy_undo_entry (UNDO_LIST *); extern UNDO_LIST *_rl_copy_undo_list (UNDO_LIST *); extern void _rl_free_undo_list (UNDO_LIST *); /* util.c */ extern void _rl_ttymsg (const char *, ...) __attribute__((__format__ (printf, 1, 2))); extern void _rl_errmsg (const char *, ...) __attribute__((__format__ (printf, 1, 2))); extern void _rl_trace (const char *, ...) __attribute__((__format__ (printf, 1, 2))); extern void _rl_audit_tty (char *); extern int _rl_tropen (void); extern int _rl_abort_internal (void); extern int _rl_null_function (int, int); extern char *_rl_strindex (const char *, const char *); extern int _rl_strcaseeqn (const char *, const char *, size_t, int); extern int _rl_charcasecmp (int, int, int); extern int _rl_qsort_string_compare (char **, char **); extern int (_rl_uppercase_p) (int); extern int (_rl_lowercase_p) (int); extern int (_rl_pure_alphabetic) (int); extern int (_rl_digit_p) (int); extern int (_rl_to_lower) (int); extern int (_rl_to_upper) (int); extern int (_rl_digit_value) (int); /* vi_mode.c */ extern void _rl_vi_initialize_line (void); extern void _rl_vi_reset_last (void); extern void _rl_vi_set_last (int, int, int); extern int _rl_vi_textmod_command (int); extern int _rl_vi_motion_command (int); extern void _rl_vi_done_inserting (void); extern int _rl_vi_domove_callback (_rl_vimotion_cxt *); extern int _rl_vi_domove_motion_cleanup (int, _rl_vimotion_cxt *); /* Use HS_HISTORY_VERSION as the sentinel to see if we've included history.h and so can use HIST_ENTRY */ #if defined (HS_HISTORY_VERSION) extern void _rl_free_history_entry (HIST_ENTRY *); #endif /************************************************************************* * Undocumented private variables * *************************************************************************/ /* bind.c */ extern const char * const _rl_possible_control_prefixes[]; extern const char * const _rl_possible_meta_prefixes[]; /* callback.c */ extern _rl_callback_func_t *_rl_callback_func; extern _rl_callback_generic_arg *_rl_callback_data; /* complete.c */ extern int _rl_complete_show_all; extern int _rl_complete_show_unmodified; extern int _rl_complete_mark_directories; extern int _rl_complete_mark_symlink_dirs; extern int _rl_completion_prefix_display_length; extern int _rl_completion_columns; extern int _rl_print_completions_horizontally; extern int _rl_completion_case_fold; extern int _rl_completion_case_map; extern int _rl_match_hidden_files; extern int _rl_page_completions; extern int _rl_skip_completed_text; extern int _rl_menu_complete_prefix_first; /* display.c */ extern int _rl_vis_botlin; extern int _rl_last_c_pos; extern int _rl_last_v_pos; extern int _rl_suppress_redisplay; extern int _rl_want_redisplay; extern char *_rl_emacs_mode_str; extern int _rl_emacs_modestr_len; extern char *_rl_vi_ins_mode_str; extern int _rl_vi_ins_modestr_len; extern char *_rl_vi_cmd_mode_str; extern int _rl_vi_cmd_modestr_len; /* isearch.c */ extern char *_rl_isearch_terminators; extern _rl_search_cxt *_rl_iscxt; extern int _rl_search_case_fold; /* macro.c */ extern char *_rl_executing_macro; /* misc.c */ extern int _rl_history_preserve_point; extern int _rl_history_saved_point; extern _rl_arg_cxt _rl_argcxt; /* nls.c */ extern int _rl_utf8locale; /* readline.c */ extern int _rl_echoing_p; extern int _rl_horizontal_scroll_mode; extern int _rl_mark_modified_lines; extern int _rl_bell_preference; extern int _rl_meta_flag; extern int _rl_convert_meta_chars_to_ascii; extern int _rl_output_meta_chars; extern int _rl_bind_stty_chars; extern int _rl_revert_all_at_newline; extern int _rl_echo_control_chars; extern int _rl_show_mode_in_prompt; extern int _rl_enable_bracketed_paste; extern int _rl_enable_active_region; extern char *_rl_active_region_start_color; extern char *_rl_active_region_end_color; extern char *_rl_comment_begin; extern unsigned char _rl_parsing_conditionalized_out; extern Keymap _rl_keymap; extern FILE *_rl_in_stream; extern FILE *_rl_out_stream; extern int _rl_last_command_was_kill; extern int _rl_eof_char; extern procenv_t _rl_top_level; extern _rl_keyseq_cxt *_rl_kscxt; extern int _rl_keyseq_timeout; extern size_t _rl_executing_keyseq_size; extern rl_hook_func_t *_rl_internal_startup_hook; /* search.c */ extern _rl_search_cxt *_rl_nscxt; extern int _rl_history_search_pos; /* signals.c */ extern int volatile _rl_caught_signal; extern int volatile _rl_handling_signal; extern _rl_sigcleanup_func_t *_rl_sigcleanup; extern void *_rl_sigcleanarg; extern int _rl_echoctl; extern int _rl_intr_char; extern int _rl_quit_char; extern int _rl_susp_char; /* terminal.c */ extern int _rl_enable_keypad; extern int _rl_enable_meta; extern char *_rl_term_clreol; extern char *_rl_term_clrpag; extern char *_rl_term_clrscroll; extern char *_rl_term_im; extern char *_rl_term_ic; extern char *_rl_term_ei; extern char *_rl_term_DC; extern char *_rl_term_up; extern char *_rl_term_dc; extern char *_rl_term_cr; extern char *_rl_term_IC; extern char *_rl_term_forward_char; extern int _rl_screenheight; extern int _rl_screenwidth; extern int _rl_screenchars; extern int _rl_terminal_can_insert; extern int _rl_term_autowrap; /* text.c */ extern int _rl_optimize_typeahead; extern int _rl_keep_mark_active; extern _rl_readstr_cxt *_rl_rscxt; /* undo.c */ extern int _rl_doing_an_undo; extern int _rl_undo_group_level; /* vi_mode.c */ extern int _rl_vi_last_command; extern int _rl_vi_redoing; extern _rl_vimotion_cxt *_rl_vimvcxt; /* Use HS_HISTORY_VERSION as the sentinel to see if we've included history.h and so can use HIST_ENTRY */ #if defined (HS_HISTORY_VERSION) extern HIST_ENTRY *_rl_saved_line_for_history; #endif #endif /* _RL_PRIVATE_H_ */ readline-8.3/aclocal.m4000644 000436 000024 00000162217 15011665221 015100 0ustar00chetstaff000000 000000 dnl dnl Bash specific tests dnl dnl Some derived from PDKSH 5.1.3 autoconf tests dnl dnl Copyright (C) 1987-2025 Free Software Foundation, Inc. dnl dnl dnl Check for . This is separated out so that it can be dnl AC_REQUIREd. dnl dnl BASH_HEADER_INTTYPES AC_DEFUN(BASH_HEADER_INTTYPES, [ AC_CHECK_HEADERS(inttypes.h) ]) dnl dnl check for typedef'd symbols in header files, but allow the caller to dnl specify the include files to be checked in addition to the default dnl dnl This could be changed to use AC_COMPILE_IFELSE instead of AC_EGREP_CPP dnl dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND]) AC_DEFUN(BASH_CHECK_TYPE, [ AC_REQUIRE([BASH_HEADER_INTTYPES]) AC_MSG_CHECKING(for $1) AC_CACHE_VAL(bash_cv_type_$1, [AC_EGREP_CPP($1, [#include #if HAVE_STDLIB_H #include #endif #if HAVE_STDDEF_H #include #endif #if HAVE_INTTYPES_H #include #endif #if HAVE_STDINT_H #include #endif $2 ], bash_cv_type_$1=yes, bash_cv_type_$1=no)]) AC_MSG_RESULT($bash_cv_type_$1) ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then AC_DEFINE($4) fi]) if test $bash_cv_type_$1 = no; then AC_DEFINE_UNQUOTED($1, $3) fi ]) dnl dnl BASH_CHECK_DECL(FUNC) dnl dnl Check for a declaration of FUNC in stdlib.h and inttypes.h like dnl AC_CHECK_DECL dnl AC_DEFUN(BASH_CHECK_DECL, [ AC_REQUIRE([BASH_HEADER_INTTYPES]) AC_CHECK_DECLS([$1]) ]) AC_DEFUN(BASH_DECL_PRINTF, [AC_MSG_CHECKING(for declaration of printf in ) AC_CACHE_VAL(bash_cv_printf_declared, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include typedef int (*_bashfunc)(const char *, ...); #include int main() { _bashfunc pf; pf = (_bashfunc) printf; exit(pf == 0); } ]])], [bash_cv_printf_declared=yes], [bash_cv_printf_declared=no], [AC_MSG_WARN(cannot check printf declaration if cross compiling -- defaulting to yes) bash_cv_printf_declared=yes] )]) AC_MSG_RESULT($bash_cv_printf_declared) if test $bash_cv_printf_declared = yes; then AC_DEFINE(PRINTF_DECLARED) fi ]) AC_DEFUN(BASH_DECL_SBRK, [AC_MSG_CHECKING(for declaration of sbrk in ) AC_CACHE_VAL(bash_cv_sbrk_declared, [AC_EGREP_HEADER(sbrk, unistd.h, bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)]) AC_MSG_RESULT($bash_cv_sbrk_declared) if test $bash_cv_sbrk_declared = yes; then AC_DEFINE(SBRK_DECLARED) fi ]) dnl dnl Check for sys_siglist[] or _sys_siglist[] dnl AC_DEFUN(BASH_DECL_UNDER_SYS_SIGLIST, [AC_MSG_CHECKING([for _sys_siglist in signal.h or unistd.h]) AC_CACHE_VAL(bash_cv_decl_under_sys_siglist, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include #ifdef HAVE_UNISTD_H #include #endif]], [[ char *msg = _sys_siglist[2]; ]])], [bash_cv_decl_under_sys_siglist=yes], [bash_cv_decl_under_sys_siglist=no], [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)])])dnl AC_MSG_RESULT($bash_cv_decl_under_sys_siglist) if test $bash_cv_decl_under_sys_siglist = yes; then AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED) fi ]) AC_DEFUN(BASH_UNDER_SYS_SIGLIST, [AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST]) AC_MSG_CHECKING([for _sys_siglist in system C library]) AC_CACHE_VAL(bash_cv_under_sys_siglist, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #ifndef UNDER_SYS_SIGLIST_DECLARED extern char *_sys_siglist[]; #endif int main() { char *msg = (char *)_sys_siglist[2]; exit(msg == 0); } ]])], [bash_cv_under_sys_siglist=yes], [bash_cv_under_sys_siglist=no], [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no) bash_cv_under_sys_siglist=no] )]) AC_MSG_RESULT($bash_cv_under_sys_siglist) if test $bash_cv_under_sys_siglist = yes; then AC_DEFINE(HAVE_UNDER_SYS_SIGLIST) fi ]) dnl this defines HAVE_DECL_SYS_SIGLIST AC_DEFUN([BASH_DECL_SYS_SIGLIST], [AC_CHECK_DECLS([sys_siglist],,, [#include /* NetBSD declares sys_siglist in unistd.h. */ #ifdef HAVE_UNISTD_H # include #endif ]) ]) AC_DEFUN(BASH_SYS_SIGLIST, [AC_REQUIRE([BASH_DECL_SYS_SIGLIST]) AC_MSG_CHECKING([for sys_siglist in system C library]) AC_CACHE_VAL(bash_cv_sys_siglist, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #if !HAVE_DECL_SYS_SIGLIST extern char *sys_siglist[]; #endif int main() { char *msg = sys_siglist[2]; exit(msg == 0); } ]])], [bash_cv_sys_siglist=yes], [bash_cv_sys_siglist=no], [AC_MSG_WARN(cannot check for sys_siglist if cross compiling -- defaulting to no) bash_cv_sys_siglist=no] )]) AC_MSG_RESULT($bash_cv_sys_siglist) if test $bash_cv_sys_siglist = yes; then AC_DEFINE(HAVE_SYS_SIGLIST) fi ]) dnl Check for the various permutations of sys_siglist and make sure we dnl compile in siglist.o if they're not defined AC_DEFUN(BASH_CHECK_SYS_SIGLIST, [ AC_REQUIRE([BASH_SYS_SIGLIST]) AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST]) AC_REQUIRE([BASH_FUNC_STRSIGNAL]) if test "$bash_cv_sys_siglist" = no && test "$bash_cv_under_sys_siglist" = no && test "$bash_cv_have_strsignal" = no; then SIGLIST_O=siglist.o else SIGLIST_O= fi AC_SUBST([SIGLIST_O]) ]) dnl Check for sys_errlist[] and sys_nerr, check for declaration AC_DEFUN(BASH_SYS_ERRLIST, [AC_MSG_CHECKING([for sys_errlist and sys_nerr]) AC_CACHE_VAL(bash_cv_sys_errlist, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ extern char *sys_errlist[]; extern int sys_nerr; char *msg = sys_errlist[sys_nerr - 1]; ]] )], [bash_cv_sys_errlist=yes], [bash_cv_sys_errlist=no] )]) AC_MSG_RESULT($bash_cv_sys_errlist) if test $bash_cv_sys_errlist = yes; then AC_DEFINE(HAVE_SYS_ERRLIST) fi ]) dnl dnl Check if dup2() does not clear the close on exec flag dnl AC_DEFUN(BASH_FUNC_DUP2_CLOEXEC_CHECK, [AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag) AC_CACHE_VAL(bash_cv_dup2_broken, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ int main() { int fd1, fd2, fl; fd1 = open("/dev/null", 2); if (fcntl(fd1, 2, 1) < 0) exit(1); fd2 = dup2(fd1, 1); if (fd2 < 0) exit(2); fl = fcntl(fd2, 1, 0); /* fl will be 1 if dup2 did not reset the close-on-exec flag. */ exit(fl != 1); } ]])], [bash_cv_dup2_broken=yes], [bash_cv_dup2_broken=no], [AC_MSG_WARN(cannot check dup2 if cross compiling -- defaulting to no) bash_cv_dup2_broken=no] )]) AC_MSG_RESULT($bash_cv_dup2_broken) if test $bash_cv_dup2_broken = yes; then AC_DEFINE(DUP2_BROKEN) fi ]) AC_DEFUN(BASH_FUNC_STRSIGNAL, [AC_MSG_CHECKING([for the existence of strsignal]) AC_CACHE_VAL(bash_cv_have_strsignal, [AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#include #include #include ]], [[char *s = (char *)strsignal(2);]])], [bash_cv_have_strsignal=yes], [bash_cv_have_strsignal=no])]) AC_MSG_RESULT($bash_cv_have_strsignal) if test $bash_cv_have_strsignal = yes; then AC_DEFINE(HAVE_STRSIGNAL) fi ]) dnl Check to see if opendir will open non-directories (not a nice thing) AC_DEFUN(BASH_FUNC_OPENDIR_CHECK, [AC_REQUIRE([AC_HEADER_DIRENT])dnl AC_MSG_CHECKING(if opendir() opens non-directories) AC_CACHE_VAL(bash_cv_opendir_not_robust, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ #ifdef HAVE_SYS_STAT_H #include #endif #if defined(HAVE_DIRENT_H) # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif /* SYSNDIR */ # ifdef HAVE_SYS_DIR_H # include # endif /* SYSDIR */ # ifdef HAVE_NDIR_H # include # endif #endif /* HAVE_DIRENT_H */ #include int main() { DIR *dir; int fd, err; err = mkdir("bash-aclocal", 0700); if (err < 0) { perror("mkdir"); exit(1); } unlink("bash-aclocal/not_a_directory"); fd = open("bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666); write(fd, "\n", 1); close(fd); dir = opendir("bash-aclocal/not_a_directory"); unlink("bash-aclocal/not_a_directory"); rmdir("bash-aclocal"); exit (dir == 0); } ]])], [bash_cv_opendir_not_robust=yes], [bash_cv_opendir_not_robust=no], [AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no) bash_cv_opendir_not_robust=no] )]) AC_MSG_RESULT($bash_cv_opendir_not_robust) if test $bash_cv_opendir_not_robust = yes; then AC_DEFINE(OPENDIR_NOT_ROBUST) fi ]) dnl dnl A signed 16-bit integer quantity dnl AC_DEFUN(BASH_TYPE_BITS16_T, [ if test "$ac_cv_sizeof_short" = 2; then AC_CHECK_TYPE(bits16_t, short) elif test "$ac_cv_sizeof_char" = 2; then AC_CHECK_TYPE(bits16_t, char) else AC_CHECK_TYPE(bits16_t, short) fi ]) dnl dnl An unsigned 16-bit integer quantity dnl AC_DEFUN(BASH_TYPE_U_BITS16_T, [ if test "$ac_cv_sizeof_short" = 2; then AC_CHECK_TYPE(u_bits16_t, unsigned short) elif test "$ac_cv_sizeof_char" = 2; then AC_CHECK_TYPE(u_bits16_t, unsigned char) else AC_CHECK_TYPE(u_bits16_t, unsigned short) fi ]) dnl dnl A signed 32-bit integer quantity dnl AC_DEFUN(BASH_TYPE_BITS32_T, [ if test "$ac_cv_sizeof_int" = 4; then AC_CHECK_TYPE(bits32_t, int) elif test "$ac_cv_sizeof_long" = 4; then AC_CHECK_TYPE(bits32_t, long) else AC_CHECK_TYPE(bits32_t, int) fi ]) dnl dnl An unsigned 32-bit integer quantity dnl AC_DEFUN(BASH_TYPE_U_BITS32_T, [ if test "$ac_cv_sizeof_int" = 4; then AC_CHECK_TYPE(u_bits32_t, unsigned int) elif test "$ac_cv_sizeof_long" = 4; then AC_CHECK_TYPE(u_bits32_t, unsigned long) else AC_CHECK_TYPE(u_bits32_t, unsigned int) fi ]) AC_DEFUN(BASH_TYPE_PTRDIFF_T, [ if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then AC_CHECK_TYPE(ptrdiff_t, int) elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then AC_CHECK_TYPE(ptrdiff_t, long) elif test "$ac_cv_type_long_long" = yes && test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_char_p"; then AC_CHECK_TYPE(ptrdiff_t, [long long]) else AC_CHECK_TYPE(ptrdiff_t, int) fi ]) dnl dnl A signed 64-bit quantity dnl AC_DEFUN(BASH_TYPE_BITS64_T, [ if test "$ac_cv_sizeof_char_p" = 8; then AC_CHECK_TYPE(bits64_t, char *) elif test "$ac_cv_sizeof_double" = 8; then AC_CHECK_TYPE(bits64_t, double) elif test -n "$ac_cv_type_long_long" && test "$ac_cv_sizeof_long_long" = 8; then AC_CHECK_TYPE(bits64_t, [long long]) elif test "$ac_cv_sizeof_long" = 8; then AC_CHECK_TYPE(bits64_t, long) else AC_CHECK_TYPE(bits64_t, double) fi ]) AC_DEFUN(BASH_SIZEOF_RLIMIT, [AC_MSG_CHECKING(for size of struct rlimit fields) AC_CACHE_VAL(bash_cv_sizeof_rlim_cur, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #ifdef HAVE_SYS_TIME_H #include #endif #include #include int main() { struct rlimit r; exit(sizeof (r.rlim_cur)); } ]])], [bash_cv_sizeof_rlim_cur=$?], [bash_cv_sizeof_rlim_cur=$?], [AC_MSG_WARN(cannot check size of rlimit fields if cross compiling -- defaulting to long) bash_cv_sizeof_rlim_cur=$ac_cv_sizeof_long] )]) AC_MSG_RESULT($bash_cv_sizeof_rlim_cur) ]) AC_DEFUN(BASH_SIZEOF_QUAD_T, [AC_MSG_CHECKING(for size of quad_t) AC_CACHE_VAL(bash_cv_sizeof_quad_t, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #if HAVE_INTTYPES_H #include #endif #if HAVE_STDINT_H #include #endif int main() { #if HAVE_QUAD_T quad_t x; exit(sizeof (x)); #else exit (0); #endif } ]])], [bash_cv_sizeof_quad_t=$?], [bash_cv_sizeof_quad_t=$?], [AC_MSG_WARN(cannot check size of quad_t if cross compiling -- defaulting to 0) bash_cv_sizeof_quad_t=0] )]) AC_MSG_RESULT($bash_cv_sizeof_quad_t) ]) dnl dnl Type of struct rlimit fields: updated to check POSIX rlim_t and dnl if it doesn't exist determine the best guess based on sizeof(r.rlim_cur) dnl AC_DEFUN(BASH_TYPE_RLIMIT, [AC_MSG_CHECKING(for type of struct rlimit fields) AC_CACHE_VAL(bash_cv_type_rlimit, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[rlim_t xxx;]] )], [bash_cv_type_rlimit=rlim_t], [ BASH_SIZEOF_RLIMIT BASH_SIZEOF_QUAD_T if test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_long; then bash_cv_type_rlimit='unsigned long' elif test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_long_long; then bash_cv_type_rlimit='unsigned long long' elif test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_int; then bash_cv_type_rlimit='unsigned int' elif test $bash_cv_sizeof_rlim_cur = $bash_cv_sizeof_quad_t; then bash_cv_type_rlimit='quad_t' else bash_cv_type_rlimit='unsigned long' fi ] )]) AC_MSG_RESULT($bash_cv_type_rlimit) AC_DEFINE_UNQUOTED([RLIMTYPE], [$bash_cv_type_rlimit]) ]) AC_DEFUN(BASH_TYPE_SIG_ATOMIC_T, [AC_CACHE_CHECK([for sig_atomic_t in signal.h], ac_cv_have_sig_atomic_t, [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include ]], [[ sig_atomic_t x; ]])], [ac_cv_have_sig_atomic_t=yes],[ac_cv_have_sig_atomic_t=no])]) if test "$ac_cv_have_sig_atomic_t" = "no" then BASH_CHECK_TYPE(sig_atomic_t, [#include ], int) fi ]) AC_DEFUN(BASH_FUNC_LSTAT, [dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an dnl inline function in . AC_CACHE_CHECK([for lstat], bash_cv_func_lstat, [AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include #include ]], [[ lstat(".",(struct stat *)0); ]])], [bash_cv_func_lstat=yes],[bash_cv_func_lstat=no])]) if test $bash_cv_func_lstat = yes; then AC_DEFINE(HAVE_LSTAT) fi ]) AC_DEFUN(BASH_FUNC_INET_ATON, [ AC_CACHE_CHECK([for inet_aton], bash_cv_func_inet_aton, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include #include struct in_addr ap;]], [[ inet_aton("127.0.0.1", &ap); ]])], [bash_cv_func_inet_aton=yes], [bash_cv_func_inet_aton=no])]) if test $bash_cv_func_inet_aton = yes; then AC_DEFINE(HAVE_INET_ATON) else AC_LIBOBJ(inet_aton) fi ]) AC_DEFUN(BASH_FUNC_GETENV, [AC_MSG_CHECKING(to see if getenv can be redefined) AC_CACHE_VAL(bash_cv_getenv_redef, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #ifdef HAVE_UNISTD_H # include #endif #include char * getenv (const char *name) { return "42"; } int main() { char *s; /* The next allows this program to run, but does not allow bash to link when it redefines getenv. I'm not really interested in figuring out why not. */ #if defined (NeXT) exit(1); #endif s = getenv("ABCDE"); exit(s == 0); /* force optimizer to leave getenv in */ } ]])], [bash_cv_getenv_redef=yes], [bash_cv_getenv_redef=no], [AC_MSG_WARN(cannot check getenv redefinition if cross compiling -- defaulting to yes) bash_cv_getenv_redef=yes] )]) AC_MSG_RESULT($bash_cv_getenv_redef) if test $bash_cv_getenv_redef = yes; then AC_DEFINE(CAN_REDEFINE_GETENV) fi ]) # We should check for putenv before calling this AC_DEFUN(BASH_FUNC_STD_PUTENV, [ AC_CACHE_CHECK([for standard-conformant putenv declaration], bash_cv_std_putenv, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if HAVE_STDLIB_H #include #endif #if HAVE_STDDEF_H #include #endif extern int putenv (char *); ]], [[return (putenv == 0);]] )], [bash_cv_std_putenv=yes], [bash_cv_std_putenv=no] )]) if test $bash_cv_std_putenv = yes; then AC_DEFINE(HAVE_STD_PUTENV) fi ]) # We should check for unsetenv before calling this AC_DEFUN(BASH_FUNC_STD_UNSETENV, [ AC_CACHE_CHECK([for standard-conformant unsetenv declaration], bash_cv_std_unsetenv, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if HAVE_STDLIB_H #include #endif #if HAVE_STDDEF_H #include #endif extern int unsetenv (const char *); ]], [[return (unsetenv == 0);]] )], [bash_cv_std_unsetenv=yes], [bash_cv_std_unsetenv=no] )]) if test $bash_cv_std_unsetenv = yes; then AC_DEFINE(HAVE_STD_UNSETENV) fi ]) AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS, [AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize) AC_CACHE_VAL(bash_cv_ulimit_maxfds, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #ifdef HAVE_ULIMIT_H #include #endif int main() { long maxfds = ulimit(4, 0L); exit (maxfds == -1L); } ]])], [bash_cv_ulimit_maxfds=yes], [bash_cv_ulimit_maxfds=no], [AC_MSG_WARN(cannot check ulimit if cross compiling -- defaulting to no) bash_cv_ulimit_maxfds=no] )]) AC_MSG_RESULT($bash_cv_ulimit_maxfds) if test $bash_cv_ulimit_maxfds = yes; then AC_DEFINE(ULIMIT_MAXFDS) fi ]) AC_DEFUN(BASH_FUNC_GETCWD, [AC_MSG_CHECKING([if getcwd() will dynamically allocate memory with 0 size]) AC_CACHE_VAL(bash_cv_getcwd_malloc, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #ifdef HAVE_UNISTD_H #include #endif #include int main() { char *xpwd; xpwd = getcwd(0, 0); exit (xpwd == 0); } ]])], [bash_cv_getcwd_malloc=yes], [bash_cv_getcwd_malloc=no], [AC_MSG_WARN(cannot check whether getcwd allocates memory when cross-compiling -- defaulting to no) bash_cv_getcwd_malloc=no] )]) AC_MSG_RESULT($bash_cv_getcwd_malloc) if test $bash_cv_getcwd_malloc = no; then AC_DEFINE(GETCWD_BROKEN) AC_LIBOBJ(getcwd) fi ]) dnl dnl This needs BASH_CHECK_SOCKLIB, but since that's not called on every dnl system, we can't use AC_PREREQ. Only called if we need the socket library dnl AC_DEFUN(BASH_FUNC_GETHOSTBYNAME, [if test "X$bash_cv_have_gethostbyname" = "X"; then _bash_needmsg=yes else AC_MSG_CHECKING(for gethostbyname in socket library) _bash_needmsg= fi AC_CACHE_VAL(bash_cv_have_gethostbyname, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ struct hostent *hp; hp = gethostbyname("localhost"); ]] )], [bash_cv_have_gethostbyname=yes], [bash_cv_have_gethostbyname=no] )]) if test "X$_bash_needmsg" = Xyes; then AC_MSG_CHECKING(for gethostbyname in socket library) fi AC_MSG_RESULT($bash_cv_have_gethostbyname) if test "$bash_cv_have_gethostbyname" = yes; then AC_DEFINE(HAVE_GETHOSTBYNAME) fi ]) AC_DEFUN(BASH_FUNC_FNMATCH_EXTMATCH, [AC_MSG_CHECKING(if fnmatch does extended pattern matching with FNM_EXTMATCH) AC_CACHE_VAL(bash_cv_fnm_extmatch, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include int main() { #ifdef FNM_EXTMATCH return (0); #else return (1); #endif } ]])], [bash_cv_fnm_extmatch=yes], [bash_cv_fnm_extmatch=no], [AC_MSG_WARN(cannot check FNM_EXTMATCH if cross compiling -- defaulting to no) bash_cv_fnm_extmatch=no] )]) AC_MSG_RESULT($bash_cv_fnm_extmatch) if test $bash_cv_fnm_extmatch = yes; then AC_DEFINE(HAVE_LIBC_FNM_EXTMATCH) fi ]) AC_DEFUN(BASH_FUNC_POSIX_SETJMP, [AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp) AC_CACHE_VAL(bash_cv_func_sigsetjmp, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include int main() { #if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS) exit (1); #else int code; sigset_t set, oset, nset; sigjmp_buf xx; /* get the mask */ sigemptyset(&set); sigemptyset(&oset); sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset); /* paranoia -- make sure SIGINT is not blocked */ sigdelset (&oset, SIGINT); sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); /* save it */ code = sigsetjmp(xx, 1); if (code) { sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &nset); /* could compare nset to oset here, but we just look for SIGINT */ if (sigismember (&nset, SIGINT)) exit(1); exit(0); } /* change it so that SIGINT is blocked */ sigaddset(&set, SIGINT); sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL); /* and siglongjmp */ siglongjmp(xx, 10); exit(1); #endif } ]])], [bash_cv_func_sigsetjmp=present], [bash_cv_func_sigsetjmp=missing], [AC_MSG_WARN(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals) if test "$bash_cv_posix_signals" = "yes" ; then bash_cv_func_sigsetjmp=present else bash_cv_func_sigsetjmp=missing fi] )]) AC_MSG_RESULT($bash_cv_func_sigsetjmp) if test $bash_cv_func_sigsetjmp = present; then AC_DEFINE(HAVE_POSIX_SIGSETJMP) fi ]) AC_DEFUN(BASH_FUNC_STRCOLL, [AC_MSG_CHECKING(whether or not strcoll and strcmp differ) AC_CACHE_VAL(bash_cv_func_strcoll_broken, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #if defined (HAVE_LOCALE_H) #include #endif #include #include int main(int c, char **v) { int r1, r2; char *deflocale, *defcoll; #ifdef HAVE_SETLOCALE deflocale = setlocale(LC_ALL, ""); defcoll = setlocale(LC_COLLATE, ""); #endif #ifdef HAVE_STRCOLL /* These two values are taken from tests/glob-test. */ r1 = strcoll("abd", "aXd"); #else r1 = 0; #endif r2 = strcmp("abd", "aXd"); /* These two should both be greater than 0. It is permissible for a system to return different values, as long as the sign is the same. */ /* Exit with 1 (failure) if these two values are both > 0, since this tests whether strcoll(3) is broken with respect to strcmp(3) in the default locale. */ exit (r1 > 0 && r2 > 0); } ]])], [bash_cv_func_strcoll_broken=yes], [bash_cv_func_strcoll_broken=no], [AC_MSG_WARN(cannot check strcoll if cross compiling -- defaulting to no) bash_cv_func_strcoll_broken=no] )]) AC_MSG_RESULT($bash_cv_func_strcoll_broken) if test $bash_cv_func_strcoll_broken = yes; then AC_DEFINE(STRCOLL_BROKEN) fi ]) AC_DEFUN(BASH_FUNC_PRINTF_A_FORMAT, [AC_MSG_CHECKING([for printf floating point output in hex notation]) AC_CACHE_VAL(bash_cv_printf_a_format, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include int main() { double y = 0.0; char abuf[1024]; sprintf(abuf, "%A", y); exit(strchr(abuf, 'P') == (char *)0); } ]])], [bash_cv_printf_a_format=yes], [bash_cv_printf_a_format=no], [AC_MSG_WARN(cannot check printf if cross compiling -- defaulting to no) bash_cv_printf_a_format=no] )]) AC_MSG_RESULT($bash_cv_printf_a_format) if test $bash_cv_printf_a_format = yes; then AC_DEFINE(HAVE_PRINTF_A_FORMAT) fi ]) AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC, [ AC_CHECK_MEMBER(struct termios.c_line, AC_DEFINE(TERMIOS_LDISC), ,[ #include #include ]) ]) AC_DEFUN(BASH_STRUCT_TERMIO_LDISC, [ AC_CHECK_MEMBER(struct termio.c_line, AC_DEFINE(TERMIO_LDISC), ,[ #include #include ]) ]) dnl dnl Like AC_STRUCT_ST_BLOCKS, but doesn't muck with LIBOBJS dnl dnl sets bash_cv_struct_stat_st_blocks dnl dnl unused for now; we'll see how AC_CHECK_MEMBERS works dnl AC_DEFUN(BASH_STRUCT_ST_BLOCKS, [ AC_MSG_CHECKING([for struct stat.st_blocks]) AC_CACHE_VAL(bash_cv_struct_stat_st_blocks, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[ int main() { static struct stat a; if (a.st_blocks) return 0; return 0; } ]])], [bash_cv_struct_stat_st_blocks=yes], [bash_cv_struct_stat_st_blocks=no]) ]) AC_MSG_RESULT($bash_cv_struct_stat_st_blocks) if test "$bash_cv_struct_stat_st_blocks" = "yes"; then AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS) fi ]) AC_DEFUN([BASH_CHECK_LIB_TERMCAP], [ if test "X$bash_cv_termcap_lib" = "X"; then _bash_needmsg=yes else AC_MSG_CHECKING(which library has the termcap functions) _bash_needmsg= fi AC_CACHE_VAL(bash_cv_termcap_lib, [AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc, [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap, [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo, [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses, [AC_CHECK_LIB(ncursesw, tgetent, bash_cv_termcap_lib=libncursesw, [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses, bash_cv_termcap_lib=gnutermcap)])])])])])]) if test "X$_bash_needmsg" = "Xyes"; then AC_MSG_CHECKING(which library has the termcap functions) fi AC_MSG_RESULT(using $bash_cv_termcap_lib) if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then LDFLAGS="$LDFLAGS -L./lib/termcap" TERMCAP_LIB="./lib/termcap/libtermcap.a" TERMCAP_DEP="./lib/termcap/libtermcap.a" elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then TERMCAP_LIB=-ltermcap TERMCAP_DEP= elif test $bash_cv_termcap_lib = libtinfo; then TERMCAP_LIB=-ltinfo TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncursesw; then TERMCAP_LIB=-lncursesw TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncurses; then TERMCAP_LIB=-lncurses TERMCAP_DEP= elif test $bash_cv_termcap_lib = libcurses; then TERMCAP_LIB=-lcurses TERMCAP_DEP= elif test $bash_cv_termcap_lib = libc; then TERMCAP_LIB= TERMCAP_DEP= else # we assume ncurses is installed somewhere the linker can find it TERMCAP_LIB=-lncurses TERMCAP_DEP= fi ]) dnl dnl Check for the presence of getpeername in libsocket. dnl If libsocket is present, check for libnsl and add it to LIBS if dnl it's there, since most systems with libsocket require linking dnl with libnsl as well. This should only be called if getpeername dnl was not found in libc. dnl dnl NOTE: IF WE FIND GETPEERNAME, WE ASSUME THAT WE HAVE BIND/CONNECT dnl AS WELL dnl AC_DEFUN(BASH_CHECK_LIB_SOCKET, [ if test "X$bash_cv_have_socklib" = "X"; then _bash_needmsg= else AC_MSG_CHECKING(for socket library) _bash_needmsg=yes fi AC_CACHE_VAL(bash_cv_have_socklib, [AC_CHECK_LIB(socket, getpeername, bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)]) if test "X$_bash_needmsg" = Xyes; then AC_MSG_RESULT($bash_cv_have_socklib) _bash_needmsg= fi if test $bash_cv_have_socklib = yes; then # check for libnsl, add it to LIBS if present if test "X$bash_cv_have_libnsl" = "X"; then _bash_needmsg= else AC_MSG_CHECKING(for libnsl) _bash_needmsg=yes fi AC_CACHE_VAL(bash_cv_have_libnsl, [AC_CHECK_LIB(nsl, t_open, bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)]) if test "X$_bash_needmsg" = Xyes; then AC_MSG_RESULT($bash_cv_have_libnsl) _bash_needmsg= fi if test $bash_cv_have_libnsl = yes; then LIBS="-lsocket -lnsl $LIBS" else LIBS="-lsocket $LIBS" fi AC_DEFINE(HAVE_LIBSOCKET) AC_DEFINE(HAVE_GETPEERNAME) fi ]) dnl like _AC_STRUCT_DIRENT(MEMBER) but public AC_DEFUN(BASH_STRUCT_DIRENT, [ AC_REQUIRE([AC_HEADER_DIRENT]) AC_CHECK_MEMBERS(struct dirent.$1, [], [], [[ #include #include #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ #if defined(HAVE_DIRENT_H) # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif /* SYSNDIR */ # ifdef HAVE_SYS_DIR_H # include # endif /* SYSDIR */ # ifdef HAVE_NDIR_H # include # endif #endif /* HAVE_DIRENT_H */ ]]) ]) AC_DEFUN([BASH_STRUCT_DIRENT_D_INO], [BASH_STRUCT_DIRENT([d_ino])]) AC_DEFUN([BASH_STRUCT_DIRENT_D_FILENO], [BASH_STRUCT_DIRENT([d_fileno])]) AC_DEFUN([BASH_STRUCT_DIRENT_D_NAMLEN], [BASH_STRUCT_DIRENT([d_namlen])]) AC_DEFUN(BASH_STRUCT_TIMEVAL, [AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h) AC_CACHE_VAL(bash_cv_struct_timeval, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if HAVE_SYS_TIME_H #include #endif #include ]], [[static struct timeval x; x.tv_sec = x.tv_usec;]] )], bash_cv_struct_timeval=yes, bash_cv_struct_timeval=no) ]) AC_MSG_RESULT($bash_cv_struct_timeval) if test $bash_cv_struct_timeval = yes; then AC_DEFINE(HAVE_TIMEVAL) fi ]) AC_DEFUN(BASH_STRUCT_TIMEZONE, [AC_MSG_CHECKING(for struct timezone in sys/time.h and time.h) AC_CACHE_VAL(bash_cv_struct_timezone, [ AC_EGREP_HEADER(struct timezone, sys/time.h, bash_cv_struct_timezone=yes, AC_EGREP_HEADER(struct timezone, time.h, bash_cv_struct_timezone=yes, bash_cv_struct_timezone=no)) ]) AC_MSG_RESULT($bash_cv_struct_timezone) if test $bash_cv_struct_timezone = yes; then AC_DEFINE(HAVE_STRUCT_TIMEZONE) fi ]) AC_DEFUN(BASH_CHECK_WINSIZE_IOCTL, [AC_CACHE_VAL(bash_cv_struct_winsize_ioctl, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[ struct winsize x; if (sizeof (x) > 0) return (0); ]] )], [bash_cv_struct_winsize_ioctl=yes], [bash_cv_struct_winsize_ioctl=no]) ]) ]) AC_DEFUN(BASH_CHECK_WINSIZE_TERMIOS, [AC_CACHE_VAL(bash_cv_struct_winsize_termios, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[ struct winsize x; if (sizeof (x) > 0) return (0); ]] )], [bash_cv_struct_winsize_termios=yes], [bash_cv_struct_winsize_termios=no]) ]) ]) AC_DEFUN(BASH_STRUCT_WINSIZE, [AC_MSG_CHECKING(for struct winsize in sys/ioctl.h and termios.h) AC_CACHE_VAL(bash_cv_struct_winsize_header, [ BASH_CHECK_WINSIZE_IOCTL BASH_CHECK_WINSIZE_TERMIOS if test $bash_cv_struct_winsize_ioctl = yes; then bash_cv_struct_winsize_header=ioctl_h elif test $bash_cv_struct_winsize_termios = yes; then bash_cv_struct_winsize_header=termios_h else bash_cv_struct_winsize_header=other fi ]) if test $bash_cv_struct_winsize_header = ioctl_h; then AC_MSG_RESULT(sys/ioctl.h) AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL) elif test $bash_cv_struct_winsize_header = termios_h; then AC_MSG_RESULT(termios.h) AC_DEFINE(STRUCT_WINSIZE_IN_TERMIOS) else AC_MSG_RESULT(not found) fi ]) AC_DEFUN(BASH_HAVE_POSIX_SIGNALS, [AC_CACHE_VAL(bash_cv_posix_signals, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ sigset_t ss; struct sigaction sa; sigemptyset(&ss); sigsuspend(&ss); sigaction(SIGINT, &sa, (struct sigaction *) 0); sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0); ]] )], [bash_cv_posix_signals=yes], [bash_cv_posix_signals=no] )]) ]) AC_DEFUN(BASH_HAVE_BSD_SIGNALS, [AC_CACHE_VAL(bash_cv_bsd_signals, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ int mask = sigmask(SIGINT); sigsetmask(mask); sigblock(mask); sigpause(mask); ]] )], [bash_cv_bsd_signals=yes], [bash_cv_bsd_signals=no] )]) ]) AC_DEFUN(BASH_HAVE_SYSV_SIGNALS, [AC_CACHE_VAL(bash_cv_sysv_signals, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include void foo() { } ]], [[ int mask = sigmask(SIGINT); sigset(SIGINT, foo); sigrelse(SIGINT); sighold(SIGINT); sigpause(SIGINT); ]] )], [bash_cv_sysv_signals=yes], [bash_cv_sysv_signals=no] )]) ]) dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7) AC_DEFUN(BASH_SYS_SIGNAL_VINTAGE, [AC_MSG_CHECKING(for type of signal functions) AC_CACHE_VAL(bash_cv_signal_vintage, [ BASH_HAVE_POSIX_SIGNALS if test $bash_cv_posix_signals = yes; then bash_cv_signal_vintage=posix else BASH_HAVE_BSD_SIGNALS if test $bash_cv_bsd_signals = yes; then bash_cv_signal_vintage=4.2bsd else BASH_HAVE_SYSV_SIGNALS if test $bash_cv_sysv_signals = yes; then bash_cv_signal_vintage=svr3 else bash_cv_signal_vintage=v7 fi fi fi ]) AC_MSG_RESULT($bash_cv_signal_vintage) if test "$bash_cv_signal_vintage" = posix; then AC_DEFINE(HAVE_POSIX_SIGNALS) elif test "$bash_cv_signal_vintage" = "4.2bsd"; then AC_DEFINE(HAVE_BSD_SIGNALS) elif test "$bash_cv_signal_vintage" = svr3; then AC_DEFINE(HAVE_USG_SIGHOLD) fi ]) dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process. AC_DEFUN(BASH_SYS_PGRP_SYNC, [AC_REQUIRE([AC_FUNC_GETPGRP]) AC_MSG_CHECKING(whether pgrps need synchronization) AC_CACHE_VAL(bash_cv_pgrp_pipe, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_WAIT_H # include #endif #include int main() { # ifdef GETPGRP_VOID # define getpgID() getpgrp() # else # define getpgID() getpgrp(0) # define setpgid(x,y) setpgrp(x,y) # endif int pid1, pid2, fds[2]; int status; char ok; switch (pid1 = fork()) { case -1: exit(1); case 0: setpgid(0, getpid()); exit(0); } setpgid(pid1, pid1); sleep(2); /* let first child die */ if (pipe(fds) < 0) exit(2); switch (pid2 = fork()) { case -1: exit(3); case 0: setpgid(0, pid1); ok = getpgID() == pid1; write(fds[1], &ok, 1); exit(0); } setpgid(pid2, pid1); close(fds[1]); if (read(fds[0], &ok, 1) != 1) exit(4); wait(&status); wait(&status); exit(ok ? 0 : 5); } ]])], [bash_cv_pgrp_pipe=no], [bash_cv_pgrp_pipe=yes], [AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no) bash_cv_pgrp_pipe=no] )]) AC_MSG_RESULT($bash_cv_pgrp_pipe) if test $bash_cv_pgrp_pipe = yes; then AC_DEFINE(PGRP_PIPE) fi ]) AC_DEFUN(BASH_SYS_REINSTALL_SIGHANDLERS, [AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked]) AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #ifdef HAVE_UNISTD_H #include #endif #include typedef void sigfunc(int); volatile int nsigint; #ifdef HAVE_POSIX_SIGNALS sigfunc * set_signal_handler(int sig, sigfunc *handler) { struct sigaction act, oact; act.sa_handler = handler; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigemptyset (&oact.sa_mask); sigaction (sig, &act, &oact); return (oact.sa_handler); } #else #define set_signal_handler(s, h) signal(s, h) #endif void sigint(int s) { nsigint++; } int main() { nsigint = 0; set_signal_handler(SIGINT, sigint); kill((int)getpid(), SIGINT); kill((int)getpid(), SIGINT); exit(nsigint != 2); } ]])], [bash_cv_must_reinstall_sighandlers=no], [bash_cv_must_reinstall_sighandlers=yes], [AC_MSG_WARN(cannot check signal handling if cross compiling -- defaulting to no) bash_cv_must_reinstall_sighandlers=no] )]) AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers) if test $bash_cv_must_reinstall_sighandlers = yes; then AC_DEFINE(MUST_REINSTALL_SIGHANDLERS) fi ]) dnl check that some necessary job control definitions are present AC_DEFUN(BASH_SYS_JOB_CONTROL_MISSING, [AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE]) AC_MSG_CHECKING(for presence of necessary job control definitions) AC_CACHE_VAL(bash_cv_job_control_missing, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #ifdef HAVE_SYS_WAIT_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #include /* add more tests in here as appropriate */ /* signal type */ #if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS) #error #endif /* signals and tty control. */ #if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT) #error #endif /* process control */ #if !defined (WNOHANG) || !defined (WUNTRACED) #error #endif /* Posix systems have tcgetpgrp and waitpid. */ #if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP) #error #endif #if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID) #error #endif /* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */ #if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3) #error #endif ]], [[ int x; ]] )], [bash_cv_job_control_missing=present], [bash_cv_job_control_missing=missing] )]) AC_MSG_RESULT($bash_cv_job_control_missing) if test $bash_cv_job_control_missing = missing; then AC_DEFINE(JOB_CONTROL_MISSING) fi ]) dnl check whether named pipes are present dnl this requires a previous check for mkfifo, but that is awkward to specify AC_DEFUN(BASH_SYS_NAMED_PIPES, [AC_MSG_CHECKING(for presence of named pipes) AC_CACHE_VAL(bash_cv_sys_named_pipes, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include /* Add more tests in here as appropriate. */ int main() { int fd, err; #if defined (HAVE_MKFIFO) exit (0); #endif #if !defined (S_IFIFO) && (defined (_POSIX_VERSION) && !defined (S_ISFIFO)) exit (1); #endif #if defined (NeXT) exit (1); #endif err = mkdir("bash-aclocal", 0700); if (err < 0) { perror ("mkdir"); exit(1); } fd = mknod ("bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0); if (fd == -1) { rmdir ("bash-aclocal"); exit (1); } close(fd); unlink ("bash-aclocal/sh-np-autoconf"); rmdir ("bash-aclocal"); exit(0); } ]])], [bash_cv_sys_named_pipes=present], [bash_cv_sys_named_pipes=missing], [AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing) bash_cv_sys_named_pipes=missing] )]) AC_MSG_RESULT($bash_cv_sys_named_pipes) if test $bash_cv_sys_named_pipes = missing; then AC_DEFINE(NAMED_PIPES_MISSING) fi ]) AC_DEFUN(BASH_SYS_DEFAULT_MAIL_DIR, [AC_MSG_CHECKING(for default mail directory) AC_CACHE_VAL(bash_cv_mail_dir, [if test -d /var/mail; then bash_cv_mail_dir=/var/mail elif test -d /var/spool/mail; then bash_cv_mail_dir=/var/spool/mail elif test -d /usr/mail; then bash_cv_mail_dir=/usr/mail elif test -d /usr/spool/mail; then bash_cv_mail_dir=/usr/spool/mail else bash_cv_mail_dir=unknown fi ]) AC_MSG_RESULT($bash_cv_mail_dir) AC_DEFINE_UNQUOTED(DEFAULT_MAIL_DIRECTORY, "$bash_cv_mail_dir") ]) AC_DEFUN(BASH_HAVE_TIOCGWINSZ, [AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h) AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[int x = TIOCGWINSZ;]] )], [bash_cv_tiocgwinsz_in_ioctl=yes], [bash_cv_tiocgwinsz_in_ioctl=no] )]) AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl) if test $bash_cv_tiocgwinsz_in_ioctl = yes; then AC_DEFINE(GWINSZ_IN_SYS_IOCTL) fi ]) AC_DEFUN(BASH_HAVE_TIOCSTAT, [AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h) AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[int x = TIOCSTAT;]] )], [bash_cv_tiocstat_in_ioctl=yes], [bash_cv_tiocstat_in_ioctl=no] )]) AC_MSG_RESULT($bash_cv_tiocstat_in_ioctl) if test $bash_cv_tiocstat_in_ioctl = yes; then AC_DEFINE(TIOCSTAT_IN_SYS_IOCTL) fi ]) AC_DEFUN(BASH_HAVE_FIONREAD, [AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h) AC_CACHE_VAL(bash_cv_fionread_in_ioctl, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[int x = FIONREAD;]] )], [bash_cv_fionread_in_ioctl=yes], [bash_cv_fionread_in_ioctl=no] )]) AC_MSG_RESULT($bash_cv_fionread_in_ioctl) if test $bash_cv_fionread_in_ioctl = yes; then AC_DEFINE(FIONREAD_IN_SYS_IOCTL) fi ]) dnl dnl See if speed_t is declared in . Some versions of linux dnl require a definition of speed_t each time is included, dnl but you can only get speed_t if you include (on some dnl versions) or (on others). dnl AC_DEFUN(BASH_CHECK_SPEED_T, [AC_MSG_CHECKING(for speed_t in sys/types.h) AC_CACHE_VAL(bash_cv_speed_t_in_sys_types, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[speed_t x;]])], [bash_cv_speed_t_in_sys_types=yes],[bash_cv_speed_t_in_sys_types=no])]) AC_MSG_RESULT($bash_cv_speed_t_in_sys_types) if test $bash_cv_speed_t_in_sys_types = yes; then AC_DEFINE(SPEED_T_IN_SYS_TYPES) fi ]) AC_DEFUN(BASH_CHECK_GETPW_FUNCS, [AC_MSG_CHECKING(whether getpw functions are declared in pwd.h) AC_CACHE_VAL(bash_cv_getpw_declared, [AC_EGREP_CPP(getpwuid, [ #include #ifdef HAVE_UNISTD_H # include #endif #include ], bash_cv_getpw_declared=yes,bash_cv_getpw_declared=no)]) AC_MSG_RESULT($bash_cv_getpw_declared) if test $bash_cv_getpw_declared = yes; then AC_DEFINE(HAVE_GETPW_DECLS) fi ]) AC_DEFUN(BASH_CHECK_DEV_FD, [AC_MSG_CHECKING(whether /dev/fd is available) AC_CACHE_VAL(bash_cv_dev_fd, [bash_cv_dev_fd="" if test -d /dev/fd && (exec test -r /dev/fd/0 < /dev/null) ; then # check for systems like FreeBSD 5 that only provide /dev/fd/[012] if (exec test -r /dev/fd/3 3 #include ]], [[ int f; f = RLIMIT_DATA; ]] )], [bash_cv_rlimit=yes], [bash_cv_rlimit=no] )]) ]) dnl dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions dnl AC_DEFUN(BASH_CHECK_KERNEL_RLIMIT, [AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines]) AC_CACHE_VAL(bash_cv_kernel_rlimit, [BASH_CHECK_RLIMIT if test $bash_cv_rlimit = no; then AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #define _KERNEL #include #undef _KERNEL ]], [[ int f; f = RLIMIT_DATA; ]] )], [bash_cv_kernel_rlimit=yes], [bash_cv_kernel_rlimit=no] ) fi ]) AC_MSG_RESULT($bash_cv_kernel_rlimit) if test $bash_cv_kernel_rlimit = yes; then AC_DEFINE(RLIMIT_NEEDS_KERNEL) fi ]) dnl dnl Check for 64-bit off_t -- used for malloc alignment dnl dnl C does not allow duplicate case labels, so the compile will fail if dnl sizeof(off_t) is > 4. dnl AC_DEFUN(BASH_CHECK_OFF_T_64, [AC_CACHE_CHECK(for 64-bit off_t, bash_cv_off_t_64, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_UNISTD_H #include #endif #include ]],[[ switch (0) case 0: case (sizeof (off_t) <= 4):; ]] )], [bash_cv_off_t_64=no], [bash_cv_off_t_64=yes] )) if test $bash_cv_off_t_64 = yes; then AC_DEFINE(HAVE_OFF_T_64) fi]) AC_DEFUN(BASH_CHECK_RTSIGS, [AC_MSG_CHECKING(for unusable real-time signals due to large values) AC_CACHE_VAL(bash_cv_unusable_rtsigs, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #ifndef NSIG # define NSIG 64 #endif int main () { int n_sigs = 2 * NSIG; #ifdef SIGRTMIN int rtmin = SIGRTMIN; #else int rtmin = 0; #endif exit(rtmin < n_sigs); } ]])], [bash_cv_unusable_rtsigs=yes], [bash_cv_unusable_rtsigs=no], [AC_MSG_WARN(cannot check real-time signals if cross compiling -- defaulting to yes) bash_cv_unusable_rtsigs=yes] )]) AC_MSG_RESULT($bash_cv_unusable_rtsigs) if test $bash_cv_unusable_rtsigs = yes; then AC_DEFINE(UNUSABLE_RT_SIGNALS) fi ]) dnl dnl check for availability of multibyte characters and functions dnl dnl geez, I wish I didn't have to check for all of this stuff separately dnl AC_DEFUN(BASH_CHECK_MULTIBYTE, [ AC_CHECK_HEADERS(wctype.h) AC_CHECK_HEADERS(wchar.h) AC_CHECK_HEADERS(langinfo.h) AC_CHECK_HEADERS(mbstr.h) AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN)) AC_CHECK_FUNC(mbscasecmp, AC_DEFINE(HAVE_MBSCASECMP)) AC_CHECK_FUNC(mbscmp, AC_DEFINE(HAVE_MBSCMP)) AC_CHECK_FUNC(mbsncmp, AC_DEFINE(HAVE_MBSNCMP)) AC_CHECK_FUNC(mbsnrtowcs, AC_DEFINE(HAVE_MBSNRTOWCS)) AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS)) AC_REPLACE_FUNCS(mbschr) AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB)) AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL)) AC_CHECK_FUNC(wcsdup, AC_DEFINE(HAVE_WCSDUP)) AC_CHECK_FUNC(wcwidth, AC_DEFINE(HAVE_WCWIDTH)) AC_CHECK_FUNC(wctype, AC_DEFINE(HAVE_WCTYPE)) AC_CHECK_FUNC(wcsnrtombs, AC_DEFINE(HAVE_WCSNRTOMBS)) AC_REPLACE_FUNCS(wcswidth) dnl checks for both mbrtowc and mbstate_t AC_FUNC_MBRTOWC if test $ac_cv_func_mbrtowc = yes; then AC_DEFINE(HAVE_MBSTATE_T) fi AC_CHECK_FUNCS(iswlower iswupper towlower towupper iswctype) AC_REQUIRE([AM_LANGINFO_CODESET]) dnl check for wchar_t in AC_CACHE_CHECK([for wchar_t in wchar.h], bash_cv_type_wchar_t, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ [#include ]], [[ wchar_t foo; foo = 0; ]] )], [bash_cv_type_wchar_t=yes], [bash_cv_type_wchar_t=no] )]) if test $bash_cv_type_wchar_t = yes; then AC_DEFINE(HAVE_WCHAR_T, 1, [systems should define this type here]) fi dnl check for wctype_t in AC_CACHE_CHECK([for wctype_t in wctype.h], bash_cv_type_wctype_t, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ [#include ]], [[ wctype_t foo; foo = 0; ]] )], [bash_cv_type_wctype_t=yes], [bash_cv_type_wctype_t=no] )]) if test $bash_cv_type_wctype_t = yes; then AC_DEFINE(HAVE_WCTYPE_T, 1, [systems should define this type here]) fi dnl check for wint_t in AC_CACHE_CHECK([for wint_t in wctype.h], bash_cv_type_wint_t, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ [#include ]], [[ wint_t foo; foo = 0; ]] )], [bash_cv_type_wint_t=yes], [bash_cv_type_wint_t=no] )]) if test $bash_cv_type_wint_t = yes; then AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here]) fi dnl check for broken wcwidth AC_CACHE_CHECK([for wcwidth broken with unicode combining characters], bash_cv_wcwidth_broken, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #include #include int main(int c, char **v) { int w; setlocale(LC_ALL, "en_US.UTF-8"); w = wcwidth (0x0301); if (w != 0) exit (0); w = wcwidth (0x200b); exit (w == 0); /* exit 0 if wcwidth broken */ } ]])], [bash_cv_wcwidth_broken=yes], [bash_cv_wcwidth_broken=no], [bash_cv_wcwidth_broken=no] )]) if test "$bash_cv_wcwidth_broken" = yes; then AC_DEFINE(WCWIDTH_BROKEN, 1, [wcwidth is usually not broken]) fi if test "$am_cv_func_iconv" = yes; then OLDLIBS="$LIBS" LIBS="$LIBS $LIBINTL $LIBICONV" AC_CHECK_FUNCS(locale_charset) LIBS="$OLDLIBS" fi AC_CHECK_SIZEOF(wchar_t, 4) ]) dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB dnl require: dnl AC_PROG_CC dnl BASH_CHECK_LIB_TERMCAP AC_DEFUN([RL_LIB_READLINE_VERSION], [ AC_REQUIRE([BASH_CHECK_LIB_TERMCAP]) AC_MSG_CHECKING([version of installed readline library]) # What a pain in the ass this is. # save cpp and ld options _save_CFLAGS="$CFLAGS" _save_LDFLAGS="$LDFLAGS" _save_LIBS="$LIBS" # Don't set ac_cv_rl_prefix if the caller has already assigned a value. This # allows the caller to do something like $_rl_prefix=$withval if the user # specifies --with-installed-readline=PREFIX as an argument to configure if test -z "$ac_cv_rl_prefix"; then test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix} fi eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib LIBS="$LIBS -lreadline ${TERMCAP_LIB}" CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}" LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}" AC_CACHE_VAL(ac_cv_rl_version, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include extern int rl_gnu_readline_p; int main() { FILE *fp; fp = fopen("conftest.rlv", "w"); if (fp == 0) exit(1); if (rl_gnu_readline_p != 1) fprintf(fp, "0.0\n"); else fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0"); fclose(fp); exit(0); } ]])], [ac_cv_rl_version=`cat conftest.rlv`], [ac_cv_rl_version='0.0'], [ac_cv_rl_version='8.0'] )]) CFLAGS="$_save_CFLAGS" LDFLAGS="$_save_LDFLAGS" LIBS="$_save_LIBS" RL_MAJOR=0 RL_MINOR=0 # ( case "$ac_cv_rl_version" in 2*|3*|4*|5*|6*|7*|8*|9*) RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'` RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'` ;; esac # ((( case $RL_MAJOR in [[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;; [[0-9]]) _RL_MAJOR=0$RL_MAJOR ;; *) _RL_MAJOR=00 ;; esac # ((( case $RL_MINOR in [[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;; [[0-9]]) _RL_MINOR=0$RL_MINOR ;; *) _RL_MINOR=00 ;; esac RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}" # Readline versions greater than 4.2 have these defines in readline.h if test $ac_cv_rl_version = '0.0' ; then AC_MSG_WARN([Could not test version of installed readline library.]) elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then # set these for use by the caller RL_PREFIX=$ac_cv_rl_prefix RL_LIBDIR=$ac_cv_rl_libdir RL_INCLUDEDIR=$ac_cv_rl_includedir AC_MSG_RESULT($ac_cv_rl_version) else AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library]) AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library]) AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library]) AC_SUBST(RL_VERSION) AC_SUBST(RL_MAJOR) AC_SUBST(RL_MINOR) # set these for use by the caller RL_PREFIX=$ac_cv_rl_prefix RL_LIBDIR=$ac_cv_rl_libdir RL_INCLUDEDIR=$ac_cv_rl_includedir AC_MSG_RESULT($ac_cv_rl_version) fi ]) AC_DEFUN(BASH_CHECK_WCONTINUED, [ AC_MSG_CHECKING(whether WCONTINUED flag to waitpid is unavailable or available but broken) AC_CACHE_VAL(bash_cv_wcontinued_broken, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #include #include #ifndef errno extern int errno; #endif int main() { int x; x = waitpid(-1, (int *)0, WNOHANG|WCONTINUED); if (x == -1 && errno == EINVAL) exit (1); else exit (0); } ]])], [bash_cv_wcontinued_broken=no], [bash_cv_wcontinued_broken=yes], [AC_MSG_WARN(cannot check WCONTINUED if cross compiling -- defaulting to no) bash_cv_wcontinued_broken=no] )]) AC_MSG_RESULT($bash_cv_wcontinued_broken) if test $bash_cv_wcontinued_broken = yes; then AC_DEFINE(WCONTINUED_BROKEN) fi ]) dnl dnl tests added for bashdb dnl AC_DEFUN([AM_PATH_LISPDIR], [AC_ARG_WITH(lispdir, AS_HELP_STRING([--with-lispdir], [override the default lisp directory]), [ lispdir="$withval" AC_MSG_CHECKING([where .elc files should go]) AC_MSG_RESULT([$lispdir])], [ # If set to t, that means we are running in a shell under Emacs. # If you have an Emacs named "t", then use the full path. test x"$EMACS" = xt && EMACS= AC_CHECK_PROGS(EMACS, emacs xemacs, no) if test $EMACS != "no"; then if test x${lispdir+set} != xset; then AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [dnl am_cv_lispdir=`$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' | sed -n -e 's,/$,,' -e '/.*\/lib\/\(x\?emacs\/site-lisp\)$/{s,,${libdir}/\1,;p;q;}' -e '/.*\/share\/\(x\?emacs\/site-lisp\)$/{s,,${datadir}/\1,;p;q;}'` if test -z "$am_cv_lispdir"; then am_cv_lispdir='${datadir}/emacs/site-lisp' fi ]) lispdir="$am_cv_lispdir" fi fi ]) AC_SUBST(lispdir) ]) dnl From gnulib AC_DEFUN([BASH_FUNC_FPURGE], [ AC_CHECK_FUNCS_ONCE([fpurge]) AC_CHECK_FUNCS_ONCE([__fpurge]) AC_CHECK_DECLS([fpurge], , , [#include ]) ]) AC_DEFUN([BASH_FUNC_SNPRINTF], [ AC_CHECK_FUNCS_ONCE([snprintf]) if test X$ac_cv_func_snprintf = Xyes; then AC_CACHE_CHECK([for standard-conformant snprintf], [bash_cv_func_snprintf], [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include int main() { int n; n = snprintf (0, 0, "%s", "0123456"); exit(n != 7); } ]])], [bash_cv_func_snprintf=yes], [bash_cv_func_snprintf=no], [AC_MSG_WARN([cannot check standard snprintf if cross-compiling]) bash_cv_func_snprintf=yes] )]) if test $bash_cv_func_snprintf = no; then ac_cv_func_snprintf=no fi fi if test $ac_cv_func_snprintf = no; then AC_DEFINE(HAVE_SNPRINTF, 0, [Define if you have a standard-conformant snprintf function.]) fi ]) AC_DEFUN([BASH_FUNC_VSNPRINTF], [ AC_CHECK_FUNCS_ONCE([vsnprintf]) if test X$ac_cv_func_vsnprintf = Xyes; then AC_CACHE_CHECK([for standard-conformant vsnprintf], [bash_cv_func_vsnprintf], [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include static int foo(const char *fmt, ...) { va_list args; int n; va_start(args, fmt); n = vsnprintf(0, 0, fmt, args); va_end (args); return n; } int main() { int n; n = foo("%s", "0123456"); exit(n != 7); } ]])], [bash_cv_func_vsnprintf=yes], [bash_cv_func_vsnprintf=no], [AC_MSG_WARN([cannot check standard vsnprintf if cross-compiling]) bash_cv_func_vsnprintf=yes] )]) if test $bash_cv_func_vsnprintf = no; then ac_cv_func_vsnprintf=no fi fi if test $ac_cv_func_vsnprintf = no; then AC_DEFINE(HAVE_VSNPRINTF, 0, [Define if you have a standard-conformant vsnprintf function.]) fi ]) AC_DEFUN(BASH_STRUCT_WEXITSTATUS_OFFSET, [AC_MSG_CHECKING(for offset of exit status in return status from wait) AC_CACHE_VAL(bash_cv_wexitstatus_offset, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include int main(int c, char **v) { pid_t pid, p; int s, i, n; s = 0; pid = fork(); if (pid == 0) exit (42); /* wait for the process */ p = wait(&s); if (p != pid) exit (255); /* crack s */ for (i = 0; i < (sizeof(s) * 8); i++) { n = (s >> i) & 0xff; if (n == 42) exit (i); } exit (254); } ]])], [bash_cv_wexitstatus_offset=0], [bash_cv_wexitstatus_offset=$?], [AC_MSG_WARN(cannot check WEXITSTATUS offset if cross compiling -- defaulting to 0) bash_cv_wexitstatus_offset=0] )]) if test "$bash_cv_wexitstatus_offset" -gt 32 ; then AC_MSG_WARN(bad exit status from test program -- defaulting to 0) bash_cv_wexitstatus_offset=0 fi AC_MSG_RESULT($bash_cv_wexitstatus_offset) AC_DEFINE_UNQUOTED([WEXITSTATUS_OFFSET], [$bash_cv_wexitstatus_offset], [Offset of exit status in wait status word]) ]) AC_DEFUN([BASH_FUNC_SBRK], [ AC_MSG_CHECKING([for sbrk]) AC_CACHE_VAL(ac_cv_func_sbrk, [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ void *x = sbrk (4096); ]])], [ac_cv_func_sbrk=yes],[ac_cv_func_sbrk=no])]) AC_MSG_RESULT($ac_cv_func_sbrk) if test X$ac_cv_func_sbrk = Xyes; then AC_CACHE_CHECK([for working sbrk], [bash_cv_func_sbrk], [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include int main(int c, char **v) { void *x; x = sbrk (4096); exit ((x == (void *)-1) ? 1 : 0); } ]])],[bash_cv_func_sbrk=yes],[bash_cv_func_sbrk=no],[AC_MSG_WARN([cannot check working sbrk if cross-compiling]) bash_cv_func_sbrk=yes ])]) if test $bash_cv_func_sbrk = no; then ac_cv_func_sbrk=no fi fi if test $ac_cv_func_sbrk = yes; then AC_DEFINE(HAVE_SBRK, 1, [Define if you have a working sbrk function.]) fi ]) AC_DEFUN([BASH_FUNC_BRK], [ AC_MSG_CHECKING([for brk]) AC_CACHE_VAL(ac_cv_func_brk, [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[ void *x = brk (0); ]])], [ac_cv_func_brk=yes],[ac_cv_func_brk=no])]) AC_MSG_RESULT($ac_cv_func_brk) if test X$ac_cv_func_brk = Xyes; then AC_CACHE_CHECK([for working brk], [bash_cv_func_brk], [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include int main(int c, char **v) { void *x; x = brk (0); exit ((x == (void *)-1) ? 1 : 0); } ]])],[bash_cv_func_brk=yes],[bash_cv_func_brk=no],[AC_MSG_WARN([cannot check working brk if cross-compiling]) bash_cv_func_brk=yes ])]) if test $bash_cv_func_brk = no; then ac_cv_func_brk=no fi fi if test $ac_cv_func_brk = yes; then AC_DEFINE(HAVE_BRK, 1, [Define if you have a working brk function.]) fi ]) AC_DEFUN(BASH_FUNC_FNMATCH_EQUIV_FALLBACK, [AC_MSG_CHECKING(whether fnmatch can be used to check bracket equivalence classes) AC_CACHE_VAL(bash_cv_fnmatch_equiv_fallback, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #include #include char *pattern = "[[=a=]]"; /* char *string = "ä"; */ unsigned char string[4] = { '\xc3', '\xa4', '\0' }; int main (int c, char **v) { setlocale (LC_ALL, "en_US.UTF-8"); if (fnmatch (pattern, (const char *)string, 0) != FNM_NOMATCH) exit (0); exit (1); } ]])], [bash_cv_fnmatch_equiv_fallback=yes], [bash_cv_fnmatch_equiv_fallback=no], [AC_MSG_WARN(cannot check fnmatch if cross compiling -- defaulting to no) bash_cv_fnmatch_equiv_fallback=no] )]) AC_MSG_RESULT($bash_cv_fnmatch_equiv_fallback) if test "$bash_cv_fnmatch_equiv_fallback" = "yes" ; then bash_cv_fnmatch_equiv_value=1 else bash_cv_fnmatch_equiv_value=0 fi AC_DEFINE_UNQUOTED([FNMATCH_EQUIV_FALLBACK], [$bash_cv_fnmatch_equiv_value], [Whether fnmatch can be used for bracket equivalence classes]) ]) AC_DEFUN([BASH_FUNC_STRCHRNUL], [ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CACHE_CHECK([whether strchrnul works], [bash_cv_func_strchrnul_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM( [[ #include ]], [[const char *buf = "abc"; return strchrnul (buf, 'd') != buf + 3; ]] )], [bash_cv_func_strchrnul_works=yes], [bash_cv_func_strchrnul_works=no], [bash_cv_func_strchrnul_works=no] )]) if test "$bash_cv_func_strchrnul_works" = "no"; then AC_LIBOBJ([strchrnul]) fi ]) # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. #if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) #fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) readline-8.3/rlshell.h000644 000436 000024 00000002302 14002563205 015040 0ustar00chetstaff000000 000000 /* rlshell.h -- utility functions normally provided by bash. */ /* Copyright (C) 1999-2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RL_SHELL_H_) #define _RL_SHELL_H_ #include "rlstdc.h" extern char *sh_single_quote (char *); extern void sh_set_lines_and_columns (int, int); extern char *sh_get_env_value (const char *); extern char *sh_get_home_dir (void); extern int sh_unset_nodelay_mode (int); #endif /* _RL_SHELL_H_ */ readline-8.3/examples/000755 000436 000024 00000000000 15030514141 015040 5ustar00chetstaff000000 000000 readline-8.3/shlib/000755 000436 000024 00000000000 15030514137 014330 5ustar00chetstaff000000 000000 readline-8.3/histexpand.c000644 000436 000024 00000124752 15020315117 015551 0ustar00chetstaff000000 000000 /* histexpand.c -- history expansion. */ /* Copyright (C) 1989-2021,2023-2025 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. History 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 3 of the License, or (at your option) any later version. History 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 History. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_UNISTD_H) # ifndef _MINIX # include # endif # include #endif #include "rlmbutil.h" #include "history.h" #include "histlib.h" #include "chardefs.h" #include "rlshell.h" #include "xmalloc.h" #define HISTORY_WORD_DELIMITERS " \t\n;&()|<>" #define HISTORY_QUOTE_CHARACTERS "\"'`" #define HISTORY_EVENT_DELIMITERS "^$*%-" #define slashify_in_quotes "\\`\"$" #define fielddelim(c) (whitespace(c) || (c) == '\n') typedef int _hist_search_func_t (const char *, int); static char error_pointer; static char *subst_lhs; static char *subst_rhs; static int subst_lhs_len; static int subst_rhs_len; /* Characters that delimit history event specifications and separate event specifications from word designators. Static for now */ static char *history_event_delimiter_chars = HISTORY_EVENT_DELIMITERS; static char *get_history_word_specifier (const char *, char *, int *); static int history_tokenize_word (const char *, int); static char **history_tokenize_internal (const char *, int, int *); static char *history_substring (const char *, int, int); static void freewords (char **, int); static char *history_find_word (const char *, int); static char *quote_breaks (char *); /* Variables exported by this file. */ /* The character that represents the start of a history expansion request. This is usually `!'. */ char history_expansion_char = '!'; /* The character that invokes word substitution if found at the start of a line. This is usually `^'. */ char history_subst_char = '^'; /* During tokenization, if this character is seen as the first character of a word, then it, and all subsequent characters up to a newline are ignored. For a Bourne shell, this should be '#'. */ char history_comment_char = '\0'; /* The list of characters which inhibit the expansion of text if found immediately following history_expansion_char. */ char *history_no_expand_chars = " \t\n\r="; /* If set to a non-zero value, single quotes inhibit history expansion. The default is 0. */ int history_quotes_inhibit_expansion = 0; /* Used to split words by history_tokenize_internal. */ char *history_word_delimiters = HISTORY_WORD_DELIMITERS; /* If set, this points to a function that is called to verify that a particular history expansion should be performed. */ rl_linebuf_func_t *history_inhibit_expansion_function; int history_quoting_state = 0; /* **************************************************************** */ /* */ /* History Expansion */ /* */ /* **************************************************************** */ /* Hairy history expansion on text, not tokens. This is of general use, and thus belongs in this library. */ /* The last string searched for by a !?string? search. */ static char *search_string; /* The last string matched by a !?string? search. */ static char *search_match; /* Return the event specified at TEXT + OFFSET modifying OFFSET to point to after the event specifier. Just a pointer to the history line is returned; NULL is returned in the event of a bad specifier. You pass STRING with *INDEX equal to the history_expansion_char that begins this specification. DELIMITING_QUOTE is a character that is allowed to end the string specification for what to search for in addition to the normal characters `:', ` ', `\t', `\n', and sometimes `?'. So you might call this function like: line = get_history_event ("!echo:p", &index, 0); */ char * get_history_event (const char *string, int *caller_index, int delimiting_quote) { register int i; register char c; HIST_ENTRY *entry; int which, sign, local_index, substring_okay; int search_flags, old_offset; char *temp; /* The event can be specified in a number of ways. !! the previous command !n command line N !-n current command-line minus N !str the most recent command starting with STR !?str[?] the most recent command containing STR All values N are determined via HISTORY_BASE. */ i = *caller_index; if (string[i] != history_expansion_char) return ((char *)NULL); /* Move on to the specification. */ i++; sign = 1; substring_okay = 0; #define RETURN_ENTRY(e, w) \ return ((e = history_get (w)) ? e->line : (char *)NULL) /* Handle !! case. */ if (string[i] == history_expansion_char) { i++; which = history_base + (history_length - 1); *caller_index = i; RETURN_ENTRY (entry, which); } /* Hack case of numeric line specification. */ if (string[i] == '-' && _rl_digit_p (string[i+1])) { sign = -1; i++; } if (_rl_digit_p (string[i])) { /* Get the extent of the digits and compute the value. */ for (which = 0; _rl_digit_p (string[i]); i++) which = (which * 10) + _rl_digit_value (string[i]); *caller_index = i; if (sign < 0) which = (history_length + history_base) - which; RETURN_ENTRY (entry, which); } /* This must be something to search for. If the spec begins with a '?', then the string may be anywhere on the line. Otherwise, the string must be found at the start of a line. */ if (string[i] == '?') { substring_okay++; i++; } /* Only a closing `?' or a newline delimit a substring search string. */ for (local_index = i; c = string[i]; i++) { #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { int v; mbstate_t ps; memset (&ps, 0, sizeof (mbstate_t)); /* These produce warnings because we're passing a const string to a function that takes a non-const string. */ _rl_adjust_point ((char *)string, i, &ps); if ((v = _rl_get_char_len ((char *)string + i, &ps)) > 1) { i += v - 1; continue; } } #endif /* HANDLE_MULTIBYTE */ if ((!substring_okay && (whitespace (c) || c == ':' || (i > local_index && history_event_delimiter_chars && c == '-') || (c != '-' && history_event_delimiter_chars && member (c, history_event_delimiter_chars)) || (history_search_delimiter_chars && member (c, history_search_delimiter_chars)) || string[i] == delimiting_quote)) || string[i] == '\n' || (substring_okay && string[i] == '?')) break; } which = i - local_index; temp = (char *)xmalloc (1 + which); if (which) strncpy (temp, string + local_index, which); temp[which] = '\0'; if (substring_okay && string[i] == '?') i++; *caller_index = i; old_offset = history_offset; /* XXX */ #define FAIL_SEARCH() \ do { \ history_offset = old_offset; xfree (temp) ; return (char *)NULL; \ } while (0) /* If there is no search string, try to use the previous search string, if one exists. If not, fail immediately. */ if (*temp == '\0' && substring_okay) { if (search_string) { xfree (temp); temp = savestring (search_string); } else FAIL_SEARCH (); } search_flags = substring_okay ? NON_ANCHORED_SEARCH : ANCHORED_SEARCH; while (1) { local_index = _hs_history_search (temp, -1, -1, search_flags); if (local_index < 0) FAIL_SEARCH (); if (local_index == 0 || substring_okay) { entry = current_history (); if (entry == 0) FAIL_SEARCH (); history_offset = old_offset; /* XXX - was history_length */ /* If this was a substring search, then remember the string that we matched for word substitution. */ if (substring_okay) { FREE (search_string); search_string = temp; FREE (search_match); search_match = history_find_word (entry->line, local_index); } else xfree (temp); return (entry->line); } if (history_offset) history_offset--; else FAIL_SEARCH (); } #undef FAIL_SEARCH #undef RETURN_ENTRY } /* Function for extracting single-quoted strings. Used for inhibiting history expansion within single quotes. */ /* Extract the contents of STRING as if it is enclosed in single quotes. SINDEX, when passed in, is the offset of the character immediately following the opening single quote; on exit, SINDEX is left pointing to the closing single quote. FLAGS currently used to allow backslash to escape a single quote (e.g., for bash $'...'). */ static void hist_string_extract_single_quoted (const char *string, int *sindex, int flags) { register int i; for (i = *sindex; string[i] && string[i] != '\''; i++) { if ((flags & 1) && string[i] == '\\' && string[i+1]) i++; } *sindex = i; } static char * quote_breaks (char *s) { register char *p, *r; char *ret; int len = 3; for (p = s; p && *p; p++, len++) { if (*p == '\'') len += 3; else if (whitespace (*p) || *p == '\n') len += 2; } r = ret = (char *)xmalloc (len); *r++ = '\''; for (p = s; p && *p; ) { if (*p == '\'') { *r++ = '\''; *r++ = '\\'; *r++ = '\''; *r++ = '\''; p++; } else if (whitespace (*p) || *p == '\n') { *r++ = '\''; *r++ = *p++; *r++ = '\''; } else *r++ = *p++; } *r++ = '\''; *r = '\0'; return ret; } static char * hist_error(const char *s, int start, int current, int errtype) { char *temp; const char *emsg; int ll, elen; ll = current - start; switch (errtype) { case EVENT_NOT_FOUND: emsg = "event not found"; elen = 15; break; case BAD_WORD_SPEC: emsg = "bad word specifier"; elen = 18; break; case SUBST_FAILED: emsg = "substitution failed"; elen = 19; break; case BAD_MODIFIER: emsg = "unrecognized history modifier"; elen = 29; break; case NO_PREV_SUBST: emsg = "no previous substitution"; elen = 24; break; default: emsg = "unknown expansion error"; elen = 23; break; } temp = (char *)xmalloc (ll + elen + 3); if (s[start]) strncpy (temp, s + start, ll); else ll = 0; temp[ll] = ':'; temp[ll + 1] = ' '; strcpy (temp + ll + 2, emsg); return (temp); } /* Get a history substitution string from STR starting at *IPTR and return it. The length is returned in LENPTR. A backslash can quote the delimiter. If the string is the empty string, the previous pattern is used. If there is no previous pattern for the lhs, the last history search string is used. If IS_RHS is 1, we ignore empty strings and set the pattern to "" anyway. subst_lhs is not changed if the lhs is empty; subst_rhs is allowed to be set to the empty string. */ static char * get_subst_pattern (const char *str, int *iptr, int delimiter, int is_rhs, int *lenptr) { register int si, i, j, k; char *s; #if defined (HANDLE_MULTIBYTE) mbstate_t ps; #endif s = (char *)NULL; i = *iptr; #if defined (HANDLE_MULTIBYTE) memset (&ps, 0, sizeof (mbstate_t)); _rl_adjust_point (str, i, &ps); #endif for (si = i; str[si] && str[si] != delimiter; si++) #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { int v; if ((v = _rl_get_char_len (str + si, &ps)) > 1) si += v - 1; else if (str[si] == '\\' && str[si + 1] == delimiter) si++; } else #endif /* HANDLE_MULTIBYTE */ if (str[si] == '\\' && str[si + 1] == delimiter) si++; if (si > i || is_rhs) { s = (char *)xmalloc (si - i + 1); for (j = 0, k = i; k < si; j++, k++) { /* Remove a backslash quoting the search string delimiter. */ if (str[k] == '\\' && str[k + 1] == delimiter) k++; s[j] = str[k]; } s[j] = '\0'; if (lenptr) *lenptr = j; } i = si; if (str[i]) i++; *iptr = i; return s; } static void postproc_subst_rhs (void) { char *new; int i, j, new_size; new = (char *)xmalloc (new_size = subst_rhs_len + subst_lhs_len); for (i = j = 0; i < subst_rhs_len; i++) { if (subst_rhs[i] == '&') { if (j + subst_lhs_len >= new_size) new = (char *)xrealloc (new, (new_size = new_size * 2 + subst_lhs_len)); strcpy (new + j, subst_lhs); j += subst_lhs_len; } else { /* a single backslash protects the `&' from lhs interpolation */ if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&') i++; if (j + 1 >= new_size) new = (char *)xrealloc (new, new_size *= 2); new[j++] = subst_rhs[i]; } } new[j] = '\0'; xfree (subst_rhs); subst_rhs = new; subst_rhs_len = j; } /* Expand the bulk of a history specifier starting at STRING[START]. Returns 0 if everything is OK, -1 if an error occurred, and 1 if the `p' modifier was supplied and the caller should just print the returned string. Returns the new index into string in *END_INDEX_PTR, and the expanded specifier in *RET_STRING. */ /* need current line for !# */ static int history_expand_internal (const char *string, int start, int qc, int *end_index_ptr, char **ret_string, char *current_line) { int i, n, starting_index; int substitute_globally, subst_bywords, want_quotes, print_only; char *event, *temp, *result, *tstr, *t, c, *word_spec; size_t result_len; #if defined (HANDLE_MULTIBYTE) mbstate_t ps; memset (&ps, 0, sizeof (mbstate_t)); #endif result = (char *)xmalloc (result_len = 128); i = start; /* If it is followed by something that starts a word specifier, then !! is implied as the event specifier. */ if (member (string[i + 1], ":$*%^")) { char fake_s[3]; int fake_i = 0; i++; fake_s[0] = fake_s[1] = history_expansion_char; fake_s[2] = '\0'; event = get_history_event (fake_s, &fake_i, 0); } else if (string[i + 1] == '#') { i += 2; event = current_line; } else event = get_history_event (string, &i, qc); if (event == 0) { *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND); xfree (result); return (-1); } /* If a word specifier is found, then do what that requires. */ starting_index = i; word_spec = get_history_word_specifier (string, event, &i); /* There is no such thing as a `malformed word specifier'. However, it is possible for a specifier that has no match. In that case, we complain. */ if (word_spec == (char *)&error_pointer) { *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC); xfree (result); return (-1); } /* If no word specifier, than the thing of interest was the event. */ temp = word_spec ? savestring (word_spec) : savestring (event); FREE (word_spec); /* Perhaps there are other modifiers involved. Do what they say. */ want_quotes = substitute_globally = subst_bywords = print_only = 0; starting_index = i; while (string[i] == ':') { c = string[i + 1]; if (c == 'g' || c == 'a') { substitute_globally = 1; i++; c = string[i + 1]; } else if (c == 'G') { subst_bywords = 1; i++; c = string[i + 1]; } switch (c) { default: *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER); xfree (result); xfree (temp); return -1; case 'q': want_quotes = 'q'; break; case 'x': want_quotes = 'x'; break; /* :p means make this the last executed line. So we return an error state after adding this line to the history. */ case 'p': print_only = 1; break; /* :t discards all but the last part of the pathname. */ case 't': tstr = strrchr (temp, '/'); if (tstr) { tstr++; t = savestring (tstr); xfree (temp); temp = t; } break; /* :h discards the last part of a pathname. */ case 'h': tstr = strrchr (temp, '/'); if (tstr) *tstr = '\0'; break; /* :r discards the suffix. */ case 'r': tstr = strrchr (temp, '.'); if (tstr) *tstr = '\0'; break; /* :e discards everything but the suffix. */ case 'e': tstr = strrchr (temp, '.'); if (tstr) { t = savestring (tstr); xfree (temp); temp = t; } break; /* :s/this/that substitutes `that' for the first occurrence of `this'. :gs/this/that substitutes `that' for each occurrence of `this'. :& repeats the last substitution. :g& repeats the last substitution globally. */ case '&': case 's': { char *new_event; int delimiter, failed, si, l_temp, we; if (c == 's') { if (i + 2 < (int)strlen (string)) { #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { _rl_adjust_point (string, i + 2, &ps); if (_rl_get_char_len (string + i + 2, &ps) > 1) delimiter = 0; else delimiter = string[i + 2]; } else #endif /* HANDLE_MULTIBYTE */ delimiter = string[i + 2]; } else break; /* no search delimiter */ i += 3; t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len); /* An empty substitution lhs with no previous substitution uses the last search string as the lhs. */ if (t) { FREE (subst_lhs); subst_lhs = t; } else if (!subst_lhs) { if (search_string && *search_string) { subst_lhs = savestring (search_string); subst_lhs_len = strlen (subst_lhs); } else { subst_lhs = (char *) NULL; subst_lhs_len = 0; } } FREE (subst_rhs); subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len); /* If `&' appears in the rhs, it's supposed to be replaced with the lhs. */ if (subst_lhs && member ('&', subst_rhs)) postproc_subst_rhs (); } else i += 2; /* If there is no lhs, the substitution can't succeed. */ if (subst_lhs_len == 0) { *ret_string = hist_error (string, starting_index, i, NO_PREV_SUBST); xfree (result); xfree (temp); return -1; } l_temp = strlen (temp); /* Ignore impossible cases. */ if (subst_lhs_len > l_temp) { *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); xfree (result); xfree (temp); return (-1); } /* Find the first occurrence of THIS in TEMP. */ /* Substitute SUBST_RHS for SUBST_LHS in TEMP. There are three cases to consider: 1. substitute_globally == subst_bywords == 0 2. substitute_globally == 1 && subst_bywords == 0 3. substitute_globally == 0 && subst_bywords == 1 In the first case, we substitute for the first occurrence only. In the second case, we substitute for every occurrence. In the third case, we tokenize into words and substitute the first occurrence of each word. */ si = we = 0; for (failed = 1; (si + subst_lhs_len) <= l_temp; si++) { /* First skip whitespace and find word boundaries if we're past the end of the word boundary we found the last time. */ if (subst_bywords && si > we) { for (; temp[si] && fielddelim (temp[si]); si++) ; we = history_tokenize_word (temp, si); } if (STREQN (temp+si, subst_lhs, subst_lhs_len)) { int len = subst_rhs_len - subst_lhs_len + l_temp; new_event = (char *)xmalloc (1 + len); strncpy (new_event, temp, si); strncpy (new_event + si, subst_rhs, subst_rhs_len); strncpy (new_event + si + subst_rhs_len, temp + si + subst_lhs_len, l_temp - (si + subst_lhs_len)); new_event[len] = '\0'; xfree (temp); temp = new_event; failed = 0; if (substitute_globally) { /* Reported to fix a bug that causes it to skip every other match when matching a single character. Was si += subst_rhs_len previously. */ si += subst_rhs_len - 1; l_temp = strlen (temp); substitute_globally++; continue; } else if (subst_bywords) { si = we; l_temp = strlen (temp); continue; } else break; } } if (substitute_globally > 1) { substitute_globally = 0; continue; /* don't want to increment i */ } if (failed == 0) continue; /* don't want to increment i */ *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); xfree (result); xfree (temp); return (-1); } } i += 2; } /* Done with modifiers. */ /* Believe it or not, we have to back the pointer up by one. */ --i; if (want_quotes) { char *x; if (want_quotes == 'q') x = sh_single_quote (temp); else if (want_quotes == 'x') x = quote_breaks (temp); else x = savestring (temp); xfree (temp); temp = x; } n = strlen (temp); if (n >= result_len) result = (char *)xrealloc (result, n + 2); strcpy (result, temp); xfree (temp); *end_index_ptr = i; *ret_string = result; return (print_only); } /* Expand the string STRING, placing the result into OUTPUT, a pointer to a string. Returns: -1) If there was an error in expansion. 0) If no expansions took place (or, if the only change in the text was the de-slashifying of the history expansion character) 1) If expansions did take place 2) If the `p' modifier was given and the caller should print the result If an error occurred in expansion, then OUTPUT contains a descriptive error message. */ #define ADD_STRING(s) \ do \ { \ size_t sl = strlen (s); \ j += sl; \ if (j >= result_len) \ { \ while (j >= result_len) \ result_len += 128; \ result = (char *)xrealloc (result, result_len); \ } \ strcpy (result + j - sl, s); \ } \ while (0) #define ADD_CHAR(c) \ do \ { \ if ((j + 1) >= result_len) \ result = (char *)xrealloc (result, result_len += 64); \ result[j++] = c; \ result[j] = '\0'; \ } \ while (0) int history_expand (const char *hstring, char **output) { int j; int i, r, passc, cc, modified, eindex, only_printing, dquote, squote, flag; size_t l; char *string; /* The output string, and its length. */ size_t result_len; char *result; #if defined (HANDLE_MULTIBYTE) char mb[MB_LEN_MAX]; mbstate_t ps; #endif /* Used when adding the string. */ char *temp; if (output == 0) return 0; /* Setting the history expansion character to 0 inhibits all history expansion. */ if (history_expansion_char == 0) { *output = savestring (hstring); return (0); } /* Prepare the buffer for printing error messages. */ result = (char *)xmalloc (result_len = 256); result[0] = '\0'; only_printing = modified = 0; l = strlen (hstring); /* Grovel the string. Only backslash and single quotes can quote the history escape character. We also handle arg specifiers. */ /* Before we grovel forever, see if the history_expansion_char appears anywhere within the text. */ /* The quick substitution character is a history expansion all right. That is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact, that is the substitution that we do. */ if ((history_quoting_state != '\'' || history_quotes_inhibit_expansion == 0) && hstring[0] == history_subst_char) { string = (char *)xmalloc (l + 5); string[0] = string[1] = history_expansion_char; string[2] = ':'; string[3] = 's'; strcpy (string + 4, hstring); l += 4; } else { #if defined (HANDLE_MULTIBYTE) memset (&ps, 0, sizeof (mbstate_t)); #endif string = (char *)hstring; /* If not quick substitution, still maybe have to do expansion. */ /* `!' followed by one of the characters in history_no_expand_chars is NOT an expansion. */ dquote = history_quoting_state == '"'; squote = history_quoting_state == '\''; /* If the calling application tells us we are already reading a single-quoted string, consume the rest of the string right now and then go on. */ i = 0; if (squote && history_quotes_inhibit_expansion) { hist_string_extract_single_quoted (string, &i, 0); squote = 0; if (string[i]) i++; if (i >= l) i = l; } for ( ; string[i]; i++) { #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { int v; v = _rl_get_char_len (string + i, &ps); if (v > 1) { i += v - 1; continue; } } #endif /* HANDLE_MULTIBYTE */ cc = string[i + 1]; /* The history_comment_char, if set, appearing at the beginning of a word signifies that the rest of the line should not have history expansion performed on it. Skip the rest of the line and break out of the loop. */ if (history_comment_char && string[i] == history_comment_char && dquote == 0 && (i == 0 || member (string[i - 1], history_word_delimiters))) { while (string[i]) i++; break; } else if (string[i] == history_expansion_char) { if (cc == 0 || member (cc, history_no_expand_chars)) continue; /* DQUOTE won't be set unless history_quotes_inhibit_expansion is set. The idea here is to treat double-quoted strings the same as the word outside double quotes; in effect making the double quote part of history_no_expand_chars when DQUOTE is set. */ else if (dquote && cc == '"') continue; /* If the calling application has set history_inhibit_expansion_function to a function that checks for special cases that should not be history expanded, call the function and skip the expansion if it returns a non-zero value. */ else if (history_inhibit_expansion_function && (*history_inhibit_expansion_function) (string, i)) continue; else break; } /* Shell-like quoting: allow backslashes to quote double quotes inside a double-quoted string. */ else if (dquote && string[i] == '\\' && cc == '"') i++; /* More shell-like quoting: if we're paying attention to single quotes and letting them quote the history expansion character, then we need to pay attention to double quotes, because single quotes are not special inside double-quoted strings. */ else if (history_quotes_inhibit_expansion && string[i] == '"') { dquote = 1 - dquote; } else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'') { /* If this is bash, single quotes inhibit history expansion. */ flag = (i > 0 && string[i - 1] == '$'); i++; hist_string_extract_single_quoted (string, &i, flag); if (i >= l) { i = l; break; } } else if (history_quotes_inhibit_expansion && string[i] == '\\') { /* If this is bash, allow backslashes to quote single quotes and the history expansion character. */ if (cc == '\'' || cc == history_expansion_char) i++; } } if (string[i] != history_expansion_char) { xfree (result); *output = savestring (string); return (0); } } /* Extract and perform the substitution. */ dquote = history_quoting_state == '"'; squote = history_quoting_state == '\''; /* If the calling application tells us we are already reading a single-quoted string, consume the rest of the string right now and then go on. */ i = j = 0; if (squote && history_quotes_inhibit_expansion) { int c; hist_string_extract_single_quoted (string, &i, 0); squote = 0; for (c = 0; c < i; c++) ADD_CHAR (string[c]); if (string[i]) { ADD_CHAR (string[i]); i++; } } for (passc = 0; i < l; i++) { int qc, tchar = string[i]; if (passc) { passc = 0; ADD_CHAR (tchar); continue; } #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { int k, c; c = tchar; memset (mb, 0, sizeof (mb)); for (k = 0; k < MB_LEN_MAX && i < l; k++) { mb[k] = (char)c; memset (&ps, 0, sizeof (mbstate_t)); if (_rl_get_char_len (mb, &ps) == -2) c = string[++i]; else break; } if (strlen (mb) > 1) { ADD_STRING (mb); continue; } } #endif /* HANDLE_MULTIBYTE */ if (tchar == history_expansion_char) tchar = -3; else if (tchar == history_comment_char) tchar = -2; switch (tchar) { default: ADD_CHAR (string[i]); break; case '\\': passc++; ADD_CHAR (tchar); break; case '"': dquote = 1 - dquote; ADD_CHAR (tchar); break; case '\'': { /* If history_quotes_inhibit_expansion is set, single quotes inhibit history expansion, otherwise they are treated like double quotes. */ if (squote) { squote = 0; ADD_CHAR (tchar); } else if (dquote == 0 && history_quotes_inhibit_expansion) { int quote, slen; flag = (i > 0 && string[i - 1] == '$'); quote = i++; hist_string_extract_single_quoted (string, &i, flag); slen = i - quote + 2; temp = (char *)xmalloc (slen); strncpy (temp, string + quote, slen); temp[slen - 1] = '\0'; ADD_STRING (temp); xfree (temp); } else if (dquote == 0 && squote == 0 && history_quotes_inhibit_expansion == 0) { squote = 1; ADD_CHAR (string[i]); } else ADD_CHAR (string[i]); break; } case -2: /* history_comment_char */ if ((dquote == 0 || history_quotes_inhibit_expansion == 0) && (i == 0 || member (string[i - 1], history_word_delimiters))) { temp = (char *)xmalloc (l - i + 1); strcpy (temp, string + i); ADD_STRING (temp); xfree (temp); i = l; } else ADD_CHAR (string[i]); break; case -3: /* history_expansion_char */ cc = string[i + 1]; /* If the history_expansion_char is followed by one of the characters in history_no_expand_chars, then it is not a candidate for expansion of any kind. */ if (cc == 0 || member (cc, history_no_expand_chars) || (dquote && cc == '"')) { ADD_CHAR (string[i]); break; } /* If the application has defined a function to determine whether or not a history expansion should be performed, call it here. */ /* We check against what we've expanded so far, with the current expansion appended, because that seems to be what csh does. We decide to expand based on what we have to this point, not what we started with. */ if (history_inhibit_expansion_function) { int save_j, temp; save_j = j; ADD_CHAR (string[i]); ADD_CHAR (cc); temp = (*history_inhibit_expansion_function) (result, save_j); if (temp) { result[--j] = '\0'; /* `unadd' cc, leaving ADD_CHAR(string[i]) */ break; } else result[j = save_j] = '\0'; } #if defined (NO_BANG_HASH_MODIFIERS) /* There is something that is listed as a `word specifier' in csh documentation which means `the expanded text to this point'. That is not a word specifier, it is an event specifier. If we don't want to allow modifiers with `!#', just stick the current output line in again. */ if (cc == '#') { if (result) { temp = (char *)xmalloc (1 + strlen (result)); strcpy (temp, result); ADD_STRING (temp); xfree (temp); } i++; break; } #endif qc = squote ? '\'' : (dquote ? '"' : 0); r = history_expand_internal (string, i, qc, &eindex, &temp, result); if (r < 0) { *output = temp; xfree (result); if (string != hstring) xfree (string); return -1; } else { if (temp) { modified++; if (*temp) ADD_STRING (temp); xfree (temp); } only_printing += r == 1; i = eindex; } break; } } *output = result; if (string != hstring) xfree (string); if (only_printing) { #if 0 add_history (result); #endif return (2); } return (modified != 0); } /* Return a consed string which is the word specified in SPEC, and found in FROM. NULL is returned if there is no spec. The address of ERROR_POINTER is returned if the word specified cannot be found. CALLER_INDEX is the offset in SPEC to start looking; it is updated to point to just after the last character parsed. */ static char * get_history_word_specifier (const char *spec, char *from, int *caller_index) { register int i = *caller_index; int first, last; int expecting_word_spec = 0; char *result; /* The range of words to return doesn't exist yet. */ first = last = 0; result = (char *)NULL; /* If we found a colon, then this *must* be a word specification. If it isn't, then it is an error. */ if (spec[i] == ':') { i++; expecting_word_spec++; } /* Handle special cases first. */ /* `%' is the word last searched for. */ if (spec[i] == '%') { *caller_index = i + 1; return (search_match ? savestring (search_match) : savestring ("")); } /* `*' matches all of the arguments, but not the command. */ if (spec[i] == '*') { *caller_index = i + 1; result = history_arg_extract (1, '$', from); return (result ? result : savestring ("")); } /* `$' is last arg. */ if (spec[i] == '$') { *caller_index = i + 1; return (history_arg_extract ('$', '$', from)); } /* Try to get FIRST and LAST figured out. */ if (spec[i] == '-') first = 0; else if (spec[i] == '^') { first = 1; i++; } else if (_rl_digit_p (spec[i]) && expecting_word_spec) { for (first = 0; _rl_digit_p (spec[i]); i++) first = (first * 10) + _rl_digit_value (spec[i]); } else return ((char *)NULL); /* no valid `first' for word specifier */ if (spec[i] == '^' || spec[i] == '*') { last = (spec[i] == '^') ? 1 : '$'; /* x* abbreviates x-$ */ i++; } else if (spec[i] != '-') last = first; else { i++; if (_rl_digit_p (spec[i])) { for (last = 0; _rl_digit_p (spec[i]); i++) last = (last * 10) + _rl_digit_value (spec[i]); } else if (spec[i] == '$') { i++; last = '$'; } else if (spec[i] == '^') { i++; last = 1; } #if 0 else if (!spec[i] || spec[i] == ':') /* check against `:' because there could be a modifier separator */ #else else /* csh seems to allow anything to terminate the word spec here, leaving it as an abbreviation. */ #endif last = -1; /* x- abbreviates x-$ omitting word `$' */ } *caller_index = i; if (last >= first || last == '$' || last < 0) result = history_arg_extract (first, last, from); return (result ? result : (char *)&error_pointer); } /* Extract the args specified, starting at FIRST, and ending at LAST. The args are taken from STRING. If either FIRST or LAST is < 0, then make that arg count from the right (subtract from the number of tokens, so that FIRST = -1 means the next to last token on the line). If LAST is `$' the last arg from STRING is used. */ char * history_arg_extract (int first, int last, const char *string) { register int i, len; char *result; size_t size, offset; char **list; /* XXX - think about making history_tokenize return a struct array, each struct in array being a string and a length to avoid the calls to strlen below. */ if ((list = history_tokenize (string)) == NULL) return ((char *)NULL); for (len = 0; list[len]; len++) ; if (last < 0) last = len + last - 1; if (first < 0) first = len + first - 1; if (last == '$') last = len - 1; if (first == '$') first = len - 1; last++; if (first >= len || last > len || first < 0 || last < 0 || first > last) result = ((char *)NULL); else { for (size = 0, i = first; i < last; i++) size += strlen (list[i]) + 1; result = (char *)xmalloc (size + 1); result[0] = '\0'; for (i = first, offset = 0; i < last; i++) { strcpy (result + offset, list[i]); offset += strlen (list[i]); if (i + 1 < last) { result[offset++] = ' '; result[offset] = 0; } } } for (i = 0; i < len; i++) xfree (list[i]); xfree (list); return (result); } static int history_tokenize_word (const char *string, int ind) { int i, j; int delimiter, nestdelim, delimopen; i = ind; delimiter = nestdelim = 0; if (member (string[i], "()\n")) /* XXX - included \n, but why? been here forever */ { i++; return i; } if (ISDIGIT (string[i])) { j = i; while (string[j] && ISDIGIT (string[j])) j++; if (string[j] == 0) return (j); if (string[j] == '<' || string[j] == '>') i = j; /* digit sequence is a file descriptor */ else { i = j; goto get_word; /* digit sequence is part of a word */ } } if (member (string[i], "<>;&|")) { int peek = string[i + 1]; if (peek == string[i]) { if (peek == '<' && string[i + 2] == '-') i++; else if (peek == '<' && string[i + 2] == '<') i++; i += 2; return i; } else if (peek == '&' && (string[i] == '>' || string[i] == '<')) { j = i + 2; while (string[j] && ISDIGIT (string[j])) /* file descriptor */ j++; if (string[j] =='-') /* <&[digits]-, >&[digits]- */ j++; return j; } else if ((peek == '>' && string[i] == '&') || (peek == '|' && string[i] == '>')) { i += 2; return i; } /* XXX - process substitution -- separated out for later -- bash-4.2 */ else if (peek == '(' && (string[i] == '>' || string[i] == '<')) /*)*/ { i += 2; delimopen = '('; delimiter = ')'; nestdelim = 1; goto get_word; } i++; return i; } get_word: /* Get word from string + i; */ if (delimiter == 0 && member (string[i], HISTORY_QUOTE_CHARACTERS)) delimiter = string[i++]; for (; string[i]; i++) { if (string[i] == '\\' && string[i + 1] == '\n') { i++; continue; } if (string[i] == '\\' && delimiter != '\'' && (delimiter != '"' || member (string[i], slashify_in_quotes))) { i++; if (string[i] == 0) break; continue; } /* delimiter must be set and set to something other than a quote if nestdelim is set, so these tests are safe. */ if (nestdelim && string[i] == delimopen) { nestdelim++; continue; } if (nestdelim && string[i] == delimiter) { nestdelim--; if (nestdelim == 0) delimiter = 0; continue; } if (delimiter && string[i] == delimiter) { delimiter = 0; continue; } /* Command and process substitution; shell extended globbing patterns */ if (nestdelim == 0 && delimiter == 0 && member (string[i], "<>$!@?+*") && string[i+1] == '(') /*)*/ { i++; /* string[i] == '(' */ /*)*/ if (string[i+1] == 0) break; /* could just return i here */ delimopen = '('; delimiter = ')'; nestdelim = 1; continue; } if (delimiter == 0 && (member (string[i], history_word_delimiters))) break; if (delimiter == 0 && member (string[i], HISTORY_QUOTE_CHARACTERS)) delimiter = string[i]; } return i; } static char * history_substring (const char *string, int start, int end) { register int len; register char *result; len = end - start; result = (char *)xmalloc (len + 1); strncpy (result, string + start, len); result[len] = '\0'; return result; } /* Parse STRING into tokens and return an array of strings. If WIND is not -1 and INDP is not null, we also want the word surrounding index WIND. The position in the returned array of strings is returned in *INDP. */ static char ** history_tokenize_internal (const char *string, int wind, int *indp) { char **result; int i, start, result_index; size_t size; /* If we're searching for a string that's not part of a word (e.g., " "), make sure we set *INDP to a reasonable value. */ if (indp && wind != -1) *indp = -1; /* Get a token, and stuff it into RESULT. The tokens are split exactly where the shell would split them. */ for (i = result_index = 0, size = 0, result = (char **)NULL; string[i]; ) { /* Skip leading whitespace. */ for (; string[i] && fielddelim (string[i]); i++) ; if (string[i] == 0 || string[i] == history_comment_char) return (result); start = i; i = history_tokenize_word (string, start); /* If we have a non-whitespace delimiter character (which would not be skipped by the loop above), use it and any adjacent delimiters to make a separate field. Any adjacent white space will be skipped the next time through the loop. */ if (i == start && history_word_delimiters) { i++; while (string[i] && member (string[i], history_word_delimiters)) i++; } /* If we are looking for the word in which the character at a particular index falls, remember it. */ if (indp && wind != -1 && wind >= start && wind < i) *indp = result_index; if (result_index + 2 >= size) result = (char **)xrealloc (result, ((size += 10) * sizeof (char *))); result[result_index++] = history_substring (string, start, i); result[result_index] = (char *)NULL; } return (result); } /* Return an array of tokens, much as the shell might. The tokens are parsed out of STRING. */ char ** history_tokenize (const char *string) { return (history_tokenize_internal (string, -1, (int *)NULL)); } /* Free members of WORDS from START to an empty string */ static void freewords (char **words, int start) { register int i; for (i = start; words[i]; i++) xfree (words[i]); } /* Find and return the word which contains the character at index IND in the history line LINE. Used to save the word matched by the last history !?string? search. */ static char * history_find_word (const char *line, int ind) { char **words, *s; int i, wind; words = history_tokenize_internal (line, ind, &wind); if (wind == -1 || words == 0) { if (words) freewords (words, 0); FREE (words); return ((char *)NULL); } s = words[wind]; for (i = 0; i < wind; i++) xfree (words[i]); freewords (words, wind + 1); xfree (words); return s; } readline-8.3/compat.c000644 000436 000024 00000004375 14002575617 014677 0ustar00chetstaff000000 000000 /* compat.c -- backwards compatibility functions. */ /* Copyright (C) 2000-2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include "rlstdc.h" #include "rltypedefs.h" extern void rl_free_undo_list (void); extern int rl_maybe_save_line (void); extern int rl_maybe_unsave_line (void); extern int rl_maybe_replace_line (void); extern int rl_crlf (void); extern int rl_ding (void); extern int rl_alphabetic (int); extern char **rl_completion_matches (const char *, rl_compentry_func_t *); extern char *rl_username_completion_function (const char *, int); extern char *rl_filename_completion_function (const char *, int); /* Provide backwards-compatible entry points for old function names. */ void free_undo_list (void) { rl_free_undo_list (); } int maybe_replace_line (void) { return rl_maybe_replace_line (); } int maybe_save_line (void) { return rl_maybe_save_line (); } int maybe_unsave_line (void) { return rl_maybe_unsave_line (); } int ding (void) { return rl_ding (); } int crlf (void) { return rl_crlf (); } int alphabetic (int c) { return rl_alphabetic (c); } char ** completion_matches (const char *s, rl_compentry_func_t *f) { return rl_completion_matches (s, f); } char * username_completion_function (const char *s, int i) { return rl_username_completion_function (s, i); } char * filename_completion_function (const char *s, int i) { return rl_filename_completion_function (s, i); } readline-8.3/readline.h000644 000436 000024 00000115300 14715701560 015172 0ustar00chetstaff000000 000000 /* Readline.h -- the names of functions callable from within readline. */ /* Copyright (C) 1987-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_READLINE_H_) #define _READLINE_H_ #ifdef __cplusplus extern "C" { #endif #if defined (READLINE_LIBRARY) # include "rlstdc.h" # include "rltypedefs.h" # include "keymaps.h" # include "tilde.h" #else # include # include # include # include #endif /* Hex-encoded Readline version number. */ #define RL_READLINE_VERSION 0x0803 /* Readline 8.3 */ #define RL_VERSION_MAJOR 8 #define RL_VERSION_MINOR 3 /* Readline data structures. */ /* Maintaining the state of undo. We remember individual deletes and inserts on a chain of things to do. */ /* The actions that undo knows how to undo. Notice that UNDO_DELETE means to insert some text, and UNDO_INSERT means to delete some text. I.e., the code tells undo what to undo, not how to undo it. */ enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; /* What an element of THE_UNDO_LIST looks like. */ typedef struct undo_list { struct undo_list *next; int start, end; /* Where the change took place. */ char *text; /* The text to insert, if undoing a delete. */ enum undo_code what; /* Delete, Insert, Begin, End. */ } UNDO_LIST; /* The current undo list for RL_LINE_BUFFER. */ extern UNDO_LIST *rl_undo_list; /* The data structure for mapping textual names to code addresses. */ typedef struct _funmap { const char *name; rl_command_func_t *function; } FUNMAP; extern FUNMAP **funmap; /* **************************************************************** */ /* */ /* Functions available to bind to key sequences */ /* */ /* **************************************************************** */ /* Bindable commands for numeric arguments. */ extern int rl_digit_argument (int, int); extern int rl_universal_argument (int, int); /* Bindable commands for moving the cursor. */ extern int rl_forward_byte (int, int); extern int rl_forward_char (int, int); extern int rl_forward (int, int); extern int rl_backward_byte (int, int); extern int rl_backward_char (int, int); extern int rl_backward (int, int); extern int rl_beg_of_line (int, int); extern int rl_end_of_line (int, int); extern int rl_forward_word (int, int); extern int rl_backward_word (int, int); extern int rl_refresh_line (int, int); extern int rl_clear_screen (int, int); extern int rl_clear_display (int, int); extern int rl_skip_csi_sequence (int, int); extern int rl_arrow_keys (int, int); extern int rl_previous_screen_line (int, int); extern int rl_next_screen_line (int, int); /* Bindable commands for inserting and deleting text. */ extern int rl_insert (int, int); extern int rl_quoted_insert (int, int); extern int rl_tab_insert (int, int); extern int rl_newline (int, int); extern int rl_do_lowercase_version (int, int); extern int rl_rubout (int, int); extern int rl_delete (int, int); extern int rl_rubout_or_delete (int, int); extern int rl_delete_horizontal_space (int, int); extern int rl_delete_or_show_completions (int, int); extern int rl_insert_comment (int, int); /* Bindable commands for changing case. */ extern int rl_upcase_word (int, int); extern int rl_downcase_word (int, int); extern int rl_capitalize_word (int, int); /* Bindable commands for transposing characters and words. */ extern int rl_transpose_words (int, int); extern int rl_transpose_chars (int, int); /* Bindable commands for searching within a line. */ extern int rl_char_search (int, int); extern int rl_backward_char_search (int, int); /* Bindable commands for readline's interface to the command history. */ extern int rl_beginning_of_history (int, int); extern int rl_end_of_history (int, int); extern int rl_get_next_history (int, int); extern int rl_get_previous_history (int, int); extern int rl_operate_and_get_next (int, int); extern int rl_fetch_history (int, int); /* Bindable commands for managing the mark and region. */ extern int rl_set_mark (int, int); extern int rl_exchange_point_and_mark (int, int); /* Bindable commands to set the editing mode (emacs or vi). */ extern int rl_vi_editing_mode (int, int); extern int rl_emacs_editing_mode (int, int); /* Bindable commands to change the insert mode (insert or overwrite) */ extern int rl_overwrite_mode (int, int); /* Bindable commands for managing key bindings. */ extern int rl_re_read_init_file (int, int); extern int rl_dump_functions (int, int); extern int rl_dump_macros (int, int); extern int rl_dump_variables (int, int); /* Bindable commands for word completion. */ extern int rl_complete (int, int); extern int rl_possible_completions (int, int); extern int rl_insert_completions (int, int); extern int rl_old_menu_complete (int, int); extern int rl_menu_complete (int, int); extern int rl_backward_menu_complete (int, int); extern int rl_export_completions (int, int); /* Bindable commands for killing and yanking text, and managing the kill ring. */ extern int rl_kill_word (int, int); extern int rl_backward_kill_word (int, int); extern int rl_kill_line (int, int); extern int rl_backward_kill_line (int, int); extern int rl_kill_full_line (int, int); extern int rl_unix_word_rubout (int, int); extern int rl_unix_filename_rubout (int, int); extern int rl_unix_line_discard (int, int); extern int rl_copy_region_to_kill (int, int); extern int rl_kill_region (int, int); extern int rl_copy_forward_word (int, int); extern int rl_copy_backward_word (int, int); extern int rl_yank (int, int); extern int rl_yank_pop (int, int); extern int rl_yank_nth_arg (int, int); extern int rl_yank_last_arg (int, int); extern int rl_bracketed_paste_begin (int, int); /* Not available unless _WIN32 is defined. */ #if defined (_WIN32) extern int rl_paste_from_clipboard (int, int); #endif /* Bindable commands for incremental searching. */ extern int rl_reverse_search_history (int, int); extern int rl_forward_search_history (int, int); /* Bindable keyboard macro commands. */ extern int rl_start_kbd_macro (int, int); extern int rl_end_kbd_macro (int, int); extern int rl_call_last_kbd_macro (int, int); extern int rl_print_last_kbd_macro (int, int); /* Bindable undo commands. */ extern int rl_revert_line (int, int); extern int rl_undo_command (int, int); /* Bindable tilde expansion commands. */ extern int rl_tilde_expand (int, int); /* Bindable terminal control commands. */ extern int rl_restart_output (int, int); extern int rl_stop_output (int, int); /* Miscellaneous bindable commands. */ extern int rl_abort (int, int); extern int rl_tty_status (int, int); extern int rl_execute_named_command (int, int); /* Bindable commands for incremental and non-incremental history searching. */ extern int rl_history_search_forward (int, int); extern int rl_history_search_backward (int, int); extern int rl_history_substr_search_forward (int, int); extern int rl_history_substr_search_backward (int, int); extern int rl_noninc_forward_search (int, int); extern int rl_noninc_reverse_search (int, int); extern int rl_noninc_forward_search_again (int, int); extern int rl_noninc_reverse_search_again (int, int); /* Bindable command used when inserting a matching close character. */ extern int rl_insert_close (int, int); /* Not available unless READLINE_CALLBACKS is defined. */ extern void rl_callback_handler_install (const char *, rl_vcpfunc_t *); extern void rl_callback_read_char (void); extern void rl_callback_handler_remove (void); extern void rl_callback_sigcleanup (void); /* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */ /* VI-mode bindable commands. */ extern int rl_vi_redo (int, int); extern int rl_vi_undo (int, int); extern int rl_vi_yank_arg (int, int); extern int rl_vi_fetch_history (int, int); extern int rl_vi_search_again (int, int); extern int rl_vi_search (int, int); extern int rl_vi_complete (int, int); extern int rl_vi_tilde_expand (int, int); extern int rl_vi_prev_word (int, int); extern int rl_vi_next_word (int, int); extern int rl_vi_end_word (int, int); extern int rl_vi_insert_beg (int, int); extern int rl_vi_append_mode (int, int); extern int rl_vi_append_eol (int, int); extern int rl_vi_eof_maybe (int, int); extern int rl_vi_insertion_mode (int, int); extern int rl_vi_insert_mode (int, int); extern int rl_vi_movement_mode (int, int); extern int rl_vi_arg_digit (int, int); extern int rl_vi_change_case (int, int); extern int rl_vi_put (int, int); extern int rl_vi_column (int, int); extern int rl_vi_delete_to (int, int); extern int rl_vi_change_to (int, int); extern int rl_vi_yank_to (int, int); extern int rl_vi_yank_pop (int, int); extern int rl_vi_rubout (int, int); extern int rl_vi_delete (int, int); extern int rl_vi_back_to_indent (int, int); extern int rl_vi_unix_word_rubout (int, int); extern int rl_vi_first_print (int, int); extern int rl_vi_char_search (int, int); extern int rl_vi_match (int, int); extern int rl_vi_change_char (int, int); extern int rl_vi_subst (int, int); extern int rl_vi_overstrike (int, int); extern int rl_vi_overstrike_delete (int, int); extern int rl_vi_replace (int, int); extern int rl_vi_set_mark (int, int); extern int rl_vi_goto_mark (int, int); /* VI-mode utility functions. */ extern int rl_vi_check (void); extern int rl_vi_domove (int, int *); extern int rl_vi_bracktype (int); extern void rl_vi_start_inserting (int, int, int); /* VI-mode pseudo-bindable commands, used as utility functions. */ extern int rl_vi_fWord (int, int); extern int rl_vi_bWord (int, int); extern int rl_vi_eWord (int, int); extern int rl_vi_fword (int, int); extern int rl_vi_bword (int, int); extern int rl_vi_eword (int, int); /* **************************************************************** */ /* */ /* Well Published Functions */ /* */ /* **************************************************************** */ /* Readline functions. */ /* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */ extern char *readline (const char *); extern int rl_set_prompt (const char *); extern int rl_expand_prompt (char *); extern int rl_initialize (void); /* Undocumented; unused by readline */ extern int rl_discard_argument (void); /* Utility functions to bind keys to readline commands. */ extern int rl_add_defun (const char *, rl_command_func_t *, int); extern int rl_bind_key (int, rl_command_func_t *); extern int rl_bind_key_in_map (int, rl_command_func_t *, Keymap); extern int rl_unbind_key (int); extern int rl_unbind_key_in_map (int, Keymap); extern int rl_bind_key_if_unbound (int, rl_command_func_t *); extern int rl_bind_key_if_unbound_in_map (int, rl_command_func_t *, Keymap); extern int rl_unbind_function_in_map (rl_command_func_t *, Keymap); extern int rl_unbind_command_in_map (const char *, Keymap); extern int rl_bind_keyseq (const char *, rl_command_func_t *); extern int rl_bind_keyseq_in_map (const char *, rl_command_func_t *, Keymap); extern int rl_bind_keyseq_if_unbound (const char *, rl_command_func_t *); extern int rl_bind_keyseq_if_unbound_in_map (const char *, rl_command_func_t *, Keymap); extern int rl_generic_bind (int, const char *, char *, Keymap); extern char *rl_variable_value (const char *); extern int rl_variable_bind (const char *, const char *); /* Backwards compatibility, use rl_bind_keyseq_in_map instead. */ extern int rl_set_key (const char *, rl_command_func_t *, Keymap); /* Backwards compatibility, use rl_generic_bind instead. */ extern int rl_macro_bind (const char *, const char *, Keymap); /* Undocumented in the texinfo manual; not really useful to programs. */ extern int rl_translate_keyseq (const char *, char *, int *); extern char *rl_untranslate_keyseq (int); extern rl_command_func_t *rl_named_function (const char *); extern rl_command_func_t *rl_function_of_keyseq (const char *, Keymap, int *); extern rl_command_func_t *rl_function_of_keyseq_len (const char *, size_t, Keymap, int *); extern int rl_trim_arg_from_keyseq (const char *, size_t, Keymap); extern void rl_list_funmap_names (void); extern char **rl_invoking_keyseqs_in_map (rl_command_func_t *, Keymap); extern char **rl_invoking_keyseqs (rl_command_func_t *); extern void rl_print_keybinding (const char *, Keymap, int); extern void rl_function_dumper (int); extern void rl_macro_dumper (int); extern void rl_variable_dumper (int); extern int rl_read_init_file (const char *); extern int rl_parse_and_bind (char *); /* Functions for manipulating keymaps. */ extern Keymap rl_make_bare_keymap (void); extern int rl_empty_keymap (Keymap); extern Keymap rl_copy_keymap (Keymap); extern Keymap rl_make_keymap (void); extern void rl_discard_keymap (Keymap); extern void rl_free_keymap (Keymap); extern Keymap rl_get_keymap_by_name (const char *); extern char *rl_get_keymap_name (Keymap); extern void rl_set_keymap (Keymap); extern Keymap rl_get_keymap (void); extern int rl_set_keymap_name (const char *, Keymap); /* Undocumented; used internally only. */ extern void rl_set_keymap_from_edit_mode (void); extern char *rl_get_keymap_name_from_edit_mode (void); /* Functions for manipulating the funmap, which maps command names to functions. */ extern int rl_add_funmap_entry (const char *, rl_command_func_t *); extern const char **rl_funmap_names (void); /* Undocumented, only used internally -- there is only one funmap, and this function may be called only once. */ extern void rl_initialize_funmap (void); /* Utility functions for managing keyboard macros. */ extern void rl_push_macro_input (char *); /* Functions for undoing, from undo.c */ extern void rl_add_undo (enum undo_code, int, int, char *); extern void rl_free_undo_list (void); extern int rl_do_undo (void); extern int rl_begin_undo_group (void); extern int rl_end_undo_group (void); extern int rl_modifying (int, int); /* Functions for redisplay. */ extern void rl_redisplay (void); extern int rl_on_new_line (void); extern int rl_on_new_line_with_prompt (void); extern int rl_forced_update_display (void); extern int rl_clear_visible_line (void); extern int rl_clear_message (void); extern int rl_reset_line_state (void); extern int rl_crlf (void); /* Functions to manage the mark and region, especially the notion of an active mark and an active region. */ extern void rl_keep_mark_active (void); extern void rl_activate_mark (void); extern void rl_deactivate_mark (void); extern int rl_mark_active_p (void); extern int rl_message (const char *, ...) __attribute__((__format__ (printf, 1, 2))); extern int rl_show_char (int); /* Undocumented in texinfo manual. */ extern int rl_character_len (int, int); extern void rl_redraw_prompt_last_line (void); /* Save and restore internal prompt redisplay information. */ extern void rl_save_prompt (void); extern void rl_restore_prompt (void); /* Modifying text. */ extern void rl_replace_line (const char *, int); extern int rl_insert_text (const char *); extern int rl_delete_text (int, int); extern int rl_kill_text (int, int); extern char *rl_copy_text (int, int); /* Terminal and tty mode management. */ extern void rl_prep_terminal (int); extern void rl_deprep_terminal (void); extern void rl_tty_set_default_bindings (Keymap); extern void rl_tty_unset_default_bindings (Keymap); extern int rl_tty_set_echoing (int); extern int rl_reset_terminal (const char *); extern void rl_resize_terminal (void); extern void rl_set_screen_size (int, int); extern void rl_get_screen_size (int *, int *); extern void rl_reset_screen_size (void); extern char *rl_get_termcap (const char *); extern void rl_reparse_colors (void); /* Functions for character input. */ extern int rl_stuff_char (int); extern int rl_execute_next (int); extern int rl_clear_pending_input (void); extern int rl_read_key (void); extern int rl_getc (FILE *); extern int rl_set_keyboard_input_timeout (int); /* Functions to set and reset timeouts. */ extern int rl_set_timeout (unsigned int, unsigned int); extern int rl_timeout_remaining (unsigned int *, unsigned int *); #undef rl_clear_timeout #define rl_clear_timeout() rl_set_timeout (0, 0) /* `Public' utility functions . */ extern void rl_extend_line_buffer (int); extern int rl_ding (void); extern int rl_alphabetic (int); extern void rl_free (void *); /* Readline signal handling, from signals.c */ extern int rl_set_signals (void); extern int rl_clear_signals (void); extern void rl_cleanup_after_signal (void); extern void rl_reset_after_signal (void); extern void rl_free_line_state (void); extern int rl_pending_signal (void); extern void rl_check_signals (void); extern void rl_echo_signal_char (int); extern int rl_set_paren_blink_timeout (int); /* History management functions. */ extern void rl_clear_history (void); /* Undocumented. */ extern int rl_maybe_save_line (void); extern int rl_maybe_unsave_line (void); extern int rl_maybe_replace_line (void); /* Completion functions. */ extern int rl_complete_internal (int); extern void rl_display_match_list (char **, int, int); extern char **rl_completion_matches (const char *, rl_compentry_func_t *); extern char *rl_username_completion_function (const char *, int); extern char *rl_filename_completion_function (const char *, int); extern int rl_completion_mode (rl_command_func_t *); #if 0 /* Backwards compatibility (compat.c). These will go away sometime. */ extern void free_undo_list (void); extern int maybe_save_line (void); extern int maybe_unsave_line (void); extern int maybe_replace_line (void); extern int ding (void); extern int alphabetic (int); extern int crlf (void); extern char **completion_matches (char *, rl_compentry_func_t *); extern char *username_completion_function (const char *, int); extern char *filename_completion_function (const char *, int); #endif /* **************************************************************** */ /* */ /* Well Published Variables */ /* */ /* **************************************************************** */ /* The version of this incarnation of the readline library. */ extern const char *rl_library_version; /* e.g., "4.2" */ extern int rl_readline_version; /* e.g., 0x0402 */ /* True if this is real GNU readline. */ extern int rl_gnu_readline_p; /* Flags word encapsulating the current readline state. */ extern unsigned long rl_readline_state; /* Says which editing mode readline is currently using. 1 means emacs mode; 0 means vi mode. */ extern int rl_editing_mode; /* Insert or overwrite mode for emacs mode. 1 means insert mode; 0 means overwrite mode. Reset to insert mode on each input line. */ extern int rl_insert_mode; /* The name of the calling program. You should initialize this to whatever was in argv[0]. It is used when parsing conditionals. */ extern const char *rl_readline_name; /* The prompt readline uses. This is set from the argument to readline (), and should not be assigned to directly. */ extern char *rl_prompt; /* The prompt string that is actually displayed by rl_redisplay. Public so applications can more easily supply their own redisplay functions. */ extern char *rl_display_prompt; /* The line buffer that is in use. */ extern char *rl_line_buffer; /* The location of point, and end. */ extern int rl_point; extern int rl_end; /* The mark, or saved cursor position. */ extern int rl_mark; /* Flag to indicate that readline has finished with the current input line and should return it. */ extern int rl_done; /* Flag to indicate that readline has read an EOF character or read has returned 0 or error, and is returning a NULL line as a result. */ extern int rl_eof_found; /* If set to a character value, that will be the next keystroke read. */ extern int rl_pending_input; /* Non-zero if we called this function from _rl_dispatch(). It's present so functions can find out whether they were called from a key binding or directly from an application. */ extern int rl_dispatching; /* Non-zero if the user typed a numeric argument before executing the current function. */ extern int rl_explicit_arg; /* The current value of the numeric argument specified by the user. */ extern int rl_numeric_arg; /* The address of the last command function Readline executed. */ extern rl_command_func_t *rl_last_func; /* The name of the terminal to use. */ extern const char *rl_terminal_name; /* The input and output streams. */ extern FILE *rl_instream; extern FILE *rl_outstream; /* If non-zero, Readline gives values of LINES and COLUMNS from the environment greater precedence than values fetched from the kernel when computing the screen dimensions. */ extern int rl_prefer_env_winsize; /* If non-zero, then this is the address of a function to call just before readline_internal () prints the first prompt. */ extern rl_hook_func_t *rl_startup_hook; /* If non-zero, this is the address of a function to call just before readline_internal_setup () returns and readline_internal starts reading input characters. */ extern rl_hook_func_t *rl_pre_input_hook; /* The address of a function to call periodically while Readline is awaiting character input, or NULL, for no event handling. */ extern rl_hook_func_t *rl_event_hook; /* The address of a function to call if a read is interrupted by a signal. */ extern rl_hook_func_t *rl_signal_event_hook; extern rl_hook_func_t *rl_timeout_event_hook; /* The address of a function to call if Readline needs to know whether or not there is data available from the current input source. */ extern rl_hook_func_t *rl_input_available_hook; /* The address of the function to call to fetch a character from the current Readline input stream */ extern rl_getc_func_t *rl_getc_function; extern rl_voidfunc_t *rl_redisplay_function; extern rl_vintfunc_t *rl_prep_term_function; extern rl_voidfunc_t *rl_deprep_term_function; extern rl_macro_print_func_t *rl_macro_display_hook; /* Dispatch variables. */ extern Keymap rl_executing_keymap; extern Keymap rl_binding_keymap; extern int rl_executing_key; extern char *rl_executing_keyseq; extern int rl_key_sequence_length; /* Display variables. */ /* If non-zero, readline will erase the entire line, including any prompt, if the only thing typed on an otherwise-blank line is something bound to rl_newline. */ extern int rl_erase_empty_line; /* If non-zero, the application has already printed the prompt (rl_prompt) before calling readline, so readline should not output it the first time redisplay is done. */ extern int rl_already_prompted; /* A non-zero value means to read only this many characters rather than up to a character bound to accept-line. */ extern int rl_num_chars_to_read; /* The text of a currently-executing keyboard macro. */ extern char *rl_executing_macro; /* Variables to control readline signal handling. */ /* If non-zero, readline will install its own signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ extern int rl_catch_signals; /* If non-zero, readline will install a signal handler for SIGWINCH that also attempts to call any calling application's SIGWINCH signal handler. Note that the terminal is not cleaned up before the application's signal handler is called; use rl_cleanup_after_signal() to do that. */ extern int rl_catch_sigwinch; /* If non-zero, the readline SIGWINCH handler will modify LINES and COLUMNS in the environment. */ extern int rl_change_environment; /* Completion variables. */ /* Pointer to the generator function for completion_matches (). NULL means to use rl_filename_completion_function (), the default filename completer. */ extern rl_compentry_func_t *rl_completion_entry_function; /* Optional generator for menu completion. Default is rl_completion_entry_function (rl_filename_completion_function). */ extern rl_compentry_func_t *rl_menu_completion_entry_function; /* If rl_ignore_some_completions_function is non-NULL it is the address of a function to call after all of the possible matches have been generated, but before the actual completion is done to the input line. The function is called with one argument; a NULL terminated array of (char *). If your function removes any of the elements, they must be free()'ed. */ extern rl_compignore_func_t *rl_ignore_some_completions_function; /* Pointer to alternative function to create matches. Function is called with TEXT, START, and END. START and END are indices in RL_LINE_BUFFER saying what the boundaries of TEXT are. If this function exists and returns NULL then call the value of rl_completion_entry_function to try to match, otherwise use the array of strings returned. */ extern rl_completion_func_t *rl_attempted_completion_function; /* The basic list of characters that signal a break between words for the completer routine. The initial contents of this variable is what breaks words in the shell, i.e. "n\"\\'`@$>". */ extern const char *rl_basic_word_break_characters; /* The list of characters that signal a break between words for rl_complete_internal. The default list is the contents of rl_basic_word_break_characters. */ extern const char *rl_completer_word_break_characters; /* Hook function to allow an application to set the completion word break characters before readline breaks up the line. Allows position-dependent word break characters. */ extern rl_cpvfunc_t *rl_completion_word_break_hook; /* List of characters which can be used to quote a substring of the line. Completion occurs on the entire substring, and within the substring rl_completer_word_break_characters are treated as any other character, unless they also appear within this list. */ extern const char *rl_completer_quote_characters; /* List of quote characters which cause a word break. */ extern const char *rl_basic_quote_characters; /* List of characters that need to be quoted in filenames by the completer. */ extern const char *rl_filename_quote_characters; /* List of characters that are word break characters, but should be left in TEXT when it is passed to the completion function. The shell uses this to help determine what kind of completing to do. */ extern const char *rl_special_prefixes; /* If non-zero, then this is the address of a function to call when completing on a directory name. The function is called with the address of a string (the current directory name) as an arg. It changes what is displayed when the possible completions are printed or inserted. The directory completion hook should perform any necessary dequoting. This function should return 1 if it modifies the directory name pointer passed as an argument. If the directory completion hook returns 0, it should not modify the directory name pointer passed as an argument. */ extern rl_icppfunc_t *rl_directory_completion_hook; /* If non-zero, this is the address of a function to call when completing a directory name. This function takes the address of the directory name to be modified as an argument. Unlike rl_directory_completion_hook, it only modifies the directory name used in opendir(2), not what is displayed when the possible completions are printed or inserted. If set, it takes precedence over rl_directory_completion_hook. The directory rewrite hook should perform any necessary dequoting. This function has the same return value properties as the directory_completion_hook. I'm not happy with how this works yet, so it's undocumented. I'm trying it in bash to see how well it goes. */ extern rl_icppfunc_t *rl_directory_rewrite_hook; /* If non-zero, this is the address of a function for the completer to call before deciding which character to append to a completed name. It should modify the directory name passed as an argument if appropriate, and return non-zero if it modifies the name. This should not worry about dequoting the filename; that has already happened by the time it gets here. */ extern rl_icppfunc_t *rl_filename_stat_hook; /* If non-zero, this is the address of a function to call when reading directory entries from the filesystem for completion and comparing them to the partial word to be completed. The function should either return its first argument (if no conversion takes place) or newly-allocated memory. This can, for instance, convert filenames between character sets for comparison against what's typed at the keyboard. The returned value is what is added to the list of matches. The second argument is the length of the filename to be converted. */ extern rl_dequote_func_t *rl_filename_rewrite_hook; /* If non-zero, this is the address of a function to call before comparing the filename portion of a word to be completed with directory entries from the filesystem. This takes the address of the partial word to be completed, after any rl_filename_dequoting_function has been applied. The function should either return its first argument (if no conversion takes place) or newly-allocated memory. This can, for instance, convert the filename portion of the completion word to a character set suitable for comparison against directory entries read from the filesystem (after their potential modification by rl_filename_rewrite_hook). The returned value is what is added to the list of matches. The second argument is the length of the filename to be converted. */ extern rl_dequote_func_t *rl_completion_rewrite_hook; /* Backwards compatibility with previous versions of readline. */ #define rl_symbolic_link_hook rl_directory_completion_hook /* If non-zero, then this is the address of a function to call when completing a word would normally display the list of possible matches. This function is called instead of actually doing the display. It takes three arguments: (char **matches, int num_matches, int max_length) where MATCHES is the array of strings that matched, NUM_MATCHES is the number of strings in that array, and MAX_LENGTH is the length of the longest string in that array. */ extern rl_compdisp_func_t *rl_completion_display_matches_hook; /* Non-zero means that the results of the matches are to be treated as filenames. This is ALWAYS zero on entry, and can only be changed within a completion entry finder function. */ extern int rl_filename_completion_desired; /* Non-zero means that the results of the matches are to be quoted using double quotes (or an application-specific quoting mechanism) if the filename contains any characters in rl_word_break_chars. This is ALWAYS non-zero on entry, and can only be changed within a completion entry finder function. */ extern int rl_filename_quoting_desired; /* Non-zero means we should apply filename-type quoting to all completions even if we are not otherwise treating the matches as filenames. This is ALWAYS zero on entry, and can only be changed within a completion entry finder function. */ extern int rl_full_quoting_desired; /* Set to a function to quote a filename in an application-specific fashion. Called with the text to quote, the type of match found (single or multiple) and a pointer to the quoting character to be used, which the function can reset if desired. */ extern rl_quote_func_t *rl_filename_quoting_function; /* Function to call to remove quoting characters from a filename. Called before completion is attempted, so the embedded quotes do not interfere with matching names in the file system. */ extern rl_dequote_func_t *rl_filename_dequoting_function; /* Function to call to decide whether or not a word break character is quoted. If a character is quoted, it does not break words for the completer. */ extern rl_linebuf_func_t *rl_char_is_quoted_p; /* Non-zero means to suppress normal filename completion after the user-specified completion function has been called. */ extern int rl_attempted_completion_over; /* Set to a character describing the type of completion being attempted by rl_complete_internal; available for use by application completion functions. */ extern int rl_completion_type; /* Set to the last key used to invoke one of the completion functions */ extern int rl_completion_invoking_key; /* Up to this many items will be displayed in response to a possible-completions call. After that, we ask the user if she is sure she wants to see them all. The default value is 100. */ extern int rl_completion_query_items; /* Character appended to completed words when at the end of the line. The default is a space. Nothing is added if this is '\0'. */ extern int rl_completion_append_character; /* If set to non-zero by an application completion function, rl_completion_append_character will not be appended. */ extern int rl_completion_suppress_append; /* Set to any quote character readline thinks it finds before any application completion function is called. */ extern int rl_completion_quote_character; /* Set to a non-zero value if readline found quoting anywhere in the word to be completed; set before any application completion function is called. */ extern int rl_completion_found_quote; /* If non-zero, the completion functions don't append any closing quote. This is set to 0 by rl_complete_internal and may be changed by an application-specific completion function. */ extern int rl_completion_suppress_quote; /* If non-zero, readline will sort the completion matches. On by default. */ extern int rl_sort_completion_matches; /* If non-zero, a slash will be appended to completed filenames that are symbolic links to directory names, subject to the value of the mark-directories variable (which is user-settable). This exists so that application completion functions can override the user's preference (set via the mark-symlinked-directories variable) if appropriate. It's set to the value of _rl_complete_mark_symlink_dirs in rl_complete_internal before any application-specific completion function is called, so without that function doing anything, the user's preferences are honored. */ extern int rl_completion_mark_symlink_dirs; /* If non-zero, then disallow duplicates in the matches. */ extern int rl_ignore_completion_duplicates; /* If this is non-zero, completion is (temporarily) inhibited, and the completion character will be inserted as any other. */ extern int rl_inhibit_completion; /* Applications can set this to non-zero to have readline's signal handlers installed during the entire duration of reading a complete line, as in readline-6.2. This should be used with care, because it can result in readline receiving signals and not handling them until it's called again via rl_callback_read_char, thereby stealing them from the application. By default, signal handlers are only active while readline is active. */ extern int rl_persistent_signal_handlers; /* Input error; can be returned by (*rl_getc_function) if readline is reading a top-level command (RL_ISSTATE (RL_STATE_READCMD)). */ #define READERR (-2) /* Definitions available for use by readline clients. */ #define RL_PROMPT_START_IGNORE '\001' #define RL_PROMPT_END_IGNORE '\002' /* Possible values for do_replace argument to rl_filename_quoting_function, called by rl_complete_internal. */ #define NO_MATCH 0 #define SINGLE_MATCH 1 #define MULT_MATCH 2 /* Possible state values for rl_readline_state */ #define RL_STATE_NONE 0x0000000 /* no state; before first call */ #define RL_STATE_INITIALIZING 0x00000001 /* initializing */ #define RL_STATE_INITIALIZED 0x00000002 /* initialization done */ #define RL_STATE_TERMPREPPED 0x00000004 /* terminal is prepped */ #define RL_STATE_READCMD 0x00000008 /* reading a command key */ #define RL_STATE_METANEXT 0x00000010 /* reading input after ESC */ #define RL_STATE_DISPATCHING 0x00000020 /* dispatching to a command */ #define RL_STATE_MOREINPUT 0x00000040 /* reading more input in a command function */ #define RL_STATE_ISEARCH 0x00000080 /* doing incremental search */ #define RL_STATE_NSEARCH 0x00000100 /* doing non-inc search */ #define RL_STATE_SEARCH 0x00000200 /* doing a history search */ #define RL_STATE_NUMERICARG 0x00000400 /* reading numeric argument */ #define RL_STATE_MACROINPUT 0x00000800 /* getting input from a macro */ #define RL_STATE_MACRODEF 0x00001000 /* defining keyboard macro */ #define RL_STATE_OVERWRITE 0x00002000 /* overwrite mode */ #define RL_STATE_COMPLETING 0x00004000 /* doing completion */ #define RL_STATE_SIGHANDLER 0x00008000 /* in readline sighandler */ #define RL_STATE_UNDOING 0x00010000 /* doing an undo */ #define RL_STATE_INPUTPENDING 0x00020000 /* rl_execute_next called */ #define RL_STATE_TTYCSAVED 0x00040000 /* tty special chars saved */ #define RL_STATE_CALLBACK 0x00080000 /* using the callback interface */ #define RL_STATE_VIMOTION 0x00100000 /* reading vi motion arg */ #define RL_STATE_MULTIKEY 0x00200000 /* reading multiple-key command */ #define RL_STATE_VICMDONCE 0x00400000 /* entered vi command mode at least once */ #define RL_STATE_CHARSEARCH 0x00800000 /* vi mode char search */ #define RL_STATE_REDISPLAYING 0x01000000 /* updating terminal display */ #define RL_STATE_DONE 0x02000000 /* done; accepted line */ #define RL_STATE_TIMEOUT 0x04000000 /* done; timed out */ #define RL_STATE_EOF 0x08000000 /* done; got eof on read */ /* Rearrange these for next major version */ #define RL_STATE_READSTR 0x10000000 /* reading a string for M-x */ #define RL_SETSTATE(x) (rl_readline_state |= (x)) #define RL_UNSETSTATE(x) (rl_readline_state &= ~(x)) #define RL_ISSTATE(x) (rl_readline_state & (x)) struct readline_state { /* line state */ int point; int end; int mark; int buflen; char *buffer; UNDO_LIST *ul; char *prompt; /* global state */ int rlstate; /* XXX -- needs to be unsigned long */ int done; Keymap kmap; /* input state */ rl_command_func_t *lastfunc; int insmode; int edmode; char *kseq; int kseqlen; int pendingin; FILE *inf; FILE *outf; char *macro; /* signal state */ int catchsigs; int catchsigwinch; /* search state */ /* completion state */ rl_compentry_func_t *entryfunc; rl_compentry_func_t *menuentryfunc; rl_compignore_func_t *ignorefunc; rl_completion_func_t *attemptfunc; const char *wordbreakchars; /* options state */ /* hook state */ /* reserved for future expansion, so the struct size doesn't change */ char reserved[64]; }; extern int rl_save_state (struct readline_state *); extern int rl_restore_state (struct readline_state *); #ifdef __cplusplus } #endif #endif /* _READLINE_H_ */ readline-8.3/tcap.h000644 000436 000024 00000003364 14373234162 014343 0ustar00chetstaff000000 000000 /* tcap.h -- termcap library functions and variables. */ /* Copyright (C) 1996-2015,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RLTCAP_H_) #define _RLTCAP_H_ #if defined (HAVE_CONFIG_H) # include "config.h" #endif #if defined (HAVE_TERMCAP_H) # if defined (__linux__) && !defined (SPEED_T_IN_SYS_TYPES) # include "rltty.h" # endif # include #elif defined (HAVE_NCURSES_TERMCAP_H) # include #else /* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC. Unfortunately, PC is a global variable used by the termcap library. */ #ifdef PC # undef PC #endif extern char PC; extern char *UP, *BC; extern short ospeed; extern int tgetent (char *, const char *); extern int tgetflag (const char *); extern int tgetnum (const char *); extern char *tgetstr (const char *, char **); extern int tputs (const char *, int, int (*)(int)); extern char *tgoto (const char *, int, int); #endif /* HAVE_TERMCAP_H */ #endif /* !_RLTCAP_H_ */ readline-8.3/search.c000644 000436 000024 00000050617 15020315145 014646 0ustar00chetstaff000000 000000 /* search.c - code for non-incremental searching in emacs and vi modes. */ /* Copyright (C) 1992-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include #if defined (HAVE_UNISTD_H) # include #endif #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif #include "rldefs.h" #include "rlmbutil.h" #include "readline.h" #include "history.h" #include "histlib.h" #include "rlprivate.h" #include "xmalloc.h" #ifdef abs # undef abs #endif #define abs(x) (((x) >= 0) ? (x) : -(x)) _rl_search_cxt *_rl_nscxt = 0; static HIST_ENTRY *_rl_saved_line_for_search; static char *noninc_search_string = (char *) NULL; static int noninc_history_pos; static char *prev_line_found = (char *) NULL; static int _rl_history_search_len; /*static*/ int _rl_history_search_pos; static int _rl_history_search_flags; static char *history_search_string; static size_t history_string_size; static void make_history_line_current (int, int); static int noninc_search_from_pos (char *, int, int, int, int *); static int noninc_dosearch (char *, int, int); static int noninc_search (int, int); static int rl_history_search_internal (int, int); static void rl_history_search_reinit (int); static _rl_search_cxt *_rl_nsearch_init (int, int); static void _rl_nsearch_abort (_rl_search_cxt *); static int _rl_nsearch_dispatch (_rl_search_cxt *, int); void _rl_free_saved_search_line (void) { if (_rl_saved_line_for_search) _rl_free_saved_line (_rl_saved_line_for_search); _rl_saved_line_for_search = (HIST_ENTRY *)NULL; } static inline void _rl_unsave_saved_search_line (void) { if (_rl_saved_line_for_search) _rl_unsave_line (_rl_saved_line_for_search); _rl_saved_line_for_search = (HIST_ENTRY *)NULL; } /* Make the data from the history entry at offset NEWPOS be the contents of the current line, which is at offset CURPOS. We use the same strategy as incremental search. This doesn't do anything with rl_point beyond bounds checking; the caller must set it to any desired value. */ static void make_history_line_current (int curpos, int newpos) { if (newpos < curpos) rl_get_previous_history (curpos - newpos, 0); else rl_get_next_history (newpos - curpos, 0); _rl_fix_point (1); #if defined (VI_MODE) if (rl_editing_mode == vi_mode) /* POSIX.2 says that the `U' command doesn't affect the copy of any command lines to the edit line. We're going to implement that by making the undo list start after the matching line is copied to the current editing buffer. */ rl_free_undo_list (); #endif } /* Search the history list for STRING starting at absolute history position POS. If STRING begins with `^', the search must match STRING at the beginning of a history line, otherwise a full substring match is performed for STRING. DIR < 0 means to search backwards through the history list, DIR >= 0 means to search forward. */ static int noninc_search_from_pos (char *string, int pos, int dir, int flags, int *ncp) { int ret, old, sflags; char *s; if (pos < 0) return -1; old = where_history (); if (history_set_pos (pos) == 0) return -1; RL_SETSTATE(RL_STATE_SEARCH); /* These functions return the match offset in the line; history_offset gives the matching line in the history list */ sflags = 0; /* Non-anchored search */ s = string; if (*s == '^') { sflags |= ANCHORED_SEARCH; s++; } if (flags & SF_PATTERN) ret = _hs_history_patsearch (s, dir, dir, sflags); else { if (_rl_search_case_fold) sflags |= CASEFOLD_SEARCH; ret = _hs_history_search (s, dir, dir, sflags); } RL_UNSETSTATE(RL_STATE_SEARCH); if (ncp) *ncp = ret; /* caller will catch -1 to indicate no-op */ if (ret != -1) ret = where_history (); history_set_pos (old); return (ret); } /* Search for a line in the history containing STRING. If DIR is < 0, the search is backwards through previous entries, else through subsequent entries. Leaves noninc_history_pos set to the offset of the found history entry, if successful. Returns 1 if the search was successful, 0 otherwise. */ static int noninc_dosearch (char *string, int dir, int flags) { int oldpos, pos, ind; if (string == 0 || *string == '\0' || noninc_history_pos < 0) { rl_ding (); return 0; } pos = noninc_search_from_pos (string, noninc_history_pos + dir, dir, flags, &ind); if (pos == -1) { /* Search failed, current history position unchanged. */ rl_clear_message (); rl_point = 0; /* caller will fix it up if needed */ rl_ding (); return 0; } oldpos = where_history (); noninc_history_pos = pos; make_history_line_current (oldpos, noninc_history_pos); #if defined (VI_MODE) if (rl_editing_mode == vi_mode) history_set_pos (noninc_history_pos); /* XXX */ #endif if (_rl_enable_active_region && ((flags & SF_PATTERN) == 0) && ind >= 0 && ind < rl_end) { rl_point = ind; rl_mark = ind + strlen (string); if (rl_mark > rl_end) rl_mark = rl_end; /* can't happen? */ rl_activate_mark (); } else { rl_point = 0; rl_mark = rl_end; } rl_clear_message (); return 1; } static _rl_search_cxt * _rl_nsearch_init (int dir, int pchar) { _rl_search_cxt *cxt; char *p; cxt = _rl_scxt_alloc (RL_SEARCH_NSEARCH, 0); if (dir < 0) cxt->sflags |= SF_REVERSE; /* not strictly needed */ #if defined (VI_MODE) if (VI_COMMAND_MODE() && (pchar == '?' || pchar == '/')) cxt->sflags |= SF_PATTERN; #endif cxt->direction = dir; cxt->history_pos = cxt->save_line; _rl_saved_line_for_search = _rl_alloc_saved_line (); /* Clear the undo list, since reading the search string should create its own undo list, and the whole list will end up being freed when we finish reading the search string. */ rl_undo_list = 0; /* Use the line buffer to read the search string. */ rl_line_buffer[0] = 0; rl_end = rl_point = 0; p = _rl_make_prompt_for_search (pchar ? pchar : ':'); cxt->sflags |= SF_FREEPMT; rl_message ("%s", p); xfree (p); RL_SETSTATE(RL_STATE_NSEARCH); _rl_nscxt = cxt; return cxt; } int _rl_nsearch_cleanup (_rl_search_cxt *cxt, int r) { _rl_scxt_dispose (cxt, 0); _rl_nscxt = 0; RL_UNSETSTATE(RL_STATE_NSEARCH); return (r != 1); } static void _rl_nsearch_abort (_rl_search_cxt *cxt) { _rl_unsave_saved_search_line (); rl_point = cxt->save_point; rl_mark = cxt->save_mark; if (cxt->sflags & SF_FREEPMT) rl_restore_prompt (); /* _rl_make_prompt_for_search saved it */ cxt->sflags &= ~SF_FREEPMT; rl_clear_message (); _rl_fix_point (1); RL_UNSETSTATE (RL_STATE_NSEARCH); } int _rl_nsearch_sigcleanup (_rl_search_cxt *cxt, int r) { if (cxt->sflags & SF_FREEPMT) rl_restore_prompt (); /* _rl_make_prompt_for_search saved it */ cxt->sflags &= ~SF_FREEPMT; return (_rl_nsearch_cleanup (cxt, r)); } /* Process just-read character C according to search context CXT. Return -1 if the caller should abort the search, 0 if we should break out of the loop, and 1 if we should continue to read characters. */ static int _rl_nsearch_dispatch (_rl_search_cxt *cxt, int c) { int n; if (c < 0) c = CTRL ('C'); switch (c) { case CTRL('W'): rl_unix_word_rubout (1, c); break; case CTRL('U'): rl_unix_line_discard (1, c); break; case CTRL('Q'): case CTRL('V'): n = rl_quoted_insert (1, c); if (n < 0) { _rl_nsearch_abort (cxt); return -1; } cxt->lastc = (rl_point > 0) ? rl_line_buffer[rl_point - 1] : rl_line_buffer[0]; break; case RETURN: case NEWLINE: return 0; case CTRL('H'): case RUBOUT: if (rl_point == 0) { _rl_nsearch_abort (cxt); return -1; } _rl_rubout_char (1, c); break; case CTRL('C'): case CTRL('G'): rl_ding (); _rl_nsearch_abort (cxt); return -1; case ESC: /* XXX - experimental code to allow users to bracketed-paste into the search string. Similar code is in isearch.c:_rl_isearch_dispatch(). The difference here is that the bracketed paste sometimes doesn't paste everything, so checking for the prefix and the suffix in the input queue doesn't work well. We just have to check to see if the number of chars in the input queue is enough for the bracketed paste prefix and hope for the best. */ if (_rl_enable_bracketed_paste && ((n = _rl_nchars_available ()) >= (BRACK_PASTE_SLEN-1))) { if (_rl_read_bracketed_paste_prefix (c) == 1) rl_bracketed_paste_begin (1, c); else { c = rl_read_key (); /* get the ESC that got pushed back */ _rl_insert_char (1, c); } } else _rl_insert_char (1, c); break; default: #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_insert_text (cxt->mb); else #endif _rl_insert_char (1, c); break; } (*rl_redisplay_function) (); rl_deactivate_mark (); return 1; } /* Perform one search according to CXT, using NONINC_SEARCH_STRING, which we determine, via a call to noninc_dosearch(). Return -1 if the search should be aborted, any other value means to clean up using _rl_nsearch_cleanup (). If the search is not successful, we will restore the original line, so make sure we restore rl_point. Returns 1 if the search was successful, 0 otherwise. */ static int _rl_nsearch_dosearch (_rl_search_cxt *cxt) { int r; rl_mark = cxt->save_mark; /* We're committed to using the contents of rl_line_buffer as the search string, whatever they are. We no longer need the undo list generated by reading the search string. The old undo list will be restored by _rl_unsave_saved_search_line(). */ rl_free_undo_list (); /* If rl_point == 0, we want to re-use the previous search string and start from the saved history position. If there's no previous search string, punt. */ if (rl_point == 0) { if (noninc_search_string == 0) { _rl_unsave_saved_search_line (); /* XXX */ rl_ding (); if (cxt->sflags & SF_FREEPMT) rl_restore_prompt (); cxt->sflags &= ~SF_FREEPMT; RL_UNSETSTATE (RL_STATE_NSEARCH); return -1; } } else { /* We want to start the search from the current history position. */ noninc_history_pos = cxt->save_line; FREE (noninc_search_string); noninc_search_string = savestring (rl_line_buffer); /* We don't want the subsequent undo list generated by the search matching a history line to include the contents of the search string, so we need to clear rl_line_buffer here. If we don't want that, change the #if 1 to an #if 0 below. */ #if 1 rl_line_buffer[rl_point = rl_end = 0] = '\0'; #endif } if (cxt->sflags & SF_FREEPMT) rl_restore_prompt (); cxt->sflags &= ~SF_FREEPMT; /* We are finished using the line buffer to read the search string, restore the original contents without doing a redisplay. */ _rl_unsave_saved_search_line (); /* XXX */ r = noninc_dosearch (noninc_search_string, cxt->direction, cxt->sflags&SF_PATTERN); if (r == 0) /* search failed, we will restore the original line */ rl_point = cxt->save_point; return r; } /* Search non-interactively through the history list. DIR < 0 means to search backwards through the history of previous commands; otherwise the search is for commands subsequent to the current position in the history list. PCHAR is the character to use for prompting when reading the search string; if not specified (0), it defaults to `:'. */ static int noninc_search (int dir, int pchar) { _rl_search_cxt *cxt; int c, r; cxt = _rl_nsearch_init (dir, pchar); if (RL_ISSTATE (RL_STATE_CALLBACK)) return (0); /* Read the search string. */ r = 0; while (1) { c = _rl_search_getchar (cxt); if (c < 0) { _rl_nsearch_abort (cxt); return 1; } if (c == 0) break; r = _rl_nsearch_dispatch (cxt, c); if (r < 0) return 1; else if (r == 0) break; } r = _rl_nsearch_dosearch (cxt); return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1)); } /* Search forward through the history list for a string. If the vi-mode code calls this, KEY will be `?'. */ int rl_noninc_forward_search (int count, int key) { return noninc_search (1, (key == '?') ? '?' : 0); } /* Reverse search the history list for a string. If the vi-mode code calls this, KEY will be `/'. */ int rl_noninc_reverse_search (int count, int key) { return noninc_search (-1, (key == '/') ? '/' : 0); } /* Search forward through the history list for the last string searched for. If there is no saved search string, abort. If the vi-mode code calls this, KEY will be `N'. */ int rl_noninc_forward_search_again (int count, int key) { int r, flags; if (!noninc_search_string) { rl_ding (); return (1); } flags = 0; #if defined (VI_MODE) if (VI_COMMAND_MODE() && key == 'N') flags = SF_PATTERN; #endif r = noninc_dosearch (noninc_search_string, 1, flags); return (r != 1); } /* Reverse search in the history list for the last string searched for. If there is no saved search string, abort. If the vi-mode code calls this, KEY will be `n'. */ int rl_noninc_reverse_search_again (int count, int key) { int r, flags; if (!noninc_search_string) { rl_ding (); return (1); } flags = 0; #if defined (VI_MODE) if (VI_COMMAND_MODE() && key == 'n') flags = SF_PATTERN; #endif r = noninc_dosearch (noninc_search_string, -1, flags); return (r != 1); } #if defined (READLINE_CALLBACKS) int _rl_nsearch_callback (_rl_search_cxt *cxt) { int c, r; c = _rl_search_getchar (cxt); if (c <= 0) { if (c < 0) _rl_nsearch_abort (cxt); return 1; } r = _rl_nsearch_dispatch (cxt, c); if (r != 0) return 1; r = _rl_nsearch_dosearch (cxt); return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1)); } #endif /* The strategy is to find the line to move to (COUNT occurrences of HISTORY_SEARCH_STRING in direction DIR), then use the same mechanism that incremental search uses to move to it. That's wrapped up in make_history_line_current(). */ static int rl_history_search_internal (int count, int dir) { HIST_ENTRY *temp; int ret, oldpos, newcol; oldpos = where_history (); /* where are we now? */ temp = (HIST_ENTRY *)NULL; /* Search COUNT times through the history for a line matching history_search_string. If history_search_string[0] == '^', the line must match from the start; otherwise any substring can match. When this loop finishes, TEMP, if non-null, is the history line to copy into the line buffer. */ while (count) { RL_CHECK_SIGNALS (); ret = noninc_search_from_pos (history_search_string, _rl_history_search_pos + dir, dir, 0, &newcol); if (ret == -1) break; /* Get the history entry we found. */ _rl_history_search_pos = ret; history_set_pos (_rl_history_search_pos); temp = current_history (); /* will never be NULL after successful search */ history_set_pos (oldpos); /* Don't find multiple instances of the same line. */ if (prev_line_found && STREQ (prev_line_found, temp->line)) continue; prev_line_found = temp->line; count--; } /* If we didn't find anything at all, return without changing history offset */ if (temp == 0) { rl_ding (); /* If you don't want the saved history line (last match) to show up in the line buffer after the search fails, change the #if 0 to #if 1 */ #if 0 if (rl_point > _rl_history_search_len) { rl_point = rl_end = _rl_history_search_len; rl_line_buffer[rl_end] = '\0'; rl_mark = 0; } #else rl_point = _rl_history_search_len; /* _rl_unsave_line changes it */ rl_mark = rl_end; /* XXX */ #endif return 1; } /* Copy the line we found into the current line buffer. */ make_history_line_current (oldpos, _rl_history_search_pos); /* decide where to put rl_point -- need to change this for pattern search */ if (_rl_history_search_flags & ANCHORED_SEARCH) rl_point = _rl_history_search_len; /* easy case */ else { #if 0 char *t; t = strstr (rl_line_buffer, history_search_string); /* XXX */ rl_point = t ? (int)(t - rl_line_buffer) + _rl_history_search_len : rl_end; #else rl_point = (newcol >= 0) ? newcol : rl_end; #endif } rl_mark = rl_end; return 0; } static void rl_history_search_reinit (int flags) { int sind; _rl_history_search_pos = where_history (); _rl_history_search_len = rl_point; _rl_history_search_flags = flags; prev_line_found = (char *)NULL; if (rl_point) { /* Allocate enough space for anchored and non-anchored searches */ if (_rl_history_search_len + 2 >= history_string_size) { history_string_size = _rl_history_search_len + 2; history_search_string = (char *)xrealloc (history_search_string, history_string_size); } sind = 0; if (flags & ANCHORED_SEARCH) history_search_string[sind++] = '^'; strncpy (history_search_string + sind, rl_line_buffer, rl_point); history_search_string[rl_point + sind] = '\0'; } _rl_free_saved_search_line (); } /* Search forward in the history for the string of characters from the start of the line to rl_point. This is a non-incremental search. The search is anchored to the beginning of the history line. */ int rl_history_search_forward (int count, int ignore) { if (count == 0) return (0); if (rl_last_func != rl_history_search_forward && rl_last_func != rl_history_search_backward) rl_history_search_reinit (ANCHORED_SEARCH); if (_rl_history_search_len == 0) return (rl_get_next_history (count, ignore)); return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1)); } /* Search backward through the history for the string of characters from the start of the line to rl_point. This is a non-incremental search. */ int rl_history_search_backward (int count, int ignore) { if (count == 0) return (0); if (rl_last_func != rl_history_search_forward && rl_last_func != rl_history_search_backward) rl_history_search_reinit (ANCHORED_SEARCH); if (_rl_history_search_len == 0) return (rl_get_previous_history (count, ignore)); return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); } /* Search forward in the history for the string of characters from the start of the line to rl_point. This is a non-incremental search. The search succeeds if the search string is present anywhere in the history line. */ int rl_history_substr_search_forward (int count, int ignore) { if (count == 0) return (0); if (rl_last_func != rl_history_substr_search_forward && rl_last_func != rl_history_substr_search_backward) rl_history_search_reinit (NON_ANCHORED_SEARCH); if (_rl_history_search_len == 0) return (rl_get_next_history (count, ignore)); return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1)); } /* Search backward through the history for the string of characters from the start of the line to rl_point. This is a non-incremental search. */ int rl_history_substr_search_backward (int count, int ignore) { if (count == 0) return (0); if (rl_last_func != rl_history_substr_search_forward && rl_last_func != rl_history_substr_search_backward) rl_history_search_reinit (NON_ANCHORED_SEARCH); if (_rl_history_search_len == 0) return (rl_get_previous_history (count, ignore)); return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); } readline-8.3/macro.c000644 000436 000024 00000020134 14355601140 014474 0ustar00chetstaff000000 000000 /* macro.c -- keyboard macros for readline. */ /* Copyright (C) 1994-2009,2017 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_UNISTD_H) # include /* for _POSIX_VERSION */ #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include /* System-specific feature definitions and include files. */ #include "rldefs.h" /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "xmalloc.h" #define MAX_MACRO_LEVEL 16 /* **************************************************************** */ /* */ /* Hacking Keyboard Macros */ /* */ /* **************************************************************** */ /* The currently executing macro string. If this is non-zero, then it is a malloc ()'ed string where input is coming from. */ char *rl_executing_macro = (char *)NULL; /* The offset in the above string to the next character to be read. */ static int executing_macro_index; /* The current macro string being built. Characters get stuffed in here by add_macro_char (). */ static char *current_macro = (char *)NULL; /* The size of the buffer allocated to current_macro. */ static size_t current_macro_size; /* The index at which characters are being added to current_macro. */ static int current_macro_index; /* A structure used to save nested macro strings. It is a linked list of string/index for each saved macro. */ struct saved_macro { struct saved_macro *next; char *string; int sindex; }; /* The list of saved macros. */ static struct saved_macro *macro_list = (struct saved_macro *)NULL; static int macro_level = 0; /* Set up to read subsequent input from STRING. STRING is free ()'ed when we are done with it. */ void _rl_with_macro_input (char *string) { if (macro_level > MAX_MACRO_LEVEL) { _rl_errmsg ("maximum macro execution nesting level exceeded"); _rl_abort_internal (); return; } #if 0 if (rl_executing_macro) /* XXX - later */ #endif _rl_push_executing_macro (); rl_executing_macro = string; executing_macro_index = 0; RL_SETSTATE(RL_STATE_MACROINPUT); } /* Return the next character available from a macro, or 0 if there are no macro characters. */ int _rl_next_macro_key (void) { int c; if (rl_executing_macro == 0) return (0); if (rl_executing_macro[executing_macro_index] == 0) { _rl_pop_executing_macro (); return (_rl_next_macro_key ()); } #if defined (READLINE_CALLBACKS) c = rl_executing_macro[executing_macro_index++]; if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0) _rl_pop_executing_macro (); return c; #else /* XXX - consider doing the same as the callback code, just not testing whether we're running in callback mode */ return (rl_executing_macro[executing_macro_index++]); #endif } int _rl_peek_macro_key (void) { if (rl_executing_macro == 0) return (0); if (rl_executing_macro[executing_macro_index] == 0 && (macro_list == 0 || macro_list->string == 0)) return (0); if (rl_executing_macro[executing_macro_index] == 0 && macro_list && macro_list->string) return (macro_list->string[0]); return (rl_executing_macro[executing_macro_index]); } int _rl_prev_macro_key (void) { if (rl_executing_macro == 0) return (0); if (executing_macro_index == 0) return (0); executing_macro_index--; return (rl_executing_macro[executing_macro_index]); } /* Save the currently executing macro on a stack of saved macros. */ void _rl_push_executing_macro (void) { struct saved_macro *saver; saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro)); saver->next = macro_list; saver->sindex = executing_macro_index; saver->string = rl_executing_macro; macro_list = saver; macro_level++; } /* Discard the current macro, replacing it with the one on the top of the stack of saved macros. */ void _rl_pop_executing_macro (void) { struct saved_macro *macro; FREE (rl_executing_macro); rl_executing_macro = (char *)NULL; executing_macro_index = 0; if (macro_list) { macro = macro_list; rl_executing_macro = macro_list->string; executing_macro_index = macro_list->sindex; macro_list = macro_list->next; xfree (macro); } macro_level--; if (rl_executing_macro == 0) RL_UNSETSTATE(RL_STATE_MACROINPUT); } /* Add a character to the macro being built. */ void _rl_add_macro_char (int c) { if (current_macro_index + 1 >= current_macro_size) { if (current_macro == 0) current_macro = (char *)xmalloc (current_macro_size = 25); else current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); } current_macro[current_macro_index++] = c; current_macro[current_macro_index] = '\0'; } void _rl_kill_kbd_macro (void) { if (current_macro) { xfree (current_macro); current_macro = (char *) NULL; } current_macro_size = current_macro_index = 0; FREE (rl_executing_macro); rl_executing_macro = (char *) NULL; executing_macro_index = 0; RL_UNSETSTATE(RL_STATE_MACRODEF); } /* Begin defining a keyboard macro. Keystrokes are recorded as they are executed. End the definition with rl_end_kbd_macro (). If a numeric argument was explicitly typed, then append this definition to the end of the existing macro, and start by re-executing the existing macro. */ int rl_start_kbd_macro (int ignore1, int ignore2) { if (RL_ISSTATE (RL_STATE_MACRODEF)) { _rl_abort_internal (); return 1; } if (rl_explicit_arg) { if (current_macro) _rl_with_macro_input (savestring (current_macro)); } else current_macro_index = 0; RL_SETSTATE(RL_STATE_MACRODEF); return 0; } /* Stop defining a keyboard macro. A numeric argument says to execute the macro right now, that many times, counting the definition as the first time. */ int rl_end_kbd_macro (int count, int ignore) { if (RL_ISSTATE (RL_STATE_MACRODEF) == 0) { _rl_abort_internal (); return 1; } current_macro_index -= rl_key_sequence_length; if (current_macro_index < 0) current_macro_index = 0; current_macro[current_macro_index] = '\0'; RL_UNSETSTATE(RL_STATE_MACRODEF); return (rl_call_last_kbd_macro (--count, 0)); } /* Execute the most recently defined keyboard macro. COUNT says how many times to execute it. */ int rl_call_last_kbd_macro (int count, int ignore) { if (current_macro == 0) _rl_abort_internal (); if (RL_ISSTATE (RL_STATE_MACRODEF)) { rl_ding (); /* no recursive macros */ current_macro[--current_macro_index] = '\0'; /* erase this char */ return 0; } while (count--) _rl_with_macro_input (savestring (current_macro)); return 0; } int rl_print_last_kbd_macro (int count, int ignore) { char *m; if (current_macro == 0) { rl_ding (); return 0; } m = _rl_untranslate_macro_value (current_macro, 1); rl_crlf (); printf ("%s", m); fflush (stdout); rl_crlf (); FREE (m); rl_forced_update_display (); rl_display_fixed = 1; return 0; } void rl_push_macro_input (char *macro) { _rl_with_macro_input (macro); } readline-8.3/rldefs.h000644 000436 000024 00000011044 14433656221 014666 0ustar00chetstaff000000 000000 /* rldefs.h -- an attempt to isolate some of the system-specific defines for readline. This should be included after any files that define system-specific constants like _POSIX_VERSION or USG. */ /* Copyright (C) 1987-2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RLDEFS_H_) #define _RLDEFS_H_ #if defined (HAVE_CONFIG_H) # include "config.h" #endif #include "rlstdc.h" #if defined (STRCOLL_BROKEN) # undef HAVE_STRCOLL #endif #if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING) # define TERMIOS_TTY_DRIVER #else # if defined (HAVE_TERMIO_H) # define TERMIO_TTY_DRIVER # else # if !defined (__MINGW32__) && !defined (_MSC_VER) # define NEW_TTY_DRIVER # else # define NO_TTY_DRIVER # endif # endif #endif /* Posix macro to check file in statbuf for directory-ness. This requires that be included before this test. */ #if defined (S_IFDIR) && !defined (S_ISDIR) # define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) #endif /* Decide which flavor of the header file describing the C library string functions to include and include it. */ #if defined (HAVE_STRING_H) # include #else /* !HAVE_STRING_H */ # include #endif /* !HAVE_STRING_H */ #include #if defined (HAVE_STRCASECMP) #define _rl_stricmp strcasecmp #define _rl_strnicmp strncasecmp #else extern int _rl_stricmp (const char *, const char *); extern int _rl_strnicmp (const char *, const char *, int); #endif #if defined (HAVE_STRPBRK) && !defined (HANDLE_MULTIBYTE) # define _rl_strpbrk(a,b) strpbrk((a),(b)) #else extern char *_rl_strpbrk (const char *, const char *); #endif #if !defined (emacs_mode) # define no_mode -1 # define vi_mode 0 # define emacs_mode 1 #endif #if !defined (RL_IM_INSERT) # define RL_IM_INSERT 1 # define RL_IM_OVERWRITE 0 # # define RL_IM_DEFAULT RL_IM_INSERT #endif /* If you cast map[key].function to type (Keymap) on a Cray, the compiler takes the value of map[key].function and divides it by 4 to convert between pointer types (pointers to functions and pointers to structs are different sizes). This is not what is wanted. */ #if defined (CRAY) # define FUNCTION_TO_KEYMAP(map, key) (Keymap)((int)map[key].function) # define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)((int)(data)) #else # define FUNCTION_TO_KEYMAP(map, key) (Keymap)(map[key].function) # define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)(data) #endif #ifndef savestring #define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) #endif /* Possible values for _rl_bell_preference. */ #define NO_BELL 0 #define AUDIBLE_BELL 1 #define VISIBLE_BELL 2 /* Definitions used when searching the line for characters. */ /* NOTE: it is necessary that opposite directions are inverses */ #define FTO 1 /* forward to */ #define BTO -1 /* backward to */ #define FFIND 2 /* forward find */ #define BFIND -2 /* backward find */ /* Possible values for the found_quote flags word used by the completion functions. It says what kind of (shell-like) quoting we found anywhere in the line. */ #define RL_QF_SINGLE_QUOTE 0x01 #define RL_QF_DOUBLE_QUOTE 0x02 #define RL_QF_BACKSLASH 0x04 #define RL_QF_OTHER_QUOTE 0x08 /* Default readline line buffer length. */ #define DEFAULT_BUFFER_SIZE 256 #if !defined (STREQ) #define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) #define STREQN(a, b, n) (((n) == 0) ? (1) \ : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) #endif #if !defined (RL_STRLEN) # define RL_STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0) #endif #if !defined (FREE) # define FREE(x) if (x) free (x) #endif #if !defined (SWAP) # define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0) #endif /* CONFIGURATION SECTION */ #include "rlconf.h" #endif /* !_RLDEFS_H_ */ readline-8.3/MANIFEST000644 000436 000024 00000006066 15017402105 014364 0ustar00chetstaff000000 000000 # # Master distribution manifest for the standalone readline distribution # doc d examples d examples/autoconf d examples/rlfe d support d shlib d m4 d COPYING f README f MANIFEST f INSTALL f CHANGELOG f CHANGES f NEWS f USAGE f aclocal.m4 f config.h.in f configure f 755 configure.ac f m4/codeset.m4 f Makefile.in f readline.pc.in f history.pc.in f ansi_stdlib.h f chardefs.h f colors.h f history.h f histlib.h f keymaps.h f parse-colors.h f posixdir.h f posixjmp.h f posixselect.h f posixstat.h f posixtime.h f readline.h f rlconf.h f rldefs.h f rlmbutil.h f rlprivate.h f rlshell.h f rlstdc.h f rltty.h f rltypedefs.h f rlwinsize.h f tcap.h f tilde.h f xmalloc.h f bind.c f callback.c f colors.c f compat.c f complete.c f display.c f emacs_keymap.c f funmap.c f input.c f isearch.c f keymaps.c f kill.c f macro.c f mbutil.c f misc.c f nls.c f parens.c f parse-colors.c f readline.c f rltty.c f savestring.c f search.c f shell.c f signals.c f terminal.c f text.c f tilde.c f undo.c f util.c f vi_keymap.c f vi_mode.c f xfree.c f xmalloc.c f gettimeofday.c f history.c f histexpand.c f histfile.c f histsearch.c f patchlevel f shlib/Makefile.in f support/config.guess f support/config.rpath f 755 support/config.sub f support/install-sh f 755 support/mkdirs f 755 support/mkdist f support/mkinstalldirs f 755 support/shobj-conf f support/shlib-install f 755 support/wcwidth.c f doc/Makefile.in f doc/texinfo.tex f doc/version.texi f doc/fdl.texi f doc/rlman.texi f doc/rltech.texi f doc/rluser.texi f doc/rluserman.texi f doc/history.texi f doc/hstech.texi f doc/hsuser.texi f doc/readline.3 f doc/history.3 f doc/texi2dvi f 755 doc/texi2html f 755 examples/Makefile.in f examples/excallback.c f examples/fileman.c f examples/manexamp.c f examples/readlinebuf.h f examples/rl-fgets.c f examples/rlbasic.c f examples/rlcat.c f examples/rlevent.c f examples/rlkeymaps.c f examples/rltest.c f examples/rl-callbacktest.c f examples/rl-callbacktest2.c f examples/rl-callbacktest3.c f examples/rl-timeout.c f examples/rl-test-timeout f examples/rl.c f examples/rlptytest.c f examples/rlversion.c f examples/histexamp.c f examples/hist_erasedups.c f examples/hist_purgecmd.c f examples/Inputrc f examples/autoconf/BASH_CHECK_LIB_TERMCAP f examples/autoconf/RL_LIB_READLINE_VERSION f examples/autoconf/wi_LIB_READLINE f examples/rlfe/ChangeLog f examples/rlfe/Makefile.in f examples/rlfe/README f examples/rlfe/config.h.in f examples/rlfe/configure f 755 examples/rlfe/configure.ac f examples/rlfe/extern.h f examples/rlfe/os.h f examples/rlfe/pty.c f examples/rlfe/rlfe.c f examples/rlfe/screen.h f examples/rlwrap-0.46.1.tar.gz f # formatted documentation, from MANIFEST.doc doc/readline.ps f doc/history.ps f doc/rluserman.ps f doc/readline_3.ps f doc/history_3.ps f doc/readline.dvi f doc/history.dvi f doc/rluserman.dvi f doc/readline.info f doc/history.info f doc/rluserman.info f doc/readline.html f doc/history.html f doc/rluserman.html f doc/readline.0 f doc/history.0 f doc/readline_3.pdf f doc/history_3.pdf f doc/history.pdf f doc/readline.pdf f doc/rluserman.pdf f readline-8.3/tilde.h000644 000436 000024 00000005134 14002565747 014517 0ustar00chetstaff000000 000000 /* tilde.h: Externally available variables and function in libtilde.a. */ /* Copyright (C) 1992-2009,2021 Free Software Foundation, Inc. This file contains the Readline Library (Readline), a set of routines for providing Emacs style line input to programs that ask for it. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_TILDE_H_) # define _TILDE_H_ #ifdef __cplusplus extern "C" { #endif typedef char *tilde_hook_func_t (char *); /* If non-null, this contains the address of a function that the application wants called before trying the standard tilde expansions. The function is called with the text sans tilde, and returns a malloc()'ed string which is the expansion, or a NULL pointer if the expansion fails. */ extern tilde_hook_func_t *tilde_expansion_preexpansion_hook; /* If non-null, this contains the address of a function to call if the standard meaning for expanding a tilde fails. The function is called with the text (sans tilde, as in "foo"), and returns a malloc()'ed string which is the expansion, or a NULL pointer if there is no expansion. */ extern tilde_hook_func_t *tilde_expansion_failure_hook; /* When non-null, this is a NULL terminated array of strings which are duplicates for a tilde prefix. Bash uses this to expand `=~' and `:~'. */ extern char **tilde_additional_prefixes; /* When non-null, this is a NULL terminated array of strings which match the end of a username, instead of just "/". Bash sets this to `:' and `=~'. */ extern char **tilde_additional_suffixes; /* Return a new string which is the result of tilde expanding STRING. */ extern char *tilde_expand (const char *); /* Do the work of tilde expansion on FILENAME. FILENAME starts with a tilde. If there is no expansion, call tilde_expansion_failure_hook. */ extern char *tilde_expand_word (const char *); /* Find the portion of the string beginning with ~ that should be expanded. */ extern char *tilde_find_word (const char *, int, int *); #ifdef __cplusplus } #endif #endif /* _TILDE_H_ */ readline-8.3/parse-colors.h000644 000436 000024 00000002777 11741616321 016031 0ustar00chetstaff000000 000000 /* `dir', `vdir' and `ls' directory listing programs for GNU. Modified by Chet Ramey for Readline. Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012 Free Software Foundation, Inc. This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see . */ /* Written by Richard Stallman and David MacKenzie. */ /* Color support by Peter Anvin and Dennis Flaherty based on original patches by Greg Lee . */ #ifndef _PARSE_COLORS_H_ #define _PARSE_COLORS_H_ #include "readline.h" #define LEN_STR_PAIR(s) sizeof (s) - 1, s void _rl_parse_colors (void); static const char *const indicator_name[]= { "lc", "rc", "ec", "rs", "no", "fi", "di", "ln", "pi", "so", "bd", "cd", "mi", "or", "ex", "do", "su", "sg", "st", "ow", "tw", "ca", "mh", "cl", NULL }; /* Buffer for color sequences */ static char *color_buf; #endif /* !_PARSE_COLORS_H_ */ readline-8.3/vi_mode.c000644 000436 000024 00000160666 15026255226 015042 0ustar00chetstaff000000 000000 /* vi_mode.c -- A vi emulation mode for Bash. Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */ /* Copyright (C) 1987-2021,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY /* **************************************************************** */ /* */ /* VI Emulation Mode */ /* */ /* **************************************************************** */ #include "rlconf.h" #if defined (VI_MODE) #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #if defined (HAVE_UNISTD_H) # include #endif #include /* Some standard library routines. */ #include "rldefs.h" #include "rlmbutil.h" #include "readline.h" #include "history.h" #include "rlprivate.h" #include "xmalloc.h" #ifndef member #define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0) #endif /* Increment START to the next character in RL_LINE_BUFFER, handling multibyte chars */ #if defined (HANDLE_MULTIBYTE) #define INCREMENT_POS(start) \ do { \ if (MB_CUR_MAX == 1 || rl_byte_oriented) \ start++; \ else \ start = _rl_find_next_mbchar (rl_line_buffer, start, 1, MB_FIND_ANY); \ } while (0) #else /* !HANDLE_MULTIBYTE */ #define INCREMENT_POS(start) (start)++ #endif /* !HANDLE_MULTIBYTE */ /* Flags for the motion context */ #define MOVE_SUCCESS 0 #define MOVE_FAILED 0x01 /* This is global so other parts of the code can check whether the last command was a text modification command. */ int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */ _rl_vimotion_cxt *_rl_vimvcxt = 0; /* Non-zero indicates we are redoing a vi-mode command with `.' */ int _rl_vi_redoing; /* Non-zero means enter insertion mode. */ static int _rl_vi_doing_insert; /* Command keys which do movement for xxx_to commands. */ static const char * const vi_motion = " hl^$0ftFT;,%wbeWBE|`"; /* Keymap used for vi replace characters. Created dynamically since rarely used. */ static Keymap vi_replace_map; /* The number of characters inserted in the last replace operation. */ static int vi_replace_count; /* If non-zero, we have text inserted after a c[motion] command that put us implicitly into insert mode. Some people want this text to be attached to the command so that it is `redoable' with `.'. */ static char *vi_insert_buffer; static size_t vi_insert_buffer_size; static int _rl_vi_last_repeat = 1; static int _rl_vi_last_arg_sign = 1; static int _rl_vi_last_motion; #if defined (HANDLE_MULTIBYTE) static char _rl_vi_last_search_mbchar[MB_LEN_MAX]; static int _rl_vi_last_search_mblen; #else static int _rl_vi_last_search_char; #endif static char _rl_vi_last_replacement[MB_LEN_MAX+1]; /* reserve for trailing NULL */ static int _rl_vi_last_key_before_insert; /* Text modification commands. These are the `redoable' commands. */ static const char * const vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; /* Arrays for the saved marks. */ static int vi_mark_chars['z' - 'a' + 1]; static void _rl_vi_replace_insert (int); static void _rl_vi_save_replace (void); static void _rl_vi_stuff_insert (int); static void _rl_vi_save_insert (UNDO_LIST *); static void vi_save_insert_buffer (int, int); static inline void _rl_vi_backup (void); static int _rl_vi_arg_dispatch (int); static int rl_digit_loop1 (void); static int _rl_vi_set_mark (void); static int _rl_vi_goto_mark (void); static inline int _rl_vi_advance_point (void); static inline int _rl_vi_backup_point (void); static void _rl_vi_append_forward (int); static int _rl_vi_callback_getchar (char *, int); #if defined (READLINE_CALLBACKS) static int _rl_vi_callback_set_mark (_rl_callback_generic_arg *); static int _rl_vi_callback_goto_mark (_rl_callback_generic_arg *); static int _rl_vi_callback_change_char (_rl_callback_generic_arg *); static int _rl_vi_callback_char_search (_rl_callback_generic_arg *); #endif static int rl_domove_read_callback (_rl_vimotion_cxt *); static int rl_domove_motion_callback (_rl_vimotion_cxt *); static int rl_vi_domove_getchar (_rl_vimotion_cxt *); static int vi_change_dispatch (_rl_vimotion_cxt *); static int vi_delete_dispatch (_rl_vimotion_cxt *); static int vi_yank_dispatch (_rl_vimotion_cxt *); static int vidomove_dispatch (_rl_vimotion_cxt *); void _rl_vi_initialize_line (void) { register int i, n; n = sizeof (vi_mark_chars) / sizeof (vi_mark_chars[0]); for (i = 0; i < n; i++) vi_mark_chars[i] = -1; RL_UNSETSTATE(RL_STATE_VICMDONCE); } void _rl_vi_reset_last (void) { _rl_vi_last_command = 'i'; _rl_vi_last_repeat = 1; _rl_vi_last_arg_sign = 1; _rl_vi_last_motion = 0; } void _rl_vi_set_last (int key, int repeat, int sign) { _rl_vi_last_command = key; _rl_vi_last_repeat = repeat; _rl_vi_last_arg_sign = sign; } /* A convenience function that calls _rl_vi_set_last to save the last command information and enters insertion mode. */ void rl_vi_start_inserting (int key, int repeat, int sign) { _rl_vi_set_last (key, repeat, sign); rl_begin_undo_group (); /* ensure inserts aren't concatenated */ rl_vi_insertion_mode (1, key); } /* Is the command C a VI mode text modification command? */ int _rl_vi_textmod_command (int c) { return (member (c, vi_textmod)); } int _rl_vi_motion_command (int c) { return (member (c, vi_motion)); } static void _rl_vi_replace_insert (int count) { int nchars; nchars = strlen (vi_insert_buffer); rl_begin_undo_group (); while (count--) /* nchars-1 to compensate for _rl_replace_text using `end+1' in call to rl_delete_text */ _rl_replace_text (vi_insert_buffer, rl_point, rl_point+nchars-1); rl_end_undo_group (); } static void _rl_vi_stuff_insert (int count) { rl_begin_undo_group (); while (count--) rl_insert_text (vi_insert_buffer); rl_end_undo_group (); } /* Bound to `.'. Called from command mode, so we know that we have to redo a text modification command. The default for _rl_vi_last_command puts you back into insert mode. */ int rl_vi_redo (int count, int c) { int r; if (rl_explicit_arg == 0) { rl_numeric_arg = _rl_vi_last_repeat; rl_arg_sign = _rl_vi_last_arg_sign; } r = 0; _rl_vi_redoing = 1; /* If we're redoing an insert with `i', stuff in the inserted text and do not go into insertion mode. */ if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer) { _rl_vi_stuff_insert (count); /* And back up point over the last character inserted. */ if (rl_point > 0) _rl_vi_backup (); } else if (_rl_vi_last_command == 'R' && vi_insert_buffer && *vi_insert_buffer) { _rl_vi_replace_insert (count); /* And back up point over the last character inserted. */ if (rl_point > 0) _rl_vi_backup (); } /* Ditto for redoing an insert with `I', but move to the beginning of the line like the `I' command does. */ else if (_rl_vi_last_command == 'I' && vi_insert_buffer && *vi_insert_buffer) { rl_beg_of_line (1, 'I'); _rl_vi_stuff_insert (count); if (rl_point > 0) _rl_vi_backup (); } /* Ditto for redoing an insert with `a', but move forward a character first like the `a' command does. */ else if (_rl_vi_last_command == 'a' && vi_insert_buffer && *vi_insert_buffer) { _rl_vi_append_forward ('a'); _rl_vi_stuff_insert (count); if (rl_point > 0) _rl_vi_backup (); } /* Ditto for redoing an insert with `A', but move to the end of the line like the `A' command does. */ else if (_rl_vi_last_command == 'A' && vi_insert_buffer && *vi_insert_buffer) { rl_end_of_line (1, 'A'); _rl_vi_stuff_insert (count); if (rl_point > 0) _rl_vi_backup (); } else if (_rl_vi_last_command == '.' && _rl_keymap == vi_movement_keymap) { rl_ding (); r = 0; } else r = _rl_dispatch (_rl_vi_last_command, _rl_keymap); _rl_vi_redoing = 0; return (r); } /* A placeholder for further expansion. */ int rl_vi_undo (int count, int key) { return (rl_undo_command (count, key)); } /* Yank the nth arg from the previous line into this line at point. */ int rl_vi_yank_arg (int count, int key) { /* Readline thinks that the first word on a line is the 0th, while vi thinks the first word on a line is the 1st. Compensate. */ if (rl_explicit_arg) rl_yank_nth_arg (count - 1, key); else rl_yank_nth_arg ('$', key); return (0); } /* With an argument, move back that many history lines, else move to the beginning of history. */ int rl_vi_fetch_history (int count, int c) { return (rl_fetch_history (count, c)); } /* Search again for the last thing searched for. */ int rl_vi_search_again (int count, int key) { switch (key) { case 'n': rl_noninc_reverse_search_again (count, key); break; case 'N': rl_noninc_forward_search_again (count, key); break; } return (0); } /* Do a vi style search. */ int rl_vi_search (int count, int key) { switch (key) { case '?': _rl_free_saved_search_line (); /* just in case */ rl_noninc_forward_search (count, key); break; case '/': _rl_free_saved_search_line (); rl_noninc_reverse_search (count, key); break; default: rl_ding (); break; } return (0); } /* Completion, from vi's point of view. */ int rl_vi_complete (int ignore, int key) { if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point]))) { if (!whitespace (rl_line_buffer[rl_point + 1])) rl_vi_end_word (1, 'E'); _rl_vi_advance_point (); } if (key == '*') rl_complete_internal ('*'); /* Expansion and replacement. */ else if (key == '=') rl_complete_internal ('?'); /* List possible completions. */ else if (key == '\\') rl_complete_internal (TAB); /* Standard Readline completion. */ else rl_complete (0, key); if (key == '*' || key == '\\') rl_vi_start_inserting (key, 1, rl_arg_sign); return (0); } /* Tilde expansion for vi mode. */ int rl_vi_tilde_expand (int ignore, int key) { rl_tilde_expand (0, key); rl_vi_start_inserting (key, 1, rl_arg_sign); return (0); } /* Previous word in vi mode. */ int rl_vi_prev_word (int count, int key) { if (count < 0) return (rl_vi_next_word (-count, key)); if (rl_point == 0) { rl_ding (); return (0); } if (_rl_uppercase_p (key)) rl_vi_bWord (count, key); else rl_vi_bword (count, key); return (0); } /* Next word in vi mode. */ int rl_vi_next_word (int count, int key) { if (count < 0) return (rl_vi_prev_word (-count, key)); if (rl_point >= (rl_end - 1)) { rl_ding (); return (0); } if (_rl_uppercase_p (key)) rl_vi_fWord (count, key); else rl_vi_fword (count, key); return (0); } static inline int _rl_vi_advance_point (void) { int point; point = rl_point; if (rl_point < rl_end) #if defined (HANDLE_MULTIBYTE) { if (MB_CUR_MAX == 1 || rl_byte_oriented) rl_point++; else { point = rl_point; rl_point = _rl_forward_char_internal (1); if (point == rl_point || rl_point > rl_end) rl_point = rl_end; } } #else rl_point++; #endif return point; } /* Move the cursor back one character. */ static inline void _rl_vi_backup (void) { if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); else rl_point--; } /* Move the point back one character, returning the starting value and not doing anything at the beginning of the line */ static inline int _rl_vi_backup_point (void) { int point; point = rl_point; if (rl_point > 0) #if defined (HANDLE_MULTIBYTE) { if (MB_CUR_MAX == 1 || rl_byte_oriented) rl_point--; else { point = rl_point; rl_point = _rl_backward_char_internal (1); if (rl_point < 0) rl_point = 0; /* XXX - not really necessary */ } } #else rl_point--; #endif return point; } /* Move to the end of the ?next? word. */ int rl_vi_end_word (int count, int key) { if (count < 0) { rl_ding (); return 1; } if (_rl_uppercase_p (key)) rl_vi_eWord (count, key); else rl_vi_eword (count, key); return (0); } /* Move forward a word the way that 'W' does. */ int rl_vi_fWord (int count, int ignore) { while (count-- && rl_point < (rl_end - 1)) { /* Skip until whitespace. */ while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) _rl_vi_advance_point (); /* Now skip whitespace. */ while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) _rl_vi_advance_point (); } return (0); } int rl_vi_bWord (int count, int ignore) { while (count-- && rl_point > 0) { /* If we are at the start of a word, move back to whitespace so we will go back to the start of the previous word. */ if (!whitespace (rl_line_buffer[rl_point]) && whitespace (rl_line_buffer[rl_point - 1])) rl_point--; while (rl_point > 0 && whitespace (rl_line_buffer[rl_point])) _rl_vi_backup_point (); if (rl_point > 0) { do _rl_vi_backup_point (); while (rl_point > 0 && !whitespace (rl_line_buffer[rl_point])); if (rl_point > 0) /* hit whitespace */ rl_point++; if (rl_point < 0) rl_point = 0; } } return (0); } int rl_vi_eWord (int count, int ignore) { int opoint; while (count-- && rl_point < (rl_end - 1)) { if (whitespace (rl_line_buffer[rl_point]) == 0) _rl_vi_advance_point (); /* Move to the next non-whitespace character (to the start of the next word). */ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) _rl_vi_advance_point (); if (rl_point && rl_point < rl_end) { opoint = rl_point; /* Skip whitespace. */ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) opoint = _rl_vi_advance_point (); /* XXX - why? */ /* Skip until whitespace. */ while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point])) opoint = _rl_vi_advance_point (); /* Move back to the last character of the word. */ rl_point = opoint; } } return (0); } int rl_vi_fword (int count, int ignore) { int opoint; while (count-- && rl_point < (rl_end - 1)) { /* Move to white space (really non-identifer). */ if (_rl_isident (rl_line_buffer[rl_point])) { while (_rl_isident (rl_line_buffer[rl_point]) && rl_point < rl_end) _rl_vi_advance_point (); } else /* if (!whitespace (rl_line_buffer[rl_point])) */ { while (!_rl_isident (rl_line_buffer[rl_point]) && !whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) _rl_vi_advance_point (); } opoint = rl_point; /* Move past whitespace. */ while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) opoint = _rl_vi_advance_point (); } return (0); } int rl_vi_bword (int count, int ignore) { int opoint; while (count-- && rl_point > 0) { int prev_is_ident, cur_is_ident; /* If we are at the start of a word, move back to whitespace so we will go back to the start of the previous word. */ if (!whitespace (rl_line_buffer[rl_point]) && whitespace (rl_line_buffer[rl_point - 1])) if (--rl_point == 0) break; /* If this character and the previous character are `opposite', move back so we don't get messed up by the rl_point++ down there in the while loop. Without this code, words like `l;' screw up the function. */ cur_is_ident = _rl_isident (rl_line_buffer[rl_point]); opoint = _rl_vi_backup_point (); prev_is_ident = _rl_isident (rl_line_buffer[rl_point]); if ((cur_is_ident && !prev_is_ident) || (!cur_is_ident && prev_is_ident)) ; /* leave point alone, we backed it up one character */ else rl_point = opoint; while (rl_point > 0 && whitespace (rl_line_buffer[rl_point])) _rl_vi_backup_point (); if (rl_point > 0) { opoint = rl_point; if (_rl_isident (rl_line_buffer[rl_point])) do opoint = _rl_vi_backup_point (); while (rl_point > 0 && _rl_isident (rl_line_buffer[rl_point])); else do opoint = _rl_vi_backup_point (); while (rl_point > 0 && !_rl_isident (rl_line_buffer[rl_point]) && !whitespace (rl_line_buffer[rl_point])); if (rl_point > 0) rl_point = opoint; if (rl_point < 0) rl_point = 0; } } return (0); } int rl_vi_eword (int count, int ignore) { int opoint; while (count-- && rl_point < (rl_end - 1)) { if (whitespace (rl_line_buffer[rl_point]) == 0) _rl_vi_advance_point (); while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) _rl_vi_advance_point (); opoint = rl_point; if (rl_point < rl_end) { if (_rl_isident (rl_line_buffer[rl_point])) do { opoint = _rl_vi_advance_point (); } while (rl_point < rl_end && _rl_isident (rl_line_buffer[rl_point])); else do { opoint = _rl_vi_advance_point (); } while (rl_point < rl_end && !_rl_isident (rl_line_buffer[rl_point]) && !whitespace (rl_line_buffer[rl_point])); } rl_point = opoint; } return (0); } int rl_vi_insert_beg (int count, int key) { rl_beg_of_line (1, key); rl_vi_insert_mode (1, key); return (0); } static void _rl_vi_append_forward (int key) { _rl_vi_advance_point (); } int rl_vi_append_mode (int count, int key) { _rl_vi_append_forward (key); rl_vi_start_inserting (key, 1, rl_arg_sign); return (0); } int rl_vi_append_eol (int count, int key) { rl_end_of_line (1, key); rl_vi_append_mode (1, key); return (0); } /* What to do in the case of C-d. */ int rl_vi_eof_maybe (int count, int c) { return (rl_newline (1, '\n')); } /* Insertion mode stuff. */ /* Switching from one mode to the other really just involves switching keymaps. */ int rl_vi_insertion_mode (int count, int key) { _rl_keymap = vi_insertion_keymap; _rl_vi_last_key_before_insert = key; if (_rl_show_mode_in_prompt) _rl_reset_prompt (); return (0); } int rl_vi_insert_mode (int count, int key) { rl_vi_start_inserting (key, 1, rl_arg_sign); return (0); } static void vi_save_insert_buffer (int start, int len) { /* Same code as _rl_vi_save_insert below */ if (len >= vi_insert_buffer_size) { vi_insert_buffer_size += (len + 32) - (len % 32); vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size); } strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1); vi_insert_buffer[len-1] = '\0'; } static void _rl_vi_save_replace (void) { int len, start, end; UNDO_LIST *up; up = rl_undo_list; if (up == 0 || up->what != UNDO_END || vi_replace_count <= 0) { if (vi_insert_buffer_size >= 1) vi_insert_buffer[0] = '\0'; return; } /* Let's try it the quick and easy way for now. This should essentially accommodate every UNDO_INSERT and save the inserted text to vi_insert_buffer */ end = rl_point; start = end - vi_replace_count + 1; len = vi_replace_count + 1; if (start < 0) { len = end + 1; start = 0; } vi_save_insert_buffer (start, len); } static void _rl_vi_save_insert (UNDO_LIST *up) { int len, start, end; if (up == 0 || up->what != UNDO_INSERT) { if (vi_insert_buffer_size >= 1) vi_insert_buffer[0] = '\0'; return; } start = up->start; end = up->end; len = end - start + 1; vi_save_insert_buffer (start, len); } void _rl_vi_done_inserting (void) { if (_rl_vi_doing_insert) { /* The `c', `s', `S', and `R' commands set this. */ rl_end_undo_group (); /* for the group in rl_vi_start_inserting */ /* Now, the text between rl_undo_list->next->start and rl_undo_list->next->end is what was inserted while in insert mode. It gets copied to VI_INSERT_BUFFER because it depends on absolute indices into the line which may change (though they probably will not). */ _rl_vi_doing_insert = 0; if (_rl_vi_last_key_before_insert == 'R') _rl_vi_save_replace (); /* Half the battle */ else _rl_vi_save_insert (rl_undo_list->next); /* sanity check, should always be >= 1 here */ if (_rl_undo_group_level > 0) rl_end_undo_group (); /* for the group in the command (change or replace) */ } else { if (rl_undo_list && (_rl_vi_last_key_before_insert == 'i' || _rl_vi_last_key_before_insert == 'a' || _rl_vi_last_key_before_insert == 'I' || _rl_vi_last_key_before_insert == 'A')) _rl_vi_save_insert (rl_undo_list); /* XXX - Other keys probably need to be checked. */ else if (_rl_vi_last_key_before_insert == 'C') rl_end_undo_group (); } /* Sanity check, make sure all the undo groups are closed before we leave insert mode */ while (_rl_undo_group_level > 0) rl_end_undo_group (); } int rl_vi_movement_mode (int count, int key) { if (rl_point > 0) rl_backward_char (1, key); _rl_keymap = vi_movement_keymap; _rl_vi_done_inserting (); /* This is how POSIX.2 says `U' should behave -- everything up until the first time you go into command mode should not be undone. */ if (RL_ISSTATE (RL_STATE_VICMDONCE) == 0) rl_free_undo_list (); if (_rl_show_mode_in_prompt) _rl_reset_prompt (); RL_SETSTATE (RL_STATE_VICMDONCE); return (0); } int rl_vi_arg_digit (int count, int c) { if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg) return (rl_beg_of_line (1, c)); else return (rl_digit_argument (count, c)); } /* Change the case of the next COUNT characters. */ #if defined (HANDLE_MULTIBYTE) static int _rl_vi_change_mbchar_case (int count) { WCHAR_T wc; char mb[MB_LEN_MAX+1]; int mlen, p; size_t m; mbstate_t ps; memset (&ps, 0, sizeof (mbstate_t)); if (_rl_adjust_point (rl_line_buffer, rl_point, &ps) > 0) count--; while (count-- && rl_point < rl_end) { m = MBRTOWC (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps); if (MB_INVALIDCH (m)) wc = (WCHAR_T)rl_line_buffer[rl_point]; else if (MB_NULLWCH (m)) wc = L'\0'; if (iswupper (wc)) wc = towlower (wc); else if (iswlower (wc)) wc = towupper (wc); else { /* Just skip over chars neither upper nor lower case */ rl_forward_char (1, 0); continue; } /* Vi is kind of strange here. */ if (wc) { p = rl_point; mlen = WCRTOMB (mb, wc, &ps); if (mlen >= 0) mb[mlen] = '\0'; rl_begin_undo_group (); rl_vi_delete (1, 0); if (rl_point < p) /* Did we retreat at EOL? */ _rl_vi_advance_point (); rl_insert_text (mb); rl_end_undo_group (); rl_vi_check (); } else rl_forward_char (1, 0); } return 0; } #endif int rl_vi_change_case (int count, int ignore) { int c, p; /* Don't try this on an empty line. */ if (rl_point >= rl_end) return (0); c = 0; #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) return (_rl_vi_change_mbchar_case (count)); #endif while (count-- && rl_point < rl_end) { if (_rl_uppercase_p (rl_line_buffer[rl_point])) c = _rl_to_lower (rl_line_buffer[rl_point]); else if (_rl_lowercase_p (rl_line_buffer[rl_point])) c = _rl_to_upper (rl_line_buffer[rl_point]); else { /* Just skip over characters neither upper nor lower case. */ rl_forward_char (1, c); continue; } /* Vi is kind of strange here. */ if (c) { p = rl_point; rl_begin_undo_group (); rl_vi_delete (1, c); if (rl_point < p) /* Did we retreat at EOL? */ rl_point++; _rl_insert_char (1, c); rl_end_undo_group (); rl_vi_check (); } else rl_forward_char (1, c); } return (0); } int rl_vi_put (int count, int key) { if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end)) rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); while (count--) rl_yank (1, key); rl_backward_char (1, key); return (0); } /* Move the cursor back one character if you're at the end of the line */ int rl_vi_check (void) { if (rl_point && rl_point == rl_end) _rl_vi_backup (); return (0); } /* Move to the character position specified by COUNT */ int rl_vi_column (int count, int key) { if (count > rl_end) rl_end_of_line (1, key); else { rl_point = 0; rl_point = _rl_forward_char_internal (count - 1); } return (0); } /* Process C as part of the current numeric argument. Return -1 if the argument should be aborted, 0 if we should not read any more chars, and 1 if we should continue to read chars. */ static int _rl_vi_arg_dispatch (int c) { int key; key = c; if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument) { rl_numeric_arg *= 4; return 1; } c = UNMETA (c); if (_rl_digit_p (c)) { if (rl_explicit_arg) rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c); else rl_numeric_arg = _rl_digit_value (c); rl_explicit_arg = 1; return 1; /* keep going */ } else { rl_restore_prompt (); rl_clear_message (); rl_stuff_char (key); return 0; /* done */ } } /* A simplified loop for vi. Don't dispatch key at end. Don't recognize minus sign? Should this do rl_save_prompt/rl_restore_prompt? */ static int rl_digit_loop1 (void) { int c, r; while (1) { if (_rl_arg_overflow ()) return 1; c = _rl_arg_getchar (); r = _rl_vi_arg_dispatch (c); if (r <= 0) break; } RL_UNSETSTATE(RL_STATE_NUMERICARG); return (0); } /* This set of functions is basically to handle the commands that take a motion argument while in callback mode: read the command, read the motion command modifier, find the extent of the text to affect, and dispatch the command for execution. */ static void _rl_mvcxt_init (_rl_vimotion_cxt *m, int op, int key) { m->op = op; m->state = m->flags = 0; m->ncxt = 0; m->numeric_arg = -1; m->start = rl_point; m->end = rl_end; m->key = key; m->motion = -1; } static _rl_vimotion_cxt * _rl_mvcxt_alloc (int op, int key) { _rl_vimotion_cxt *m; m = xmalloc (sizeof (_rl_vimotion_cxt)); _rl_mvcxt_init (m, op, key); return m; } static void _rl_mvcxt_dispose (_rl_vimotion_cxt *m) { xfree (m); } static inline int vi_charsearch_command (int c) { switch (c) { case 'f': case 'F': case 't': case 'T': case ';': case ',': return 1; default: return 0; } } static int rl_domove_motion_callback (_rl_vimotion_cxt *m) { int c, r, opoint; _rl_vi_last_motion = c = m->motion; /* Append a blank character temporarily so that the motion routines work right at the end of the line. Original value of rl_end is saved as m->end. */ rl_extend_line_buffer (rl_end + 1); rl_line_buffer[rl_end++] = ' '; rl_line_buffer[rl_end] = '\0'; opoint = rl_point; r = _rl_dispatch (c, _rl_keymap); /* Note in the context that the motion command failed. Right now we only do this for unsuccessful searches (ones where _rl_dispatch returns non-zero and point doesn't move). */ if (r != 0 && rl_point == opoint && vi_charsearch_command (c)) m->flags |= MOVE_FAILED; #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) { /* Messy case where char search can be vi motion command; see rest of details in callback.c. vi_char_search and callback_char_search just set and unset the CHARSEARCH state. This is where any vi motion command that needs to set its own state should be handled, with any corresponding code to manage that state in callback.c */ if (RL_ISSTATE (RL_STATE_CHARSEARCH)) return 0; else return (_rl_vi_domove_motion_cleanup (c, m)); } #endif return (_rl_vi_domove_motion_cleanup (c, m)); } int _rl_vi_domove_motion_cleanup (int c, _rl_vimotion_cxt *m) { int r; /* Remove the blank that we added in rl_domove_motion_callback. */ rl_end = m->end; rl_line_buffer[rl_end] = '\0'; _rl_fix_point (0); /* No change in position means the command failed. */ if (rl_mark == rl_point) { /* 'c' and 'C' enter insert mode after the delete even if the motion didn't delete anything, as long as the motion command is valid. */ if (_rl_to_upper (m->key) == 'C' && _rl_vi_motion_command (c) && (m->flags & MOVE_FAILED) == 0) return (vidomove_dispatch (m)); /* 'd' and 'D' must delete at least one character even if the motion command doesn't move the cursor. */ if (_rl_to_upper (m->key) == 'D' && _rl_vi_motion_command (c) && (m->flags & MOVE_FAILED) == 0) return (vidomove_dispatch (m)); /* 'y' and 'Y' must yank at least one character even if the motion command doean't move the cursor. */ if (_rl_to_upper (m->key) == 'Y' && _rl_vi_motion_command (c) && (m->flags & MOVE_FAILED) == 0) return (vidomove_dispatch (m)); RL_UNSETSTATE (RL_STATE_VIMOTION); return (-1); } /* rl_vi_f[wW]ord () leaves the cursor on the first character of the next word. If we are not at the end of the line, and we are on a non-whitespace character, move back one (presumably to whitespace). */ if ((_rl_to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark && !whitespace (rl_line_buffer[rl_point])) rl_point--; /* XXX */ /* If cw or cW, back up to the end of a word, so the behaviour of ce or cE is the actual result. Brute-force, no subtlety. */ if (m->key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W')) { /* Don't move farther back than where we started. */ while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point])) rl_point--; /* Posix.2 says that if cw or cW moves the cursor towards the end of the line, the character under the cursor should be deleted. */ if (rl_point == rl_mark) _rl_vi_advance_point (); else { /* Move past the end of the word so that the kill doesn't remove the last letter of the previous word. Only do this if we are not at the end of the line. */ if (rl_point >= 0 && rl_point < (rl_end - 1) && !whitespace (rl_line_buffer[rl_point])) _rl_vi_advance_point (); } } if (rl_mark < rl_point) SWAP (rl_point, rl_mark); #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) (*rl_redisplay_function)(); /* make sure motion is displayed */ #endif r = vidomove_dispatch (m); return (r); } #define RL_VIMOVENUMARG() (RL_ISSTATE (RL_STATE_VIMOTION) && RL_ISSTATE (RL_STATE_NUMERICARG)) static int rl_domove_read_callback (_rl_vimotion_cxt *m) { int c, save; c = m->motion; if (member (c, vi_motion)) { #if defined (READLINE_CALLBACKS) /* If we just read a vi-mode motion command numeric argument, turn off the `reading numeric arg' state */ if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG()) RL_UNSETSTATE (RL_STATE_NUMERICARG); #endif /* Should do everything, including turning off RL_STATE_VIMOTION */ return (rl_domove_motion_callback (m)); } else if (m->key == c && (m->key == 'd' || m->key == 'y' || m->key == 'c')) { rl_mark = rl_end; rl_beg_of_line (1, c); _rl_vi_last_motion = c; RL_UNSETSTATE (RL_STATE_VIMOTION); return (vidomove_dispatch (m)); } #if defined (READLINE_CALLBACKS) /* XXX - these need to handle rl_universal_argument bindings */ /* Reading vi motion char continuing numeric argument */ else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG()) { return (_rl_vi_arg_dispatch (c)); } /* Readine vi motion char starting numeric argument */ else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_VIMOTION) && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)) { _rl_arg_init (); return (_rl_vi_arg_dispatch (c)); } #endif else if (_rl_digit_p (c)) { /* This code path taken when not in callback mode */ save = rl_numeric_arg; rl_numeric_arg = _rl_digit_value (c); rl_explicit_arg = 1; _rl_arg_init (); rl_digit_loop1 (); rl_numeric_arg *= save; c = rl_vi_domove_getchar (m); if (c < 0) { m->motion = 0; return -1; } else if (member (c, vi_motion) == 0) { m->motion = 0; RL_UNSETSTATE (RL_STATE_VIMOTION); RL_UNSETSTATE (RL_STATE_NUMERICARG); return (1); } m->motion = c; return (rl_domove_motion_callback (m)); } else { RL_UNSETSTATE (RL_STATE_VIMOTION); RL_UNSETSTATE (RL_STATE_NUMERICARG); return (1); } } static int rl_vi_domove_getchar (_rl_vimotion_cxt *m) { return (_rl_bracketed_read_key ()); } #if defined (READLINE_CALLBACKS) int _rl_vi_domove_callback (_rl_vimotion_cxt *m) { int c, r; m->motion = c = rl_vi_domove_getchar (m); if (c < 0) return 1; /* EOF */ r = rl_domove_read_callback (m); return ((r == 0) ? r : 1); /* normalize return values */ } #endif /* This code path is taken when not in callback mode. */ int rl_vi_domove (int x, int *ignore) { _rl_vimotion_cxt *m; m = _rl_vimvcxt; *ignore = m->motion = rl_vi_domove_getchar (m); if (m->motion < 0) { m->motion = 0; return -1; } return (rl_domove_read_callback (m)); } static int vi_delete_dispatch (_rl_vimotion_cxt *m) { /* These are the motion commands that do not require adjusting the mark. */ if (((strchr (" l|h^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) && (rl_mark < rl_end)) INCREMENT_POS (rl_mark); rl_kill_text (rl_point, rl_mark); return (0); } int rl_vi_delete_to (int count, int key) { int c, r; _rl_vimotion_cxt *savecxt; savecxt = 0; if (_rl_vi_redoing) { savecxt = _rl_vimvcxt; _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key); } else if (_rl_vimvcxt) { /* are we being called recursively or by `y' or `c'? */ savecxt = _rl_vimvcxt; _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key); } else _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key); _rl_vimvcxt->start = rl_point; rl_mark = rl_point; if (_rl_uppercase_p (key)) { _rl_vimvcxt->motion = '$'; r = rl_domove_motion_callback (_rl_vimvcxt); } else if (_rl_vi_redoing && _rl_vi_last_motion != 'd') /* `dd' is special */ { _rl_vimvcxt->motion = _rl_vi_last_motion; r = rl_domove_motion_callback (_rl_vimvcxt); } else if (_rl_vi_redoing) /* handle redoing `dd' here */ { _rl_vimvcxt->motion = _rl_vi_last_motion; rl_mark = rl_end; rl_beg_of_line (1, key); RL_UNSETSTATE (RL_STATE_VIMOTION); r = vidomove_dispatch (_rl_vimvcxt); } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { RL_SETSTATE (RL_STATE_VIMOTION); return (0); } #endif else r = rl_vi_domove (key, &c); if (r < 0) { rl_ding (); r = -1; } _rl_mvcxt_dispose (_rl_vimvcxt); _rl_vimvcxt = savecxt; return r; } static int vi_change_dispatch (_rl_vimotion_cxt *m) { /* These are the motion commands that do not require adjusting the mark. c[wW] are handled by special-case code in rl_vi_domove(), and already leave the mark at the correct location. */ if (((strchr (" l|hwW^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) && (rl_mark < rl_end)) INCREMENT_POS (rl_mark); /* The cursor never moves with c[wW]. */ if ((_rl_to_upper (m->motion) == 'W') && rl_point < m->start) rl_point = m->start; if (_rl_vi_redoing) { if (vi_insert_buffer && *vi_insert_buffer) rl_begin_undo_group (); rl_delete_text (rl_point, rl_mark); if (vi_insert_buffer && *vi_insert_buffer) { rl_insert_text (vi_insert_buffer); rl_end_undo_group (); } } else { rl_begin_undo_group (); /* to make the `u' command work */ rl_kill_text (rl_point, rl_mark); /* `C' does not save the text inserted for undoing or redoing. */ if (_rl_uppercase_p (m->key) == 0) _rl_vi_doing_insert = 1; /* XXX -- TODO -- use m->numericarg? */ rl_vi_start_inserting (m->key, rl_numeric_arg, rl_arg_sign); } return (0); } int rl_vi_change_to (int count, int key) { int c, r; _rl_vimotion_cxt *savecxt; savecxt = 0; if (_rl_vi_redoing) { savecxt = _rl_vimvcxt; _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key); } else if (_rl_vimvcxt) { /* are we being called recursively or by `y' or `d'? */ savecxt = _rl_vimvcxt; _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key); } else _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key); _rl_vimvcxt->start = rl_point; rl_mark = rl_point; if (_rl_uppercase_p (key)) { _rl_vimvcxt->motion = '$'; r = rl_domove_motion_callback (_rl_vimvcxt); } else if (_rl_vi_redoing && _rl_vi_last_motion != 'c') /* `cc' is special */ { _rl_vimvcxt->motion = _rl_vi_last_motion; r = rl_domove_motion_callback (_rl_vimvcxt); } else if (_rl_vi_redoing) /* handle redoing `cc' here */ { _rl_vimvcxt->motion = _rl_vi_last_motion; rl_mark = rl_end; rl_beg_of_line (1, key); RL_UNSETSTATE (RL_STATE_VIMOTION); r = vidomove_dispatch (_rl_vimvcxt); } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { RL_SETSTATE (RL_STATE_VIMOTION); return (0); } #endif else r = rl_vi_domove (key, &c); if (r < 0) { rl_ding (); r = -1; /* normalize return value */ } _rl_mvcxt_dispose (_rl_vimvcxt); _rl_vimvcxt = savecxt; return r; } static int vi_yank_dispatch (_rl_vimotion_cxt *m) { /* These are the motion commands that do not require adjusting the mark. */ if (((strchr (" l|h^0%bBFT`", m->motion) == 0) && (rl_point >= m->start)) && (rl_mark < rl_end)) INCREMENT_POS (rl_mark); rl_begin_undo_group (); rl_kill_text (rl_point, rl_mark); rl_end_undo_group (); rl_do_undo (); rl_point = m->start; _rl_fix_point (1); return (0); } int rl_vi_yank_to (int count, int key) { int c, r; _rl_vimotion_cxt *savecxt; savecxt = 0; if (_rl_vi_redoing) { savecxt = _rl_vimvcxt; _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key); } else if (_rl_vimvcxt) { /* are we being called recursively or by `c' or `d'? */ savecxt = _rl_vimvcxt; _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key); } else _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key); _rl_vimvcxt->start = rl_point; rl_mark = rl_point; if (_rl_uppercase_p (key)) { _rl_vimvcxt->motion = '$'; r = rl_domove_motion_callback (_rl_vimvcxt); } else if (_rl_vi_redoing && _rl_vi_last_motion != 'y') /* `yy' is special */ { _rl_vimvcxt->motion = _rl_vi_last_motion; r = rl_domove_motion_callback (_rl_vimvcxt); } else if (_rl_vi_redoing) /* handle redoing `yy' here */ { _rl_vimvcxt->motion = _rl_vi_last_motion; rl_mark = rl_end; rl_beg_of_line (1, key); RL_UNSETSTATE (RL_STATE_VIMOTION); r = vidomove_dispatch (_rl_vimvcxt); } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { RL_SETSTATE (RL_STATE_VIMOTION); return (0); } #endif else r = rl_vi_domove (key, &c); if (r < 0) { rl_ding (); r = -1; } _rl_mvcxt_dispose (_rl_vimvcxt); _rl_vimvcxt = savecxt; return r; } static int vidomove_dispatch (_rl_vimotion_cxt *m) { int r; switch (m->op) { case VIM_DELETE: r = vi_delete_dispatch (m); break; case VIM_CHANGE: r = vi_change_dispatch (m); break; case VIM_YANK: r = vi_yank_dispatch (m); break; default: _rl_errmsg ("vidomove_dispatch: unknown operator %d", m->op); r = 1; break; } RL_UNSETSTATE (RL_STATE_VIMOTION); return r; } int rl_vi_rubout (int count, int key) { int opoint; if (count < 0) return (rl_vi_delete (-count, key)); if (rl_point == 0) { rl_ding (); return 1; } opoint = rl_point; if (count > 1 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_backward_char (count, key); else if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); else rl_point -= count; if (rl_point < 0) rl_point = 0; rl_kill_text (rl_point, opoint); return (0); } int rl_vi_delete (int count, int key) { int end; if (count < 0) return (rl_vi_rubout (-count, key)); if (rl_end == 0) { rl_ding (); return 1; } if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); else end = rl_point + count; if (end >= rl_end) end = rl_end; rl_kill_text (rl_point, end); if (rl_point > 0 && rl_point == rl_end) rl_backward_char (1, key); return (0); } /* This does what Posix specifies vi-mode C-w to do: using whitespace and punctuation characters as the word boundaries. */ #define vi_unix_word_boundary(c) (whitespace(c) || ispunct(c)) int rl_vi_unix_word_rubout (int count, int key) { int orig_point; if (rl_point == 0) rl_ding (); else { orig_point = rl_point; if (count <= 0) count = 1; while (count--) { /* This isn't quite what ksh93 does but it seems to match what the Posix description of sh specifies, with a few accommodations for sequences of whitespace characters between words and at the end of the line. */ /* Skip over whitespace at the end of the line as a special case */ if (rl_point > 0 && (rl_line_buffer[rl_point] == 0) && whitespace (rl_line_buffer[rl_point - 1])) while (--rl_point > 0 && whitespace (rl_line_buffer[rl_point])) ; /* If we're at the start of a word, move back to word boundary so we move back to the `preceding' word */ if (rl_point > 0 && (vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0) && vi_unix_word_boundary (rl_line_buffer[rl_point - 1])) rl_point--; /* If we are at a word boundary (whitespace/punct), move backward past a sequence of word boundary characters. If we are at the end of a word (non-word boundary), move back to a word boundary */ if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point])) while (rl_point && vi_unix_word_boundary (rl_line_buffer[rl_point - 1])) rl_point--; else if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0) while (rl_point > 0 && (vi_unix_word_boundary (rl_line_buffer[rl_point - 1]) == 0)) _rl_vi_backup_point (); } rl_kill_text (orig_point, rl_point); } return 0; } int rl_vi_back_to_indent (int count, int key) { rl_beg_of_line (1, key); while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) rl_point++; return (0); } int rl_vi_first_print (int count, int key) { return (rl_vi_back_to_indent (1, key)); } static int _rl_cs_dir, _rl_cs_orig_dir; #if defined (READLINE_CALLBACKS) static int _rl_vi_callback_char_search (_rl_callback_generic_arg *data) { int c; #if defined (HANDLE_MULTIBYTE) c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); #else RL_SETSTATE(RL_STATE_MOREINPUT); c = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); #endif if (c <= 0) { /* XXX - unset _rl_callback_func here? */ RL_UNSETSTATE (RL_STATE_CHARSEARCH); return -1; } #if !defined (HANDLE_MULTIBYTE) _rl_vi_last_search_char = c; #endif _rl_callback_func = 0; _rl_want_redisplay = 1; RL_UNSETSTATE (RL_STATE_CHARSEARCH); #if defined (HANDLE_MULTIBYTE) return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_mbchar, _rl_vi_last_search_mblen)); #else return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_char)); #endif } #endif int rl_vi_char_search (int count, int key) { int c; #if defined (HANDLE_MULTIBYTE) static char *target; static int tlen; #else static char target; #endif if (key == ';' || key == ',') { if (_rl_cs_orig_dir == 0) return 1; #if defined (HANDLE_MULTIBYTE) if (_rl_vi_last_search_mblen == 0) return 1; #else if (_rl_vi_last_search_char == 0) return 1; #endif _rl_cs_dir = (key == ';') ? _rl_cs_orig_dir : -_rl_cs_orig_dir; } else { switch (key) { case 't': _rl_cs_orig_dir = _rl_cs_dir = FTO; break; case 'T': _rl_cs_orig_dir = _rl_cs_dir = BTO; break; case 'f': _rl_cs_orig_dir = _rl_cs_dir = FFIND; break; case 'F': _rl_cs_orig_dir = _rl_cs_dir = BFIND; break; } if (_rl_vi_redoing) { /* set target and tlen below */ } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_callback_data = _rl_callback_data_alloc (count); _rl_callback_data->i1 = _rl_cs_dir; _rl_callback_data->i2 = key; _rl_callback_func = _rl_vi_callback_char_search; RL_SETSTATE (RL_STATE_CHARSEARCH); return (0); } #endif else { #if defined (HANDLE_MULTIBYTE) c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); if (c <= 0) return -1; _rl_vi_last_search_mblen = c; #else RL_SETSTATE(RL_STATE_MOREINPUT); c = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (c < 0) return -1; _rl_vi_last_search_char = c; #endif } } #if defined (HANDLE_MULTIBYTE) target = _rl_vi_last_search_mbchar; tlen = _rl_vi_last_search_mblen; #else target = _rl_vi_last_search_char; #endif #if defined (HANDLE_MULTIBYTE) return (_rl_char_search_internal (count, _rl_cs_dir, target, tlen)); #else return (_rl_char_search_internal (count, _rl_cs_dir, target)); #endif } /* Match brackets */ int rl_vi_match (int ignore, int key) { int count = 1, brack, pos, tmp, pre; pos = rl_point; if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) { if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) { pre = rl_point; rl_forward_char (1, key); if (pre == rl_point) break; } } else while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 && rl_point < rl_end - 1) rl_forward_char (1, key); if (brack <= 0) { rl_point = pos; rl_ding (); return 1; } } pos = rl_point; if (brack < 0) { while (count) { tmp = pos; if (MB_CUR_MAX == 1 || rl_byte_oriented) pos--; else { pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); if (tmp == pos) pos--; } if (pos >= 0) { int b = rl_vi_bracktype (rl_line_buffer[pos]); if (b == -brack) count--; else if (b == brack) count++; } else { rl_ding (); return 1; } } } else { /* brack > 0 */ while (count) { if (MB_CUR_MAX == 1 || rl_byte_oriented) pos++; else pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY); if (pos < rl_end) { int b = rl_vi_bracktype (rl_line_buffer[pos]); if (b == -brack) count--; else if (b == brack) count++; } else { rl_ding (); return 1; } } } rl_point = pos; return (0); } int rl_vi_bracktype (int c) { switch (c) { case '(': return 1; case ')': return -1; case '[': return 2; case ']': return -2; case '{': return 3; case '}': return -3; default: return 0; } } static int _rl_vi_change_char (int count, int c, char *mb) { int p; if (c == '\033' || c == CTRL ('C')) return -1; rl_begin_undo_group (); while (count-- && rl_point < rl_end) { p = rl_point; rl_vi_delete (1, c); if (rl_point < p) /* Did we retreat at EOL? */ _rl_vi_append_forward (c); #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) rl_insert_text (mb); else #endif _rl_insert_char (1, c); } /* The cursor shall be left on the last character changed. */ rl_backward_char (1, c); rl_end_undo_group (); return (0); } static int _rl_vi_callback_getchar (char *mb, int mlen) { return (_rl_bracketed_read_mbstring (mb, mlen)); } #if defined (READLINE_CALLBACKS) static int _rl_vi_callback_change_char (_rl_callback_generic_arg *data) { int c; char mb[MB_LEN_MAX+1]; c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); if (c < 0) return -1; #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) strncpy (_rl_vi_last_replacement, mb, MB_LEN_MAX); else #endif _rl_vi_last_replacement[0] = c; _rl_vi_last_replacement[MB_LEN_MAX] = '\0'; /* XXX */ _rl_callback_func = 0; _rl_want_redisplay = 1; return (_rl_vi_change_char (data->count, c, mb)); } #endif int rl_vi_change_char (int count, int key) { int c; char mb[MB_LEN_MAX+1]; if (_rl_vi_redoing) { strncpy (mb, _rl_vi_last_replacement, MB_LEN_MAX); c = (unsigned char)_rl_vi_last_replacement[0]; /* XXX */ mb[MB_LEN_MAX] = '\0'; } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_callback_data = _rl_callback_data_alloc (count); _rl_callback_func = _rl_vi_callback_change_char; return (0); } #endif else { c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); if (c < 0) return -1; #ifdef HANDLE_MULTIBYTE if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) strncpy (_rl_vi_last_replacement, mb, MB_LEN_MAX); else #endif _rl_vi_last_replacement[0] = c; _rl_vi_last_replacement[MB_LEN_MAX] = '\0'; /* just in case */ } if (c < 0) return -1; return (_rl_vi_change_char (count, c, mb)); } int rl_vi_subst (int count, int key) { /* If we are redoing, rl_vi_change_to will stuff the last motion char */ if (_rl_vi_redoing == 0) rl_stuff_char ((key == 'S') ? 'c' : 'l'); /* `S' == `cc', `s' == `cl' */ return (rl_vi_change_to (count, 'c')); } int rl_vi_overstrike (int count, int key) { if (_rl_vi_doing_insert == 0) { _rl_vi_doing_insert = 1; rl_begin_undo_group (); } if (count > 0) { if (_rl_overwrite_char (count, key) != 0) return (1); vi_replace_count += count; } return (0); } int rl_vi_overstrike_delete (int count, int key) { int i, s; for (i = 0; i < count; i++) { if (vi_replace_count == 0) { rl_ding (); break; } s = rl_point; if (rl_do_undo ()) vi_replace_count--; /* XXX */ if (rl_point == s) rl_backward_char (1, key); } if (vi_replace_count == 0 && _rl_vi_doing_insert) { rl_end_undo_group (); rl_do_undo (); _rl_vi_doing_insert = 0; } return (0); } static int rl_vi_overstrike_kill_line (int count, int key) { int r, end; end = rl_end; r = rl_unix_line_discard (count, key); vi_replace_count -= end - rl_end; return r; } static int rl_vi_overstrike_kill_word (int count, int key) { int r, end; end = rl_end; r = rl_vi_unix_word_rubout (count, key); vi_replace_count -= end - rl_end; return r; } static int rl_vi_overstrike_yank (int count, int key) { int r, end; end = rl_end; r = rl_yank (count, key); vi_replace_count += rl_end - end; return r; } /* Read bracketed paste mode pasted text and insert it in overwrite mode */ static int rl_vi_overstrike_bracketed_paste (int count, int key) { int r; char *pbuf; size_t pblen; pbuf = _rl_bracketed_text (&pblen); if (pblen == 0) { xfree (pbuf); return 0; } r = pblen; while (--r >= 0) _rl_unget_char ((unsigned char)pbuf[r]); xfree (pbuf); while (_rl_pushed_input_available ()) { key = rl_read_key (); r = rl_vi_overstrike (1, key); } return r; } int rl_vi_replace (int count, int key) { int i; vi_replace_count = 0; if (vi_replace_map == 0) { vi_replace_map = rl_make_bare_keymap (); for (i = 0; i < ' '; i++) if (vi_insertion_keymap[i].type == ISFUNC) vi_replace_map[i].function = vi_insertion_keymap[i].function; for (i = ' '; i < KEYMAP_SIZE; i++) vi_replace_map[i].function = rl_vi_overstrike; vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete; /* Make sure these are what we want. */ vi_replace_map[ESC].function = rl_vi_movement_mode; vi_replace_map[RETURN].function = rl_newline; vi_replace_map[NEWLINE].function = rl_newline; /* If the normal vi insertion keymap has ^H bound to erase, do the same here. Probably should remove the assignment to RUBOUT up there, but I don't think it will make a difference in real life. */ if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC && vi_insertion_keymap[CTRL ('H')].function == rl_rubout) vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete; /* Same for ^U and unix-line-discard. */ if (vi_insertion_keymap[CTRL ('U')].type == ISFUNC && vi_insertion_keymap[CTRL ('U')].function == rl_unix_line_discard) vi_replace_map[CTRL ('U')].function = rl_vi_overstrike_kill_line; /* And for ^W and unix-word-rubout. */ if (vi_insertion_keymap[CTRL ('W')].type == ISFUNC && vi_insertion_keymap[CTRL ('W')].function == rl_vi_unix_word_rubout) vi_replace_map[CTRL ('W')].function = rl_vi_overstrike_kill_word; /* And finally for ^Y and yank. */ if (vi_insertion_keymap[CTRL ('Y')].type == ISFUNC && vi_insertion_keymap[CTRL ('Y')].function == rl_yank) vi_replace_map[CTRL ('Y')].function = rl_vi_overstrike_yank; /* Make sure this is the value we need. */ vi_replace_map[ANYOTHERKEY].type = ISFUNC; vi_replace_map[ANYOTHERKEY].function = (rl_command_func_t *)NULL; } rl_vi_start_inserting (key, 1, rl_arg_sign); _rl_vi_last_key_before_insert = 'R'; /* in case someone rebinds it */ _rl_keymap = vi_replace_map; if (_rl_enable_bracketed_paste) rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_vi_overstrike_bracketed_paste); return (0); } #if 0 /* Try to complete the word we are standing on or the word that ends with the previous character. A space matches everything. Word delimiters are space and ;. */ int rl_vi_possible_completions (void) { int save_pos = rl_point; if (rl_line_buffer[rl_point] != ' ' && rl_line_buffer[rl_point] != ';') { while (rl_point < rl_end && rl_line_buffer[rl_point] != ' ' && rl_line_buffer[rl_point] != ';') _rl_vi_advance_point (); } else if (rl_line_buffer[rl_point - 1] == ';') { rl_ding (); return (0); } rl_possible_completions (); rl_point = save_pos; return (0); } #endif /* Functions to save and restore marks. */ static int _rl_vi_set_mark (void) { int ch; RL_SETSTATE(RL_STATE_MOREINPUT); ch = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ { rl_ding (); return 1; } ch -= 'a'; vi_mark_chars[ch] = rl_point; return 0; } #if defined (READLINE_CALLBACKS) static int _rl_vi_callback_set_mark (_rl_callback_generic_arg *data) { _rl_callback_func = 0; _rl_want_redisplay = 1; return (_rl_vi_set_mark ()); } #endif int rl_vi_set_mark (int count, int key) { #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_callback_data = 0; _rl_callback_func = _rl_vi_callback_set_mark; return (0); } #endif return (_rl_vi_set_mark ()); } static int _rl_vi_goto_mark (void) { int ch; RL_SETSTATE(RL_STATE_MOREINPUT); ch = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (ch == '`') { rl_point = rl_mark; _rl_fix_point (1); return 0; } else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ { rl_ding (); return 1; } ch -= 'a'; if (vi_mark_chars[ch] == -1) { rl_ding (); return 1; } rl_point = vi_mark_chars[ch]; _rl_fix_point (1); return 0; } #if defined (READLINE_CALLBACKS) static int _rl_vi_callback_goto_mark (_rl_callback_generic_arg *data) { _rl_callback_func = 0; _rl_want_redisplay = 1; return (_rl_vi_goto_mark ()); } #endif int rl_vi_goto_mark (int count, int key) { #if defined (READLINE_CALLBACKS) if (RL_ISSTATE (RL_STATE_CALLBACK)) { _rl_callback_data = 0; _rl_callback_func = _rl_vi_callback_goto_mark; return (0); } #endif return (_rl_vi_goto_mark ()); } #endif /* VI_MODE */ readline-8.3/emacs_keymap.c000644 000436 000024 00000111403 14520770140 016032 0ustar00chetstaff000000 000000 /* emacs_keymap.c -- the keymap for emacs_mode in readline (). */ /* Copyright (C) 1987-2017 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (BUFSIZ) #include #endif /* !BUFSIZ */ #include "readline.h" /* An array of function pointers, one for each possible key. If the type byte is ISKMAP, then the pointer is the address of a keymap. */ KEYMAP_ENTRY_ARRAY emacs_standard_keymap = { /* Control keys. */ { ISFUNC, rl_set_mark }, /* Control-@ */ { ISFUNC, rl_beg_of_line }, /* Control-a */ { ISFUNC, rl_backward_char }, /* Control-b */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ { ISFUNC, rl_delete }, /* Control-d */ { ISFUNC, rl_end_of_line }, /* Control-e */ { ISFUNC, rl_forward_char }, /* Control-f */ { ISFUNC, rl_abort }, /* Control-g */ { ISFUNC, rl_rubout }, /* Control-h */ { ISFUNC, rl_complete }, /* Control-i */ { ISFUNC, rl_newline }, /* Control-j */ { ISFUNC, rl_kill_line }, /* Control-k */ { ISFUNC, rl_clear_screen }, /* Control-l */ { ISFUNC, rl_newline }, /* Control-m */ { ISFUNC, rl_get_next_history }, /* Control-n */ { ISFUNC, rl_operate_and_get_next }, /* Control-o */ { ISFUNC, rl_get_previous_history }, /* Control-p */ { ISFUNC, rl_quoted_insert }, /* Control-q */ { ISFUNC, rl_reverse_search_history }, /* Control-r */ { ISFUNC, rl_forward_search_history }, /* Control-s */ { ISFUNC, rl_transpose_chars }, /* Control-t */ { ISFUNC, rl_unix_line_discard }, /* Control-u */ { ISFUNC, rl_quoted_insert }, /* Control-v */ { ISFUNC, rl_unix_word_rubout }, /* Control-w */ { ISKMAP, (rl_command_func_t *)emacs_ctlx_keymap }, /* Control-x */ { ISFUNC, rl_yank }, /* Control-y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ { ISKMAP, (rl_command_func_t *)emacs_meta_keymap }, /* Control-[ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ { ISFUNC, rl_char_search }, /* Control-] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ { ISFUNC, rl_undo_command }, /* Control-_ */ /* The start of printing characters. */ { ISFUNC, rl_insert }, /* SPACE */ { ISFUNC, rl_insert }, /* ! */ { ISFUNC, rl_insert }, /* " */ { ISFUNC, rl_insert }, /* # */ { ISFUNC, rl_insert }, /* $ */ { ISFUNC, rl_insert }, /* % */ { ISFUNC, rl_insert }, /* & */ { ISFUNC, rl_insert }, /* ' */ { ISFUNC, rl_insert }, /* ( */ { ISFUNC, rl_insert }, /* ) */ { ISFUNC, rl_insert }, /* * */ { ISFUNC, rl_insert }, /* + */ { ISFUNC, rl_insert }, /* , */ { ISFUNC, rl_insert }, /* - */ { ISFUNC, rl_insert }, /* . */ { ISFUNC, rl_insert }, /* / */ /* Regular digits. */ { ISFUNC, rl_insert }, /* 0 */ { ISFUNC, rl_insert }, /* 1 */ { ISFUNC, rl_insert }, /* 2 */ { ISFUNC, rl_insert }, /* 3 */ { ISFUNC, rl_insert }, /* 4 */ { ISFUNC, rl_insert }, /* 5 */ { ISFUNC, rl_insert }, /* 6 */ { ISFUNC, rl_insert }, /* 7 */ { ISFUNC, rl_insert }, /* 8 */ { ISFUNC, rl_insert }, /* 9 */ /* A little more punctuation. */ { ISFUNC, rl_insert }, /* : */ { ISFUNC, rl_insert }, /* ; */ { ISFUNC, rl_insert }, /* < */ { ISFUNC, rl_insert }, /* = */ { ISFUNC, rl_insert }, /* > */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* @ */ /* Uppercase alphabet. */ { ISFUNC, rl_insert }, /* A */ { ISFUNC, rl_insert }, /* B */ { ISFUNC, rl_insert }, /* C */ { ISFUNC, rl_insert }, /* D */ { ISFUNC, rl_insert }, /* E */ { ISFUNC, rl_insert }, /* F */ { ISFUNC, rl_insert }, /* G */ { ISFUNC, rl_insert }, /* H */ { ISFUNC, rl_insert }, /* I */ { ISFUNC, rl_insert }, /* J */ { ISFUNC, rl_insert }, /* K */ { ISFUNC, rl_insert }, /* L */ { ISFUNC, rl_insert }, /* M */ { ISFUNC, rl_insert }, /* N */ { ISFUNC, rl_insert }, /* O */ { ISFUNC, rl_insert }, /* P */ { ISFUNC, rl_insert }, /* Q */ { ISFUNC, rl_insert }, /* R */ { ISFUNC, rl_insert }, /* S */ { ISFUNC, rl_insert }, /* T */ { ISFUNC, rl_insert }, /* U */ { ISFUNC, rl_insert }, /* V */ { ISFUNC, rl_insert }, /* W */ { ISFUNC, rl_insert }, /* X */ { ISFUNC, rl_insert }, /* Y */ { ISFUNC, rl_insert }, /* Z */ /* Some more punctuation. */ { ISFUNC, rl_insert }, /* [ */ { ISFUNC, rl_insert }, /* \ */ { ISFUNC, rl_insert }, /* ] */ { ISFUNC, rl_insert }, /* ^ */ { ISFUNC, rl_insert }, /* _ */ { ISFUNC, rl_insert }, /* ` */ /* Lowercase alphabet. */ { ISFUNC, rl_insert }, /* a */ { ISFUNC, rl_insert }, /* b */ { ISFUNC, rl_insert }, /* c */ { ISFUNC, rl_insert }, /* d */ { ISFUNC, rl_insert }, /* e */ { ISFUNC, rl_insert }, /* f */ { ISFUNC, rl_insert }, /* g */ { ISFUNC, rl_insert }, /* h */ { ISFUNC, rl_insert }, /* i */ { ISFUNC, rl_insert }, /* j */ { ISFUNC, rl_insert }, /* k */ { ISFUNC, rl_insert }, /* l */ { ISFUNC, rl_insert }, /* m */ { ISFUNC, rl_insert }, /* n */ { ISFUNC, rl_insert }, /* o */ { ISFUNC, rl_insert }, /* p */ { ISFUNC, rl_insert }, /* q */ { ISFUNC, rl_insert }, /* r */ { ISFUNC, rl_insert }, /* s */ { ISFUNC, rl_insert }, /* t */ { ISFUNC, rl_insert }, /* u */ { ISFUNC, rl_insert }, /* v */ { ISFUNC, rl_insert }, /* w */ { ISFUNC, rl_insert }, /* x */ { ISFUNC, rl_insert }, /* y */ { ISFUNC, rl_insert }, /* z */ /* Final punctuation. */ { ISFUNC, rl_insert }, /* { */ { ISFUNC, rl_insert }, /* | */ { ISFUNC, rl_insert }, /* } */ { ISFUNC, rl_insert }, /* ~ */ { ISFUNC, rl_rubout }, /* RUBOUT */ #if KEYMAP_SIZE > 128 /* Pure 8-bit characters (128 - 159). These might be used in some character sets. */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ { ISFUNC, rl_insert }, /* ? */ /* ISO Latin-1 characters (160 - 255) */ { ISFUNC, rl_insert }, /* No-break space */ { ISFUNC, rl_insert }, /* Inverted exclamation mark */ { ISFUNC, rl_insert }, /* Cent sign */ { ISFUNC, rl_insert }, /* Pound sign */ { ISFUNC, rl_insert }, /* Currency sign */ { ISFUNC, rl_insert }, /* Yen sign */ { ISFUNC, rl_insert }, /* Broken bar */ { ISFUNC, rl_insert }, /* Section sign */ { ISFUNC, rl_insert }, /* Diaeresis */ { ISFUNC, rl_insert }, /* Copyright sign */ { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ { ISFUNC, rl_insert }, /* Not sign */ { ISFUNC, rl_insert }, /* Soft hyphen */ { ISFUNC, rl_insert }, /* Registered sign */ { ISFUNC, rl_insert }, /* Macron */ { ISFUNC, rl_insert }, /* Degree sign */ { ISFUNC, rl_insert }, /* Plus-minus sign */ { ISFUNC, rl_insert }, /* Superscript two */ { ISFUNC, rl_insert }, /* Superscript three */ { ISFUNC, rl_insert }, /* Acute accent */ { ISFUNC, rl_insert }, /* Micro sign */ { ISFUNC, rl_insert }, /* Pilcrow sign */ { ISFUNC, rl_insert }, /* Middle dot */ { ISFUNC, rl_insert }, /* Cedilla */ { ISFUNC, rl_insert }, /* Superscript one */ { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ { ISFUNC, rl_insert }, /* Vulgar fraction one half */ { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ { ISFUNC, rl_insert }, /* Inverted questionk mark */ { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ { ISFUNC, rl_insert }, /* Latin capital letter ae */ { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ { ISFUNC, rl_insert }, /* Multiplication sign */ { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ { ISFUNC, rl_insert }, /* Latin small letter a with grave */ { ISFUNC, rl_insert }, /* Latin small letter a with acute */ { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ { ISFUNC, rl_insert }, /* Latin small letter ae */ { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ { ISFUNC, rl_insert }, /* Latin small letter e with grave */ { ISFUNC, rl_insert }, /* Latin small letter e with acute */ { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter i with grave */ { ISFUNC, rl_insert }, /* Latin small letter i with acute */ { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ { ISFUNC, rl_insert }, /* Latin small letter o with grave */ { ISFUNC, rl_insert }, /* Latin small letter o with acute */ { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ { ISFUNC, rl_insert }, /* Division sign */ { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ { ISFUNC, rl_insert }, /* Latin small letter u with grave */ { ISFUNC, rl_insert }, /* Latin small letter u with acute */ { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ { ISFUNC, rl_insert }, /* Latin small letter y with acute */ { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ #endif /* KEYMAP_SIZE > 128 */ }; KEYMAP_ENTRY_ARRAY emacs_meta_keymap = { /* Meta keys. Just like above, but the high bit is set. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-@ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-a */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-b */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-c */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-d */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-e */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-f */ { ISFUNC, rl_abort }, /* Meta-Control-g */ { ISFUNC, rl_backward_kill_word }, /* Meta-Control-h */ { ISFUNC, rl_tab_insert }, /* Meta-Control-i */ { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-j */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-k */ { ISFUNC, rl_clear_display }, /* Meta-Control-l */ { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-m */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-n */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-o */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-p */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-q */ { ISFUNC, rl_revert_line }, /* Meta-Control-r */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-s */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-t */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-u */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-v */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-w */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-x */ { ISFUNC, rl_yank_nth_arg }, /* Meta-Control-y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-z */ { ISFUNC, rl_complete }, /* Meta-Control-[ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-\ */ { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-^ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-_ */ /* The start of printing characters. */ { ISFUNC, rl_set_mark }, /* Meta-SPACE */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-! */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-" */ { ISFUNC, rl_insert_comment }, /* Meta-# */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-$ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-% */ { ISFUNC, rl_tilde_expand }, /* Meta-& */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-' */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-( */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-) */ { ISFUNC, rl_insert_completions }, /* Meta-* */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-+ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-, */ { ISFUNC, rl_digit_argument }, /* Meta-- */ { ISFUNC, rl_yank_last_arg}, /* Meta-. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-/ */ /* Regular digits. */ { ISFUNC, rl_digit_argument }, /* Meta-0 */ { ISFUNC, rl_digit_argument }, /* Meta-1 */ { ISFUNC, rl_digit_argument }, /* Meta-2 */ { ISFUNC, rl_digit_argument }, /* Meta-3 */ { ISFUNC, rl_digit_argument }, /* Meta-4 */ { ISFUNC, rl_digit_argument }, /* Meta-5 */ { ISFUNC, rl_digit_argument }, /* Meta-6 */ { ISFUNC, rl_digit_argument }, /* Meta-7 */ { ISFUNC, rl_digit_argument }, /* Meta-8 */ { ISFUNC, rl_digit_argument }, /* Meta-9 */ /* A little more punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-: */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-; */ { ISFUNC, rl_beginning_of_history }, /* Meta-< */ { ISFUNC, rl_possible_completions }, /* Meta-= */ { ISFUNC, rl_end_of_history }, /* Meta-> */ { ISFUNC, rl_possible_completions }, /* Meta-? */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-@ */ /* Uppercase alphabet. */ { ISFUNC, rl_do_lowercase_version }, /* Meta-A */ { ISFUNC, rl_do_lowercase_version }, /* Meta-B */ { ISFUNC, rl_do_lowercase_version }, /* Meta-C */ { ISFUNC, rl_do_lowercase_version }, /* Meta-D */ { ISFUNC, rl_do_lowercase_version }, /* Meta-E */ { ISFUNC, rl_do_lowercase_version }, /* Meta-F */ { ISFUNC, rl_do_lowercase_version }, /* Meta-G */ { ISFUNC, rl_do_lowercase_version }, /* Meta-H */ { ISFUNC, rl_do_lowercase_version }, /* Meta-I */ { ISFUNC, rl_do_lowercase_version }, /* Meta-J */ { ISFUNC, rl_do_lowercase_version }, /* Meta-K */ { ISFUNC, rl_do_lowercase_version }, /* Meta-L */ { ISFUNC, rl_do_lowercase_version }, /* Meta-M */ { ISFUNC, rl_do_lowercase_version }, /* Meta-N */ { ISFUNC, rl_do_lowercase_version }, /* Meta-O */ { ISFUNC, rl_do_lowercase_version }, /* Meta-P */ { ISFUNC, rl_do_lowercase_version }, /* Meta-Q */ { ISFUNC, rl_do_lowercase_version }, /* Meta-R */ { ISFUNC, rl_do_lowercase_version }, /* Meta-S */ { ISFUNC, rl_do_lowercase_version }, /* Meta-T */ { ISFUNC, rl_do_lowercase_version }, /* Meta-U */ { ISFUNC, rl_do_lowercase_version }, /* Meta-V */ { ISFUNC, rl_do_lowercase_version }, /* Meta-W */ { ISFUNC, rl_do_lowercase_version }, /* Meta-X */ { ISFUNC, rl_do_lowercase_version }, /* Meta-Y */ { ISFUNC, rl_do_lowercase_version }, /* Meta-Z */ /* Some more punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-[ */ /* was rl_arrow_keys */ { ISFUNC, rl_delete_horizontal_space }, /* Meta-\ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-^ */ { ISFUNC, rl_yank_last_arg }, /* Meta-_ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-` */ /* Lowercase alphabet. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-a */ { ISFUNC, rl_backward_word }, /* Meta-b */ { ISFUNC, rl_capitalize_word }, /* Meta-c */ { ISFUNC, rl_kill_word }, /* Meta-d */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-e */ { ISFUNC, rl_forward_word }, /* Meta-f */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-g */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-h */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-i */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-j */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-k */ { ISFUNC, rl_downcase_word }, /* Meta-l */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-m */ { ISFUNC, rl_noninc_forward_search }, /* Meta-n */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-o */ /* was rl_arrow_keys */ { ISFUNC, rl_noninc_reverse_search }, /* Meta-p */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-q */ { ISFUNC, rl_revert_line }, /* Meta-r */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-s */ { ISFUNC, rl_transpose_words }, /* Meta-t */ { ISFUNC, rl_upcase_word }, /* Meta-u */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-v */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-w */ { ISFUNC, rl_execute_named_command }, /* Meta-x */ { ISFUNC, rl_yank_pop }, /* Meta-y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-z */ /* Final punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-{ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-| */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-} */ { ISFUNC, rl_tilde_expand }, /* Meta-~ */ { ISFUNC, rl_backward_kill_word }, /* Meta-rubout */ #if KEYMAP_SIZE > 128 /* Undefined keys. */ { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 } #endif /* KEYMAP_SIZE > 128 */ }; KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = { /* Control keys. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ { ISFUNC, rl_abort }, /* Control-g */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-j */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-k */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-m */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ { ISFUNC, rl_re_read_init_file }, /* Control-r */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ { ISFUNC, rl_undo_command }, /* Control-u */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ { ISFUNC, rl_exchange_point_and_mark }, /* Control-x */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-_ */ /* The start of printing characters. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ { ISFUNC, rl_start_kbd_macro }, /* ( */ { ISFUNC, rl_end_kbd_macro }, /* ) */ { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ /* Regular digits. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 0 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 1 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 2 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 3 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 4 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 5 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 6 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 7 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 8 */ { ISFUNC, (rl_command_func_t *)0x0 }, /* 9 */ /* A little more punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ /* Uppercase alphabet. */ { ISFUNC, rl_do_lowercase_version }, /* A */ { ISFUNC, rl_do_lowercase_version }, /* B */ { ISFUNC, rl_do_lowercase_version }, /* C */ { ISFUNC, rl_do_lowercase_version }, /* D */ { ISFUNC, rl_do_lowercase_version }, /* E */ { ISFUNC, rl_do_lowercase_version }, /* F */ { ISFUNC, rl_do_lowercase_version }, /* G */ { ISFUNC, rl_do_lowercase_version }, /* H */ { ISFUNC, rl_do_lowercase_version }, /* I */ { ISFUNC, rl_do_lowercase_version }, /* J */ { ISFUNC, rl_do_lowercase_version }, /* K */ { ISFUNC, rl_do_lowercase_version }, /* L */ { ISFUNC, rl_do_lowercase_version }, /* M */ { ISFUNC, rl_do_lowercase_version }, /* N */ { ISFUNC, rl_do_lowercase_version }, /* O */ { ISFUNC, rl_do_lowercase_version }, /* P */ { ISFUNC, rl_do_lowercase_version }, /* Q */ { ISFUNC, rl_do_lowercase_version }, /* R */ { ISFUNC, rl_do_lowercase_version }, /* S */ { ISFUNC, rl_do_lowercase_version }, /* T */ { ISFUNC, rl_do_lowercase_version }, /* U */ { ISFUNC, rl_do_lowercase_version }, /* V */ { ISFUNC, rl_do_lowercase_version }, /* W */ { ISFUNC, rl_do_lowercase_version }, /* X */ { ISFUNC, rl_do_lowercase_version }, /* Y */ { ISFUNC, rl_do_lowercase_version }, /* Z */ /* Some more punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ /* Lowercase alphabet. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ { ISFUNC, rl_call_last_kbd_macro }, /* e */ { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ /* Final punctuation. */ { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ { ISFUNC, rl_backward_kill_line }, /* RUBOUT */ #if KEYMAP_SIZE > 128 /* Undefined keys. */ { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 }, { ISFUNC, (rl_command_func_t *)0x0 } #endif /* KEYMAP_SIZE > 128 */ }; readline-8.3/isearch.c000644 000436 000024 00000067470 15020315003 015015 0ustar00chetstaff000000 000000 /* isearch.c - incremental searching */ /* **************************************************************** */ /* */ /* I-Search and Searching */ /* */ /* **************************************************************** */ /* Copyright (C) 1987-2021,2023,2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #include #if defined (HAVE_UNISTD_H) # include #endif #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif #include "rldefs.h" #include "rlmbutil.h" #include "readline.h" #include "history.h" #include "rlprivate.h" #include "xmalloc.h" /* Variables exported to other files in the readline library. */ char *_rl_isearch_terminators = (char *)NULL; _rl_search_cxt *_rl_iscxt = 0; int _rl_search_case_fold = 0; static int rl_search_history (int, int); static _rl_search_cxt *_rl_isearch_init (int); static void _rl_isearch_fini (_rl_search_cxt *); /* Last line found by the current incremental search, so we don't `find' identical lines many times in a row. Now part of isearch context. */ /* static char *prev_line_found; */ /* Last search string and its length. */ static char *last_isearch_string; static int last_isearch_string_len; static char * const default_isearch_terminators = "\033\012"; _rl_search_cxt * _rl_scxt_alloc (int type, int flags) { _rl_search_cxt *cxt; cxt = (_rl_search_cxt *)xmalloc (sizeof (_rl_search_cxt)); cxt->type = type; cxt->sflags = flags; cxt->search_string = 0; cxt->search_string_size = cxt->search_string_index = 0; cxt->lines = 0; cxt->allocated_line = 0; cxt->hlen = cxt->hindex = 0; cxt->save_point = rl_point; cxt->save_mark = rl_mark; cxt->save_line = where_history (); cxt->last_found_line = cxt->save_line; cxt->prev_line_found = 0; cxt->save_undo_list = 0; cxt->keymap = _rl_keymap; cxt->okeymap = _rl_keymap; cxt->history_pos = 0; cxt->direction = 0; cxt->prevc = cxt->lastc = 0; cxt->sline = 0; cxt->sline_len = cxt->sline_index = 0; cxt->search_terminators = 0; return cxt; } void _rl_scxt_dispose (_rl_search_cxt *cxt, int flags) { FREE (cxt->search_string); FREE (cxt->allocated_line); FREE (cxt->lines); xfree (cxt); } /* Search backwards through the history looking for a string which is typed interactively. Start with the current line. */ int rl_reverse_search_history (int sign, int key) { return (rl_search_history (-sign, key)); } /* Search forwards through the history looking for a string which is typed interactively. Start with the current line. */ int rl_forward_search_history (int sign, int key) { return (rl_search_history (sign, key)); } /* Display the current state of the search in the echo-area. SEARCH_STRING contains the string that is being searched for, DIRECTION is zero for forward, or non-zero for reverse, WHERE is the history list number of the current line. If it is -1, then this line is the starting one. */ static void rl_display_search (char *search_string, int flags, int where) { char *message; size_t msglen, searchlen; searchlen = (search_string && *search_string) ? strlen (search_string) : 0; message = (char *)xmalloc (searchlen + 64); msglen = 0; #if defined (NOTDEF) if (where != -1) { sprintf (message, "[%d]", where + history_base); msglen = strlen (message); } #endif /* NOTDEF */ message[msglen++] = '('; if (flags & SF_FAILED) { strcpy (message + msglen, "failed "); msglen += 7; } if (flags & SF_REVERSE) { strcpy (message + msglen, "reverse-"); msglen += 8; } strcpy (message + msglen, "i-search)`"); msglen += 10; if (search_string && *search_string) { strcpy (message + msglen, search_string); msglen += searchlen; } else _rl_optimize_redisplay (); strcpy (message + msglen, "': "); rl_message ("%s", message); xfree (message); #if 0 /* rl_message calls this */ (*rl_redisplay_function) (); #endif } static _rl_search_cxt * _rl_isearch_init (int direction) { _rl_search_cxt *cxt; register int i; HIST_ENTRY **hlist; cxt = _rl_scxt_alloc (RL_SEARCH_ISEARCH, 0); if (direction < 0) cxt->sflags |= SF_REVERSE; cxt->search_terminators = _rl_isearch_terminators ? _rl_isearch_terminators : default_isearch_terminators; /* Create an array of pointers to the lines that we want to search. */ hlist = history_list (); _rl_maybe_replace_line (1); i = 0; if (hlist) for (i = 0; hlist[i]; i++); /* Allocate space for this many lines, +1 for the current input line, and remember those lines. */ cxt->lines = (char **)xmalloc ((1 + (cxt->hlen = i)) * sizeof (char *)); for (i = 0; i < cxt->hlen; i++) cxt->lines[i] = hlist[i]->line; if (_rl_saved_line_for_history) cxt->lines[i] = _rl_saved_line_for_history->line; else { /* Keep track of this so we can free it. */ cxt->allocated_line = (char *)xmalloc (1 + strlen (rl_line_buffer)); strcpy (cxt->allocated_line, &rl_line_buffer[0]); cxt->lines[i] = cxt->allocated_line; } cxt->hlen++; /* The line where we start the search. */ cxt->history_pos = cxt->save_line; rl_save_prompt (); /* Initialize search parameters. */ cxt->search_string = (char *)xmalloc (cxt->search_string_size = 128); cxt->search_string[cxt->search_string_index = 0] = '\0'; /* Normalize DIRECTION into 1 or -1. */ cxt->direction = (direction >= 0) ? 1 : -1; cxt->sline = rl_line_buffer; cxt->sline_len = strlen (cxt->sline); cxt->sline_index = rl_point; _rl_iscxt = cxt; /* save globally */ /* experimental right now */ _rl_init_executing_keyseq (); return cxt; } static void _rl_isearch_fini (_rl_search_cxt *cxt) { /* First put back the original state. */ rl_replace_line (cxt->lines[cxt->save_line], 0); rl_restore_prompt (); /* Save the search string for possible later use. */ FREE (last_isearch_string); last_isearch_string = cxt->search_string; last_isearch_string_len = cxt->search_string_index; cxt->search_string = 0; cxt->search_string_size = 0; cxt->search_string_index = 0; if (cxt->last_found_line < cxt->save_line) rl_get_previous_history (cxt->save_line - cxt->last_found_line, 0); else rl_get_next_history (cxt->last_found_line - cxt->save_line, 0); /* If the string was not found, put point at the end of the last matching line. If last_found_line == orig_line, we didn't find any matching history lines at all, so put point back in its original position. */ if (cxt->sline_index < 0) { if (cxt->last_found_line == cxt->save_line) cxt->sline_index = cxt->save_point; else cxt->sline_index = strlen (rl_line_buffer); rl_mark = cxt->save_mark; rl_deactivate_mark (); } rl_point = cxt->sline_index; /* Don't worry about where to put the mark here; rl_get_previous_history and rl_get_next_history take care of it. If we want to highlight the search string, this is where to set the point and mark to do it. */ _rl_fix_point (0); rl_deactivate_mark (); /* _rl_optimize_redisplay (); */ rl_clear_message (); } /* XXX - we could use _rl_bracketed_read_mbstring () here. */ int _rl_search_getchar (_rl_search_cxt *cxt) { int c; /* Read a key and decide how to proceed. */ RL_SETSTATE(RL_STATE_MOREINPUT); c = cxt->lastc = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); #if defined (HANDLE_MULTIBYTE) /* This ends up with C (and LASTC) being set to the last byte of the multibyte character. In most cases c == lastc == mb[0] */ if (c >= 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) c = cxt->lastc = _rl_read_mbstring (cxt->lastc, cxt->mb, MB_LEN_MAX); #endif RL_CHECK_SIGNALS (); return c; } #define ENDSRCH_CHAR(c) \ ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G'))) /* Process just-read character C according to isearch context CXT. Return -1 if the caller should just free the context and return, 0 if we should break out of the loop, and 1 if we should continue to read characters. */ int _rl_isearch_dispatch (_rl_search_cxt *cxt, int c) { int n, wstart, wlen, limit, cval; char *paste; size_t pastelen; int j; rl_command_func_t *f; f = (rl_command_func_t *)NULL; if (c < 0) { cxt->sflags |= SF_FAILED; cxt->history_pos = cxt->last_found_line; return -1; } _rl_add_executing_keyseq (c); /* XXX - experimental code to allow users to bracketed-paste into the search string even when ESC is one of the isearch-terminators. Not perfect yet. */ if (_rl_enable_bracketed_paste && c == ESC && strchr (cxt->search_terminators, c) && (n = _rl_nchars_available ()) > (BRACK_PASTE_SLEN-1)) { j = _rl_read_bracketed_paste_prefix (c); if (j == 1) { cxt->lastc = -7; /* bracketed paste, see below */ goto opcode_dispatch; } else if (_rl_pushed_input_available ()) /* eat extra char we pushed back */ c = cxt->lastc = rl_read_key (); else c = cxt->lastc; /* last ditch */ } /* If we are moving into a new keymap, modify cxt->keymap and go on. This can be a problem if c == ESC and we want to terminate the incremental search, so we check */ if (c >= 0 && cxt->keymap[c].type == ISKMAP && strchr (cxt->search_terminators, cxt->lastc) == 0) { /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued takes microseconds, so multiply by 1000. If we don't get any additional input and this keymap shadows another function, process that key as if it was all we read. */ if (_rl_keyseq_timeout > 0 && RL_ISSTATE (RL_STATE_CALLBACK) == 0 && RL_ISSTATE (RL_STATE_INPUTPENDING) == 0 && _rl_pushed_input_available () == 0 && ((Keymap)(cxt->keymap[c].function))[ANYOTHERKEY].function && _rl_input_queued (_rl_keyseq_timeout*1000) == 0) goto add_character; cxt->okeymap = cxt->keymap; cxt->keymap = FUNCTION_TO_KEYMAP (cxt->keymap, c); cxt->sflags |= SF_CHGKMAP; /* XXX - we should probably save this sequence, so we can do something useful if this doesn't end up mapping to a command we interpret here. Right now we just save the most recent character that caused the index into a new keymap. */ cxt->prevc = c; #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { if (cxt->mb[1] == 0) { cxt->pmb[0] = c; /* XXX should be == cxt->mb[0] */ cxt->pmb[1] = '\0'; } else memcpy (cxt->pmb, cxt->mb, sizeof (cxt->pmb)); } #endif return 1; } add_character: /* Translate the keys we do something with to opcodes. */ if (c >= 0 && cxt->keymap[c].type == ISFUNC) { /* If we have a multibyte character, see if it's bound to something that affects the search. */ #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && cxt->mb[1]) f = rl_function_of_keyseq (cxt->mb, cxt->keymap, (int *)NULL); else #endif { f = cxt->keymap[c].function; if (f == rl_do_lowercase_version) { f = cxt->keymap[_rl_to_lower (c)].function; if (f == rl_do_lowercase_version) f = rl_insert; } } if (f == rl_reverse_search_history) cxt->lastc = (cxt->sflags & SF_REVERSE) ? -1 : -2; else if (f == rl_forward_search_history) cxt->lastc = (cxt->sflags & SF_REVERSE) ? -2 : -1; else if (f == rl_rubout) cxt->lastc = -3; else if (c == CTRL ('G') || f == rl_abort) cxt->lastc = -4; else if (c == CTRL ('W') || f == rl_unix_word_rubout) /* XXX */ cxt->lastc = -5; else if (c == CTRL ('Y') || f == rl_yank) /* XXX */ cxt->lastc = -6; else if (f == rl_bracketed_paste_begin) cxt->lastc = -7; else if (c == CTRL('V') || f == rl_quoted_insert) cxt->lastc = -8; } /* If we changed the keymap earlier while translating a key sequence into a command, restore it now that we've succeeded. */ if (cxt->sflags & SF_CHGKMAP) { cxt->keymap = cxt->okeymap; cxt->sflags &= ~SF_CHGKMAP; /* If we indexed into a new keymap, but didn't map to a command that affects the search (lastc > 0), and the character that mapped to a new keymap would have ended the search (ENDSRCH_CHAR(cxt->prevc)), handle that now as if the previous char would have ended the search and we would have read the current character. */ /* XXX - should we check cxt->mb? */ if (cxt->lastc > 0 && ENDSRCH_CHAR (cxt->prevc)) { rl_stuff_char (cxt->lastc); rl_execute_next (cxt->prevc); /* We're going to read the last two characters again. */ _rl_del_executing_keyseq (); _rl_del_executing_keyseq (); /* XXX - do we insert everything in cxt->pmb? */ return (0); } /* Otherwise, if the current character is mapped to self-insert or nothing (i.e., not an editing command), and the previous character was a keymap index, then we need to insert both the previous character and the current character into the search string. */ else if (cxt->lastc > 0 && cxt->prevc > 0 && cxt->keymap[cxt->prevc].type == ISKMAP && (f == 0 || f == rl_insert)) { /* Make lastc be the next character read */ /* XXX - do we insert everything in cxt->mb? */ rl_execute_next (cxt->lastc); _rl_del_executing_keyseq (); /* Dispatch on the previous character (insert into search string) */ cxt->lastc = cxt->prevc; #if defined (HANDLE_MULTIBYTE) /* Have to overwrite cxt->mb here because dispatch uses it below */ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { if (cxt->pmb[1] == 0) { cxt->mb[0] = cxt->lastc; /* == cxt->prevc */ cxt->mb[1] = '\0'; } else memcpy (cxt->mb, cxt->pmb, sizeof (cxt->mb)); } #endif cxt->prevc = 0; } else if (cxt->lastc > 0 && cxt->prevc > 0 && f && f != rl_insert) { _rl_term_executing_keyseq (); /* should this go in the caller? */ _rl_pending_command.map = cxt->keymap; _rl_pending_command.count = 1; /* XXX */ _rl_pending_command.key = cxt->lastc; _rl_pending_command.func = f; _rl_command_to_execute = &_rl_pending_command; return (0); } } /* The characters in isearch_terminators (set from the user-settable variable isearch-terminators) are used to terminate the search but not subsequently execute the character as a command. The default value is "\033\012" (ESC and C-J). */ if (cxt->lastc > 0 && strchr (cxt->search_terminators, cxt->lastc)) { /* ESC still terminates the search, but if there is pending input or if input arrives within 0.1 seconds (on systems with select(2)) it is used as a prefix character with rl_execute_next. WATCH OUT FOR THIS! This is intended to allow the arrow keys to be used like ^F and ^B are used to terminate the search and execute the movement command. XXX - since _rl_input_available depends on the application- settable keyboard timeout value, this could alternatively use _rl_input_queued(100000) */ if (cxt->lastc == ESC && (_rl_pushed_input_available () || _rl_input_available ())) { rl_execute_next (ESC); _rl_del_executing_keyseq (); } return (0); } #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { if (cxt->lastc >= 0 && (cxt->mb[0] && cxt->mb[1] == '\0') && ENDSRCH_CHAR (cxt->lastc)) { /* This sets rl_pending_input to LASTC; it will be picked up the next time rl_read_key is called. */ rl_execute_next (cxt->lastc); _rl_del_executing_keyseq (); return (0); } } else #endif if (cxt->lastc >= 0 && ENDSRCH_CHAR (cxt->lastc)) { /* This sets rl_pending_input to LASTC; it will be picked up the next time rl_read_key is called. */ rl_execute_next (cxt->lastc); _rl_del_executing_keyseq (); return (0); } _rl_init_executing_keyseq (); opcode_dispatch: /* Now dispatch on the character. `Opcodes' affect the search string or state. Other characters are added to the string. */ switch (cxt->lastc) { /* search again */ case -1: if (cxt->search_string_index == 0) { if (last_isearch_string) { cxt->search_string_size = 64 + last_isearch_string_len; cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); strcpy (cxt->search_string, last_isearch_string); cxt->search_string_index = last_isearch_string_len; rl_display_search (cxt->search_string, cxt->sflags, -1); break; } /* XXX - restore keymap here? */ return (1); } else if ((cxt->sflags & SF_REVERSE) && cxt->sline_index >= 0) cxt->sline_index--; else if (cxt->sline_index != cxt->sline_len) cxt->sline_index++; else rl_ding (); break; /* switch directions */ case -2: cxt->direction = -cxt->direction; if (cxt->direction < 0) cxt->sflags |= SF_REVERSE; else cxt->sflags &= ~SF_REVERSE; break; /* delete character from search string. */ case -3: /* C-H, DEL */ /* This is tricky. To do this right, we need to keep a stack of search positions for the current search, with sentinels marking the beginning and end. But this will do until we have a real isearch-undo. */ if (cxt->search_string_index == 0) rl_ding (); else if (MB_CUR_MAX == 1 || rl_byte_oriented) cxt->search_string[--cxt->search_string_index] = '\0'; else { wstart = _rl_find_prev_mbchar (cxt->search_string, cxt->search_string_index, MB_FIND_NONZERO); if (wstart >= 0) cxt->search_string[cxt->search_string_index = wstart] = '\0'; else cxt->search_string[cxt->search_string_index = 0] = '\0'; } if (cxt->search_string_index == 0) rl_ding (); break; case -4: /* C-G, abort */ rl_replace_line (cxt->lines[cxt->save_line], 0); rl_point = cxt->save_point; rl_mark = cxt->save_mark; rl_deactivate_mark (); rl_restore_prompt(); rl_clear_message (); _rl_fix_point (1); /* in case save_line and save_point are out of sync */ return -1; case -5: /* C-W */ /* skip over portion of line we already matched and yank word */ wstart = rl_point + cxt->search_string_index; if (wstart >= rl_end) { rl_ding (); break; } /* if not in a word, move to one. */ cval = _rl_char_value (rl_line_buffer, wstart); if (_rl_walphabetic (cval) == 0) { rl_ding (); break; } n = MB_NEXTCHAR (rl_line_buffer, wstart, 1, MB_FIND_NONZERO);; while (n < rl_end) { cval = _rl_char_value (rl_line_buffer, n); if (_rl_walphabetic (cval) == 0) break; n = MB_NEXTCHAR (rl_line_buffer, n, 1, MB_FIND_NONZERO);; } wlen = n - wstart + 1; if (cxt->search_string_index + wlen + 1 >= cxt->search_string_size) { cxt->search_string_size += wlen + 1; cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); } for (; wstart < n; wstart++) cxt->search_string[cxt->search_string_index++] = rl_line_buffer[wstart]; cxt->search_string[cxt->search_string_index] = '\0'; break; case -6: /* C-Y */ /* skip over portion of line we already matched and yank rest */ wstart = rl_point + cxt->search_string_index; if (wstart >= rl_end) { rl_ding (); break; } n = rl_end - wstart + 1; if (cxt->search_string_index + n + 1 >= cxt->search_string_size) { cxt->search_string_size += n + 1; cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); } for (n = wstart; n < rl_end; n++) cxt->search_string[cxt->search_string_index++] = rl_line_buffer[n]; cxt->search_string[cxt->search_string_index] = '\0'; break; case -7: /* bracketed paste */ paste = _rl_bracketed_text (&pastelen); if (paste == 0 || *paste == 0) { xfree (paste); break; } if (_rl_enable_active_region) rl_activate_mark (); if (cxt->search_string_index + pastelen + 1 >= cxt->search_string_size) { cxt->search_string_size += pastelen + 2; cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); } memcpy (cxt->search_string + cxt->search_string_index, paste, pastelen); cxt->search_string_index += pastelen; cxt->search_string[cxt->search_string_index] = '\0'; xfree (paste); break; case -8: /* quoted insert */ #if defined (HANDLE_SIGNALS) if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) _rl_disable_tty_signals (); #endif c = _rl_search_getchar (cxt); #if defined (HANDLE_SIGNALS) if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) _rl_restore_tty_signals (); #endif if (c < 0) { cxt->sflags |= SF_FAILED; cxt->history_pos = cxt->last_found_line; return -1; } _rl_add_executing_keyseq (c); /*FALLTHROUGH*/ /* Add character to search string and continue search. */ default: #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) wlen = (cxt->mb[0] == 0 || cxt->mb[1] == 0) ? 1 : RL_STRLEN (cxt->mb); else #endif wlen = 1; if (cxt->search_string_index + wlen + 1 >= cxt->search_string_size) { cxt->search_string_size += 128; /* 128 much greater than MB_CUR_MAX */ cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size); } #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) { int w; if (cxt->mb[0] == 0 || cxt->mb[1] == 0) cxt->search_string[cxt->search_string_index++] = cxt->mb[0]; else for (w = 0; w < wlen; ) cxt->search_string[cxt->search_string_index++] = cxt->mb[w++]; } else #endif cxt->search_string[cxt->search_string_index++] = cxt->lastc; /* XXX - was c instead of lastc */ cxt->search_string[cxt->search_string_index] = '\0'; break; } for (cxt->sflags &= ~(SF_FOUND|SF_FAILED);; ) { if (cxt->search_string_index == 0) { cxt->sflags |= SF_FAILED; break; } limit = cxt->sline_len - cxt->search_string_index + 1; /* Search the current line. */ while ((cxt->sflags & SF_REVERSE) ? (cxt->sline_index >= 0) : (cxt->sline_index < limit)) { int found; if (_rl_search_case_fold) { #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) found = _rl_mb_strcaseeqn (cxt->search_string, cxt->search_string_index, cxt->sline + cxt->sline_index, limit, cxt->search_string_index, 0); else found = _rl_strnicmp (cxt->search_string, cxt->sline + cxt->sline_index, cxt->search_string_index) == 0; #endif } else found = STREQN (cxt->search_string, cxt->sline + cxt->sline_index, cxt->search_string_index); if (found) { cxt->sflags |= SF_FOUND; break; } else cxt->sline_index += cxt->direction; if (cxt->sline_index < 0 || cxt->sline_index > cxt->sline_len) { cxt->sline_index = 0; break; } } if (cxt->sflags & SF_FOUND) break; /* Move to the next line, but skip new copies of the line we just found and lines shorter than the string we're searching for. */ do { /* Move to the next line. */ cxt->history_pos += cxt->direction; /* At limit for direction? */ if ((cxt->sflags & SF_REVERSE) ? (cxt->history_pos < 0) : (cxt->history_pos == cxt->hlen)) { cxt->sflags |= SF_FAILED; break; } /* We will need these later. */ cxt->sline = cxt->lines[cxt->history_pos]; cxt->sline_len = strlen (cxt->sline); } while ((cxt->prev_line_found && STREQ (cxt->prev_line_found, cxt->lines[cxt->history_pos])) || (cxt->search_string_index > cxt->sline_len)); if (cxt->sflags & SF_FAILED) { /* XXX - reset sline_index if < 0 or longer than the history line */ if (cxt->sline_index < 0 || cxt->sline_index > cxt->sline_len) cxt->sline_index = 0; break; } /* Now set up the line for searching... */ cxt->sline_index = (cxt->sflags & SF_REVERSE) ? cxt->sline_len - cxt->search_string_index : 0; } /* reset the keymaps for the next time through the loop */ cxt->keymap = cxt->okeymap = _rl_keymap; if (cxt->sflags & SF_FAILED) { /* We cannot find the search string. Ding the bell. */ rl_ding (); cxt->history_pos = cxt->last_found_line; rl_deactivate_mark (); rl_display_search (cxt->search_string, cxt->sflags, (cxt->history_pos == cxt->save_line) ? -1 : cxt->history_pos); return 1; } /* We have found the search string. Just display it. But don't actually move there in the history list until the user accepts the location. */ if (cxt->sflags & SF_FOUND) { cxt->prev_line_found = cxt->lines[cxt->history_pos]; rl_replace_line (cxt->lines[cxt->history_pos], 0); if (_rl_enable_active_region) rl_activate_mark (); rl_point = cxt->sline_index; if (rl_mark_active_p () && cxt->search_string_index > 0) rl_mark = rl_point + cxt->search_string_index; cxt->last_found_line = cxt->history_pos; rl_display_search (cxt->search_string, cxt->sflags, (cxt->history_pos == cxt->save_line) ? -1 : cxt->history_pos); } return 1; } int _rl_isearch_cleanup (_rl_search_cxt *cxt, int r) { if (r >= 0) _rl_isearch_fini (cxt); _rl_scxt_dispose (cxt, 0); _rl_iscxt = 0; RL_UNSETSTATE(RL_STATE_ISEARCH); return (r != 0); } /* Search through the history looking for an interactively typed string. This is analogous to i-search. We start the search in the current line. DIRECTION is which direction to search; >= 0 means forward, < 0 means backwards. */ static int rl_search_history (int direction, int invoking_key) { _rl_search_cxt *cxt; /* local for now, but saved globally */ int c, r; RL_SETSTATE(RL_STATE_ISEARCH); cxt = _rl_isearch_init (direction); rl_display_search (cxt->search_string, cxt->sflags, -1); /* If we are using the callback interface, all we do is set up here and return. The key is that we leave RL_STATE_ISEARCH set. */ if (RL_ISSTATE (RL_STATE_CALLBACK)) return (0); r = -1; for (;;) { c = _rl_search_getchar (cxt); /* We might want to handle EOF here (c == 0) */ r = _rl_isearch_dispatch (cxt, cxt->lastc); if (r <= 0) break; } /* The searching is over. The user may have found the string that she was looking for, or else she may have exited a failing search. If LINE_INDEX is -1, then that shows that the string searched for was not found. We use this to determine where to place rl_point. */ return (_rl_isearch_cleanup (cxt, r)); } #if defined (READLINE_CALLBACKS) /* Called from the callback functions when we are ready to read a key. The callback functions know to call this because RL_ISSTATE(RL_STATE_ISEARCH). If _rl_isearch_dispatch finishes searching, this function is responsible for turning off RL_STATE_ISEARCH, which it does using _rl_isearch_cleanup. */ int _rl_isearch_callback (_rl_search_cxt *cxt) { int c, r; c = _rl_search_getchar (cxt); if (c < 0) /* EOF */ return 1; if (RL_ISSTATE (RL_STATE_ISEARCH) == 0) /* signal could turn it off */ return 1; /* We might want to handle EOF here */ r = _rl_isearch_dispatch (cxt, cxt->lastc); return (r <= 0) ? _rl_isearch_cleanup (cxt, r) : 0; } #endif readline-8.3/kill.c000644 000436 000024 00000047613 14643255326 014354 0ustar00chetstaff000000 000000 /* kill.c -- kill ring management. */ /* Copyright (C) 1994-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) # include #endif #include #if defined (HAVE_UNISTD_H) # include /* for _POSIX_VERSION */ #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include /* System-specific feature definitions and include files. */ #include "rldefs.h" /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "xmalloc.h" /* **************************************************************** */ /* */ /* Killing Mechanism */ /* */ /* **************************************************************** */ /* What we assume for a max number of kills. */ #define DEFAULT_MAX_KILLS 10 /* The real variable to look at to find out when to flush kills. */ static int rl_max_kills = DEFAULT_MAX_KILLS; /* Where to store killed text. */ static char **rl_kill_ring = (char **)NULL; /* Where we are in the kill ring. */ static int rl_kill_index; /* How many slots we have in the kill ring. */ static int rl_kill_ring_length; static int _rl_copy_to_kill_ring (char *, int); static int region_kill_internal (int); static int _rl_copy_word_as_kill (int, int); static int rl_yank_nth_arg_internal (int, int, int); /* How to say that you only want to save a certain amount of kill material. */ int rl_set_retained_kills (int num) { return 0; } /* Add TEXT to the kill ring, allocating a new kill ring slot as necessary. This uses TEXT directly, so the caller must not free it. If APPEND is non-zero, and the last command was a kill, the text is appended to the current kill ring slot, otherwise prepended. */ static int _rl_copy_to_kill_ring (char *text, int append) { char *old, *new; int slot; /* First, find the slot to work with. */ if (_rl_last_command_was_kill == 0 || rl_kill_ring == 0) { /* Get a new slot. */ if (rl_kill_ring == 0) { /* If we don't have any defined, then make one. */ rl_kill_ring = (char **) xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *)); rl_kill_ring[slot = 0] = (char *)NULL; } else { /* We have to add a new slot on the end, unless we have exceeded the max limit for remembering kills. */ slot = rl_kill_ring_length; if (slot == rl_max_kills) { register int i; xfree (rl_kill_ring[0]); for (i = 0; i < slot; i++) rl_kill_ring[i] = rl_kill_ring[i + 1]; } else { slot = rl_kill_ring_length += 1; rl_kill_ring = (char **)xrealloc (rl_kill_ring, (slot + 1) * sizeof (char *)); } rl_kill_ring[--slot] = (char *)NULL; } } else slot = rl_kill_ring_length - 1; /* If the last command was a kill, prepend or append. */ if (_rl_last_command_was_kill && rl_kill_ring[slot] && rl_editing_mode != vi_mode) { old = rl_kill_ring[slot]; new = (char *)xmalloc (1 + strlen (old) + strlen (text)); if (append) { strcpy (new, old); strcat (new, text); } else { strcpy (new, text); strcat (new, old); } xfree (old); xfree (text); rl_kill_ring[slot] = new; } else rl_kill_ring[slot] = text; rl_kill_index = slot; return 0; } /* The way to kill something. This appends or prepends to the last kill, if the last command was a kill command. if FROM is less than TO, then the text is appended, otherwise prepended. If the last command was not a kill command, then a new slot is made for this kill. */ int rl_kill_text (int from, int to) { char *text; /* Is there anything to kill? */ if (from == to) { _rl_last_command_was_kill++; return 0; } text = rl_copy_text (from, to); /* Delete the copied text from the line. */ rl_delete_text (from, to); _rl_copy_to_kill_ring (text, from < to); _rl_last_command_was_kill++; return 0; } /* Now REMEMBER! In order to do prepending or appending correctly, kill commands always make rl_point's original position be the FROM argument, and rl_point's extent be the TO argument. */ /* **************************************************************** */ /* */ /* Killing Commands */ /* */ /* **************************************************************** */ /* Delete the word at point, saving the text in the kill ring. */ int rl_kill_word (int count, int key) { int orig_point; if (count < 0) return (rl_backward_kill_word (-count, key)); else { orig_point = rl_point; rl_forward_word (count, key); if (rl_point != orig_point) rl_kill_text (orig_point, rl_point); rl_point = orig_point; if (rl_editing_mode == emacs_mode) rl_mark = rl_point; } return 0; } /* Rubout the word before point, placing it on the kill ring. */ int rl_backward_kill_word (int count, int key) { int orig_point; if (count < 0) return (rl_kill_word (-count, key)); else { orig_point = rl_point; rl_backward_word (count, key); if (rl_point != orig_point) rl_kill_text (orig_point, rl_point); if (rl_editing_mode == emacs_mode) rl_mark = rl_point; } return 0; } /* Kill from here to the end of the line. If DIRECTION is negative, kill back to the line start instead. */ int rl_kill_line (int direction, int key) { int orig_point; if (direction < 0) return (rl_backward_kill_line (1, key)); else { orig_point = rl_point; rl_end_of_line (1, key); if (orig_point != rl_point) rl_kill_text (orig_point, rl_point); rl_point = orig_point; if (rl_editing_mode == emacs_mode) rl_mark = rl_point; } return 0; } /* Kill backwards to the start of the line. If DIRECTION is negative, kill forwards to the line end instead. */ int rl_backward_kill_line (int direction, int key) { int orig_point; if (direction < 0) return (rl_kill_line (1, key)); else { if (rl_point == 0) rl_ding (); else { orig_point = rl_point; rl_beg_of_line (1, key); if (rl_point != orig_point) rl_kill_text (orig_point, rl_point); if (rl_editing_mode == emacs_mode) rl_mark = rl_point; } } return 0; } /* Kill the whole line, no matter where point is. */ int rl_kill_full_line (int count, int key) { rl_begin_undo_group (); rl_point = 0; rl_kill_text (rl_point, rl_end); rl_mark = 0; rl_end_undo_group (); return 0; } /* The next two functions mimic unix line editing behaviour, except they save the deleted text on the kill ring. This is safer than not saving it, and since we have a ring, nobody should get screwed. */ /* This does what C-w does in Unix. We can't prevent people from using behaviour that they expect. */ int rl_unix_word_rubout (int count, int key) { int orig_point; if (rl_point == 0) rl_ding (); else { orig_point = rl_point; if (count <= 0) count = 1; while (count--) { while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) rl_point--; while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0)) rl_point--; /* XXX - multibyte? */ } rl_kill_text (orig_point, rl_point); if (rl_editing_mode == emacs_mode) rl_mark = rl_point; } return 0; } /* This deletes one filename component in a Unix pathname. That is, it deletes backward to directory separator (`/') or whitespace. */ int rl_unix_filename_rubout (int count, int key) { int orig_point, c; if (rl_point == 0) rl_ding (); else { orig_point = rl_point; if (count <= 0) count = 1; while (rl_point > 0 && count--) { c = rl_line_buffer[rl_point - 1]; /* First move backwards through whitespace */ while (rl_point && whitespace (c)) { if (--rl_point) c = rl_line_buffer[rl_point - 1]; } /* Consume one or more slashes. */ if (c == '/') { int i; i = rl_point - 1; while (i > 0 && c == '/') c = rl_line_buffer[--i]; if (i == 0 || whitespace (c)) { rl_point = i + whitespace (c); continue; /* slashes only */ } c = '/'; } while (rl_point && (whitespace (c) || c == '/')) { if (--rl_point) c = rl_line_buffer[rl_point - 1]; } while (rl_point && (whitespace (c) == 0) && c != '/') { if (--rl_point) /* XXX - multibyte? */ c = rl_line_buffer[rl_point - 1]; } } rl_kill_text (orig_point, rl_point); if (rl_editing_mode == emacs_mode) rl_mark = rl_point; } return 0; } /* Here is C-u doing what Unix does. You don't *have* to use these key-bindings. We have a choice of killing the entire line, or killing from where we are to the start of the line. We choose the latter, because if you are a Unix weenie, then you haven't backspaced into the line at all, and if you aren't, then you know what you are doing. */ int rl_unix_line_discard (int count, int key) { if (rl_point == 0) rl_ding (); else { rl_kill_text (rl_point, 0); rl_point = 0; if (rl_editing_mode == emacs_mode) rl_mark = rl_point; } return 0; } /* Copy the text in the `region' to the kill ring. If DELETE is non-zero, delete the text from the line as well. */ static int region_kill_internal (int delete) { char *text; if (rl_mark != rl_point) { text = rl_copy_text (rl_point, rl_mark); if (delete) rl_delete_text (rl_point, rl_mark); _rl_copy_to_kill_ring (text, rl_point < rl_mark); } _rl_fix_point (1); _rl_last_command_was_kill++; return 0; } /* Copy the text in the region to the kill ring. */ int rl_copy_region_to_kill (int count, int key) { return (region_kill_internal (0)); } /* Kill the text between the point and mark. */ int rl_kill_region (int count, int key) { int r, npoint; npoint = (rl_point < rl_mark) ? rl_point : rl_mark; r = region_kill_internal (1); rl_point = npoint; _rl_fix_point (1); return r; } /* Copy COUNT words to the kill ring. DIR says which direction we look to find the words. */ static int _rl_copy_word_as_kill (int count, int dir) { int om, op, r; om = rl_mark; op = rl_point; if (dir > 0) rl_forward_word (count, 0); else rl_backward_word (count, 0); rl_mark = rl_point; if (dir > 0) rl_backward_word (count, 0); else rl_forward_word (count, 0); r = region_kill_internal (0); rl_mark = om; rl_point = op; return r; } int rl_copy_forward_word (int count, int key) { if (count < 0) return (rl_copy_backward_word (-count, key)); return (_rl_copy_word_as_kill (count, 1)); } int rl_copy_backward_word (int count, int key) { if (count < 0) return (rl_copy_forward_word (-count, key)); return (_rl_copy_word_as_kill (count, -1)); } /* Yank back the last killed text. This ignores arguments. */ int rl_yank (int count, int key) { if (rl_kill_ring == 0) { _rl_abort_internal (); return 1; } _rl_set_mark_at_pos (rl_point); rl_insert_text (rl_kill_ring[rl_kill_index]); return 0; } /* If the last command was yank, or yank_pop, and the text just before point is identical to the current kill item, then delete that text from the line, rotate the index down, and yank back some other text. */ int rl_yank_pop (int count, int key) { int l, n; if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) || !rl_kill_ring) { _rl_abort_internal (); return 1; } l = strlen (rl_kill_ring[rl_kill_index]); n = rl_point - l; if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l)) { rl_delete_text (n, rl_point); rl_point = n; rl_kill_index--; if (rl_kill_index < 0) rl_kill_index = rl_kill_ring_length - 1; rl_yank (1, 0); return 0; } else { _rl_abort_internal (); return 1; } } #if defined (VI_MODE) int rl_vi_yank_pop (int count, int key) { int l, n, origpoint; if (((rl_last_func != rl_vi_yank_pop) && (rl_last_func != rl_vi_put)) || !rl_kill_ring) { _rl_abort_internal (); return 1; } l = strlen (rl_kill_ring[rl_kill_index]); #if 1 origpoint = rl_point; n = rl_point - l + 1; #else n = rl_point - l; #endif if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l)) { #if 1 rl_delete_text (n, n + l); /* remember vi cursor positioning */ rl_point = origpoint - l; #else rl_delete_text (n, rl_point); rl_point = n; #endif rl_kill_index--; if (rl_kill_index < 0) rl_kill_index = rl_kill_ring_length - 1; rl_vi_put (1, 'p'); return 0; } else { _rl_abort_internal (); return 1; } } #endif /* VI_MODE */ /* Yank the COUNTh argument from the previous history line, skipping HISTORY_SKIP lines before looking for the `previous line'. */ static int rl_yank_nth_arg_internal (int count, int key, int history_skip) { register HIST_ENTRY *entry; char *arg; int i, pos; pos = where_history (); if (history_skip) { for (i = 0; i < history_skip; i++) entry = previous_history (); } entry = previous_history (); history_set_pos (pos); if (entry == 0) { rl_ding (); return 1; } arg = history_arg_extract (count, count, entry->line); if (!arg || !*arg) { rl_ding (); FREE (arg); return 1; } rl_begin_undo_group (); _rl_set_mark_at_pos (rl_point); #if defined (VI_MODE) /* Vi mode always inserts a space before yanking the argument, and it inserts it right *after* rl_point. */ if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) { rl_vi_append_mode (1, key); rl_insert_text (" "); } #endif /* VI_MODE */ rl_insert_text (arg); xfree (arg); rl_end_undo_group (); return 0; } /* Yank the COUNTth argument from the previous history line. */ int rl_yank_nth_arg (int count, int key) { return (rl_yank_nth_arg_internal (count, key, 0)); } /* Yank the last argument from the previous history line. This `knows' how rl_yank_nth_arg treats a count of `$'. With an argument, this behaves the same as rl_yank_nth_arg. */ int rl_yank_last_arg (int count, int key) { static int history_skip = 0; static int explicit_arg_p = 0; static int count_passed = 1; static int direction = 1; static int undo_needed = 0; int retval; if (rl_last_func != rl_yank_last_arg) { history_skip = 0; explicit_arg_p = rl_explicit_arg; count_passed = count; direction = 1; } else { if (undo_needed) rl_do_undo (); if (count < 0) /* XXX - was < 1 */ direction = -direction; history_skip += direction; if (history_skip < 0) history_skip = 0; } if (explicit_arg_p) retval = rl_yank_nth_arg_internal (count_passed, key, history_skip); else retval = rl_yank_nth_arg_internal ('$', key, history_skip); undo_needed = retval == 0; return retval; } /* Having read the special escape sequence denoting the beginning of a `bracketed paste' sequence, read the rest of the pasted input until the closing sequence and return the pasted text. */ char * _rl_bracketed_text (size_t *lenp) { int c; size_t len, cap; char *buf; len = 0; buf = xmalloc (cap = 64); buf[0] = '\0'; RL_SETSTATE (RL_STATE_MOREINPUT); while ((c = rl_read_key ()) >= 0) { if (RL_ISSTATE (RL_STATE_MACRODEF)) _rl_add_macro_char (c); if (c == '\r') /* XXX */ c = '\n'; if (len == cap) buf = xrealloc (buf, cap *= 2); buf[len++] = c; if (len >= BRACK_PASTE_SLEN && c == BRACK_PASTE_LAST && STREQN (buf + len - BRACK_PASTE_SLEN, BRACK_PASTE_SUFF, BRACK_PASTE_SLEN)) { len -= BRACK_PASTE_SLEN; break; } } RL_UNSETSTATE (RL_STATE_MOREINPUT); if (len == cap) buf = xrealloc (buf, cap + 1); buf[len] = '\0'; if (lenp) *lenp = len; return (buf); } /* Having read the special escape sequence denoting the beginning of a `bracketed paste' sequence, read the rest of the pasted input until the closing sequence and insert the pasted text as a single unit without interpretation. Temporarily highlight the inserted text. */ int rl_bracketed_paste_begin (int count, int key) { int retval; size_t len; char *buf; buf = _rl_bracketed_text (&len); rl_mark = rl_point; retval = rl_insert_text (buf) == len ? 0 : 1; if (_rl_enable_active_region) rl_activate_mark (); xfree (buf); return (retval); } int _rl_read_bracketed_paste_prefix (int c) { char pbuf[BRACK_PASTE_SLEN+1], *pbpref; int key, ind; pbpref = BRACK_PASTE_PREF; /* XXX - debugging */ if (c != pbpref[0]) return (0); pbuf[ind = 0] = key = c; while (ind < BRACK_PASTE_SLEN-1 && (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available () == 0 && _rl_input_queued (0)) { key = rl_read_key (); /* XXX - for now */ if (key < 0) break; pbuf[++ind] = key; if (pbuf[ind] != pbpref[ind]) break; } if (ind < BRACK_PASTE_SLEN-1) /* read incomplete sequence */ { while (ind >= 0) _rl_unget_char (pbuf[ind--]); return (key < 0 ? key : 0); } return (key < 0 ? key : 1); } /* Get a character from wherever we read input, handling input in bracketed paste mode. If we don't have or use bracketed paste mode, this can be used in place of rl_read_key(). */ int _rl_bracketed_read_key () { int c, r; char *pbuf; size_t pblen; RL_SETSTATE(RL_STATE_MOREINPUT); c = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); if (c < 0) return -1; /* read pasted data with bracketed-paste mode enabled. */ if (_rl_enable_bracketed_paste && c == ESC && (r = _rl_read_bracketed_paste_prefix (c)) == 1) { pbuf = _rl_bracketed_text (&pblen); if (pblen == 0) { xfree (pbuf); return 0; /* XXX */ } c = (unsigned char)pbuf[0]; if (pblen > 1) { while (--pblen > 0) _rl_unget_char ((unsigned char)pbuf[pblen]); } xfree (pbuf); } return c; } /* Get a character from wherever we read input, handling input in bracketed paste mode. If we don't have or use bracketed paste mode, this can be used in place of rl_read_key(). */ int _rl_bracketed_read_mbstring (char *mb, int mlen) { int c; c = _rl_bracketed_read_key (); if (c < 0) return -1; #if defined (HANDLE_MULTIBYTE) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) c = _rl_read_mbstring (c, mb, mlen); else #endif mb[0] = c; mb[mlen] = '\0'; /* just in case */ return c; } /* A special paste command for Windows users. */ #if defined (_WIN32) #define WIN32_LEAN_AND_MEAN #include int rl_paste_from_clipboard (int count, int key) { char *data, *ptr; int len; if (OpenClipboard (NULL) == 0) return (0); data = (char *)GetClipboardData (CF_TEXT); if (data) { ptr = strchr (data, '\r'); if (ptr) { len = ptr - data; ptr = (char *)xmalloc (len + 1); ptr[len] = '\0'; strncpy (ptr, data, len); } else ptr = data; _rl_set_mark_at_pos (rl_point); rl_insert_text (ptr); if (ptr != data) xfree (ptr); CloseClipboard (); } return (0); } #endif /* _WIN32 */ readline-8.3/input.c000644 000436 000024 00000062501 15005144241 014533 0ustar00chetstaff000000 000000 /* input.c -- character input functions for readline. */ /* Copyright (C) 1994-2025 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (__TANDEM) # define _XOPEN_SOURCE_EXTENDED 1 # define _TANDEM_SOURCE 1 # include #endif /* These are needed to get the declaration of 'alarm' when including . I'm not sure it's needed, but the compiler might require it. */ #if defined (__MINGW32__) # define __USE_MINGW_ALARM # define _POSIX #endif #if defined (HAVE_CONFIG_H) # include #endif #include #include #if defined (HAVE_SYS_FILE_H) # include #endif /* HAVE_SYS_FILE_H */ #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include #include "posixselect.h" #include "posixtime.h" #if defined (FIONREAD_IN_SYS_IOCTL) # include #endif #include #include #if !defined (errno) extern int errno; #endif /* !errno */ /* System-specific feature definitions and include files. */ #include "rldefs.h" #include "rlmbutil.h" /* Some standard library routines. */ #include "readline.h" #include "rlprivate.h" #include "rlshell.h" #include "xmalloc.h" /* What kind of non-blocking I/O do we have? */ #if !defined (O_NDELAY) && defined (O_NONBLOCK) # define O_NDELAY O_NONBLOCK /* Posix style */ #endif #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) extern sigset_t _rl_orig_sigset; #endif /* Non-null means it is a pointer to a function to run while waiting for character input. */ rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL; /* A function to call if a read(2) is interrupted by a signal. */ rl_hook_func_t *rl_signal_event_hook = (rl_hook_func_t *)NULL; /* A function to call when readline times out after a time is specified. */ rl_hook_func_t *rl_timeout_event_hook = (rl_hook_func_t *)NULL; /* A function to replace _rl_input_available for applications using the callback interface. */ rl_hook_func_t *rl_input_available_hook = (rl_hook_func_t *)NULL; rl_getc_func_t *rl_getc_function = rl_getc; static int _keyboard_input_timeout = 100000; /* 0.1 seconds; it's in usec */ static int ibuffer_space (void); static int rl_get_char (int *); static int rl_gather_tyi (void); /* Windows isatty returns true for every character device, including the null device, so we need to perform additional checks. */ #if defined (_WIN32) && !defined (__CYGWIN__) #include #include #define WIN32_LEAN_AND_MEAN 1 #include int win32_isatty (int fd) { if (_isatty(fd)) { HANDLE h; DWORD ignored; if ((h = (HANDLE) _get_osfhandle (fd)) == INVALID_HANDLE_VALUE) { errno = EBADF; return 0; } if (GetConsoleMode (h, &ignored) != 0) return 1; } errno = ENOTTY; return 0; } #define isatty(x) win32_isatty(x) #endif /* Readline timeouts */ /* We now define RL_TIMEOUT_USE_SELECT or RL_TIMEOUT_USE_SIGALRM in rlprivate.h */ int rl_set_timeout (unsigned int, unsigned int); int rl_timeout_remaining (unsigned int *, unsigned int *); int _rl_timeout_init (void); int _rl_timeout_handle_sigalrm (void); #if defined (RL_TIMEOUT_USE_SELECT) int _rl_timeout_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *, const sigset_t *); #endif static void _rl_timeout_handle (void); #if defined (RL_TIMEOUT_USE_SIGALRM) static int set_alarm (unsigned int *, unsigned int *); static void reset_alarm (void); #endif /* We implement timeouts as a future time using a supplied interval (timeout_duration) from when the timeout is set (timeout_point). That allows us to easily determine whether the timeout has occurred and compute the time remaining until it does. */ static struct timeval timeout_point; static struct timeval timeout_duration; /* **************************************************************** */ /* */ /* Character Input Buffering */ /* */ /* **************************************************************** */ static int pop_index, push_index; static unsigned char ibuffer[512]; static int ibuffer_len = sizeof (ibuffer) - 1; #define any_typein (push_index != pop_index) int _rl_any_typein (void) { return any_typein; } int _rl_pushed_input_available (void) { return (push_index != pop_index); } /* Return the amount of space available in the buffer for stuffing characters. */ static int ibuffer_space (void) { if (pop_index > push_index) return (pop_index - push_index - 1); else return (ibuffer_len - (push_index - pop_index)); } /* Get a key from the buffer of characters to be read. Return the key in KEY. Result is non-zero if there was a key, or 0 if there wasn't. */ static int rl_get_char (int *key) { if (push_index == pop_index) return (0); *key = ibuffer[pop_index++]; #if 0 if (pop_index >= ibuffer_len) #else if (pop_index > ibuffer_len) #endif pop_index = 0; return (1); } /* Stuff KEY into the *front* of the input buffer. Returns non-zero if successful, zero if there is no space left in the buffer. */ int _rl_unget_char (int key) { if (ibuffer_space ()) { pop_index--; if (pop_index < 0) pop_index = ibuffer_len; ibuffer[pop_index] = key; return (1); } return (0); } /* If a character is available to be read, then read it and stuff it into IBUFFER. Otherwise, just return. Returns number of characters read (0 if none available) and -1 on error (EIO). */ static int rl_gather_tyi (void) { int tty; register int tem, result; int chars_avail, k; char input; #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) fd_set readfds, exceptfds; struct timeval timeout; #endif result = -1; chars_avail = 0; input = 0; tty = fileno (rl_instream); /* Move this up here to give it first shot, but it can't set chars_avail */ /* XXX - need rl_chars_available_hook? */ if (rl_input_available_hook) { result = (*rl_input_available_hook) (); if (result == 0) result = -1; } #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) if (result == -1) { FD_ZERO (&readfds); FD_ZERO (&exceptfds); FD_SET (tty, &readfds); FD_SET (tty, &exceptfds); USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout); #if defined (RL_TIMEOUT_USE_SELECT) result = _rl_timeout_select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout, NULL); #else result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); #endif if (result <= 0) return 0; /* Nothing to read. */ } #endif #if defined (FIONREAD) if (result == -1) { errno = 0; result = ioctl (tty, FIONREAD, &chars_avail); if (result == -1 && errno == EIO) return -1; if (result == -1) chars_avail = 0; } #endif #if defined (O_NDELAY) if (result == -1) { tem = fcntl (tty, F_GETFL, 0); fcntl (tty, F_SETFL, (tem | O_NDELAY)); chars_avail = read (tty, &input, 1); fcntl (tty, F_SETFL, tem); if (chars_avail == -1 && errno == EAGAIN) return 0; if (chars_avail == -1 && errno == EIO) return -1; if (chars_avail == 0) /* EOF */ { rl_stuff_char (EOF); return (0); } } #endif /* O_NDELAY */ #if defined (__MINGW32__) /* Use getch/_kbhit to check for available console input, in the same way that we read it normally. */ if (result == -1) { chars_avail = isatty (tty) ? _kbhit () : 0; result = 0; } #endif /* If there's nothing available, don't waste time trying to read something. */ if (chars_avail <= 0) return 0; tem = ibuffer_space (); if (chars_avail > tem) chars_avail = tem; /* One cannot read all of the available input. I can only read a single character at a time, or else programs which require input can be thwarted. If the buffer is larger than one character, I lose. Damn! */ if (tem < ibuffer_len) chars_avail = 0; if (result != -1) { while (chars_avail--) { RL_CHECK_SIGNALS (); k = (*rl_getc_function) (rl_instream); if (rl_stuff_char (k) == 0) break; /* some problem; no more room */ if (k == NEWLINE || k == RETURN) break; } } else { if (chars_avail) rl_stuff_char (input); } return 1; } int rl_set_keyboard_input_timeout (int u) { int o; o = _keyboard_input_timeout; if (u >= 0) _keyboard_input_timeout = u; return (o); } /* Is there input available to be read on the readline input file descriptor? Only works if the system has select(2) or FIONREAD. Uses the value of _keyboard_input_timeout as the timeout; if another readline function wants to specify a timeout and not leave it up to the user, it should use _rl_input_queued(timeout_value_in_microseconds) instead. */ int _rl_input_available (void) { #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) fd_set readfds, exceptfds; struct timeval timeout; #endif #if !defined (HAVE_SELECT) && defined (FIONREAD) int chars_avail; #endif int tty; if (rl_input_available_hook) return (*rl_input_available_hook) (); tty = fileno (rl_instream); #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) FD_ZERO (&readfds); FD_ZERO (&exceptfds); FD_SET (tty, &readfds); FD_SET (tty, &exceptfds); USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout); # if defined (RL_TIMEOUT_USE_SELECT) return (_rl_timeout_select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout, NULL) > 0); # else return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0); # endif #else #if defined (FIONREAD) if (ioctl (tty, FIONREAD, &chars_avail) == 0) return (chars_avail); #endif #endif #if defined (__MINGW32__) if (isatty (tty)) return (_kbhit ()); #endif return 0; } int _rl_nchars_available () { int chars_avail, fd, result; chars_avail = 0; #if defined (FIONREAD) fd = fileno (rl_instream); errno = 0; result = ioctl (fd, FIONREAD, &chars_avail); if (result == -1 && errno == EIO) return -1; #endif return chars_avail; } int _rl_input_queued (int t) { int old_timeout, r; old_timeout = rl_set_keyboard_input_timeout (t); r = _rl_input_available (); rl_set_keyboard_input_timeout (old_timeout); return r; } void _rl_insert_typein (int c) { int key, t, i; char *string; i = key = 0; string = (char *)xmalloc (ibuffer_len + 1); string[i++] = (char) c; while ((t = rl_get_char (&key)) && _rl_keymap[key].type == ISFUNC && _rl_keymap[key].function == rl_insert) string[i++] = key; if (t) _rl_unget_char (key); string[i] = '\0'; rl_insert_text (string); xfree (string); } /* Add KEY to the buffer of characters to be read. Returns 1 if the character was stuffed correctly; 0 otherwise. */ int rl_stuff_char (int key) { if (ibuffer_space () == 0) return 0; if (key == EOF) { key = NEWLINE; rl_pending_input = EOF; RL_SETSTATE (RL_STATE_INPUTPENDING); } ibuffer[push_index++] = key; #if 0 if (push_index >= ibuffer_len) #else if (push_index > ibuffer_len) #endif push_index = 0; return 1; } /* Make C be the next command to be executed. */ int rl_execute_next (int c) { rl_pending_input = c; RL_SETSTATE (RL_STATE_INPUTPENDING); return 0; } /* Clear any pending input pushed with rl_execute_next() */ int rl_clear_pending_input (void) { rl_pending_input = 0; RL_UNSETSTATE (RL_STATE_INPUTPENDING); return 0; } /* **************************************************************** */ /* */ /* Timeout utility */ /* */ /* **************************************************************** */ #if defined (RL_TIMEOUT_USE_SIGALRM) # if defined (HAVE_SETITIMER) static int set_alarm (unsigned int *secs, unsigned int *usecs) { struct itimerval it; timerclear (&it.it_interval); timerset (&it.it_value, *secs, *usecs); return setitimer (ITIMER_REAL, &it, NULL); } static void reset_alarm () { struct itimerval it; timerclear (&it.it_interval); timerclear (&it.it_value); setitimer (ITIMER_REAL, &it, NULL); } # else /* !HAVE_SETITIMER */ # if defined (__MINGW32_MAJOR_VERSION) /* mingw.org's MinGW doesn't have alarm(3). */ unsigned int alarm (unsigned int seconds) { return 0; } # endif /* __MINGW32_MAJOR_VERSION */ static int set_alarm (unsigned int *secs, unsigned int *usecs) { if (*secs == 0 || *usecs >= USEC_PER_SEC / 2) (*secs)++; *usecs = 0; return alarm (*secs); } static void reset_alarm () { alarm (0); } # endif /* !HAVE_SETITIMER */ #endif /* RL_TIMEOUT_USE_SIGALRM */ /* Set a timeout which will be used for the next call of `readline ()'. When (0, 0) are specified the timeout is cleared. */ int rl_set_timeout (unsigned int secs, unsigned int usecs) { timeout_duration.tv_sec = secs + usecs / USEC_PER_SEC; timeout_duration.tv_usec = usecs % USEC_PER_SEC; return 0; } /* Start measuring the time. Returns 0 on success. Returns -1 on error. */ int _rl_timeout_init (void) { unsigned int secs, usecs; /* Clear the timeout state of the previous edit */ RL_UNSETSTATE(RL_STATE_TIMEOUT); timerclear (&timeout_point); /* Return 0 when timeout is unset. */ if (timerisunset (&timeout_duration)) return 0; /* Return -1 on gettimeofday error. */ if (gettimeofday(&timeout_point, 0) != 0) { timerclear (&timeout_point); return -1; } secs = timeout_duration.tv_sec; usecs = timeout_duration.tv_usec; #if defined (RL_TIMEOUT_USE_SIGALRM) /* If select(2)/pselect(2) is unavailable, use SIGALRM. */ if (set_alarm (&secs, &usecs) < 0) return -1; #endif timeout_point.tv_sec += secs; timeout_point.tv_usec += usecs; if (timeout_point.tv_usec >= USEC_PER_SEC) { timeout_point.tv_sec++; timeout_point.tv_usec -= USEC_PER_SEC; } return 0; } /* Get the remaining time until the scheduled timeout. Returns -1 on error or no timeout set with secs and usecs unchanged. Returns 0 on an expired timeout with secs and usecs unchanged. Returns 1 when the timeout has not yet expired. The remaining time is stored in secs and usecs. When NULL is specified to either of the arguments, just the expiration is tested. */ int rl_timeout_remaining (unsigned int *secs, unsigned int *usecs) { struct timeval current_time; /* Return -1 when timeout is unset. */ if (timerisunset (&timeout_point)) { errno = 0; return -1; } /* Return -1 on error. errno is set by gettimeofday. */ if (gettimeofday(¤t_time, 0) != 0) return -1; /* Return 0 when timeout has already expired. */ /* could use timercmp (&timeout_point, ¤t_time, <) here */ if (current_time.tv_sec > timeout_point.tv_sec || (current_time.tv_sec == timeout_point.tv_sec && current_time.tv_usec >= timeout_point.tv_usec)) return 0; if (secs && usecs) { *secs = timeout_point.tv_sec - current_time.tv_sec; *usecs = timeout_point.tv_usec - current_time.tv_usec; if (timeout_point.tv_usec < current_time.tv_usec) { (*secs)--; *usecs += USEC_PER_SEC; } } return 1; } /* This should only be called if RL_TIMEOUT_USE_SELECT is defined. */ #if defined (RL_TIMEOUT_USE_SELECT) int _rl_timeout_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout, const sigset_t *sigmask) { int result; #if defined (HAVE_PSELECT) struct timespec ts; #else sigset_t origmask; struct timeval tv; #endif int tmout_status; struct timeval tmout; unsigned int sec, usec; /* When the remaining time for rl_timeout is shorter than the keyboard input timeout, replace `timeout' with the remaining time for `rl_timeout' and set `tmout_status = 1'. */ tmout_status = rl_timeout_remaining (&sec, &usec); tmout.tv_sec = sec; tmout.tv_usec = usec; if (tmout_status == 0) _rl_timeout_handle (); else if (tmout_status == 1) { if (timeout == NULL || timercmp (&tmout, timeout, <)) timeout = &tmout; else tmout_status = -1; } #if defined (HAVE_PSELECT) if (timeout) { TIMEVAL_TO_TIMESPEC (timeout, &ts); result = pselect (nfds, readfds, writefds, exceptfds, &ts, sigmask); } else result = pselect (nfds, readfds, writefds, exceptfds, NULL, sigmask); #else if (sigmask) sigprocmask (SIG_SETMASK, sigmask, &origmask); if (timeout) { tv.tv_sec = timeout->tv_sec; tv.tv_usec = timeout->tv_usec; result = select (nfds, readfds, writefds, exceptfds, &tv); } else result = select (nfds, readfds, writefds, exceptfds, NULL); if (sigmask) sigprocmask (SIG_SETMASK, &origmask, NULL); #endif if (tmout_status == 1 && result == 0) _rl_timeout_handle (); return result; } #endif static void _rl_timeout_handle () { if (rl_timeout_event_hook) (*rl_timeout_event_hook) (); RL_SETSTATE(RL_STATE_TIMEOUT); _rl_abort_internal (); } int _rl_timeout_handle_sigalrm () { #if defined (RL_TIMEOUT_USE_SIGALRM) if (timerisunset (&timeout_point)) return -1; /* Reset `timeout_point' to the current time to ensure that later calls of `rl_timeout_pending ()' return 0 (timeout expired). */ if (gettimeofday(&timeout_point, 0) != 0) timerclear (&timeout_point); reset_alarm (); _rl_timeout_handle (); #endif return -1; } /* **************************************************************** */ /* */ /* Character Input */ /* */ /* **************************************************************** */ /* Read a key, including pending input. */ int rl_read_key (void) { int c, r; if (rl_pending_input) { c = rl_pending_input; /* XXX - cast to unsigned char if > 0? */ rl_clear_pending_input (); } else { /* If input is coming from a macro, then use that. */ if (c = _rl_next_macro_key ()) return ((unsigned char)c); /* If the user has an event function, then call it periodically. */ if (rl_event_hook) { while (rl_event_hook) { if (rl_get_char (&c) != 0) break; if ((r = rl_gather_tyi ()) < 0) /* XXX - EIO */ { rl_done = 1; RL_SETSTATE (RL_STATE_DONE); return (errno == EIO ? (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF) : '\n'); } else if (r > 0) /* read something */ continue; RL_CHECK_SIGNALS (); if (rl_done) /* XXX - experimental */ return ('\n'); (*rl_event_hook) (); } } else { if (rl_get_char (&c) == 0) c = (*rl_getc_function) (rl_instream); /* fprintf(stderr, "rl_read_key: calling RL_CHECK_SIGNALS: _rl_caught_signal = %d\r\n", _rl_caught_signal); */ RL_CHECK_SIGNALS (); } } return (c); } int rl_getc (FILE *stream) { int result, ostate, osig; unsigned char c; int fd; #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) sigset_t empty_set; fd_set readfds; #endif fd = fileno (stream); while (1) { osig = _rl_caught_signal; ostate = rl_readline_state; RL_CHECK_SIGNALS (); #if defined (READLINE_CALLBACKS) /* Do signal handling post-processing here, but just in callback mode for right now because the signal cleanup can change some of the callback state, and we need to either let the application have a chance to react or abort some current operation that gets cleaned up by rl_callback_sigcleanup(). If not, we'll just run through the loop again. */ if (osig != 0 && (ostate & RL_STATE_CALLBACK)) goto postproc_signal; #endif /* We know at this point that _rl_caught_signal == 0 */ #if defined (__MINGW32__) if (isatty (fd)) return (_getch ()); /* "There is no error return." */ #endif result = 0; #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) /* At this point, if we have pselect, we're using select/pselect for the timeouts. We handled MinGW above. */ FD_ZERO (&readfds); FD_SET (fd, &readfds); # if defined (HANDLE_SIGNALS) result = _rl_timeout_select (fd + 1, &readfds, NULL, NULL, NULL, &_rl_orig_sigset); # else sigemptyset (&empty_set); sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &empty_set); result = _rl_timeout_select (fd + 1, &readfds, NULL, NULL, NULL, &empty_set); # endif /* HANDLE_SIGNALS */ if (result == 0) _rl_timeout_handle (); /* check the timeout */ #endif if (result >= 0) result = read (fd, &c, sizeof (unsigned char)); if (result == sizeof (unsigned char)) return (c); /* If zero characters are returned, then the file that we are reading from is empty! Return EOF in that case. */ if (result == 0) return (EOF); #if defined (__BEOS__) if (errno == EINTR) continue; #endif #if defined (EWOULDBLOCK) # define X_EWOULDBLOCK EWOULDBLOCK #else # define X_EWOULDBLOCK -99 #endif #if defined (EAGAIN) # define X_EAGAIN EAGAIN #else # define X_EAGAIN -99 #endif if (errno == X_EWOULDBLOCK || errno == X_EAGAIN) { if (sh_unset_nodelay_mode (fd) < 0) return (EOF); continue; } #undef X_EWOULDBLOCK #undef X_EAGAIN /* fprintf(stderr, "rl_getc: result = %d errno = %d\n", result, errno); */ /* Handle errors here. */ osig = _rl_caught_signal; ostate = rl_readline_state; /* If the error that we received was EINTR, then try again, this is simply an interrupted system call to read (). We allow the read to be interrupted if we caught SIGHUP, SIGTERM, or any of the other signals readline treats specially. If the application sets an event hook, call it for other signals. Otherwise (not EINTR), some error occurred, also signifying EOF. */ if (errno != EINTR) return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); /* fatal signals of interest */ #if defined (SIGHUP) else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM) #else else if (_rl_caught_signal == SIGTERM) #endif return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); /* keyboard-generated signals of interest */ #if defined (SIGQUIT) else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT) #else else if (_rl_caught_signal == SIGINT) #endif RL_CHECK_SIGNALS (); #if defined (SIGTSTP) else if (_rl_caught_signal == SIGTSTP) RL_CHECK_SIGNALS (); #endif /* non-keyboard-generated signals of interest */ #if defined (SIGWINCH) else if (_rl_caught_signal == SIGWINCH) RL_CHECK_SIGNALS (); #endif /* SIGWINCH */ #if defined (SIGALRM) else if (_rl_caught_signal == SIGALRM # if defined (SIGVTALRM) || _rl_caught_signal == SIGVTALRM # endif ) RL_CHECK_SIGNALS (); #endif /* SIGALRM */ postproc_signal: /* POSIX says read(2)/pselect(2)/select(2) don't return EINTR for any reason other than being interrupted by a signal, so we can safely call the application's signal event hook. */ if (rl_signal_event_hook) (*rl_signal_event_hook) (); #if defined (READLINE_CALLBACKS) else if (osig == SIGINT && (ostate & RL_STATE_CALLBACK) && (ostate & (RL_STATE_ISEARCH|RL_STATE_NSEARCH|RL_STATE_NUMERICARG))) /* just these cases for now */ _rl_abort_internal (); #endif } } #if defined (HANDLE_MULTIBYTE) /* read multibyte char */ int _rl_read_mbchar (char *mbchar, int size) { int mb_len, c; size_t mbchar_bytes_length; WCHAR_T wc; mbstate_t ps, ps_back; memset(&ps, 0, sizeof (mbstate_t)); memset(&ps_back, 0, sizeof (mbstate_t)); mb_len = 0; while (mb_len < size) { c = (mb_len == 0) ? _rl_bracketed_read_key () : rl_read_key (); if (c < 0) break; mbchar[mb_len++] = c; mbchar_bytes_length = MBRTOWC (&wc, mbchar, mb_len, &ps); if (mbchar_bytes_length == (size_t)(-1)) break; /* invalid byte sequence for the current locale */ else if (mbchar_bytes_length == (size_t)(-2)) { /* shorted bytes */ ps = ps_back; continue; } else if (mbchar_bytes_length == 0) { mbchar[0] = '\0'; /* null wide character */ mb_len = 1; break; } else if (mbchar_bytes_length > (size_t)(0)) break; } return mb_len; } /* Read a multibyte-character string whose first character is FIRST into the buffer MB of length MLEN. Returns the last character read, which may be FIRST. Used by the search functions, among others. Very similar to _rl_read_mbchar. */ int _rl_read_mbstring (int first, char *mb, int mlen) { int i, c, n; mbstate_t ps; c = first; memset (mb, 0, mlen); for (i = 0; c >= 0 && i < mlen; i++) { mb[i] = (char)c; memset (&ps, 0, sizeof (mbstate_t)); n = _rl_get_char_len (mb, &ps); if (n == -2) { /* Read more for multibyte character */ RL_SETSTATE (RL_STATE_MOREINPUT); c = rl_read_key (); RL_UNSETSTATE (RL_STATE_MOREINPUT); } else break; } return c; } #endif /* HANDLE_MULTIBYTE */ readline-8.3/NEWS000644 000436 000024 00000055641 15013112414 013732 0ustar00chetstaff000000 000000 This is a terse description of the new features added to readline-8.3 since the release of readline-8.2. New Features in Readline a. Output a newline if there is no prompt and readline reads an empty line. b. The history library falls back to stdio when writing the history list if mmap fails. c. New bindable variable `search-ignore-case', causes readline to perform case-insensitive incremental and non-incremental history searches. d. rl_full_quoting_desired: new application-settable variable, causes all completions to be quoted as if they were filenames. e. rl_macro_display_hook: new application-settable function pointer, used if the application wants to print macro values itself instead of letting readline do it f. rl_reparse_colors: new application-callable function, reparses $LS_COLORS (presumably after the user changes it) g. rl_completion_rewrite_hook: new application-settable function pointer, called to modify the word being completed before comparing it against pathnames from the file system. h. execute-named-command: a new bindable command that reads the name of a readline command from the standard input and executes it. Bound to M-x in emacs mode by default. i. Incremental and non-incremental searches now allow ^V/^Q (or, in the former case, anything bound to quoted-insert) to quote characters in the search string. j. Documentation has been significantly updated. k. New `force-meta-prefix' bindable variable, which forces the use of ESC as the meta prefix when using "\M-" in key bindings instead of overloading convert-meta. l. The default value for `readline-colored-completion-prefix' no longer has a leading `.'; the original report was based on a misunderstanding. m. There is a new bindable command, `export-completions', which writes the possible completions for a word to the standard output in a defined format. n. Readline can reset its idea of the screen dimensions when executing after a SIGCONT. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-8.2 since the release of readline-8.1. New Features in Readline a. There is now an HS_HISTORY_VERSION containing the version number of the history library for applications to use. b. History expansion better understands multiple history expansions that may contain strings that would ordinarily inhibit history expansion (e.g., `abc!$!$'). c. There is a new framework for readline timeouts, including new public functions to set timeouts and query how much time is remaining before a timeout hits, and a hook function that can trigger when readline times out. There is a new state value to indicate a timeout. d. Automatically bind termcap key sequences for page-up and page-down to history-search-backward and history-search-forward, respectively. e. There is a new `fetch-history' bindable command that retrieves the history entry corresponding to its numeric argument. Negative arguments count back from the end of the history. f. `vi-undo' is now a bindable command. g. There is a new option: `enable-active-region'. This separates control of the active region and bracketed-paste. It has the same default value as bracketed-paste, and enabling bracketed paste enables the active region. Users can now turn off the active region while leaving bracketed paste enabled. h. rl_completer_word_break_characters is now `const char *' like rl_basic_word_break_characters. i. Readline looks in $LS_COLORS for a custom filename extension (*.readline-colored-completion-prefix) and uses that as the default color for the common prefix displayed when `colored-completion-prefix' is set. j. Two new bindable string variables: active-region-start-color and active-region-end-color. The first sets the color used to display the active region; the second turns it off. If set, these are used in place of terminal standout mode. k. New readline state (RL_STATE_EOF) and application-visible variable (rl_eof_found) to allow applications to detect when readline reads EOF before calling the deprep-terminal hook. l. There is a new configuration option: --with-shared-termcap-library, which forces linking the shared readline library with the shared termcap (or curses/ncurses/termlib) library so applications don't have to do it. m. Readline now checks for changes to locale settings (LC_ALL/LC_CTYPE/LANG) each time it is called, and modifies the appropriate locale-specific display and key binding variables when the locale changes. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-8.1 since the release of readline-8.0. New Features in Readline a. If a second consecutive completion attempt produces matches where the first did not, treat it as a new completion attempt and insert a match as appropriate. b. Bracketed paste mode works in more places: incremental search strings, vi overstrike mode, character search, and reading numeric arguments. c. Readline automatically switches to horizontal scrolling if the terminal has only one line. d. Unbinding all key sequences bound to a particular readline function now descends into keymaps for multi-key sequences. e. rl-clear-display: new bindable command that clears the screen and, if possible, the scrollback buffer (bound to emacs mode M-C-l by default). f. New active mark and face feature: when enabled, it will highlight the text inserted by a bracketed paste (the `active region') and the text found by incremental and non-incremental history searches. This is tied to bracketed paste and can be disabled by turning off bracketed paste. g. Readline sets the mark in several additional commands. h. Bracketed paste mode is enabled by default. There is a configure-time option (--enable-bracketed-paste-default) to set the default to on or off. i. Readline tries to take advantage of the more regular structure of UTF-8 characters to identify the beginning and end of characters when moving through the line buffer. j. The bindable operate-and-get-next command (and its default bindings) are now part of readline instead of a bash-specific addition. k. The signal cleanup code now blocks SIGINT while processing after a SIGINT. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-8.0 since the release of readline-7.0. New Features in Readline a. Non-incremental vi-mode search (`N', `n') can search for a shell pattern, as Posix specifies (uses fnmatch(3) if available). b. There are new `next-screen-line' and `previous-screen-line' bindable commands, which move the cursor to the same column in the next, or previous, physical line, respectively. c. There are default key bindings for control-arrow-key key combinations. d. A negative argument (-N) to `quoted-insert' means to insert the next N characters using quoted-insert. e. New public function: rl_check_signals(), which allows applications to respond to signals that readline catches while waiting for input using a custom read function. f. There is new support for conditionally testing the readline version in an inputrc file, with a full set of arithmetic comparison operators available. g. There is a simple variable comparison facility available for use within an inputrc file. Allowable operators are equality and inequality; string variables may be compared to a value; boolean variables must be compared to either `on' or `off'; variable names are separated from the operator by whitespace. h. The history expansion library now understands command and process substitution and extended globbing and allows them to appear anywhere in a word. i. The history library has a new variable that allows applications to set the initial quoting state, so quoting state can be inherited from a previous line. j. Readline now allows application-defined keymap names; there is a new public function, rl_set_keymap_name(), to do that. k. The "Insert" keypad key, if available, now puts readline into overwrite mode. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-7.0 since the release of readline-6.3. New Features in Readline a. The history truncation code now uses the same error recovery mechanism as the history writing code, and restores the old version of the history file on error. The error recovery mechanism handles symlinked history files. b. There is a new bindable variable, `enable-bracketed-paste', which enables support for a terminal's bracketed paste mode. c. The editing mode indicators can now be strings and are user-settable (new `emacs-mode-string', `vi-cmd-mode-string' and `vi-ins-mode-string' variables). Mode strings can contain invisible character sequences. Setting mode strings to null strings restores the defaults. d. Prompt expansion adds the mode string to the last line of a multi-line prompt (one with embedded newlines). e. There is a new bindable variable, `colored-completion-prefix', which, if set, causes the common prefix of a set of possible completions to be displayed in color. f. There is a new bindable command `vi-yank-pop', a vi-mode version of emacs- mode yank-pop. g. The redisplay code underwent several efficiency improvements for multibyte locales. h. The insert-char function attempts to batch-insert all pending typeahead that maps to self-insert, as long as it is coming from the terminal. i. rl_callback_sigcleanup: a new application function that can clean up and unset any state set by readline's callback mode. Intended to be used after a signal. j. If an incremental search string has its last character removed with DEL, the resulting empty search string no longer matches the previous line. k. If readline reads a history file that begins with `#' (or the value of the history comment character) and has enabled history timestamps, the history entries are assumed to be delimited by timestamps. This allows multi-line history entries. l. Readline now throws an error if it parses a key binding without a terminating `:' or whitespace. m. The default binding for ^W in vi mode now uses word boundaries specified by Posix (vi-unix-word-rubout is bindable command name). n. rl_clear_visible_line: new application-callable function; clears all screen lines occupied by the current visible readline line. o. rl_tty_set_echoing: application-callable function that controls whether or not readline thinks it is echoing terminal output. p. Handle >| and strings of digits preceding and following redirection specifications as single tokens when tokenizing the line for history expansion. q. Fixed a bug with displaying completions when the prefix display length is greater than the length of the completions to be displayed. r. The :p history modifier now applies to the entire line, so any expansion specifying :p causes the line to be printed instead of expanded. s. New application-callable function: rl_pending_signal(): returns the signal number of any signal readline has caught but not yet handled. t. New application-settable variable: rl_persistent_signal_handlers: if set to a non-zero value, readline will enable the readline-6.2 signal handler behavior in callback mode: handlers are installed when rl_callback_handler_install is called and removed removed when a complete line has been read. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-6.3 since the release of readline-6.2. New Features in Readline a. Readline is now more responsive to SIGHUP and other fatal signals when reading input from the terminal or performing word completion but no longer attempts to run any not-allowable functions from a signal handler context. b. There are new bindable commands to search the history for the string of characters between the beginning of the line and the point (history-substring-search-forward, history-substring-search-backward) c. Readline allows quoted strings as the values of variables when setting them with `set'. As a side effect, trailing spaces and tabs are ignored when setting a string variable's value. d. The history library creates a backup of the history file when writing it and restores the backup on a write error. e. New application-settable variable: rl_filename_stat_hook: a function called with a filename before using it in a call to stat(2). Bash uses it to expand shell variables so things like $HOME/Downloads have a slash appended. f. New bindable function `print-last-kbd-macro', prints the most-recently- defined keyboard macro in a reusable format. g. New user-settable variable `colored-stats', enables use of colored text to denote file types when displaying possible completions (colored analog of visible-stats). h. New user-settable variable `keyseq-timout', acts as an inter-character timeout when reading input or incremental search strings. i. New application-callable function: rl_clear_history. Clears the history list and frees all readline-associated private data. j. New user-settable variable, show-mode-in-prompt, adds a characters to the beginning of the prompt indicating the current editing mode. k. New application-settable variable: rl_input_available_hook; function to be called when readline detects there is data available on its input file descriptor. l. Readline calls an application-set event hook (rl_event_hook) after it gets a signal while reading input (read returns -1/EINTR but readline does not handle the signal immediately) to allow the application to handle or otherwise note it. m. If the user-settable variable `history-size' is set to a value less than 0, the history list size is unlimited. n. New application-settable variable: rl_signal_event_hook; function that is called when readline is reading terminal input and read(2) is interrupted by a signal. Currently not called for SIGHUP or SIGTERM. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-6.2 since the release of readline-6.1. a. The history library does not try to write the history filename in the current directory if $HOME is unset. This closes a potential security problem if the application does not specify a history filename. b. New bindable variable `completion-display-width' to set the number of columns used when displaying completions. c. New bindable variable `completion-case-map' to cause case-insensitive completion to treat `-' and `_' as identical. d. There are new bindable vi-mode command names to avoid readline's case- insensitive matching not allowing them to be bound separately. e. New bindable variable `menu-complete-display-prefix' causes the menu completion code to display the common prefix of the possible completions before cycling through the list, instead of after. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-6.1 since the release of readline-6.0. New Features in Readline a. New bindable function: menu-complete-backward. b. In the vi insertion keymap, C-n is now bound to menu-complete by default, and C-p to menu-complete-backward. c. When in vi command mode, repeatedly hitting ESC now does nothing, even when ESC introduces a bound key sequence. This is closer to how historical vi behaves. d. New bindable function: skip-csi-sequence. Can be used as a default to consume key sequences generated by keys like Home and End without having to bind all keys. e. New application-settable function: rl_filename_rewrite_hook. Can be used to rewrite or modify filenames read from the file system before they are compared to the word to be completed. f. New bindable variable: skip-completed-text, active when completing in the middle of a word. If enabled, it means that characters in the completion that match characters in the remainder of the word are "skipped" rather than inserted into the line. g. The pre-readline-6.0 version of menu completion is available as "old-menu-complete" for users who do not like the readline-6.0 version. h. New bindable variable: echo-control-characters. If enabled, and the tty ECHOCTL bit is set, controls the echoing of characters corresponding to keyboard-generated signals. i. New bindable variable: enable-meta-key. Controls whether or not readline sends the smm/rmm sequences if the terminal indicates it has a meta key that enables eight-bit characters. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-6.0 since the release of readline-5.2. New Features in Readline a. A new variable, rl_sort_completion_matches; allows applications to inhibit match list sorting (but beware: some things don't work right if applications do this). b. A new variable, rl_completion_invoking_key; allows applications to discover the key that invoked rl_complete or rl_menu_complete. c. The functions rl_block_sigint and rl_release_sigint are now public and available to calling applications who want to protect critical sections (like redisplay). d. The functions rl_save_state and rl_restore_state are now public and available to calling applications; documented rest of readline's state flag values. e. A new user-settable variable, `history-size', allows setting the maximum number of entries in the history list. f. There is a new implementation of menu completion, with several improvements over the old; the most notable improvement is a better `completions browsing' mode. g. The menu completion code now uses the rl_menu_completion_entry_function variable, allowing applications to provide their own menu completion generators. h. There is support for replacing a prefix of a pathname with a `...' when displaying possible completions. This is controllable by setting the `completion-prefix-display-length' variable. Matches with a common prefix longer than this value have the common prefix replaced with `...'. i. There is a new `revert-all-at-newline' variable. If enabled, readline will undo all outstanding changes to all history lines when `accept-line' is executed. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-5.2 since the release of readline-5.1. New Features in Readline a. Calling applications can now set the keyboard timeout to 0, allowing poll-like behavior. b. The value of SYS_INPUTRC (configurable at compilation time) is now used as the default last-ditch startup file. c. The history file reading functions now allow windows-like \r\n line terminators. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-5.1 since the release of readline-5.0. New Features in Readline a. The key sequence sent by the keypad `delete' key is now automatically bound to delete-char. b. A negative argument to menu-complete now cycles backward through the completion list. c. A new bindable readline variable: bind-tty-special-chars. If non-zero, readline will bind the terminal special characters to their readline equivalents when it's called (on by default). d. New bindable command: vi-rubout. Saves deleted text for possible reinsertion, as with any vi-mode `text modification' command; `X' is bound to this in vi command mode. e. If the rl_completion_query_items is set to a value < 0, readline never asks the user whether or not to view the possible completions. f. New application-callable auxiliary function, rl_variable_value, returns a string corresponding to a readline variable's value. g. When parsing inputrc files and variable binding commands, the parser strips trailing whitespace from values assigned to boolean variables before checking them. h. A new external application-controllable variable that allows the LINES and COLUMNS environment variables to set the window size regardless of what the kernel returns. ------------------------------------------------------------------------------- This is a terse description of the new features added to readline-5.0 since the release of readline-4.3. New Features in Readline a. History expansion has a new `a' modifier equivalent to the `g' modifier for compatibility with the BSD csh. b. History expansion has a new `G' modifier equivalent to the BSD csh `g' modifier, which performs a substitution once per word. c. All non-incremental search operations may now undo the operation of replacing the current line with the history line. d. The text inserted by an `a' command in vi mode can be reinserted with `.'. e. New bindable variable, `show-all-if-unmodified'. If set, the readline completer will list possible completions immediately if there is more than one completion and partial completion cannot be performed. f. There is a new application-callable `free_history_entry()' function. g. History list entries now contain timestamp information; the history file functions know how to read and write timestamp information associated with each entry. h. Four new key binding functions have been added: rl_bind_key_if_unbound() rl_bind_key_if_unbound_in_map() rl_bind_keyseq_if_unbound() rl_bind_keyseq_if_unbound_in_map() i. New application variable, rl_completion_quote_character, set to any quote character readline finds before it calls the application completion function. j. New application variable, rl_completion_suppress_quote, settable by an application completion function. If set to non-zero, readline does not attempt to append a closing quote to a completed word. k. New application variable, rl_completion_found_quote, set to a non-zero value if readline determines that the word to be completed is quoted. Set before readline calls any application completion function. l. New function hook, rl_completion_word_break_hook, called when readline needs to break a line into words when completion is attempted. Allows the word break characters to vary based on position in the line. m. New bindable command: unix-filename-rubout. Does the same thing as unix-word-rubout, but adds `/' to the set of word delimiters. n. When listing completions, directories have a `/' appended if the `mark-directories' option has been enabled. readline-8.3/m4/000755 000436 000024 00000000000 15030514135 013545 5ustar00chetstaff000000 000000 readline-8.3/rltty.h000644 000436 000024 00000004743 11130207321 014555 0ustar00chetstaff000000 000000 /* rltty.h - tty driver-related definitions used by some library files. */ /* Copyright (C) 1995-2009 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_RLTTY_H_) #define _RLTTY_H_ /* Posix systems use termios and the Posix signal functions. */ #if defined (TERMIOS_TTY_DRIVER) # include #endif /* TERMIOS_TTY_DRIVER */ /* System V machines use termio. */ #if defined (TERMIO_TTY_DRIVER) # include # if !defined (TCOON) # define TCOON 1 # endif #endif /* TERMIO_TTY_DRIVER */ /* Other (BSD) machines use sgtty. */ #if defined (NEW_TTY_DRIVER) # include #endif #include "rlwinsize.h" /* Define _POSIX_VDISABLE if we are not using the `new' tty driver and it is not already defined. It is used both to determine if a special character is disabled and to disable certain special characters. Posix systems should set to 0, USG systems to -1. */ #if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE) # if defined (_SVR4_VDISABLE) # define _POSIX_VDISABLE _SVR4_VDISABLE # else # if defined (_POSIX_VERSION) # define _POSIX_VDISABLE 0 # else /* !_POSIX_VERSION */ # define _POSIX_VDISABLE -1 # endif /* !_POSIX_VERSION */ # endif /* !_SVR4_DISABLE */ #endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */ typedef struct _rl_tty_chars { unsigned char t_eof; unsigned char t_eol; unsigned char t_eol2; unsigned char t_erase; unsigned char t_werase; unsigned char t_kill; unsigned char t_reprint; unsigned char t_intr; unsigned char t_quit; unsigned char t_susp; unsigned char t_dsusp; unsigned char t_start; unsigned char t_stop; unsigned char t_lnext; unsigned char t_flush; unsigned char t_status; } _RL_TTY_CHARS; #endif /* _RLTTY_H_ */ readline-8.3/bind.c000644 000436 000024 00000233773 14671111507 014332 0ustar00chetstaff000000 000000 /* bind.c -- key binding and startup file support for the readline library. */ /* Copyright (C) 1987-2024 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #if defined (__TANDEM) # include #endif #if defined (HAVE_CONFIG_H) # include #endif #include #include #include #if defined (HAVE_SYS_FILE_H) # include #endif /* HAVE_SYS_FILE_H */ #if defined (HAVE_UNISTD_H) # include #endif /* HAVE_UNISTD_H */ #if defined (HAVE_STDLIB_H) # include #else # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ #include #if !defined (errno) extern int errno; #endif /* !errno */ #include "posixstat.h" /* System-specific feature definitions and include files. */ #include "rldefs.h" /* Some standard library routines. */ #include "readline.h" #include "history.h" #include "rlprivate.h" #include "rlshell.h" #include "xmalloc.h" /* Variables exported by this file. */ Keymap rl_binding_keymap; /* Functions exported by this file. */ rl_macro_print_func_t *rl_macro_display_hook = (rl_macro_print_func_t *)NULL; static int _rl_skip_to_delim (char *, int, int); static void _rl_init_file_error (const char *, ...) __attribute__((__format__ (printf, 1, 2))); static rl_command_func_t *_rl_function_of_keyseq_internal (const char *, size_t, Keymap, int *); static char *_rl_read_file (char *, size_t *); static int _rl_read_init_file (const char *, int); static int glean_key_from_name (char *); static int find_boolean_var (const char *); static int find_string_var (const char *); static const char *boolean_varname (int); static const char *string_varname (int); static char *_rl_get_string_variable_value (const char *); static int substring_member_of_array (const char *, const char * const *); static int _rl_get_keymap_by_name (const char *); static int _rl_get_keymap_by_map (Keymap); static int currently_reading_init_file; /* used only in this file */ static int _rl_prefer_visible_bell = 1; /* Currently confined to this file for key bindings. If enabled (> 0), we force meta key bindings to use the meta prefix (ESC). If unset (-1) or disabled (0), we use the current value of _rl_convert_meta_chars_to_ascii as in previous readline versions. */ static int _rl_force_meta_prefix = 0; /* Do we want to force binding "\M-C" to the meta prefix (ESC-C)? */ #define FORCE_META_PREFIX() (_rl_force_meta_prefix > 0 ? 1 : _rl_convert_meta_chars_to_ascii) #define OP_EQ 1 #define OP_NE 2 #define OP_GT 3 #define OP_GE 4 #define OP_LT 5 #define OP_LE 6 #define OPSTART(c) ((c) == '=' || (c) == '!' || (c) == '<' || (c) == '>') #define CMPSTART(c) ((c) == '=' || (c) == '!') /* **************************************************************** */ /* */ /* Binding keys */ /* */ /* **************************************************************** */ /* rl_add_defun (char *name, rl_command_func_t *function, int key) Add NAME to the list of named functions. Make FUNCTION be the function that gets called. If KEY is not -1, then bind it. */ int rl_add_defun (const char *name, rl_command_func_t *function, int key) { if (key != -1) rl_bind_key (key, function); rl_add_funmap_entry (name, function); return 0; } /* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */ int rl_bind_key (int key, rl_command_func_t *function) { char keyseq[4]; int l; if (key < 0 || key > largest_char) return (key); /* Want to make this a multi-character key sequence with an ESC prefix */ if (META_CHAR (key) && FORCE_META_PREFIX()) { if (_rl_keymap[ESC].type == ISKMAP) { Keymap escmap; escmap = FUNCTION_TO_KEYMAP (_rl_keymap, ESC); key = UNMETA (key); escmap[key].type = ISFUNC; escmap[key].function = function; return (0); } /* Otherwise, let's just let rl_generic_bind handle the key sequence. We start it off with ESC here and let the code below add the rest of the sequence. */ keyseq[0] = ESC; l = 1; key = UNMETA(key); goto bind_keyseq; } /* If it's bound to a function or macro, just overwrite. Otherwise we have to treat it as a key sequence so rl_generic_bind handles shadow keymaps for us. If we are binding '\' or \C-@ (NUL) make sure to escape it so it makes it through the call to rl_translate_keyseq. */ if (_rl_keymap[key].type != ISKMAP) { if (_rl_keymap[key].type == ISMACR) xfree ((char *)_rl_keymap[key].function); _rl_keymap[key].type = ISFUNC; _rl_keymap[key].function = function; } else { l = 0; bind_keyseq: if (key == '\\') { keyseq[l++] = '\\'; keyseq[l++] = '\\'; } else if (key == '\0') { keyseq[l++] = '\\'; keyseq[l++] = '0'; } else keyseq[l++] = key; keyseq[l] = '\0'; rl_bind_keyseq (keyseq, function); } rl_binding_keymap = _rl_keymap; return (0); } /* Bind KEY to FUNCTION in MAP. Returns non-zero in case of invalid KEY. */ int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map) { int result; Keymap oldmap; oldmap = _rl_keymap; _rl_keymap = map; result = rl_bind_key (key, function); _rl_keymap = oldmap; return (result); } /* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right now, this is always used to attempt to bind the arrow keys. */ int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *default_func, Keymap kmap) { char *keyseq; keyseq = rl_untranslate_keyseq ((unsigned char)key); return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap)); } int rl_bind_key_if_unbound (int key, rl_command_func_t *default_func) { char *keyseq; keyseq = rl_untranslate_keyseq ((unsigned char)key); return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); } /* Make KEY do nothing in the currently selected keymap. Returns non-zero in case of error. This is not the same as self-insert; this makes it a dead key. */ int rl_unbind_key (int key) { return (rl_bind_key (key, (rl_command_func_t *)NULL)); } /* Make KEY do nothing in MAP. Returns non-zero in case of error. */ int rl_unbind_key_in_map (int key, Keymap map) { return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map)); } /* Unbind all keys bound to FUNCTION in MAP. */ int rl_unbind_function_in_map (rl_command_func_t *func, Keymap map) { register int i, rval; for (i = rval = 0; i < KEYMAP_SIZE; i++) { if (map[i].type == ISFUNC && map[i].function == func) { map[i].function = (rl_command_func_t *)NULL; rval = 1; } else if (map[i].type == ISKMAP) { int r; r = rl_unbind_function_in_map (func, FUNCTION_TO_KEYMAP (map, i)); if (r == 1) rval = 1; } } return rval; } /* Unbind all keys bound to COMMAND, which is a bindable command name, in MAP */ int rl_unbind_command_in_map (const char *command, Keymap map) { rl_command_func_t *func; func = rl_named_function (command); if (func == 0) return 0; return (rl_unbind_function_in_map (func, map)); } /* Bind the key sequence represented by the string KEYSEQ to FUNCTION, starting in the current keymap. This makes new keymaps as necessary. */ int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function) { return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap)); } /* Bind the key sequence represented by the string KEYSEQ to FUNCTION. This makes new keymaps as necessary. The initial place to do bindings is in MAP. */ int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) { return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); } /* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */ int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map) { return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); } /* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right now, this is always used to attempt to bind the arrow keys, hence the check for rl_vi_movement_mode. */ int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *default_func, Keymap kmap) { rl_command_func_t *func; char *keys; int keys_len; if (keyseq) { /* Handle key sequences that require translations and `raw' ones that don't. This might be a problem with backslashes. */ keys = (char *)xmalloc (1 + (2 * strlen (keyseq))); if (rl_translate_keyseq (keyseq, keys, &keys_len)) { xfree (keys); return -1; } func = rl_function_of_keyseq_len (keys, keys_len, kmap, (int *)NULL); xfree (keys); #if defined (VI_MODE) if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode) #else if (!func || func == rl_do_lowercase_version) #endif return (rl_bind_keyseq_in_map (keyseq, default_func, kmap)); else return 1; } return 0; } int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *default_func) { return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); } /* Bind the key sequence represented by the string KEYSEQ to the string of characters MACRO. This makes new keymaps as necessary. The initial place to do bindings is in MAP. */ int rl_macro_bind (const char *keyseq, const char *macro, Keymap map) { char *macro_keys; int macro_keys_len; macro_keys = (char *)xmalloc ((2 * strlen (macro)) + 1); if (rl_translate_keyseq (macro, macro_keys, ¯o_keys_len)) { xfree (macro_keys); return -1; } rl_generic_bind (ISMACR, keyseq, macro_keys, map); return 0; } /* Bind the key sequence represented by the string KEYSEQ to the arbitrary pointer DATA. TYPE says what kind of data is pointed to by DATA, right now this can be a function (ISFUNC), a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps as necessary. The initial place to do bindings is in MAP. */ int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map) { char *keys; int keys_len, prevkey, ic; register int i; KEYMAP_ENTRY k; Keymap prevmap; k.function = 0; /* If no keys to bind to, exit right away. */ if (keyseq == 0 || *keyseq == 0) { if (type == ISMACR) xfree (data); return -1; } keys = (char *)xmalloc (1 + (2 * strlen (keyseq))); /* Translate the ASCII representation of KEYSEQ into an array of characters. Stuff the characters into KEYS, and the length of KEYS into KEYS_LEN. */ if (rl_translate_keyseq (keyseq, keys, &keys_len)) { xfree (keys); return -1; } prevmap = map; prevkey = keys[0]; /* Bind keys, making new keymaps as necessary. */ for (i = 0; i < keys_len; i++) { unsigned char uc = keys[i]; if (i > 0) prevkey = ic; ic = uc; if (ic < 0 || ic >= KEYMAP_SIZE) { xfree (keys); return -1; } /* We rely on rl_translate_keyseq to do convert meta-chars to key sequences with the meta prefix (ESC). */ if ((i + 1) < keys_len) { if (map[ic].type != ISKMAP) { /* We allow subsequences of keys. If a keymap is being created that will `shadow' an existing function or macro key binding, we save that keybinding into the ANYOTHERKEY index in the new map. The dispatch code will look there to find the function to execute if the subsequence is not matched. ANYOTHERKEY was chosen to be greater than UCHAR_MAX. */ k = map[ic]; map[ic].type = ISKMAP; map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap()); } prevmap = map; map = FUNCTION_TO_KEYMAP (map, ic); /* The dispatch code will return this function if no matching key sequence is found in the keymap. This (with a little help from the dispatch code in readline.c) allows `a' to be mapped to something, `abc' to be mapped to something else, and the function bound to `a' to be executed when the user types `abx', leaving `bx' in the input queue. */ if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR)) { map[ANYOTHERKEY] = k; k.function = 0; } } else { if (map[ic].type == ISKMAP) { prevmap = map; map = FUNCTION_TO_KEYMAP (map, ic); ic = ANYOTHERKEY; /* If we're trying to override a keymap with a null function (e.g., trying to unbind it), we can't use a null pointer here because that's indistinguishable from having not been overridden. We use a special bindable function that does nothing. */ if (type == ISFUNC && data == 0) data = (char *)_rl_null_function; } if (map[ic].type == ISMACR) xfree ((char *)map[ic].function); map[ic].function = KEYMAP_TO_FUNCTION (data); map[ic].type = type; } rl_binding_keymap = map; } /* If we unbound a key (type == ISFUNC, data == 0), and the prev keymap points to the keymap where we unbound the key (sanity check), and the current binding keymap is empty (rl_empty_keymap() returns non-zero), and the binding keymap has ANYOTHERKEY set with type == ISFUNC (overridden function), delete the now-empty keymap, take the previously- overridden function and remove the override. */ /* Right now, this only works one level back. */ if (type == ISFUNC && data == 0 && prevmap[prevkey].type == ISKMAP && (FUNCTION_TO_KEYMAP(prevmap, prevkey) == rl_binding_keymap) && rl_binding_keymap[ANYOTHERKEY].type == ISFUNC && rl_empty_keymap (rl_binding_keymap)) { prevmap[prevkey].type = rl_binding_keymap[ANYOTHERKEY].type; prevmap[prevkey].function = rl_binding_keymap[ANYOTHERKEY].function; rl_discard_keymap (rl_binding_keymap); rl_binding_keymap = prevmap; } xfree (keys); return 0; } /* Translate the ASCII representation of SEQ, stuffing the values into ARRAY, an array of characters. LEN gets the final length of ARRAY. Return non-zero if there was an error parsing SEQ. */ int rl_translate_keyseq (const char *seq, char *array, int *len) { register int i, l, temp; int has_control, has_meta; unsigned char c; has_control = 0; has_meta = 0; /* When there are incomplete prefixes \C- or \M- (has_control || has_meta) without base character at the end of SEQ, they are processed as the prefixes for '\0'. */ for (i = l = 0; (c = seq[i]) || has_control || has_meta; i++) { /* Only backslashes followed by a non-null character are handled specially. Trailing backslash (backslash followed by '\0') is processed as a normal character. */ if (c == '\\' && seq[i + 1] != '\0') { c = seq[++i]; /* Handle \C- and \M- prefixes. */ if (c == 'C' && seq[i + 1] == '-') { i++; has_control = 1; continue; } else if (c == 'M' && seq[i + 1] == '-') { i++; has_meta = 1; continue; } /* Translate other backslash-escaped characters. These are the same escape sequences that bash's `echo' and `printf' builtins handle, with the addition of \d -> RUBOUT. A backslash preceding a character that is not special is stripped. */ switch (c) { case 'a': c = '\007'; break; case 'b': c = '\b'; break; case 'd': c = RUBOUT; /* readline-specific */ break; case 'e': c = ESC; break; case 'f': c = '\f'; break; case 'n': c = NEWLINE; break; case 'r': c = RETURN; break; case 't': c = TAB; break; case 'v': c = 0x0B; break; case '\\': c = '\\'; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': i++; for (temp = 2, c -= '0'; ISOCTAL ((unsigned char)seq[i]) && temp--; i++) c = (c * 8) + OCTVALUE (seq[i]); i--; /* auto-increment in for loop */ c &= largest_char; break; case 'x': i++; for (temp = 2, c = 0; ISXDIGIT ((unsigned char)seq[i]) && temp--; i++) c = (c * 16) + HEXVALUE (seq[i]); if (temp == 2) c = 'x'; i--; /* auto-increment in for loop */ c &= largest_char; break; default: /* backslashes before non-special chars just add the char */ c &= largest_char; break; /* the backslash is stripped */ } } /* Process \C- and \M- flags */ if (has_control) { /* Special treatment for C-? */ c = (c == '?') ? RUBOUT : CTRL (_rl_to_upper (c)); has_control = 0; } if (has_meta) c = META (c); /* If force-meta-prefix is turned on, convert a meta char to a key sequence, but only if it uses the \M- syntax. */ if (META_CHAR (c) && has_meta && FORCE_META_PREFIX()) { int x = UNMETA (c); if (x) { array[l++] = ESC; /* ESC is meta-prefix */ array[l++] = x; } else array[l++] = c; /* just do the best we can without sticking a NUL in there. */ } else array[l++] = (c); has_meta = 0; /* Null characters may be processed for incomplete prefixes at the end of sequence */ if (seq[i] == '\0') break; } *len = l; array[l] = '\0'; return (0); } static int _rl_isescape (int c) { switch (c) { case '\007': case '\b': case '\f': case '\n': case '\r': case TAB: case 0x0b: return (1); default: return (0); } } static int _rl_escchar (int c) { switch (c) { case '\007': return ('a'); case '\b': return ('b'); case '\f': return ('f'); case '\n': return ('n'); case '\r': return ('r'); case TAB: return ('t'); case 0x0b: return ('v'); default: return (c); } } char * rl_untranslate_keyseq (int seq) { static char kseq[16]; int i; unsigned char c; i = 0; c = seq; if (META_CHAR (c)) { kseq[i++] = '\\'; kseq[i++] = 'M'; kseq[i++] = '-'; c = UNMETA (c); } if (c == ESC) /* look at _rl_force_meta_prefix here? */ { kseq[i++] = '\\'; c = 'e'; } else if (CTRL_CHAR (c) || c == RUBOUT) { kseq[i++] = '\\'; kseq[i++] = 'C'; kseq[i++] = '-'; c = (c == RUBOUT) ? '?' : _rl_to_lower (UNCTRL (c)); } if (c == '\\' || c == '"') kseq[i++] = '\\'; kseq[i++] = (unsigned char) c; kseq[i] = '\0'; return kseq; } char * _rl_untranslate_macro_value (char *seq, int use_escapes) { char *ret, *r, *s; unsigned char c; r = ret = (char *)xmalloc (8 * strlen (seq) + 1); for (s = seq; *s; s++) { c = *s; if (META_CHAR (c)) { *r++ = '\\'; *r++ = 'M'; *r++ = '-'; c = UNMETA (c); } /* We want to keep from printing literal control chars */ if (c == ESC) { *r++ = '\\'; c = 'e'; } else if (CTRL_CHAR (c)) { *r++ = '\\'; if (use_escapes && _rl_isescape (c)) c = _rl_escchar (c); else { *r++ = 'C'; *r++ = '-'; c = _rl_to_lower (UNCTRL (c)); } } else if (c == RUBOUT) { *r++ = '\\'; *r++ = 'C'; *r++ = '-'; c = '?'; } if (c == '\\' || c == '"') *r++ = '\\'; *r++ = c; } *r = '\0'; return ret; } /* Return a pointer to the function that STRING represents. If STRING doesn't have a matching function, then a NULL pointer is returned. The string match is case-insensitive. */ rl_command_func_t * rl_named_function (const char *string) { register int i; rl_initialize_funmap (); for (i = 0; funmap[i]; i++) if (_rl_stricmp (funmap[i]->name, string) == 0) return (funmap[i]->function); return ((rl_command_func_t *)NULL); } /* Return the function (or macro) definition which would be invoked via KEYSEQ if executed in MAP. If MAP is NULL, then the current keymap is used. TYPE, if non-NULL, is a pointer to an int which will receive the type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap), or ISMACR (macro). */ static rl_command_func_t * _rl_function_of_keyseq_internal (const char *keyseq, size_t len, Keymap map, int *type) { register int i; if (map == 0) map = _rl_keymap; for (i = 0; keyseq && i < len; i++) { unsigned char ic = keyseq[i]; if (META_CHAR (ic) && FORCE_META_PREFIX()) /* XXX - might not want this */ { if (map[ESC].type == ISKMAP) { map = FUNCTION_TO_KEYMAP (map, ESC); ic = UNMETA (ic); } /* XXX - should we just return NULL here, since this obviously doesn't match? */ else { if (type) *type = map[ESC].type; return (map[ESC].function); } } if (map[ic].type == ISKMAP) { /* If this is the last key in the key sequence, return the map. */ if (i + 1 == len) { if (type) *type = ISKMAP; return (map[ic].function); } else map = FUNCTION_TO_KEYMAP (map, ic); } /* If we're not at the end of the key sequence, and the current key is bound to something other than a keymap, then the entire key sequence is not bound. */ else if (map[ic].type != ISKMAP && i+1 < len) return ((rl_command_func_t *)NULL); else /* map[ic].type != ISKMAP && i+1 == len */ { if (type) *type = map[ic].type; return (map[ic].function); } } return ((rl_command_func_t *) NULL); } rl_command_func_t * rl_function_of_keyseq (const char *keyseq, Keymap map, int *type) { return _rl_function_of_keyseq_internal (keyseq, strlen (keyseq), map, type); } rl_command_func_t * rl_function_of_keyseq_len (const char *keyseq, size_t len, Keymap map, int *type) { return _rl_function_of_keyseq_internal (keyseq, len, map, type); } /* Assuming there is a numeric argument at the beginning of KEYSEQ (the caller is responsible for checking), return the index of the portion of the key sequence following the numeric argument. If there's no numeric argument (?), or if KEYSEQ consists solely of a numeric argument (?), return -1. */ int rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map) { register int i, j, parsing_digits; unsigned int ic; /* int to handle ANYOTHERKEY */ Keymap map0; if (map == 0) map = _rl_keymap; map0 = map; /* Make sure to add the digits following the initial one (e.g., the binding to digit-argument) and the optional `-' in a binding to digit-argument or universal-argument to rl_executing_keyseq. This is basically everything read by rl_digit_loop. */ for (i = j = parsing_digits = 0; keyseq && i < len; i++) { ic = keyseq[i]; if (parsing_digits == 2) { if (ic == '-') /* skip over runs of minus chars */ { j = i + 1; continue; } parsing_digits = 1; } if (parsing_digits) { if (_rl_digit_p (ic)) { j = i + 1; continue; } parsing_digits = 0; } if (map[ic].type == ISKMAP) { map = FUNCTION_TO_KEYMAP (map, ic); if (i + 1 == len) ic = ANYOTHERKEY; else continue; } if (map[ic].type == ISFUNC) { #if defined (VI_MODE) if (map[ic].function != rl_digit_argument && map[ic].function != rl_universal_argument && map[ic].function != rl_vi_arg_digit) #else if (map[ic].function != rl_digit_argument && map[ic].function != rl_universal_argument) #endif return (j); /* We don't bother with a keyseq that is only a numeric argument */ if (i + 1 == len) return -1; parsing_digits = 1; /* This logic should be identical to rl_digit_loop */ /* We accept M-- as equivalent to M--1, C-u- as equivalent to C-u-1 but set parsing_digits to 2 to note that we saw `-'. See above for the check that skips over one or more `-' characters. */ if (map[ic].function == rl_universal_argument || (map[ic].function == rl_digit_argument && ic == '-')) parsing_digits = 2; map = map0; j = i + 1; } } /* If we're still parsing digits by the time we get here, we don't allow a key sequence that consists solely of a numeric argument */ return -1; } /* The last key bindings file read. */ static char *last_readline_init_file = (char *)NULL; /* The file we're currently reading key bindings from. */ static const char *current_readline_init_file; static int current_readline_init_include_level; static int current_readline_init_lineno; /* Read FILENAME into a locally-allocated buffer and return the buffer. The size of the buffer is returned in *SIZEP. Returns NULL if any errors were encountered. */ static char * _rl_read_file (char *filename, size_t *sizep) { struct stat finfo; size_t file_size; char *buffer; int i, file; file = open (filename, O_RDONLY, 0666); /* If the open is interrupted, retry once */ if (file < 0 && errno == EINTR) { RL_CHECK_SIGNALS (); file = open (filename, O_RDONLY, 0666); } if ((file < 0) || (fstat (file, &finfo) < 0)) { i = errno; if (file >= 0) close (file); errno = i; return ((char *)NULL); } file_size = (size_t)finfo.st_size; /* check for overflow on very large files */ if (file_size != finfo.st_size || file_size + 1 < file_size) { i = errno; if (file >= 0) close (file); #if defined (EFBIG) errno = EFBIG; #else errno = i; #endif return ((char *)NULL); } /* Read the file into BUFFER. */ buffer = (char *)xmalloc (file_size + 1); i = read (file, buffer, file_size); close (file); if (i < 0) { xfree (buffer); return ((char *)NULL); } RL_CHECK_SIGNALS (); buffer[i] = '\0'; if (sizep) *sizep = i; return (buffer); } /* Re-read the current keybindings file. */ int rl_re_read_init_file (int count, int ignore) { int r; r = rl_read_init_file ((const char *)NULL); rl_set_keymap_from_edit_mode (); return r; } /* Do key bindings from a file. If FILENAME is NULL it defaults to the first non-null filename from this list: 1. the filename used for the previous call 2. the value of the shell variable `INPUTRC' 3. ~/.inputrc 4. /etc/inputrc If the file existed and could be opened and read, 0 is returned, otherwise errno is returned. */ int rl_read_init_file (const char *filename) { /* Default the filename. */ if (filename == 0) filename = last_readline_init_file; if (filename == 0) filename = sh_get_env_value ("INPUTRC"); if (filename == 0 || *filename == 0) { filename = DEFAULT_INPUTRC; /* Try to read DEFAULT_INPUTRC; fall back to SYS_INPUTRC on failure */ if (_rl_read_init_file (filename, 0) == 0) return 0; filename = SYS_INPUTRC; } #if defined (__MSDOS__) if (_rl_read_init_file (filename, 0) == 0) return 0; filename = "~/_inputrc"; #endif return (_rl_read_init_file (filename, 0)); } static int _rl_read_init_file (const char *filename, int include_level) { register int i; char *buffer, *openname, *line, *end; size_t file_size; current_readline_init_file = filename; current_readline_init_include_level = include_level; openname = tilde_expand (filename); buffer = _rl_read_file (openname, &file_size); xfree (openname); RL_CHECK_SIGNALS (); if (buffer == 0) return (errno); if (include_level == 0 && filename != last_readline_init_file) { FREE (last_readline_init_file); last_readline_init_file = savestring (filename); } currently_reading_init_file = 1; /* Loop over the lines in the file. Lines that start with `#' are comments; all other lines are commands for readline initialization. */ current_readline_init_lineno = 1; line = buffer; end = buffer + file_size; while (line < end) { /* Find the end of this line. */ for (i = 0; line + i != end && line[i] != '\n'; i++); #if defined (__CYGWIN__) /* ``Be liberal in what you accept.'' */ if (line[i] == '\n' && line[i-1] == '\r') line[i - 1] = '\0'; #endif /* Mark end of line. */ line[i] = '\0'; /* Skip leading whitespace. */ while (*line && whitespace (*line)) { line++; i--; } /* If the line is not a comment, then parse it. */ if (*line && *line != '#') rl_parse_and_bind (line); /* Move to the next line. */ line += i + 1; current_readline_init_lineno++; } xfree (buffer); currently_reading_init_file = 0; return (0); } static void _rl_init_file_error (const char *format, ...) { va_list args; va_start (args, format); fprintf (stderr, "readline: "); if (currently_reading_init_file) fprintf (stderr, "%s: line %d: ", current_readline_init_file, current_readline_init_lineno); vfprintf (stderr, format, args); fprintf (stderr, "\n"); fflush (stderr); va_end (args); } /* **************************************************************** */ /* */ /* Parser Helper Functions */ /* */ /* **************************************************************** */ static int parse_comparison_op (const char *s, int *indp) { int i, peekc, op; if (OPSTART (s[*indp]) == 0) return -1; i = *indp; peekc = s[i] ? s[i+1] : 0; op = -1; if (s[i] == '=') { op = OP_EQ; if (peekc == '=') i++; i++; } else if (s[i] == '!' && peekc == '=') { op = OP_NE; i += 2; } else if (s[i] == '<' && peekc == '=') { op = OP_LE; i += 2; } else if (s[i] == '>' && peekc == '=') { op = OP_GE; i += 2; } else if (s[i] == '<') { op = OP_LT; i += 1; } else if (s[i] == '>') { op = OP_GT; i += 1; } *indp = i; return op; } /* **************************************************************** */ /* */ /* Parser Directives */ /* */ /* **************************************************************** */ typedef int _rl_parser_func_t (char *); /* Things that mean `Control'. */ const char * const _rl_possible_control_prefixes[] = { "Control-", "C-", "CTRL-", (const char *)NULL }; const char * const _rl_possible_meta_prefixes[] = { "Meta", "M-", (const char *)NULL }; /* Forward declarations */ static int parser_if (char *); static int parser_else (char *); static int parser_endif (char *); static int parser_include (char *); /* Conditionals. */ /* Calling programs set this to have their argv[0]. */ const char *rl_readline_name = "other"; /* Stack of previous values of parsing_conditionalized_out. */ static unsigned char *if_stack = (unsigned char *)NULL; static int if_stack_depth; static size_t if_stack_size; /* Push _rl_parsing_conditionalized_out, and set parser state based on ARGS. */ static int parser_if (char *args) { int i, llen, boolvar, strvar; boolvar = strvar = -1; /* Push parser state. */ if (if_stack_depth + 1 >= if_stack_size) { if (!if_stack) if_stack = (unsigned char *)xmalloc (if_stack_size = 20); else if_stack = (unsigned char *)xrealloc (if_stack, if_stack_size += 20); } if_stack[if_stack_depth++] = _rl_parsing_conditionalized_out; /* If parsing is turned off, then nothing can turn it back on except for finding the matching endif. In that case, return right now. */ if (_rl_parsing_conditionalized_out) return 0; llen = strlen (args); /* Isolate first argument. */ for (i = 0; args[i] && !whitespace (args[i]); i++); if (args[i]) args[i++] = '\0'; /* Handle "$if term=foo" and "$if mode=emacs" constructs. If this isn't term=foo, or mode=emacs, then check to see if the first word in ARGS is the same as the value stored in rl_readline_name. */ if (rl_terminal_name && _rl_strnicmp (args, "term=", 5) == 0) { char *tem, *tname; /* Terminals like "aaa-60" are equivalent to "aaa". */ tname = savestring (rl_terminal_name); tem = strchr (tname, '-'); if (tem) *tem = '\0'; /* Test the `long' and `short' forms of the terminal name so that if someone has a `sun-cmd' and does not want to have bindings that will be executed if the terminal is a `sun', they can put `$if term=sun-cmd' into their .inputrc. */ _rl_parsing_conditionalized_out = _rl_stricmp (args + 5, tname) && _rl_stricmp (args + 5, rl_terminal_name); xfree (tname); } #if defined (VI_MODE) else if (_rl_strnicmp (args, "mode=", 5) == 0) { int mode; if (_rl_stricmp (args + 5, "emacs") == 0) mode = emacs_mode; else if (_rl_stricmp (args + 5, "vi") == 0) mode = vi_mode; else mode = no_mode; _rl_parsing_conditionalized_out = mode != rl_editing_mode; } #endif /* VI_MODE */ else if (_rl_strnicmp (args, "version", 7) == 0) { int rlversion, versionarg, op, previ, major, minor, opresult; _rl_parsing_conditionalized_out = 1; rlversion = RL_VERSION_MAJOR*10 + RL_VERSION_MINOR; /* if "version" is separated from the operator by whitespace, or the operand is separated from the operator by whitespace, restore it. We're more liberal with allowed whitespace for this variable. */ if (i > 0 && i <= llen && args[i-1] == '\0') args[i-1] = ' '; args[llen] = '\0'; /* just in case */ for (i = 7; whitespace (args[i]); i++) ; if (OPSTART(args[i]) == 0) { _rl_init_file_error ("comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line"); return 0; } previ = i; op = parse_comparison_op (args, &i); if (op <= 0) { _rl_init_file_error ("comparison operator expected, found `%s'", args+previ); return 0; } for ( ; args[i] && whitespace (args[i]); i++) ; if (args[i] == 0 || _rl_digit_p (args[i]) == 0) { _rl_init_file_error ("numeric argument expected, found `%s'", args+i); return 0; } major = minor = 0; previ = i; for ( ; args[i] && _rl_digit_p (args[i]); i++) major = major*10 + _rl_digit_value (args[i]); if (args[i] == '.') { if (args[i + 1] && _rl_digit_p (args [i + 1]) == 0) { _rl_init_file_error ("numeric argument expected, found `%s'", args+previ); return 0; } for (++i; args[i] && _rl_digit_p (args[i]); i++) minor = minor*10 + _rl_digit_value (args[i]); } /* optional - check for trailing garbage on the line, allow whitespace and a trailing comment */ previ = i; for ( ; args[i] && whitespace (args[i]); i++) ; if (args[i] && args[i] != '#') { _rl_init_file_error ("trailing garbage on line: `%s'", args+previ); return 0; } versionarg = major*10 + minor; switch (op) { case OP_EQ: opresult = rlversion == versionarg; break; case OP_NE: opresult = rlversion != versionarg; break; case OP_GT: opresult = rlversion > versionarg; break; case OP_GE: opresult = rlversion >= versionarg; break; case OP_LT: opresult = rlversion < versionarg; break; case OP_LE: opresult = rlversion <= versionarg; break; } _rl_parsing_conditionalized_out = 1 - opresult; } /* Check to see if the first word in ARGS is the same as the value stored in rl_readline_name. */ else if (_rl_stricmp (args, rl_readline_name) == 0) _rl_parsing_conditionalized_out = 0; else if ((boolvar = find_boolean_var (args)) >= 0 || (strvar = find_string_var (args)) >= 0) { int op, previ; size_t vlen; const char *vname; char *valuearg, *vval, prevc; _rl_parsing_conditionalized_out = 1; vname = (boolvar >= 0) ? boolean_varname (boolvar) : string_varname (strvar); vlen = strlen (vname); if (i > 0 && i <= llen && args[i-1] == '\0') args[i-1] = ' '; args[llen] = '\0'; /* just in case */ for (i = vlen; whitespace (args[i]); i++) ; if (CMPSTART(args[i]) == 0) { _rl_init_file_error ("equality comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line"); return 0; } previ = i; op = parse_comparison_op (args, &i); if (op != OP_EQ && op != OP_NE) { _rl_init_file_error ("equality comparison operator expected, found `%s'", args+previ); return 0; } for ( ; args[i] && whitespace (args[i]); i++) ; if (args[i] == 0) { _rl_init_file_error ("argument expected, found `%s'", args+i); return 0; } previ = i; valuearg = args + i; for ( ; args[i] && whitespace (args[i]) == 0; i++) ; prevc = args[i]; args[i] = '\0'; /* null-terminate valuearg */ vval = rl_variable_value (vname); if (op == OP_EQ) _rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) != 0; else if (op == OP_NE) _rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) == 0; args[i] = prevc; } else _rl_parsing_conditionalized_out = 1; return 0; } /* Invert the current parser state if there is anything on the stack. */ static int parser_else (char *args) { register int i; if (if_stack_depth == 0) { _rl_init_file_error ("$else found without matching $if"); return 0; } #if 0 /* Check the previous (n - 1) levels of the stack to make sure that we haven't previously turned off parsing. */ for (i = 0; i < if_stack_depth - 1; i++) #else /* Check the previous (n) levels of the stack to make sure that we haven't previously turned off parsing. */ for (i = 0; i < if_stack_depth; i++) #endif if (if_stack[i] == 1) return 0; /* Invert the state of parsing if at top level. */ _rl_parsing_conditionalized_out = !_rl_parsing_conditionalized_out; return 0; } /* Terminate a conditional, popping the value of _rl_parsing_conditionalized_out from the stack. */ static int parser_endif (char *args) { if (if_stack_depth) _rl_parsing_conditionalized_out = if_stack[--if_stack_depth]; else _rl_init_file_error ("$endif without matching $if"); return 0; } static int parser_include (char *args) { const char *old_init_file; char *e; int old_line_number, old_include_level, r; if (_rl_parsing_conditionalized_out) return (0); old_init_file = current_readline_init_file; old_line_number = current_readline_init_lineno; old_include_level = current_readline_init_include_level; e = strchr (args, '\n'); if (e) *e = '\0'; r = _rl_read_init_file ((const char *)args, old_include_level + 1); current_readline_init_file = old_init_file; current_readline_init_lineno = old_line_number; current_readline_init_include_level = old_include_level; return r; } /* Associate textual names with actual functions. */ static const struct { const char * const name; _rl_parser_func_t *function; } parser_directives [] = { { "if", parser_if }, { "endif", parser_endif }, { "else", parser_else }, { "include", parser_include }, { (char *)0x0, (_rl_parser_func_t *)0x0 } }; /* Handle a parser directive. STATEMENT is the line of the directive without any leading `$'. */ static int handle_parser_directive (char *statement) { register int i; char *directive, *args; /* Isolate the actual directive. */ /* Skip whitespace. */ for (i = 0; whitespace (statement[i]); i++); directive = &statement[i]; for (; statement[i] && !whitespace (statement[i]); i++); if (statement[i]) statement[i++] = '\0'; for (; statement[i] && whitespace (statement[i]); i++); args = &statement[i]; /* Lookup the command, and act on it. */ for (i = 0; parser_directives[i].name; i++) if (_rl_stricmp (directive, parser_directives[i].name) == 0) { (*parser_directives[i].function) (args); return (0); } /* display an error message about the unknown parser directive */ _rl_init_file_error ("%s: unknown parser directive", directive); return (1); } /* Start at STRING[START] and look for DELIM. Return I where STRING[I] == DELIM or STRING[I] == 0. DELIM is usually a double quote. */ static int _rl_skip_to_delim (char *string, int start, int delim) { int i, c, passc; for (i = start,passc = 0; c = string[i]; i++) { if (passc) { passc = 0; if (c == 0) break; continue; } if (c == '\\') { passc = 1; continue; } if (c == delim) break; } return i; } /* Read the binding command from STRING and perform it. A key binding command looks like: Keyname: function-name\0, a variable binding command looks like: set variable value. A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */ int rl_parse_and_bind (char *string) { char *funname, *kname; register int c, i; int key, equivalency, foundmod, foundsep; while (string && whitespace (*string)) string++; if (string == 0 || *string == 0 || *string == '#') return 0; /* If this is a parser directive, act on it. */ if (*string == '$') { handle_parser_directive (&string[1]); return 0; } /* If we aren't supposed to be parsing right now, then we're done. */ if (_rl_parsing_conditionalized_out) return 0; i = 0; /* If this keyname is a complex key expression surrounded by quotes, advance to after the matching close quote. This code allows the backslash to quote characters in the key expression. */ if (*string == '"') { i = _rl_skip_to_delim (string, 1, '"'); /* If we didn't find a closing quote, abort the line. */ if (string[i] == '\0') { _rl_init_file_error ("%s: no closing `\"' in key binding", string); return 1; } else i++; /* skip past closing double quote */ } /* Advance to the colon (:) or whitespace which separates the two objects. */ for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ ); if (i == 0) { _rl_init_file_error ("`%s': invalid key binding: missing key sequence", string); return 1; } equivalency = (c == ':' && string[i + 1] == '='); foundsep = c != 0; /* Mark the end of the command (or keyname). */ if (string[i]) string[i++] = '\0'; /* If doing assignment, skip the '=' sign as well. */ if (equivalency) string[i++] = '\0'; /* If this is a command to set a variable, then do that. */ if (_rl_stricmp (string, "set") == 0) { char *var, *value, *e; var = string + i; /* Make VAR point to start of variable name. */ while (*var && whitespace (*var)) var++; /* Make VALUE point to start of value string. */ value = var; while (*value && whitespace (*value) == 0) value++; if (*value) *value++ = '\0'; while (*value && whitespace (*value)) value++; /* Strip trailing whitespace from values of boolean variables. */ if (find_boolean_var (var) >= 0) { /* just read a whitespace-delimited word or empty string */ for (e = value; *e && whitespace (*e) == 0; e++) ; if (e > value) *e = '\0'; /* cut off everything trailing */ } else if ((i = find_string_var (var)) >= 0) { /* Allow quoted strings in variable values */ if (*value == '"') { i = _rl_skip_to_delim (value, 1, *value); value[i] = '\0'; value++; /* skip past the quote */ } else { /* remove trailing whitespace */ e = value + strlen (value) - 1; while (e >= value && whitespace (*e)) e--; e++; /* skip back to whitespace or EOS */ if (*e && e >= value) *e = '\0'; } } else { /* avoid calling rl_variable_bind just to find this out */ _rl_init_file_error ("%s: unknown variable name", var); return 1; } rl_variable_bind (var, value); return 0; } /* Skip any whitespace between keyname and funname. */ for (; string[i] && whitespace (string[i]); i++); funname = &string[i]; /* Now isolate funname. For straight function names just look for whitespace, since that will signify the end of the string. But this could be a macro definition. In that case, the string is quoted, so skip to the matching delimiter. We allow the backslash to quote the delimiter characters in the macro body. */ /* This code exists to allow whitespace in macro expansions, which would otherwise be gobbled up by the next `for' loop.*/ /* XXX - it may be desirable to allow backslash quoting only if " is the quoted string delimiter, like the shell. */ if (*funname == '\'' || *funname == '"') { i = _rl_skip_to_delim (string, i+1, *funname); if (string[i]) i++; else { _rl_init_file_error ("`%s': missing closing quote for macro", funname); return 1; } } /* Advance to the end of the string. */ for (; string[i] && whitespace (string[i]) == 0; i++); /* No extra whitespace at the end of the string. */ string[i] = '\0'; /* Handle equivalency bindings here. Make the left-hand side be exactly whatever the right-hand evaluates to, including keymaps. */ if (equivalency) { return 0; } if (foundsep == 0) { _rl_init_file_error ("%s: no key sequence terminator", string); return 1; } /* If this is a new-style key-binding, then do the binding with rl_bind_keyseq (). Otherwise, let the older code deal with it. */ if (*string == '"') { char *seq; register int j, k, passc; seq = (char *)xmalloc (1 + strlen (string)); for (j = 1, k = passc = 0; string[j]; j++) { /* Allow backslash to quote characters, but leave them in place. This allows a string to end with a backslash quoting another backslash, or with a backslash quoting a double quote. The backslashes are left in place for rl_translate_keyseq (). */ if (passc || (string[j] == '\\')) { seq[k++] = string[j]; passc = !passc; continue; } if (string[j] == '"') break; seq[k++] = string[j]; } seq[k] = '\0'; /* Binding macro? */ if (*funname == '\'' || *funname == '"') { j = strlen (funname); /* Remove the delimiting quotes from each end of FUNNAME. */ if (j && funname[j - 1] == *funname) funname[j - 1] = '\0'; rl_macro_bind (seq, &funname[1], _rl_keymap); } else rl_bind_keyseq (seq, rl_named_function (funname)); xfree (seq); return 0; } /* Get the actual character we want to deal with. */ kname = strrchr (string, '-'); if (kname == 0) kname = string; else kname++; key = glean_key_from_name (kname); /* Add in control and meta bits. */ foundmod = 0; if (substring_member_of_array (string, _rl_possible_control_prefixes)) { key = CTRL (_rl_to_upper (key)); foundmod = 1; } if (substring_member_of_array (string, _rl_possible_meta_prefixes)) { key = META (key); foundmod = 1; } if (foundmod == 0 && kname != string) { _rl_init_file_error ("%s: unknown key modifier", string); return 1; } /* Temporary. Handle old-style keyname with macro-binding. */ if (*funname == '\'' || *funname == '"') { char useq[2]; size_t fl = strlen (funname); useq[0] = key; useq[1] = '\0'; if (fl && funname[fl - 1] == *funname) funname[fl - 1] = '\0'; rl_macro_bind (useq, &funname[1], _rl_keymap); } #if defined (PREFIX_META_HACK) /* Ugly, but working hack to keep prefix-meta around. */ else if (_rl_stricmp (funname, "prefix-meta") == 0) { char seq[2]; seq[0] = key; seq[1] = '\0'; rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, _rl_keymap); } #endif /* PREFIX_META_HACK */ else rl_bind_key (key, rl_named_function (funname)); return 0; } /* Simple structure for boolean readline variables (i.e., those that can have one of two values; either "On" or 1 for truth, or "Off" or 0 for false. */ #define V_SPECIAL 0x1 #define V_DEPRECATED 0x02 static const struct { const char * const name; int *value; int flags; } boolean_varlist [] = { { "bind-tty-special-chars", &_rl_bind_stty_chars, 0 }, { "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL }, { "byte-oriented", &rl_byte_oriented, 0 }, #if defined (COLOR_SUPPORT) { "colored-completion-prefix",&_rl_colored_completion_prefix, 0 }, { "colored-stats", &_rl_colored_stats, 0 }, #endif { "completion-ignore-case", &_rl_completion_case_fold, 0 }, { "completion-map-case", &_rl_completion_case_map, 0 }, { "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, { "disable-completion", &rl_inhibit_completion, 0 }, { "echo-control-characters", &_rl_echo_control_chars, 0 }, { "enable-active-region", &_rl_enable_active_region, 0 }, { "enable-bracketed-paste", &_rl_enable_bracketed_paste, V_SPECIAL }, { "enable-keypad", &_rl_enable_keypad, 0 }, { "enable-meta-key", &_rl_enable_meta, 0 }, { "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, { "force-meta-prefix", &_rl_force_meta_prefix, 0 }, { "history-preserve-point", &_rl_history_preserve_point, 0 }, { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 }, { "input-meta", &_rl_meta_flag, 0 }, { "mark-directories", &_rl_complete_mark_directories, 0 }, { "mark-modified-lines", &_rl_mark_modified_lines, 0 }, { "mark-symlinked-directories", &_rl_complete_mark_symlink_dirs, 0 }, { "match-hidden-files", &_rl_match_hidden_files, 0 }, { "menu-complete-display-prefix", &_rl_menu_complete_prefix_first, 0 }, { "meta-flag", &_rl_meta_flag, 0 }, { "output-meta", &_rl_output_meta_chars, 0 }, { "page-completions", &_rl_page_completions, 0 }, { "prefer-visible-bell", &_rl_prefer_visible_bell, V_SPECIAL }, { "print-completions-horizontally", &_rl_print_completions_horizontally, 0 }, { "revert-all-at-newline", &_rl_revert_all_at_newline, 0 }, { "search-ignore-case", &_rl_search_case_fold, 0 }, { "show-all-if-ambiguous", &_rl_complete_show_all, 0 }, { "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 }, { "show-mode-in-prompt", &_rl_show_mode_in_prompt, 0 }, { "skip-completed-text", &_rl_skip_completed_text, 0 }, #if defined (VISIBLE_STATS) { "visible-stats", &rl_visible_stats, 0 }, #endif /* VISIBLE_STATS */ { (char *)NULL, (int *)NULL, 0 } }; static int find_boolean_var (const char *name) { register int i; for (i = 0; boolean_varlist[i].name; i++) if (_rl_stricmp (name, boolean_varlist[i].name) == 0) return i; return -1; } static const char * boolean_varname (int i) { return ((i >= 0) ? boolean_varlist[i].name : (char *)NULL); } /* Hooks for handling special boolean variables, where a function needs to be called or another variable needs to be changed when they're changed. */ static void hack_special_boolean_var (int i) { const char *name; name = boolean_varlist[i].name; if (_rl_stricmp (name, "blink-matching-paren") == 0) _rl_enable_paren_matching (rl_blink_matching_paren); else if (_rl_stricmp (name, "prefer-visible-bell") == 0) { if (_rl_prefer_visible_bell) _rl_bell_preference = VISIBLE_BELL; else _rl_bell_preference = AUDIBLE_BELL; } else if (_rl_stricmp (name, "show-mode-in-prompt") == 0) _rl_reset_prompt (); else if (_rl_stricmp (name, "enable-bracketed-paste") == 0) _rl_enable_active_region = _rl_enable_bracketed_paste; } typedef int _rl_sv_func_t (const char *); /* These *must* correspond to the array indices for the appropriate string variable. (Though they're not used right now.) */ #define V_BELLSTYLE 0 #define V_COMBEGIN 1 #define V_EDITMODE 2 #define V_ISRCHTERM 3 #define V_KEYMAP 4 #define V_STRING 1 #define V_INT 2 /* Forward declarations */ static int sv_region_start_color (const char *); static int sv_region_end_color (const char *); static int sv_bell_style (const char *); static int sv_combegin (const char *); static int sv_dispprefix (const char *); static int sv_compquery (const char *); static int sv_compwidth (const char *); static int sv_editmode (const char *); static int sv_emacs_modestr (const char *); static int sv_histsize (const char *); static int sv_isrchterm (const char *); static int sv_keymap (const char *); static int sv_seqtimeout (const char *); static int sv_viins_modestr (const char *); static int sv_vicmd_modestr (const char *); static const struct { const char * const name; int flags; _rl_sv_func_t *set_func; } string_varlist[] = { { "active-region-end-color", V_STRING, sv_region_end_color }, { "active-region-start-color", V_STRING, sv_region_start_color }, { "bell-style", V_STRING, sv_bell_style }, { "comment-begin", V_STRING, sv_combegin }, { "completion-display-width", V_INT, sv_compwidth }, { "completion-prefix-display-length", V_INT, sv_dispprefix }, { "completion-query-items", V_INT, sv_compquery }, { "editing-mode", V_STRING, sv_editmode }, { "emacs-mode-string", V_STRING, sv_emacs_modestr }, { "history-size", V_INT, sv_histsize }, { "isearch-terminators", V_STRING, sv_isrchterm }, { "keymap", V_STRING, sv_keymap }, { "keyseq-timeout", V_INT, sv_seqtimeout }, { "vi-cmd-mode-string", V_STRING, sv_vicmd_modestr }, { "vi-ins-mode-string", V_STRING, sv_viins_modestr }, { (char *)NULL, 0, (_rl_sv_func_t *)0 } }; static int find_string_var (const char *name) { register int i; for (i = 0; string_varlist[i].name; i++) if (_rl_stricmp (name, string_varlist[i].name) == 0) return i; return -1; } static const char * string_varname (int i) { return ((i >= 0) ? string_varlist[i].name : (char *)NULL); } /* A boolean value that can appear in a `set variable' command is true if the value is null or empty, `on' (case-insensitive), or "1". All other values result in 0 (false). */ static int bool_to_int (const char *value) { return (value == 0 || *value == '\0' || (_rl_stricmp (value, "on") == 0) || (value[0] == '1' && value[1] == '\0')); } char * rl_variable_value (const char *name) { register int i; /* Check for simple variables first. */ i = find_boolean_var (name); if (i >= 0) return (*boolean_varlist[i].value ? "on" : "off"); i = find_string_var (name); if (i >= 0) return (_rl_get_string_variable_value (string_varlist[i].name)); /* Unknown variable names return NULL. */ return (char *)NULL; } int rl_variable_bind (const char *name, const char *value) { register int i; int v; /* Check for simple variables first. */ i = find_boolean_var (name); if (i >= 0) { *boolean_varlist[i].value = bool_to_int (value); if (boolean_varlist[i].flags & V_SPECIAL) hack_special_boolean_var (i); return 0; } i = find_string_var (name); /* For the time being, string names without a handler function are simply ignored. */ if (i < 0 || string_varlist[i].set_func == 0) { if (i < 0) _rl_init_file_error ("%s: unknown variable name", name); return 0; } v = (*string_varlist[i].set_func) (value); if (v != 0) _rl_init_file_error ("%s: could not set value to `%s'", name, value); return v; } static int sv_editmode (const char *value) { if (_rl_strnicmp (value, "vi", 2) == 0) { #if defined (VI_MODE) _rl_keymap = vi_insertion_keymap; rl_editing_mode = vi_mode; #endif /* VI_MODE */ return 0; } else if (_rl_strnicmp (value, "emacs", 5) == 0) { _rl_keymap = emacs_standard_keymap; rl_editing_mode = emacs_mode; return 0; } return 1; } static int sv_combegin (const char *value) { if (value && *value) { FREE (_rl_comment_begin); _rl_comment_begin = savestring (value); return 0; } return 1; } static int sv_dispprefix (const char *value) { int nval = 0; if (value && *value) { nval = atoi (value); if (nval < 0) nval = 0; } _rl_completion_prefix_display_length = nval; return 0; } static int sv_compquery (const char *value) { int nval = 100; if (value && *value) { nval = atoi (value); if (nval < 0) nval = 0; } rl_completion_query_items = nval; return 0; } static int sv_compwidth (const char *value) { int nval = -1; if (value && *value) nval = atoi (value); _rl_completion_columns = nval; return 0; } static int sv_histsize (const char *value) { int nval; nval = 500; if (value && *value) { nval = atoi (value); if (nval < 0) { unstifle_history (); return 0; } } stifle_history (nval); return 0; } static int sv_keymap (const char *value) { Keymap kmap; kmap = rl_get_keymap_by_name (value); if (kmap) { rl_set_keymap (kmap); return 0; } return 1; } static int sv_seqtimeout (const char *value) { int nval; nval = 0; if (value && *value) { nval = atoi (value); if (nval < 0) nval = 0; } _rl_keyseq_timeout = nval; return 0; } static int sv_region_start_color (const char *value) { return (_rl_reset_region_color (0, value)); } static int sv_region_end_color (const char *value) { return (_rl_reset_region_color (1, value)); } static int sv_bell_style (const char *value) { if (value == 0 || *value == '\0') _rl_bell_preference = AUDIBLE_BELL; else if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0) _rl_bell_preference = NO_BELL; else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0) _rl_bell_preference = AUDIBLE_BELL; else if (_rl_stricmp (value, "visible") == 0) _rl_bell_preference = VISIBLE_BELL; else return 1; return 0; } static int sv_isrchterm (const char *value) { int beg, end, delim; char *v; if (value == 0) return 1; /* Isolate the value and translate it into a character string. */ v = savestring (value); FREE (_rl_isearch_terminators); if (v[0] == '"' || v[0] == '\'') { delim = v[0]; for (beg = end = 1; v[end] && v[end] != delim; end++) ; } else { for (beg = end = 0; v[end] && whitespace (v[end]) == 0; end++) ; } v[end] = '\0'; /* The value starts at v + beg. Translate it into a character string. */ _rl_isearch_terminators = (char *)xmalloc (2 * strlen (v) + 1); rl_translate_keyseq (v + beg, _rl_isearch_terminators, &end); _rl_isearch_terminators[end] = '\0'; xfree (v); return 0; } extern char *_rl_emacs_mode_str; static int sv_emacs_modestr (const char *value) { if (value && *value) { FREE (_rl_emacs_mode_str); _rl_emacs_mode_str = (char *)xmalloc (2 * strlen (value) + 1); rl_translate_keyseq (value, _rl_emacs_mode_str, &_rl_emacs_modestr_len); _rl_emacs_mode_str[_rl_emacs_modestr_len] = '\0'; return 0; } else if (value) { FREE (_rl_emacs_mode_str); _rl_emacs_mode_str = (char *)xmalloc (1); _rl_emacs_mode_str[_rl_emacs_modestr_len = 0] = '\0'; return 0; } else if (value == 0) { FREE (_rl_emacs_mode_str); _rl_emacs_mode_str = 0; /* prompt_modestr does the right thing */ _rl_emacs_modestr_len = 0; return 0; } return 1; } static int sv_viins_modestr (const char *value) { if (value && *value) { FREE (_rl_vi_ins_mode_str); _rl_vi_ins_mode_str = (char *)xmalloc (2 * strlen (value) + 1); rl_translate_keyseq (value, _rl_vi_ins_mode_str, &_rl_vi_ins_modestr_len); _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len] = '\0'; return 0; } else if (value) { FREE (_rl_vi_ins_mode_str); _rl_vi_ins_mode_str = (char *)xmalloc (1); _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len = 0] = '\0'; return 0; } else if (value == 0) { FREE (_rl_vi_ins_mode_str); _rl_vi_ins_mode_str = 0; /* prompt_modestr does the right thing */ _rl_vi_ins_modestr_len = 0; return 0; } return 1; } static int sv_vicmd_modestr (const char *value) { if (value && *value) { FREE (_rl_vi_cmd_mode_str); _rl_vi_cmd_mode_str = (char *)xmalloc (2 * strlen (value) + 1); rl_translate_keyseq (value, _rl_vi_cmd_mode_str, &_rl_vi_cmd_modestr_len); _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len] = '\0'; return 0; } else if (value) { FREE (_rl_vi_cmd_mode_str); _rl_vi_cmd_mode_str = (char *)xmalloc (1); _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len = 0] = '\0'; return 0; } else if (value == 0) { FREE (_rl_vi_cmd_mode_str); _rl_vi_cmd_mode_str = 0; /* prompt_modestr does the right thing */ _rl_vi_cmd_modestr_len = 0; return 0; } return 1; } /* Return the character which matches NAME. For example, `Space' returns ' '. */ typedef struct { const char * const name; int value; } assoc_list; static const assoc_list name_key_alist[] = { { "DEL", 0x7f }, { "ESC", '\033' }, { "Escape", '\033' }, { "LFD", '\n' }, { "Newline", '\n' }, { "RET", '\r' }, { "Return", '\r' }, { "Rubout", 0x7f }, { "SPC", ' ' }, { "Space", ' ' }, { "Tab", 0x09 }, { (char *)0x0, 0 } }; static int glean_key_from_name (char *name) { register int i; for (i = 0; name_key_alist[i].name; i++) if (_rl_stricmp (name, name_key_alist[i].name) == 0) return (name_key_alist[i].value); return (*(unsigned char *)name); /* XXX was return (*name) */ } /* Auxiliary functions to manage keymaps. */ struct name_and_keymap { char *name; Keymap map; }; static struct name_and_keymap builtin_keymap_names[] = { { "emacs", emacs_standard_keymap }, { "emacs-standard", emacs_standard_keymap }, { "emacs-meta", emacs_meta_keymap }, { "emacs-ctlx", emacs_ctlx_keymap }, #if defined (VI_MODE) { "vi", vi_movement_keymap }, { "vi-move", vi_movement_keymap }, { "vi-command", vi_movement_keymap }, { "vi-insert", vi_insertion_keymap }, #endif /* VI_MODE */ { (char *)0x0, (Keymap)0x0 } }; /* -1 for NULL entry */ #define NUM_BUILTIN_KEYMAPS (sizeof (builtin_keymap_names) / sizeof (builtin_keymap_names[0]) - 1) static struct name_and_keymap *keymap_names = builtin_keymap_names; static int _rl_get_keymap_by_name (const char *name) { register int i; for (i = 0; keymap_names[i].name; i++) if (_rl_stricmp (name, keymap_names[i].name) == 0) return (i); return -1; } Keymap rl_get_keymap_by_name (const char *name) { int i; i = _rl_get_keymap_by_name (name); return ((i >= 0) ? keymap_names[i].map : (Keymap) NULL); } static int _rl_get_keymap_by_map (Keymap map) { register int i; for (i = 0; keymap_names[i].name; i++) if (map == keymap_names[i].map) return (i); return -1; } char * rl_get_keymap_name (Keymap map) { int i; i = _rl_get_keymap_by_map (map); return ((i >= 0) ? keymap_names[i].name : (char *)NULL); } int rl_set_keymap_name (const char *name, Keymap map) { int i, ni, mi; /* First check whether or not we're trying to rename a builtin keymap */ mi = _rl_get_keymap_by_map (map); if (mi >= 0 && mi < NUM_BUILTIN_KEYMAPS) return -1; /* Then reject attempts to set one of the builtin names to a new map */ ni = _rl_get_keymap_by_name (name); if (ni >= 0 && ni < NUM_BUILTIN_KEYMAPS) return -1; /* Renaming a keymap we already added */ if (mi >= 0) /* XXX - could be >= NUM_BUILTIN_KEYMAPS */ { xfree (keymap_names[mi].name); keymap_names[mi].name = savestring (name); return mi; } /* Associating new keymap with existing name */ if (ni >= 0) { keymap_names[ni].map = map; return ni; } for (i = 0; keymap_names[i].name; i++) ; if (keymap_names == builtin_keymap_names) { keymap_names = xmalloc ((i + 2) * sizeof (struct name_and_keymap)); memcpy (keymap_names, builtin_keymap_names, i * sizeof (struct name_and_keymap)); } else keymap_names = xrealloc (keymap_names, (i + 2) * sizeof (struct name_and_keymap)); keymap_names[i].name = savestring (name); keymap_names[i].map = map; keymap_names[i+1].name = NULL; keymap_names[i+1].map = NULL; return i; } void rl_set_keymap (Keymap map) { if (map) _rl_keymap = map; } Keymap rl_get_keymap (void) { return (_rl_keymap); } void rl_set_keymap_from_edit_mode (void) { if (rl_editing_mode == emacs_mode) _rl_keymap = emacs_standard_keymap; #if defined (VI_MODE) else if (rl_editing_mode == vi_mode) _rl_keymap = vi_insertion_keymap; #endif /* VI_MODE */ } char * rl_get_keymap_name_from_edit_mode (void) { if (rl_editing_mode == emacs_mode) return "emacs"; #if defined (VI_MODE) else if (rl_editing_mode == vi_mode) return "vi"; #endif /* VI_MODE */ else return "none"; } /* **************************************************************** */ /* */ /* Key Binding and Function Information */ /* */ /* **************************************************************** */ /* Each of the following functions produces information about the state of keybindings and functions known to Readline. The info is always printed to rl_outstream, and in such a way that it can be read back in (i.e., passed to rl_parse_and_bind ()). */ /* Print the names of functions known to Readline. */ void rl_list_funmap_names (void) { register int i; const char **funmap_names; funmap_names = rl_funmap_names (); if (!funmap_names) return; for (i = 0; funmap_names[i]; i++) fprintf (rl_outstream, "%s\n", funmap_names[i]); xfree (funmap_names); } static char * _rl_get_keyname (int key) { char *keyname; int i, c; keyname = (char *)xmalloc (9); c = key; /* Since this is going to be used to write out keysequence-function pairs for possible inclusion in an inputrc file, we don't want to do any special meta processing on KEY. */ /* If this is an escape character, we don't want to do any more processing. Just add the special ESC key sequence and return. */ if (c == ESC) { keyname[0] = '\\'; keyname[1] = 'e'; keyname[2] = '\0'; return keyname; } if (key == ANYOTHERKEY) { keyname[0] = '\0'; return keyname; } i = 0; /* Now add special prefixes needed for control characters. This can potentially change C. */ if (CTRL_CHAR (c) || c == RUBOUT) { keyname[i++] = '\\'; keyname[i++] = 'C'; keyname[i++] = '-'; c = (c == RUBOUT) ? '?' : _rl_to_lower (UNCTRL (c)); } /* XXX experimental code. Turn the characters that are not ASCII or ISO Latin 1 (128 - 159) into octal escape sequences (\200 - \237). This changes C. */ if (c >= 128 && c <= 159) { keyname[i++] = '\\'; keyname[i++] = '2'; c -= 128; keyname[i++] = (c / 8) + '0'; c = (c % 8) + '0'; } /* These characters are valid UTF-8; convert them into octal escape sequences as well. This changes C. */ else if (c >= 160) { keyname[i++] = '\\'; keyname[i++] = '0' + ((((unsigned char)c) >> 6) & 0x07); keyname[i++] = '0' + ((((unsigned char)c) >> 3) & 0x07); c = (c % 8) + '0'; } /* Now, if the character needs to be quoted with a backslash, do that. */ if (c == '\\' || c == '"') keyname[i++] = '\\'; /* Now add the key, terminate the string, and return it. */ keyname[i++] = (char) c; keyname[i] = '\0'; return keyname; } /* Return a NULL terminated array of strings which represent the key sequences that are used to invoke FUNCTION in MAP. */ char ** rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) { register int key; char **result; size_t result_index, result_size; result = (char **)NULL; result_index = result_size = 0; for (key = 0; key < KEYMAP_SIZE; key++) { switch (map[key].type) { case ISMACR: /* Macros match, if, and only if, the pointers are identical. Thus, they are treated exactly like functions in here. */ case ISFUNC: /* If the function in the keymap is the one we are looking for, then add the current KEY to the list of invoking keys. */ if (map[key].function == function) { char *keyname; keyname = _rl_get_keyname (key); if (result_index + 2 > result_size) { result_size += 10; result = (char **)xrealloc (result, result_size * sizeof (char *)); } result[result_index++] = keyname; result[result_index] = (char *)NULL; } break; case ISKMAP: { char **seqs; register int i; char *keyname; size_t knlen; /* Find the list of keyseqs in this map which have FUNCTION as their target. Add the key sequences found to RESULT. */ if (map[key].function == 0) break; seqs = rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key)); if (seqs == 0) break; keyname = _rl_get_keyname (key); knlen = RL_STRLEN (keyname); for (i = 0; seqs[i]; i++) { char *x; if (result_index + 2 > result_size) { result_size += 10; result = (char **)xrealloc (result, result_size * sizeof (char *)); } x = xmalloc (knlen + RL_STRLEN (seqs[i]) + 1); strcpy (x, keyname); strcpy (x + knlen, seqs[i]); xfree (seqs[i]); result[result_index++] = x; result[result_index] = (char *)NULL; } xfree (keyname); xfree (seqs); } break; } } return (result); } /* Return a NULL terminated array of strings which represent the key sequences that can be used to invoke FUNCTION using the current keymap. */ char ** rl_invoking_keyseqs (rl_command_func_t *function) { return (rl_invoking_keyseqs_in_map (function, _rl_keymap)); } void rl_print_keybinding (const char *name, Keymap kmap, int print_readably) { rl_command_func_t *function; char **invokers; function = rl_named_function (name); invokers = function ? rl_invoking_keyseqs_in_map (function, kmap ? kmap : _rl_keymap) : (char **)NULL; if (print_readably) { if (!invokers) fprintf (rl_outstream, "# %s (not bound)\n", name); else { register int j; for (j = 0; invokers[j]; j++) { fprintf (rl_outstream, "\"%s\": %s\n", invokers[j], name); xfree (invokers[j]); } xfree (invokers); } } else { if (!invokers) fprintf (rl_outstream, "%s is not bound to any keys\n", name); else { register int j; fprintf (rl_outstream, "%s can be found on ", name); for (j = 0; invokers[j] && j < 5; j++) fprintf (rl_outstream, "\"%s\"%s", invokers[j], invokers[j + 1] ? ", " : ".\n"); if (j == 5 && invokers[j]) fprintf (rl_outstream, "...\n"); for (j = 0; invokers[j]; j++) xfree (invokers[j]); xfree (invokers); } } } /* Print all of the functions and their bindings to rl_outstream. If PRINT_READABLY is non-zero, then print the output in such a way that it can be read back in. */ void rl_function_dumper (int print_readably) { register int i; const char **names; const char *name; names = rl_funmap_names (); fprintf (rl_outstream, "\n"); for (i = 0; name = names[i]; i++) rl_print_keybinding (name, _rl_keymap, print_readably); xfree (names); } /* Print all of the current functions and their bindings to rl_outstream. If an explicit argument is given, then print the output in such a way that it can be read back in. */ int rl_dump_functions (int count, int key) { if (rl_dispatching) fprintf (rl_outstream, "\r\n"); rl_function_dumper (rl_explicit_arg); rl_on_new_line (); return (0); } static void _rl_macro_dumper_internal (int print_readably, Keymap map, char *prefix) { int key; char *keyname, *out; size_t prefix_len; for (key = 0; key < KEYMAP_SIZE; key++) { switch (map[key].type) { case ISMACR: keyname = _rl_get_keyname (key); out = _rl_untranslate_macro_value ((char *)map[key].function, 0); /* If the application wants to print macros, let it. Give it the ascii-fied value with backslash escapes, so it will have to use rl_macro_bind (with its call to rl_translate_keyseq) to get the same value back. */ if (rl_macro_display_hook) { (*rl_macro_display_hook) (keyname, out, print_readably, prefix); break; } if (print_readably) fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "", keyname, out ? out : ""); else fprintf (rl_outstream, "%s%s outputs %s\n", prefix ? prefix : "", keyname, out ? out : ""); xfree (keyname); xfree (out); break; case ISFUNC: break; case ISKMAP: prefix_len = prefix ? strlen (prefix) : 0; if (key == ESC) { keyname = (char *)xmalloc (3 + prefix_len); if (prefix) strcpy (keyname, prefix); keyname[prefix_len] = '\\'; keyname[prefix_len + 1] = 'e'; keyname[prefix_len + 2] = '\0'; } else { keyname = _rl_get_keyname (key); if (prefix) { out = (char *)xmalloc (strlen (keyname) + prefix_len + 1); strcpy (out, prefix); strcpy (out + prefix_len, keyname); xfree (keyname); keyname = out; } } _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname); xfree (keyname); break; } } } void rl_macro_dumper (int print_readably) { _rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL); } int rl_dump_macros (int count, int key) { if (rl_dispatching) fprintf (rl_outstream, "\r\n"); rl_macro_dumper (rl_explicit_arg); rl_on_new_line (); return (0); } static char * _rl_get_string_variable_value (const char *name) { static char numbuf[64]; /* more than enough for INTMAX_MAX */ char *ret; if (_rl_stricmp (name, "active-region-start-color") == 0) { if (_rl_active_region_start_color == 0) return 0; ret = _rl_untranslate_macro_value (_rl_active_region_start_color, 0); if (ret) { strncpy (numbuf, ret, sizeof (numbuf) - 1); xfree (ret); numbuf[sizeof(numbuf) - 1] = '\0'; } else numbuf[0] = '\0'; return numbuf; } else if (_rl_stricmp (name, "active-region-end-color") == 0) { if (_rl_active_region_end_color == 0) return 0; ret = _rl_untranslate_macro_value (_rl_active_region_end_color, 0); if (ret) { strncpy (numbuf, ret, sizeof (numbuf) - 1); xfree (ret); numbuf[sizeof(numbuf) - 1] = '\0'; } else numbuf[0] = '\0'; return numbuf; } else if (_rl_stricmp (name, "bell-style") == 0) { switch (_rl_bell_preference) { case NO_BELL: return "none"; case VISIBLE_BELL: return "visible"; case AUDIBLE_BELL: default: return "audible"; } } else if (_rl_stricmp (name, "comment-begin") == 0) return (_rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT); else if (_rl_stricmp (name, "completion-display-width") == 0) { #if defined (HAVE_VSNPRINTF) snprintf (numbuf, sizeof (numbuf), "%d", _rl_completion_columns); #else sprintf (numbuf, "%d", _rl_completion_columns); #endif return (numbuf); } else if (_rl_stricmp (name, "completion-prefix-display-length") == 0) { #if defined (HAVE_VSNPRINTF) snprintf (numbuf, sizeof (numbuf), "%d", _rl_completion_prefix_display_length); #else sprintf (numbuf, "%d", _rl_completion_prefix_display_length); #endif return (numbuf); } else if (_rl_stricmp (name, "completion-query-items") == 0) { #if defined (HAVE_VSNPRINTF) snprintf (numbuf, sizeof (numbuf), "%d", rl_completion_query_items); #else sprintf (numbuf, "%d", rl_completion_query_items); #endif return (numbuf); } else if (_rl_stricmp (name, "editing-mode") == 0) return (rl_get_keymap_name_from_edit_mode ()); else if (_rl_stricmp (name, "history-size") == 0) { #if defined (HAVE_VSNPRINTF) snprintf (numbuf, sizeof (numbuf), "%d", history_is_stifled() ? history_max_entries : -1); #else sprintf (numbuf, "%d", history_is_stifled() ? history_max_entries : -1); #endif return (numbuf); } else if (_rl_stricmp (name, "isearch-terminators") == 0) { if (_rl_isearch_terminators == 0) return 0; ret = _rl_untranslate_macro_value (_rl_isearch_terminators, 0); if (ret) { strncpy (numbuf, ret, sizeof (numbuf) - 1); xfree (ret); numbuf[sizeof(numbuf) - 1] = '\0'; } else numbuf[0] = '\0'; return numbuf; } else if (_rl_stricmp (name, "keymap") == 0) { ret = rl_get_keymap_name (_rl_keymap); if (ret == 0) ret = rl_get_keymap_name_from_edit_mode (); return (ret ? ret : "none"); } else if (_rl_stricmp (name, "keyseq-timeout") == 0) { #if defined (HAVE_VSNPRINTF) snprintf (numbuf, sizeof (numbuf), "%d", _rl_keyseq_timeout); #else sprintf (numbuf, "%d", _rl_keyseq_timeout); #endif return (numbuf); } else if (_rl_stricmp (name, "emacs-mode-string") == 0) return (_rl_emacs_mode_str ? _rl_emacs_mode_str : RL_EMACS_MODESTR_DEFAULT); else if (_rl_stricmp (name, "vi-cmd-mode-string") == 0) return (_rl_vi_cmd_mode_str ? _rl_vi_cmd_mode_str : RL_VI_CMD_MODESTR_DEFAULT); else if (_rl_stricmp (name, "vi-ins-mode-string") == 0) return (_rl_vi_ins_mode_str ? _rl_vi_ins_mode_str : RL_VI_INS_MODESTR_DEFAULT); else return (0); } void rl_variable_dumper (int print_readably) { int i; char *v; for (i = 0; boolean_varlist[i].name; i++) { if (print_readably) fprintf (rl_outstream, "set %s %s\n", boolean_varlist[i].name, *boolean_varlist[i].value ? "on" : "off"); else fprintf (rl_outstream, "%s is set to `%s'\n", boolean_varlist[i].name, *boolean_varlist[i].value ? "on" : "off"); } for (i = 0; string_varlist[i].name; i++) { v = _rl_get_string_variable_value (string_varlist[i].name); if (v == 0) /* _rl_isearch_terminators can be NULL */ continue; if (print_readably) fprintf (rl_outstream, "set %s %s\n", string_varlist[i].name, v); else fprintf (rl_outstream, "%s is set to `%s'\n", string_varlist[i].name, v); } } /* Print all of the current variables and their values to rl_outstream. If an explicit argument is given, then print the output in such a way that it can be read back in. */ int rl_dump_variables (int count, int key) { if (rl_dispatching) fprintf (rl_outstream, "\r\n"); rl_variable_dumper (rl_explicit_arg); rl_on_new_line (); return (0); } /* Return non-zero if any members of ARRAY are a substring in STRING. */ static int substring_member_of_array (const char *string, const char * const *array) { while (*array) { if (_rl_strindex (string, *array)) return (1); array++; } return (0); } readline-8.3/posixstat.h000644 000436 000024 00000011704 13576722105 015452 0ustar00chetstaff000000 000000 /* posixstat.h -- Posix stat(2) definitions for systems that don't have them. */ /* Copyright (C) 1987-2019 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. Bash 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 3 of the License, or (at your option) any later version. Bash 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 Bash. If not, see . */ /* This file should be included instead of . It relies on the local sys/stat.h to work though. */ #if !defined (_POSIXSTAT_H_) #define _POSIXSTAT_H_ #include #if defined (STAT_MACROS_BROKEN) # undef S_ISBLK # undef S_ISCHR # undef S_ISDIR # undef S_ISFIFO # undef S_ISREG # undef S_ISLNK #endif /* STAT_MACROS_BROKEN */ /* These are guaranteed to work only on isc386 */ #if !defined (S_IFDIR) && !defined (S_ISDIR) # define S_IFDIR 0040000 #endif /* !S_IFDIR && !S_ISDIR */ #if !defined (S_IFMT) # define S_IFMT 0170000 #endif /* !S_IFMT */ /* Posix 1003.1 5.6.1.1 file types */ /* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but do not provide the S_IS* macros that Posix requires. */ #if defined (_S_IFMT) && !defined (S_IFMT) #define S_IFMT _S_IFMT #endif #if defined (_S_IFIFO) && !defined (S_IFIFO) #define S_IFIFO _S_IFIFO #endif #if defined (_S_IFCHR) && !defined (S_IFCHR) #define S_IFCHR _S_IFCHR #endif #if defined (_S_IFDIR) && !defined (S_IFDIR) #define S_IFDIR _S_IFDIR #endif #if defined (_S_IFBLK) && !defined (S_IFBLK) #define S_IFBLK _S_IFBLK #endif #if defined (_S_IFREG) && !defined (S_IFREG) #define S_IFREG _S_IFREG #endif #if defined (_S_IFLNK) && !defined (S_IFLNK) #define S_IFLNK _S_IFLNK #endif #if defined (_S_IFSOCK) && !defined (S_IFSOCK) #define S_IFSOCK _S_IFSOCK #endif /* Test for each symbol individually and define the ones necessary (some systems claiming Posix compatibility define some but not all). */ #if defined (S_IFBLK) && !defined (S_ISBLK) #define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK) /* block device */ #endif #if defined (S_IFCHR) && !defined (S_ISCHR) #define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR) /* character device */ #endif #if defined (S_IFDIR) && !defined (S_ISDIR) #define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) /* directory */ #endif #if defined (S_IFREG) && !defined (S_ISREG) #define S_ISREG(m) (((m)&S_IFMT) == S_IFREG) /* file */ #endif #if defined (S_IFIFO) && !defined (S_ISFIFO) #define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) /* fifo - named pipe */ #endif #if defined (S_IFLNK) && !defined (S_ISLNK) #define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK) /* symbolic link */ #endif #if defined (S_IFSOCK) && !defined (S_ISSOCK) #define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK) /* socket */ #endif /* * POSIX 1003.1 5.6.1.2 File Modes */ #if !defined (S_IRWXU) # if !defined (S_IREAD) # define S_IREAD 00400 # define S_IWRITE 00200 # define S_IEXEC 00100 # endif /* S_IREAD */ # if !defined (S_IRUSR) # define S_IRUSR S_IREAD /* read, owner */ # define S_IWUSR S_IWRITE /* write, owner */ # define S_IXUSR S_IEXEC /* execute, owner */ # define S_IRGRP (S_IREAD >> 3) /* read, group */ # define S_IWGRP (S_IWRITE >> 3) /* write, group */ # define S_IXGRP (S_IEXEC >> 3) /* execute, group */ # define S_IROTH (S_IREAD >> 6) /* read, other */ # define S_IWOTH (S_IWRITE >> 6) /* write, other */ # define S_IXOTH (S_IEXEC >> 6) /* execute, other */ # endif /* !S_IRUSR */ # define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) #else /* !S_IRWXU */ /* S_IRWXU is defined, but "group" and "other" bits might not be (happens in certain versions of MinGW). */ # if !defined (S_IRGRP) # define S_IRGRP (S_IREAD >> 3) /* read, group */ # define S_IWGRP (S_IWRITE >> 3) /* write, group */ # define S_IXGRP (S_IEXEC >> 3) /* execute, group */ # endif /* !S_IRGRP */ # if !defined (S_IROTH) # define S_IROTH (S_IREAD >> 6) /* read, other */ # define S_IWOTH (S_IWRITE >> 6) /* write, other */ # define S_IXOTH (S_IEXEC >> 6) /* execute, other */ # endif /* !S_IROTH */ # if !defined (S_IRWXG) # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) # endif # if !defined (S_IRWXO) # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) # endif #endif /* !S_IRWXU */ /* These are non-standard, but are used in builtins.c$symbolic_umask() */ #define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH) #define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH) #define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) #endif /* _POSIXSTAT_H_ */ readline-8.3/history.h000644 000436 000024 00000024666 14702315501 015116 0ustar00chetstaff000000 000000 /* history.h -- the names of functions that you can call in history. */ /* Copyright (C) 1989-2023 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. History 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 3 of the License, or (at your option) any later version. History 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 History. If not, see . */ #ifndef _HISTORY_H_ #define _HISTORY_H_ #ifdef __cplusplus extern "C" { #endif #include /* XXX - for history timestamp code */ #if defined READLINE_LIBRARY # include "rlstdc.h" # include "rltypedefs.h" #else # include # include #endif typedef void *histdata_t; /* Let's not step on anyone else's define for now, since we don't use this yet. */ #ifndef HS_HISTORY_VERSION # define HS_HISTORY_VERSION 0x0803 /* History 8.3 */ #endif /* The structure used to store a history entry. */ typedef struct _hist_entry { char *line; char *timestamp; /* char * rather than time_t for read/write */ histdata_t data; } HIST_ENTRY; #ifndef HIST_ENTRY_DEFINED # define HIST_ENTRY_DEFINED #endif /* Size of the history-library-managed space in history entry HS. */ #define HISTENT_BYTES(hs) (strlen ((hs)->line) + strlen ((hs)->timestamp)) /* A structure used to pass the current state of the history stuff around. */ typedef struct _hist_state { HIST_ENTRY **entries; /* Pointer to the entries themselves. */ int offset; /* The location pointer within this array. */ int length; /* Number of elements within this array. */ int size; /* Number of slots allocated to this array. */ int flags; } HISTORY_STATE; /* Flag values for the `flags' member of HISTORY_STATE. */ #define HS_STIFLED 0x01 /* Initialization and state management. */ /* Begin a session in which the history functions might be used. This just initializes the interactive variables. */ extern void using_history (void); /* Return the current HISTORY_STATE of the history. */ extern HISTORY_STATE *history_get_history_state (void); /* Set the state of the current history array to STATE. */ extern void history_set_history_state (HISTORY_STATE *); /* Manage the history list. */ /* Place STRING at the end of the history list. The associated data field (if any) is set to NULL. */ extern void add_history (const char *); /* Change the timestamp associated with the most recent history entry to STRING. */ extern void add_history_time (const char *); /* Remove an entry from the history list. WHICH is the magic number that tells us which element to delete. The elements are numbered from 0. */ extern HIST_ENTRY *remove_history (int); /* Remove a set of entries from the history list: FIRST to LAST, inclusive */ extern HIST_ENTRY **remove_history_range (int, int); /* Allocate a history entry consisting of STRING and TIMESTAMP and return a pointer to it. */ extern HIST_ENTRY *alloc_history_entry (char *, char *); /* Copy the history entry H, but not the (opaque) data pointer */ extern HIST_ENTRY *copy_history_entry (HIST_ENTRY *); /* Free the history entry H and return any application-specific data associated with it. */ extern histdata_t free_history_entry (HIST_ENTRY *); /* Make the history entry at WHICH have LINE and DATA. This returns the old entry so you can dispose of the data. In the case of an invalid WHICH, a NULL pointer is returned. */ extern HIST_ENTRY *replace_history_entry (int, const char *, histdata_t); /* Clear the history list and start over. */ extern void clear_history (void); /* Stifle the history list, remembering only MAX number of entries. */ extern void stifle_history (int); /* Stop stifling the history. This returns the previous amount the history was stifled by. The value is positive if the history was stifled, negative if it wasn't. */ extern int unstifle_history (void); /* Return 1 if the history is stifled, 0 if it is not. */ extern int history_is_stifled (void); /* Information about the history list. */ /* Return a NULL terminated array of HIST_ENTRY which is the current input history. Element 0 of this list is the beginning of time. If there is no history, return NULL. */ extern HIST_ENTRY **history_list (void); /* Returns the number which says what history element we are now looking at. */ extern int where_history (void); /* Return the history entry at the current position, as determined by history_offset. If there is no entry there, return a NULL pointer. */ extern HIST_ENTRY *current_history (void); /* Return the history entry which is logically at OFFSET in the history array. OFFSET is relative to history_base. */ extern HIST_ENTRY *history_get (int); /* Return the timestamp associated with the HIST_ENTRY * passed as an argument */ extern time_t history_get_time (HIST_ENTRY *); /* Return the number of bytes that the primary history entries are using. This just adds up the lengths of the_history->lines. */ extern int history_total_bytes (void); /* Moving around the history list. */ /* Set the position in the history list to POS. */ extern int history_set_pos (int); /* Back up history_offset to the previous history entry, and return a pointer to that entry. If there is no previous entry, return a NULL pointer. */ extern HIST_ENTRY *previous_history (void); /* Move history_offset forward to the next item in the input_history, and return the a pointer to that entry. If there is no next entry, return a NULL pointer. */ extern HIST_ENTRY *next_history (void); /* Searching the history list. */ /* Search the history for STRING, starting at history_offset. If DIRECTION < 0, then the search is through previous entries, else through subsequent. If the string is found, then current_history () is the history entry, and the value of this function is the offset in the line of that history entry that the string was found in. Otherwise, nothing is changed, and a -1 is returned. */ extern int history_search (const char *, int); /* Search the history for STRING, starting at history_offset. The search is anchored: matching lines must begin with string. DIRECTION is as in history_search(). */ extern int history_search_prefix (const char *, int); /* Search for STRING in the history list, starting at POS, an absolute index into the list. DIR, if negative, says to search backwards from POS, else forwards. Returns the absolute index of the history element where STRING was found, or -1 otherwise. */ extern int history_search_pos (const char *, int, int); /* Managing the history file. */ /* Add the contents of FILENAME to the history list, a line at a time. If FILENAME is NULL, then read from ~/.history. Returns 0 if successful, or errno if not. */ extern int read_history (const char *); /* Read a range of lines from FILENAME, adding them to the history list. Start reading at the FROM'th line and end at the TO'th. If FROM is zero, start at the beginning. If TO is less than FROM, read until the end of the file. If FILENAME is NULL, then read from ~/.history. Returns 0 if successful, or errno if not. */ extern int read_history_range (const char *, int, int); /* Write the current history to FILENAME. If FILENAME is NULL, then write the history list to ~/.history. Values returned are as in read_history (). */ extern int write_history (const char *); /* Append NELEMENT entries to FILENAME. The entries appended are from the end of the list minus NELEMENTs up to the end of the list. */ extern int append_history (int, const char *); /* Truncate the history file, leaving only the last NLINES lines. */ extern int history_truncate_file (const char *, int); /* History expansion. */ /* Expand the string STRING, placing the result into OUTPUT, a pointer to a string. Returns: 0) If no expansions took place (or, if the only change in the text was the de-slashifying of the history expansion character) 1) If expansions did take place -1) If there was an error in expansion. 2) If the returned line should just be printed. If an error occurred in expansion, then OUTPUT contains a descriptive error message. */ extern int history_expand (const char *, char **); /* Extract a string segment consisting of the FIRST through LAST arguments present in STRING. Arguments are broken up as in the shell. */ extern char *history_arg_extract (int, int, const char *); /* Return the text of the history event beginning at the current offset into STRING. Pass STRING with *INDEX equal to the history_expansion_char that begins this specification. DELIMITING_QUOTE is a character that is allowed to end the string specification for what to search for in addition to the normal characters `:', ` ', `\t', `\n', and sometimes `?'. */ extern char *get_history_event (const char *, int *, int); /* Return an array of tokens, much as the shell might. The tokens are parsed out of STRING. */ extern char **history_tokenize (const char *); /* Exported history variables. */ extern int history_base; extern int history_length; extern int history_max_entries; extern int history_offset; extern int history_lines_read_from_file; extern int history_lines_written_to_file; extern char history_expansion_char; extern char history_subst_char; extern char *history_word_delimiters; extern char history_comment_char; extern char *history_no_expand_chars; extern char *history_search_delimiter_chars; extern int history_quotes_inhibit_expansion; extern int history_quoting_state; extern int history_write_timestamps; /* These two are undocumented; the second is reserved for future use */ extern int history_multiline_entries; extern int history_file_version; /* Backwards compatibility */ extern int max_input_history; /* If set, this function is called to decide whether or not a particular history expansion should be treated as a special case for the calling application and not expanded. */ extern rl_linebuf_func_t *history_inhibit_expansion_function; #ifdef __cplusplus } #endif #endif /* !_HISTORY_H_ */ readline-8.3/savestring.c000644 000436 000024 00000002407 13052147664 015574 0ustar00chetstaff000000 000000 /* savestring.c - function version of savestring for backwards compatibility */ /* Copyright (C) 1998,2003,2017 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #define READLINE_LIBRARY #include #ifdef HAVE_STRING_H # include #endif #include "xmalloc.h" /* Backwards compatibility, now that savestring has been removed from all `public' readline header files. */ char * savestring (const char *s) { char *ret; ret = (char *)xmalloc (strlen (s) + 1); strcpy (ret, s); return ret; } readline-8.3/xmalloc.h000644 000436 000024 00000002334 14410572762 015052 0ustar00chetstaff000000 000000 /* xmalloc.h -- memory allocation that aborts on errors. */ /* Copyright (C) 1999-2009,2010-2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if !defined (_XMALLOC_H_) #define _XMALLOC_H_ #if defined (READLINE_LIBRARY) # include "rlstdc.h" #else # include #endif #ifndef PTR_T # define PTR_T void * #endif /* !PTR_T */ extern PTR_T xmalloc (size_t); extern PTR_T xrealloc (void *, size_t); extern void xfree (void *); #endif /* _XMALLOC_H_ */ readline-8.3/m4/codeset.m4000644 000436 000024 00000001574 14763673747 015477 0ustar00chetstaff000000 000000 # codeset.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019-2022 Free Software dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[char* cs = nl_langinfo(CODESET); return !cs;]])], [am_cv_langinfo_codeset=yes], [am_cv_langinfo_codeset=no]) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE([HAVE_NL_LANGINFO], [1]) AC_DEFINE([HAVE_LANGINFO_CODESET], [1], [Define if you have and nl_langinfo(CODESET).]) fi ]) readline-8.3/shlib/Makefile.in000644 000436 000024 00000044735 15017402507 016414 0ustar00chetstaff000000 000000 ## -*- text -*- ## # Makefile for the GNU readline library shared library support. # # Copyright (C) 1998-2009 Free Software Foundation, Inc. # This program 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 3 of the License, or # (at your option) any later version. # This program 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 this program. If not, see . PACKAGE = @PACKAGE_NAME@ VERSION = @PACKAGE_VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_VERSION = @PACKAGE_VERSION@ RL_LIBRARY_VERSION = @LIBVERSION@ RL_LIBRARY_NAME = readline datarootdir = @datarootdir@ srcdir = @srcdir@ VPATH = @top_srcdir@ topdir = @top_srcdir@ BUILD_DIR = @BUILD_DIR@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ install_sh = @install_sh@ CC = @CC@ RANLIB = @RANLIB@ AR = @AR@ ARFLAGS = @ARFLAGS@ RM = rm -f CP = cp MV = mv LN = ln SHELL = @MAKE_SHELL@ host_os = @host_os@ host_vendor = @host_vendor@ prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ bindir = @bindir@ libdir = @libdir@ datadir = @datadir@ localedir = @localedir@ # Support an alternate destination root directory for package building DESTDIR = CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' @BRACKETED_PASTE@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@ DEFS = @DEFS@ @CROSS_COMPILE@ LOCAL_DEFS = @LOCAL_DEFS@ # # These values are generated for configure by ${topdir}/support/shobj-conf. # If your system is not supported by that script, but includes facilities for # dynamic loading of shared objects, please update the script and send the # changes to bash-maintainers@gnu.org. # SHOBJ_CC = @SHOBJ_CC@ SHOBJ_CFLAGS = @SHOBJ_CFLAGS@ SHOBJ_LD = @SHOBJ_LD@ SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@ SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@ SHOBJ_LIBS = @SHOBJ_LIBS@ SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@ SHLIB_LIBS = @SHLIB_LIBS@ SHLIB_DOT = @SHLIB_DOT@ SHLIB_LIBPREF = @SHLIB_LIBPREF@ SHLIB_LIBSUFF = @SHLIB_LIBSUFF@ SHLIB_LIBVERSION = @SHLIB_LIBVERSION@ SHLIB_DLLVERSION = @SHLIB_DLLVERSION@ SHLIB_STATUS = @SHLIB_STATUS@ TERMCAP_LIB = @TERMCAP_LIB@ # shared library versioning SHLIB_MAJOR= @SHLIB_MAJOR@ # shared library systems like SVR4's do not use minor versions SHLIB_MINOR= .@SHLIB_MINOR@ # For libraries which include headers from other libraries. INCLUDES = -I. -I.. -I$(topdir) CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(INCLUDES) $(CPPFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) .SUFFIXES: .so .c.so: ${RM} $@ $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -o $*.o $< $(MV) $*.o $@ # The name of the main library target. SHARED_READLINE = $(SHLIB_LIBPREF)readline$(SHLIB_DOT)$(SHLIB_LIBVERSION) SHARED_HISTORY = $(SHLIB_LIBPREF)history$(SHLIB_DOT)$(SHLIB_LIBVERSION) SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY) # The C code source files for this library. CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \ $(topdir)/vi_mode.c $(topdir)/parens.c $(topdir)/rltty.c \ $(topdir)/complete.c $(topdir)/bind.c $(topdir)/isearch.c \ $(topdir)/display.c $(topdir)/signals.c $(topdir)/emacs_keymap.c \ $(topdir)/vi_keymap.c $(topdir)/util.c $(topdir)/kill.c \ $(topdir)/undo.c $(topdir)/macro.c $(topdir)/input.c \ $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c $(topdir)/xfree.c \ $(topdir)/history.c $(topdir)/histsearch.c $(topdir)/histexpand.c \ $(topdir)/histfile.c $(topdir)/nls.c $(topdir)/search.c \ $(topdir)/shell.c $(topdir)/savestring.c $(topdir)/tilde.c \ $(topdir)/text.c $(topdir)/misc.c $(topdir)/compat.c \ $(topdir)/colors.c $(topdir)/parse-colors.c \ $(topdir)/mbutil.c # The header files for this library. HSOURCES = $(topdir)/readline.h $(topdir)/rldefs.h $(topdir)/chardefs.h \ $(topdir)/keymaps.h $(topdir)/history.h $(topdir)/histlib.h \ $(topdir)/posixstat.h $(topdir)/posixdir.h $(topdir)/posixjmp.h \ $(topdir)/tilde.h $(topdir)/rlconf.h $(topdir)/rltty.h \ $(topdir)/ansi_stdlib.h $(topdir)/tcap.h $(topdir)/rlstdc.h \ $(topdir)/xmalloc.h $(topdir)/rlprivate.h $(topdir)/rlshell.h \ $(topdir)/rltypedefs.h $(topdir)/rlmbutil.h \ $(topdir)/colors.h $(topdir)/parse-colors.h SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.so \ mbutil.so SHARED_TILDEOBJ = tilde.so SHARED_COLORSOBJ = colors.so parse-colors.so SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \ rltty.so complete.so bind.so isearch.so display.so signals.so \ util.so kill.so undo.so macro.so input.so callback.so terminal.so \ text.so nls.so misc.so \ $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) $(SHARED_COLORSOBJ) \ xmalloc.so xfree.so compat.so ########################################################################## all: $(SHLIB_STATUS) supported: $(SHARED_LIBS) unsupported: @echo "Your system and compiler (${host_os}-${CC}) are not supported by the" @echo "${topdir}/support/shobj-conf script." @echo "If your operating system provides facilities for creating" @echo "shared libraries, please update the script and re-run configure." @echo "Please send the changes you made to bash-maintainers@gnu.org" @echo "for inclusion in future bash and readline releases." $(SHARED_READLINE): $(SHARED_OBJ) $(RM) $@ $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_OBJ) $(SHLIB_LIBS) $(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so xfree.so $(RM) $@ $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so xfree.so $(SHLIB_LIBS) # Since tilde.c is shared between readline and bash, make sure we compile # it with the right flags when it's built as part of readline tilde.so: tilde.c ${RM} $@ $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -DREADLINE_LIBRARY -c -o tilde.o $(topdir)/tilde.c $(MV) tilde.o $@ installdirs: $(topdir)/support/mkdirs -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(libdir) -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(bindir) install-supported: installdirs $(SHLIB_STATUS) $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY) $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_READLINE) @echo install: you may need to run ldconfig install-unsupported: @echo install: shared libraries not supported install: install-$(SHLIB_STATUS) uninstall-supported: $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_HISTORY) $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_READLINE) @echo uninstall: you may need to run ldconfig uninstall-unsupported: @echo uninstall: shared libraries not supported uninstall: uninstall-$(SHLIB_STATUS) .PHONY: clean maintainer-clean distclean mostlyclean mostlyclean: force $(RM) $(SHARED_OBJ) $(SHARED_LIBS) clean: mostlyclean distclean maintainer-clean: clean $(RM) Makefile force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Dependencies bind.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h bind.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h bind.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h bind.so: $(topdir)/rltypedefs.h bind.so: $(topdir)/tilde.h $(topdir)/history.h compat.so: ${BUILD_DIR}/config.h compat.so: $(topdir)/rlstdc.h $(topdir)/rltypedefs.h callback.so: $(topdir)/rlconf.h callback.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h callback.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h callback.so: $(topdir)/rltypedefs.h callback.so: $(topdir)/tilde.h complete.so: $(topdir)/ansi_stdlib.h $(topdir)/posixdir.h $(topdir)/posixstat.h complete.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h complete.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h complete.so: $(topdir)/rltypedefs.h complete.so: $(topdir)/tilde.h display.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h display.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h display.so: $(topdir)/tcap.h display.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h display.so: $(topdir)/rltypedefs.h display.so: $(topdir)/tilde.h $(topdir)/history.h funmap.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h funmap.so: $(topdir)/rltypedefs.h funmap.so: $(topdir)/rlconf.h $(topdir)/ansi_stdlib.h funmap.so: ${BUILD_DIR}/config.h $(topdir)/tilde.h histexpand.so: $(topdir)/ansi_stdlib.h histexpand.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h histexpand.so: ${BUILD_DIR}/config.h histfile.so: $(topdir)/ansi_stdlib.h histfile.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h histfile.so: ${BUILD_DIR}/config.h history.so: $(topdir)/ansi_stdlib.h history.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h history.so: ${BUILD_DIR}/config.h histsearch.so: $(topdir)/ansi_stdlib.h histsearch.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h histsearch.so: ${BUILD_DIR}/config.h input.so: $(topdir)/ansi_stdlib.h input.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h input.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h input.so: $(topdir)/rltypedefs.h input.so: $(topdir)/tilde.h isearch.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h isearch.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h isearch.so: $(topdir)/rltypedefs.h isearch.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h keymaps.so: $(topdir)/keymaps.h $(topdir)/chardefs.h $(topdir)/rlconf.h keymaps.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h keymaps.so: $(topdir)/rltypedefs.h keymaps.so: ${BUILD_DIR}/config.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h kill.so: $(topdir)/ansi_stdlib.h kill.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h kill.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h kill.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h macro.so: $(topdir)/ansi_stdlib.h macro.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h macro.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h macro.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h mbutil.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h mbutil.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h mbutil.so: $(topdir)/chardefs.h $(topdir)/rlstdc.h misc.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h misc.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h misc.so: $(topdir)/rltypedefs.h misc.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h nls.so: $(topdir)/ansi_stdlib.h nls.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h nls.o: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h nls.o: $(topdir)/rltypedefs.h nls.o: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rlstdc.h parens.so: $(topdir)/rlconf.h ${BUILD_DIR}/config.h parens.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h parens.so: $(topdir)/rltypedefs.h parens.so: $(topdir)/tilde.h rltty.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h rltty.so: $(topdir)/rltty.h $(topdir)/tilde.h rltty.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h rltty.so: $(topdir)/rltypedefs.h savestring.so: ${BUILD_DIR}/config.h search.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h search.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h search.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h search.so: $(topdir)/rltypedefs.h signals.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h signals.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h signals.so: $(topdir)/history.h $(topdir)/tilde.h signals.so: $(topdir)/rltypedefs.h terminal.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h terminal.so: $(topdir)/tcap.h terminal.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h terminal.so: $(topdir)/tilde.h $(topdir)/history.h terminal.so: $(topdir)/rltypedefs.h text.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h text.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h text.so: $(topdir)/rltypedefs.h text.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h tilde.so: $(topdir)/ansi_stdlib.h ${BUILD_DIR}/config.h $(topdir)/tilde.h undo.so: $(topdir)/ansi_stdlib.h undo.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h undo.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h undo.so: $(topdir)/rltypedefs.h undo.so: $(topdir)/tilde.h $(topdir)/history.h util.so: $(topdir)/posixjmp.h $(topdir)/ansi_stdlib.h util.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h util.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h util.so: $(topdir)/rltypedefs.h $(topdir)/tilde.h vi_mode.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h vi_mode.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h vi_mode.so: $(topdir)/history.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h vi_mode.so: $(topdir)/rltypedefs.h xfree.so: ${BUILD_DIR}/config.h xfree.so: $(topdir)/ansi_stdlib.h xmalloc.so: ${BUILD_DIR}/config.h xmalloc.so: $(topdir)/ansi_stdlib.h bind.so: $(topdir)/rlshell.h histfile.so: $(topdir)/rlshell.h nls.so: $(topdir)/rlshell.h readline.so: $(topdir)/rlshell.h shell.so: $(topdir)/rlshell.h terminal.so: $(topdir)/rlshell.h histexpand.so: $(topdir)/rlshell.h colors.so: $(BUILD_DIR)/config.h $(topdir)/colors.h colors.so: $(topdir)/rlconf.h colors.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h colors.so: $(topdir)/chardefs.h $(topdir)/tilde.h $(topdir)/rlstdc.h colors.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h parse-colors.so: $(BUILD_DIR)/config.h $(topdir)/colors.h $(topdir)/parse-colors.h parse-colors.so: $(topdir)/rldefs.h $(topdir)/rlconf.h parse-colors.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h parse-colors.so: $(topdir)/chardefs.h $(topdir)/tilde.h $(topdir)/rlstdc.h bind.so: $(topdir)/rlprivate.h callback.so: $(topdir)/rlprivate.h complete.so: $(topdir)/rlprivate.h display.so: $(topdir)/rlprivate.h input.so: $(topdir)/rlprivate.h isearch.so: $(topdir)/rlprivate.h kill.so: $(topdir)/rlprivate.h macro.so: $(topdir)/rlprivate.h mbutil.so: $(topdir)/rlprivate.h misc.so: $(topdir)/rlprivate.h nls.so: $(topdir)/rlprivate.h parens.so: $(topdir)/rlprivate.h readline.so: $(topdir)/rlprivate.h rltty.so: $(topdir)/rlprivate.h search.so: $(topdir)/rlprivate.h signals.so: $(topdir)/rlprivate.h terminal.so: $(topdir)/rlprivate.h text.so: $(topdir)/rlprivate.h undo.so: $(topdir)/rlprivate.h util.so: $(topdir)/rlprivate.h vi_mode.so: $(topdir)/rlprivate.h colors.so: $(topdir)/rlprivate.h parse-colors.so: $(topdir)/rlprivate.h bind.so: $(topdir)/xmalloc.h callback.so: $(topdir)/xmalloc.h complete.so: $(topdir)/xmalloc.h display.so: $(topdir)/xmalloc.h funmap.so: $(topdir)/xmalloc.h histexpand.so: $(topdir)/xmalloc.h histfile.so: $(topdir)/xmalloc.h history.so: $(topdir)/xmalloc.h input.so: $(topdir)/xmalloc.h isearch.so: $(topdir)/xmalloc.h keymaps.so: $(topdir)/xmalloc.h kill.so: $(topdir)/xmalloc.h macro.so: $(topdir)/xmalloc.h mbutil.so: $(topdir)/xmalloc.h misc.so: $(topdir)/xmalloc.h readline.so: $(topdir)/xmalloc.h savestring.so: $(topdir)/xmalloc.h search.so: $(topdir)/xmalloc.h shell.so: $(topdir)/xmalloc.h terminal.so: $(topdir)/xmalloc.h text.so: $(topdir)/xmalloc.h tilde.so: $(topdir)/xmalloc.h undo.so: $(topdir)/xmalloc.h util.so: $(topdir)/xmalloc.h vi_mode.so: $(topdir)/xmalloc.h xfree.so: $(topdir)/xmalloc.h xmalloc.so: $(topdir)/xmalloc.h colors.so: $(topdir)/xmalloc.h parse-colors.so: $(topdir)/xmalloc.h complete.so: $(topdir)/rlmbutil.h display.so: $(topdir)/rlmbutil.h histexpand.so: $(topdir)/rlmbutil.h input.so: $(topdir)/rlmbutil.h isearch.so: $(topdir)/rlmbutil.h mbutil.so: $(topdir)/rlmbutil.h misc.so: $(topdir)/rlmbutil.h readline.so: $(topdir)/rlmbutil.h search.so: $(topdir)/rlmbutil.h text.so: $(topdir)/rlmbutil.h vi_mode.so: $(topdir)/rlmbutil.h colors.so: $(topdir)/rlmbutil.h parse-colors.so: $(topdir)/rlmbutil.h bind.so: $(topdir)/bind.c callback.so: $(topdir)/callback.c compat.so: $(topdir)/compat.c complete.so: $(topdir)/complete.c display.so: $(topdir)/display.c funmap.so: $(topdir)/funmap.c input.so: $(topdir)/input.c isearch.so: $(topdir)/isearch.c keymaps.so: $(topdir)/keymaps.c $(topdir)/emacs_keymap.c $(topdir)/vi_keymap.c kill.so: $(topdir)/kill.c macro.so: $(topdir)/macro.c mbutil.so: $(topdir)/mbutil.c misc.so: $(topdir)/mbutil.c nls.so: $(topdir)/nls.c parens.so: $(topdir)/parens.c readline.so: $(topdir)/readline.c rltty.so: $(topdir)/rltty.c savestring.so: $(topdir)/savestring.c search.so: $(topdir)/search.c shell.so: $(topdir)/shell.c signals.so: $(topdir)/signals.c terminal.so: $(topdir)/terminal.c text.so: $(topdir)/text.c tilde.so: $(topdir)/tilde.c undo.so: $(topdir)/undo.c util.so: $(topdir)/util.c vi_mode.so: $(topdir)/vi_mode.c xfree.so: $(topdir)/xfree.c xmalloc.so: $(topdir)/xmalloc.c histexpand.so: $(topdir)/histexpand.c histfile.so: $(topdir)/histfile.c history.so: $(topdir)/history.c histsearch.so: $(topdir)/histsearch.c bind.so: bind.c callback.so: callback.c comapt.so: compat.c complete.so: complete.c display.so: display.c funmap.so: funmap.c input.so: input.c isearch.so: isearch.c keymaps.so: keymaps.c emacs_keymap.c vi_keymap.c kill.so: kill.c macro.so: macro.c mbutil.so: mbutil.c misc.so: misc.c nls.so: nls.c parens.so: parens.c readline.so: readline.c rltty.so: rltty.c savestring.so: savestring.c search.so: search.c signals.so: signals.c shell.so: shell.c terminal.so: terminal.c text.so: text.c tilde.so: tilde.c undo.so: undo.c util.so: util.c vi_mode.so: vi_mode.c xfree.so: xfree.c xmalloc.so: xmalloc.c colors.so: colors.c parse-colors.so: parse-colors.c histexpand.so: histexpand.c histfile.so: histfile.c history.so: history.c histsearch.so: histsearch.c readline-8.3/examples/rlcat.c000644 000436 000024 00000006512 14415540053 016324 0ustar00chetstaff000000 000000 /* * rlcat - cat(1) using readline * * usage: rlcat */ /* Copyright (C) 1987-2009,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if defined (HAVE_CONFIG_H) # include #endif #ifdef HAVE_UNISTD_H # include #endif #include #include "posixstat.h" #include #include #include #include #ifdef HAVE_STDLIB_H # include #else extern void exit(); #endif #ifdef HAVE_LOCALE_H # include #endif #ifndef errno extern int errno; #endif #if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include # include #endif extern int optind; extern char *optarg; static int fcopy(FILE *); static int stdcat(int, char **); static char *progname; static int vflag; static void usage(void) { fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname); } int main (int argc, char **argv) { char *temp; int opt, Vflag, Nflag; #ifdef HAVE_SETLOCALE setlocale (LC_ALL, ""); #endif progname = strrchr(argv[0], '/'); if (progname == 0) progname = argv[0]; else progname++; vflag = Vflag = Nflag = 0; while ((opt = getopt(argc, argv, "vEVN")) != EOF) { switch (opt) { case 'v': vflag = 1; break; case 'V': Vflag = 1; break; case 'E': Vflag = 0; break; case 'N': Nflag = 1; break; default: usage (); exit (2); } } argc -= optind; argv += optind; if (isatty(0) == 0 || argc || Nflag) return stdcat(argc, argv); rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs"); while (temp = readline ("")) { if (*temp) add_history (temp); printf ("%s\n", temp); } return (ferror (stdout)); } static int fcopy(FILE *fp) { int c; char *x; while ((c = getc(fp)) != EOF) { if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0) { x = rl_untranslate_keyseq (c); if (fputs (x, stdout) == EOF) return 1; } else if (putchar (c) == EOF) return 1; } return (ferror (stdout)); } int stdcat (int argc, char **argv) { int i, fd, r; char *s; FILE *fp; if (argc == 0) return (fcopy(stdin)); for (i = 0, r = 1; i < argc; i++) { if (*argv[i] == '-' && argv[i][1] == 0) fp = stdin; else { fp = fopen (argv[i], "r"); if (fp == 0) { fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno)); continue; } } r = fcopy (fp); if (fp != stdin) fclose(fp); } return r; } readline-8.3/examples/excallback.c000644 000436 000024 00000012641 14640040116 017303 0ustar00chetstaff000000 000000 /* From: Jeff Solomon Date: Fri, 9 Apr 1999 10:13:27 -0700 (PDT) To: chet@po.cwru.edu Subject: new readline example Message-ID: <14094.12094.527305.199695@mrclean.Stanford.EDU> Chet, I've been using readline 4.0. Specifically, I've been using the perl version Term::ReadLine::Gnu. It works great. Anyway, I've been playing around the alternate interface and I wanted to contribute a little C program, callback.c, to you that you could use as an example of the alternate interface in the /examples directory of the readline distribution. My example shows how, using the alternate interface, you can interactively change the prompt (which is very nice imo). Also, I point out that you must roll your own terminal setting when using the alternate interface because readline depreps (using your parlance) the terminal while in the user callback. I try to demonstrate what I mean with an example. I've included the program below. To compile, I just put the program in the examples directory and made the appropriate changes to the EXECUTABLES and OBJECTS line and added an additional target 'callback'. I compiled on my Sun Solaris2.6 box using Sun's cc. Let me know what you think. Jeff */ /* Copyright (C) 1999 Jeff Solomon */ #if defined (HAVE_CONFIG_H) #include #endif #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include /* xxx - should make this more general */ #include #ifdef READLINE_LIBRARY # include "readline.h" # include "history.h" #else # include # include #endif #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif /* This little examples demonstrates the alternate interface to using readline. * In the alternate interface, the user maintains control over program flow and * only calls readline when STDIN is readable. Using the alternate interface, * you can do anything else while still using readline (like talking to a * network or another program) without blocking. * * Specifically, this program highlights two importants features of the * alternate interface. The first is the ability to interactively change the * prompt, which can't be done using the regular interface since rl_prompt is * read-only. * * The second feature really highlights a subtle point when using the alternate * interface. That is, readline will not alter the terminal when inside your * callback handler. So let's so, your callback executes a user command that * takes a non-trivial amount of time to complete (seconds). While your * executing the command, the user continues to type keystrokes and expects them * to be re-echoed on the new prompt when it returns. Unfortunately, the default * terminal configuration doesn't do this. After the prompt returns, the user * must hit one additional keystroke and then will see all of his previous * keystrokes. To illustrate this, compile and run this program. Type "sleep" at * the prompt and then type "bar" before the prompt returns (you have 3 * seconds). Notice how "bar" is re-echoed on the prompt after the prompt * returns? This is what you expect to happen. Now comment out the 4 lines below * the line that says COMMENT LINE BELOW. Recompile and rerun the program and do * the same thing. When the prompt returns, you should not see "bar". Now type * "f", see how "barf" magically appears? This behavior is un-expected and not * desired. */ void process_line(char *line); int change_prompt(int, int); char *get_prompt(void); int prompt = 1; char prompt_buf[40], line_buf[256]; tcflag_t old_lflag; cc_t old_vtime; struct termios term; int main(int c, char **v) { fd_set fds; setlocale (LC_ALL, ""); /* Adjust the terminal slightly before the handler is installed. Disable * canonical mode processing and set the input character time flag to be * non-blocking. */ if( tcgetattr(STDIN_FILENO, &term) < 0 ) { perror("tcgetattr"); exit(1); } old_lflag = term.c_lflag; old_vtime = term.c_cc[VTIME]; term.c_lflag &= ~ICANON; term.c_cc[VTIME] = 1; /* COMMENT LINE BELOW - see above */ if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { perror("tcsetattr"); exit(1); } rl_add_defun("change-prompt", change_prompt, CTRL('t')); rl_callback_handler_install(get_prompt(), process_line); while(1) { FD_ZERO(&fds); FD_SET(fileno(stdin), &fds); if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) { perror("select"); exit(1); } if( FD_ISSET(fileno(stdin), &fds) ) { rl_callback_read_char(); } } } void process_line(char *line) { if( line == NULL ) { fprintf(stderr, "\n", line); /* reset the old terminal setting before exiting */ term.c_lflag = old_lflag; term.c_cc[VTIME] = old_vtime; if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { perror("tcsetattr"); exit(1); } exit(0); } if( strcmp(line, "sleep") == 0 ) { sleep(3); } else { fprintf(stderr, "|%s|\n", line); } free (line); } int change_prompt(int count, int key) { /* toggle the prompt variable */ prompt = !prompt; rl_set_prompt (get_prompt ()); return 0; } char * get_prompt(void) { /* The prompts can even be different lengths! */ sprintf(prompt_buf, "%s", prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> "); return prompt_buf; } readline-8.3/examples/rl-fgets.c000644 000436 000024 00000025613 10042030201 016722 0ustar00chetstaff000000 000000 /* Date: Tue, 16 Mar 2004 19:38:40 -0800 From: Harold Levy Subject: fgets(stdin) --> readline() redirector To: chet@po.cwru.edu Hi Chet, Here is something you may find useful enough to include in the readline distribution. It is a shared library that redirects calls to fgets(stdin) to readline() via LD_PRELOAD, and it supports a custom prompt and list of command names. Many people have asked me for this file, so I thought I'd pass it your way in hope of just including it with readline to begin with. Best Regards, -Harold */ /****************************************************************************** ******************************************************************************* FILE NAME: fgets.c TARGET: libfgets.so AUTHOR: Harold Levy VERSION: 1.0 hlevy@synopsys.com ABSTRACT: Customize fgets() behavior via LD_PRELOAD in the following ways: -- If fgets(stdin) is called, redirect to GNU readline() to obtain command-line editing, file-name completion, history, etc. -- A list of commands for command-name completion can be configured by setting the environment-variable FGETS_COMMAND_FILE to a file containing the list of commands to be used. -- Command-line editing with readline() works best when the prompt string is known; you can set this with the FGETS_PROMPT environment variable. -- There special strings that libfgets will interpret as internal commands: _fgets_reset_ reset the command list _fgets_dump_ dump status _fgets_debug_ toggle debug messages HOW TO BUILD: Here are examples of how to build libfgets.so on various platforms; you will have to add -I and -L flags to configure access to the readline header and library files. (32-bit builds with gcc) AIX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline -ltermcap HP-UX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldld -lreadline Linux: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline SunOS: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lgen -lreadline (64-bit builds without gcc) SunOS: SUNWspro/bin/cc -D_LARGEFILE64_SOURCE=1 -xtarget=ultra -xarch=v9 \ -KPIC fgets.c -Bdynamic -lc -ldl -lgen -ltermcap -lreadline HOW TO USE: Different operating systems have different levels of support for the LD_PRELOAD concept. The generic method for 32-bit platforms is to put libtermcap.so, libfgets.so, and libreadline.so (with absolute paths) in the LD_PRELOAD environment variable, and to put their parent directories in the LD_LIBRARY_PATH environment variable. Unfortunately there is no generic method for 64-bit platforms; e.g. for 64-bit SunOS, you would have to build both 32-bit and 64-bit libfgets and libreadline libraries, and use the LD_FLAGS_32 and LD_FLAGS_64 environment variables with preload and library_path configurations (a mix of 32-bit and 64-bit calls are made under 64-bit SunOS). EXAMPLE WRAPPER: Here is an example shell script wrapper around the program "foo" that uses fgets() for command-line input: #!/bin/csh #### replace this with the libtermcap.so directory: set dir1 = "/usr/lib" #### replace this with the libfgets.so directory: set dir2 = "/usr/fgets" #### replace this with the libreadline.so directory: set dir3 = "/usr/local/lib" set lib1 = "${dir1}/libtermcap.so" set lib2 = "${dir2}/libfgets.so" set lib3 = "${dir3}/libreadline.so" if ( "${?LD_PRELOAD}" ) then setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}:${LD_PRELOAD}" else setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}" endif if ( "${?LD_LIBRARY_PATH}" ) then setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}:${LD_LIBRARY_PATH}" else setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}" endif setenv FGETS_COMMAND_FILE "${dir2}/foo.commands" setenv FGETS_PROMPT "foo> " exec "foo" $* Copyright (C)©2003-2004 Harold Levy. This code links to the GNU readline library, and as such is bound by 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. The GNU General Public License is often shipped with GNU software, and is generally kept in a file called COPYING or LICENSE. If you do not have a copy of the license, write to the Free Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. This program 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. ******************************************************************************* ******************************************************************************/ #include #include #include #include #include #include #include /* for dynamically connecting to the native fgets() */ #if defined(RTLD_NEXT) #define REAL_LIBC RTLD_NEXT #else #define REAL_LIBC ((void *) -1L) #endif typedef char * ( * fgets_t ) ( char * s, int n, FILE * stream ) ; /* private data */ /* -- writeable data is stored in the shared library's data segment -- every process that uses the shared library gets a private memory copy of its entire data segment -- static data in the shared library is not copied to the application -- only read-only (i.e. 'const') data is stored in the shared library's text segment */ static char ** my_fgets_names = NULL ; static int my_fgets_number_of_names = 0 ; static int my_fgets_debug_flag = 0 ; /* invoked with _fgets_reset_ */ static void my_fgets_reset ( void ) { if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { int i ; if ( my_fgets_debug_flag ) { printf ( "libfgets: removing command list\n" ) ; } for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { if ( my_fgets_names[i] ) free ( my_fgets_names[i] ) ; } free ( my_fgets_names ) ; } my_fgets_names = NULL ; my_fgets_number_of_names = 0 ; } /* invoked with _fgets_dump_ */ static void my_fgets_dump ( void ) { char * s ; printf ( "\n" ) ; s = getenv ( "FGETS_PROMPT" ) ; printf ( "FGETS_PROMPT = %s\n", s ? s : "" ) ; s = getenv ( "FGETS_COMMAND_FILE" ) ; printf ( "FGETS_COMMAND_FILE = %s\n", s ? s : "" ) ; printf ( "debug flag = %d\n", my_fgets_debug_flag ) ; printf ( "#commands = %d\n", my_fgets_number_of_names ) ; if ( my_fgets_debug_flag ) { if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { int i ; for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { printf ( "%s\n", my_fgets_names[i] ) ; } } } printf ( "\n" ) ; } /* invoked with _fgets_debug_ */ static void my_fgets_debug_toggle ( void ) { my_fgets_debug_flag = my_fgets_debug_flag ? 0 : 1 ; if ( my_fgets_debug_flag ) { printf ( "libfgets: debug flag = %d\n", my_fgets_debug_flag ) ; } } /* read the command list if needed, return the i-th name */ static char * my_fgets_lookup ( int index ) { if ( (! my_fgets_names) || (! my_fgets_number_of_names) ) { char * fname ; FILE * fp ; fgets_t _fgets ; int i ; char buf1[256], buf2[256] ; fname = getenv ( "FGETS_COMMAND_FILE" ) ; if ( ! fname ) { if ( my_fgets_debug_flag ) { printf ( "libfgets: empty or unset FGETS_COMMAND_FILE\n" ) ; } return NULL ; } fp = fopen ( fname, "r" ) ; if ( ! fp ) { if ( my_fgets_debug_flag ) { printf ( "libfgets: cannot open '%s' for reading\n", fname ) ; } return NULL ; } _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; if ( ! _fgets ) { fprintf ( stderr, "libfgets: failed to dynamically link to native fgets()\n" ) ; return NULL ; } for ( i = 0 ; _fgets(buf1,255,fp) ; i ++ ) ; if ( ! i ) { fclose(fp) ; return NULL ; } my_fgets_names = (char**) calloc ( i, sizeof(char*) ) ; rewind ( fp ) ; i = 0 ; while ( _fgets(buf1,255,fp) ) { buf1[255] = 0 ; if ( 1 == sscanf(buf1,"%s",buf2) ) { my_fgets_names[i] = strdup(buf2) ; i ++ ; } } fclose ( fp ) ; my_fgets_number_of_names = i ; if ( my_fgets_debug_flag ) { printf ( "libfgets: successfully read %d commands\n", i ) ; } } if ( index < my_fgets_number_of_names ) { return my_fgets_names[index] ; } else { return NULL ; } } /* generate a list of partial name matches for readline() */ static char * my_fgets_generator ( const char * text, int state ) { static int list_index, len ; char * name ; if ( ! state ) { list_index = 0 ; len = strlen ( text ) ; } while ( ( name = my_fgets_lookup(list_index) ) ) { list_index ++ ; if ( ! strncmp ( name, text, len ) ) { return ( strdup ( name ) ) ; } } return ( NULL ) ; } /* partial name completion callback for readline() */ static char ** my_fgets_completion ( const char * text, int start, int end ) { char ** matches ; matches = NULL ; if ( ! start ) { matches = rl_completion_matches ( text, my_fgets_generator ) ; } return ( matches ) ; } /* fgets() intercept */ char * fgets ( char * s, int n, FILE * stream ) { if ( ! s ) return NULL ; if ( stream == stdin ) { char * prompt ; char * my_fgets_line ; rl_already_prompted = 1 ; rl_attempted_completion_function = my_fgets_completion ; rl_catch_signals = 1 ; rl_catch_sigwinch = 1 ; rl_set_signals () ; prompt = getenv ( "FGETS_PROMPT" ) ; for ( my_fgets_line = 0 ; ! my_fgets_line ; my_fgets_line=readline(prompt) ) ; if ( ! strncmp(my_fgets_line, "_fgets_reset_", 13) ) { my_fgets_reset () ; free ( my_fgets_line ) ; strcpy ( s, "\n" ) ; return ( s ) ; } if ( ! strncmp(my_fgets_line, "_fgets_dump_", 12) ) { my_fgets_dump () ; free ( my_fgets_line ) ; strcpy ( s, "\n" ) ; return ( s ) ; } if ( ! strncmp(my_fgets_line, "_fgets_debug_", 13) ) { my_fgets_debug_toggle () ; free ( my_fgets_line ) ; strcpy ( s, "\n" ) ; return ( s ) ; } (void) strncpy ( s, my_fgets_line, n-1 ) ; (void) strcat ( s, "\n" ) ; if ( *my_fgets_line ) add_history ( my_fgets_line ) ; free ( my_fgets_line ) ; return ( s ) ; } else { static fgets_t _fgets ; _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; if ( ! _fgets ) { fprintf ( stderr, "libfgets: failed to dynamically link to native fgets()\n" ) ; strcpy ( s, "\n" ) ; return ( s ) ; } return ( _fgets ( s, n, stream ) ) ; } } readline-8.3/examples/rlptytest.c000644 000436 000024 00000015404 14773762654 017315 0ustar00chetstaff000000 000000 /* * * Another test harness for the readline callback interface. * * Author: Bob Rossi */ #if defined (HAVE_CONFIG_H) #include #endif #include #include #include #include #include #include #include /* Need a configure check here to turn this into a real application. */ #if 1 /* LINUX */ #include #else #include #endif #ifdef HAVE_LOCALE_H # include #endif #ifdef READLINE_LIBRARY # include "readline.h" # include "history.h" #else # include # include #endif int tty_reset(int fd); /** * Master/Slave PTY used to keep readline off of stdin/stdout. */ static int masterfd = -1; static int slavefd; void sigint (int s) { tty_reset (STDIN_FILENO); close (masterfd); close (slavefd); printf ("\n"); exit (0); } void sigwinch (int s) { rl_resize_terminal (); } static int user_input(void) { int size; const int MAX = 1024; char *buf = (char *)malloc(MAX+1); size = read (STDIN_FILENO, buf, MAX); if (size == -1) return -1; size = write (masterfd, buf, size); if (size == -1) return -1; return 0; } static int readline_input(void) { const int MAX = 1024; char *buf = (char *)malloc(MAX+1); int size; size = read (masterfd, buf, MAX); if (size == -1) { free( buf ); buf = NULL; return -1; } buf[size] = 0; /* Display output from readline */ if ( size > 0 ) fprintf(stderr, "%s", buf); free( buf ); buf = NULL; return 0; } static void rlctx_send_user_command(char *line) { /* This happens when rl_callback_read_char gets EOF */ if ( line == NULL ) return; if (strcmp (line, "exit") == 0) { tty_reset (STDIN_FILENO); close (masterfd); close (slavefd); printf ("\n"); exit (0); } /* Don't add the enter command */ if ( line && *line != '\0' ) add_history(line); } static void custom_deprep_term_function (void) { } static int init_readline (int inputfd, int outputfd) { FILE *inputFILE, *outputFILE; inputFILE = fdopen (inputfd, "r"); if (!inputFILE) return -1; outputFILE = fdopen (outputfd, "w"); if (!outputFILE) return -1; rl_instream = inputFILE; rl_outstream = outputFILE; /* Tell readline what the prompt is if it needs to put it back */ rl_callback_handler_install("(rltest): ", rlctx_send_user_command); /* Set the terminal type to dumb so the output of readline can be * understood by tgdb */ if ( rl_reset_terminal("dumb") == -1 ) return -1; /* For some reason, readline can not deprep the terminal. * However, it doesn't matter because no other application is working on * the terminal besides readline */ rl_deprep_term_function = custom_deprep_term_function; using_history(); read_history(".history"); return 0; } static int main_loop(void) { fd_set rset; int max; max = (masterfd > STDIN_FILENO) ? masterfd : STDIN_FILENO; max = (max > slavefd) ? max : slavefd; for (;;) { /* Reset the fd_set, and watch for input from GDB or stdin */ FD_ZERO(&rset); FD_SET(STDIN_FILENO, &rset); FD_SET(slavefd, &rset); FD_SET(masterfd, &rset); /* Wait for input */ if (select(max + 1, &rset, NULL, NULL, NULL) == -1) { if (errno == EINTR) continue; else return -1; } /* Input received through the pty: Handle it * Wrote to masterfd, slave fd has that input, alert readline to read it. */ if (FD_ISSET(slavefd, &rset)) rl_callback_read_char(); /* Input received through the pty. * Readline read from slavefd, and it wrote to the masterfd. */ if (FD_ISSET(masterfd, &rset)) if ( readline_input() == -1 ) return -1; /* Input received: Handle it, write to masterfd (input to readline) */ if (FD_ISSET(STDIN_FILENO, &rset)) if ( user_input() == -1 ) return -1; } return 0; } /* The terminal attributes before calling tty_cbreak */ static struct termios save_termios; static struct winsize size; static enum { RESET, TCBREAK } ttystate = RESET; /* tty_cbreak: Sets terminal to cbreak mode. Also known as noncanonical mode. * 1. Signal handling is still turned on, so the user can still type those. * 2. echo is off * 3. Read in one char at a time. * * fd - The file descriptor of the terminal * * Returns: 0 on success, -1 on error */ int tty_cbreak(int fd) { struct termios buf; int ttysavefd = -1; if(tcgetattr(fd, &save_termios) < 0) return -1; buf = save_termios; buf.c_lflag &= ~(ECHO | ICANON); buf.c_iflag &= ~(ICRNL | INLCR); buf.c_cc[VMIN] = 1; buf.c_cc[VTIME] = 0; #if defined (VLNEXT) && defined (_POSIX_VDISABLE) buf.c_cc[VLNEXT] = _POSIX_VDISABLE; #endif #if defined (VDSUSP) && defined (_POSIX_VDISABLE) buf.c_cc[VDSUSP] = _POSIX_VDISABLE; #endif /* enable flow control; only stty start char can restart output */ #if 0 buf.c_iflag |= (IXON|IXOFF); #ifdef IXANY buf.c_iflag &= ~IXANY; #endif #endif /* disable flow control; let ^S and ^Q through to pty */ buf.c_iflag &= ~(IXON|IXOFF); #ifdef IXANY buf.c_iflag &= ~IXANY; #endif if(tcsetattr(fd, TCSAFLUSH, &buf) < 0) return -1; ttystate = TCBREAK; ttysavefd = fd; /* set size */ if(ioctl(fd, TIOCGWINSZ, (char *)&size) < 0) return -1; #ifdef DEBUG err_msg("%d rows and %d cols\n", size.ws_row, size.ws_col); #endif return (0); } int tty_off_xon_xoff (int fd) { struct termios buf; int ttysavefd = -1; if(tcgetattr(fd, &buf) < 0) return -1; buf.c_iflag &= ~(IXON|IXOFF); if(tcsetattr(fd, TCSAFLUSH, &buf) < 0) return -1; return 0; } /* tty_reset: Sets the terminal attributes back to their previous state. * PRE: tty_cbreak must have already been called. * * fd - The file descrioptor of the terminal to reset. * * Returns: 0 on success, -1 on error */ int tty_reset(int fd) { if(ttystate != TCBREAK) return (0); if(tcsetattr(fd, TCSAFLUSH, &save_termios) < 0) return (-1); ttystate = RESET; return 0; } int main(int c, char **v) { int val; #ifdef HAVE_SETLOCALE setlocale (LC_ALL, ""); #endif val = openpty (&masterfd, &slavefd, NULL, NULL, NULL); if (val == -1) return -1; val = tty_off_xon_xoff (masterfd); if (val == -1) return -1; #ifdef SIGWINCH signal (SIGWINCH, sigwinch); #endif signal (SIGINT, sigint); val = init_readline (slavefd, slavefd); if (val == -1) return -1; val = tty_cbreak (STDIN_FILENO); if (val == -1) return -1; val = main_loop (); tty_reset (STDIN_FILENO); if (val == -1) return -1; return 0; } readline-8.3/examples/rlkeymaps.c000644 000436 000024 00000002465 13350231165 017227 0ustar00chetstaff000000 000000 #include #include #include #include #if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include # include #endif int main (int c, char **v) { Keymap nmap, emacsmap, newemacs; int r, errs; errs = 0; nmap = rl_make_keymap (); r = rl_set_keymap_name ("emacs", nmap); if (r >= 0) { fprintf (stderr, "rlkeymaps: error: able to rename `emacs' keymap\n"); errs++; } emacsmap = rl_get_keymap_by_name ("emacs"); r = rl_set_keymap_name ("newemacs", emacsmap); if (r >= 0) { fprintf (stderr, "rlkeymaps: error: able to set new name for emacs keymap\n"); errs++; } r = rl_set_keymap_name ("newemacs", nmap); if (r < 0) { fprintf (stderr, "rlkeymaps: error: newemacs: could not set keymap name\n"); errs++; } newemacs = rl_copy_keymap (emacsmap); r = rl_set_keymap_name ("newemacs", newemacs); if (r < 0) { fprintf (stderr, "rlkeymaps: error: newemacs: could not set `newemacs' keymap to new map\n"); errs++; } r = rl_set_keymap_name ("emacscopy", newemacs); if (r < 0) { fprintf (stderr, "rlkeymaps: error: emacscopy: could not rename created keymap\n"); errs++; } exit (errs); } readline-8.3/examples/rl-callbacktest.c000644 000436 000024 00000005304 14773762066 020305 0ustar00chetstaff000000 000000 /* Standard include files. stdio.h is required. */ #include #include #include /* Used for select(2) */ #include #include #include #include #include #include /* Standard readline include files. */ #if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include # include #endif #if !defined (errno) extern int errno; #endif static void cb_linehandler (char *); static void signandler (int); int running; int sigwinch_received; const char *prompt = "rltest$ "; /* Handle SIGWINCH and window size changes when readline is not active and reading a character. */ static void sighandler (int sig) { sigwinch_received = 1; } /* Callback function called for each line when accept-line executed, EOF seen, or EOF character read. This sets a flag and returns; it could also call exit(3). */ static void cb_linehandler (char *line) { /* Can use ^D (stty eof) or `exit' to exit. */ if (line == NULL || strcmp (line, "exit") == 0) { if (line == 0) printf ("\n"); printf ("exit\n"); /* This function needs to be called to reset the terminal settings, and calling it from the line handler keeps one extra prompt from being displayed. */ rl_callback_handler_remove (); running = 0; } else { if (*line) add_history (line); printf ("input line: %s\n", line); free (line); } } int main (int c, char **v) { fd_set fds; int r; /* Set the default locale values according to environment variables. */ setlocale (LC_ALL, ""); #if defined (SIGWINCH) /* Handle window size changes when readline is not active and reading characters. */ signal (SIGWINCH, sighandler); #endif /* Install the line handler. */ rl_callback_handler_install (prompt, cb_linehandler); /* Enter a simple event loop. This waits until something is available to read on readline's input stream (defaults to standard input) and calls the builtin character read callback to read it. It does not have to modify the user's terminal settings. */ running = 1; while (running) { FD_ZERO (&fds); FD_SET (fileno (rl_instream), &fds); r = select (FD_SETSIZE, &fds, NULL, NULL, NULL); if (r < 0 && errno != EINTR) { perror ("rltest: select"); rl_callback_handler_remove (); break; } if (sigwinch_received) { rl_resize_terminal (); sigwinch_received = 0; } if (r < 0) continue; if (FD_ISSET (fileno (rl_instream), &fds)) rl_callback_read_char (); } printf ("rltest: Event loop has exited\n"); return 0; } readline-8.3/examples/rlbasic.c000644 000436 000024 00000001065 14230060313 016623 0ustar00chetstaff000000 000000 #include #include #include #include #ifdef HAVE_LOCALE_H # include #endif #if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include # include #endif int main (int c, char **v) { char *input; #ifdef HAVE_SETLOCALE setlocale (LC_ALL, ""); #endif for (;;) { input = readline ((char *)NULL); if (input == 0) break; printf ("%s\n", input); if (strcmp (input, "exit") == 0) break; free (input); } exit (0); } readline-8.3/examples/readlinebuf.h000644 000436 000024 00000006555 11053014510 017500 0ustar00chetstaff000000 000000 /******************************************************************************* * $Revision: 1.2 $ * $Date: 2001/09/11 06:19:36 $ * $Author: vyzo $ * * Contents: A streambuf which uses the GNU readline library for line I/O * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu] * * This program 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 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ******************************************************************************/ #ifndef _READLINEBUF_H_ #define _READLINEBUF_H_ #include #include #include #include #include #include #include #if (defined __GNUC__) && (__GNUC__ < 3) #include #else #include using std::streamsize; using std::streambuf; #endif class readlinebuf : public streambuf { public: #if (defined __GNUC__) && (__GNUC__ < 3) typedef char char_type; typedef int int_type; typedef streampos pos_type; typedef streamoff off_type; #endif static const int_type eof = EOF; // this is -1 static const int_type not_eof = 0; private: const char* prompt_; bool history_; char* line_; int low_; int high_; protected: virtual int_type showmanyc() const { return high_ - low_; } virtual streamsize xsgetn( char_type* buf, streamsize n ) { int rd = n > (high_ - low_)? (high_ - low_) : n; memcpy( buf, line_, rd ); low_ += rd; if ( rd < n ) { low_ = high_ = 0; free( line_ ); // free( NULL ) is a noop line_ = readline( prompt_ ); if ( line_ ) { high_ = strlen( line_ ); if ( history_ && high_ ) add_history( line_ ); rd += xsgetn( buf + rd, n - rd ); } } return rd; } virtual int_type underflow() { if ( high_ == low_ ) { low_ = high_ = 0; free( line_ ); // free( NULL ) is a noop line_ = readline( prompt_ ); if ( line_ ) { high_ = strlen( line_ ); if ( history_ && high_ ) add_history( line_ ); } } if ( low_ < high_ ) return line_[low_]; else return eof; } virtual int_type uflow() { int_type c = underflow(); if ( c != eof ) ++low_; return c; } virtual int_type pbackfail( int_type c = eof ) { if ( low_ > 0 ) --low_; else if ( c != eof ) { if ( high_ > 0 ) { char* nl = (char*)realloc( line_, high_ + 1 ); if ( nl ) { line_ = (char*)memcpy( nl + 1, line_, high_ ); high_ += 1; line_[0] = char( c ); } else return eof; } else { assert( !line_ ); line_ = (char*)malloc( sizeof( char ) ); *line_ = char( c ); high_ = 1; } } else return eof; return not_eof; } public: readlinebuf( const char* prompt = NULL, bool history = true ) : prompt_( prompt ), history_( history ), line_( NULL ), low_( 0 ), high_( 0 ) { setbuf( 0, 0 ); } }; #endif readline-8.3/examples/Inputrc000644 000436 000024 00000004472 11130207321 016412 0ustar00chetstaff000000 000000 # My ~/.inputrc file is in -*- text -*- for easy editing with Emacs. # # Notice the various bindings which are conditionalized depending # on which program is running, or what terminal is active. # # Copyright (C) 1989-2009 Free Software Foundation, Inc. # # This program 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 3 of the License, or # (at your option) any later version. # # This program 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 this program. If not, see . # # In all programs, all terminals, make sure this is bound. "\C-x\C-r": re-read-init-file # Hp terminals (and some others) have ugly default behaviour for C-h. "\C-h": backward-delete-char "\e\C-h": backward-kill-word "\C-xd": dump-functions # In xterm windows, make the arrow keys do the right thing. $if TERM=xterm "\e[A": previous-history "\e[B": next-history "\e[C": forward-char "\e[D": backward-char # alternate arrow key prefix "\eOA": previous-history "\eOB": next-history "\eOC": forward-char "\eOD": backward-char # Under Xterm in Bash, we bind local Function keys to do something useful. $if Bash "\e[11~": "Function Key 1" "\e[12~": "Function Key 2" "\e[13~": "Function Key 3" "\e[14~": "Function Key 4" "\e[15~": "Function Key 5" # I know the following escape sequence numbers are 1 greater than # the function key. Don't ask me why, I didn't design the xterm terminal. "\e[17~": "Function Key 6" "\e[18~": "Function Key 7" "\e[19~": "Function Key 8" "\e[20~": "Function Key 9" "\e[21~": "Function Key 10" $endif $endif # For Bash, all terminals, add some Bash specific hacks. $if Bash "\C-xv": show-bash-version "\C-x\C-e": shell-expand-line # Here is one for editing my path. "\C-xp": "$PATH\C-x\C-e\C-e\"\C-aPATH=\":\C-b" # Make C-x r read my mail in emacs. # "\C-xr": "emacs -f rmail\C-j" $endif # For FTP, different hacks: $if Ftp "\C-xg": "get \M-?" "\C-xt": "put \M-?" "\M-.": yank-last-arg $endif " ": self-insert readline-8.3/examples/hist_erasedups.c000644 000436 000024 00000005244 14415536162 020250 0ustar00chetstaff000000 000000 /* hist_erasedups -- remove all duplicate entries from history file */ /* Copyright (C) 2011,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #ifndef READLINE_LIBRARY #define READLINE_LIBRARY 1 #endif #include #include #include #ifdef READLINE_LIBRARY # include "history.h" #else # include #endif #include #define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0) #define STREQN(a, b, n) ((n == 0) ? (1) \ : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)) int hist_erasedups (void); static void usage(void) { fprintf (stderr, "hist_erasedups: usage: hist_erasedups [-t] [filename]\n"); exit (2); } int main (int argc, char **argv) { char *fn; int r; while ((r = getopt (argc, argv, "t")) != -1) { switch (r) { case 't': history_write_timestamps = 1; break; default: usage (); } } argv += optind; argc -= optind; fn = argc ? argv[0] : getenv ("HISTFILE"); if (fn == 0) { fprintf (stderr, "hist_erasedups: no history file\n"); usage (); } if ((r = read_history (fn)) != 0) { fprintf (stderr, "hist_erasedups: read_history: %s: %s\n", fn, strerror (r)); exit (1); } hist_erasedups (); if ((r = write_history (fn)) != 0) { fprintf (stderr, "hist_erasedups: write_history: %s: %s\n", fn, strerror (r)); exit (1); } exit (0); } int hist_erasedups (void) { int r, n; HIST_ENTRY *h, *temp; using_history (); while (h = previous_history ()) { r = where_history (); for (n = 0; n < r; n++) { temp = history_get (n+history_base); if (STREQ (h->line, temp->line)) { remove_history (n); r--; /* have to get one fewer now */ n--; /* compensate for above increment */ history_offset--; /* moving backwards in history list */ } } } using_history (); return r; } readline-8.3/examples/rl-timeout.c000644 000436 000024 00000013774 14415536470 017340 0ustar00chetstaff000000 000000 /* rl-timeout: test various readline builtin timeouts. */ /* Copyright (C) 2021 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 readline. If not, see . */ /* Standard include files. stdio.h is required. */ #include #include #include #include /* Used for select(2) */ #include #include #include #include /* Standard readline include files. */ #if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include # include #endif extern int errno; static void cb_linehandler (char *); int timeout_secs = 1, timeout_usecs = 0; int running; const char *prompt = "rl-timeout$ "; /* **************************************************************** */ /* */ /* Example 1: readline () with rl_readline_state */ /* */ /* **************************************************************** */ void rltest_timeout_readline1 (void) { const char *temp; rl_set_timeout (timeout_secs, timeout_usecs); temp = readline (prompt); if (RL_ISSTATE (RL_STATE_TIMEOUT)) printf ("timeout\n"); else if (temp == NULL) printf ("no input line\n"); else printf ("input line: %s\n", temp); free ((void *) temp); } /* **************************************************************** */ /* */ /* Example 2: readline () with rl_timeout_event_hook */ /* */ /* **************************************************************** */ static int timeout_handler (void) { printf ("timeout\n"); return READERR; } void rltest_timeout_readline2 (void) { const char *temp; rl_set_timeout (timeout_secs, timeout_usecs); rl_timeout_event_hook = timeout_handler; temp = readline (prompt); if (temp == NULL) printf ("no input line\n"); else printf ("input line: %s\n", temp); free ((void *)temp); } /* **************************************************************** */ /* */ /* Example 3: rl_callback_* () with rl_timeout_remaining */ /* */ /* **************************************************************** */ /* Callback function called for each line when accept-line executed, EOF seen, or EOF character read. This sets a flag and returns; it could also call exit(3). */ static void cb_linehandler (char *line) { /* Can use ^D (stty eof) or `exit' to exit. */ if (line == NULL || strcmp (line, "exit") == 0) { if (line == 0) printf ("\n"); printf ("exit\n"); /* This function needs to be called to reset the terminal settings, and calling it from the line handler keeps one extra prompt from being displayed. */ rl_callback_handler_remove (); running = 0; } else { if (*line) add_history (line); printf ("input line: %s\n", line); free (line); } } void rltest_timeout_callback1 (void) { fd_set fds; int r; unsigned sec, usec; rl_set_timeout (timeout_secs, timeout_usecs); rl_callback_handler_install (prompt, cb_linehandler); running = 1; while (running) { FD_ZERO (&fds); FD_SET (fileno (rl_instream), &fds); r = rl_timeout_remaining (&sec, &usec); if (r == 1) { struct timeval timeout = {sec, usec}; r = select (FD_SETSIZE, &fds, NULL, NULL, &timeout); } if (r < 0 && errno != EINTR) { perror ("rl-timeout: select"); rl_callback_handler_remove (); break; } else if (r == 0) { printf ("rl-timeout: timeout\n"); rl_callback_handler_remove (); break; } if (FD_ISSET (fileno (rl_instream), &fds)) rl_callback_read_char (); } printf ("rl-timeout: Event loop has exited\n"); } /* **************************************************************** */ /* */ /* Example 4: rl_callback_* () with rl_timeout_event_hook */ /* */ /* **************************************************************** */ static int cb_timeouthandler (void) { printf ("timeout\n"); rl_callback_handler_remove (); running = 0; return READERR; } void rltest_timeout_callback2 (void) { int r; rl_set_timeout (timeout_secs, timeout_usecs); rl_timeout_event_hook = cb_timeouthandler; rl_callback_handler_install (prompt, cb_linehandler); running = 1; while (running) rl_callback_read_char (); printf ("rl-timeout: Event loop has exited\n"); } int main (int argc, char **argv) { if (argc >= 2) { if (argc >= 3) { double timeout = atof (argv[2]); if (timeout <= 0.0) { fprintf (stderr, "rl-timeout: specify a positive number for timeout.\n"); return 2; } else if (timeout > UINT_MAX) { fprintf (stderr, "rl-timeout: timeout too large.\n"); return 2; } timeout_secs = (unsigned) timeout; timeout_usecs = (unsigned) ((timeout - timeout_secs) * 1000000 + 0.5); } if (strcmp (argv[1], "readline1") == 0) rltest_timeout_readline1 (); else if (strcmp (argv[1], "readline2") == 0) rltest_timeout_readline2 (); else if (strcmp (argv[1], "callback1") == 0) rltest_timeout_callback1 (); else if (strcmp (argv[1], "callback2") == 0) rltest_timeout_callback2 (); else return 2; } else { fprintf (stderr, "usage: rl-timeout [readline1 | readline2 | callback1 | callback2] [timeout]\n"); return 2; } return 0; } readline-8.3/examples/Makefile.in000644 000436 000024 00000015020 14714500371 017113 0ustar00chetstaff000000 000000 # # This is the Makefile for the readline examples subdirectory. # # Copyright (C) 1994,2008,2009 Free Software Foundation, Inc. # This program 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 3 of the License, or # (at your option) any later version. # This program 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 this program. If not, see . RL_LIBRARY_VERSION = @LIBVERSION@ SHELL = @MAKE_SHELL@ RM = rm -f prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ bindir = @bindir@ srcdir = @srcdir@ datadir = @datadir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ #BUILD_DIR = . BUILD_DIR = @BUILD_DIR@ installdir = $(datadir)/readline INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ EXEEXT = @EXEEXT@ OBJEXT = @OBJEXT@ # Support an alternate destination root directory for package building DESTDIR = DEFS = @DEFS@ CC = @CC@ CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DREADLINE_LIBRARY -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' CPPFLAGS = @CPPFLAGS@ INCLUDES = -I$(srcdir) -I$(top_srcdir) -I.. CCFLAGS = $(ASAN_CFLAGS) $(DEFS) $(LOCAL_CFLAGS) $(INCLUDES) $(CPPFLAGS) \ $(CFLAGS) LDFLAGS = -g -L.. @LDFLAGS@ $(ASAN_LDFLAGS) ASAN_XCFLAGS = -fsanitize=address -fno-omit-frame-pointer ASAN_XLDFLAGS = -fsanitize=address READLINE_LIB = ../libreadline.a HISTORY_LIB = ../libhistory.a TERMCAP_LIB = @TERMCAP_LIB@ .c.o: ${RM} $@ $(CC) $(CCFLAGS) -c $< SOURCES = excallback.c fileman.c histexamp.c manexamp.c rl-fgets.c rl.c \ rlbasic.c rlcat.c rlevent.c rlptytest.c rltest.c rlversion.c \ rl-callbacktest.c rl-callbacktest2.c rl-callbacktest3.c \ hist_erasedups.c hist_purgecmd.c \ rlkeymaps.c rl-timeout.c EXECUTABLES = fileman$(EXEEXT) rltest$(EXEEXT) rl$(EXEEXT) rlcat$(EXEEXT) \ rlevent$(EXEEXT) rlversion$(EXEEXT) histexamp$(EXEEXT) \ rl-callbacktest$(EXEEXT) rlbasic$(EXEEXT) \ hist_erasedups$(EXEEXT) hist_purgecmd$(EXEEXT) \ rlkeymaps$(EXEEXT) rl-timeout$(EXEEXT) OBJECTS = fileman.o rltest.o rl.o rlevent.o rlcat.o rlversion.o histexamp.o \ rl-callbacktest.o rlbasic.o hist_erasedups.o hist_purgecmd.o \ rlkeymaps.o rl-timeout.o OTHEREXE = rlptytest$(EXEEXT) OTHEROBJ = rlptytest.o all: $(EXECUTABLES) everything: all asan: ${MAKE} ${MFLAGS} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' all check: rlversion$(EXEEXT) @echo Readline version: `rlversion$(EXEEXT)` installdirs: -$(SHELL) $(top_srcdir)/support/mkdirs $(DESTDIR)$(installdir) install: installdirs @for f in $(SOURCES); do \ $(RM) $(DESTDIR)$(installdir)/$$f ; \ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(installdir) ; \ done uninstall: @for f in $(SOURCES); do \ $(RM) $(DESTDIR)$(installdir)/$$f ; \ done -rmdir $(DESTDIR)$(installdir) rl$(EXEEXT): rl.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rl.o $(READLINE_LIB) $(TERMCAP_LIB) rlbasic$(EXEEXT): rlbasic.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rlbasic.o $(READLINE_LIB) $(TERMCAP_LIB) rlcat$(EXEEXT): rlcat.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rlcat.o $(READLINE_LIB) $(TERMCAP_LIB) rlevent$(EXEEXT): rlevent.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rlevent.o $(READLINE_LIB) $(TERMCAP_LIB) rlkeymaps$(EXEEXT): rlkeymaps.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rlkeymaps.o $(READLINE_LIB) $(TERMCAP_LIB) fileman$(EXEEXT): fileman.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ fileman.o $(READLINE_LIB) $(TERMCAP_LIB) rltest$(EXEEXT): rltest.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rltest.o $(READLINE_LIB) $(TERMCAP_LIB) rltest2$(EXEEXT): rltest2.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rltest2.o $(READLINE_LIB) $(TERMCAP_LIB) rl-callbacktest$(EXEEXT): rl-callbacktest.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rl-callbacktest.o $(READLINE_LIB) $(TERMCAP_LIB) rl-callbacktest2$(EXEEXT): rl-callbacktest2.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rl-callbacktest2.o $(READLINE_LIB) $(TERMCAP_LIB) rl-callbacktest3$(EXEEXT): rl-callbacktest3.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rl-callbacktest3.o $(READLINE_LIB) $(TERMCAP_LIB) rlptytest$(EXEEXT): rlptytest.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rlptytest.o $(READLINE_LIB) $(TERMCAP_LIB) $(LIBUTIL) rl-timeout$(EXEEXT): rl-timeout.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rl-timeout.o $(READLINE_LIB) $(TERMCAP_LIB) rlversion$(EXEEXT): rlversion.o $(READLINE_LIB) $(CC) $(LDFLAGS) -o $@ rlversion.o $(READLINE_LIB) $(TERMCAP_LIB) histexamp$(EXEEXT): histexamp.o $(HISTORY_LIB) $(CC) $(LDFLAGS) -o $@ histexamp.o -lhistory $(TERMCAP_LIB) hist_erasedups$(EXEEXT): hist_erasedups.o $(HISTORY_LIB) $(CC) $(LDFLAGS) -o $@ hist_erasedups.o -lhistory $(TERMCAP_LIB) hist_purgecmd$(EXEEXT): hist_purgecmd.o $(HISTORY_LIB) $(CC) $(LDFLAGS) -o $@ hist_purgecmd.o -lhistory $(TERMCAP_LIB) rlfe: force ( rlfe_srcdir=${srcdir}/rlfe ; \ if test -d rlfe; then :; else mkdir rlfe; fi; \ cd rlfe && $(SHELL) $$rlfe_srcdir/configure -C && ${MAKE} ) force: .PHONY: clean maintainer-clean distclean mostlyclean mostlyclean: $(RM) $(OBJECTS) $(OTHEROBJ) $(RM) $(EXECUTABLES) $(OTHEREXE) *.exe -( cd rlfe && ${MAKE} $@ ) clean: mostlyclean -( cd rlfe && ${MAKE} $@ ) distclean maintainer-clean: clean $(RM) Makefile -( cd rlfe && ${MAKE} $@ ) fileman.o: fileman.c manexamp.o: manexamp.c rltest.o: rltest.c rltest2.o: rltest2.c rl.o: rl.c rlversion.o: rlversion.c histexamp.o: histexamp.c hist_erasedups.o: hist_erasedups.c hist_purgecmd.o: hist_purgecmd.c rlbasic.o: rlbasic.c rlkeymaps.o: rlkeymaps.c rlcat.o: rlcat.c rlptytest.o: rlptytest.c rl-callbacktest.o: rl-callbacktest.c rl-timeout.o: rl-timeout.c fileman.o: $(top_srcdir)/readline.h manexamp.o: $(top_srcdir)/readline.h rltest.o: $(top_srcdir)/readline.h rltest2.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h rl.o: $(top_srcdir)/readline.h rlversion.o: $(top_srcdir)/readline.h histexamp.o: $(top_srcdir)/history.h hist_erasedups.o: $(top_srcdir)/history.h hist_purgecmd.o: $(top_srcdir)/history.h rlbasic.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h rlcat.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h rlptytest.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h rl-callbacktest.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h rl-timeout.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h readline-8.3/examples/rltest.c000644 000436 000024 00000004277 14415537030 016543 0ustar00chetstaff000000 000000 /* **************************************************************** */ /* */ /* Testing Readline */ /* */ /* **************************************************************** */ /* Copyright (C) 1987-2009,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if defined (HAVE_CONFIG_H) #include #endif #include #include #ifdef HAVE_STDLIB_H # include #else extern void exit(); #endif #ifdef HAVE_LOCALE_H # include #endif #ifdef READLINE_LIBRARY # include "readline.h" # include "history.h" #else # include # include #endif int main (int c, char **v) { char *temp, *prompt; int done; #ifdef HAVE_SETLOCALE setlocale (LC_ALL, ""); #endif temp = (char *)NULL; prompt = "readline$ "; done = 0; while (!done) { temp = readline (prompt); /* Test for EOF. */ if (!temp) exit (1); /* If there is anything on the line, print it and remember it. */ if (*temp) { fprintf (stderr, "%s\r\n", temp); add_history (temp); } /* Check for `command' that we handle. */ if (strcmp (temp, "quit") == 0) done = 1; if (strcmp (temp, "list") == 0) { HIST_ENTRY **list; register int i; list = history_list (); if (list) { for (i = 0; list[i]; i++) fprintf (stderr, "%d: %s\r\n", i, list[i]->line); } } free (temp); } exit (0); } readline-8.3/examples/autoconf/000755 000436 000024 00000000000 15030514140 016655 5ustar00chetstaff000000 000000 readline-8.3/examples/rl-test-timeout000644 000436 000024 00000000157 14022444677 020064 0ustar00chetstaff000000 000000 ./rl-timeout readline1 0.5 ./rl-timeout readline2 0.25 ./rl-timeout callback1 0.5 ./rl-timeout callback2 0.5 readline-8.3/examples/manexamp.c000644 000436 000024 00000007166 14636624160 017042 0ustar00chetstaff000000 000000 /* manexamp.c -- The examples which appear in the documentation are here. */ /* Copyright (C) 1987-2009,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if defined (HAVE_CONFIG_H) # include #endif #ifdef HAVE_UNISTD_H # include #endif #include #include #include #include #include #include #ifndef errno extern int errno; #endif #if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include # include #endif /* **************************************************************** */ /* */ /* How to Emulate gets () */ /* */ /* **************************************************************** */ /* A static variable for holding the line. */ static char *line_read = (char *)NULL; /* Read a string, and return a pointer to it. Returns NULL on EOF. */ char * rl_gets (void) { /* If the buffer has already been allocated, return the memory to the free pool. */ if (line_read) { free (line_read); line_read = (char *)NULL; } /* Get a line from the user. */ line_read = readline (""); /* If the line has any text in it, save it on the history. */ if (line_read && *line_read) add_history (line_read); return (line_read); } /* **************************************************************** */ /* */ /* Writing a Function to be Called by Readline. */ /* */ /* **************************************************************** */ /* Invert the case of the COUNT following characters. */ int invert_case_line (int count, int key) { int start, end; int direction; start = rl_point; /* Find the end of the range to modify. */ end = start + count; /* Force it to be within range. */ if (end > rl_end) end = rl_end; else if (end < 0) end = -1; if (start == end) return 0; /* For positive arguments, put point after the last changed character. For negative arguments, put point before the last changed character. */ rl_point = end; /* Swap start and end if we are moving backwards */ if (start > end) { int temp = start; start = end; end = temp; } /* Tell readline that we are modifying the line, so save the undo information. */ rl_modifying (start, end); for (; start != end; start++) { if (_rl_uppercase_p (rl_line_buffer[start])) rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]); else if (_rl_lowercase_p (rl_line_buffer[start])) rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]); } return 0; } readline-8.3/examples/rlfe/000755 000436 000024 00000000000 15030514141 015770 5ustar00chetstaff000000 000000 readline-8.3/examples/rlversion.c000644 000436 000024 00000002413 12560672072 017244 0ustar00chetstaff000000 000000 /* * rlversion -- print out readline's version number */ /* Copyright (C) 1987-2009 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if defined (HAVE_CONFIG_H) # include #endif #include #include #include "posixstat.h" #ifdef HAVE_STDLIB_H # include #else extern void exit(); #endif #ifdef READLINE_LIBRARY # include "readline.h" #else # include #endif int main() { printf ("%s\n", rl_library_version ? rl_library_version : "unknown"); exit (0); } readline-8.3/examples/rl.c000644 000436 000024 00000006217 14415535427 015647 0ustar00chetstaff000000 000000 /* * rl - command-line interface to read a line from the standard input * (or another fd) using readline. * * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] */ /* Copyright (C) 1987-2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if defined (HAVE_CONFIG_H) # include #endif #include #include #include #ifdef HAVE_STDLIB_H # include #else extern void exit(); #endif #ifdef HAVE_LOCALE_H # include #endif #if defined (READLINE_LIBRARY) # include "posixstat.h" # include "readline.h" # include "history.h" #else # include # include # include #endif extern int optind; extern char *optarg; static char *progname; static char *deftext; static int set_deftext (void) { if (deftext) { rl_insert_text (deftext); deftext = (char *)NULL; rl_startup_hook = (rl_hook_func_t *)NULL; } return 0; } static void usage(void) { fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", progname, progname); } int main (int argc, char **argv) { char *temp, *prompt; struct stat sb; int opt, fd, nch; FILE *ifp; progname = strrchr(argv[0], '/'); if (progname == 0) progname = argv[0]; else progname++; #ifdef HAVE_SETLOCALE setlocale (LC_ALL, ""); #endif /* defaults */ prompt = "readline$ "; fd = nch = 0; deftext = (char *)0; while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF) { switch (opt) { case 'p': prompt = optarg; break; case 'u': fd = atoi(optarg); if (fd < 0) { fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg); exit (2); } break; case 'd': deftext = optarg; break; case 'n': nch = atoi(optarg); if (nch < 0) { fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg); exit (2); } break; default: usage (); exit (2); } } if (fd != 0) { if (fstat (fd, &sb) < 0) { fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd); exit (1); } ifp = fdopen (fd, "r"); rl_instream = ifp; } if (deftext && *deftext) rl_startup_hook = set_deftext; if (nch > 0) rl_num_chars_to_read = nch; temp = readline (prompt); /* Test for EOF. */ if (temp == 0) exit (1); printf ("%s\n", temp); exit (0); } readline-8.3/examples/hist_purgecmd.c000644 000436 000024 00000006405 14415536122 020057 0ustar00chetstaff000000 000000 /* hist_purgecmd -- remove all instances of command or pattern from history file */ /* Copyright (C) 2011,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #ifndef READLINE_LIBRARY #define READLINE_LIBRARY 1 #endif #include #include #include #include #ifdef READLINE_LIBRARY # include "history.h" #else # include #endif #include #define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0) #define STREQN(a, b, n) ((n == 0) ? (1) \ : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)) #define PURGE_REGEXP 0x01 int hist_purgecmd (char *, int); static void usage(void) { fprintf (stderr, "hist_purgecmd: usage: hist_purgecmd [-r] [-t] [-f filename] command-spec\n"); exit (2); } int main (int argc, char **argv) { char *fn; int r, flags; flags = 0; fn = 0; while ((r = getopt (argc, argv, "f:rt")) != -1) { switch (r) { case 'f': fn = optarg; break; case 'r': flags |= PURGE_REGEXP; break; case 't': history_write_timestamps = 1; break; default: usage (); } } argv += optind; argc -= optind; if (fn == 0) fn = getenv ("HISTFILE"); if (fn == 0) { fprintf (stderr, "hist_purgecmd: no history file\n"); usage (); } if ((r = read_history (fn)) != 0) { fprintf (stderr, "hist_purgecmd: read_history: %s: %s\n", fn, strerror (r)); exit (1); } for (r = 0; r < argc; r++) hist_purgecmd (argv[r], flags); if ((r = write_history (fn)) != 0) { fprintf (stderr, "hist_purgecmd: write_history: %s: %s\n", fn, strerror (r)); exit (1); } exit (0); } int hist_purgecmd (char *cmd, int flags) { int r, n, rflags; HIST_ENTRY *temp; regex_t regex = { 0 }; if (flags & PURGE_REGEXP) { rflags = REG_EXTENDED|REG_NOSUB; if (regcomp (®ex, cmd, rflags)) { fprintf (stderr, "hist_purgecmd: %s: invalid regular expression\n", cmd); return -1; } } r = 0; using_history (); r = where_history (); for (n = 0; n < r; n++) { temp = history_get (n+history_base); if (((flags & PURGE_REGEXP) && (regexec (®ex, temp->line, 0, 0, 0) == 0)) || ((flags & PURGE_REGEXP) == 0 && STREQ (temp->line, cmd))) { remove_history (n); r--; /* have to get one fewer now */ n--; /* compensate for above increment */ history_offset--; /* moving backwards in history list */ } } using_history (); if (flags & PURGE_REGEXP) regfree (®ex); return r; } readline-8.3/examples/rl-callbacktest3.c000644 000436 000024 00000006434 14773762714 020375 0ustar00chetstaff000000 000000 /* Standard include files. stdio.h is required. */ #include #include #include #include #include /* Used for select(2) */ #include #include #include #include /* Standard readline include files. */ #include "readline.h" #include "history.h" static void cb_linehandler (char *); static void sigwinch_handler (int); static void sigint_handler (int); int running; int sigwinch_received; int sigint_received; const char *prompt = "rltest$ "; /* Handle SIGWINCH and window size changes when readline is not active and reading a character. */ static void sigwinch_handler (int sig) { sigwinch_received = 1; } /* Handle SIGWINCH and window size changes when readline is not active and reading a character. */ static void sigint_handler (int sig) { sigint_received = 1; } /* Callback function called for each line when accept-line executed, EOF seen, or EOF character read. This sets a flag and returns; it could also call exit(3). */ static void cb_linehandler (char *line) { /* Can use ^D (stty eof) or `exit' to exit. */ if (line == NULL || strcmp (line, "exit") == 0) { if (line == 0) printf ("\n"); printf ("exit\n"); /* This function needs to be called to reset the terminal settings, and calling it from the line handler keeps one extra prompt from being displayed. */ rl_callback_handler_remove (); running = 0; } else { if (*line) add_history (line); printf ("input line: %s\n", line); free (line); } } /* replace with something more complex if desired */ static int my_getc (FILE *stream) { int ch = rl_getc (stream); return ch; } int main (int c, char **v) { fd_set fds; int r; /* Set the default locale values according to environment variables. */ setlocale (LC_ALL, ""); /* Handle window size changes when readline is not active and reading characters. */ #ifdef SIGWINCH signal (SIGWINCH, sigwinch_handler); #endif signal (SIGINT, sigint_handler); rl_getc_function = my_getc; /* Install the line handler. */ rl_callback_handler_install (prompt, cb_linehandler); /* Enter a simple event loop. This waits until something is available to read on readline's input stream (defaults to standard input) and calls the builtin character read callback to read it. It does not have to modify the user's terminal settings. */ running = 1; while (running) { FD_ZERO (&fds); FD_SET (fileno (rl_instream), &fds); r = select (FD_SETSIZE, &fds, NULL, NULL, NULL); if (r < 0 && errno != EINTR) { perror ("rltest: select"); rl_callback_handler_remove (); break; } if (sigwinch_received) { rl_resize_terminal (); sigwinch_received = 0; } if (sigint_received) { printf ("Quit\n"); rl_callback_handler_remove (); rl_callback_handler_install (prompt, cb_linehandler); sigint_received = 0; continue; } if (r < 0) continue; if (FD_ISSET (fileno (rl_instream), &fds)) rl_callback_read_char (); } printf ("rltest: Event loop has exited\n"); return 0; } readline-8.3/examples/rl-callbacktest2.c000644 000436 000024 00000006264 14640035412 020352 0ustar00chetstaff000000 000000 /* Standard include files. stdio.h is required. */ #include #include #include /* Used for select(2) */ #include #include #include #include #include #include /* Standard readline include files. */ #if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include # include #endif #if !defined (errno) extern int errno; #endif static void cb_linehandler (char *); static void sigint_sighandler (int); static int sigint_handler (int); static int saw_signal = 0; int running; const char *prompt = "rltest$ "; char *input_string; /* Callback function called for each line when accept-line executed, EOF seen, or EOF character read. This sets a flag and returns; it could also call exit(3). */ static void cb_linehandler (char *line) { if (line && *line) add_history (line); printf ("input line: %s\n", line ? line : ""); input_string = line; rl_callback_handler_remove (); } static char * cb_readline (void) { fd_set fds; int r, err; char *not_done = ""; /* Install the line handler. */ rl_callback_handler_install (prompt, cb_linehandler); if (RL_ISSTATE (RL_STATE_ISEARCH)) fprintf(stderr, "cb_readline: after handler install, state (ISEARCH) = %lu", rl_readline_state); else if (RL_ISSTATE (RL_STATE_NSEARCH)) fprintf(stderr, "cb_readline: after handler install, state (NSEARCH) = %lu", rl_readline_state); /* MULTIKEY VIMOTION NUMERICARG _rl_callback_func */ FD_ZERO (&fds); FD_SET (fileno (rl_instream), &fds); input_string = not_done; while (input_string == not_done) { r = err = 0; /* Enter a simple event loop. This waits until something is available to read on readline's input stream (defaults to standard input) and calls the builtin character read callback to read it. It does not have to modify the user's terminal settings. */ while (r == 0) { struct timeval timeout = {0, 100000}; struct timeval *timeoutp = NULL; timeoutp = &timeout; FD_SET (fileno (rl_instream), &fds); r = select (FD_SETSIZE, &fds, NULL, NULL, timeoutp); err = errno; } if (saw_signal) sigint_handler (saw_signal); if (r < 0) { perror ("rltest: select"); rl_callback_handler_remove (); break; } /* if (FD_ISSET (fileno (rl_instream), &fds)) */ if (r > 0) rl_callback_read_char (); } return input_string; } void sigint_sighandler (int s) { saw_signal = s; } int sigint_handler (int s) { rl_free_line_state (); rl_callback_sigcleanup (); rl_cleanup_after_signal (); rl_callback_handler_remove (); saw_signal = 0; return s; } int main (int c, char **v) { char *p; setlocale (LC_ALL, ""); running = 1; rl_catch_signals = 1; rl_bind_key_in_map ('r', rl_history_search_backward, emacs_meta_keymap); rl_bind_key_in_map ('s', rl_history_search_forward, emacs_meta_keymap); signal (SIGINT, sigint_sighandler); while (running) { p = cb_readline (); if (p == 0 || strcmp (p, "exit") == 0) break; } printf ("rl-callbacktest2: Event loop has exited\n"); return 0; } readline-8.3/examples/rlevent.c000644 000436 000024 00000006642 14415536700 016706 0ustar00chetstaff000000 000000 /* * rl - command-line interface to read a line from the standard input * (or another fd) using readline. * * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] */ /* Copyright (C) 1987-2009 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #if defined (HAVE_CONFIG_H) # include #endif #ifdef HAVE_UNISTD_H # include #else extern int getopt(); extern int sleep(); #endif #include #include #ifdef HAVE_STDLIB_H # include #else extern void exit(); #endif #ifdef HAVE_LOCALE_H # include #endif #if defined (READLINE_LIBRARY) # include "posixstat.h" # include "readline.h" # include "history.h" #else # include # include # include #endif extern int optind; extern char *optarg; #if !defined (strchr) && !defined (__STDC__) extern char *strrchr(); #endif static char *progname; static char *deftext; static int event_hook (void) { fprintf (stderr, "ding!\n"); sleep (1); return 0; } static int set_deftext (void) { if (deftext) { rl_insert_text (deftext); deftext = (char *)NULL; rl_startup_hook = (rl_hook_func_t *)NULL; } return 0; } static void usage(void) { fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", progname, progname); } int main (int argc, char **argv) { char *temp, *prompt; struct stat sb; int opt, fd, nch; FILE *ifp; #ifdef HAVE_SETLOCALE setlocale (LC_ALL, ""); #endif progname = strrchr(argv[0], '/'); if (progname == 0) progname = argv[0]; else progname++; /* defaults */ prompt = "readline$ "; fd = nch = 0; deftext = (char *)0; while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF) { switch (opt) { case 'p': prompt = optarg; break; case 'u': fd = atoi(optarg); if (fd < 0) { fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg); exit (2); } break; case 'd': deftext = optarg; break; case 'n': nch = atoi(optarg); if (nch < 0) { fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg); exit (2); } break; default: usage (); exit (2); } } if (fd != 0) { if (fstat (fd, &sb) < 0) { fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd); exit (1); } ifp = fdopen (fd, "r"); rl_instream = ifp; } if (deftext && *deftext) rl_startup_hook = set_deftext; if (nch > 0) rl_num_chars_to_read = nch; rl_event_hook = event_hook; temp = readline (prompt); /* Test for EOF. */ if (temp == 0) exit (1); printf ("%s\n", temp); exit (0); } readline-8.3/examples/fileman.c000644 000436 000024 00000026234 14450556734 016651 0ustar00chetstaff000000 000000 /* fileman.c - file manager example for readline library. */ /* Copyright (C) 1987-2009,2023 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ /* fileman.c -- A tiny application which demonstrates how to use the GNU Readline library. This application interactively allows users to manipulate files and their modes. */ #ifdef HAVE_CONFIG_H # include #endif #include #ifdef HAVE_SYS_FILE_H # include #endif #include #ifdef HAVE_UNISTD_H # include #endif #include #include #include #if defined (HAVE_STRING_H) # include #else /* !HAVE_STRING_H */ # include #endif /* !HAVE_STRING_H */ #ifdef HAVE_STDLIB_H # include #endif #include #ifdef READLINE_LIBRARY # include "readline.h" # include "history.h" #else # include # include #endif extern char *xmalloc (size_t); void initialize_readline (void); void too_dangerous (char *); int execute_line (char *); int valid_argument (char *, char *); /* The names of functions that actually do the manipulation. */ int com_list (char *); int com_view (char *); int com_rename (char *); int com_stat (char *); int com_pwd (char *); int com_delete (char *); int com_help (char *); int com_cd (char *); int com_quit (char *); /* A structure which contains information on the commands this program can understand. */ typedef struct { char *name; /* User printable name of the function. */ rl_icpfunc_t *func; /* Function to call to do the job. */ char *doc; /* Documentation for this function. */ } COMMAND; COMMAND commands[] = { { "cd", com_cd, "Change to directory DIR" }, { "delete", com_delete, "Delete FILE" }, { "help", com_help, "Display this text" }, { "?", com_help, "Synonym for `help'" }, { "list", com_list, "List files in DIR" }, { "ls", com_list, "Synonym for `list'" }, { "pwd", com_pwd, "Print the current working directory" }, { "quit", com_quit, "Quit using Fileman" }, { "rename", com_rename, "Rename FILE to NEWNAME" }, { "stat", com_stat, "Print out statistics on FILE" }, { "view", com_view, "View the contents of FILE" }, { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } }; /* Forward declarations. */ char *dupstr (char *); int execute_line (char *); char *stripwhite (char *); COMMAND *find_command (char *); /* The name of this program, as taken from argv[0]. */ char *progname; /* When non-zero, this global means the user is done using this program. */ int done; char * dupstr (char *s) { char *r; r = xmalloc (strlen (s) + 1); strcpy (r, s); return (r); } /* Execute a command line. */ int execute_line (char *line) { register int i; COMMAND *command; char *word; /* Isolate the command word. */ i = 0; while (line[i] && whitespace (line[i])) i++; word = line + i; while (line[i] && !whitespace (line[i])) i++; if (line[i]) line[i++] = '\0'; command = find_command (word); if (!command) { fprintf (stderr, "%s: No such command for FileMan.\n", word); return (-1); } /* Get argument to command, if any. */ while (whitespace (line[i])) i++; word = line + i; /* Call the function. */ return ((*(command->func)) (word)); } /* Look up NAME as the name of a command, and return a pointer to that command. Return a NULL pointer if NAME isn't a command name. */ COMMAND * find_command (char *name) { register int i; for (i = 0; commands[i].name; i++) if (strcmp (name, commands[i].name) == 0) return (&commands[i]); return ((COMMAND *)NULL); } /* Strip whitespace from the start and end of STRING. Return a pointer into STRING. */ char * stripwhite (char *string) { register char *s, *t; for (s = string; whitespace (*s); s++) ; if (*s == 0) return (s); t = s + strlen (s) - 1; while (t > s && whitespace (*t)) t--; *++t = '\0'; return s; } /* **************************************************************** */ /* */ /* Interface to Readline Completion */ /* */ /* **************************************************************** */ char *command_generator (const char *, int); char **fileman_completion (const char *, int, int); /* Tell the GNU Readline library how to complete. We want to try to complete on command names if this is the first word in the line, or on filenames if not. */ void initialize_readline (void) { /* Allow conditional parsing of the ~/.inputrc file. */ rl_readline_name = "FileMan"; /* Tell the completer that we want a crack first. */ rl_attempted_completion_function = fileman_completion; } /* Attempt to complete on the contents of TEXT. START and END bound the region of rl_line_buffer that contains the word to complete. TEXT is the word to complete. We can use the entire contents of rl_line_buffer in case we want to do some simple parsing. Return the array of matches, or NULL if there aren't any. */ char ** fileman_completion (const char *text, int start, int end) { char **matches; matches = (char **)NULL; /* If this word is at the start of the line, then it is a command to complete. Otherwise it is the name of a file in the current directory. */ if (start == 0) matches = rl_completion_matches (text, command_generator); return (matches); } /* Generator function for command completion. STATE lets us know whether to start from scratch; without any state (i.e. STATE == 0), then we start at the top of the list. */ char * command_generator (const char *text, int state) { static int list_index, len; char *name; /* If this is a new word to complete, initialize now. This includes saving the length of TEXT for efficiency, and initializing the index variable to 0. */ if (!state) { list_index = 0; len = strlen (text); } /* Return the next name which partially matches from the command list. */ while (name = commands[list_index].name) { list_index++; if (strncmp (name, text, len) == 0) return (dupstr(name)); } /* If no names matched, then return NULL. */ return ((char *)NULL); } /* **************************************************************** */ /* */ /* FileMan Commands */ /* */ /* **************************************************************** */ /* String to pass to system (). This is for the LIST, VIEW and RENAME commands. */ static char syscom[1024]; /* List the file(s) named in arg. */ int com_list (char *arg) { if (!arg) arg = ""; snprintf (syscom, sizeof (syscom), "ls -FClg %s", arg); return (system (syscom)); } int com_view (char *arg) { if (!valid_argument ("view", arg)) return 1; #if defined (__MSDOS__) /* more.com doesn't grok slashes in pathnames */ snprintf (syscom, sizeof (syscom), "less %s", arg); #else snprintf (syscom, sizeof (syscom), "more %s", arg); #endif return (system (syscom)); } int com_rename (char *arg) { too_dangerous ("rename"); return (1); } int com_stat (char *arg) { struct stat finfo; if (!valid_argument ("stat", arg)) return (1); if (stat (arg, &finfo) == -1) { perror (arg); return (1); } printf ("Statistics for `%s':\n", arg); printf ("%s has %d link%s, and is %lu byte%s in length.\n", arg, finfo.st_nlink, (finfo.st_nlink == 1) ? "" : "s", (unsigned long)finfo.st_size, (finfo.st_size == 1) ? "" : "s"); printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); printf (" Last access at: %s", ctime (&finfo.st_atime)); printf (" Last modified at: %s", ctime (&finfo.st_mtime)); return (0); } int com_delete (char *arg) { too_dangerous ("delete"); return (1); } /* Print out help for ARG, or for all of the commands if ARG is not present. */ int com_help (char *arg) { register int i; int printed = 0; for (i = 0; commands[i].name; i++) { if (!*arg || (strcmp (arg, commands[i].name) == 0)) { printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); printed++; } } if (!printed) { printf ("No commands match `%s'. Possibilities are:\n", arg); for (i = 0; commands[i].name; i++) { /* Print in six columns. */ if (printed == 6) { printed = 0; printf ("\n"); } printf ("%s\t", commands[i].name); printed++; } if (printed) printf ("\n"); } return (0); } /* Change to the directory ARG. */ int com_cd (char *arg) { if (chdir (arg) == -1) { perror (arg); return 1; } com_pwd (""); return (0); } /* Print out the current working directory. */ int com_pwd (char *ignore) { char dir[1024], *s; s = getcwd (dir, sizeof(dir) - 1); if (s == 0) { printf ("Error getting pwd: %s\n", dir); return 1; } printf ("Current directory is %s\n", dir); return 0; } /* The user wishes to quit using this program. Just set DONE non-zero. */ int com_quit (char *arg) { done = 1; return (0); } /* Function which tells you that you can't do this. */ void too_dangerous (char *caller) { fprintf (stderr, "%s: Too dangerous for me to distribute. Write it yourself.\n", caller); } /* Return non-zero if ARG is a valid argument for CALLER, else print an error message and return zero. */ int valid_argument (char *caller, char *arg) { if (!arg || !*arg) { fprintf (stderr, "%s: Argument required.\n", caller); return (0); } return (1); } int main (int argc, char **argv) { char *line, *s; progname = argv[0]; initialize_readline (); /* Bind our completer. */ /* Loop reading and executing lines until the user quits. */ for ( ; done == 0; ) { line = readline ("FileMan: "); if (!line) break; /* Remove leading and trailing whitespace from the line. Then, if there is anything left, add it to the history list and execute it. */ s = stripwhite (line); if (*s) { add_history (s); execute_line (s); } free (line); } exit (0); } readline-8.3/examples/histexamp.c000644 000436 000024 00000005633 14637525272 017240 0ustar00chetstaff000000 000000 /* histexamp.c - history library example program. */ /* Copyright (C) 1987-2009 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline 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 3 of the License, or (at your option) any later version. Readline 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 Readline. If not, see . */ #include #ifdef READLINE_LIBRARY # include "history.h" #else # include #endif #include #include #include int main (int argc, char **argv) { char line[1024], *t; int len, done; line[0] = 0; done = 0; using_history (); while (!done) { printf ("history$ "); fflush (stdout); t = fgets (line, sizeof (line) - 1, stdin); if (t && *t) { len = strlen (t); if (t[len - 1] == '\n') t[len - 1] = '\0'; } if (!t) strcpy (line, "quit"); if (line[0]) { char *expansion; int result; using_history (); result = history_expand (line, &expansion); if (result) fprintf (stderr, "%s\n", expansion); if (result < 0 || result == 2) { free (expansion); continue; } add_history (expansion); strncpy (line, expansion, sizeof (line) - 1); free (expansion); } if (strcmp (line, "quit") == 0) done = 1; else if (strcmp (line, "save") == 0) write_history ("history_file"); else if (strcmp (line, "read") == 0) read_history ("history_file"); else if (strcmp (line, "list") == 0) { register HIST_ENTRY **the_list; register int i; time_t tt; struct tm *tm; char timestr[128]; the_list = history_list (); if (the_list) for (i = 0; the_list[i]; i++) { tt = history_get_time (the_list[i]); tm = tt ? localtime (&tt) : 0; if (tm) strftime (timestr, sizeof (timestr), "%a %R", tm); else strcpy (timestr, "??"); printf ("%d: %s: %s\n", i + history_base, timestr, the_list[i]->line); } } else if (strncmp (line, "delete", 6) == 0) { int which; if ((sscanf (line + 6, "%d", &which)) == 1) { HIST_ENTRY *entry = remove_history (which - history_base); if (!entry) fprintf (stderr, "No such entry %d\n", which); else { free (entry->line); free (entry); } } else { fprintf (stderr, "non-numeric arg given to `delete'\n"); } } } } readline-8.3/examples/rlwrap-0.46.1.tar.gz000644 000436 000024 00000551442 14617416320 020247 0ustar00chetstaff000000 000000 ‹ì[msÛ8’Î×AÝÀú‹­)I‰ü–—™ÝZ'qïMâœí\v«®*‘Ä1IpÒŠöêþû=Ý P”l'[wÙÙºÛQÕL,l4ÝO?Ý€+óùÓxð«ñŸ|ÿßšk;Ër«âã¬T&É]bòqq¨L۸ⰱãÄ$ ûP%®œeóñ¢ûƇŸs7?¨Më÷¶¶*uÉÃn®þzŸ¾‹û'ý/…)Æ4¶öë—·A|<ü~ìøßqj+ÿìÞé‰ãeM‹j´˜¨Æ¹ïEñüøTÅÿÓ¬woüŸ|¸zs~qù-æøJüê·ãÿxÿèÑoñÿ+|^,l£/LaWúÇ„~6®Ü8YÖíØ¦íži ÀÂÕÚÍt³°Úæ¯Y9×5Š…<+­Vy6­M½jS»¶Lõr‘% -Þ¤3¯§-„âݬÔô« á¤Ô¸þ©êÎÿþ8/L–AFŸéÂù&N%.µCm?'¶jôÌÕÏ”éªY5Íjœ õ’æ\¯Dy©«Ú$MËWº-L2·©žÕ®Ðõç›Fi½—´u Ö‹˜·lðFLWúµu³™~1Öi™úÇy²ü#½3võüƒ!^mÜÜB³“6 Ö1qå+W¦ôNejÖ¾¿±IH[,­Êm“¹rœ+aÍìe¥6æ&¹ÖMm­Îh0ñrCoÀtYÓØÓCÇ—¦ÈL©Ïnlm³ùBï±&$¬Î`nŒ÷4L?‡)>:—š:êÓ:Kô国* )$ìÖ[Ó`k`¸“2Å´¥þ„ÙÎsïñÏÞÏøâÆ~¶éØÛÁz«2 <º;½´øî°ÑméÍ xÛÔ Þ£ èÇj¥i/<ö=ó¦tÓVŸ_·©§Õ$‰V¿·U¡á'9!ms«÷HÑe[Lm­`ZûÙytëéP­à§å'í«‰÷ì¾±¢='Ûε*Ú¼ÉF¼W"EÖ{3·îyá0Q£ÿµvvŽ'}qäˆ4ݵµvŠökÃS+S u¥»^-]}MÓ¥Ym“ÆÕäŽ(²õù¥þ³RiëL§»§yf6æŸÂKr)×üªLÖÙ‰ò› ƒñÛ2®+¢ìÈ zî1x¦ëK‡ìŸ9½n«”¶f¯µúϨíP—H£Þúÿm¨‚ìc]<^ÒT Ð,ìï”RßëשÃÕÙ,ºGê¬/wØ€±©ƒ®+Vk¨)…'kj»^~¸´óóÚЖT[±,50ȲÔld›¢œ-aöžð˜^½7ÉGqI%¾)¾V€MDýZxÿ-‘ŽÈ Öà[dó …'Õ1AVóØuÚGDžZäÖ3vKBÕY›\g¥Ií/­IV¼iKk®5HF«©+ÚW²°wbˆ¸NLHe^Í×¹ÎÍz¹)šj"f'É3¸æÎ@ƒÒÀùéý™e²¢,+Jû¨B‘ãxø¹-“ÕXësb<ä û4ël3—Õå+Žų•D(×…[”ŠÔÏ”¥kd9–UãÅ ’äérrb~ˆ[sEuòîò Ïs¨6 º„‰ü’<äâ¿,aÿ‡›—M–‹—“cC#“Š(¸s[¦#7Ñþ« ¥ËiÿþíÝŸŸi8Ân‡†»ç{½sî*ÿ;ý¼[»Ý.³Ó´ÑÀ€KEKÌHèÀƒ°p¯¸f™Mwˆœ©“/Nß_}:{÷êôâìüâÓÅÛOï/Î__œ¼ýýjƒY’ô4 š“ŠÆäßÂCýŠ0po ÷:°{=æaP’¸\RÙϰ4yZˆ}¶[°Ii3€…§”°p˵@ÙB¬%›ã5á×V]]^½‡4ýñìÝ‹7Bõvä‚4ÔͲtM—¨SH×ÎÍsfGãñx .ìÈgaÝù?m0­™—ˆ–´vYº09r£ÔÊKPm¹nO„Ì]‹ãÂß´Ç–ä)Å‚CZˆl|oIHЍnÚºø…zâ­HS‹§&ˆÐjÈÓÉåóUÀ…ÏŠ¼6—HÁ’#|;E5 …ßÓª¦¥3(Õ.9«½W==á7Þ¦H&²â.Ýü¨ŸŒ÷;´5 ‚¶l:¦9CøˆQêüSjÁ3«OÑ¢{Ƕ©Ú†veç?ê­5ϲþ”Ø0L™‚Vcÿ8!•ãÆ?êGãÃãñ„nQ'4!èi¶!—‰ 7d~ñÜ"ó£ªâ(h‰XÆxìe `¬h0ÍL²&©d».‹b…aÚQ˜´„~üMŠúïu§ªU¿ æš(¨iM °ü{œý#?÷òÿçïÿröîõ·˜ãËüÿð`2¹Õÿ?Þß?üÿÿ Ÿï¾Cë×ï>è×§ïN/N~Òï?<ÿéì…Æ§ï.O• ÀçßÞê?µ‹ÉÓ§¥ô W­êl¾d½à—Ožù‘~E]ŒK7k–DÚ^QoÈ :+“±b™GOõ•åJþ}n0‡KÁƒƒGCýy—F¿=ÑúÑþd2M=ÖúÃå‰Ò§á;aLEðÔ0ýAn‚:L—:®n5ÆN1uA3ë•ìåŸ@í’–(º ·‹(›× ²ÍHxniS“ïÄï ДK‚$Ï€Æí+WNÿ¥–RžhH*m¨A¹[Ôoïmx‰Z{É®ïY°äÕPMç89Gö´\8’Ì JϽJÅNµ^¶*í]R%¯Ýç‘‹K(¿s+PEcÿ8Ð=+Ák+ÆM 5ZìJ‹2lúH±ƒÎÉk¨ð§'^g¸…ÄVš éi„Thëš¹‹8$ŸD̓ù‰wCüÝšù[¾×ßS¤x¨¦˜¨pæ_{G/v$dné'<èöœ]Aq<Á nˆKg3fØËÌ/˜sËTÔ;°UǰHø¼ˆ †òæRñE8-¾ö^¥1ÁS7¼¯½ƒŽ‰hIBJîø±¾Ñî?„º7ˆ»&:åJµæc Ì»såèÕ†˜ï#œç]áb%Ú²¶d©D,Ƙf)XÃÓ–êa‘DŠ“KûkyähWjË¥ —¶ŒTZá[“ñŠ3ôÌBσܫçYð?xGVQ5êWÖV`»R1©K”ñ»[îL˜lعZϽ¨ÞíyäœÀ%:=“#ê„Ñ,6÷’ ÀÙ=8”¤Ÿ háûD zÙ2jFçª,ätšÑaK¨²bY%™ÐGä\Z»´MD N"Ò®d€æœ¶Þ•²TÈG»ÔulåøFÜå=Îé¤ “ôá‰TjÜ-ùø $[ÒÙ¯>$ÇŠ7”g?ZÆVF—Iß'%t¬Cíf;w Ìˆà4bô.sÒ"27YÚr7ÆMHd’ŽÏ âQÞÁ7޶Pcwbð/Òƒ¦ƒ&|‚ÜÛÌÎÃ/LJdF'9Š(í$á7í8”…ѵvÝ ”ǯÉîÝ8ÃÄl9XEûßEn8¢¶¡&ɤ@ánb¿Ë(Þ–˜9b{cõ/ê«äO¯N/Þ^ê“w/õ‹ów/Ï®ÎÎß]êWç:PCýòìòêâìùzÄßž¿<{uöâ„~AÊ? ð;¨RpG66Âʹ£«¯·•‰}¬Šˆ4û«œ"EØYHŸÊ›U ¶¡‘°ÆTµ]þFž|7½‹ÙwÞ‹~;`φ*æ,úýÖ(­´—6´Ñ;¼”©‘h晣4UX:#¶/¹÷„d\¨šÝ`Çà_,E”_/87ËgÓë‚•cZÌ[F}É|&InÀdb¨‚] á¹oße|„Ü.7§„´~Þ1•#6[3'“í½¡CÛÒÌ`âa÷MÈä=ÉÛ4t ¨›”g ´áq©âÎèþì;Ä€rd:6íN*´ôœäô¾÷Šê‘uWÝžñ„´·œF¥y¶½ïh*μ´Q¯²‘#âRŽ{w \XçÆêcèvNV·D·Iu¾º¼Ó-’šn W“±îP~µ`\-ˆÙõ}CÛÛ'×D›³’#¤@hAÄ|€y»æ¿t/ËWYÒº–:‘‹•`9|¿©(Б`°æAÉþ(µŽ´€ƒãɨ±è1½¥û& Û³Œ"+”¶YÉb–HÎü” XÝk±9ᦜêâ¦ÛË2ø=¦ÝnFEУ2Ô±—Y Y!ú3¥(ŽÆ¬N;)ä@÷1˜úeùÉ R÷Îô1Ñ—ð+æ•ÔF÷ñ^Š´§ørÖ p&,ž£Û²WŠ)ÉGù!uh)¥F¦ˆ ×ã×{制 Q©N‘ikB . 5Ÿ&Õ°) JäÐâOeéZ  ŸÓKæ Ø@<}'âÐ"ÞWûÐeª_†‘uþ¢@ôè^¬Ü]ãˆïÑzñøhmÞ.–°0!Ú<ù‹P¸Øuú&³Ë-Ld)k†·wÊǨõŒìFÊn¼Íg±ç÷º±>‚—óÕà b|é”& ˆm P\Ím†ðK›ÕÒ‚‰[ÂÆ0÷Ø7á±…4¸'²Iç¯<ç:<¸Uq<çSYoCã… Då$¿"dèÞÐr^¢ÞÃ4Þâ€4nå5ª™!®yß” —Fxø^ßX9š/7bPv–‡èúXÜ«^¯Ó!µuês(m÷;ŒßšššÎñ€m«yÄe:Âvbñv¼ð!FJ>»]o©ÚN* ¬}Â’–ȈEax+¢Ú´€4€×í©ó„D2Œâ3µÄÃÖ+ÚÚ:LIfËÙBÚ!øŸ²¬ÚÎMÍG¶LhiJÓһ‹ÃÞ1iÊý÷¦Ì`'NFDŒzý?&ª¾QýÖÝ¥äêN˜µ(+ŒûAc—\8¬§âòFÙ϶–ò76Τ7$#î2v¯€r5è\NÝŒXNù;©]v)©´Èä$§ ¤3ó9Y)Š 5¬ƒ¬r— µÍµ à ±{™È€¾}ãò–šú3T½¾q5]~L_¯O¸ï…¦uÄ¿žv›ìÓT¥Ü™å¾LÕ·—°­=•’L#ýÙPŽrÓŸ©§{àØ½¤moˆ‘Ý‘ÕeŒ¸ ë°¯™EÝG¢Ô2 1%- X`ÍŸN:î&ºÂ—’º›Ì|YiûJsÈ suJ椤¨u2 1£¶×Tø”\³¹Þà°y ¤¹ÂÔÝ⎡u“’ް±`ÂaÇÈn¯ÌtñÄ”{¨oLž‰8ØŒ.66Ü“u­¬©ù f]V0Ab@X ! ªtrÛ‰ i>ÐcbN¸b…@ÙÏÖ‘kÃõýuÈYXl϶-ÞËÑÛ›³±Lü$ÿm{p¿ýe%ÿƒ=Hîó®¬$RôjVæ§!1óIîß:‡ºgÉÄQ¸{fr¾ÄhL8¶•öÀŒÛ‡%ÿµkMw@o·;b’½ßé×çZ_^^oGPMçuT–Ã.u¸`rÙNcv˜ŠõA]øfR¿¼Ÿ­AE:b¢  Êv]æ¤At:µ›•ìÉ'¢¯¸hè+-¹.ôevų˔ñ<æ–^y¼¢ï¹½ªº,Üz®LŒ÷.ÉbC !`Èñí,+3éµRÆ ×Y%'Ê”°Uw±¯æ˜n§è̳›>qX¯«|ƒ¿!£·SáÖoøûŽ·íõôÃ…ø(k„~œŠQ»VOGjû¯íQÙ.í 6šr¢hŸý;¹?3(àÑÌN÷Âå#h| 7¶¹PO0>+T|‹V¹ 'M&ÞÍõS¥«¶%ó–pS2L¥m7!B³pë¯g=¾ÑºÍzÒ‰bõ"€NkBŸŒ.¤Ñ…-ï» ÌŽM8Š–û r߃Ym|K]4Ûpã«'à–÷EºÍd”…i¾ÈF„TÝE+7P’)t¸ ºÆö,œ˜K“³¨P4õ.•ô„lµ‹zÆ S­ל¼HAÒ®Ò¾<ò×>kÙà*ü¥“!öÊìÁTHõÎ{T…N3©Á¯¨ÅgÉlÐÝ;ýý³~Ò¹’ø Ÿñßšø7UáF`¼Èëj©.£‰Bó¡P®Ò³bcÄcvÞ^Ê‘¡õz‚Ýù[¼¹Õëë7b:¼MTÞGPò f€O› ²äÝ.gºw$[Ë»~µ)—·j0ŸQS2N³ë„ë ¶Ýò‰³‹ÓæœJ|iÛn冖 üž¡~Pã·Ï>äî U¼&Ve5Ò-²é³÷®i\ɺðù:ý+V°f€ÐÅv2#_YÆ6ïÈ’FȹlËCZÐH=šÐ`™d¼û[OU­K7Hr’™ÌÞç„Äšîu_µêúT:Uý(¾rÖ{Wû#åˆûe.0Ò v"ì’ò¾¦ Æk•ìuQîÀàØw«FêU©[˜cqÿ‡™Gëfôs {Òb×ü¨4ˆ%G]>o‰ežŽePnbõoéñÞ Ê×VÛ>OŒ´‘â~âü%” êI(„ø2K™'<-íšp™²KŠZ Ýg§+Ïi’w²DW>­äTÍç+ä™…ˆ?·¬q­¬§ØT¯×ÅJóÀ}æëÊ‚Ñ DK¥S¬¿úÏ—Þ²ÊéB£=;²âKªÈ¢W^hǪÀ= Dï€E@Ó}‘àöé%[Ð ] œ^è\[\$„Øu¥!®™ñ¼øh!@Ô9fÆ$ D~ „t,r­ àHœˆqªËéÐbbò3ÚÁ0‘äLЃ&Ò>§UiŒj~<Ï+^̼ü¥Åž0׺¢c¤¬÷Å,y—²õV¦NÍ’œG:÷׸¤ J´Þ©{]ô-,C¯iaÒ Ÿ‚¸SÛói:c·u«fʱqõ @ ’ÇX‹Ó“xq8â*œ¥˜9h!² $3×6ªšúÕ Gøå ˆ ê4袽C𼨕m($Nâ½+‚„ÊÀ¡NOÚ ˆ7µf¶„JÃKq|d[ ¯<¨E†Ú:‰Y ¡m”À¦€øª²ìÝô°¢5Ëa¥ïÞ !ƒ°\7%#ÙÒù°d–Ï·päÿÚÖ¬‹É×¥­–e­j°;˜WXñ?a_8¡¿¡j®ö»Â.1Õ²ÒØFŒ-–χH}èÁ¾{IZYCw 8{dHænùRu×íבl²<âóÀ)sçñ¬a8Är\N;–üÀ·.ãY<âÝÍ{oöÎ.;a U‹×=ï•|ÉFøâf¤¤lœ9™‘?âÛÔ=FÜ#.:Û‡:™oöNNöO¿ãùßn™'íý½Wݶ9}Ñ6ql:]ëûÔ<;i·ÍÑ3³ÿbïäy»ûNÚ¸#, >²At×o{Ú><5Çí“—ÓS*íÉwfïø˜ ß{rÐ6{ßÐh¶¿Eè³ùæEû0:Bñßt¨=ÝÓ=<Ð94ßœtN;‡Ï¹@8âžtž¿85/Žž¶OØ[w“jçÍñÞÉi§Ý¨_wž;UÙëR³+æ›Îé‹£W§®ñèÜÞáwæ¯Ã§ ÓîpAíoOÚ]êDew^R‹ÛôcçpÿàÕSv~B%Ò8QϨ§G<4ö^[:5†Ê^¶OhüO÷žt:T%<‡ŸuN© ö/Þ“–ï¿:Ø£N¼:9>ê¶¡¿ÁR!4à'î_Í^7ÒýÛ«=W.•ñrïpŸ'ª4‘è®ùîèN ê÷ÁSÜÙ0Pmó´ý¬½Úùš¦—î¤jº¯^¶u¼»§<@æ°½OíÝ;ùÎtÛ'_wö1ÑIûx¯CÃé“”rt(´e§…É£UÒþkàÕáz{ÒþÛ+êÏš•€2öžÓjÃ`ó}Ó¡Ê1CåÉoð#ôƒŸüïh™—{߉cöwº<¨™Îs»¸*hQøÕ¹÷äcð„ÚÓáfQC0 ˜¢§{/÷ž·»È-®Zɦ{ÜÞïàýNKæú@F…vÑß^aé‚böh:Ñ5¬C2ìA¬µC»F¨îò¾¬ùºKëëâ਋ÅF•œîn1½?iãî“ö!o§½ýýW'´µpž Öt_Ñfëò¤Dè/ïæÎÉS»ŸxœÍ³½ÎÁ«“•5F5Ñ¢H^knBì"ëÖ¼LçUµÿBgÏvíwæMÅ“6ݶ÷ôë(ÔÑ^èvtLŽ´G&l|Jýãû×8ðÃ÷·¼7©=–FEÃzÊç?]d0‡Cbvô”˱‚õdTØÅžrQ±iÄŠzééayÁñù<²˜;Ìã[NŒù;•¸!2@™À:éKˆÂôˆŸ;ŸAé<*žrº€8&”›A(¨3[õ¡ˆ³*Ùù¶1áµ±0ú… •ñ$á]²T›1ï¹²iÞÙ˜]xP—¡ˆÌØYk?óðÇTŒâÿ?K@ìŠÃž|ÜÑ…8ºç: ’:A>ÄxòóÖc €j. Rô9ÉCCG~,ÎD1¯ö Ìeƒ©Âá1ÕÀEàÔg¦ç±ÔËri@T˜ï.º±0ËÂýúà0ñ œ¯w÷\iì=³óßè¼õ®g”| …„‘ÛJ¼1ŒK©½¤ë«üský„¦XÃ.áÕ3×qvÈ;yBÓÙwhìá"dø.CM…Èǃ֥“mQ>§ip?â˜î&¼N"`t ÇSÅQ¼³rí:ëáºöŽ?‘ë V÷ˆÀŒéÇòäYZë7±Àü|9¦¿ñ‹ãù£A‰¬"}D F Ì®f n9«Ú,›P‡$p ü>àG²Þ³à®QpOmXòh£JbŒãÌyô‘FtÙÙ…‰S.!GWÚA‰ºS=Ÿ‡ýNX{»¾?ÿK£´±›)îå•Çû$KhéÞ“îÑñß…|ó^ºÌ|I ü{Ž]½ª¶ü¶(ÓöðaŒPÉ— ‘TN{d²auýjØ–8®\.§óØÊå}¾mû¸ îi]¿6î¶[R"¯> §ÔwMêcÃqçê XÜØLRë‚ЧµMÓH&ÑÓóþ?O¢qFE6ûÔ‚·¬Ö'“ X2ΛMPr¥óE*v]ñ¯1$ÚYvÍC02ß‚’-鱚{wÎÈúô8™ÕDrÏ¢üH,ñg‡©at^5çp*>NÅòé0š P>—xÍê§Ë‚6íñ¡âg°L%Úâ»l™ –{“=Ž3ñ|é*ï ßÞ"àP”kåTÐ÷Á:¯Â<ƃ´s èÍú©À &¯;•Uöÿ¡5æ0{fLŠ# B¿i•œ.i«e“Ç ³M¼Ú,1 ˜ù¡¼Ž<µ^_Ó R½î5d×iYÔnä5X?áü²n# â`ä€3²ÍBZÃD;Ë`¡NŒƒÎUMd½Ã9>d_Î*6>JKˆÑ`ß®°Æ@¯ž;¯‹ËkUHB®¬“¨ êCgãgÖ`]Dë±.VU›ÿi›ß_¿ìu=þ Ù¿ ËmøÿÛ÷Wð_?ÿâÞöïøO¿Á«¾)R’šBU e¦¶Læ$’²ì-ûaû›.Ÿ?IÂ$%‚µ“#fm]j=•ú@üÏ|]»ÿ;‡ÝÓ½ƒƒE7ïÿí­­5ûgçwüÿßâu|Òfõj·sÚîS”‘Hœ§*«9“*T Û! £©î;.ÍÔ.ú}¬U\-£A&Á‹`'ˆâ½ÖY–ã[^V¹b- ⃭.&¬JBôñ}“…²dò.%‰Obùø •»x/¬ÿ“îÓ¼aŽº›ßÂ.<ŠgiÞˆ^o¾¢ï;¤?{oEŵ¼¸"ÒT³áÞ²Öê½€T¤ls:‹*ƒt’å1qp?fY…¥¶‹Ü×+j–ºäŸÔI|ÕÝ¢ÏÒÀÚ“Ó©hUâÙ9G4M1.~pHJ¦Yž20|í‚Rè×èr>Ÿæ»››tårqŽœ›nŸZXlú­Î¶ä‰¹È¬Œ®(ÂmžÅ>ââá|(ÈݦÙTßysG ä˜Zl¶\àjë-Nù”f*,ø‰ ^Q¾Xµ£M²tø¬óZc ž‹ZÕ'„±¡‘*œi˜Ž·âfjAÔŒØmÛ›d2Ð$›4(ž©w9 ÏÓ,*”=<Šôèb%$û’½ôtc粨væ>ËɺÔ/ vTåÏóé²I-që¾6H†ñb4ß5ßµ». *Iñð@82’K¤ƒ¥†D¯Gµ¥ $¥Âà‰èWŽóàTŒIl,N¬ß±PHÖQQt\ YAB^f³ôG¨YFMšpê[’M[$kãaÄTBa4b ÜXFÆÓÇŠ E˜¦aß›[×õ£H'ﲑº»‚…€ Úÿ&cÛ*âí\v>kÚ)&ÉfÒÑ|‰™…€Ó²'¬`&£x…“¦á’6òÅ,»ÂLØXo?‡Gõ]ÁWW—(Á‡7ƒA¶è¶î?í!g[¦ÒeJ\µJþ,P¢º>˜&&ÓF¸v·3„*óÁŠƒ4Ùdâ#ãjýaË C=èƒáï»böŒlSa÷µYnÑVQõt–oË¡îðÍEÙ'E„J8èìY“N¥¬âòs+Ù_Bôik\÷š×`¢Ì°+4P}Zb‹Éœ5îAŸ6ñSÝ¿¡{ÚâË‘.óþ0oø˜4‹áìÜËòQüÎ)…ª¹YIÅ®ÞBçËyҌް¸mÖJ»Æî5D@à—dŒ{6„'~˜¯cuׯ½:,tèÒ9'4ø«»AÝ4(fÿÙÁÞóî£fGºªQdfÿøxýOõú\¥çQ¤s…eÛòÀ¢ƒ©6º¤_ň飥R™¸X@N$䚣Ä3vóPyvãôþ+zR5¶½´ô£'¯:Oa~rÐ~Ùåð0_H=ûóд»ü‘Ýéé|TÖAsO°áÈ¥o(è¹=4$ó“êœô­?h#мÉ-Z­äµˆ¢Bî&ðÆd øevn=y¬Âov~”øù9èé4óS]<ìØ%\h˜p*(˜ESfÒzS{òT(ÀëžµsÈvuˆ^è²}¨SF žäÍ›*xÓé‚6µPä›-Å9Ý2ðű9Mþ!j·gCS‰W€¡"¿Œ˜óå °–¶¥©Î3öÆ ©$%/!~UÎܳ²¥Õ?œ-µÀª‰f.ÃFYÆ'}qPK5šƒ—# ü³$Dd>5ñÉ—,1&Í&íΦ®Ù(ÊfgȦdv EGÜ,/È E+REƒ•ÃfÝ‘¶ÅhVN­Ä Ád¶—1P¬Û oúÙu+Ê—ãólÄ(k//0è—/0ƒ5tè<™3nÝ Y€Z‰,FM½" Ûâ*•àƒõt©%À=Fœ 'OHjh:¶¶6‰v)K|'r¯58Šù=kI­å’žcͶ3ïD$™ÔâÙ\ümW–‡¸3F6œVaøá’ô$b»¯v¿ÕÌ+dƒg@±¥ +’QI`9Í¢À Aóל8»¦’²(0È v“g>, UxÃG*×­8 WM¾=;‰Í$Oä¹06=§DÐå¢Ö³¶a˜5i¸˜¢r UÈ à¬NšºM\ºÏßõwÿw¾®Õÿ¹t©ñø×Öq[þ·íí»+ùwvîÿ®ÿû ^wîÀMbíšç¸hcì¹Æ@[ ƒlºôj{z²×ƒ—¤yÄ¢ª½5*¯˜“öÞÓ—íÖx`ŒÏ¹Ûº”/ÊõèWà)dý‹•­Ë³È„/ÜPä.Ši‚[`ÿ“|¾‰?’ÔÊOç¥Ò|Iyø@x¹Ÿý0Ϧ¥ç\n`î•Y›*x:^ýnðÇ¡ôÒIO“ ÙëÓtšÌ³k*eŸð× <Òì—Åäœ2ŸÆý¤PãöÂp>íiªK{I޵Þe6›,s9¬Ò²'J€kÚÃlZÒÇýYæ.~€±éÝ]ýÙâ|¥ŸH#V¾(±Î=¸Ì3ð­ItÈ5ÍËjjbm×Â_d Ã+2îtåš:d u‚—…9¿—»þ†S¹§{M5¥e>íçWÝeÞ,½ÂRÐ~ç)ÝâÉ׉í“×T>–­®Žq‰$6®Ã˜Û?g}MÓÉ=g=•ä·ÆX„—ÌMò^ᔂ™hþ¨†dklÄÃbÓ‰õÀªk¹ÄU@';MlWŽ¢–ªAãsäèÓhØ<4b ÃK”»¥-zEG›QÜUL\€mµŒÜ¶k­:os*l´ìÖ6õ/ÓÑÀ­š•FÝÔ7tÏÒ÷4çÆCkÊùY­.Ö»¹ÏµÓî~½w`’Ù ñæ“ÒšÐå¹’îš“fLÔJÆ! ˜Á!üW¸uZHûð´}bÀ§Íg´qÝ~¸Lú|Ýéu¿99:>7 Íii!IbóÞZ$ s(CªÅ @ ?¢u9R¿žº.ß`/ÏbÇf.åpµj6aûh"}¯©~òp–\$ï§«nõWx³/8ú[Ñ(/Ó"\žòÂLyˆùæб‘"% œs§c ¦rê K¹,:G!g5ÜÿÙuÃZfœÒ;6#`ÊÚFðÞŒÙ,†Z꾃tf§MÉimíÕͽ:ÍâÊä qºÃJ:Ì®ltÚf“Jy)„Õíl³¾J`X¼þ,ȫͿsºf)B½PhQŽ_fM›U>©ˆ:¹BC÷/+.àÉz©4ŒÐ„d èY1JûöøþN²&o¨V­yXg£‚Ïpíb<™"±IˆÅI-$'JÌÓgñ-–ò Qì!á’):ר¢ ȰRЦlçI HØê¶C6iòR¶Žb–¶èjÚ^ Û…È6ˆS[fl˜ˆ] 8“`Ub¼òÙ GéZí€cŽs›EaN\BS{x¨ý%\\ÒxÀ°L’‡Y—}×ýë¨8ÌhÊд÷_9j¦ºâ•Š`®ç€–Pí» ä‘ó?O KÅg“ÖÑ)ë‹!"ò½—‡º¾™/¦t%a+cʼnP•z±)y˜T²{H`­‚¶,³sIo8(áe”rçµ–\™PÑ``‰"Éi~•Äo{öé^–{åhŸÄFñ„A pOVAšß2ð-)­"B0l²ËZ’Ë‘2ÆK캂Ë&ˆ>º¦!Že<ç>O$wAà|B§F&¾÷ñµîáì®õx°ÄI´Ì^nCM´F٥̣©Kžw>U÷65O_76O·mõ¼áÎÏÑb¶l ¬ÈÞ Î¦ôº®r—R¼ÆÜMt"žî—Îvðp^b_¸#ùF‡ZÑŠ¿³ÉzDéÃö ²ä¿&h “ = ØŽ—¸sÚƒ·£'‘ ¨£¨™b¢F`,þ.*gHiÍëÈa1?i×MiÓ°K bÒtwrTÕˆZš'vÉ„ »vw:®×>C²´€}M˧ïç³X‰Å<[áQ§ øÊûÛ‘†¿þ©ÆÊ?µþç¼Â}“¸ĵ'­å"± ýµœpñQqm©ƒ ™8 3)†Öçw‹YjÕö(ë+¿zù9&DS„,[e³9NÁ5éçdÒ¶ü @ló"F$v~£>d3¿áüH4cvj.9.P~š…ÚÂfL 3\üø#ñI¢Á"úÏú—zT t’ǹ:bkÓ†°Çàó” )¾U€kc¬ÆÅ48¬ßª~…¥]¸aÄŒpÏ™¸d1Q_^éq¬®xr/üIÝ`U©Lc þTÄ«áØ¯`…U<'Òt×Àë‘ÖÒ "“ì|aŽÞ.q5_‘7E½«8å–|!@#í^h™gÁ¦ƒAK0@õR©VŸ÷œ5#·’;C'Θ«X`ÌK4GIœ-ÒP¿I{ÀÙ9KÅÄÑ…V ^–3çN*ux²èx;®¤ÚgK3ûÜ f^LÁ©‰䛥;ªªµI¼ãžõ=Èsbˆr›e5Z7!¾£Hg®Ø»áÜÜ&ŠïØS !»Á“ uGð-{¹Dx‘ž/5Ô= N΢圗ºöYâi ÉÖS*eDöOOšÏ]Xm{†´ŽÂ³Ô‹dö#»¢;œÛ.-¨@ŸBÏ•” ?(¾(ºF´µºÜj™@½`籜™²¼Úü±jݦ…óíÇvq D€Ï"uÊLfóB›òdd!<ݹk»£±ÿ¨`7²CJm–4ÙŸ.4N:á&_±˜ØŒŽ?0pòÞÑF\\äÊ‘94É~Šðdc_Móri«ÌÕö¡ð ³ZaõR^ìó-ÂL-fdÌ類ô£wI]¨[à‹*>pyÞ ›ÂÇU; Ä6 ž9ÎCÛÔ Ûlw‰zàð¨['wZ5œnh‡ªG,už8J!Û,ÉÁ€Ý§>.ì£$q3EY#9Gܱôèª+Lýj+šM­a‰inY ×(;?W‘Ê.=uw¯šB¾Gü¨\>¸˜Ä›JHg}µU$-5—YŸÁmàÁ-ü¼¥I2Œ‹vkÊÚƒFœ/…eÏÁý[îD–üéÞ“.»N­’±9ûH x°˜\¥Éh°ä”N®áêVÇ,,;ÔJˆ -ÁlP*àá(™\Ì/·?”–Ò¹²c¯ìŠÚ˜¢Z1£pÅiç kÒ0ÅMu¢¨D…H9ÂÍ 3_¡ó®"ˆªôéb1Uê 3ÉNÏ\^¨ëÜ,Ö„U~ª¡êÏT¢ð«‡[ÄDš\²€Äç"RjyšæÐÅ­ÑßOþÆÉÁ7'{Ç=ŽHx¨<Øã^PK]wœ!aQôg¦S‚”°V9Ì(˜ÉçÅГJÙÕüѨ›„g̹“ÅãKß¾Á€°óÿJáöÜtó¡° µ.áP¼a°qð{ÑÒûhAbP»W­°`ÃÐA J¶«l;ÐB*jb³UAì!ëXË¡UÑÔoÓÁy$h]8ö_<Õ‘µÙqMgóÈ›*´ŸÔ»¢Ðü†vÃ4ã0ŒzІKÁˆpî–s  ¤ÜÑC*w¶˜Î½Ž†G³C­2ÃQ|á¨# O€, p4‘0l›Ž‘ƒ×Ã9cC£+ïæÛ[[Üó­5Y"‰hÓÒV¬qÊ¿Qz>ç‚<9µt’ç¡ÔÍ£‰-ÑéBçT¼béã)§äæ#/ Ñúöâ¸ùê[³½Í¼ËU‚<¾b€ý!Âor†ÔR . ®å6Ø%•ÓÎÑ~÷›Îa÷¿,1ñ’’Ü9 Í·t¥'—¬-¦Õ·Ë—–ËçÄ…b$-»<Ñ ¹w©5±ƒ t!ÖC—Š5æ —ѕǑîú|‘/ýæð`ªØ‚Ä«^  2ÄØ’˜mÕiK½Ímfx=j›&2 ­‹ñÔïK£qºŽÀïÆÈAhõOÊük0ÿü·Â Ìo¿%qÑ­@œ Z *G4—–ûô!:Pç/ ò!Ëû–¥‰—»¦Ò>zæä?kφ™â d&¬}eóæ¬õÂð¶¿oÛÖOú×Èç$’¯ ,£^îÖÖ_šÛ;Íí»Er¶/g46ìl/Åj–ë>ÅѸìÑ<Ó>¬U¨vE]ì;=IIGÃrÎX¼öê¸u¹¨Ó1‡*2¡ãYÕb }CŪ‹£éœ~(³Ùc ¡?‘«z.É”P>ÅwÝb¥J¿ÙLWÎF3·kÉD³™'#¯d5 ÀG°€}¿°4M5VqÎêö‚ÕÈ®Q7Õ­¥’× ñ6ïB;v_Ya}·T‘Tb¼h¯e@ìV±œ 2¨ÍÖnhœ9Üh\AÖùo³é§‰÷£¥,×»›=Ý¥e›Öλ”1`Š¿Ô WJ¥óÔXØ™¹¤ERê«bâPŽáÖ¤dà«1쯺Îq¤3 ÕZN ë[SÒÕ­*Ϊ/«yÁh²fÊšc“B¸Õu>Y»~’¼’Uõ›r’‰6¤Âû­â èÌPÑ}ÏŽÛ 7ö‹Éù(ë¿u|¨1~.ڸŠ´Š@fõ™³ó>ÆØ‘Ul¼`"![·c«µsŸŠ™]±f¶ó$g»jiÄU&·²Ôà]`ú‚Öî#Ë]åE§¤·©dçÁuÂÊ@µZÉQupM c¿¸PÊ›{ uhV±²+GAœ’Ûm©ÑÒÚhXäefƒÂÙWÑ¢pt<ú‡úOR×%]*ˆÏE6W?KQ_É2#¹Lí“zP̾Ѓ´(—ÿ–ôß¿ŠÄNd ïkJÚfVPú²Lx-ÖšGõ²PY0«£ÖÖJL ‚èbÙ,ÍóÀ²I•ý¥xGÁ"vc±j¢tœ»ê8y%«½#×ÂT7ÜØæ\.§tNBOÈÓ0œtŽC¹'¿Õ‚äeöà äÇžTëDP¢®P×\ˆåȪªêevÜÚì­Oll-|>Ÿ'Â=°³&Ée•YòÉÁWY•ƒO c«ý …±Ñó:AÉ,ÆVÀ«ª{†ç†Ëqi´ –ÛI´çKëEϦišî "mZŽË(5$š>Ø¡bŠKªýíÞËãƒv×§VÄšš¯`AÙ0rO¼ÏE5°GÞb>lþ¹Îv:Y ÿ
vØ+²Kg §»ÅøÕ^6ïšÔ‡—°¸Ñ#x‡«F®àålVhó]ï“LÅ…ÑÓéìÇS]Á•Áh»RÊvv±«=˜nã»ÀGÇD’ÅÑDgæiržÆ6£x¹Y É{Éû3IRFÔv@ á˜n—ËÓ²Ð4áEÑìoðâL¹ÑÕr j’SËé ¹f™á~æ["G}ñÖ°c˜0w±Su_Z?É)(¹D`ÝÁ9úÍF7L˜©ÞUî6ò…Ý‘Äx-ä*ñÂÖXÁ¨ècÑ0ê 0úÖ9ÆúÊXw˜¢Y°á‘fDGm¢[ŽòvyÞš¼Î­óˆHpÄ£>휨?ÿ¦ó‘©Ô_Í#;B›‹|¶ÉÞu›H¦•úJ¤ÂìbsL‘*rBœâ“D4à œÝ´.À³vM›ÂÛj :˜::î¤xwÝ8§ Ìh}’t|“8ǰ±ó’zF­¬!ïÔË" «eXÒ¶Ò.›Ð%ãº%Hç(0aÝÐ+gp½nÀ×Û+Ý’—`"ÿÄ|ÊÉ[Á¿B<¥S¹‰g‹U=JfY“Otã"Ç1@×Ö#*Îrœb¬„éÏ9RàD`¡VoxFöÕK;/Ð8Zn£Vw¹Eº{½“v÷tïäÔÔ`)Ìé̆…3¯›§6ï•<—9Ÿ¾u‘Ž !ø°¦œIÙ-iâ…ÈšÙ 9ÏšÄùõ힃'MÒîC&ÓœÐ8@pI½ ¯0‰óAætdöÄæ­ÙÏi§wfnᙥxÇ ê©ë-@hÿ@ÜMÚ÷Ž?¦„ÖÝ>ˆŒ^x(ͽl$à‘x»‰c[¦˜•J9Z!´çu`m &2隘գ´\q|·Ì/Õ–±ç”–/ÌIÌÍý;¤]úw%góeïD•sÍgöÔff@ԡΫ•ù¢ÛJçÞ<=µÏ°v‹ùO ¥°¦êéw àJËÊšä´èi7¨íBÍÐ2›åÓiºæ— <©1Õ³­ª¨ÚX"6lIµ´0p§¦-4J†ÈLÄ0`‰Ê€”'š.–<+:ëˆÂϱb,ceÙ(÷öÚï¤P#P°†XË ÐHáÕÄk^½y…?(ûñÒ>UÛïâí¯Êä†ñØÄpã±ÄS뿈¸:#3Ù±µq9‚_¬rþâ=ŸÉ[&p Bq2yGÔ†I[ÿ’UÓ’17sPï–º$z¯F\ {j\Ñå@û•ÙpçÒËþ”Ø"áÛ`>¨tÇÊzP²küàHfý‹»¾p¯B[M øÓÍz¿H òRÓàA­5OØ·°øXÙð²Ë,Z“Œ·C8„ ,ò5?KKçklðš•·™FÔ );gÖš‹`Ål«Þïãí€@ェÖ)+J‰j‹Až¤}LBÕ·5fè;ž BwÞ3 %Œe>~³ËV·ºX@¼OÆÌM®.dq‚† qA\ K?‚+!œ÷ªŸJË<ÅW°~ìŽÜ5‹þgýãp6fEq±qg–iý²8A–ã#0\6zÚ!²ð«¹HÔLv^-ã[T;4 iîÎ3øª;3Þ°H™ðŒ(1] ;wd/Lóù(QX>jÏË#»Ã¡…j{?Sã@—AÝòÖ‰B¢ã”B®gPô¢ì'Ì“ó G—¯âÙ„—»¨4R.¥+Ž®•pk6Š-ži‚·w©ú u ~×䬆PE¼¥SFy^L9ÚÈ*4Ǫþ+6Ä»lLz€ä ÈðªÚäüZ¬–¹À_¦ºnåÛ“¹ÊÜ2'± LÎâ‹Tã̰‚™¾Ë™Ñðåôi·B3 [ŠCo¶G9´ß|³ž=SZ¦K ·>âþ;õ !9ZÚd2>:he;Ë$Ðlç>4Å:„WvC"®bà‚Dÿš ÓâÐ|A]]WaÇÕËh&w81IcU°ßôMR»£ìμ¾&òY­yÝÎóo:‡û/„’À ŸIda3;4ˆô†„7ø§,|ª›Þ8ç3ˆ ‡Jè€×î­¶´EÙ=’ÚãçnæGr”žÛ5¯J Ü˸ô>‚6ŒÍ+ÈkaUKþM´jZ—`„1qÚJÚpq¤-–åÔ‡*y—$¶þÌRVEspƳåtž}¢Z‰óÆj]>(èÜ&ªq[ÞÇRrk –tv̆µ¢?³Y()Ú¦hc°S¨ÕÑ^жçK‰•´§ïþ_¶å¼Iã »Ökò²"-[óg{Œj¥  h!†FUFYžš]’A6‹aáKÌçÎò¡ìâé‚zyx±XB¦B _˜uq¾nhŠZ{žþ÷I¿V.'â–»—-ÐcÛúÍeeCx$Îidf·Õ/NÓxŽ„kŒR ÷Z®q"Î÷j„¤Qým·×žldAŒÙ˜C:9‘­g´|¨®]ø Ièæ.’‰ÖºJ^ØJä ª9y±ˆW/Š¢ð÷Î8»ôµƤ«Ž'ÖËËΖuŸgñl¬ƒ'zDÖMH%Æ.ÀØ.ÛYB·Ï5kò„š®­#Yn¶÷!·~¤ßìåü±ª"Óz.Öx1Ù„ç–7ðB8í ÏC'8ïúc>omYGBÑI1íqÅÈÖÇ2“¸$_%ì©kS-"¾ý-ŽÆ.aåîaX¹A-dA&Âk:•Ìòã4M>P5b[a)NìWÁsÄžØj.œÖë‡Im8nþŸÎ—Dp˜]ÖÑãP\q;ˆrÈðÜùÃ븴Öõ,Œ,™ºˆ 5ÎÛÇ_Ym)T‰`ÜÎÑ2T5à [¦ ôa¥^£Ø?†U€ÊH mïoy¤"V¨äÎqILc¬]ˆ«qž2ÑæIºË®„«6§ŽfÄ ´ASàÑç´Q=…F&d*ØÝ s´„=‚‰¹Á°ëþíh1¸`èƒ~:ë/Æì@`Ÿwü¸SŒJ „×7‹ë`æÂ&ê…q° 1‹Ieͼ¤b.r¦ý) –9¾ÃF«U÷moJ’õÌ…©z˜Ò4•PQ)#p¾bÌé\!€âwqÊà}­•±+ˇkÇͦ,³ƒÃÉÊBaY–%e™n6¬Âí¿0–ô®6vÀº–ó©)9Æ}`aMêÊET8»é:ÖÍ©ÃÝQÿ¢¸ØÔÙ9óºÒ¼€Û÷ç` ݈Vi¶Ô ¤&I2ÇN¾N Åe|QRŒ[¯ì/ Êt¸àÊ2ïžÚe§4b}Å/M±Ì-½“sÃ{_»CëýÖŸ9½ƒž<Òbe9…:(JPS£†²&Kñ¥-U† ž'˜•&>)G½ä7c±á­oü„Ý…›R(y×á—pß=OÄ4v,mV­XŽ[=OçðÆòœælc¥ÍU/g®×Àè¿8¨^K f»iã ´óR8ßÊæ~kd÷{h_,zO­@_¨?±í¦ýáÈ=(h|3t‰Û’…#†)ôÂé<y)圯êªt)±í²¡Ñrm‚P˜ t?:ëÊÔn †ËS/ 0kìR5Šm¸eF”"äÁú*ƒ¤Ñ5†… \p­9Å›fsç—«eÍfÙ§LVý}Kh ®8… 6""rçП‚ôø=ÿ8`'$ç äX ÈÄj=½VD»Åžë(ˆá÷Œ¦Uâa\Ð Nñ]¦™ÛÝHœÚÔ4ýKÄÙ8ÃÆ­ íŠúxyŸ…^w曠Ƈ㕫‰÷ÀD¡ý™FhqdVÿjÐr°òòç…á&ä ËlB¼cnªy®I/IK Z€òr{×Ey‚bn”iœºvdDY?Ä£SÍų¿Þ(í,q/ðñøLdºÖT%®yárLuŽü"?È~"ð†'É ž²ú q1w[響w ß»ôþ–¤ˆG9–FZÈÚiÍí Qœù\sKµŸ¤Î»Ã¯¶«p7‚¤lVÖ™©TyÅnW&Ÿ¬Ç’l륕Ž(²cQš¿•0FUÔ‡òvÂþsVÎc-y×|Ê/‡,ƾÐÃ%†Ž.ÏW'ñl†Ó´˜?ÖÊ_@môldä‘‚j*DüYQ檵Éi¼¶Õ Ä3Çu¸`Œ´QÓ;êräPû½68–û nT@ýµÌ TAâ½2æÐ0\«{êÐéåü¼:± ³éù‡sxL éM Šnqón#>1EMæ„¿¬{ï=ï½5†ðEÖT:>§¹' øa¹òõ\J Á×À§ÀŒv´gU\ø N}ÇŒaAo»yõ°78ì¿´Ë™™ 945v~g1,X×½)kyÇp*°(GÂ0³¸æšý¤…ãÆ{¿l0†¹MªÑU~ ÛZm¬Y™µèwÝ%ÓÊf°Pè:øºð l<çcÎÄ@f^µÃKUÛRÝLà—“þåŒE.bõ_Õã&Ðöp\s`^¥ç8«Å“ß&lLgÖ€¤tØR¿F gÍœùž^ažSïÂúlÍ)î¥MÒÇäÉE檑ÓÈWÉUi$C¼†r3§—W†‡^wö9]H^¡jÎBð±³Ù³&L\ž=üßi—W„WàAØ…AÓ¹†È?õÂßÚuLr­9²Œ1C¹°9[âÅãªçø ¢Ã°¿îqqœ…H'²~šjúQ37&[_ìš“‚‡ %¸}'i®§V?ÎÊúŠÛ€ì‡SÇ) AQ¬° ²áZ¬Y(EÌê^ ‡™—õÖª¡÷ì$ÊÅ0@ºó)¾ûª c7_AθÑ0Ô×ÏÅàψ>ÎÊò`·IEÇg>má„>íž ˨–wFçˆNÆò®G@”ôbu áÏJŠ4Òݪ,¬ œ2€Âp1Òœ¸v4÷©s±ƒÆË6¡˜¥T¶Dî>þðtï‰Óì9dRZh ‡ hßv]”k9â0dnŒEÀAŒžÝp‘Yܘ¹æ¨gš¡Ã.+íó]œ’Òh¶vï ÀCÏBv5qk ¸ŽÚ KÏ,ÃY„ÏÆI{‹/[gïðèPø!f†Ê°²vÅ;ïž{­[ F9.€ýí‹9DÌÊpMF©¤î_ uȆ$Æuã tiϾð—>wwY¸äÚòhN¶|Ìfk-È“#­ €ÌØœäu™€]³Ú7øÅ;énv'T Ô¼‹/15‚<ó4½HIÂe(m-m{×t€ÔKWuo´þ'eJº6ÿËÜøëë¸%ÿç÷v¶Ëù>¿wÿ÷üŸ¿ÅË:eNtÔŸgpÊÜÙÚÙ‰¢;wÌ7/öNM‡þïîFÑ÷ró÷‚½WudEĹYE¢#i{Ä" ™yýüðUd™£7.+ú<ͯ®®Zà[É`±9½œnö/“ù¦­€äy6m]ÎÇ£zÓd,è·,ßI¬½ÂüÒv-9Ù²§Êd(ë;Â×8?F, 8ê™Ø±ÉÓS±8v_´°“$²h.ÛùË_Z$”/ÅÅ@À+9%µÁÑjÉ— À¹¹Œ`Ò¨ƒµ_X(E³ÌÇcØ‘ÍU–V¥ÍÃ0ù¾ ÒÜ¢˜3µba@ y¼uÈ,ò 5oÃJ}ŸCùø= ÊwÙÂÚ>Yc<àì47顃°M(1Š@þ› HžÂð@bÉu­XË€ƒµŠAÅÅó¹bXÈXouªÚ“ËÝŸçUie!ð²imÕŸB˜±áœÑÖT2ˆ2fâ³6åtpþ®Û†øêc5w +¬!®ÎØgzÀQŸ|f€GÜ"ÍïŽcA˜ò’“‰ºß6ÁMcE Ûß¿mDbÜi W¨¤c0G¡® Ⱥz‹;‡+ÙÀ³×.S„lCÚ…ÅØ“ªEF™§\ªÄGfy¼˜™³¬ÊÖ/8¦º˜3‚Æ‹£oÌé‘yÕmÙ šÑªüº¸p=DZ£ÇQäd 8¡Öûþï¯_?ýÞ/2b‰mmr]%î`Á†—Ê@Zö~ÈøØ€’b×6Jéß릚Þ¬if°9xb³9Ü¡@U'N¬1{£ƒ°°Èbß»B#)ô{¢âíò¸‹Âr"àþïš…èºPdžZm‚`»jME‰(È¥Q§pGõZ~ l’l g2±Kad;ZhYÞ2ß‹Ê÷{v4Ó€ƒŠÜ޶cߟÇùå÷D/¿±ï÷ÍÙ÷ܵï›Ãï‚ÁÿÎ¥è4RusŽ:qý |–_#[Íc›-l±3$ºZPqÝ"‡–&±ÔüMëäÔœEÞçÚ`¡b@"Uµ˜— ZÌ©î,QÊÉí½‰}“`G&q¼ƒnT5È ˆtÔìH|2-÷Lí*‹®SPð‚«Û8¥ÍïÏ Lñ—€€¢YÕzô/+µ{—;S'¹ª¸I¬Ád©»GÒ(1 o!HzSV3Hp4`d¬ÿbèäÇßïW\ù¿ÇÆß×ÎâƒÒ²˜‹2aQ²0Cg†©,=Ñ3êëb¢þ¡RË ª‹ þêÏ]`¢ýLâ`ö¡‚Áö¤txÒy‘¾³›ÖÙU` µÿ (X¡’X˜O#¯OÅ0bû@^WÀ goV3¢S§@ž"Šm¡#v£“‚çð c9=&q„pZmp_ÒÌ\BQûç­ˆ‹QãT¢ŠñvT¥^™,Ó’kMY+}¾Há}­cv­QË:` íƒô©e+”Úóñ¹U×+ˆñ:Õ‚+Ÿ‡#ñˆÖÇ‘5<ÔwÙUi¹ PlmÀN‰ÐE¯uâlqäšýYLSa-<¾ÕÕ³³ãöÞá«Ó³ýªá#µsØ=Ý;8Ø;íîF¯Ô¿gž”(‹ð‡ë•/êS©!ùQÔMDí¯… dð-‰gÿq1‰SÝÏ:§í“nYXp¶ßCíð=hÇ÷’å{3-.`ƒ ’ÑøñªÅ£ó$Gе_á~ª›_Ûßí¯Âg  nhD6mÜú“[L¢ÁÜK6š, Å3QäsA¹æ,&"Ê·lÜæïÕ#g"íZE,h„Uþý¤Ä¿Ãn&Š["Of@#y– /¸O4ÈœÐb\Š¿o Ùcq›;O.SëXL<–­ª~šNEËn>A-Ñó>û-:®±–á#-^@SX-ÕÔ+oøÚ­,+ˆÈJ|!š¹§ñ=é íyÕÜΧVÚã™…ívÎmÆáEL«î`qnjN“ñÕMôˆÙØ–ò¤/ÛÇ{ÏÛ‘•8/ˆº-ÎqǦ{Jjÿ“t3¿ÅëZýOÀ;mþÊ:XÉóÅýëô?ü¹¤ÿùâþÎçÿçþ¿¤‡·¼þ×ÿ|Ôü÷³æÙô×q›þogç^iþw¶¾øüîïú¿ßàµwN‡S´‡¤Cô7X }à"GÓø‡Eí ôoLç7ÿ…C;CFF{ÄOì‘,³ÌÓ<‚éeí¹¢½|9'óYÚöæÙo‹yÆ:æ¿÷¬Ù)Ú{Ÿfcù›GOÄkjš,z‚SçFô$Ë`5ŠžHÊI(}ž,è0¦_–ć# i?žÔE‡}Êéë Ú¿Œ§hê><£ýñ[ŒO3ù‹BöáTF²Ò³ô=ÃiÓÇÎd°èÞ>“XàOû!g©*áÛÆÒS]`ÐøÝ¾I‚Í%[ÌQÐäbÆðîøð9âÖø£zãsžÌÞÅZ/X ®EÓrÓ€ŸQëÌ„}wè=gFÏ¥T¸ÚÑ =…Ÿ-ýí§ ø‡O£XÜ»õ3®I0½#âæ_Ñ<ƒôF:ü( Vý¥ûÈç—ôwÆ¥ðaƒ}YŒ§Q6ƨm­|TZûj)FÄ<ÓžÇQûµŸþPÛ’ŸÞE=˜â—÷•ÑA€Ä,à6æâ°¾£¢gøþŒba“ÑŒlBf` ÉëæýÙ(¾ˆžeýENé:ò‡<³³c?ôØ]ÙÅW½y¿ï.PŸ³çó(ý‘‡ùù(;ÇÅŒþ¼Hi‘¾@]ø“G/–ÓŒªýÇ”?æQ‡ÓKÒðt†ô?ý³f]ú¤=·r|ÂtÄí$ÒåK­ö ¹CÂ{üÍèÏ?û3oDyÐ;|‰åè]P"Va?q¨.µÄê}óEªŸìŠsŸzœ,úk’L%éÜ~ý+ÃÃÓÛ’*<Ø9‰ˆs\ð ¦M~ÄIñéÝw ì½cådñ€ÿÇ´Ø …ñ_•ƒ »ø`÷ùÏNôò z‰„ÝX,/ã÷Hœ½¤¥<–UÇiЏñ/A<^J~HyûDÞ3z›MIØG‡ô" ’¡G±÷-);ÌRº˜ñ–9Ìæz~È££óQªút™&öˆ. E"ú3G»è/ÎcÚ¡cxÙøO¹ýÒJYýÍr _ÚúN7f#@ŸHŽI*JÞã :(zÇ¢½ÇðÏ‘¿\”hÚñn׉ÿ˜ãs6”¿üÅ" ‡Ÿé‡«Aô7šá“½¿î½ŒN’>þÑ~Ó·ï:\'l8 ·‹Ñ zÜ8ú€ÿHP±è£‡éD%óÑBï§|'¯?ì½q{Õwtîºñ0ñ›§‹ô9Ýþe2¶ot ô$*C›©ovpå›-¹«#Ôåà?¢ÝdœÒŸ9þeé ê^Ê)Ó… ˆ¿Wô‡®¼ºPÐ%8,uòýs*D»’㥩æè4±K|Hi[Ò'#þ¾“¤» ³›þ^\$x_Nh=œ²ˆFoytŠ9?Åo$H‘ðK_Ä::ÍÐÜÓì¬üQàPBŸÓw º§K ü!Z ±û|”ºO‰|ΣWðÇß,‚* ÄTßiÎðidß0*¯&éPý5ð»€Þ0T­~r—¸t´ñÕDJ“?(çku¯prùDø:™ƒ4|&WÑ7H­AGƒ>Æ5ŽbËñЇ®0Ÿ#yÜ .‰™«Æžþ CA …(È$Þ²~äÁ-":ûù”Ãu¸ŽÎ‰iéõqöG$MCÈzÉòŽ`¨¨Osß?‰ Ùä¿çÙ€žÊ@ºûtFY²«¦~s!ô=‹Ñ¸V±Ä¬ÿ‘K¡É§¶©È.8°o=ØZìgVEã U‡¡t¨–ô‰ªAgøÕç>ô0zî ´‰tÛŸþìDÞ,ƒ@Keƒê [` ó$Y UÒ nv-qÕ&”•G ·Œ ÿááM&p½ŠËp$¶Ç‰t,ɉÐ;Ù€$òMï±*’÷CÆÑÒá™áJÒ»\N£!óœ “•¯òW¸ †NŒx¹E7Q ¿.&ÑÐs –cH¢ ®ãÜ'`½yt9F´tépKéÃ$òK ;úc)u*l#3 ŒÝËñ’ˆ¨äo®oŸà]ðÔáiéÉ”Àw›þü¸ä?½1Ž×Oø3ŒxìÁÒ8¹ˆGqd‡G£YÉ}ü÷ËhLÓ ÒÅôƒ!l‘üEîe+ýë.Â'x GªXé_Š×hBåOòxþc„(Ð8BxK4ÕóqªÔ›×¯M¬©Ú~TZü” àäTÑLz=“ƒk–àU9ñ^Ö‰5£Ñ4•Þ¦  ÚŒ|2ÃWYqúΛC3iqå|î€Æår|È[Ïç¾Jq K%õK:\b;ÊI¨¦r,+Yâü·wB´Î~ÄHGÄ]£ú;‹r>Gòq&ø“‚å£}©4·Œæ¼ {e®çÿ<[Ò]¡_Lø1\m$vúw㞥ZWC6G[›tt…¹ø‘zðÿš î?úú(ýøEuÜ¢ÿÙ¹wÿ‹²þgûó»_ü®ÿù ^#0ƒ&Ò&‡#IlDgŒÞ !ƒS.¦°™¥S:»SCÂ;FI¦nâÉd1¦#vl’t‘³Ajᆫ–ˆÀCÆç0½$s©–€ "œÄl¥ü0ýAذyG¼ð”Ä'$¯‹R:Frè1KpT;‘ÿqC<ÉÀÐÿ*¹¨K‹ÑˆÊ#ÚMm@Ä‚š=Mµi–ãùIš§†3‹PíéÀ|”ˆc8ÚÏ=‡vb1ûÒüm§·Bð¨ï&¡áJ%´n:K.ÁIFƒ¨»(Äu@†ÊÀPn¸‹“ô2ÈÝI‹â$¬¦Áe§£uEɹ¶á₎u$N´eçf‚NÂï+•FîÍácš™$ƒól¨ êç_¨µ9’ R¸§ ‚ž º NÕ¸Õbœá ˜,"ÜÔÛj’Cdâ91ë4B?¥hU®­åʨ;¹ë"±eìêB¼|æ?¡¦ÑD™þbšR&ZAšX@>à“‰€fŽzˆWMs 1£$»ÅÈ!˜Ìì=BàblbHõ ƒ©Ìuª©ÕvµQ_hã–iÃ'j&+~@ã;Kðe÷©ÊœMð3…Í;†)„G0X-sHku”žcey'´CèYC±Ïm$æ#}¹ØÚqúÂsÑIÍN>˜KZÑ4ú)¶Q†ŒLï´Í§=ì¤ôFkŒíü4I “iâ¤3ÌjŒh:‹¼eN¹1éùÂ.Rê}ÄÜû˜D0hx:9§±âû"é¸xªñÖAyL%³c\šð¦M‚ýút1H!š&<Ä9«Ó]HÎ7/Ê Äˆ,ì8_¦}¼ ( ¬£ñ Ä ÈÐTÿBÿýüÿ-^ƒÉÈGŠKäŒaŒ„ØÄù¦ãY2!Ðì6"¸a$àyõÒ¥ó$@ máQy|?›.Å©­¶_G6»­æͳ7௱ßû§O]¥©wtö­“›,Ð ð¢ïÌûÀy2,ºL³CÝd°É®/ø’„ÄÅÞ›&³qºT«nß/ÎGDÅH>š¨Ï!®pæ©ó¥ƒgàÝkºÚó >ܱx¨i˜ŒËîÇ®x5qIÖ%^sÀ±šù’5]ÁmÈ kÚÈl^)±q`+E|Ó9}qôêÔì~g¾Ù;9Ù;<ýîKQa=Ö9°8›WH38AŒ¡<ÿ²}²ÿ‚Ú{Ò9èœ~‡~<뜶»]óìèÄì™ã½“ÓÎþ«ƒ½süêäø¨Ûn!ú(±£*Å\3´Î5iÌ™ô=pËeïB›¨†cû¦ËÛçMЉ9â‘×òóWƒöFÊS‡òÄì×9|Þâê œ‰K¼Ä¤ˆë¦¹a:“~«aîÿ…h*í˜374M—}¶ïÞÝjH Oˆ‰Åý/÷ ?ÛÛÍí»[_4Ì«î¼w£ho¿×9ìœÖd¾Öhm×ùúñIû¤ý·ÚNëó¿ÔåÎý£Ãgç½½WßöžvNj yTçÅ×Ùß;è½8êž·vOöqg>ëoÂIªÕ§Û_rTÊéÑ˽¿¶k¯á4Eœã[íÑóžz‘%½hï=mŸtk¯ãëòMÝÝbzÝö)ÊîîQáßõö_´÷ÿJ­¾cCïÇrX{m³«ÉïÚ¿”ćѕHÉ$ðDá@…&"/Rá¿b—zeC¸–o®kÈŸþ„†t_=éžÖäZ£Ò<ÚB\|¥Nm °Ì”ƒ»ãÌ €,&y?ŽÊ%ψ†iy\ ÔxýøÛ¡T’ßü&U›wÓšžšïüœ Ío8t¥Îí¹Cͳ Çï‡iê×;:ì!\ø€&×Hrº«Ä¼elÇÑ›z¬' `=A-è9ïë•’ºW]â¾ëž¶_öÚßž¶»£Ãnƒ±†ÄÛ!‘)Ñ¥×ßç'Gß O;Ýヽï°ð^—VÚ·¦ÈZÌNPm‰H›µu¾|upÚyòÝi»·G«³½f¡îN ‰tÙ6¿©2rψ+%ŽÊâ|Ùü…›î ëû/`⠿ȹÔ"zðÛõŽao8 hWÌÜV䙺ý}ÿñøX®ï¾à+µãöÉAþÿÚBðoò ˆæqBÈTÿÎg‹¤^ªð’ ù#¿…„aÄtÓ^îœúB'É)ÿZ—fØŸÌGô>JÏ/’‰|@ q øm„\*’> gÞ—ù&ƒ£ÉÇ4ësøŒÅ¬é`c”c)ŠÖ6}ƵÔ&³YN?/&$p 䢉ôÐDZž~$‚F«¦†‹ä=½Ãé%É¥òÑ]Z~”È}y¬«×fÚ0)bS¾ÓADÿñö-8æÅÞ×íÞþ«“n›3!áwlž‡¶þÇúôdÃ7Vlà*Ÿ¶÷º5šQšõÎÓ¯ž¶1ûÃgG\*²Åјãh òP„°$ïó|ÐÓŸòy̼A¹ü×öÇP»zÀ¶š8Á§\¥‘ãÏÅK¼j†dŽÎÁßz$]¶÷ö_¼¡íŒ×V?ÉÞX´¹ í˜&„8ŽÝh„…_X$‹äÚ_sdòž¯ý9¨üúǹÇ:ržÐ_׉UzÐ8Ìø³“vûI÷iï ósGCtz¡Ó[MP¼œoöA*ãQµ9²?V•ø?ÔF)AöbgWi­Wwé>„jÐ]³A1ôŒóe0r}êK´K6-™añ5žPöI»&†qÀ|æ]D3Ú’SŽqc¶QÒñ¢W À?wô ºÌXÄqÝUýI]Ãc&½TÍS‡ŠÆac»QÔã µ+NqÕƒCÇ£¸ßë÷‚+&*_Áb§#Ÿ‚ý}F3SH=Û#å\x;0›é‡ ØÈP[ðXa˜Ü)5:zyL‡A¯ó¬}Ðm×Ìkºv°wøœ)ðÉÞËš]lºÜÍõDÁ¿î88ÉQ¼É…¼Rk Š µ® d”; «ÒþŠCm®Te6?U|ã/ÿ¥ùtsmAýEJ¹®Æ0ý[×µ×ÑîÛÇeø>ëW&úk‡g}å뮲pPà 6iÝüd>8J§¯×¼”j•¸Ò0Û 3¬?xS_¹køû¢õøöVÞ£ Š­|ìÍÔ’Š¬Q¬í“v—˜ ÚÆÚ›ù.¡]½W‡{utÚ~Z;=~uÚíÑ O¿;n7ÌúÇåAàf)SøH—°Q"á‹°…}å·[­J}¨B}YEÏ«àýVv÷Æ QДØ4¨A “[ÍÜç©FŽ(¯€y±/̳|¢™ÃàîF¥²m8 Žo9~íù>=x²÷´ƒXѽ›Ó2S¸6y–™0oã$‘'|gò3&A™=Kg4¹x€ÙÖ¼³¼ÍÀÀÑ«)0$V‰HÛKή†?¬ôFôŽC©ù(/k]Û-&“t^hëø”6ÍÒ§ ¡(ñb~™Í>YÏ‹'_*(¬ÄèÑp²Ïb‚‚æNë‹Ööò£8Óc¿Î€MÍ­­m*Kâ›Ül^ô¯¾šfçÙ{Ôô˜‡¿3±`Ä zªç*aà#›ÒÊOŠ—0v‚M vÇ>Ù•ÐejÏšdŠñÌæ6Éì#ôÞòËpÛ3^Ca [ÝÊâÓëXÙüóÜQíXïœ }aó=&Ö@¾øÖÑ|¾¤6ã°Å¡Ò“è!ìËӓ輻­½¾# O¦G¶×=zu²ß¦{B³{ú”ÚKì]öÜŽ•Î㲈œ ^¯kN¨su5bMäê5íg}mcIÈc] ÜÏì'sÑÔCËV+A*0Ö¯_ÓÕu`Ö€Y?#÷F(_y øê//O^s¯Š“Nš, “tNŸ® Â+7Új#úÁucO àÌŽ`ˆJMG‚|ßXa÷¸•vM—ÚiVKxttÜ><>ýÎê@KŠº:fÑDðX[_O7ÏGÔ×}Þ¹W*ªÙw),§;[@XùÄ]›ÎÇï¥<yÖ”·tMqôóx³nãÆ½8~õíJß>râו÷œVðþµMê£{þëÍEŸÞVÐà×4~_jÒæÖÍxzÒÞ{ÙÕò˜i«lÁ¦—åãpËéõ©ˆœŸÖ¯/ŪlàÍl¶!³´Û¬ý¿¢í}™¢¾ßy=õòdÞÏïRÀcÁ¯^­íÜoüy {à5s:Tb·}Úëۇ½nç¿ÚÎs2yšüI¦Î’vxk¯sK¤&K°¡QŠ‚™hŽœRukù±ËÞå¹ö °)0Àvâ?bdÎã<í÷¤ç]ú1bÑ«Uþ˜W`/¿æÎÂp=Ùëvö{,tö pvÙ9óãFìõi0ŽX³Q¹£¬1;iYæ†OÁ©b›X$Òi†½¯Æ&û 9eûæ¨k¾­›c6Ñ9ƺL,°ÊMg׊\;5[‡lܨ áìÛrpÊ3Á±a«™Õß|üZµl2}-ìR-^¬UÎGñe¥0ö–§¯Ú<ðWŸóž.NTÜÔ*5wêu¢Ò×íø4ÿŒš“÷I ³R:$?„5ë¢+ßR¨ºým{ÿÕ)ÿ½¿¶¿ë¶ÿ¦®À6•žM9æÓò¸`ÔBSƒKƉÔ׊ÜàÒjþÑÀ'À…¡p!œ1攂wŒIrŸ‰æz˜¼¥Ã¢Æî.üÑf†àzÑïWsÓ¾KsEÚDÞLöéƒ4ˆ˜Áx©i ß4Jv£UÏ;Ë IP‘Äè uSßr”yÎ9ÉWáœÙ·¢áôV¡ aüJö纾â«ò@aùÝðh}õQ¦î 1-–®M2Ù‰×ñe+L™yýºt¨ßÆ£}dÇWÜÐ>¾ã«oÛó²7[ñžÀ:³±&â‰(7\AÁþ”šê } Ká63Õõ½ÚE¸/mÉQï‚C³6뢰ˆ¡ƒ¢2ˆhXmõj@C)ÄcM@COvÃ\ˆŠT6΄-Ю} —[rØD_o¬ ;ÚÜØ@æy›Ú˜³J°â’›M’•`-s•T‘›fgÉ®’'gßäd@œœGºöÓš¾}Ø´ÙCˆ3IÑÑ/‘É£ŠP¦„xÝJ Èæ|==ñ$De£nÉœoù{ûß‚h‰*}“ÐÄp–UàPÛ>Kä`³‹W],{ÅfÈc)€É9údÕc¨Õ%5‘Ì IÊ w¯·¸%š2pqL\ôP¼Œ•ÅIÈá]©U|ôhÁ½nhòŒÝé4RžÓ5e›@]U®/’nô&û¡ÿ·U†K¼yþö?\þ#IÒñ|üÞýp>™M†‹ùqŒ—oÇ?ü@¼æÛQžåWËdú~A\ãÛtüÃàêüjøÃàrÞß§ñ=6®”ëØyTIʹX¼Åÿ yæÃÅ$~7È—ÄÇ,ÿˆ³8‰iL}šgﳋát4{?ûãøéÛ+êÑðªO>βÁûŒþq™¿«¬Ý 'Äí½ìvÛô?Ëm©@"Ÿ19˜HïV ’ÄK€§"XÈš¬ž:+*ë ‰Çî½ì@ÊT·àà´ "Ã͵ f-’º\ä–Ñæ0ÆÜÔ¶ëî ø5Ä}µUæò.ÕÎ’Ï•IV‰¬šËò«¬­ QUbYktm7õ¨„k€Ä§Õ8BÍ„Vé7Qï[ÉzÄdó2AZwâí®¢;ø‘I>DÙ%ƒÒAƧ2lmðŸlÆ€52â @’Á;+JNlÌ’éÊ€í\Ãh‡CæŽ·ÒØt¸{ÝÒ‡×^W¬ìšm»]!¾ëñcŒ bcZ—‘]X2ý Kz霒·üYµº¼êhºîH:-°þ|E]Ü%1÷›œÁ¤y‹‘)t,KI¢“š ~v·ðÖpÔø°}ô,ãÅ¿ZU« [.Z3–½Æg 8ó*á³É°äW±ßăæeÖwÑÝXêŒKM…jÑ…¨‚~<•¬æÐ©‚•SúÕy9Zjúa¾Î¿-q nµÚ¢¿YCËFDx’dÅ«¯£µËôIÌD|NLkÍF°E¿€°ØÐxÊjYÃH,B.Vå8u[ôM?Ôõ5ËÙÅD§Q}MÑÿža ²× Qü‡ù‹£Wˆ¥‹"·RMfW´/v¹=L- X»À'j°Ó‹«ëïI]^ ™í%·2 ›û‡¬¦¯À#·D²oîÎÝaZ?‚ND­aÑäèB{2Ø~Ç‚þ7¿®ÅrÄ¿¨Ž_ÿíþw¿ø=ÿÛoðºqþ-ŒH+ÿš:nÁÿÞÚ¹»³‚ÿùÅ[¿ãþ¯q<é½Ü;쟣81Û ÐíoOOözO;ÝSúa£fï"Niÿ ½wÈz²ò/öù]ãg¢?8×à;_=Ý;Ý{Ú9ùêÎFmÏãA:«ß©šànó8hÄzdþßxݸÿýÌ´Ò_}|óþÿüÞöÎÝ•üwïþûþÿ ^­Ó–ïÛ6•£þ<;'Özg«Aÿvv*Q«ûÂî½lëî6gMoì´N­AbŽŽ£Vš˜³³I­µÑÜ6­“Ž©¼>3gÃ'ggÛgÃcS1ú¸ƒ7ó†JNFt×¾K~Úv?µ")ô ZýªþU•$²ªi=1xè5ý¹û¦Ï;¯ñ.ÛþŽ?w}‘{a‘>_‹= !#ÒÜ¡r¨4àÚHÖHE¨'öö,Íùh©Ò·Kø¬fo ¤+(5H^6ñYÜkvx¨‰4DuÞB8YžÎ_”#Ž|bÛydŸkq Aà Ÿj»ƒ }«rk°î5¹#! ºŽØÔ‹ñxY÷£`›‰¡¼§õÙñ<øˆ)’É1:ëç†ÖY÷»Ã£ãn§ѯŠíÜêÀ¥Ïšêð­†þ¬…ÿøé§íîþI‡'4¢öêS´îX^f…‹3ž ;ZÝЉAŠÖ`Ã®È È#'6 ¶5ì XÐvгœ®š¶¼gXÌÂíƒóUÚ$åQ9IyTlžø^p`=5+AäÆõ|Ñï#h¤®ˆqÖ™‡VÚÜgiÆÖ:vE`­R]‘1Ùˆ­ï'Œ"=H‡ ŽßGÐüü *)jŠ #ÐÆEÁT‹$qý +ŽøTV)¢á~ñ­ˆŠÑÌHÒ—ü¯f‹D4¾ ËDE5eÉ ¦SÖ0OIüB°î±þ9º?¸Ò,â*—Z¸Ñ{:]Œ8wAŠLî»4Oæ¨.o¬3‚ÍLÍ93ш4_a,"whjqÂv H^ó¥óT¡m²¦Z˜1DÝz°¬>iò«³¦¸ÅL8Ý=P5Ñ€¬Îš¢èWlÀ '9ÙÌp‹Â’×~pÞ^|G½á•,oÓ©ºÏYÖÊL¦ñEÒˆâhÕÅ¥€˜ðÏYž¸õyYÈç¥V0“ý°cÔ9|p2ÉN7T­TœØ¢BniŸÒiqD$ Ó?ú;ºŠ—ù™÷a œÆyެñ=é5†?ÚãûØO4åçÃËꃊ©A‹$H’ €îųó©+…EQ]³ ZQgh ;³ö²ˆVù,}šÄõõX…òÙÆ:• õÇö,£AÆÀ¦´a Qªúð =»k¾‘…—2.5/ Á&;ðTЍnì@Ñ:V×Ì6㊖úÙ[-€rÌàik¨ðÑÞõ“bŽõñ]ègchnF‹ÙÅ%ï>雇è<TÂ$;kö/ÓÑ€†O75¬DA¢çmA˜ O„µ¨~èŒ>÷ãÑP·Øü…N=ÐïÒ/MÞ ãEÿR¼IìknOº7ÉiÏÉ>;$gý /´cÙibíÄ¡(÷1H?ÛØd¼ßí0 oõ¤E“åãU:@5–ÎGЦÎ"5nžKâêdФi˜+8 t](PqÝM¢IÛ°h„Ö& ö ^ ˆ¯¤|¹t̉”µÈψ½öÎáþfÆ ²+ÈLÖMˆRMô:ÔsdÛ–ŒtÞ\rVJ„%>Oßa.ªŸTK‹$°8YÎÓjbî2HñÀD& 0ˆ ò,´MÏ¢ƒŒC‹ ³È\ yÝLuMÉ·à…åÚ'åf‰äOw¥p¢q£¤Ø¼·ºW‰9JAË#¢(ïÒl‘#eÛbÆ’CÎö.öñç+s:ôrötw \z]ƧВºNxb`œÉz“ÍzÍ`½a¹Ò˜¤'KÛÇ 1`Ù€Ã^™z‹UxÊ™ì“ÂÚSE-óŠW hä98ñaQxÀŒN€™³–bP"s€uœþÂóñïΔB¯ÚóÔd«\ØôÂ03ãÙ{6âx9Ð{<̇ð§Ÿ~Zå£Ùdeˆ9§$‰–Åë»ar`b¯n$v,¦(i™Älˆ©UØñ)«EíOÔ©œE¢ÀV=— k¼Td×)Ö“o9œn<5„&›8 ßQJ ói˜óѹ§—1\3$—¬=Óš¥ÍVç5ÍU±v‹&ƒldö»3ŽØÎf4isóPêìS~,­š–VM¬Šä6-Qͽ‰YÀ̧~Ð|H︭¾1ßµ޾Á÷:3ÏÝÎaRí )è]UkqwN|BT“âë&ÉûñD]Î(YÃAtGkE% =ÐV®˜Ú^w¿Ó1[ï·¶y‹Ó‡ºc÷¤ødPd?$ïi~¾²ÅØ\Xnñ(ÏԀꦘåîÿP´‰yÏç³Ç/¿~ððüâñ›†FCÆœ# §ºýàîvU–«òu  gÔY‘ã&²g ÎÍ qÓ]§5`’…¦íˆ:TŸgÙ…æ'«bˆ ·Ê1W$aNBFW;ÆêÝ–Lk×yõ$!^šÿ†´ûXï%r"ò Ö\O¤î™}Kú·ùep X'Ð*F+8_Àœ©Ý2i(Â#hãE¸ÆšáT‚aã~à{Yë)2¢êŒ¯U7ïå9¦Ñ”V$ ž¤7ˆY\$Iž´'+‚R¡Ôg·[fh2»Î­ò)fÉå½à8xåìr*gg•jÅB›=AlÈœ±Öê"°'õþŠ Â ÎklùT’õ(·Ž×ŒÇ‹øød|N\Ý1üDöpÜꄵ“³&o7åf•O*IÂʼn8Ñ‚'i?‰^®Hµ¸¬±jÅó™äèNüŽ$öU°pk gP —V‹F»ÌSË8—Ô¤šb.¶›oÕÎÌÚsÖ|TøÜe“¡l¶ dKú?&*ìln "ËêÜNP–žQСUF6`KŸôcwÖ†â}d³>îš»[[¢~M.D-#UceùY“„<1¹€>Zµ‡oˆ ó|¥|Üí$§w¡G]îQ 2(q`îµçF]÷{ÉZ£7³ÙªDt5q§ÅK:”B8Ï5Sb¥Æ-”kè\ ŤC¯]Wå9q;ó•6°ì(¬ÞÆ'—„Z0)°f½UR6Œ'ý¥Í¬Š“m–ÔˆÈz’rmè‘™Sá̺ä%•ÔÒãs¶T}y%¿‹ž—Ÿ¨6‚Áƒùͺùë– ï'ëöUnú“\7”Õ-4ÂxWÖŸ¥E\gË·DÂYœñ׊ .ð]r¾q|]$gºöm”PT¶šœC*™f¹3”G=[ÌCÉ®Å>^ÒrÞ8•2EjîHX϶z9› &XÑ%‡ÞŒi«§›7,#oµmjŸf#¿œ §¶æp¾Þñ|)NŒj€”ów‰ÞƒÛ¯øvðî$$³Xî*,ê&–l'ðZòötuº3d‰’…:OËZjÔ˜«(t^y~Q’ˆCKøvËr0÷ õ@›ÏfP§44òXøjS³üWC\Jìöf†²yrxrã@£  ·9Ï¥Æy°ÙŸˆ@´û>wtšTˆ†r#*-I/‚YÏ5[ü§„^&ñ»¥4x&K™ŽÖÜ0Ø ºìÑ ‘4È:¦F¤ñÖ:½ìe•n¶E’85 ÂíÀT¦D´C4>«í‰6„Æ„Ã̇A™.®b*3¨|ÎÁ LZ)ž†25¢1‘$1tàŠpi ^*]*DÓ\6Ï’ò´Œ59ëPìš{[†ˆb¸Ž¿1ÁÖ0QûÛãöIç% ¿{»æÔ¼˜ê>[¿èà°ÅºÊâÏiñì²ù™°qj×휺“ü¥^çÒrt¬›ŠD_s#:OØ¢Ž^˜G’Yݶ€U™P`»ã;Yµ'Úšޭ¼?f¾nÅ U&Óºc<3JTïæ5p¦–g^[¨Þ°[™¨‰Ý©úC]Tt0~fyú 'A_^žqÃðñ‡*mÁ‹,¿äÈ÷JqdòF$ÒÞå)„Dì®yæ÷–ªé )C„Bhªælhº;æ»ëV%&¿pÎÓX‹²Í*UÇ¡`bŒdÃÐ`T©É=þV-­rüùñÌhÛA<ñgHËÝ>Á¹¿rJKÚœóÊ'á4Ö3C+d<Š–;ªÝÙ›ª"g°L§r óx¢âXœÿÔDzmÔlS›Sµ?@!ufªßNÓŒ¿¤ogìNWì?˜ãÂñ™yIç9IéœûIýñ2GŒP{ÿÔ¼’ Ô¨äèDv£ac"”U’@¬‰¥ë4~Äâ a“" ¯Ëyl©×'R ñr§ …y›vÜÌ#ÎVnnÄqÉ$™±[:Ž»ôÙÈÏdˆ o8„ñ㜧L}ÄŠ~9õ:‹ÄÔ‹² ‹¦ ´êÄ;[°DŒÆQžL‘J#±Þ‹ E.³Á5ÕÍØñ¯2͓Š%!F¿ÕŠSu`Ù„-ç>©SÆ&_ -'jXÖ"¥vœ"7Í^ã„Mº®ýœnÕv¯P÷ˆ>¨«`“•¨ `íÕ*± …΄ÍntM ¡§/ìʉj¥pœÒðBͼs BËxAIÙ.=2\UTP¥™³>%¢¬Êe§Ì(ëƒáÈ›Î#‰ªÊ9 >ö%ƒ.Iøâ7ªŽ’ç +­h㩚…7b…6²ý*.:.´>x×ls ñ6tÚ\Òf…ÇË2`¬q‘A¢¥á n×sÌ;€9Îr 7ƒ9zgÐCá‰Ê^cÕh £–1/Ù&›^rÚq8ÌD®ùÂî_&鬠”‰^ã’=vxØÖb=¢ÐÃPáêC“å~LÖ-$ؤb>ì*ƒÌXµ$Ôª!êʲ7GÁÇÁ”¨hut"¡{VN–…Æ9-˜ZSÕ¯D–Z*Qtìú¿ÎXh­@™ó6±XºjÖ?E¹è ™¹)E¯“³æÄû™0.”ã½ÓNð——ú‘Ï€Vužâ,²ß¾CweÌX©â¯lá",0|ý"t¥.§Íåbò6¯´Ìa&} \¶²ÙTS”hœ!ÛÂÀ—-ÒüR× ë‘E{X«¬øO($)™·UóB MõUñjgõ¢ w¬‰ËGÝÇ=Ví¼wì?š"z–ÃfëÑùÒy·ãt>g‰c$Ÿ%²'ÄÄ åMËTöôÞ ~»·‰Ê@5ƒæ Ñ@•çøÊÏq+:„Îý+®™;6€– Œ.t¹‘u>a¤vŸÖ†Ë *s8‡uR¿bñ6â€5~É.ÄVÚnÊžA®áM6—²¯Ó£ê'ÅuéqUde«‘JÞ÷G±ª¼à¾Rgâ8‘ýºâ¡8CÕ\ǘ ×KÞKE~íÔz¨zÕÏx“Æ&´àˆõ&=­ÄÉ ’ F%BõÌ|:~â6¢ãg¿0(E POx îù4t… Æ$tÿè8¾æøäèåñiÓć1-4-ëo®VoñÒÓ!š&3èÑ §3ðŒù…†²A®ñùP_äÝH$9–\y™þíAÃ[­ü/Ý3 ùà|##ùe*Ϥ èÀŠX-±e¸íï-ZXî/h˜d؉ûvú-\Ÿ쇺0·÷;{)"ø$zÒ9| Ü;æ—/邆n?Á<²åú3síõ0€uF’ƒDSÈÊTÌPkŸ”@ÉG2)Eˆ§õ´¦y‹!^†Ö¹•µJ¤y°Üο³ÅbÕ‹WbÆ‹ž¼AîXÜÕ ¦Àåˆ÷¯_MyqÖÛà"¸„$óz¡ægõTû¬é<„m·j8»½~ýœÓSF{Ö †Ä»u x׺=ÀÎÐ1³[k]c\;›¡i¹Pöxà>ÕåJkæB§@2£sv½ž'¡¬¢6H°æ:ï]Íùð|-óq ýf†ìü¢nSŸ‡é{ßiA±Lç–U…=jÔ®í\~…¡H•ïç$ü)ÝR£ÑãuQÕǤÎêÇõ÷uN aÅ©ô(¸·ÁÊ|ÐŽ_ *¾ÓYïo2eÕò*,Hµ`µKÅ(ΚÙÔ1û½M¬ò¿nO!m3â*”{ô®þBŒ8<]ëÊU YLù hRËì)°u']ðÁÎÎ]Ž xB,Љ›gª<ìM5½ºXÈé°ÜªÚye’, ê©g#Sø âI.èÌ· ¸q®¶U‘…0bž!ä3¸»´ÏÌ—R/k“´è1¡Ìc­,ÏëuéKÚí4ÇÇeDlg3@ì2ñ"ŒŒ¹“ðIZ9Ÿ ñÄid—Þ·8‚lEŸ,#§`bz ÷:n‡‡£p ´ø¡Ø7ùU Ÿ•ãºÔY³ëYvÏÉ®õHGB‰´c¬á$Ø÷Kìhš#mCäƒóm– Ú >šæt—G F(ŒÏ’—${&ût~Tv­]è†SÎÁÌÞ1í.=%’/ÆIÎc¬65ýZ=ðÕ_SxÖ¬Cʽ£¡Nï×þÔ|üˆ ëƒ"]#I4E!âXû’iÃlÐ:ƒñú£_w$`ÝñíÙ( tÈ»9[ztQÙu½:zæÎ¬Õr±=´K…*ÉÂT%Á {ÁxÛ÷üßPú#Ïe(Ëu _×'AÊ-œ FOÕsÃÛpdïI›çÎÖ¬mùüøþÃÈœêÞƒÊo7‘9±Lïݨ„õ,‹}U e š‹N\Y6<´J^‚³„7 qný-m¯QÒE Ìߨ$6g\pªÕîÖ%pƒÁ‹ZDxŸìJ6 ë? :‚SŒé‹ãqa1> ”²†N°šV ËNm:€àC?ñG§>ë6¬ »¨à¥ŸäÇ€&VÒï;'G‡pu>G£ýA0‘÷½H'þl+˜-Ë€ X U*U¸Y,áì2;‹»*zõëN÷ÕÞfj„î_Mì„·èÇó¦§î·óNÜn[ÝÑCòÆþ™4»…¦=ª¼KÏÌg<¨ÜxËøÌT?c꤇wí?î׫7=&`%Töî÷ÍŸUÜR:uzAë ðã¥x‰æ<Úô´ ”9ÄÈñ@$¶-ÆsIz˜O35´d!»A=ÕÄÝ€‘j!–¡A-•ˆSïðÈ"Z¯k.2¯ÎsÏj yDû@‘Öù©T O^/Ä&"xÑK<åù¬s@§ÉÓΉ¬J0š’z€M“1» ò¶9Þ;}Á<ˆÈv8`ïŽØù 0&‘fS¸Ö»dóLddG~Y?“µ¼¤PWKl.²l`HÊ?Nygëñ¼ÏÕeI-‡hýÀ½EÉTa3g$Kb"6¸Ïìѧ¶µQ¼˜HôXìØ¬õÁÆãD×ùSÉøl”ß¹*„ Ëì$Q šZ·óüpï Ë‹:ôñ²PyX¶Ô<@¦$«xy»Ñ‹WÇáü·WSóª{²?;âÝŽÕ]ce*'„¢eþÈîš×Á¨ÕÍ7Ãý-Ó…~Œ)06‘cÆØP¤»Óî)‡Š PU¬L´¤×Sâ¿<`ˆ/Úñ[gÍ0RÊ&ȹUÉ”u‹svôPÝR‰3i4Ø2N¬Ž¥_2úXuxQUAvdáô,r1ÑÉæêʾdR7æ‘{΋¬èÜHÒk:\nj@šÎà<ñ‘1eÕΩæŠ% ÒŸiâ‚ú©ëBYs ŒY®f3­_«¨+kcÑUl[KëÛ™bYû…óiµÞÖÞ¾:-Pº+\àš)_ÌÞ¥ïÄõaC+v ›<¥âŒžÏ²·ŽÝ‘0}Ú¸ó´ÏºVé‘G¶¡'Î3ZÛêªÃôÞŠƒì$-âÙXý5OƒÌ»3‚+v<éDÔŽo¥i:[¶59gÿã0„\“ñ ;­zoÆÆx|³6¬©Lœó;ÂZûð(…}Ú ! ‘o°m*Àì>ŽkVI™ÊO1C)”¢¬r"ä1‘ÇF¯ª–Qå‡F Åó0XÀý:yŸ2Ã:_äj̈$Nƒ)>–ذŒ°ìL„í¤-ž@rýÆZù¨¸ÉÓ­R†œxq°ÙJw³¡ŸÝ€X݇uÉñZo8¯")ÅêŸÅá]r’äY¡QbHÐ˾ ¾ÆŒ°Û£1)ÏÜDbJ¨eÇ»“Ïè:Li»ÕW»SÀ|Œ fSp áD<ˆ7¯Y EHˆeÍªŠ›Å†d•´nÖ êÀ ^”rúñAYŸ†Š•ºõ¼+Ba=²;¤0‘ƒˆµ'‘fÌTZ«pðq0¤inÛt[‡Âªî"›E}`U&eÛukGE:꺧{§¯ºÑ$›œ5Lf™µO¬éCÈ" K<’%ÞZ³ÕdD[ò]ÉmÞ'fž’‚§-ZmBç—PsRcd¿H©dÇöF‘ +$ÓÆT±5Èæî»|ªyt‰s;`xtR\®g]¡à>‚ø“ˆ‚¼e϶ bÊ—a0T1Ò’ó28Äs§iQÍnØæÍÂ÷\Ào¶Öþ½°±‰å°AS³ªk=†ÒI¸³q … ·à=+LñoûgÔ´nníAã´¦Á¯Ñq2;kŠâq-@d¹ƒ¥ÈÒg¤–f…`B†G†‚“£-qîXÜ“‘n5¬Á7ŸùÑãNï˜gtHŒYYø#±3ŸÅÏ̳P‚õfoaAn¨à’Ï3Áõ&Ü«âPÒXwÙj‡ÁzÄ®u£Äë–CWSàˆàÁC(Ø7 œºyèupBgiõFçðøÕéÉ>O©êö¢¦ïÒ±¹e=¼MŒÝn5µn²¢¯'Ñ=ÀÁa$ú¡^öH”ll*(€(Ò.Ó2­”1½f¹ï^*ê•+Жvú8ñ8Z³“£#N`0K¨u¦ª·öúPQ”J´hQ!ŠMtÒeA bZùÙÿ†=å¡9ìg?̳©UúË¡ä ;£³f:¤ãóôbÄÂ#NM'ªº((í˜WPd´[·î¼Wª‰×Ø‹ ­`s‘é'¯4EØAçe‡Ž \:ߘ3Ét8¢ã‚aaÉ:$á• ®æ NëpÔ8DÜ ¯&éû¨ÂD4³óU–ò øäx^ŒKŒ!KÅoG‹dÏï¼ «Î— 15+’K¥Æç”rÖbû‚ì@Ú ZDL‘ª5¸h¹Ê燯̉íê(=|!póàËÁp‹ -Ïa,<ø9£–[óÿÞ ˆÇ©¤sá_e÷Øöu¶dI(‘ý@š 8£x*7ǃ5HFSj–zœXF~z¢t°aà÷DRœÇŒ¸¢¢ìÖìø&Â>®îÃ<*0~E¢:„Gh"„Åþº}Ò…àvd ÷5h¿àn¾ÒÛ¿âg÷^¾8"úÏÒÁZzQs‹yižg:1ϲ÷<üû—tœP–2@‘º¦Ò|ÓáÍtv¥:‡y?a×[™ùò¬É«‚ñŸà—T=O²áÐì ®àØQ¢Öšb‰ÔŒþO¶° Ù™½'‹V£u¼Dn3FÄ"Ü?ÇèP‡Æ&I/.«|Ö ãÉ€q °,tœ/Pi‡/Í Hç‹sSs™¾ºÓâoQêª8l·ÍÞA÷(²6ëÀ¤Ò0+Öú(:«hÆÆw>cã™øîNf4<ø&ù£ßwý¯z]›ÿK5ÓÿŠ¿ ÿãçŸßÛù=ÿãoðºuþÿ9 o›ÿÏËùw¶¾ØÚþ=ÿÛoð ò?†„¿E„ÿæ_Éÿzç÷ýÿ[¼N/½=ÞÚ£¼˜í5ŒEdYL›ñÛ&,Š8n3°Uå‡[æ?Ý«ß_ûº}ÿIò/©ãÆó{ë‹{«ù_·?Çû¿º³ë^ÿïÿ) –ÐÃi~E³ä‡BÄï·ˆtÓwX òù,íÏðçwÈ;òÃUmCåwóU§»g¾j{|trjß{G5$Óí=­S)9É¥ÐõÄÕqPÛøŠ.—fÃ&šéÍã â&šÛrh÷½Ë8ïõDs3 ß·äg$ÀôTQôÈT*T‡kz›ÝÂÐ{eo1ϲx€kÜÞG肽/ømµ}á{N÷ž÷XÏoðéèÕ©ýø‚8££“ïøóþ@P ÿ寑$wþµ-7‰ÓŽyÚ~òê¹:ú |I¾Ÿì>=zÙ{Ú>ØûŽÚà÷‘©nµ¶¶«:ûñlú¬óx2W4+Ž¢Æ^%ªáeÅ®%ËæåÞ·=jÇ ·›û÷ópÃc[kÒ±ºþ¡í5ÙQ½¾k †ýCw×<¤“t}M÷Ö5O¦óú‡ÖžNüõ}¾æ¡o^ìööNÚ½ïŽ^ÐÐjiwO»Áèí|±n¦ž´o¨kçþºaß{ú´wz dïŒøØº?i¿<úºÝ{FC¹æY~lÝÐËÊÀ[ïèYï ÂÍÊ\7øí“ø+ÞÔ·û¼9À”¤ó+(öQ6k57Ú‡_ÿ¤ZÞrD(‘†?\apšƒä|aó0ï[RÞ¿k[²]žÒÕ]¾î©­{ºÑ݃'íÿ¯½zÃj¥ç*½SÚ7½ý½ÃãÓÞ“voOïï1Y¤¹JŒ²GŠN õáð$¢ì@£™€Al¯’^ÝÝÜ|PXKwø¤Ÿšá‚zÕDÚqEe¦cæ=*ÀŽ2§‘É¥áÍÇ?q¹L;dl O3Ü÷|Kµ4HÀCA&émMü€jÒ¡©}Õ³ÅÍ’ùb6)W ×qÕ¹án)™çŽÝ©üÊò‰ErÔuÍ>e6ÜÉ#ï®í¼´å™: k7íô‡ÚÁ Øù”ÈzƒÇ½òøOÓ*ì —{]"0½ãÓïzÏžrëÝSD7ù±ÊÃ[Ÿ² ¹’úÖ<Æç;mÖãv¡2}Šë[ÓD%ãþ±`Öu‘63=R¹®/ôsç°rm›íÏkÚV(ü“΄äìn²3xçM’+»éjyæð̨Órúªg·ž¬IÝ{âÅúÏþô ¸cú ¾BðUž#‡ 3Ž>GæŒÍu=˜ÍÅmNÙÙYô‡?`C3k¯©µÎ}U>8¸_ ‘»C üwËq_½Ê]Ïb©a=+UôG´{ô¥7ˆ/.h9Y;ÏòDí/ØXqÊ«á”÷ûPôú¾ÔöÓÈŒ©zM„¤öÀ:†Vê®4¾4œDÜ ZRàv5ýòA9ìlcΙ0ñï Ár™³Ì1A:ç7P+º­j¯#=‡ƒ§'TüV±„Ð~¶]ô/ mªi>6r¤µ®½eý Ô ¥ÖA¹É¦²þ 7!Ô3Kð¢GY6ågYé?ï>atðÕ”–þ5GºyĹá~¢CÒ½ ÂH쌼ÍÍCÙ{MÉè$³~Bu£ÁkF QìÉZ[Ï6ü ùmÔ2•³I¥þ@cÙØeœSçáW.üƒt‚á6kÛ˜é?È–/¨D­²Î[<¸&ÔX#wÝ ®Á”7 ‘HûH…j zÐ:õÖÙ`f“²!Î÷9Жµ ûcã~˜kžiÍ£a=lÃÔÑWC`ƒxÝ(úE,R?ò"ƒ)T¾¾o2öìAô¦òåâeÞÖ”ï' S Qs3p]*~t‹KT°Øf;§ëk™¬©/­@C-°/P{¸]Aêsd.µ»Ð®£ {å5ðå‘ùÓO×T÷¡¦¥—žaœÌ.€CœŒyM˼v,ù¸ÐËÕ£¡ØSÞ0C¿!­ óUà"WÿYÝŸ,vµn®÷AyM†ãæGi“^&60Bb=d{Âc®mTŽ(9vúd¼[Ÿ‚Õ|“Øœ±`‘cn÷.,Pë¼fD(Ó%Í?Ú­L½(èe3܃WÍ#׫¤ê ¬J¥ÎµüáE +Ô¯PÆò¸£4Da†J¹ÇȪė< N|¦QÂdŠ Ö¿”Ë‹{rŸM:âŽÒ¾âƒùä¿ÍæÙdcS΃usÈØ2T»@ŸÂ3?)n¦ë+aé¨öåÃO^ÿýlò¦Î?ÝØÜ\íÉK›þgqD„»á<Ë4¿ÂÄœ§,UM.òÆ5£ó+^w$ÅF°BaA<‘´³‚[žõË bšŠ"¨E>´t8žÉúÒÁ%L2©ñ¸4œŸ0ˆTPOàæ-$Y4f·Ð~¿1Šülp¼ßRÍ5:¶"\{˜豿hBBð:r)$X%—TÃÅ“U8Ð]I~Éf•/ÍW_}ýÁÊ×´‘s ñ€ÜfѬ!'²ù]#Ë”¤^êM@LügÞËÍwj7?„C÷ jô|kí N¹B‹óœòdØ›gÈfjFìݶѣkô÷õÖƒ‚ñæ'’ç ®æ¶d“å.æ€ô»kÃëv͆EoL‚H|icîü‰J§Æoâúæ^$BüKͲ3…kNd¥Ð•»ëÆ ìþÑÓvÕO²îËt,)ãÜ9÷p¥€Ç¬õDRQÍFz1:d<t´® Ô‡P¹B§w¹¼PØ\«Œé Ùg#V¤\Q,G#'E8¯ì$—ÄT±RRS].'K¤M¨m›Ïx3¼Üû–}w©˜mQ½AèÃÆÑµ¤)Š ]L–“ '`° W'HU‡|©ZpRÄ* …C—cÞƒñË” U¨S<Ú†¹³áÄ“ËÖcD„Œ=鈃½ÉÈÂkF£¢Í•Ù2x(“×t¨TÈ=NÙñ•½íkÌÏ™ÍÍFa‹£Ë²$ÙH·õ@>= –kŸ}f×"“9ËkÜñ4ŠÆQÄÉÓÊCnBŠài Ü8‰E•)—þ…ënX+ÉON¸ ïÔõaôyUÆqûó§¤Á¡çÜO¡Z…vì¾`kÁ¢Ðb%xMým¬XYtc ©Á$²C[@­ÂÝ ùjÑSojÓÏ-®)!°lJ(ò×=änà®y:°Ìž.2õ’Nå`ê«ÂâçS 08¸uûéùm·œ¥ˆhÌx–gÅP#ÛÏÆâNd¹Øðöúæ OëáOAæg@õô¡ÞN9æÖ¤î"µ Yjsïé×ÉÈ\+¼b‰™(Œe™Ñ(©#«q /® >s£G@`4ºþÖðxuÂ’›þü,z´ŠÚ™œí<ˆ—Ÿ~ÿ*b+?eïOeÞ˜(K±:é¶3öˆ4k^¢ÒâøKšÜ>#ïÏmë¼RªÔÐŽìÚñÚ~°¶«~¤_“Qq•ø#ÿ÷„Ÿ³Ù›Oëµ³Ù—g“ú—µÖ§õ/7YÌ&vVÂ. P¯R(@²’YaÉ]+˜„ b ¾, þݰ ZEÞÕnÆBÍ-tœþÖÖ7 HîCɨîÉ«e}@TÅW ·Íq"H0ͯVY:[‡—º \‚xÕ½¦ ›b0›­J‘w¨qsþøÄÕü1ãç7³a“«µ›{xÙð77\±%@”†w;«O‘ýÓ)Š7¸4«7å/Z¨-éAïC£Ê4ò(öÑmÒJ…‘™wmÂ@Ùä¸S$·®”¤²$¯>׋MÇ[FáHß4ÐbÚÓ!µM÷'ÏÿT´kF*@Èá\zÒj€wI_ã¬5ʨkZ·žp4±$ `å»àŸÕ¸¼Gò<ÿæÞ £Ì”LÊ “d«îÕù†GÈö…OÚn_ÃìÜÿ\gIJà{ƒü˜Ó`÷V@ÉdÀm Eˆ= x£Om‚·Áñ‹K£3$Wij‚QÑp˜“×BúÔ™ÁD’+áè× ¼ÉI8J¦—8fšê q‘)ÞØ M,§yªùˆ‹Ó‰µµ¶¢¶UΟ ½ÃÉ/zIXq^2Ù‰&÷“Jݯ SšÏ鸖íQvz>¸¥c“ ÊÒ‰GvÅð:ÙÐLï¼|Od»hDåpͪQè—µËÆ–¬Y´ í׋ùeÍ>¾f)ه׮&_2-(n_¡9«+Jh¬4®°®\>z®td1Wl-[7[¶Xž0ý²BNí¡_c•ŽŒ„3 ÉùXrÍöàìö~WÛçò ¯ãþçF­ÕÝ)qƒÿ„óŒa)t1 k­²_i”ˆGíSï<°]¯ÛÇ´áþɃJãúïù=×uýí¶x~(d“rÖXoÜF٠鹆‚-Ö1ëZš< ƒ ­ÜþQã¶ùŸÿd^â9£óñÑÃ,ÅõÁí¥ç†‚=2üİì#{èöh>LMgÉwà3³ý%8.L–ú‡€ óË,pýàA²€øø 7¡’îXÙÈŽ dYN¶Ÿ$ÐBdwÕÖ”¾ù!»¯<ÀÃ;Ô.FgV½<#; -Ø¡5Ç}H«ØŠÆB(Òò©ªL¼öÆÉü2S°\MO@«)¾€Qà±)»'”«¶Òš¾m'ÈDÐ;h]ØÚ:\L°4ü^ƒ¦Œj4lò+ÉÈ_qZ;_ÕªËÂzßÙ« jUSue„«˜ä².uý78á^ÛnEÿjP¬­ä% Još‚9ºÞ»Sîž^á®Ê&DÖÍðÙMª†§]4Ó¦¢™`…O·ù§  ÜŒ @¢•Å…ºd`p8tn7Í„ ‰js$|iƒÚßR·èBÝìòÚs:ÓÔ]“VÍ;Ø{_¿UÐE‘b‘é<ÑËcäS0Â8ÏãéÈ‚X@:ÉáŒÞ2FlÓ³`šE™X´6Ÿ’…êÖ‘i*9_­hq~X$¹lÀ€ž•…»AÜ$‹ôMµªüR]Ob­_ÅUcY ¯-#9Såë^–×*+-¶îšB),Î9=ÑuNfn‰†8/]K ùXí=73´=Âëw“ lÃ@x€ÐŸ \+×<¥Eo”ô”ÿg †-y×Wò3#à¥ùq+‰íÛݤ7x>‹u“-ò‘àÆÁ`ËÙÑ ÷ª…¸\o‘‚U4@Hþ¾Ü’ï5†ŸW—rxwÏ2ÆIg´AùÔb¸Ì%m Âf\á.s•â/¢ˆ¹å*j–~l¯›Ô|gíŽvú“Hö¨m¯–ö.î/`âQ`Ë´ÅÍà͹îî• zý® ™áYÎLÀP¯=ëVê*¨šYÙf=ÁkÍtSÐÆ ± Å@¨ ÄÉß(þëÞÊ!Sׯ·\ €q.ëYÙW\`°ItJÞÅ#"_ªöçë§ÒWséb‚¨© ‡PáΊ;ª- ´2Ð\~ñĦ‰ë[ôåütgµ~XЉ¯J–W‰ž¬Îwò~~w°Ö¡’òŒ€T"®Š¿¨™BÁ¼H¯Ú˜bfmɳQï"þ$ž]ä…ñüã—À=Ó]¦w û¬xÓÐ]6áñŒ³÷Îgh@é„ ››ŸãdÑóˆÍF2pƒ$O‘þÏ”œ÷Ds™ˆ_™ÂDq"kFžM“ŸXx$± Ô©¬bÍe$g¦Å.«09˜»ˆgÕ u•NËFa Òÿä~äóåºzýl±C†xµp†¹ 9+% d+.¢bZì<Óæ“Gë+/ž¤~QÖ*_!ÚÊî.$ÅòêiˆWpÈã®øñ˰pÙ¯>Œ@ñ7Þ¥ï>°<$žIñëxË+Œô,En qÃUíÁRc6¶D7 ß‰±¸ó÷Ö§›µ×o½ù¬¾qgcûÎúýÅ„E\~t·Ô6!g|¢!>R%Éí@­°6”É‚¦2-R³_ßìu´'èƒÖŠÖ[Š±Þ©}…j€ñ€A/l®¨Á‹‚ŠFÑ~@ðFe«u÷^Å-o :gŽŒ£„W Ê´#Òq2ƒ7µîžOnŒŒƒÑF `-7Ú_*!ñŽý©(rñµõ"’އ<` 5ijqc_Zß³ü³ÍF±°ÝÂ×@]×ð@Kw³ÒH QKý,ù‡¸]#SªQîšHLÏ}YÈZwÁ­pûXÁvÉ-,ÌñZ”›¼(…÷ç»YäÙ X9™?”B-ŸvžwN{‡¯^>iŸ€„ÿY|…9í¹U¯8•‰b?ÒüX×>RžÏú›â¨Ô[O—·ú»Ù¾§¿ÎaÚwh­ƒŽø5£›âD'Úh«¦v|ͰWDÓïÔ¨¡‘rænl˜­F¡¯ ø ?Ÿ£‡.“÷5-"ø[rM‘¸;(jºÈ/kÚô†>Yö¤ÐŸÝä†nÜnLô¦qrÙŠ„Œ…a>ÒJÿàº1a•ѰVùãN•ÂÔ·Lå}¥áÌÒòzYç?¶\¹-­»lôcG£í(êõÚ´—{ôåÑ%°Ûæpïe»ždšæ‘­tFþÉCY4­˜{ºûÝáÑq·ÓåøÌœ! ÄÃeaÊ;J˜ƹ/>â¹k^±~ÿÑü”o†8ÙÌfp–#y£÷u„.'Ÿæ«/”Tôð©ýišŽ§=Úa Ž)ZFö¿Ó{‹Ï—ÜžlS˜ A>+6Pœ]}Vºò)½‚&² Êþ˜—S¦k$2øÀúÓvwÿ¤sÌ‚Oä'ÁFµƒ‡—óù4ßÝܼ ºç€`Üt€+Šrý¸.(½ót²Œ@(ÒùRS`HvzâmÂDç }qô´«—wÌþÑa÷ôäÕþéÑ ]º¡sù÷˜öùêWø±HŸãæZ)\—Ø&C•é'°w|h\ÇÓ·yqo'ê/‡E¼Ò _Fçà1ã:ÓmŸžvŸo>—wó‚ă6@t_¸ÙœÉFjZóf…Ø\;š²>Ðñ˜#v´¦Uçï®Vžœ¡fá_¨[O¿)ùÆRYä«TùÐm3^RZV¶yÌçlä–¤?n•´Œyi•š ƒ£³â& 8žŸÓïÕ8¯ª’:Þi´ňCën©íˆ Ôœ9§®j¸D_H?‘„v ‘Ô€ä:L-¿þö0U´¿n2`|u&’™óõmIªQˆ"+7Q%#Â~2Xp: v÷¬(¬¯”QK[‰ä[\Lš.¯N¯ÐچƜ¶Xt¾œP$pFzn™gLr5‚I¨Á ±m+ïeކÕTô2E‘2LâìÚ´¾ ÎÍAgÊ®K5qŇ´Æ!Ù+#ë’’(þ|>J"^êr¼ßÕn„õ˜š„žsŠN@‘lô与æñyÓæ•¸0Aådͼ´æy˜6ÝŽQñalxŒ—”NT7$ûÀÕ> ‚ÖÍ!CÃô=6ö²?JûÂìÚDïú´;ív6Åų8§~“Ìû&Dé«ç‹qKÉ‘s~›üm:¥Ê-APûA˜²û-‹ÈçÖ½dV%€ÃÞ]ßPA0x˜¤ˆó–e`; Z-dV4°o²œ$ùwVhX—io) xn}¦YýÒ°ì`ÓÇ6ƒ5Tr1ŽMÏÚAÏ–GšÚ¦-Jxß ² ³KŒ˜~.fú"9!Jß‘¸näsœ+*Ï$›'.€Ä¥NŒ9¬]·‡±©F„ep¾ÔDÏܦÎCåÞsñ…É YÇÆ¶Ç8ËBEÎeTÈÁÆý1'Xr’:â‰À˜JÒæÀj©†ÙHÖS-þ‰ÊæpÐBÇX×KùšÅt„AäÓ)dG:©#mšñcÉ9ë'ÁpÞº1¼ Ò@å‰. ÝÎ"ˆ"Ë0¼ˆé<¤ä€'?HÌx6ƒed7ŠXÇ'ÉP…'b^2·©·mê<ÌoyëlƒÒµa1‰lN$Çñ>yØ<|lä€+_¼g"Z×M/è8ù¦€åä.²æ‹ƒSp°I'Ü(»Ú 8Ǿ8þœÌšèÎuWI"sñÜ*5!Û²¬p—»Œ ¨ $§±Ä㮄‘$}>+%/ ›iô8qD%HSЀõÑr¥l:¼·eƹ„Ç09ÑÚôÉy-s„`íÅ ™Üüz ½ $%ädÖ§Dã(ÚµE“ŠÅ¶³ÔF_Ó¿þœHµAç É'‚œ5d&i™uaCS©áÞtG"„ey"ÍgSâ]bi ·–Ñ¸áø´ØèC.áFÄ# É꺲««á²¿¼>~ü±2÷à^*¢Å gD°†%8Ußcåpê×/´Õ@ Æµ¿¬,¸à´°å–—°0³$8Xw5ÂnØG>é"qVîç–œDÀyfëI4óŽH˜U‚6`—µ@½•¡œY޽¦Yo@%o€ˆö8£Ëaš/¦ÓLg‡%|Ö3.á{R颹â:½×~8š?>Ý{Ò~x1\i0 8ƒ‹çn5}šïj òxi¸T¬Ù#é£"hßÐá'éÈÒÐ÷ŽˆÂÏ+4%é\³;Í%žR{o» úÇ‹³?ZœÓDÔ*{ÿˆßs1ÿõùà4íÍ&—Ée]³\V`<Ö^.,”6‹ÏA^ñ”ãsÇàƦ@s õp,š*9J'~Þµ:â{øF‰ý5¼Y°I¼C¤”Àã=R$›®%ªL t­ë{^ˆXk¬½ZèwgØPE›Ù’s1ÛÊ~YÙlò1#ÑY\™s$ 2ª¨d*uUp°>yhss=nh*Çf…›oH”7*í=)¦¸á˜ù+Èe¯cRжHní S‘¤Ï®ÛÙN†øÞFØ‚sªKïw)s–Ë4l¸VáJ¶Ï&ü¾s†Ð_þxX‘t-á³6q7çÏR€[ô$g¥ÈM+©õ\2^Ö,ãD»9„\÷'뜅mG= ‰Í¢r0†ÉdXÍaaFT\Š G²iÖ[–¶0’n˜Ê4¡–f‹iEQ˜ü¸j”`”Oã¾¥{+ †3Ý7œ8 6ÍZBxù¿|šº|¢[>e"5ö‹¼r¶õ~{ tƒš7é}æ"X.úz6‰‘L7¾Xä­ý¶½ƒàÖíÏi?¡ÕÍcÎ: Æ kq"ãÉbÎÏÛT æÒ˜Zååx<þD›@ZQªx›ö¢ïÊ0•h€üJЀÕéˆÄC6ÓŒ·:)|”ÙE¢ÉŠÅOиZ­0÷²BÄÚ@ú’‚}§Ú4a§GtŸ.f¡:ÆÓ¦Î0 Vð×ÔÙì¦) ¢ÔW8àŒ$UîxL¤ˆØhúº#¬ Öº-ÁM­¹x3ů٠uËP+ä¤î³IA`Gú§(€u8ŸÅý· ~#i…˜€[:y#ýRÍWŽ’ F¥ jþ®6͓Škº„½×ŸÅ ÇÕk+¬’P9u†…Dp©¤Šãh;™órà Û¥V-̺•ÚfzÍ63Va©7¢Ô!ÑÄ¡æHÚa7‚­íY#FÌM†‹€1&6ÖphÛ.ÕB…p#-­Œ¬þ¾3,É^ ½Íf€*Âq<”}Df]ä®J‚bý`’gch5mfQyqýê.Ç‹®»Z˜Ï=¨@`°&—Ü5qÍJu¦6ÛŠZ:!~Œƒó¬‹½eÍÚªÍ-i]@N VäEKƒd8Îx?™;B•þ˜¬HÕó$NJAò<Ú£c€XD’<œ³¸ÒÝyÿ2á`Æ<íLξ¥D ùÅ6æ®F³Dì$2ñ.`¾"A¶›{Ó/9ì ¶¬èbAô€Nã@ë¢á¹ÂHeˆÅäb½bÄú5eñ”5б0ú¨ox‹¬Á’D9ynRZEÅEí˜Ná_Þ:UI`˜\…à¤JydJ2{ Š «>T¡wD ¼ bþ„æ€!SL-9"o±W*,àÏõß²ƒ½—>Qv§/éŽÚM=¯¯:ÞÙWåEŠŽPw›Êú›¸ÕÑ¡ÓÆ &¤œ`~•‚ømYÉ$õ9[t™xØ·‰‰1>uîÀ>z‘L’™Õ3¨ƒ:SpL*óbM' A1Vwtå$‘ý‘)BTZbW¢•€ÃŸç)ŸÍׯl­5W‹Ä+Øœ´ÍÀ0%²]´²a?0áQ-fV:6[QL…¢̓/Õ6PTV¯‹¾R‹ívž¿xE¬+½wO½ÿíUç”/œ¶O^ò‡ý£C¹òª{²m?ìÈ6£/ßt÷_4 ÙS¹tA¡ât¾HAÚ™+¶Õž8ʺ‘ö…øE6‰£rYkJ…óñÀE]oUØØ+¨¢A‹è¼U»jË)žØ¬ƒ-n·¶©…Z­:§^-G)Ô 3Ñ` V/Þ ëYAD]{¹Äº|Ì;7#‰&ôÐê’ÂŽq¶¹[Ð?Ÿ#8ý ŸòºYÎêPªBä[åídØ’\–6™¦]%Z<\Œ"4j”]\ˆ$>0œC€¿¿ =O.ÓÎnâi.Òú<¹°D_æ+bÃÙLÏs1l²›2Uëùoí§‘3 ;+ãÑé‹öI`û^±s‡XºµÊ+  ÂPËt9 ˜®ªž³$ Ö•óAKÔ:ýYè_éož #²cM‹¥ƒNIž\³ï4ÿ?²TM#÷øXJþÇø/ÈuV,’¤{iò‘K.4Jᵜّ=«RÍd ȹ슩D׸X{¦6%Âù.è©­Ç­*öipZo’€cç¤ÉÞêW8”Á(§c óc¦Rx¼ˆeFĨª–@®æãUFSé’t| +¿!%LÆZœ<8”²øUÉ[z<@\:â­cW¨URj½æ¶X·sÿ~í={"Ч¸SÀÈ È‚ºkê3hpS]x1BQ´/„Zz£Æ·¢Î‡´­V<:*ÞwÃë¿KU¸xëR1ΠtàÖž…%úÃ"lF‘–yi‰Ö‰"äyµTϪ—öò¯DÂí'ñà˜”…„ݨ¤Ân³Zx,#t§i°+—3W(ÔÈmŒ, âkšĂئwÖ~Îö <,(YÚØ*«¬rDñÐ>$š•÷‘.<»ã]—‹R@ÞDþLw>¸…v® š±ß| ¼à{#Þ(w°¾ƒLfã˜Eú°_.E½=y¼P_äÌà꽓IˆJhE¨>.è ABp̉£ðW6To™n"ûIÙŸ<W[j6Rk3ZFM¥ªXRwN¶rd ËœCPõM¢•(Q¸… a1‰¯â™ i..…³œ Î-nÃåkò!/Ùbjüwçy—ëÙ9[¨KbCȧžˆ‚-Bë7²“cϯp†,´ÿ°Üë#!öÅœÚq"Áð‰szi„md¨]81ÿÃÁöÛrpá4`$¬þ S‹cë|0H]܇Ó<—%]sHÙf‹gÚ,í¿]ÖY5ž £5ív#\Bdµ\'‘yçï.“7ä¡«« Ýé< ½ŠV•“küO·¬ÂÄÀ1R7˜Âí6Ò¬Y4ž¸=«²†c\àÓ“- ‘n­—S®q¡©áȱ+ F„ë×–dŽ›kæ8é®jyµðòÚ"ÙY˜XžÕOTŒî+¨%Ÿ,k/h×*ö¾æ;,'ž´ä€ºë=uùIþÍ=‡c£ùõé"^/ȉ¬=/ª«N•VC ^ÂÉG.4CÛ+ÃPªŒ(($1V˜»,GV—rO¸å ÊŠxK{jÀZ‡¬‹úÕå-p.-Ú]P«tý!È Å*õ[e}Ͷ98úÆ´¿nÚ.§GûGa@Q#ÑKšêÙx9Ë—¾Sjý´Þh" é™Úz/r¸ú¶LSHÀv†sc5+i'(d]èxÞ‘VÛÝæ9ÔÍ*})‡`w¤By‰89ÝŠ®¬W„ÃÏœqYÜÈE“g]Ôsftÿ \½˜®âTsáÆð,ί|3/éa-G4$`j',RòYûd˜Ð2·]DKÓãý$A6t6½M=N=:ÄÓ`cu ©Q5=êMgëZå(7…4ÖzËDu} uwðޏu¹ñqâÖ™RÀ$²_¡ÝA–gq±OÑ VÎþÄzt´*¢o/‚àì]ÚrïW´0'(/~ëä²¼eªtÀ'n´syz`݈ÌÌÄk(i¾ Û©º{¡˜Ü¸ûƒ»ÅV¦³™¡ÛF2 Šm€Ó’² 6›x°î'¢ŠQb«5Qké—)QëŸppŽ–@å7vÏ-& â库>ÔÅ‚<ô5–äÖ `¬¯Ô±uÕ àê rž\¦¡7$o–Z_=ŽÊ,n=r¾ §rÏ3 X«Y㋜±$sÃîŒAç6;‚ŠYI=½­$–ÞŽVÒFïD+I¡ïF+)ŸïE+ ïG+éš?×VÜ”y{ç ÛÖ’/ïÜצޔjyç¾6þ&Œžûw£ëPr‚ê´ƒ7%MÞ¹þæ‚ò™]Éšƒ7w¦j“Äï’œñÔæog6òaOÂð^×;Šû®MR„3AçÀI¾î¼)€³Öt¬á„(é†ñO5öŠX6$p,éD"µh/‚´D%y¯ð rä‚“n¬zxèÆ±Àºåƒe)½KMµåHg­WŸ$¯ˆh×’÷1³6ÇFIÐãÉÛ¢M®[÷@=¨±¬?¼fœm8/Ú.›_™^1%¼ž64)e‚o˜i±œ¨¡Ž=™üºsrtø²}xJ²“ôÎØx:¿¹¤"W’LÞ¥Ä6²Ç¶Ó «Zº ¤!ç§+_³òÆ=G,° °/L êvÇ6¬Ýÿš3š^g<ð'Sºób/mr.èxïôÅ| :½EÕC< %¼±Ò3k…¡¡ÐÀV´v Ê,Œ†¢+•*±Fsµz ¬Oá¹>Wݶ|jí~+¬èÚÇ…DWC½ÀÇàòMJ»¯T+áíþk¬£Ì÷Z,ÿí:Â'¦xÏMÙ™œP;RN¯©j/çSÁ ¯3åúË~¥âRxZˆÏÊõu‰¬ŽEc]tÕ@WæŒÅð=Ç$Ìo@ çe‘±*À«Iä ³Œ–h–WÌ ¿®<›*ü# ,d¶_Û@jqi.öîÉI{ﯽý{'̲3oêþ,~ t'\ÀqÐd«Êlø[S®5Ùôbƒ7]Ø/‹B­OÛO^=÷ó‚ZÅ•HWi³ÉæDSkÂoAŠ»`YÕêl†ÊzèÙ©]hÓ0+l³!déÑD@ QÃ2EúT3‹8„ÔØÏx„k}@ 2ET7£ƒ#n‘:¨Ê/ ¶¢\s¶’«Â«ª¤JfhÁ[Dë܆ͼèÀV˜ {G¡ªa‘sÛEH‰š»öWÛŒª' ¶7'¯1¾ßtN_@Îwg…öOMXá¶TýB|¦Rë$Ï¡;k7–úõ«éÉÜýÅ£îl—û‡¯Ó÷A¹ÅÙ3€R¡ª9ÕÁY&ٞϒRuëœó ':gÎay LÞåy½E5ËLö‘*êjæK‡àêsu/ÓÎ~Š1áÝÑ;vÙrà Wù-õxªç?Fؤsæb'¶ðO¦>,:O¬¨@=0^*}¦™¯¥­¸xቴÄá9¢´tã)|„uËu:ÌS¯÷ôîÖŽê­bz]µöÖGK‚Ì5Ñ#kâ¯Ø ¬Ø!ë u]ü³¸Û9E±ò°Š ÐT×í]^Ø\C Tk)Ø`Ï“žØž$ýÄz%ÚÌ9 Ðu`Ò0<1÷û‡Ã,Ôí‘ÓðcÕ³IgB†’‚>veÂq»mH8>*Át5 µ»õèÿü¿ôrpdM àûsÿ‹­?>ØÔyÙì'“<›õ6Ú/¨c‹^_|qŸßéU~ßúüÞ½ÿ³}ïîÝí/¶vîï|A×wv¶¿Øù?[ÿòÞ®y- ØR•³,›ßtßm¿—;÷¿äuç“ÍE>Û°¶?ÝDZpYEÄXûs„Pãõ˜‚!ŽŸwE¶´ç… Â¥3¾¼MþÃh:Bæ~6ŸŸ}õ¤æ9ÕãÝíû;Û›G'û©uåÕ*C¿ÂíCDA‡Èä¤û·SMì”S¦ëU€1B-¢Û ‘EÞp–v¾¤?uNÿ²¹±ýþ[ùo3½P4ÂB‘Œ5øïœÿŸ½ÿ[ÓåÏ­ã–ý¿³M{¾¼ÿ?ßþâ÷ýÿ¼ÊûŸqüîFQ¥R‰bÆ™äP<ŸœVCÊŽ^rˆ+ÿâ€29Š€ˆ5[x¸²…i)wñÚMaSÁ¾Ý¢ô˜#naWÂ3i–€æ á‘ *ÁÞ~Ìrº:4Õ21«²r0o©Þg—é=×"¡þ²%¾ã5ÿûëÕÞÔ#¤q]ÿdµU­»æ„ˆîZEŽB0CRY«Û»ZŽNõö£(åÇ 3‘³³uÄò³ ¥ôÍ/e©~dFñø|›÷»Tx q}³êµ³Ú0³ê™#šôõ}™D÷ÆÖÄãµy‚„œA<gƒt¸Œîü¬–`½ÙŽîÞÔâdGñEþˆ àþ^·Ä"]Fi€:;Ã傼}kø6›æSó>«O›æ•yhï{Œ¬+“]³HÐÒm@¹=š&#Ë úÔšÁe<ç4Bt·€82žð.-ýd~4»8&:ŸM0Œé`—wØ]úÒŸøÏyð¹0"n¸ ¦«öÿý¿ùuûù`Õ^:Q<Ï_RÇ-ç?ÿ«çÿÖö翟ÿ¿ÁëßÊÿƒý?”䪷Ê.CѣР\0ú¯‘„Ùô€R€3ìѹӒlD.¥Ó6ªÖ9wXËŠ\¸¹Æ`îìnÇtz·<Þ/:é_NRø×ËÒ@ ¸vö'<Àšãà*D¾Ú$wƒ ÎìÒíÂPè|XÌÔSÁA ÀÆ|‘¤d£dŸX¯×ÝèÚ0}#2Ê5r‡Âñ­ö) ,ú«…ãçô´…ê½×í£GaŠ&âß8üì³BjïŠVA+ƦˆD~⤔ÑÉg[CrÚÿôöù_ÿú¹ôÿˆ·ÒÿÏwVõ?÷îmÿNÿƒ×GÊk©Ÿ÷<n­Y/ÈXNŒæÿÉ,â#ëcŲA2,HÅ‚¯K­£ì<™C1 ‚H*•ƒ~Ú‚ã—he¡º€pî:ñ _áÿ·¾øÿÿM^ÿ^ýÿ­€âì_7Å/"šƒ¥x „ÄÄMK«ßÖ0ƒ²î‡CMASËhc-‘\âZ«A¥ÆnÆDÅÅeƒ>¦*ϱ?›,gô7Å'^VÙ­1OæSⰯπvO[¼¢zñhÔs¦ìbN8ö ù`þ$Î!:KÃç"Qq#øqfhn.àdïðéÑKºz°÷WÓ‹{âTÉ>zxØœZˆoŸ#øÍÉ*¬©ŸãÆ7OF4 6W{ñm«µý)ƲVçMmÇ6ÅIž³§ ±Åš¯ˆâj5çz>òƒk¨dáâ6®d+¥Ü±Îœ^Za¥P댒¼Ó7`›sSó þ¯^6õrœöJšè2²}Ú]S‡’UÇId/[;ØæKSQ"vk!ûæ.í^N‘©±ñ· ¸]7ûµ^ýÃjðy ò—P„üü%%”€É~I%º_RÄZsàÏ,c <º$8»L‡óò÷ÚíYãø0ɱÇ~A ¾#˜œùŒÝI%e· støÖØ)¿¥Iò÷×oøºÿK‰Àôç¿Bý{«üï‹»eþoûó»÷~çÿ~ƒ× ò þØkSy©ÿ5rü/·«ÞÄ7ô!3ºÞ†j*ˆû¢ý÷áù7Ë“5‡¸Ø°˜¹`cÖ-«+j´é+lıêr³×ÝïtìÉ¡ÿf“&ƒYpȉ÷&ž€šçý4µu Ù`,7W={¿µ]µªŠ-¹¡1‡­'­]zXž/"_v„7Ž cêãR|ºƒçqð¼ õ$ËÙ§ƒ'b`Ë.™h²øPslukæçZíAqðÿo´qÞJÿ‘V¢§¬Ì/¬ãúo{UÿË6Áßéÿ¿ÿµVþÿµ €ã£nç[óÃUm×râz+6vw»£ÅlZRÜ1ß$è ÜqɹeЧ¯xÇ}¶ëD‘¸F›¢q›ª¸ã눈°yÊîpþ6Ÿg¬æk¡Z4¤ ,ÓUÈ%"C†žÅW’ÚR„ò¯l@å£bªõ﵄ï!¬.ý·Ÿ0l Eöï#³ý@>Óã¯åbsû^Ë>ûL¤NJWî2ɦÊÝ®†¹¬éç<™÷l°ç#é1qzÑMæÍÇÈNªÐȬõ5›¼†~ƒ ¯ lïÕᓃ£ý¿6ÊE×m­†ã+û¬hºk6>!üÀÉÞ°Óñ@ÎÇS…KŪ:}yüÁüóŸú¥­ß*›tWåßb/~øðéÑ>ÂmfãhV ä1ñùMª…ü&UÁGñe«ÕЍÜb+ùzøÕ½jbe‹Ö欫œ:gCòæàƒdµ¡O.}#¢ëÅ„èØ7нƒ‡ÑáÞ´y=66Zó÷óнÇ*¯I[ì öÇ~6âßlösiIÝÞb›AF™ ­xIáªû³8¿„š‰Ö±†Ëd“2ˆ} Ãf$…­5ßvßÍzدlVR\µŸvNNdÕ¼KÍg<àι›ÿÛä›<ØÔžn®þ¶¿)åŸ;·V±·¸öTl+¾’†GÌ•”mï©}E+µçgI ô‰{ßóßr\þZ¸‡‹ ÚK`´ÂYÑù"wçl¾¹yñ |õï N›+—éꆽÌôFOìçK…Ö˜ÇfËÿn8«û8Ÿ#˜_3$AÿÆÔ\D»i—Ô þi‰4YpÀ7p÷åÞHUûˆq¢©]7Ðp³’>è{©[윢¿èµÏ>ÿF­Sf«yçÀûÎÁ–ög’ÍIòngWúìt‘_šÒÜ£+JC½K¹ Ö BH¥Ž5ÝÔ·ÛõQq ék®-ú1hÌkûÐ{— ñ´ˆ›|=ñ©ÁÈ"A£ÐÕz@X­úŸæi~}üëVþ8Ÿjå/®ãþÿ‹ÏWýÿ¶¾¸÷;ÿÿ[¼Öòÿw ‚M>65ÅŽ¼ºŒûo—š:Y´8’¦Z˨Ÿ¸  aQÿ‘ÙòQ¥&óÝw£ŒŸÂ°B|&Ò\0þé8›'õ5Ž’ º‡–­Ìõ&«KG4·¤ˆ¯Èö5Tl\E ó•þ a(ºÝÊlk<ï1^ªuªƒ\ ì.í5w­Bߨ¬~±Ýá+ ,bzD4¼Öð óè±y]•®U¦t§ú†Oá‘ÜÈ÷ñX¬¿ AÍåâ`ï¤ö¹5ÁWb¥tû˜+§ð\ýãX~:Q^ž áŒG‹1@u¥èu?–#µ¼©yQRõÅì×Κ>Oúð–³Àt1A U:“ù[’±à8º6؃ügg­aÊ‹Wr;‹­‰ÊU œÃEY°—0s= P¹Þ•ÄëzÝla:û“K…[¼õ:|Ý-6ÐrXwf¶¹ÝSŽP^iê GÙÅ"‰Ý¥…ÇcšÜ)Ãû.ž¨ë DN€ý$ܘïÇu¿)ä¸ßÍ¿SY›ký]ïÜðBVªY¶˜³pÓö%¢&1ñ²­NZªŒÃïqàEËéDX¨jU¼,&ÑÌàra&ùÁTx1U`Þýd”›& žýg?ž³}—®áûªìbU³/Ï&› sÃìÖlÍ05ÌN½ %›x]ÓÎ®ß¬ÔÆ³›·«0ÂÐ/l¸Šà:pG´3P߈¶G „ð¡CÍYZ~‰ U¶›ý!²9ý/r©]Ì’)Eë¬EC¡‚Õë­7.Þbž+H‘$ú¦.jiwZ@ Âøê¾¦Éh°¢)Zs³Ó¥‚öLïíãø&º¡?8?k\½‘²V¨‚¤=ò« ‹ ¢ÈeH üñCIâ]ÈùœÙhïcšÒ± †W§XGtK·¢U%ùº­LÁ>,Hb@‚…,’xÎMh?/â¿xÙþ½)+Ö-W™![†›% CÐÓDz;ŠzÂqЉæÅ%’G]{´e0»z?kâÝ‚â‹*Çt üT+NX¯þÚW÷†ä9iÆ68ÑÉ"¾%¼û§WÝùºCŠúš[÷6=σw·ïqøÑ/Ù½Û®”⼬Ö]k}úeéZP•ÓtlP›Dö¶íùï`¦ø6ç³O£ÀƒÂCrm$AJ wQ“‚æ[Øž©µº]‚%é#b´vî¯cêvþ©Åì‘%¶œÛzSi¹"ú>j^½lØüïM7CjH¬i¹<žòq×ÕÅ[S(g¬WÂq«hEZ3ƒta±ÛON—'„ï‘aÜVÃQÃZ Š+R)>…{OúsƒGÒÙļH“Ù®yhky,ï:›vÌ][B;êM볂+¥Õ¹Õº/û?œNGþþ:nþøæìŠvdiºJ¥?« öVØ`fmܶü§ïøÊ3DP®bIjÏ&‚;ðÈB¯›`©¹ÞöÙgvijÉXíÅ(&š1JÀ¹ÁæÖXÓSw(ívhI@°K_MAvp´ÐÈòfð*xÐnƒÈn€ùHõ¼£ÏòO«Àm|uÏSF†Om«~djNõßf|§FDƒžü²öúï›o>­ß©_ÇäL¨ë¬´â7w(‹9?Ùf~h>~½ó)?ø&0ˆ|åÖ0Sºd…é"&ûVÑ÷…þÌû?Û~£–¦(,Ì“oë­³´ö§AüÓÏÐÿü’Ð~ݬÿÙ¾»uoÕÿçîýßý¿‹×uþ?¿«€B\žöBQÔšžÏM§.Ði‡pÆÅy6ˆ—­ˆ“¼g€?F2ñ³dÍb³³ms²ƒÔ6©æsÉ·aFƒq³‚§œ9„Ó96ß ò¬EÿoCÃbj[ïyƒ ‡ƒ­íûÉô¹@ÙSµ1wtoáY’£bTñ*%Uå©j¤DDÍØ-fak³*‹yU Æ×ZaÖ,YT9×À5*œ×Ü’7¶G»¿BqCãªm^ÒE<U€Î$ñ¬ Ж¿ÿH-ÐëÔÎòn®eT󱚸2ªÚ&¢ü3*Æ7Ćùlé Ö:«×ކ–ÝB’÷÷5Vݸg“÷ý„¤•¯Û–t3´÷‹e\Y5vˆ1Åk+Ž¿H­CY¢¶^AÀê™TÑ„Õ7¼Â º)¬®[fI ç‰ùªc¼âæµ›-¬QýõõSñ¦Ô¼7!®…ª .”¢¼Ù-mGUЄûÎjPdTðsÐLžÿŸ±Å¶ë噵2×Vë”5"éB. ¼´H+¸BoÆ­ ¢qÓšÖjýf‘ÕZÆ¡hO(8§ög4ÆwÁ/^º¦¡ЦuÜ»U\ßáï-b*A¾½ºçö8f^‚¢žáyS2h{ÄÊýE QõÂ3üÞÒ€å‘OõMÃTÿÛ–fäf§j>³u|fªõª,yþ.óRÒöTÃq®"˜ú§í#ꢜšiš[>Tÿ§è~ø€Ç¢ð“#Sê®[ëV÷SVýˆ+Èmê‰ü É]¯·vwÞˆ+’MÛÉz³#¿”… vç†9Æî.“ùªÆ½‹I ^  N¤°Ýgu’Û¢N²Ú¤P™¤Yœ Ûa…dád©û%ª=BÝ’×">{d¶?^§d ”J¾Ä v×½îË0a€ ê¸Òiûw¬z×ßú›zyge—Ù_NÕê™ì i‘”ߣMAŒCá¹’Š©jǾ0XáÓZîŽü(dÖßwWî»s;§æ««Þ|“꺬ª‹¯xˆ²ºÉ.Û7¯ñè§;oüë”]¬ë27½®¯`çSÕ}ýªç¡ »qieÊŸó&cÞ¸_÷«-èÕºµÌY°àncžT•Ú£ƒ†\µp§ÖKûÝ/_H/=N0Ýë1—Ýë!cm¯WuÇ E¿àS¹µ9Èú ×•à$™Cx\þÞŸq6¨ù„8ƒœ+5•|u£ˆû!$xoJ]¶¾"'gµ?¨³{‹ÃˆÜ:½»7ûŒÈɼZ(ô#ÜFäI:~JuÜì9ÂOŠ9Óÿù¨Ð/õ5¶i­|»—Z 5ó׎ ¬p–úØ|ÜyÃZ`áΠá×À°¼v£Tr[iö¯ó\A|”µfR7¯-î益ð+KXè¯rdÑ-}]TVñBxëª3 Ý^>¢ \ãÒB=‹A´[Ë)²÷~ŒgKq!Z'†êª§JIéQ]d‹OÐ:šZýk´¡GKõM€ 4‹‘۹˞ìmŒŸí_£¢ßÿ}qn¿¿Ö¿nµÿȦéI„Ê/Aÿ¿Íþ³³½ýùjüß}Üÿ/îëÚ×ïöŸþϵ¡€P¶MÃÉ©"Y»|žŒèŒ ‚‰¤£ÈV( =âKçÏ…bà kš™Â¼@ÔÅê4ë"µˆÆQ3Óâ¾Y_ÜLé'8z<Š~¢óu¿I÷ÉëÑcsö§etY²JsÂLlë:Ä <·ËͱÅ?ˆÂ-üžü`j\þuùÀ‹¬Ò|l~šÏ@x1o@OïÙôèÛ€š–WÿÏ]°xV¯x`+ÿ¸¹Òj?jØ’ëÚèÈòž«ïŠ›³Y÷"Á‡5Œ\¤õó)úȘÊu~¼fÏ.w˦¹Fä1DPñ4žQÇþ€ ÄÛ»¼Pðï"™ô-òÀ,“—Ø<ØM)UûËÏîìj^d‘KÓVÒÒÜg6Ù§ïÎd%lYAêBγ\Íàwµ,‰¼’/@œ²ŒsPf ½MJrò I’’ÆY1“ß“²®.³‘KÚ`j˜ÒlLÙhpªÊY[Ër:r;l6\ŒQýöÙï;g¤tæK‡©ëþn˜ÂG ÖbÆë­üW7Ší0Î$´N:©óÇ©‚MM¦& „ïP%Â°ŽºY)¬È¦ŽRS[S7+rŠw·´–D#BÂQƒ-B¨iDBÌT7 ™üØD‘§ã^aL=Å\ÀÈ]|Kn³½Ê¡7Ø-O#›jpÃ,ijÂÆF!³”œïRŽCLæ}N)¦ºN×x5¢L25¡ð8‡ ÝÅžMÆ’»×ÀA®-’$È(FbõÒ‘Q•üTƒ¯³$™Ìu€¦‰ ²TpîÌ#®´ìœöPafnœÎMvÇ-õ²€îÆg®.gÖöó˜Œ883w@¹óÉ@&… Ë,¶Âåcƒ!ÙCt½k·”nFœ«t9˜C,ƒ>”PÅD¶4ʰd]ÑäQ2ü:x–êWs-ç|1"jö‚$³àäÒ`·ÉyBó3±YÛÂnjO¸sÝóÙr¼4=?#œÜ’ØŸ…Î4—S §ýåm(cšO!ÙJ.¾y˜sƒÙŸH^p=ñ¬w¹ö~ŽôÞ!)ÇÏûzZ~ ó~7‰ –_{ ^wxý>’œë¦òó“÷¸bËßðÚ…â±îf–ǃÚu­±¢Z˜/‡n8\ÌØÇj]Áó*‰ÇLC$z¦ƒ+à§¶í+gjü“-¸¶U®ºèo(Oˆsñ͌ܞÿåºüsY9,Ì= ·Ë(ûšÕP·Ùj¥kµ: ǤÏÇÇêÊQ"1£ÝÿNDÆ´É[¼Ûr#ÐÃ|Ó#M$;£§›Ę]nÜÏÞ,ã%Z†þØrÇT¨>A¨Ü¾¯dq×Àµ€’!%Õ¼(²ÑFYmo¾:ÏfÌzøÐ#Ñè‰óyJgÈLò˜W°sØàNLÈ#“Çäw÷ßÎÓþÛÉzïéWÓÌê¡3{­Rq 1­ €u­ò~î«¢M±k·÷ƒ5DAgœø HªîN,Û!Îɼ¦/|ý³?¾ØýãËRjüLÝTÊíæ8ž 2söñ=GOBñöùù¤FÄ( vCb›Ä§MU ®š&¹P£ÆPÖòÜ'ÇÇ]}MÒ¥Šƒ a¨ø‘6Ánp¼‘ûA·nla šôû€å•òSºVEŒ2ßPýRj´Ã.  %H”Ú­¸3ud S\;E¼»ÀÜð5ü›UB”ú¿]å?‡–²€äðveø~GPùŸ† ¢Eý ¨è9öhÝxÒLo#âK±–+ºŽ?rÅhh{’ô²á°ÇmâÜ|ëwÍoµJGØ)æÛ+X¯í%ø Éå7ž§âb|cSÁ‹œXËxV†&rÒÞûkoÿÅÞIWââÍØFµ×g¯ÏÞ¼©ožmlÓ&y?ž&Œ÷šWù›ÕgA«¦ŠÛ‘> ªkåV.3ŽPn)Þ›Í×o6­À:a«ËñÌ.´Kbº^‡•½Ax—ôÝ÷Ú0õ™Ÿ~ (·­~MsBÙqk0‰–îÛ±lº+®Äz½”ÿF– Oðpñã6}•(Fpq„ñÏg+Ö0 Ðà» U:„idaåQ¶õÓØsdKyâ cY j9—» ±?„¿îd¶çñ-gîGº·»?ëÔý˜s×O™Ä)ö/“·á¬ó¬ü´nÓÚ¶ð½v¬·MÏ|ß§Ið•þÓÏ^³)·5·éã‹„úZñõU¾—âh‚ÇS_bQŒe"4سñ½í[Y°ˆC³H1>wÝò®Up?È_Ïv“)n ¸ÅrÁŠr–¿EàüÙBn F½M­v³G¿C=%C½Æš`j9Ü…ÖÚì¦eýV  òÐ.]GN€?ý´Înð¡¶ÍÛ©€Ò(Q}=ãúÀf«Æ¯x2ájÜ—½>²X‰¶‡ÈŽ£íºŠÂ'‹’V!’쫲ùXpÖ„PX‹~Ô¬ X(.Œ•õßSÍqxr•~ÿY¸Ï’û³i2‘°ùtš /¦ÚügÕpxWÒ/ÕâÄœÂÕaL;rP@ÇôÁüòý'u¬ÙØ,ë¨èh*k”m2"b©Ø‹Ì2ENïóPùØ2f ™l›N¹nwmC±Bú š6åHUýY˜yLÀî˜SkÑ’ãáÄÚÔ*gûÍ÷oVÃ1R¶Ü¶Lš¶1Š¡¸13+Õ³­÷Ûw«â}û“«ÚÁÂѧ»Mx{ª£ÖªoúR²»¶±]ß¼HÖ>ò²¹y–óÕW_‰ìC&†Œ;•<›Ñº»RK)‹—ó³Zo…»ühÝ//å;l(‰Y…ùlÄŠ¶`ô}÷zÊ6øAš÷gé8`’Ï“ùUB{‚:óÿ³÷¯‹Mdɺ¸ÿ¢§H”RF’/ÜjËʆò4ØÛtu`«ÒRÊÖF–TJ ÛEy~Ïïy‚y–y”y’‰/"Öʵò"Û]ÝûÔ]XÊ\÷+VÜã5Ó ØwJ“Ǻ[E>—ô{Úq3xxß`äàmYßIÜ<šŽOi«° ¾G/äVS"2FA/†W—RxNHažµe7ä4Ìs:3åü½C؆_Uí‰}D”õX›gëîq==Æÿx{牋…“‘râ7>ˆÛ;¥âWζ“ÒΆá7³Ã¬‡ÉÍf÷íMçIñ|¸E3‰`C5m³ëÎ(éyŠ]·vžë`ÜŠ­Tâ®A³—€ Ãå÷Í2|‹ùoõ¹¦ýןŠp‰ÿÿ£äò®ÝûæÿÿW|äÿð-?<Þù¡¦ž*öñÕo5¸^¶ÿVÞ¿_ÃP$dáê}¶†žðîëú7ƒë„|³þ(²þàéj}Uë›bO&æ×0踞G¹][³üÏ0Íøº–Áÿ]¦•<÷ÆØñXgÿIUðó|–<…öb+Œ¹¼› #¦Âhcæjȉ”±æü…‹ºürû‹Ô.Dº}‡‘÷QeÏ£ ¿{—)PÞú›=Æÿ@{ Àµo²<ÞŒÇgIͬï Ëj‰!†:‹¬0jj†QóýYŒ«ú«»c†‘–É@–5ÁÙ\mð—X_pù2Ó‹šc{‘›Døy增¦8gSŒÜÐ]›‹’=°abñ|ŠL'ª¦À^›i ’Þàh0 ÷,ëÇùÏ1€P?ØT«bèïÖ¬ÞA ˜îlIàVró³eƒ¯X½ Áxh™É<ï¨UBG¥â5ÝbáCh47ñ‰ÛB,E2£Û[`ËüµúÃyr¦Éç<—BŽÁTg³˜vA« 6öcHØjÆl¦â=•/6*DíΫZJŸP–ÇzqñgZœ×KKÓÕˆBëÝ…ì™þu÷$³&I$Ô¶âJ k&ÔÄòÃv0lõâ²%n¤MYúÆÕp´Ë®ã°UòËH²ªˆ£E÷—çÀ+L–²Ö JásP2»~ïg’¡^XjÌ= ‹_N³/õJxêûÑG`:7ÚðËàóe¶i+W´á0ŸÐ7å(±ä°ïýW^k¥6òI_˜ow9ÔÄõl:äã–áÈýøIþQ,ÿÛ`˜A¿Èž¸eRS>­Îê¥Ý[ƒ×ÞÃ-š†[p-8J®TçfIý¶}Ë ‡0—[ªHÍ«ö2•Z­v5û0o¿QGmnÅ7Ô(@޽F탋tÝ>æÕ0GÁûŒ]nA\`üŠŒx´´úç°ówÄ ê4ùTn~tõa~ˆ`^j B(`Z{ÿ~•þ:E5ÓgA î/Â7À­Ž­‹¹rÖ"QpõÔ^¤öîC­Ø^DlEäã„«½û|ñÁ†îqÇØPzŠÙr„j[Ëœ¤ø»•6.V­ÛÄ÷Ô>àC#mÈP;…Úï«Q= ãÜŸBœnZÊÐOÇó£c¼%ŒÌÕ ŸgM(s°+0 Öÿ½_K°Œ¦ú|‘£¨Ì2šQɽáÚJxËXt:Ü00Mï;k(SKÍ"jü‹-#j w›>8¤6YètÀSQhë 1¡ÛU§Ÿ_Ínõí7[—T zï:5æ£íG ;FJ·(ìÊè0ÄajÃÁ|9É¡N¨.ÑÕ!‹@6 Ë.‡ùêß¶.jtmFîiwåD¸sLE®G¾/²¹ê‰ÈÖ¡8&'ÿ‚‘ð9ú—zM7Ì 7ö§ÜbJܬTŒ7µª«ç0|Ì{QÓ6‰ÌúNÓó žg=¦éyÏ3~ÒˆYRRœ³ŸäVÖª/¤|M«À ±¯€€[Ìæb¼½.|~Ö>5‚ã45B)Kf1Lúò”ÌäQ~_Þ!Ê1‚¢îRë'Óg>*`½R>êrû¨–cUÚ€/yWj'¥m}ðÀJ›1t¦×”¹¨" ®Z|£¡ H™¢kFWºlnY1¨Ã¶¶ƒCöVç³~óû*M“–ô•çUùÖ2%w–·&žŸÆ¼Lo*–CÇeÉàF7ã¤và›âlÁÜ¦Ê ë ¡=¼ß=ž† FXˆz&/-Â×~ê/¡pIÜ2${å°Y*0òª¥R#ÿñ¥±¬rñ Ó‹F E"N©¯› m´óòë)3=/0äû¢((*ñ”þ­ `®jÿ‘ ŽN‰Ñ?þ3}\’ÿóÞÕ|þ‡Gk+ßì?þ‚ÏûˆÓ>@(%ú¿È ç¦'OS¾·‚í :¡«ªd qû‰5ƒª%¾¿?Ž Ë§'RK[ƒÖŘg -ÔÁ2!&:nükÍG*<o3 Ö¦’Roø l)ÒŠz|Wò»°*¨‹.h ÁšïÊSâ3.3Ù¨=Elq‘†lT×mãΫõg»¯Þ¾Þ¡¯ÏªÅ­×šŸj¦åCæ¾9x]ÈZ郓p§ uíÀ—ĨDLënÔ@AÇ]×< ¡-µ±ZYÏÛs|6áxƘÏÊmH¢L‹ú«Yhs¥Û§Rp«dnw—IN…„C"Ö2ˆ,xgß¾{,KõäCÍ»vÞ1×DÒYÃZ˜XPc=¨¸„/SÐŒèŒDVVbš I}d„5³ dSiA‡²I`ƉhZK–%h~àÎ+1—`áyÏ(n6é8,è £½ó,µo@µÓA~…º§íûÍ3`¤`Z«¿½)•¢ëË¡JúSÈ’iu°¥ÎŸ Fƒ¢'õu)šÎ•Öýû• ¨>i‚ÿ0‰ê´° º#ŽqÒÒßJ§BÛâÏ8ÕB&@?™_Ѱµ¿ýòçíg?ÕÛÙùÝâ³U‰D0a£ãÆf ÕÕUË¢@LÜ ùá›Qïæ"6­#üi9’Áïp¶]`ïÑ…`_ŶS$ ‘ ¦uÅ<F´šj±loõ†,‹ìG½¼æ3§&FL¥+ J£l†!¡·4øj2¥ÛÁi¬‡ÆX_ c ó¬t35ü/‘Aƒ>ƒÍ;qåÏ-íðW–= ætÏ’xØ/‚hx&Ö]Jº eáóß ¾æåôŸÈW:ªËè¿{÷òñÞ¿ÿþû >%ùßSJo€à¹¬Ýà €~§ù"›Æî ©¸B±}Cs»°¥ qíçi} ?º]FH‰D=pÞ¯ht~‹=c‚’ƒî`vnÈànB‡ÔLR@Gjª Ö€tþ[0-Ü’=æICmúNæ4¤8J2¥“qoÐ?_ž”F¼2ôCBìa’Ò^üű0müKB—}ؿԳ9áÙ»cv˜m˜,¥õõ«äC/ ýÇUykŒg[••lî½ü;»9sO{ìå­ï«O9åÏíÒX2"˜UºU-$§4G3é9 Ë›e¿=ɾæx/iÅ…ž/cpòθ2š"Ö¡Íƒìüäb^Á´wš¾A§ÁÓ÷ÿK1Éû­Ö’a1›¢_%9êÿŸKé?Í*ò%}\Bÿ­Ð+k÷ï}£ÿþ‚ÏÅÿ¾,øS0»‡¨t ì›}cìnÕA\b»ÇHÙsIK]ñ¨•²DX·nÃ<‹^|8?ÚpK>ßúñíË‹ïøVÛÞy¹ÎòÍ03kÄN;]ïZ‚ŸÓa  æÚþÈàÍnMŸ‘Qƒ€ŒÒ#]c¢Ioùí™Y“¹äúdQ…öâö;e'¥Þ…ŽA@1^·)Á|:.—MìÀ g†¦þU}ÖÖíT² Ò ;\áã%u¸f»,Z²åÖääöÿõþÖÿOúÃu›£ÍqŒïæY(ÞÛ^3}pöâAâYz) ¾†R„ogîÁ„éÄK7ÈÁ‡ºVï4ï­´î­$Á„£5I ©tY¦5‰&‹)B!‚‹ÔŒÐ¡Dx¤öíÅœÚÞ]C'áÈźfZ´ì]4üŒ‰4öžoï0¡Hßà^±^ò/vûY°Ü‹?-æDHþ´–uמ8Ù¯ü1ª.“ÿ¬Ñ÷ìý¿ríÛýÿ|þÙù?^ƳñdÖnïψ$¯@ïÞ¦!Õ>âwIXV%)#Öñ‘º¯Ü†¬‚xLa’J´nß&\ÃêÕîK|¡õœØ&û­D¿À]­eìíŒþçô­cHÍÑmqûz²ºnJ!Ü"»¥ S5ñçXÜÃeÔNYrt§Ra¤î ! fõ²T •B9‘Á»æðC 3ò%!ÄÊߨқ@{ä$|™Óå ]$G°*¹I•M`ÌÊ3^Çõ?²Öb ©é|Ǹ»™52ƒªÐ¸¼£!†Ä ݰ}¨#ŒÚ2Ù¶> «°V¯–¥rˆ‚ìÊA4{ã¡{XB5 ,iÆš83÷†HH¡Ž!ÌŽã“:¤„Dðüù¾þbUyp{è£;†èÄdÐÄÌû•Þ¿Ú ÝóTÏggéAž´¥‡kxry& l96z°ù²#-Ú = G¬=qû˜#–ßÓGörŸ˜(a*èQ—)-û0ß”Z˜*ƒï¿™Ñ›YᛳÕCz½ ß½kwG³é°ÀŽ–DzÿþìÎÊÚ™è¥Õº ©T Œçkƒ~þð¸àzõ¿Š^\õã¬z#+î23Y`WýÅ—~þ=:¯´@…2'"˜Z­z%\¶¦jÖTÒ˜B^œVÁ»T>ì4åo±€þåŸ+Ò*îù\Jÿ­­æè¿û¾éÿþŠÏû¯Š€É½ÏôB ¶ÝHläM ¸épzJw=›º¨--‡ h¥ jBПZ0‹‡£xVqíÀÆ^h¡¯°AúÌ‚¹á®fÂt[²£«¦!øà¬4ôìÇ q;ÒýnØ^àù}@OÂZT«W0–[lù¥º«°GŸMC1I™ z!bŸŒ{ñZ¬/²Éé÷d¾IK§ðoEÚAtÀ¤]h):h)%§ûi©8”ɱދLʱãrü–²)Q§}ežÚÞÔéõ}¶‰´ðT O¯Rx¦…gW)L¤žÝâÆ2*twÕqæè÷Ô÷^ÁçÕ Ç’Û’_¦5õt÷\ÝÚ«+É©h=7z€’f±¯tH3`¹aÙ´+˜^‰G+3À»2ÛVÖÀŸdåÊš+dîJKÿ ®¯òïd õßçRú,¥|ÿÓ},¦ÿVï=z°–£ÿ­}ÓÿýŸ…öÿFM«eBI0So1ÁYW-—â-õGü‹3zÛ*Å}[ÿrOL$Kh,€098±¯’ãa|V©\—,´DGòÜŽÚA§]cS“f†gê#EÌÀÌmW¿b«DÁÎîÏßKH$³p©SfÞsëRZ±‹™[òglÃÊŸHH6Ôçq“}ÖY€=Œ’d#×Ûs! “Ÿ¨¥¦p™o@ÓÜŸ ?}/‡îñxГw5¶ï$š0|3ÁŒÖY€¾ÁV¨ö¡áykò|ªÚ S¹€I™}Õñ?¦«õìtËÆ €Ï3ŽLD÷‡c˜ðhËl…þ ‘‘Ög¨°×½õ¹(õâh&pÉlFS¨AkÙfAbô4wìÆ/42hx@r(>©z(¡Ye?¾\ÄPZ "×’Á¹Úhñ,úM7jéôÞ1Øj}°Ëf¡goëõæöÎó­½ÜRÕ,fÈdù½Æ>ò®¶³H&Ã/´D¡æž‹˜ žÑî© $Ù×l ™¤]‚Ð;˜WãòŠÅ*QNJ,¦Î*ž—JzÝ:ð“–©!ªjîU —–àÅò±±¦åhûÃñ|:  «!?²¾Æ#Ä­´! ÒÜÛN£K't9.™ZÄfuáÆ¼D«¶¤a–æ¬Icm¶*Æ2Næåœ]¢él>1h Râ\É äAàcÕd޲•Ç©9ŒÎ`ä8J:t^˜Pq½çÒ= {^Lw »€ÌOA¡ •õ‰zŸœ÷ˆöêûÑ3Ú¶Aæ*NtîûÇ;[ Œw"&ú§6©æ0·F³bðæ¦:ÚÛ~²^nJ°§j"ªðs?4ÚÏEèA?yzÌÿËô<„jÇUQ—ǃFdžýôêy£`ë&m[æž5ÑކãÃ’à7ã ÜØ š[ÇݘæÕì£ò“*L]«ÉqÐìµìËt’É0Ž'Aê¾ÜbÔ´'V漋†"ŠÜÃÊS·µØÌº×ñfÃñË’YèøÈ'A[HœW­³ŽgêY_ØìÝà]í?p©òàñeµ–f°žþ-ì¤p2$qØ.h°䪚;´rˆRÐD·\³à3 nÚ®ÅÐf °áõðnµMO@(QèÅ»ÁK¢?¨„F¾Û¨qTZ½ ãV/Fç’¤Š‰ZE%Ííܳö b (ê§ñ !ŒÀhÜ‹û˜°E¬Ãó¶že,Z±3žJP\CÒØcbó„P ¢m”µrw#;KÁ‰‰gе.ÿÁöë­Ý·~Îʨ’Þl 㕱r*©V¸'éJ»šb›[¬Œ 3µ:Þ ;ët<¹Os¸÷ý⸹‹£3{ÐÑ9îÜâ½%¡À5ÅÂÇÏÚù¡]ŽkDv×aCNS£ SJTk6i–`¼ÄU 4€¤¡À:ÕÙøAêXG÷J]®k×e–—Ôn€ÚD_|·;u\ÅPïÙÞÎ+t­Jÿó>BˆÌ„',?a« Ý$ž ,ŽáaÎ’B:±J¶Äxœû%ÑêÀçȾ3MÍÚ`ôi,˜íŠSÜ1âÒ‰;Œ@]²s,SuñUÀ‘çÑnÞ„o¸™AÊnÆÉà¶,rüiÍŽ¯r{DW¬*ÞÞÒïð0ChÌñ÷x:n0Â"Ä’À!‹š‘@§2P>Ù¦M|EÀLMÒÀ!2<Ñ^o5´|­#Û·ÛTè™YV㜈Q1PâŒp0 ÂrKÛ‘Áœ»ƒ¡J7J@ŽGà:3Ã#^Åøy©Âi66×¢Ct1 –ºý–„jk®žb/É£P¦ËÒ¹˜¹ïVÚ(kލ–¿»qÍË…÷¼îTi¨híâ)«‹¢t®À’q°j+©@ívÇG£Gþ4ëzóqaîtGÓBÃÅÖeµÞ¹^=¦-5"òÏÄ£^§®aæ½!-àü`©-a’˜ñ€+™XMDÁ lÅ F{ …Mw6˜}‚¡¦ 5’Æ•qD&•‚µ]ÆLjêG~Müç¶åoüÍ ÷6¨ÄCÃ4åÆ(";oˆžÃ_peð[Ô‹ŠþÚ GÿúaÁ¢×‹ë–øuú0M¯›ŒOã5zòà0€+g0'í"`»’bíRý,û¿PÇp‰ýÏÊý{Ùü_«|óÿÿK>ÿLûoXx¨øÔHíÆý úS<ŽƒŸÇÓa¯Ú¾ÌCìJ®á¾ •}QŠ=Ã}•VoÌ “Ø›©Ðúø_½9ÁçJçÿ‹¬ÿ.?ÿWóþ«¿åÿû+>—Çcç˜óléQ)Uáþ{™é}ÅxbYôÆ«Xó,À7ÿ&f/—ž"A¿Ðüã²óË>wþ®~»ÿÿŠÏ­›AžøZ÷ÿµ½¿›OÄ÷»b_)Œ”MÕ¥™'MæO _ 2þŠŽm+¨¾È*`•Å4£lå-±Ö¸^cÌï«ö@å4·‚f*ÚiP;FǼ¿]{_52ÁšÈD…ËA\P¦–A31 °øÐ¥9. ¯Ö>Ž£^„ä~7u3-Ir4 ãÞÁ÷Õð¥VeïŒte)Gª5M¨«„"2 /1Áf[Â¥žÊøL°€©Vx-Í'™Ø.ï¿Kc(Ù2âO†ÚõÅ&×NÃÀ$ǃ>×¼°‘ïl+ÝùÉ|ÍŸb•¢iîtSRý©àÅ/ØG1”ÙÕ?²kPMÅÀÆmñE4PR—Elu E/i74ºI»ñ\{6Þ62¹2èKñÿ„xÌYGù“8æüÿh5Çÿ­­Þ[ýæÿûW|Jâ¿ÍœÐÁ$Švk0J¦#A2ÊPâjÅѧÁ¢ÞñG6‘„b8ÈÑÙ®¿Évý°ý9 ÖÍ`=òU/±¬®vd ñ«$<Éë–GÓx™^/O[³³Yu=p’t ÍÌ1 ô=;8ŒOb‰Õ ²V ñ¤sJO;½¸;¤f{rCN£“ b~RŸÖØÉó<˜c–Æ+¢7fUó[¹n6ïê“fS¿®•Fcc¢©°ÍòÕÅ›~4çÑ[£î …ÔwIÚ_¶¯íduãÄi£C¼¿dæÆ]ƒ)‡Ä0ëBɯ¡W‡ÄÝŒ`ÒïGÍæ$ÆB™to`ª·îÇ3É_1˜W¡Ï2ß1H>Bªy ð5Û¶ÖX’G×’ÇBÔ±Ù‘jغ̶Q) äF64c±iq7ð`¥`åtu¦ñ‹Júof±eqA²¢át•ͤ˶tÑ4·³µøX|¦‘“¦±>Im·Ìª`¸&‘.Ê“zJD†·÷h^Ò?â,‡ï{wëï“»Ù¿ÎAY¬»”š×r¥ivíÛ{¦{kÁ˜î±ÓÐY:C)·D ¥&ŠûŽw|iÙc$HžÒGôßazŠslÃo§ZžŠSi6 Á#D!. å'­ç·¡b(rX}›ß?! àNœþ~¬TÍ\l¨@QWàlõðÃýõ;½ušQûÎZkílÙù¯ß¿¯r(&3Gš" ˆåhZº$‰¹Fnia«Þ{ùcð)šÇ‰­Íë‰å†uÁ€šXm0¦]“`¨&Œ °rØZª7›øwYV,̳»Ê^óÑG¦ƒ’åÎr ñìáÒ­V`¼nðyÃÁãÒd=÷h­žbý‚Æì¼ÃÛÒâí)Æu„ñÏt ?ñÏáZ Q¢Î9ŒéÖéï〛À×»wÏ8p®>¼{{Ðt¶åÁ2Wª›7ÜñQÑÍ¡û¦î.TñÅÈA`Ìôe¾lä ÚSlð5õùêÊÊÒíþ4êw,-s›^­ “KßÖ‚Bð¢!O(Œª¹K£Øäƒ îJ¡`I¬5ù±î -½¶]H¹÷w¾.b!M¤Ÿ ö—Ó[Me¢z«áBÃŽï…7t>ÚøiàŸ3üÃ9Š·™ÎøRŸ÷™¶9%±Üi¶°ìKÁ4h®ÖiêTuYªÒ¼oè­Áµé/çM¤/£qùýD{³Q³<µw·ßéle¸ãݽï׬ßþ,Õ.Nèù¢ÍÚ²ë°!’M šQ Ó#Œˆ9¶ †)[—cI±BW )h‰Ñ‹¤I×úÜ2ÆY´Lˆ|?Õ@¿Uv¯ˆ‡Ãô=‹¦…?ûmƒ¯$^ 瘘›JD@ ®j9˵"+ô-ÛÿˆÏµä?Rx‰üçÁýûòùŸî?ø&ÿù >WŒÿÁP^ÁD}Ñ×]M8DŒOð«›$æÁÊÊ÷úýf³ßÇnš%¿Vþ§(?˜$Žiå,~4éÏê .p,lÈqÏÓ%FÈ$AªY‘?Ë%€´ ´Xà諹ՠµôA|Ô  ôrß¼«É!¨}`¨Õ‡á¿|Ð7/Õ`¡Ϻ[„Fúù¢Â_¥\ÕP_la®4h úø÷ûGø7âï=þ·ßW»DNpzò¦Îá5ëðÅHë²A`~†ÓÇW"×cxôøñ÷ørX·Öþ ÜñøS¬²0΄P[9«eÒe¢oI\Ÿ®DÝ+ì¬Ð]Z¢+j¼ýX&œ´±@žÍÔx-Y`* ¬šü¾×^"4MŠü¢à!±TˆÑG›!t¨Á£Ã†©Æ²¿•ls¼E{‡ôŽ'øä$šu‘|Þ²kHxD‡¸ÔOïV?À锇† .­£éx> WÍÃ5çášIèË\ˆþB÷3Ùo hÿOaÌ\ÁSKN*å »ÀÜ‚0 B ²”`Ü—üEó¬7¸‰Çôý.€¾¾¼æÀ·´¾r¶ÂOØÖ1L :uéÁ]œ–âêú^}§°ÛÄ÷îâ¨7ñý#¿‰´°ÛD„†{%MD™Q¤…Ý&zxÚ/i¢—i"-lšØÈ¢SUW]ÉèOÀ³ îö3= ø`0Ãî*н[i¯}hJlp”}½Ö¾ï¼>̾¾ß~è¼fpM_¯eϾÎ4ž}iÇ –}j ^6¯À³y¯Í+0í‡Þ+Á³E8Ö]XàaH+£]YzGâͼŒ,ùá¼/ÆæÔV÷]žÕgFfpíµÓzC×ÕôŸÄ"~uVOçoh ïÆ©å²÷šO†_þ¼¢œ² Ö”^lÀ>XÆ#Yÿú‡‚Èd]ïÉÇÍu 7Ÿ³ûfŒ4IžáLÓˆC9£òþM̳þéŸËù? ãô},æÿV×î?Èåÿ]¹¿òMÿÿW|Jôÿ,Gú+BÄÌQ=‡ìlìscؾ1¡‰\ÑDqLá§pf Äú&cÍ!˜)1Á~œÀ‘â/þ4`7Ï•àlUÒtjù(ãÏÆ£þàH¾?fQ»ý|~2aûqcP¬ÿ¹Šöÿ²3šŸ°ýþ!:ó[jŒÃ1Zø†àÜa„1à–ä$Ü0 T#V“«)}LÌ(Ú-1ƒ"iEü^0’æ“Q|:Ôº(íÃzÝ*¡áÓ9`)­*S»Çqòâ[âé+ ¿ÄÄó’Ž;ËÈ©Áàä™ÐÐFƒ™æ¬ä9'a]¦mB»©Âa,Ñ=¥×Œ†pò OMüõC“·OÓýÕÙ`¬º-î\NhºVð6‘kº#ÛšMrÂ&Z¡”} š Un©€Ú—©¯KÞÇCb#;|ó)°iÃVæi*ˆËdÊÝn²>}|óýûz›¾B&nÚd…,"¶ºÖ¦Wë7¢<ºì J }u?&Ã(9®[›¼ÐéMvS8ô~? ª´î£jЪz+6öR‹±N’Ћ©Æì³YÆ‹,}ŸÛ¯ó&H¬Ž vœ•âT38Z[~°'ù¡?é:²Z7µÜãjüMžúe«ÖPé®6¶À?ìIÏ ñã)A®ú3֥ʭ¤9¦xêU3×*'—êNÇ8„€6&M"²áàÝ7r/íþ­Á€HÓã´ñ6õ­à­$9½ãæq4íÁUæôf¥Â'¤pbjÛ/wv÷¶jëŠ@áÇø< cÊÄÍÿd\ßÓS¿ðƒã8¥I3%»¸(œkMB.ÁýÖæx|Ú! äÜKòRcš¼FÜVJ­äÃÛ`Þim*êCƒa=Ÿì†˜´³q»ñ$®ùAï½wÒ ¬¨ýëlÖÀQÞ˜§³â%mxo¦`͈2Jàš¦žè|sÀpÕ;}LE-yô¿N6TÔˆCºætÉrÃOh, l`q?†¾-éõbiF.ýD ?°€Ì@ ´’íÃ1¥tîe¹(§2@ dfÏgd<!†ª`pBHË;8:ž)q“m5sq«þæ­ s—&:fÜr¡¥½-¸PIÚÛ¼s—ì¤A0"=‹»ùý\7ò47ív üXG3Ðé/d¡%˜Ìp…VàX0Ñ!$71¨µúä;^µ¡œŽhÍ› ¼² SkcrMÃHžooÙ¬L‡B’=b<³ÚíìÔˆLª9îÂ3ó¸(†Yßð¶°®ŸÍ]v|÷]à=œŸ\ˆ8Ì Ž4lN s2¹¦eñÐV?K‹•¨ëŒå™ÔImÎü;˜›½Ý¹ø ¾;éë±ó‚¢¡Ëb¢&¬—æâeõˆ}pì°Ï¬6Þ­5î5î7|h<žy÷ŽhïwôŒþ}À$¼I¤œ×@^Gºïâ>¾Ñ•˜"'EïÞ¥%éý‡ÖÆ94U…2?„~¶©žÃÛ0Š¥#E ð·±fAþlj4Ÿ æ"г3RðƒyA¸C)K™qŽÝ1íåg±ÎðfÚãâ¸ÌLtH7‘2—²ÆoÊÑ=¨ßCZNæŒxñ­U?|`£GZg~JOêfæg>ª×f<óóÛgïÐè¹Fü[PÛÜÛÛü¥–5E‡Ž(òÙ¹Þl£” ‹‡Ö~W»I‹¥‡”ñÜgõ'3 ·C_Äœ™–nR;ÇxH YÏŠícÕú9”î©URžF½±aÊe†µb—›%Jæ>eSvÚ¦“ó$öŦtvz'·Ø4|÷_ËîÖoI:1)%p…y mýñã­Ýë•E®Í5S[½ÔV5bg­Íl¯þ9®ˆšzȇî÷éjc¦}m4@ª$°bƒÉ™pIzW7? תòئ³Vå-DzBÜ™Å+b +54wíI¬X=R±ÏùÉáxÈþ^.3OÕE#"Åû÷m¢˜ÜF–T¡uû?6UÕ•äÿ³ñõq™ý×Ê£‚üŸ¾ÉÿÿŠÏ%òÿDFå£}2N ÄDx«.Ñl*–3±æÎ¢“ áíV°-jƒa2æô>™Zë0屄¿U¹E7Y>špz’(xv°÷ªùLsŽD8ŽŒ1XÀ\žäð0Bš/tôcÒ7øí4l+v\φ±¡þÓ:â(cŒZz:2Žáבt…øÔŸ·wžý¿GóÝ &š ÷cCТҨšü¼59áðD_Bdᔉ×Bßìƒ$í0uB¢—õ<í0q.‹d&÷t—ا_µ…_Á‡œÏ»o¦’.T³Á»9$"W7W?è³±áMYR+Å—5O»æ°°xM·ag>:$ÖôcÊÂîŽöã™è2¤ºñÝb 40ôŽu÷$J>†´°·;?¾Ú}ö·F¶ézJ—¦»¸piß:d/¶äéWwŸ|üøùî³zöÊ¥ûÇN麉¬è+åédÙ7ìèOíâÔ}гaÀ·0t î1€@ãçc!9“x>¯ãé b]Ÿôž¥†‘ ?©Jú­˜¨C)2H*È'4Ä¥Ñ芎,Îë¨çJv©9¨ÂíWlû`rDÍaŒÉöˆæFç"겚¾4¥(H†`ЇArJÃè<Ó†ñ ¸$:gÍØÄé|4bÇ@ÊËhÞ=Ž+ûô­³L ¡ ‘‰ŸÁû_} œÀÆÉqM¦d€/ª|Ч‡àœV}ÚN%6rú£Üe=ÇëlW* ÀAÈÅG©ÑtB!âa>uŸâ³êý —‚Qpëé†46é×jØßÆlòÊi8ÚÜû_¥Ø½µ:m-NPÍ„!gÒ G‰IL{0Vaˆ˜8¯dJ)24ÒªW<…ê|4®€ÆIðŒBVä!„|6¢‹Ú‰®«®xÕ&øùŒ´ÃŽŒájÝż ƒáûïø·_$%âýwòÀ/T'Â)ä”h)~½(uø•cf„ÿŠŒ5†#åm#0„½YWöÈù?>,ÕÃ÷€º¯?]vù#mWÙ=rŸU¾±§±ì*Xݨ¸¢,Õ>Eš×tûîÞeÉ?=vöOÉô¸ÈÑ`îNWÒrEy˜0÷F:]3ð-D¢t;Ä<|‡m$ËrŸÀn€+ßWƒ3ë>k[«K½\ Š5§Y©2l¢c 6Ê×½èƒ8µªRyÑ~›f":c¹zµ½£!>L©\ÀYI$Èå×Ü Ó±Öl"lVôŠ$ǪìQ·çô¤úË–såuÊ :Ìž2p–ÝÍÜ»8–È·Ïÿ¼Ïù¿jþß÷òù߬}ãÿþŠO™ÿO*-ÿ0Ïñ_ÆýýÏòŹ’ƒFÎ=£âµZaÌÂËý5…5õË0v¹'±ÚÛVÿ9\ˆq»(áEÞÓés!ï=.$BŒññØ,§˜±qoh‘ >ö¶äµ³±¾è{†D©S¬ÖFŸ:5‰aýäDv{܇¦[±¶Ðͳ™eÜuÓ‡JFÓFà†®WÊ»ÿzœ–MÆ%~'‰ŸúVÆ&ÓÅ+ž‡³ÖFÄŽ!5eçØ îÒÁTÄ÷‡r_³¶ûRGå’¥òñÓÿ:EÕÏÅïçõur9•Ó¿šDÂç —ÂÛ= 3îNegÁ‚éqÍS_L².d Sr•mÖ‘ã–„h¿ã„À{nÂÉ»Í8Aí´V÷ŠiZeVŽÍ¥°ÿPϓ煳”¹, 1óáö=ý{H S*‚^À½,„¾&8(+ï=0Å2áMR®³vzëÿ#].¥ÿ¼‹ê¤÷gú=ôðáý2ûÿÕGVóþß«+ßè¿¿àó† >ÈϧÑT²Ù¾“-ÿÏf“¤½¼|4˜Ï‘hnÙ‚‹ÂEÝj÷6¾Ú§RÙ?'É ©4óŸÊ¯¿þ*¸ÖR{Î/Šˆ¯Fÿás]0҂ΰ÷Zjú•¥­*ò%±‰¡ØYLó›E]NIÇ %©qb0ñ*íK§Ó]ç¸]¦oÙÒ§ ï_AžþÚ~¯a|K+%¿¶+•?l¢õ? ƒùÃÉÅþGå»ÊØ̃ÊÒø2|ý fl–½N Ž[Ôhfb¨¥C1õÔŸ™}ŽíÐZÁËx„Ã4<‡@…m»' ¾ AH·-4EÌTþÀ üa¬µ•éÒr zÑ,Nþ¨T¼u—…ì +Ù­È`swôÕ—î½iÆôè1nÂu—,ñ—Ž‚·cp¹g#Ɍڪb€‡MX9a@͆€ Q¨ew¸– p^ÿ‘˘ìÈ}rÁ]>¾ÈAÛküîŸ}é:J/v8ZȾj°ÉWÜÓ¬‰IáSåŸM< ?c:FtÐW¾¤^œÅTšá,:ª—ON‡ÜRä+b3‹j gîê[|·Õ5==sLJ‘¡¡˜­ß¶gÎÐ…•Êf *w¨Ev`Uo]LýtÙIª"ÿ5݌»­RáFy~R€&ÿÛ|ˆ5×ДÃv×½l €'Șô‡ãH]eˆ>8ÑXÃsöÁIŒ}æïèäµMýñàèXr® wðÛ¦0jhÏí¦7DVôagÁ>‡ö­G]Òœ&87[üi0ž'Úy¯ ó" ‹ªóÅ8q¡Æ=Û¯ƒŸ¶÷;Ï6wvv:?nu6;oöv_¿9èüJåšñ²Ÿ»£ÈŸÓˆÍ‡ ²IQ{jSÑáØÙºß• gFÂ;럛Xë .y=²ì✓ŽRˆ_¢#äЧ)êCÞÙ¹˜|dãû^“ÍŽšiT˜Ê”ƒÙ¹!ŠÍ–·ÄIðãx<Œ£Ñ•z-HU*Û}I1ÄÊ6 Req•¹[vPD‡1ýI •-ÈJâXºHp#i3Œ°^“c¤@‡^°€×€Ä¹¬Fp87|.¬zºìÁ5°GF1 '“ŠçGGLn>%"]ݨ×ëÌÆ‡nužŽ©­ºIæÒ‘YV°Bí$ËRPàŸ_€»ú•¿ýJã^f25òé—Aý’…žð·yœ °Í²m\æìúüjŠüÊÉ<4ŸK¢ôG¤a®Ù¬¹z§çz§ƒšÆ]•È+Ñøÿ*½üjT#„΃*uÓ÷›,„&ž·E.¬™<£)¬¦xÍÕÑýJµ‰—‚W1ߊèX{c©y+Ø“‹±FœLèþŒÓ¨¢ïoyÛ’ºç´Ü»ÞðôC„Ü—õ|x5¾ŽR®Mp x.–Ë‘áì5Èj™®þ)2r[^iœ´ˆÝЇ•m‰á°TVt;@40᳋ðÑøã¼ùbÎÉy‹JPÍn/ȼ ‡É¼76ŠÒ µL·Ö|‚ˆ6»°â$ ùH¢± ï5¬IqM}äûéÝO0 }5?\Œ8ëBîÃ!ó›r„_ÔÆxxE¤kÄÓדÿþ3â>¸¯(þçƒÕoòß¿àS¢ÿ¿4—šˆ#EÖæ³~ó{<‘¸ *3¾÷¤Æ•¥À {¿ Fÿ}£ÿ ™gpïK¤žž°“žý“å×wޤDØú¼2§Ûd)_ó (pËb¤Sp²Ùs2f‘*“œž¨‚NNPpš†vëF“èMè*çÜîqM¸ F4GºŸêtMTlî8ML ƒGCQžÐôö9õºYΕֽµ†¹èap w=ÂL9²Ð+ˆ†l!ÄÄ -×ÂA˘¹F$Ô$ûçš)·%c’Ùfoƒ.ü& Ä±ù`¶E,$0f|ÕJHE`s.žžª (>¦ò4<•pvÓ)¨ #®É\rÁIôi…f½8 1LTN»2Bf<Þ4Œ#ž dQ"öò,¾æðž‘'æ­ˆµa’FWE-`Ã0 ÖVíÕZEjt`k#håðÄÅ6Qúm06ß ±´AÚz³é¼;³¿âaœþšÚR3ÚÊ$ªy@wH”tDWÖ¼Xï.ñ'±ˆô[ÑaרĞ©¹"’mâ>ñ˜ØÅ•sõ÷hΚ„²6_Š~Pü‘ʈ?}Y™U.C\÷ÁîÞ/%eÖ¸Ì3bÄ_mlïÇe„[/ëë¾ôµ{ð·­â®¨Ì.³¿ýrgóUY™‡\æçŸ6:›{[_vß™þ`kokÿ`ßÌk푬›:—µ´ö@æ¿ùüyç`×™bç­HZJV`oëõîß·:/h’¹¢(uÏYoüéì¾èü¸¹óÜïQVakoow¯xX\ê”[ÿ­gfQéR/ÔØië4¶V܇1£·Þ ßqô!LÒ`m#Å/ȳeÎöiÌ,~‘ýæCµe”Ëè]‹ù˜/.ë¨@P,v´ØšÐ4þ÷­½}ZMº «+­û«bı‹[÷´Ö+'ѧ pi3± {j±'4Ó`µ.Eo+@˶’6fHŠwÿõ¾÷¡Ö@Ö®g‹Þ¢–Ö2³tÚa±^Ècî4 ú·¤Lp7­ë=in ùú0† ãizÌLäwÞ]ŽቦôFæ¨{ 6Y·ž½~ލâ¶À,àõæ>âD¼9ø¥óâ¹1 @%¯¸z-®–Á(­èÅ1Ý9á2J+ú!D|;V;G1$³„Ýañhfç£%£´@nèe­xÃ,jHló°mõ½ Ùô¸3û 6‚%DÚHÃfW~ůNŸÚFp.:V£Žú¡óö¾pÖ'®BD¤m9ºLf Æ£¦oމŸ½óÌÇX'fª‡2ƒÔäQn¿-£Þ…† cÉR8aãÇâå‘Ò%8¥S2µñK^¹xÂD1œÂ>¯^a|6a±2¢yÒ³Öˆ†R?ú¼v‘Ï\l-ƒs«&së”ЪšUX¯7â"[£‘)©UjgÜïÒ$XyÒv­éAð±ÀL,u"z;, ûÇ (3&’êH…\¹øÁÊŒ%q4í³èpc¥‘y:o8[j `*QÏXœÆ ‹sÇ’¶× 1¿Ç*£‹¬È!ì#vÒXΣ%ÃtEx®/Óo"&ÊßœuòeâľuCVƒðj1äº-8ès€.’1ӽћj•EmS×/ÂàÅKXMÞ–­Ö‹ ~j ™©àß»A:Qéý„ˆÛA“¹Î𑌅!©þW5`kgÑ«Ë(GÙðl^“á Këïò›ÜÎîðׄ¿Sâöp¿µ^¿}u° ¬l¢‡t‚0æ—¿ Œ@‘Üa 0ð8£¯½€º4¶ÒÔšr§ç ‰…^oÉŸð]ÿ‘Yô?3:„¤A¬p¢Û£åɬ--­>¬¯kˆñ`>iÒ`×þkõáÆÃî=¤qϼæ¥á†Z½AÈÃÑÇ#‘&54ºì†+¯z–êÕª»¬ápxΣA’ÈìÂrpI”•NjѪΈàJÀ(ž/>®Á–´ê^kÑ¥Î;\ÖØtK(x´M§Ñ¹^g|&C¯Âco„¦ê]I¹HÓ­— ‘ö‹]DðrÏà^_æMíéEz¦¼Qß\Í]ajØ\µ`f3kLo‰>.ZdÈË"s&z^\^ÒÛROVÚv¾dM³Æ²gvæBÁ*›Zù…Îݾ£´Z}5w·ó{—i±ýÁÇb¼Þ¶·ü’ããÜÊU‰/§+Ô†£u¯AúQÝï$¿Ù'wí4²äÂÓñÇxôf0‰…a¦ —TeiŒÎ9›,jMF‘6xÿKtf’"÷ÔµSgý|¬'”}B4*Š}¤ô*ªên-BÕ^Ê¥*+)‚°µô´Î ´«îÆiwXÏ1P‹ÏÇÑ´· ót>™µ‹qŸw©rȰK ê PžønvÄ¶Ô -¬¾?«6ªôOÝ}6³QÕkáf¨ƒ5újg &6Ëç²é ÖÅçkÛaQõ)zÜïg«Žx²*qï´_°œa^H W€nŠ¡ty¸èV2$®(\«;ÁÒ5€(7hOæÝcDë -U¢œCpƒy¢éPL«zë¤ùà€6u-á“Y¿MäcO‘ÜÔäb|ëúÆ4d™9xâ¥öýiÜnˆa;:Ñe#XZúxêˆayEJ¤Ÿw®Úu.ÓsÇ8ÝäÜ«E›^[ÖP 'ѧº·xd-#ÚrÀÁ²¼0æ°gv­Ž»þ̓ ·™aa¼ÆÓóúuöUh±to%êµ5ç½æЖLã¦Ì†yŠ´ÑA?C|ó`ƒÖít€´•Çœq†#r<ÖÂO8›Ó`DbÈ81ÈG&øaÑ a¿ÊV'bM ri„ÐFšââsw/Œcµîœ·H„3Jâ<ìf{„3û|»'êê`^êW÷+‚<ÏÛØÿ¤[ñçàÙåœ66Πͽ¹ÍYF(®çƓǽŠZ³ÍWMŸ¦¬ˆGlÛǹPv­s謽9‹Î£’½×Ú¨b4dKl_ã0HŒ¡u¨ŽT–³-h‚åvlS‡bC~µ¶PxQcJ˜^­1*¼¨-Q»^©%5¤híðßEÀ«µk 6 [Ì¢!äãdÖ±/BŸPâˆBöåÍ›7‰ûçÿ©ËµÀ‡=aZÁb9:Jæ-óAàžÊóí—Û·¯ÜÚÛø^ÉèÌ£K“›L¡¾P!¹\ ÐÄCN(dÒ‹Š”Ó/7}©#-G|×÷ïÚîhSµ†;SÔ-ÙN‹º’0‘Rq§`ÐF“Ä&§+÷Ãsð$í-Š”q!Ka¼æyü¨pO,5$OâéQÜ‘G¡üѵsðgµbÙ7ýÀ´ÒÎ/ ooçeãÑj4ö€•J3„—W`å€i¹›€/µ³ZNtÆ—¡Úä]¢;óTBÇ>!ž1KƒC û9’±;Ofãç0¤‘¹r7g§Ã‰+:P(õ}Í;>Éwe½e‹ÉeW4*ò>íØÚ›BÎ’x¿5;‘øX•ä¦E[ìÖò˜ñFT™ÇPU°.?ïUsäšœI×ãûQÕ?4´õètZæ6 ¶yOûÓª¹]Ã>}öUó<±km‡~ð¹¶šoŠ¿¨¤o]¿¨äñxö1>¿JIýýò’®[÷¢rG……ÃôúÍ; ,lØø@p!¡x³ –xRr %l³U²~³å­—xL.hÜõ¥åbJ—Óe.‚îõÇfÑz DŸâÞ'f}v¬¯ã•[^ªHu¶`Œ%H»mHþLqœw§oûò¢²øTË^xà[H¼:w‹Ga]rÛF¹Ä£Eòå•h®ú¯ ·—ʱ&Ì/êîlj_e_çÀº Lid—Œ;¼ß°å¿ÆœfGµÌeøç-‘½fTU7ÖpU ìYÆ ò–°ü'ù;I»‹åðw‰Ð·ËÒr-ôŽª|°blúÁÒa{¿Èéë%ã³Tø¸*'ͧ¬Q?5z†I;À†ËlŽÀù[é qÓ11‹ðµ°Žcv°9)l?T˜é a"†œc©ÆZsß'ŽŽ5(¢`7«‘)¢›Š€®ZÍ—[ æÞ01¢ò:™A˜ ©=Œœ¢Æ/·œ$É%(c³ ÓX¼ˆ°K§Ç„¸–d·<«=oZ™#™v×qº?8¨…ÊBÉÑ-pûâ:ƒ\"œÚp–+•rb×ÇÂíá@•W™y5OË… ÓÍð#ÁþBÁŽÞO9,Ôåõ§ˆë„ecÆç»›¯^ÕóJkóqõàT»³ãÃÔà-­_Ž:K^äR7Ò…ðÍ£¡ZªèïüÈ|¢Ñ×H¡m œ’¸ÅŒm^ÖY¬«m a¢ˆ]EØêt¸(HÁU{] U^Ôu.RôW¯ @7j>×7›ÆÇŬŒ ¢hð Ø¸ Û^몑 JÒ’´SSb³ˆd×;Ö¡©Óñ.ó[˜ Êæ»I+°Î¢áG¶®’ð\O˶öËx·š4A Q{©ž“(à V8¦T‘çÆç>‹#uB«Ñ\®×ÂÚ‚ˆIqTjB°ZÖGá^•¶înÒõÎ÷Uà7(ë\èø$¥D»)Á„_v9µ ¬ZÒÈŸ³þ¸í àRgï™<"ñõ@KX}×¶D_¦ºËPOÖaX;÷É÷ x,Ð,‡€dÉCºõì§]Âðý6 ¸¸ ‹†âúëP2b¡R$šuGn[¶3#*ZØ‚ë¬Ü6œŒ+h[XÛuc6Ã÷„o k»ÎZÛÈ]øl)ó^ªð™WØ>6,aX}0ßQÅ,ö>¯éÝ餌æqÀ¦ÄÞÖÙµÄD:ùy @G¨Õ¾ÆÌ3=eGàÀ½ ÁaóãÈÃÍÓš’€ia9föÐZ+ÑB¡ø_`+êXÄ¥Öª)R±n2¾Ôj³lx_`½Y24ÏÈ.ëX®$šX`eWTÖ·Øs¬Èý½.³–sWë»À‚®p ¾‘^à &KŒèþ úÛ"Ž¥ÈxPCÆùM;!宨´rÚæ¤X H§1ÝÆÆ:Üiw:ìð»<¿5ÂoÜ@5*cMw£^-ÈÚÁZ‘ )U50Óüb:쌅„ìˆsO“U]½´êoó1Í×­¥½–Ue¯i¨p ߋ۬™ªùª·„:$ÞTâÞ!–Ë!LÀ@Å¢ŸÓÁ°¡_R"xLêjšŒ¶¼†mÿNsUÛR7A¢™ Tcïåùˆ#¬ NZÜKcÚØÔ”µÏµ”ÞÕQøð?o1,'ddïLÉåÚÊ‚!~¾h°—¸jWcoÈñm±”Ÿ/؃97ªF¶oâ W³šÍì!¨þPëØnW£§­AîÁz7àD* O‹›2ý§" ÉûÚx±òLqÄxÊwñCÏ{mÜ nçÅΖR×AÆ&ʆ›B q©éw#2 A@ÒUNÜB!ºª«+Õ t]ÛK0ݘÞF–'…'ß[6Ý+·Á}êNûÛ4ä1íj7Jb‚d1š´Ñp]øºDd¹{=€°Ùò#uWC—B6Ù¸eâ×”ŽX,…2Žàø¸vå†ê·ž}^IïGZ#/XËh/‰"G7¾@Så¼Û:áK$à©–[ÉÂ#Æ/1·¨å½ždewå¨ï.âj+™~݉dIù+N%¥ê :L% ù rÅa*ÜÏ„®››#¼ÌÊ­°j(‰¥$ú|ɶ•°êDZ~·ò¡¡¼[M¿®e½mÍÇiÅ sóZÐsa£ÎžxVbïÜv€¤¶´ÀÕm?¯ÈCsI‹öÒgšþ¹ûH£Gx±"v-\’†¯·®Òâ?s…®/YAÇÖÙ5ž²ÃåæÓŒe•{NëµZ‘^ Ÿ¼Ï¬7'0‡û¹¥Aøæ»*Ä'’œß#Oæ,xìhUC>)ltä^bî2•ÜfÛ¯ßlloíÔ$z½¯¤«èv­Q¢Õ)[[ù(êÌes¬`Y÷¶ˆR¡âí÷o–´’,CÓõaéöò2Ý?ˆÎw#à-Ñ)ßEùàH¢“bIÃ-+¢á,9“™©?ŠÏX’3æ(ÅO ë–긌Ì8|úø&°®ã4>×Å«U¹Þå‘Ãßfs½s…Ö%[ä°ƒÆZ‡å«4F¶ f{xëfí’ûJä8×½}QÏUïÆ§È+Üû¾8³¤·b5òÎXxõ”ÂÍA›‹Œ8Ì"(å˜Õú-ÖJ´XXiY ÝéI`Æs°&ÀÙ­Ç–…ÙXJbșà‚Ü4šA˜9ïF”¼5Üo—Ë™7ûã.ˆ1`!–ý(°IƒEƼ"w:*¿Ó0½qwfänú½…Nƽÿ1ÉÿŸKã'ÝéüPãÿÉ>.Éÿ½úpm%ÿûÞÊÃoñ¿ÿ‚O6þw<"𢆼U±7„‹lÑ€x¬Èß‚€&I#8ƒî#˜ f’Ö¨Ôâa- êawH7êi„3ÉbœÄ¿ÍcÎ^!Q°4Û+üc‡ƒÃ ¼½µó÷ÏÙŒ‹l6^mU‰pBA×±@žàÒïÎÖ+•“óà¶žM§¶Î¯ÕþÍk>ayÕužXö;ÌçЮI ïšãµ4;5´±•7UMÞ Gýwñ‹çŠ´Ô4Š×_&ñûïøÈQ1§Ìt>¢j?È/ÕÄšfÞî ¦³s°]?tÖÍÓÛX%Ê[ynþ?‰˜ú¯ÖÒûéòòz{óþlõðÃÊ:êg+–—$üï¾³ßLLÇC»§… Q+'~.VyÿîoZÃ…!D½a™ Ñ"<Š\Ýw4ÜÕ&µÐÿ€ú™÷ËïÞé€Û>, ==ˆƒj2>ÐÕR[Aôh2ƒ‡6/í˜.’F5qûl!3õV>_`ÄÄ?r$½dÈcÚÁ.â|÷!.±Vˆ*7‘öÖéAå‚àâ¯>ÿ—ãÆtåv§ã?ÙÇ%øÿ>p}ÿ¯Ýð ÿÿŸüÏùZ ö‘lbµsF¶JtþÙ¨ìi"É[à猆#A„Cw‰ØÎÐÄg‚>ŽÏÚzãx”ÐY´šsÎníÅDVƒÛå÷ä˜ãÆ'ìtNßz’Þk´¯w›„wìé²»<Š4Ý·\(bÄÉóæöæÞË¿¿[ù°^,?ˉ1úÜé<ßÞêt`*MXžjj¾¾àö*¼¼ð-¬û׈'M¥›†ç×c;–)üû͈9棼 tnƒ‘æUwšsm"B\NŸ3‹tQ_g–¹¡ØXƒíþ¢Ó œšÒ~Ü«ç.û½ÿ.õ5LjÊîDz)Ñ•yƒïËù(íX.M<¿mb}ýIàIZ 7‹S˜¯­ÛáûSä× ÿIä*ú_ý)¡ÐQ;o¯6nß«/Ñ^Ý0x?mðBFn‹ËPÃÛü£qÛ¡¯×ƒçg) ÈJŸ‚%L-¬gá/²‰Ko©ë/ê–ªOöžoííUMMúXkH¢RàRõ ßËÿ¥‹w{¹ŽÎÒ­P¯ o¬«4Î7æ£äxПy£h,šö…¹[ÅNÙ9©‚Õ$ƒÞ×ñ7ûþcyó4ƒ ê 4†ÿ4>ãT8*^ íóMY¡ôüõæ³½ÝýFq“—·‰9¹mŠâè±´úD|ƒäÉoh |p[æxlï“»0+_æ²ÅPç¯8–ü¬¯ƒè.__oòÕ'Þëj:ÿn42KǶ^¹vp›çÍúîĈk¢s¨'‡ÈPâZqPa@|˜@˜—¦ÀÁþ²`ß28Ú©P°²ævþ¬OL'þøñÖî‹õJ)kñØÊ—ͨ(W65 6ûÃs½HÕ£ºSv9~¯c£…Á•¦÷­÷îñÁæO˜¸,´…ƒ£cº|Ç„kïo×2îÅ0oh²yÛV'œ¢Vä„z]³ŽsD—vóh´Ç0ŒÏê+`Øb»p7ë"üª(€àBÿˆ)tßø+aå$˜*Lh™fþë©æÿs>—Òÿ³˜`.šÅ_ÐÇ%ôÿÊý•Õ,ý¿rïÑ7ùÏ_ñ)¤ÿ¿ ýWHd¤bQŒe`„1âÑø¯Þ€ñçÒó?Y‰ÆŸíã2ùïêýÜù_]¹ÿÛùÿ >ÿGŸ•9:"9–ÅŠÖ+ŠÇ±3ÍBwÔâhVÃ×ÁÔ±O­4ëY|â±ÃÄ\G³Nڵϯú—v˜[¯K…²÷e‘*ŠäYP*Ù*¿^÷T‘º@ÆZ NgÊAý>‰»¢ï$×çÉyòÛ0§'“~«ÕºY׊*x5lf,Ö¿À¿}~Jñ2í.¥>.£ÿðÝÇÿ«=\ý_©ÿ…ŸÿËñÿÂý}ŒajÞŠN¾¤¬ÇÇ÷K÷ÿáƒû9úemíÛýÿ|èâ‡ÅÇ˽Í×û6ˆI`2¢vöwßî=Û›F­n ¦: }3Vóôu2;§Sáý€’NÞÌøe€Ì·¨&6Zóóº^|8?ÂOx€Â³š¾_Ë ÕZîŽGýÁGï¬l¾î<{ñjóåþFóùó̓M¢I6ÞWèE³¨7˜þð¾@…ÁÊŠa¯Ù’cRÜ ’ybÇé|(ɹFãQóåÎ[Ž[iM©§våÆôð(¦Ëëqpû‡à?Dl]…Ï©à%1]ª³±¸¶KYÎÜ^^F:ì¸w8D"´d<Ÿv¡ñ;Š[£x¶\oÛ}™ô¢pÔt¯£ó€ºæ¤DICô.*ÃÿÙøpŸT¡ü'I9žwC¿ …çumíáÃ{yþuåÛùÿ >·X«¾ M¸Ýëéaµ²¼·;ç<P¬ÇSDw6¹yÐði…£it"'ƒå¬a·ß ®rBRçE¯å6cX!šüÐŽæ.# ¢G]G(ã6¤Ž!ä’ š%æ¤q.¢¡¨&0ã†Ús#]vMãu>³ðm¡ƒc-ƒ÷}quÌÔ¥Å$"ML²`™—¼zÃàÍüp8è¯]D¬Fè žpœëCiU^`û:ŠàŘZæ¨ë&Ï ‰<µf:1-6Œ±sÍ0ú)ÛºBždAˆ­Ü*^t¢=ãòz<žÄb°ˆ4S08dÍk>k[(~Þ>ø >7w~ ~ÞÜÛÛÜ9øeÝúèÀ­ˆÛ‚{çDÏÍÎiÜÄë­½g?QÍ·_mü6óÅöÁÎÖþ~ðbw/Ø Þlîl?{ûjs/xóvïÍîþV+öcf`¸…ëÌ| 0z1Á]=2u vt F'>oð‰sevÇ“óË7[‰ØY5ÕéZ®³ó·x§Óól÷Í/Û;/iÌÛñ³aõ—îz#xøèAðQ7?qLå“Ãé óÓ×›ìåþ³¼ÝßtfÑ<›ïvÅ %šÓ6L Ĭ]gܤ“5lsø¹~8¸]T––éL#z¼|öŒ`":“Í\zAµùó|í{“6¿™Ä³¦q¤¬^½ª9­Ayk0ê罘8wñ£=®âaŸ#$I«­{qV÷–WW–×î+«í{«íµÕ Œƒ­³IpõÍÊìýØyövÿ`÷5Až}8=•ݸ÷о~‚~­æ|ñ/·ÈÖÎÁÞ/€Ú¹u‹åèy¦×Û;ˆ{èVØ?Ø$t3 B•"J¥ B¥,{Ïöuº†¼8æ ÿç%®èÊÄöÌÆFCįï3`ãhx4&4}ÌV{ÏèN=iø¬=´"I§„ÇÜGL°¢T9Rü8HÆ£4À_¨MDi]¦ˆÚ„¬9<´ì¸Ð6 åûçéaàÁ­È‚‰ˆÅ¼‚¹ëwj®c‰i²Tiºã_ Ž"ö«£F9rͰn£®²ÒEÁT~:éMHôx-g‡CwE+øQ»L[ð—dÀcÐ4´ª„ôúò,à ÌNÇ“0G‰Dèk (i³ÔòÚ8’³OzÛÈåƒöŽâ,¿c¢š£.îdôìxƒw¼àD(•áÒôp0ê›O¦‡îɤn_-¼ðœòFzC2Á’Ä…Z>}8Ë]™¿=-‰Lõ_3¼ò=ŽÇç“Ì}¿³KkÐ\e•g¿WÞ¼q2™Uý ¯Þný¯·›¯‚•T|ûÂñ1$wm®ì˃­ÿ¬Þ@Ù-§çˆØr\Ù¯Pc­¨åŠgßãâÀ›À/#`ÌŽqños ³q=?°½­Íƒà>ê½Ô‘\µêÎÖ?‚Üå"6 Šè»ó逗­ñfoëïÁC®ñfâêPVåÅöÞþAðU^p˜3 Ê< Ý?˯Â&þ^V!*( PxÁ@p ?Í`BxóØHuÄu´Å»‡3ÃÁ‰Fóæ‚&SÍ6‹ïc4Ðdöû0ŽúD‹ÿ}{ûzËÙtN;gÁ"Ôá ²ïUi!o›¬_RÎ(töËYIÍÕÑŽó#2Ux;ð::jJ—:¡å»‡“.'\ ´,F²èW}Ý´ ‰¶"na¢DMÙ¥MôáÖÄS®¤-`‰ø|â2”bв5>ì  âœÖKîF— /Z4ÆsƒY(KqEh@õžY–[ð¹½¼Kû=×C¾˜Ö¯‚&GãN/†q³Ó‡ !wG¦H 3³|ÁFÙ0혼ÀÈû:Ý£üWë\þuº—uìo£´ô5G!æ:£_mèœMÇçÎ-ç÷õðZ­™–6‰—fü%­âDp¥ôÍTÞ0r5?xsœseTP4L€'3g¨Š/Óõ†6Ê\2bôp]4=×Cӡ߀¿bHÖç‹;ä ‡¢NÐ8©x„ÚÉ` VrÞ«`çí«WÀ”­»MDg—4Ë6ß‚mÂå>R å<µòfBn¿ed·Y¼0S‰F¡Hƒe(ú’±tÚš³¸ŸŒG½vpGý. ØJã­µþ¿ÿŸàït¹ç‰ ´Ȭ˜vf%ñ7¼5É,žLlãh8>$ŠªÚ"±ù qŸjOÔw™4§ìRfß;ó¸¬Üo¯~ß¾ÿ(Ç‹ÁÝ…D¢²q˽’Ù¼/‰êÅ o ÓšŠŽÀ gûxÄ}¬-¯|¿¼ö0X¹×^]mß_)è# ‰ï8ÆejX މ`"ÁLcöDábñîkwƒ¢•ë@‹‰à»`Ÿ4þe‡†ëÙ –«žeÙ¡?ô‡¾Ú¦Ñß{Ùæü&³¾h–1M‹X2šr@ÝÛMíUk ½8â¸(cœbµé 2 ¿ äçdw™ŒØŸ›yxf­<’™{"•ChL÷TÐ'’Œéí´{ƒ˜¹5ñX0ëed°i|_íîÇ&œô¼T(SÏÛê0ØŸÏ~™È`v3¿¸Ìâ®.ß[ VµÜo?¸W{´³ñxhD[hYw3Lâêi•ÃùQð`eåáÊŠð ˆ܉Ï#p„Í^ˆ}Ép®öÞÿþjs`›xªœ®!˹ø3¸ ËÙnâˆ3ãŒ÷›C°j¾XDBŽŒûv‘%ŽFyç_G³Ùñ€x÷ÍQ¥Èr[­‡Ø'Bee):n÷yYW–WÒÿƒÕûíû÷èÿé²nö 2iZ”ýøŽ¾˜ûF¶•®¿,Q€Œ¢tê1úäpú±•6Æv¥z(“ü î™A=`|ù°}ÿA{ÍÁ3[–ÚBà§sZ`¸Oõ`ž°É'n6gn«b§K,è”ÄQÓ7f`Û¥£O8­¼Œ8CÒÙ|bŹåp;ù ¬e'°ú¨½Z„Ä\p7~ðòÍ«z¾ÑU¿Q¾¼°M¤õ€¼W¡Q²J+ø» ^‰:á0ŸTD=!ÀŠ[Áîqpó"RB‘à‹†iÚM½w6ª¾¸¾{%q}uý›°þ›°þ›°þO ë· Ý§6ß½e%Dæ™ÌŸOéo³')B D$s³ÒzFX3‚ÿhJ¯4ÖXÝ ïA+n‰T—Pƒ¢O”5X-˜(ºÜ„œÂ¦«öÿq2#DÛo?ñŸÑMì?›{Þ³jz½US2\ÌÂøl2­ó:¼Áa@Ö4†˜æò.þÆÑÏI8«ãÎ1¢áÂñÓsÌ!<ŸÆñÉc–/ó3%I HŽ>-d™õ4n‚úª·h£Fµ}$Ë£qŠäÆáAñ-KÈïœQôºf:o÷·:û?îýwÂ9VEhh•ϳ€˜Œà¢@ÇŸÊçÊ©Ð0îÏÖUˆÚG`­Ó:*+ÎVÊï1²½¬Â|"¥ß²€ëFvüòGŠì€¼Óç¢Óñeç7rìæÇø\[§'Ò–E¸î… dÅ·/·³ÆyýÆïΚOÎ=é¹¼j|¢—xlK᧺ʨn”1»Ü=$»¢_Pzö¹Â8>ù².U]Pƒ|;Ïç'tàÌâa—=v3ŸÆ|±¹Â?šO°ÛÍ's$ü òçX²¤‰ng#%¾˜„…©"àð-‡8SÄPžÁdhÉ„êúޱŠÁ%Äb1¦Á`ž—PZ© Uj™Šˆ¾&Ô1hA ˆŠ1ËÑð12ú+Ž9¢Œµ†“6th±šÓH"À”Í£éP«È!À§¬fíÏÎh>Ö7>—yÒ®ò„&íRº¿¼¢a¶d%6 ‘hŽ{ÝRR%'+mFX Ѿp¥'/ßÒf`Ï#p~íþ‚ÏÆ6§¬mcq“ÐfŽûÅÅêõõ‹?3ð3êÂ34àÊŠ—¦dSÑØã„ù+BÔ¼÷E=Ø:Ó1½+ï¸@™®eq³Œ6¿F»—îM2g=æxZ&λ~“ºeã¯Ý(1N HãK¤ÍÁ"ioÑ^›X¦‡±³×y©øU‡y%‘øÂA.IÃJ©@:]äÂ6Y×QÖ¤¨5¾@K‹âkÿ\«e"õâÞ ÔµM•‰™8Ýj¯èiñ ­@]š“¦w.§çV¶ªôQ L/YªBIºƒqîþMì‰88‹Õ‹ÏX+qpìðØ*šCý~4˜…k¹‡³ :C^ÕmDàëÍ­Í˦i)©ò-~N,û”¨òQžÄ÷¢bßUù Á\‰Ï9?”Ô²B((ql3§É£˜ÃC•™p‰Êš äá+Ùñc” ºìÌ9õç{¬64ý1di É‘T˜˜ˆAœ´›heµlqŽJl–BYr˜7ƒ&âFC%^é5ÈqzÎ4@ ¬Õ‰]…²<•P«”:'¸ ÐD @S¨q¯Ë–Èö8•ä•#N€Ô= {Sú»ÍV¹oF‰|ϲ ZŸeºÜ½ÇmØ1*€ºô¡•NɶD׆ñ–D2Gó z¬Œ?Sp\sŸa/®QÄ©=¨6½qÚå 3‹4;%fÒf”uˆûžrl_ªmšzõ˜ó$µÌšÆ'çîEå†âðî|Ã_æõ ‘¥ù.³÷àŒ{3MŸ×5h_ç vv‹ l}Ò½¸‚­ Å2(SÄ_M‰¦GWÀÕY.*·02žLªÁJjYq›Y’vEéÒ\ѰèJ·N Xú»ˆáÊ^2rA^ëhå9­)u³‰3>þ}¦mš¶²óAª€…»â üývÚ1õs›kÆ–Ýà+:kçÈJ (Ë&_áþø³w—ó/YE¸"æ.Œ«`73m™ò×¼/R³}Hºš_ãcÛ:JP¶åb$ýœzà:4æù§sš«w£žÚC€7¶tÔ*çs`8!Ú5ßâ*ÜG%À–lr¥èúµFöOƒ­ÆÒycéwÄþ…{/ÓðøÆ£ÞXIŸÓns¨ï _HLŸc×x ³ð”±AÛâØd L!™Qì™èÒ,[‹ ïëÌ×ð’•‘l¬ÔÍux¦â°¶Vi6î$ tÑ#døÌ^)zãX™=qx)¨ÚpŒ²Æ´û²º‹Í¸oð¥c¦7héÎD}…Ù¢ý@ß?qÞ‹vR à©,Ö*ßõräÄé¬ß@rN÷™¥GÂßóm´)CøYüçãñxB =0¶,Åÿ)ùÂXʽßu”pùº¸s4}ž¥‚2ØèwŸº|Ãt½7{¥¿Ï¯¹w‹›Y¸Ù]<—=䩨M:×Ó ò²p)Ã÷â”H9aö©`i‹ü ®a:¦*ò~coë¹Vø)úÄÖyjØ…¢‚ŸèaLœø,r/ða¡„Z7÷ ÿÀú1 ‚ †vc1~ÛX¶ÊdÛ²¾3¡ŠŒ~×ÁüÌF¨g±­š*NƒtM`jŠ? w¿Óú±ì³×$ë^që™2G*ŸS‘[CnÀÓ˜+Š",Gc6<@Ö$ãë›qH“Á0ÕëRÛ.Ïë©Þ`‡E"äpæÆ-˜‘Ér8D®§°-æúnðD¾æÆ]w ´¾,“ ¶lÊtÆS3½ÕíV]¤XÕœ ÇÎÕIJ°‚ÿ(©>Ǻ@y6Ö²¸‹&c$üž/fÿИ;ù²3³`iK€~1D_T³`g0†…º2 ºté}¨Z0µ… qu(.Üê ¹Hö Þ³×@ Ò9–8?JË¢üž“'+˜aÄ뵋l+z‰€ó R옛ׯEâÿe¬#‘÷å´ý—Óòœ•˜º%g\ŽÒ;ðoq<Ñ«—Ï|þ‡ÌÃÂÂ8eM³d¿½å”Ø÷‰á‹¼X+%ÁÀy©p,‚–¾l0öê,Í7§˜Åù'ó8 Êœíß}b|œgì£ï?‚~=ÃÝfo^¹]ö“÷ÁÞm7er§ÆŒÊéÐ} ÷}CXúë““¼9ÆP¼é¢e!4{V‘2#x\2Ïvêzc0‹.\……“>«× °Ç$(kØÌí’©pË7äþ96iA›ÀT¹}.—mh0Ekÿ\U€Æ‰(kö„.8¢e牟åÙ¨@}Dác‰3Kdó\ ÖÑNDïîXÑ8÷Ñe6XgVëâEzŠ]ŒY¤Õb Z÷ê í«>ÄXò¬D±‘*SÅh/¥ByQfÇs1uQ[ûù‡ùBèÏ!SÂÔ›Íæ·ä/~Õeúï}p•—ô*oJƒüïcêW¬C“…¿Ôýá=ËŽúJ½çû¥ÏÒàŠ2¼uµ˜÷¬\¯LŽ”A׬±Gú™æ'jA3RC¢@Hú Èsl}Åq¤Ê€æ•,T9žF©ýÝÙ"‰5|êB‘÷zú, ¥B7Ù› —"øEÄx0à€Üý—šZr'óC8ö3ý=UæQ‡œ£àÇ:“XÚ&«çæb4’ÿMxØP7¸ÇÁ¬–2MblüÃJúµ>„éá:÷ âZôô/Ù–N±WÿHŸžFìŽ&¤²ðeÿÁ,UnFaÅÊÝb1 §éÔ±¤½š%4,™+p§1þâÈK ¸&ÚœgÜaŽet9t[Bi¸7óàÔÙL]nÎ]¿d×OƦó‡ù¢ ¾¯f*½ÀÏ/U)0Ÿøy{‹¾Ç ïøàd†ïÔðvWNÀGéºkÁ÷/.dI÷€›§é²—ïCø/y·{æCø/Å~¾ÂÏJ ü—«Bø?R?G'çî<¾! áç.„Ÿå!ü@xºŸ."Ú8_„#þác†ñec˜W‰O¼†l:r#Q]‹w¾ªÅÿåX¿„Ñ" ”QÀÿ H—Æúf,V“–$ñ«e,/Û¨q*\$¥áQL— ){xÇ9º®{Éd)=0'4g0‚8_cO˜oÁ"ã±µ‘eWV#™– 4öÙæÖHU›Éò#odô˶¦”¶38OEMÂñž»ïÙÆÆ¹#L,è÷ÏLj^8éM™oX aÃhzdÌD`øvuÿ+ƒX†_Vã¼aVÄ 66ŠˆñÓ —Ú¶J”Ó´!_…’¾Èk\e7g¸u³ ©¡¨wÑgè„5ò¦„ižZš2;Ûü0íh\EK‰¢&Û®YVc“—³Eý–êtt=Në¦n~1°™ùxk]°ü¾î'?#÷m G_°Qg d¥j¾Sº¾.]²~…ðdGáSÐ(<@Ú×'·ÙRhò‡uup*Ú´<4Ù¥0ªÂ/€%:Å té&ÁÒ…\Jþ\Ý2º _ÁeóìŸbÍΛD.~Ї©6oúŸ!F7\BÉp{9•è˜ÔJǜաLCúg›ê±X^ÕÜõ«{7«¬«Ž:c¼Íµî®J•ÝØX¾W釗âÏudãç–ã:&æO[Æ®èjËϰ1§få·ZR§Þ²÷0yÎÔ+Á¬)vå·¼¢5c²Í4û˜›ÇjŒNHhw¿V^£À(,ÛtAGÀa¼ÇcðK]ÉÜBÛø û c´ç˜®ßÜ0ÇÍtf-P[ÁÊ/—:dÖ f÷ËJV×CÊ$¡ì5öó—™ác;Ô—íŠfö6Ú6 ø±,ÁüºPÌ0ïÄ@÷ìøÚ€"LÜ“ç‰ Q¤å¦‘…ƒ FÂùOƒîñ¼û1i]ÎíO1þ‰Ù¨\”úÝç[õÍW¯vŸužýôvçod( VTíÊbcG{‰ëÛx§À"ãÊXÞ²±æÑ4: „…å0^²b«µÊÃ’`%qýï g/ÈÏdyÍÕôÈú¾MBМˆÇïƒt“´¯Ç’}" †ƒÑǸǩï‚ФP VÑz§Ò‹ÁÆ ]ö:œõ`ðxñ š«TÉ¥ÎîÞõD^„gŒß…Hà‡ B.Ø^*fµ‘OT¾ i–†oâ~+Á ó5Ü|ölk¿ÌH‚˸*ä3Ë#²p!ìÅJA4Ê.µ j4Ù[a™‘JÃ茈ýŽÄùsÖÝeá,@±kÉa /{=–ÃLÇó£chC5×S¹€ã’ð5•ÏÎ"½ØÛÚ’5·K–ERá|~/6DøìįV8Z:6Ž­Z:¸ôÊ´—”ã%#?sΔ+uïVÃÐ2ؼ¯<ÉŒ¨" ª{ФÐÌ«.5ª |½ùÉdƘUHÙÁøÒߪ+‘ÈÎlUªÔSɆÞKÚbýMr,© $´Z}cƒô5šn®f®qµ+ږիغÕìJJµ.ZðWžvEµÍÕÒ%8ËòV¢áó#7S~î,ÃSÝL:F0¹!=3¡,$\­H9„Ïxvl¬ØÏ6î {UkyéŽÕP7ΰ<‰\nÈoôþ¬|DÙ’—uoïÝ>kÙQϾ¸q#£g)jª·»t¬~Ñ?3X‘jŽ6­Ågb1´ÂƒA¸•‘‚–pe¡ð#uÿ(ê˱š§’rFX/ÝI£tnqZ´ªœbïˆ:…±ž#£”)=>oSÜÀG¤gté)BéFÖx9:Úƒ—…ˆ]ô D}";¸V; á;,â ¥dØ=ùK<•„,™ AN‡(Fh}Ø9Dx^YœæÔ‰ºØ †kmb‚Ž)R!tN[póë)HQZþ ÍÎX ÛCÊŽÈSâ6ëëþ €t¹|œæ¹†¬Æ‹íW[ú®ÓŸØ™OßýøöÅ ¨d>ðÕË!hLQšRØ0̶K8aZ%œ·!UæyrO§´6/66_ýÕâÖÞÞÎ.ĬÌ8™@k„0An¨ÎÅÓ§ë+ e|À 0h«ZÆV‡„L‚Z ‚ÍL¥?ÐjïWjë6‚óèR2´8“{‘E‰8!Puá`æ°zÑèœІït¾¹³¿]B†vo1€Jg<» ]ß›TgÜÓ™ÀïXÖÎ>ƒ“ :‚9IÄ'œø‡¹n# ²tÛ›´G쟡ù+@¨·`ÌÌI~¨m´äPK*á+l .7w‹„Û+ß8œ¸>_ éðÜ8NËZˆ+4ð‘Ñò>Û}ýæÕÖÁV0º³ùzk?X-x¹·ûºÃ·ôZþ%OjÞ·/©µƒ­½Ž–ÙÞÝÙ¾Ï×|³¹·¹³»÷zóÕ«_‚Õ‡,Ï[© OÔÑñ,Q‚éO~DËBíBr…˜ûPÉgÖ&÷j¼‘6==ï21$Šgܯ¹»‡&N4ötx:&ÖÛ´¢·Goè£âÃLÜsÕ0ÐñX®DÀÉi\›Æv£©BM@ǤÜ(ؘ?ƒ$b† –ôO‹6¸MÊS1:v QàO‹v å”  õ9އtTÓuáZ…|ÃOaéIGX S&+ bLV­XÜÀÂOðë«y¦eBõ—&«€qŽè1|Ê»ˆTžÆF0YÁíƒ/«ø²ºŽºëR ðÉ ÿ»šRŠÕœÉÑ,p¶; ±ÆÄÖ9ò Ñ"ÍÆÃñ)‘WôK‰Di`õ* ¬z °ª4°]VYè|6,.NéG†ˆ›¯ö· ŠÓg{o·Œò|Ÿãs€^AÒ›Ê;Ûhg†0æÃÙ^r¶«È™‘äÀBš É Üålp ›‹á®p2¸ÓãÓ‘M …ýMÀMlþÈÃsC2êu££o”ÀWXw†Éi·8ˆF»‚ÀNú§Õ[A÷Ûö>I}(œy4pëuMuÁé ü5‰Å£sI¯9¨=89M 爖Ă=âdrÕ$ÚƒÀl¥d>er&Š%Iw á­!ß [•±—3¥”XâR|ÀÌr x>BQ©”ü0žÂäa0ú2ÛGÌóÐgܹbί˜*ZÚh?§5e},ñB.>›M#~ÔaÛÿN® qE uÙlµ›5•È6_"ÑŠwAÔ¨\Fo´›‚0¡ÆJ|+~”Å)ªÙûŠÛq¶ÀZ‡‰óÞ¯çª1]¯Õ|A[@êe`²t¼eœÜB-8¤3ÄÛ`jYÑuÈòL†ÕhRD© +&¾VÔÆdœ$pNÙ¶)œ^Ѭyþfo{çàÅZø|ëÇ·/aÔpz\¶Ü!(½Âð»ÚÈiZÂYÝìh¾+ uR¹ß(Vìà µ¶þW#0·Ëuc% nèɆXòEâ)‘¡éeiZ.…÷0M–‘*lˆ¶H/K!*œVsƒI\ IÀΰN› {IiV…jÁxc!£ïC%» K0Y§ɱ—FÓŽþd²á«ºá)Bû¾Ùc’éŽj–ìíò².g*pÑ/ÛkC¥{-˜ìâGêµcÕ†¡•ÿ,ë>6£= ?jHÂu†+BC|h›ßIž`FòÀvè4ë¼±± ©ÌHö¢C:"¤ì°f'¼da ÀÔ kÌoð‘e I!B´—´ÄùYxâïèа)U*…%)Ûa̶ŒÏîΫ_ñRßçä6f¼eN”YéT§`e¨$ âq{žlGj_ät¦ Üi)êÎ.#_õÃM¡,fÕ¹ŠÓÒ;ÒŠ„‹@ãn°¶®ÒáT8l/}• *t´Cœ0m0šÇ NâkÊL¤fä(#­_Ï¿çŠîûT q…‹‹ÉC–Û2ÃPÀXS&€ÂŒ‘% Ôo.j¹ƒ§1Ø> =]HÝT´åîä<Ì5Rp1V.JHYÂt¹-Ý¿ÍÇ3æì[8c¡Û…¦ËT–Åm–¿á\T.ƒA á"FB)Ž[ÑS›‰\fn3ÓÓ)©¼#÷š0ÉÝ› E¢Ó Ž`}2Í‘õ Œ‚”®0+ߎÏ&C±(pæH¥ŸÝQÊó‚Ç ƒÊŸ´˜aI˜*§e¦‘°náUŽ]»¦}A¢Yvº¹Z€Ì­ÜÈA»*íO;l>Ñ•—éUL&b'hÒ{‰gœ0Y åÑÖëÍgûèøÕ¸KË#^¨^“6ž¡h»‹o[°ýÅÿÇ×üнŸ ç‡÷ך²•Íï»V¾Ø[N¦ÝeÏZêÏ÷±BŸ‡ïó_údþ®=\[}ø«÷ïÝ[}´²ö`í=_[¹ÿðá¬|½i–æÅP—pÐYTî²÷ÙÉýù”©­LŸÇ”ŽÕ‹@øÍöbƒklŒévû­àx6›´——ßVB¼of´GqkÏ–ë{ {-·ˆ‘ˆÖ˜gdèŠrÁ¿öO÷ËßżT ¥.Èö@¤±2nh7ØÊdÜŸFS"åÎÇs D±pʉNedG¸nJ­qoÐ?n\-:„Òˆ§'ÖÖÇù%¯Þ0x3?†3f“ÏáIrÌnU^`û:Šàâﲈ}ÝäVãà`ÍtbZD%™9]œç0Œ'|£qŠÚ!ÓÊ­âH'Ú3FöÇDeiLª™U{H݆êógÁÏÛ?í¾=6w~ ~ÞÜÛÛÜ9øeùXÙÇŸ”ƒw I4EÈø¸‰×[{Ï~¢:›?n¿Ú>ø„ò‹íƒ­ýýàÅî^°¼ÙÜ;Ø~ööÕæ^ðæíÞ›Ýý-bò÷9$mÌ-,XgV@‚ŠîÅKÃD§þ í®r=Ìð@»:øÄ&·®ø±¼a±aI+3X3g-׃D'öºÏvßü²½ó’Æl4þ§Ó wÇ—î:’¯‰ 6‘…áYtr8ôŽèëëÍ`emõÞ6‚·û›Î¬ <â ΪˆŽæ´ S±¶¡äã&¬!]Ùÿp„'­.\Äá~>™Fô$xùìÁDD\HÂjZfGzAµùó|ãþ&m~“®±æ'½£ªW¯jN+Œno±Ùx/ªré´Ž«ãø*DhåÖ|äþR÷šJFã”מn«ë¢Û—ôͱ¯^æÛ{5£cæ‡kyÛPÑ#{OÖ˜:-P-‹Ù4?Y³¿Ö#¥Õ†÷»ïÐþ¨<Ájq×YïŒVðo*pýr-rÚÀÚUXóXóÔЫ¬†^Ëhœñü1ZJ$Õ^õ,lÂtÞu‰¥®nâ‰G|­8”W{ =öSKFØÊ­ 1¿dŒu‰šçžÕSS]ú¾œ:‚DÁá¸k0´jcÉ2«?{¼Œ…îu}X %sìY³[1-3BàdòlSG£+Rš¢{”É»Ê;r©Þa¶ÛU¹Ó=™h>ò¸r'â ÆD±rGhéÊñÉ`fk3mÿfÚþÍ´ý›iû7Óöo¦íßLÛ¿™¶3mÿfÚþÍ´ý›iû7Óöo¦íßLÛ¿™¶3mÿfÚþÍ´ý›iû7Óöo¦íßLÛ¿™¶3mÿfÚþÍ´Ý4ñÍ´ý›iû7Óöo¦íßLÛ¿™¶3mÿfÚþÍ´ýžiû·Ï> íÿåku¿°Åöÿ÷î­>|”±ÿ_}tíþ7ûÿ¿àâ/ÙeÂàDêJuìŠ$d0ÝcfæÄýÏø¯b .(¿á³:‡nÒ?‚ŸÊ‚WóCü•Lñ—¾–)þÒ×1Å_ºš)~É\ÛéËñ—¾ØéšÆø:ù¯`Ž¿ô5Ìñ/Ùù«›ã;ó*5È_lˆŸoZIYÂlÔ™X]¦¶Âó+ê„@AÄúiO‚Š#r8ÝÕ¸Sq•2=OO-ÓÕzt©Ó”2G˜š'†-±g­!0hZ‡V›Æ¿Í‰^HZã˜5C#¶]HVv™«C5÷‚-L“X”Œ5ûU*@?,ßÖD¹…ÿ,¯Ç£žPí$²õºªºdìE£Å|Y0-"‚Í€Ê<sçê²iÞ« ø9F˜¬Z£DI¢WxѳW«R.ÔÙ@ ´½óæíAƒ¿ÒY´ßÚÞ?ØÝû…!+wÂï7{ôÀ«‡?Ý7wžËó­½½Ý=^‰WñèˆæÜçþ“ Ê0"w§0iâ ™f“ÅÃ;ú<–úO´6^ÕÞjxU/ã™™³Ð2;Þ‘ñ¨†àu!V 9–ß•!AîÇ3»kªGOÎG]âäFãyÒÖ<Þ ,öùî1{ÂÄøx4dP„¶ºn6û4̄̌ jHNa¶%ZmÎxl„0IŽ2:b…9St:Ù6(¢ñ´DUÒ¤=¤®«xw¨÷Qz8äBOy)’†["š¾[éiÆ‚bFhCp_=HˆÍ?2 X†ÑÈmkw>eZŒþ­ÑX…ù9^xä4àöåÈ%^*“atÎ9´¦'b¹ÓˆÖx5àH þµ,á2Øt¹VZA¸%i ÚX c¡)ÖhÑb³l acgSP øf}Øz°'•xÁ£Q÷\;b31¿|"‰Ý!A°aÄ¢¿……¬Å ´ Ȭ0ú4  ƒ1H`|˜$ß|”€A#ªw,œ:F÷YÒ&„‰á™u[ܾ`îB¯¦”o§‚ZFÀ>¸êæêzAÙÊ´ÄdÐëÌÍ®èÅœzÄ¥Æ]¢:êZ'Ê.9Š® ÂQŠgœ3øž°¢dSOS>EyÇ)ÿ™Y?äž3Ý5™Ö䑣ؚÓp~äjÍÒsÀ¢ñ,á®a¿2Œ±ªq¿ƒ£íô.~-2_vEñF}rŽÛ"Ô½!Œ‘¼[û ‚T<#úS4TVš¾Aç€òZÖòêúÖòáW0ˆìÒtè–As0…¿0ØTlt…T7ké.¡B‰žÅt¨thŽà ³0–d lÞ›JÎÜ})ÖÃ9(δ½ú¥´Wcã‹6YoÆ2Ú,+T<¥½eÆâv瞉ìW¼™°*ZdsR“$'žù%Q‰´t5L¢©Z-ò2›¦T*•YaG¾xSŸñ… …Ñ{Gàoštèš‚Ñ. iÔz}ÐOÍ¢‡²u–Þ¦FU¶¾ Rûýá<9}Y¦‡+¥} ëõ+ŸHμi×î$µ‚icÛX6è{¦•jB„©u‘ÈÑjz!Üâù$@œ¹ø ¦?ïo¿|³ýf«Зg?½zÎ_6_í½æ/o÷÷VÍ—µF°rá‰Q‘àý“1"ìD»Q³bÈÏûH{8?J•Ž'ÂÐü;Ѽõ'À‚ÛHÐbDwáÂáøÈ¸ÄÌG‡Ãq÷cG'f'e½`^3¹N÷d„ŒK …–¹>­SBWôÈ~$ŒËPy@ÄÑ=ß}ÝÙµµõF+›xæÝf}Îûíœ\2;Q»9‘ޱé¶<‘{¡ê€•68')G`íÍœ•£xF£ø¼÷êç½Í7úæùöÞ…wTìÛ͇ÃPʆÕláj½žJª|o J‹ëh°´¨A«ËKÊ 5 EZ“ ' ŸÓI §ê² •}%U3¶´¥7›?Ií{¦vùHÕvµqäÖ¬ç[ÔjßÚÛ'Ö€ÚÖoe‰xM@Ñy³ýœ òIÝ×,ú)íÅT~µ½³Uµ\`Gd¼é N&t B,„WéŠn¿¦imoíବV˺e©ƒcÞyQ§ƒÎ\+J‡®,RQ#Ùaµ¼•×›ûÐU½9ø%ÛÈ 'ë‘Jm”Öÿqokóog?mîíW¯äÕSП$¯oÁOFß/޽2·­±¸vßÙ«ÑT'ñÃ?ì>ßm‹‰€QH3Ã?í71V@uØ;ÉGh£pHRHb1žïî&×xrQþÑ  í=‘Œ]lðÌtôxärë(èJ\“Ÿ„H|¢2gQºV¡Á4Õþx_}ò'^®“A?s ™±&:&¿Áa½™3âùèh8×”êV,·H|wm£ÞÙ®â`;(¾úñÁDÕ  ¼V“co¢’Ûn#U7^‚U3£QLê>5môQÁµ>²”, èà |±p@èæÓDSch„Ýã8š€¿>ŒgØSáT Åœ®¤.‚ã÷–ÛPëUza`\ 'ÔÅÉ_w®PFbÞ5¸!b\ëEp ãéô<»mJÉ KÈT¥iÍÁþÕZ;»Jè"vw¢¶¦MW”G6ލ®Ñ4š-ÈÇY «u S¼ÌÄ?J­Úõ;9?t§ãdÇ“pue%X èß©‹ß f‚Ø6R–Ëã BX‚Ô{,±vÜ6ŸA©Ù4jã wÑoV±@ShÞã^5½ƒ-PÁ—*b×C ”$„ߘ ]J®³ýrÇÀ<ƒœ˜€h‘ i…c!Ù:’sÅ«öümô`v|b„‰Vا+u…&@²tÎ,š1hPpûx¯ î•T×ËŒöÒðaÌt–å#9ORþÀ#“á‚W€ÚK~`5F¤[»/øäêîóVË2œGÃhzÞWè9‚™©V_i­Ü'H„@4 $^ýð¦é:éô`â@Ã,A!R°–ª&[`\áPÑàÉ–;A`G³v |'ëÓ~ÞÙýisç%ŸmtÈVÔTl:ŸàV RkÑàgÚí×Ôa(uÙ!T™…ºƒÖŠj!i,B$‰ŒZGüXÇœ¢/Ãý¼¹·Cà”7Hë ˜-ï b]lº*ňÀ®zΖ¤qÓ(ëÍ›úþÛ¶9=å„ÙrQ!`D…ĘÞF®¸3Iëf£´jÕ™Qñbôt_ëŽú?'JÅÑÙn+®+éð.Å OƒT,8^<2@S.q u A`õx#x½ù"is·öhù;4ËÌÞ´Õ=‡5ÅÆï ªÂüíúå:K9öÁ¬Î{GØS9FØcGú7C"Yñchì%,Õ`VƒÔ‘ÎÕSë–ËA6VÖƒAÉŒ$<ƒA÷:üû j:Fï)<‰Í,ì–µþüÓæAgso«óËîÛ=Ûõ~#H…[z±ÚÖÞ¡ãÎæ«ìPt^Kéü²ó0Ó¸6b¥ ÁDbøz+ƒ‡U¼hô “ˆÌ6#íö|ªöñ3IçŒx6ôäý¨êi‚ *§;Ú¡> ®±¾ücâçƒþì`ïUóY‚rå;·ùŸt÷5ÂÔt1sĤ¤·ãNè,©]ØÁ®ì:5:>sNÏ ã²•müôö zÚþû¿ÞnËà2+븒NtÑ&JLù-G¹ðìÞ¹=sÕ»²OœQ{¸<ÁÍ ³Ö|$ƒ"æXMeÇŸ›Íø£9vEÖâ\;fIõF°rÙ¤˜q9t@Aü)Î!e«»hÈZQv ô@ÃÞ[—,éT:ÑôаÓ<‹c9] ÚJí±Ù(¨ÎGFLm¬*!Í<3)ª šNiNIé!1ÌJ¡ÊÀP-f9o7Ê$š ]‡èƒxE 7Ù“eJçdçuW0•°Þ+ ÔR_ðç;=QIÖÅ5+í\5ø4ÖµˆTXj¯ÍW!Õ³:†0£‘¦ßÇW w ІaáDXœ·`*W™‹µÇÇlì9'²Ã´wv—å¹ÉõnOúE/ kXª÷a”1§_ßwf<Òïy¶…$¾!"ŠðˆðÕV‘{SÉÑð|-'¡ ª=“4ø!)´šA«z®Y¢›íµ’ë2[ìZ½-p'ðº[ìvprÞ‰fã]é+¬°±ÝèFÒx‚¢·îŒ¢Ý!IˆÝ0Ä”·Ùkþfó¼6íP©!=³æYA¡î EØÎøðJ  2iMUs!ÀÞcuKH&³^ì¼Â¾fi€)Ä%e«X…~û†úm4žáùMŽŠdðØu$Rùóø¤3Gà. ɲ˜b²†žÔOsÜo¢Ÿ«S.wèQfh ¡Ìw! âHCKñÀù:•Ö¶­FÂ'72öz+VBˆÓ•‰qý½CHTLîÆû¬R̲h¬¿â?ü p"±ö¸•dFR—à›Öðn{y×4øóîÎÁÞÖÁÛ½°„ŠIWÀoÞÀ°è¥Ù¡;×/)`Lä5±ùüyç`×YÑv‹ìm½Þý»F•((d€&UÒç{#kwoKj^rv¸ßB/îGóᬽx¹\êÀ…Fc}Èb„ùHxIÅ“ÖVXÃçÂ[h{žw¥³ô„V…ñSä¼½ŸQ|I4ÀëÇÌ1ÜÅû˜Úp^@( l…‘j%‘Õc'å3ao¯eFÆ ï«n2‚uÝGcÉ–r¦ÕÒ®KMã®e—g¾xþÌ¡¬QøP¸ÎLîn°*^ç2.—ÒβYå³CÎû†ze\Î\©³)I¬^o$Uó[VéÂÂ!ó¿W³1uéõÀ í ð£dz•ËT °lq=SMÊøõÔT¼°¢©§eüŠé!Î×5Ó2~]1Ã]É:vþç7ÇÎoŽß;¯âØYèËœáøÖàS4MRÐÔ5 fÞŸ‘gG© ÈåAËJ\97ŒˆHbr—2µÜŒ´vÛ G7¥Â)eð*Q'©FšÙ;±6Ñ&ä~7vÜI8˜dܯ¦ŽqÞ‚-‡âرÔíLFÉ€Ç!³NÄ;V2ÌdÓÎDÂu˜HEj1Óiþ ,MT¢ÒGsë¬vx³­l.Gÿ\Ô¼Y9'Ь¤º¸ôѵ“:=Ž5¥AˆꥉÀëC\8]ÈâúèÙ>¸;qžDÉDz:„¨¥¾«AuÝöÛ>h¹¦t²Ò Jj‰¡!Ý`œNL\HO¢n\ÏxÜ=—·éy+ à¨Öt9èÓM®’£‹m=ûi—à¤oº1aTzsB¨PBt"°ýHpÓ™Œé‘¤úÙzµýz{gó`«³ÿöÙ³­ým¢ÓŸï¾ýñÕÖ~Ô<Ïí(Îññø”³{°\Ávh£(·k»ôflpNŒféi+èð…íP £^\|ËöP´Ïœ«qFå(>›”öÅÙÎ>Æñ$`µ)Ûű/‰úÒš>½®°âlä"– įuÀ- Ž`CzûŒ®¶mWâj hø„È®²@6RS‰«·Û Ý@×ÍN&8PX“d'‰_Ûµ¤Há M5ç ô =ÑiÆ„‚F‹AÕö2J§5ŸpÄ+Üä°¾O äŸtØj:tÙup‹LXbûA{;Yø‡©‡s rçEz¬m>Á*Á6S KØÖ†®p±3^xŸŒ ÛÎr®™™1+1þø38WŽJ§cIï¹b®»)¦#!ê«Ú?VM@ƒ*™–ÐF©/VÓÊÏ[¬-º¸¯›Œù‰‚í^˜Å¶&帛`Êñй ÜC¦„ÝJ¾Ü®váLrk{âj±ë8ÎÜhDG]ööŠ64Ê;YÂC›?@€Þ1×xÙU&Í¿-j^Z0íˆҶ¥};‡Èë,Rp?·¡SÛPª17HH|7ษÏ:ÀƒÍ YB77ÌœêöÊ!|?²æ’uÄ~Î96·Nâ!¹°ŽÐâ0ÂüÌêòŽðdËôœõ»2:’¢žÌyšyÐ¥–ŒÁ²%Ž/<ß|ºFs'®£ÅÔ¬&ã¢éWûÃ(9>¯:ंìùa2Ìæ3g3 Ž#ÖaßAe¦‡†E+qÚï\p¿žEÜï¶Xå§aKD$*]b ºVÔH„ qǰ•T'¬ñ—ƒ1=¿±E$sÛ Ûób Á²¦Ï£wâ›h¸S¾Û2%­’qX-Ç‹¦/\Z¢ÖÅ5œR{Ãñ‘‡kÁ[±jdœ .k Þ¬C¹®¯‚Íi„Ÿ4P+›ü'ç'tf>Š‘§àÕïºÎHd}ƒRÔȉ˚½ï(S­æA,Í9“rCf›†-2o ˜[%ÎårY?iwå-1ž å…Ðûn.ÄV9 Á#áòRRIÛLºÄ°rêcßZ‚ËM›r¹:Tm‚/ÉIw>ih`F)2Å#t#±$\Gõ|ŒnèU\¹C…FÈE‚ƒVäÍép<YDgly³‹"âÑI°­­P»âsôTÞ—Èô }¯Þ/3{`xÜ>­øbNaÓoÝw®)iž=˜:„@æl Œ+ÛŽªaMFÆ÷‰©‡ÔֿܷÌG³Á!@‡J ­¸%MŠ Bëée/ämççíg?-˜±„=2‰»ˆ@–~x¶8X’¶èB±7¤hHøá5áfazÔ¿¯4X$'^ŽÇV‰r”`^bƒcÅókÆnÔÍÔ\ zE¶…tEë Y¥J~¦‹?G9ó]÷¸3ú²fÚ Â¿@ükäõkwÀÐÂaGõÔñi¤S'Ú¢úHt^=M¦Èž%­'äʵ¡¤GÕi€ OgT© Dà=&T`c>9—µ¡Va±ž†b ØîÏŒw‹È2I¥ÁÌ0¬íC2'ê9BŒ°™$[PmÜÁ¢vŽˆ+‰ÔºCt(<à<¨'`ûY湑pÂ*T63dij`%΄6S!B\…ž„°6f¡°øAõõ^]DeMÆšŠá½‰Ò øtƒç‹§–.­° cePbó!ÓZHàkþr‰FC`‹s¥Õâ÷Š$¥Ûñ´#þ؈Æ\ŠGó“CÌöÕyÛÔeo1q#N± NÑÞö†©b_º8<4bù¿×Ùy•ÃPf»0·%.µ$+De~Q;áð¯œ|‚fwÁo­íšM¡»›iü`¦À#ÃI7ÔƒÇõ>Ñáï\*5¥±!ƒ84¥¼ÑòH­hEþïàƒ‹¡SKîóKÁ§$.ü„?¥;ÓÄr9Ê­?ãÄ”/Ì5èå½?N”W K4Œ–׉§Xûi€ìd™]§àm¦~N÷KVúC`/E!Ö:pªœu€ô k+#¶ [TÛ¥g⤃K¤ã®ŽÄ¯éÍn„F|ý(/ñ£i¡¤ÕÎ…Ä›f Šro:V´ŸPìIÐè—VZk÷mœ8–Whp$Î+o˜Ô‹œyCN4.G¤´ˉÆË„ 1Ñ 8£ k½Ú9u´ctcŒ >·$~CŒ‘`Ä4*jã¾îÈ}ÍU9È_³î&h²!Œ,2E+ªïâò-Ñ„x;æ¶ÇÛÄÉÃùn Ȱbæh˜ÀÙîÑ`!*§~–• ót~&¨>¡M3eÖÈB…1Æ”Óàì$nM6-¢ZÝ’&Ô\_Ö„(“ :J[ƒ>¶àåÖÁÎ˽ݿíwèÛöîÎæ«ÎæÞË}oHTQt0ìoX½ÛŽÚíÍvû°Ý}ÖîµÛÏÛq{«ß~Ñ>jÿÔlÛ£×í“v{¼Ûž´ÛoÚ¿µ§{I{¿=k¼ýtÚþù÷vuºÛæ|‡!98zã.ŸK¤?$®?8š3íw?&LµÄÇr#!—;4“Z\›Æò¾|Vè:_¤L¥.`‹Å`3ÃK&¼i¦[6[žlñ\ê‚R¿bÖý§Í¿out˜¯vw^šÎ5˜¿lÃ=F"^ž4ÃÏÕÌ-ÿ/ç“ÃoôÐÞjQí¢!-Œ’ASd„MÖcym,haÓ´À6°M¬S’é?`u_СiÁh›šV_å64»uå£-tp$š¨œÄ‚1<3-°¨¢`ü—®CÏ´Àº*^‡&SJÍS#hOùb»²›PŒdÁ:l™ô¦hŽÆÍÞ|g6dÁž›°¥Ë°¨…~v ¢ ʶµ …v ¬ j!z¦‰-Ù1ÄÃIù,¬äqn ’W^ÉŸ,LB…Ô|štÍoaÁ¦(«š HÌšaÚYжia8>Z°¡ f14-¤*§¢Fœ‹“| M:"×€‡×¦‚f£ ºÞ¹9-MÖõZØ1-Æ£x)´0N[ž7YMTÔÄ‚uصð o[çZY°“´…¸ÉìÄuÇðÆ´ÀÞ[ÍT¢tåsñ›iaŸÄàó®½’Ó´¨‹ÊÎ÷‚öÜÓ ~¥¸³HL ©£)Ûâ5µ …}jÁ))¶9T4Ìßa ›9qKDÙ§Måf·`iìqemYÓêÈ®Œ¶Þš”õ(ÙŸ-|2-@kÕ>©`u¬Ç©®‡»hÔ®?ŽŸËpV¨ Çñ;Æ&Vþÿ¢r±né¾ÂlïÐapàÎùáóâd–&»³}Ð9ØÚgƒ[J±6ll¡*$±Íäº'={ñjóåþF­ùÜVÝ89ï ÕZ•óeÄ\›“¿³ lätl"ÍkO’^ÍÚÒµ8¾YœÔÛhˆy7iº˜ip›"j8o¹:ô-ê%”¾„³´³ùñ…Vï¼ÙÜÛßF¬&­ËËfyT#+ÏဦmJph*Ža$.äÍEÅávìÂxÌmAëpýù¨ROš±_¹ ‚YíàÞnu6÷;ûða ?Õ„‡õžØÂ™7£zpkTQ§°0³ªp¿x¹·ùšJoîÙôËåwh18*c w’°Žp¡™!ÚéÖm`ªtdö2m3× ŸÍ*Yú·;o÷·žsu»~ÎÓOuo!õ…ô!³[^걌ìX•§Î4V˜cØJ­‘ã„;Î¥2kuY0‘òÓu¶TqCHDð@S¨°s1—^I#èxŠO¯æfH¼ÓæâÕ3MìY­#&Ž}ƒÏv_½Ú<@üàgö ULŸ ¸ƒ„™³‡Ù¸(]o«8šÐóQ/šö‚_ŸÕi^RÂJÐìEÒeerŽgZ·ZÏÉ6Æ6¦§”¡ÁÇ>è$1^8A†YôÊé°òA:ë–#¯ÿ³Rºvˆ¶@“>Œ»xÊZÓTsL‘Ò3añ:§âÐßlÈ Ó¶k³±Å}Hvà¿ørìŠB•ô|ä8mºçˆ[ò4,èÊzØkÄšÞOÑÁ¬¤‡5Øœ-O8]Ë`4Ó¸ãb"5T­mÍd4Á¼ ¢&xM©X**‹›$±ñ9ìÔ^ß,‡L†’µÑÉw6SÊ~À­gß‹ϧV°§”¤6àêè3c.[Í ©£‘±wíO8´p3Ë«•ß^ ¥uâ6÷IfÙUVkeÒ6w%ç´ì FFH³Ù9«ÅOãšDi‡Õk|AÏÈz™¡e³k×V• wID-„ûÏ·w$ù.Gº6Á£· ‰<ßêpJ=[AüÖÓ(©ºA ¿œÀïWýnFÉ^ø^3&‹#i-8'¾AbÔw2ðCqÕ. kxRYO+ë‡PÕðW’oÈ™“äCBq.QÙ.±ñ¯ ,±"(ó9Ç¿€SFáØJCˆH”ö¶6Ÿ#xvg›îTÍwéDR3zy½½, Áƒÿ$4ï¿Ùü(¿³ÿ ÂJ éý¥PíܤNtÈûkëÕâojªCXX%´ ç լȅ{$—§qKS¼_Ø{Ý䳘ÃxQÌ ±ãšðAflàüqÝDÕë;œœÄ½Õž¯‹ˆÌ ¨’kG]tfµÄ·âK—X]Íò@4°iÖYéw,H›îCÛ2¬Ù´‹ pɦJNµ dÛv½”ò ßˆcì奉ÉÔ1ô,9’µÄÔøGö)‚ÖÑý]Ñ £gÅÃï<6„f`Wbx×]õ¸™“}w Ìö{l£´ ±'ˆÉlBô¤—”ÈÆ©6i!l™LD_¨ç¶w³y8²XÉÒÛA"VFJ°„0QscÍN®GÛÉ0UæÃÛcˆŸ-¸î6sUäkV£’Ua>‘p·WUˆj'f3kÆê- Þ¨“M;H~NæIMsEMÏÍÂ5[¦æRj±t²Q jëÁͰþù¢Šœátü+œcÓrv¤#Q³KuM üÔR¡é¼“øxŠÅh,M8$G*l»1º5 wƒ¾òbV0˜åJÛÃ|.ÒÆsñUžH‚ …Q7g/QÝ}d®Å|Oß lïü´ûŒi¨R+]I‹PVÀ¦¡\MFâI ¡SÇÇÈçï…eÇP±ïü‡¦hŠ_aíá´U5©Dl²ÒÙÒUÿ°`˜ øâz­ùC-´­˜)µ…²tß¼–3 W,¦7 °–%§!³ãˆ™Æ¬ZÜëuúwüŸ˜6ŽZì\i9/‡§A5”‡©¡x½´ƒªM!Âÿâ²U.C»\%f¶äô9@ÝPµMnu¨L!b5Ç6uÐNÜNXˆ$”¸ÓµJæœcý#PpgåB1g§½Á§eÄãÓ-Y^JÉ?º–B:­Ûû ÐÐÓÕö ‡írË–¡#S¸¼¤Å\´+; º„×÷åAvÍÀ½Ërdîô<øÿ™ý²(EϘ½!h!Èt´ +è²µ£ Ô”Ü lá,ië€yö®ÔxÙbs〥e³=üé졵ܖ«Ä {sÇå»–âödqÿ&œ¿µŸp[&e =ÉæY©KZÆu/ëRf犎sPZ3æàãîGö)±Î¯çbÙ/®`1+4²Ù+ü_™l$†C*Èd¢1ƒ9h*ÔÊ< úbnF"*¦ £íÄ÷11b3^3ì# +NãÚ'˜Ì»\^ ­’çQ¢ÎU¶W=I+z’ŒÎÒ>ô;ìvçúÕDÆùrÜ×¾ úÌŸZ/N&„*°†Š;Ó!4m³8¬§o ‚ô-b—›ËÈ—ˆ0<‹¬‚—)>ƒ½?X-‡Õg™’c(¶hÂ{ûÄäýt³÷X8`á82òÝó£Óg9­QÝv3tù~¼æú´¯Ë¹hÁø©÷¿Jš~ÌÒ rMm¸2ýJÐ0E¢T„žé½c¨ ü†“œH'ÒFm“ b°a ù°WÈDZ¿‰j1ùSX*‘“7”Ð…‡ÐS÷±Ù±xãGìÿ1?™M€mA§ ãñ5ú@ÛÀ®­B¨»»¸Èiî’­."?ë ’Ýéê"ø2Õfï.õl-w·r´’„ÜÏKwRb%Íœ©# ¡‘†j€ÅCGrT1éo2S½¸nÝY"‰ÁÕ1Ž>T•Í*¶þ±} ¡HöëëWJákŠ^úÁ2Võ§Þ¾QÝ~Wéq€¸¢ƒ–»W«-M%ïºj-£Šñ+uÆÆÊgñ i$ÕH—Ââ kÀná‡;ë‡%©2O¬Ö—¶¾í(Ë–,“zte\ÖÔsNr}ÔÈáÆ5%í!{~<ù(«“;a}Á!Ê!ækY™ÆÞé㙨iU¶¸#.RDeÝÍ<,k»“X¼šL"2ºhõw¶”ªŒ2Ú¼zVR|­‹84&ˆGõÆÄ£ª:ÇŸKîcù”ßÊe[äómòá(ÊÝù4!¨˜;l‚xì²ÞáÖÞ&Ëtôà¦Î‚ ¿9:Ètfbw¤‘!ÝT]mnÂ_4„%à°V´øñaAýˆ<µ8~#MŠÂËRЕ÷Ï»WÅnlŠ ¸Ž?ç ß±ðý5Ë`g»“UqݶƒK®ÙËÂl°ìüu(Š,³)­´l½à­T5¼Á¤AÒÖq«”»dúГF/^ ®ñ.L½gå6<ï¨>M2¨QÁ™NºwÁËµŠº©nÑK4}é-žŽ¬,뎓+ëõžÅ‹BÒí‰%:ŠŽoº®¼c!¯ÆS•äŠMI»M®–ìi&µP +/ þ"Êvëþ¯‰»DƒäZÆ@“¬¡JLp2ëC'T’‰Ëd)µt3Bͳù´è„Ø!ñŽÅ‚(³z+Ø‚ÊÐ+QÞߺUÐêcÚÎ×U“–>í-rzvÜÑ ¿vݯN=IÀY .m«{Õ>[r)“¯`’wTäx&j•ÈD#“7~Fކ«íâ1Ö ©ñU¶WºÎQ!ܹ m®1˜Р9Ñ-·Þ)-ÏUéý±2]™k¸€³×ѦLG‚WO¬ÑÔµàÀø&\°ƒ`E»$쑜ÆÙk7%5¡ÍâS™FP!òûœC01§ÎÜt{ªxP.ñý(KžËG0/pVȉžx!©«O°¯Â±:Hb¼÷£låkÑÌø(v)àsq¶7 AŠ>Å4@AA%¼„Ä=åŒÖÞlܡݴª>CÉqd¡óCÓØê¬cNÎk·ø”9BãLdU’åFŒö5Ðiy³ÈäQ­»³¡qœÇ3Mÿ[‡ÍÐÔ†žâ¨\ì9_ê VúÉl¬£éÌEÇ‚vE²óõ>¼×ÙN£ôs\Õ©š¤…þ ùs9}&(ž‚’ÄAÁ)¢ÕŒ"Ÿ3ÛS&a Ò3«USiµ€4Ñ“¨j’=¾!c»,’*%CTïelŠTÂtœE‡låòß㸮T'-K+x%“›7=Ó“RªÄHÇ™%ÑÖŽÖŠ1g0jŽE¢QíE]œ©‚5Ñšœo²%œ À ÌÇŒÙáàÓ‰Àò“ 1I4Šö¥\¤.(£Eß4âKh€{G` â¤9ôzÃØF“Ám†ØA†b3 µzQ >Õ9v­8F–IÛ4 †¥Nõýèý¨êó7F4m+ÃJùÉ= îG^#ï7}4L²ó .ÉYäîQ9»Ö°}ãÙMù‚ÏD±g›Ìg°Ç 5Œ$’*’L©ŽÃVõŽÍq%9.\>i±|ª¸“hÛ>ÆçÖ¦T*éÃñnÏÓÃò¨8ŠIiÃÂ#s8&ШŽ;åSºùû-a½d&t&ð¿àô)ž bf÷GEÉó¬WÙÍ-ì6Fd­eã5Îìá2²¿}eôRé ˜‚*ôì¦Õ…1Öä””F]s:s˜qC AŸ(ÉË2Áj‚àñÎeVóÕúŒå9ŒY|Æ·@š“RÒ ‡i’¨¥ãeò^„+m±'+Jþ‹l¯º- Ìœv‘I>AŒ&L‘f36Bf˜Æ›Èwt2Çppav§9¦`³]aŠ<#¢U4 &Å áàaiôoÚ•ĸx¸ai&>7ÅÖCÜuºÈŠÌJ…N‚À´¢›)0Æ´ïF|".£}£0T6a¨ÏɕҰ\ÏÔOÃ>ùµÝsËôší#Ц`…ÁÖ7NÚnÁÕVY4#Ýi¹­¹"Ù‘û‡‡£ °_ŠÊío­÷æ” vÆ‹º!ÙPzXÖ"kd™ôsÏXä †¼R|Lº=ÙJÒ Ón>EQ¶¼&¡QÊ‘ÈÛi<‚r Áwã´Z´WÜÕýtñ¼yã]¸0ÎIrÁ“Y^˜ÁHL|¡._žÌ 3¦ri–åªpc¢™Ü呟¹Ü“LçM9†ºfùÛ„»<êòBAµÊîr§cN³1ugœ×(iÛ¼êÂìGÝÙœ£ØŒÆæ´][ªOvBûåÄfrù-w«&z£žqKQ•B°-†n×ÏÎ(Cf`uY‚ëôî!S@•É—5LÓ ‘”Pv…Ò™Æs—m9Ë;|ü ‹ôJìN9›²%9ÓÌó«k‹4!ø„w2:§ûXO@WÊ N'œaæúÁ" ?űüˆ\-8GïÆÞŸŒ‰’£›ÈÜÖA˜b6Óže»AQ½HÍæ[~TÏã„ KFãj‘Ü“’/2ôuLù®˜"  oæâZÜ\,~÷튚‘tHVN|e-&g+Z°ëò¤ )Á‹œ®¤>3&½Xì±W#mÃ÷çõ#!ÂÙ¥£-Zkgt¾znH‹¦˜Š7‹Mש1å(;i 9ªßùíªžêx<á4ÖMKð'{Ã|ÇY¾çywðÅ*Ýì§|à þÕ 4 ,¹$r–aõ!†©»§¸hOêÆ· ˆÇÒ#¾o¾z• ÿŠœF 1{6 9–ClÀ­·¤ ÊÀÉÁñ 5¬æå'n.Ñ–YË‚\êl½Í<={³8Eú¾îΉ×Κ©K,ÚŸoàH…˜"+Å2ú6–3|+g‹]PÂaœÜ6Íð}Á—œÿô]FXR”*‚Ž¢Ÿ¬‚p¨,ý]~Ô~EÖ]/Pó=“:æ7wo²w%]9ˆ22BÄlZ ë ¡÷¼ ~©u;'¹"ž…‰˜¨€UGoÈö2¥ïBµ¯º%€peÅëE¾•?£–Í WÓ±” Ç+ê3B×ÏÀayöv°å/ÅmJú8,Ǿ»c/°f°¯È‚€¥ú}ÍàF¢‡|$:ÔØ‘ÃZ©¹#n&š¹Ÿ‰9ŽèM}!qT-S¢!ã®rÞ Î+Ù–8Š‘sÿfØ9±™›¬(WŒÈE-@_d6á27Ì#9`¯-j@Ñé.ö•1[u™y´J«Nܳ7è¡gâÀv>‹;êÔæD;šÊGRg;Î9&û$A@%7$?ˆ!«:Qȸd–ŒEéåøÕˆ¨CÁF‰PËì3›¤Î2yÙz-ˆä(†š`ü÷gF`ÜÉ#ÍòÄQFì [Á–„kjSç‡Sâá«Ñ0ž3/:Ÿõ›ß2WÎzþse]6Ħ¢Uù3b\Îïy"೦‹²röŸ+é¥NLш:û9–xòÈ÷Â*¥^lCÀš¢Ñˆ†øôiýÏŒÌ ;L§äpJ=8ô¬¼{¨*èl òÓÜ[Âz1:–ÌSsxE­Ì*â¡VKÕí™s`aºÁšv«j!¹om¦`O8bä|šÜÜ…,¶{_õƒæAU #±“ŽX„5•O–>tµóåÂë³qqPU«þŠzH#{˜½u±ÆÒyêUãS®@|›Úép×P.5Ëq hÍÀÓ[ Ÿ’¼žvÞvPda]$=÷À”ÝÙ­*‡¥ƒYìàWž/× ðìÚi+gwVÖ΂ðN‚Ø\dp4Œ%"]˜Iä3…N!v‹Ìîu‘fÒ‹‰/yp„pIÌ™÷A{ ÂÐʇÏ»MóêÍTr¦¦LÇѰ_ˆ %ÃŒ2Ìš«1¢î$F7ÒX6áh+Ø=fl³ÿÈs¦±!"A©2[äïšM‰*W'x´™1âdùDYZ(ìˆäqZƒ€"ó‚¨ y^žé o!Zª¡"6aÁ%ù¯Ijkm^KfÔ;ÀI†I`’×#f"5\xcòÎM‰¾>$t‚ñ Éé½t°jµ„ØÇœ¡&­ûŽ^ÓÆyîÊf8Á’¨–ÒűW è‹ì·C¹G%H QÃ,Ãé}M÷%½ÿá‡^lÿãõ ~Úýù©ÀY iÖ8ͽ¸DIê™eä˜>ͰÜaÐÿ$„­³ÓYÏ«è>Køİþ!µ†ršòëSÿ¬¦/‚«o]fæ°….unï»/ÔÈ€:çQŠš´îÉñRGi¥pžˆáÙÁÞ«æóºžÑá¹ÉÝ&¦ù;!ɤÀ›%_>ø4»rnQÓ³_¢(‘ƒ©”݆…®ùaæ³°-o7 xi ù†KªÒcüŠõüQ÷£{ÔŒ½«8F.†À¢À9K¦rr˜zt ûÅhx˜2êziÁù7;õ˜-Ø`{à¾O_fV]Óa“Œ¡CSŠÆ8 ­¼pEC)¶º0ß.\™ÁbƒfÑÚ^Ó¢y¡M­õkuïâ!®Á€ðÀ LEEU¼ØÈ³“]5ŽÍ4Ó«fÌqÏRôMkŸ¸º¢ð'I9Ù°•ոƥE4:…Z«üÇë'ƒØÌjŧét\]h/LÐ÷ú‰ ñå ÏÑx«õÀý ö›Ȥ=©Ûxyx¹$Y'çŽGdlº—Ê%é^*ŸÁŽiΤ1„ˆÎƒ^ô›<ëМñƒd&á^m¼tÇÿе€Ç¿s*Á\‚ÀT"nf\>ËEK]‰|gý¦¤[Æ9…k޹²h»kˆ?Ë(Û̱pÃÒEœ== v¨3š¬æb¢ú»H ¼Ý~ž‚0¢â—¼î,H=IFDüð /äx÷¢ØNæ½qšã-x{8ÍæŽêÀJãj)X¿ïôÊIM3%t<žµˆŽŸÓezS.úÖ‹–·íšÁßIþynꪄáù¶‚Ÿt~†¢À²6ý`ÑŽ$Ì8.*uaÃ:À,8C¡B›@þ¡Û/¥ÅØ9ð%8¸YéR{Dâ~DTjü Wr£“ÔMÚÝÊ£••z=ûôô,K@_âu~ÂGbÁ-Ì›kÂ|dh:ÔÙ@åú½z@¼ø°å(ÄŠ±TA¸: º÷{Ú$¯_}y 7@hÛg&ù‹†ŽzÞ$|MH&ež^¢KoPÿ`†°TSHb}’Q†óÄÙ­Âfç¸4»£™¹z*,S|AxWV†„‘[+ÌD(Ñ$NŽ£ô]½Îi/–šN$“ëñ5vwJ`Y@<Æêf±»÷Ž·— À(êË}Çj /è«ÁØAWX·Ö4F‰Ö¬³^õhJë’Š„-Å9$9Û.}„ÿèñl4tJóNW«çšÞN4 ÙÄ9'òx[9hBϰË3.òw’ mWS¯=Yò†¢9ûˆSü• Ä#ø z@36I2I! ­k qxÁê Í šWÉ\*nFs‡U´˜b NÑd± ¾¨ÉøL2%¸ØÓ ƽ^šÁWãî›v‚'öÖK4x<0W›M&‚mr_[åCË!†uÚ*¼Ò5É´v§+ËìæÓàZX)ùŸÉ(Íë€WÝu+æ¤&:ÏœˆÖ»èÔâœQïŠó¼sèòfæa?ûÐ9bÈ·®¶úh4ç„?° 0ð]tÞÓ–ägH‚›^¹a¢IÊì°ùŸ¸ëI$÷l¶ù¬~ãç¯Hò‹\¹C:)¼Ð¹f„Ý!o.ô}*!­®³·®¸ž¢¤ѪÔÜ Ë+;œ±À µ±aðžÅû)R-ÐÄjw›ßý×Û·~x_]ÿã=ýÔDs¤Vy·³« *yDÜ÷§ñd,êWÁg© þó‚C@ "¢j³Ž^+›W;…ÿFð]zøÖ5IœßNq)ž°Ò¨.³à»/Œ©Ž“ÑÁÓ»wׯKQ8\½l:~£à"Xö(ÃKNñ„]ƒØªÕŒ e‰É†#óˆ8ªÙpi7&tp8¥óB¬Ýp>=:®ÖS›%ssÛè$ަÝãŽ,eœ•ìZÏ/£Œz3õ(t$?m‡³‰_:îÍÂqkŽ;aâ ÉìĿͣahîêMw24ÈOwXê0âöšð¡ð¥ÈKò~ú~DʹȪ©"Ý`¸…=wkí µ{é¤ SÏÐNÏ6w:/v_½ÚýÙäZÚï<ûÙÈ ËI‰]”l¥‘г0ƒtœõ'qÏ EkÀ†ÍV0ÔΨZfÛUš¨ä0¥,µF,ß›ý F¹æ9þ¬½È ×ë­—¹f a2_¥G›«‰Ùsô¼ËéI°š‚PY˜°&Gój6ÙpÎ\jj®¶®KlBµd寅/kŽÜ0à@x/Ý5AgÇ[Üq´¬H4LÀŸÞUI r2ªÀ?R=ÿH1®¢©±ÕiΡ*†>5-¶¬”‘T‰­˜Ǹ´lW5 e³ªÖfp„;„ÙÜþàh>e"–m6›M‚wÚ*…q÷?œÓLª ÿö.„e2Ÿ0ëK#³ëÍ'ÃA7"TÀ®ѨK8lLÎ72;å¢ÐËkÃJ<ÍJ> Ö.?w »©v¬Ãa|DLƧh8§•ê5L*#ë•F°ŠC³V`‰Ÿ¡¹iE­Ý¸ÂpËo¡Ø"uâܦ‘½²~Ä •¢guÕDkA+uFÁåØƒ¤f“â”éMn¨é6d‰ŠtÛœ³ Ž€jùÄ·¬”\€áxä öí ™ÜY'“ôJmUU8g§u©x^žîuçÙu_"ÜË€µaÞž/h¦?ïîìm¼ÝÛ K7˜ÙXz|2»hV·Ô>Aóa2ÆÜ Þü¼¯Z9:f–õ}•óJfï|£$“ш¨<¦Æ¯ À|½*/²Ø ‹m‡Ö6yw¨;¯Yq2È-ȱ¿ s€ùÆìiò8©ñS­]¤¾âÝ:H1˜Þ§þ.ÑAææœ Nz–½Ÿ¿Ó8$tKÄ)‘•LRdt{¹ñmÓøØ9”j'ƒ£íƒN”àŒøÊÆ©ŒxdÏ”¯ÀˆŠŽÆ,0.mîD(‘å‰öÙ?Øz})íÆB˜³VF7 ²)ð%D9º‰ÍäYc¡n¶c°st¿§O*7VwIÚ¨94Žm?HÛw´Žšþ¤˜‘Á(’7È~.Pº½¯iñy(b<;;™0~¤îÊ ¼Cmظç&ŠU‡–Ž!ˆK÷uœBÿK}<6aåuv‘ž»îbæ Çj)Sa#¨Ý¬¹Jä"·à¬a­ßÆÝ`5kÃp]„”q^-ß§‰½h”,eÍÒ\ë†m”Py>@MŠj/îš.‘ck»@tð.Vµ§p÷g”/û iŒòÅ»¿ÀQ#m‚sd2… ÌÀ.‡’X)ãÂ'´ll¿\Zæ—s`ú|ïOÓÍhnö0òH­’3±Ç•Fƒn\^&±kgÔõ’ÙiIÌ¥”ð]RÝ‚ˆýÝÓ3YIÓWÓ|Ï›ÜP÷i:àÒfƒ2;—À0cÎUŸ!eR¾n,ªšcn¥j9]+ȠȻ͹9¤æ[ ÕLîòùÄeÎÆ†óNÂÁþŒ©fI¿i§vsóé osAùǾýMA‰%ÿÚ¹à&´U¾ÉPÙNÿœ^½|™~eè¥ß¾ú©zš ÔÄrK$Šlmy:6Ýñш=G•ªÀVAýGÔ-q¶ÇñpRc˜-á#¡}‘·ÆËÛ\ýÐÈ‹½}R¸ýumÇI(â·ù`ûºª¯;z–š˜Ñ;Dô‹ÍíWo÷¶L ŸŠüWQmtarX¨VŽ2,³È ªË˜ó†såZÛ›tÄ´Ÿ5;¾\jiöÁ1ƒ]\E­c­QÅeócW¦›eˆïòñ]Ù·i6›$íåå#º¯æ‡-ª³|L—Öp~xÍè ’d'Ë«÷¹Ó¥mì|ŒÏÃÚûˆ!1•2kÔ\I%|€9‘Åk¯©>¼y4»r[ŽRç©4ÐI>]˜–É´ô»íË›â[€= Âýí—›¯ö^7ˆ'Øyþjk/ƒ°'x®ÇT×ÓKb¶Ô‘o-m’nùÓ‘ |“¨9jWÌúªÆmš fkì*¤Eñ§³û¢ó#:Â5<©3Æ‚Eç+ð˜a-ŸYÓbè!´eG.{c³gv2"Ä0tµFÝ+èÜ$ôN5€@Àƒ#Ø"Ò™cibóY6K7[€HÃV/QîMãiˆ¸u„Xè…¿ko¶,J¡´æcU±ñUxøð¡ËL•!F1»cÙ0UºÓKãøFœÀ9™á!,ñ2s) ‰aGÓH¿ZÐI­º€C³ãÿšX˜¬ÁÌ}4{Áá0:nM†W™µ‰²kÎAg0 '²›Cý梉ø£WO/Þ(£V÷hàg{KÕÞÙËÙÑÓ¯‚½> Ò„8 ˜Z¼ÓXÐÜ*ÿ»¦À²âà éYß6a‘GjÀò~Å®ùÊUÖ˜Ë!††r”¸šßfx:S6g鿆qX5O¤óÞ`ºÌ«vµ1d—Ê:Ù*x<šEÖñJ!\$Ä^nóCõ(@‚¼ |Z¿Þppv;¨Lg³e `†Çã£9[µ¹æ^¢E¿t8ªsd]z©ÍC”޵˜>Ž&Ij‹#8áiþ„4³'D¬¨Ý±h¤Ã`S|b<ÛUÊuÎŒ ¹u{Ig’€riXck¯â›ÛÂp….€JiîjhÄ>Eë{^ŸÁS¦Ðƒ¶F;ãÙ¡¯È£Yí¡L’&éÿ^k·o<8.wÆÃž×aCtQr©g®Â‡ÔΆZÐÍÓª¾“p׃¼Ô”««? têæXJW™‡žÓ+ÇÚäR@Xb/kSvšÓyƒÙcñrNøp23èe!ïô{h µ ühÙÖf£È‹£±X£òòøî¦;É‘ŠU·×¡ ñíx|Ú9™w#¤aÏnÛXZb4\·4­·4B\2Ì ´é%Ø(\H õTqŒõw^²ÅT;N‘Á(4 Ñ@ OƒÕ»øÛô!«m`ÁÅë+ºR”Ißæ\έYJäGƒYïjfðrÙ05¦‰Ç  Íz2²²Ô·`’î”ÝšümzgÚý †9…ï¹ûÖ³ÁØMÐkKK˜ArĘ»tùsöW묬äD24rô#vXò‚Ú{§ê de’Àö úº`EÌˬ‹ÚõYN&]ïT¾a¬†Ì;Ïxˆc/µß›/7·w¬¡‹óÃ[î¹c5õi„ 7Ø«znBñ¶Ýv Ûä)ä;ˆy¤µ?áD²# 96 ¶Þl¿Ù L†O hÅr‚ñÔRSÈŽe"0 K°ñù$€`O‹£Í¥•†H—ŒWÆ“¶ˆL ±ág3öòš018]v,^(„Š%-g4cmŸ$9V”öx4Ål cŸ¨ªŽÍ©³ë "¨ κKKË~n²Œš“*UM¸)ÚÙŒcBÃ9˜9LéRÑAFÝ ‡ÂÌî©ÐÀl+êÆP‰ò—›°lÇ(hÃLsOÙŽÅ@´'Ò´“¢.ŽÈ´ƒ²•ÕÏφìl¼Ý/—Ó ‡Íäõ7Š72smè(ĦÛ§9wí_×z=Àâ‹ØÙ R»ž„šrå§ÄHÄH°ËñP:bå­¹ÄÌ!ÀÌ !„ˆÍD4´uúlݽŒ ‚=IšŽ^bºlr—U»K&0.kM4-K'3@ç`PËirˆ˜A5Tì•p°>HM9Êñ§ÒÅ6e&½v‚Åå&’07s‰ãåy“)¢1ò-\å#qP*iÄ)/LZ‡‡P·âªY—ÞD3Z$?zåÁ³ýͯÞîÿd#¨çšª á‘G÷a4dó¤ž8½ŸŸFçu'þÔg÷¶×@¼iN•FɬG-ÑoNŽŽß ˆ7p¦¾›7S/Ù›¹•ªËªŠXІ,·Û‰¸&гٯ\ªÜ¥ŒÖt¡¨ŠxQO~82_â‡âaŸ±¯@ÈÌÒC¦¼±µ‹ZÓ5S Ãø»Y ònéþk#üÔ ¬‘-Hâîäå´g߈çƒî { ÌQÜ¢“\3“FS0MC‚Å“ßKPÞâ^‡D¶‡c¶ÀDzìI-KäØñb»ø´p2ÙJt¯M" §ÖÐtá|û|ÙÇ*|š²­Íï»V¾Ø[N¦Ýex¾Œ»§´ÕýÓ}¬ÐçáÃûü—>™¿«VVþÇêý{÷èÛÚƒµGô|måÁ}úûçYú™#"u9g‹Ê]ö>;¹ÿ!ó·¹m£°Ãô•_-sbeïYfìj«(Ò˜jÙiK¶Â­`g|õ¢s¢Kéò=¢kC₊×BŸÅ*b¡ýù°%‚ýŸ¡p±ôŠz)Ìt®fѸ„’y½ùêÕî3næh$ž9D1I@–Š[ëù`yv2QhKÉ1Z ¹¼xMˆÏCoÌ­Ö9‹ñ¶QS~)† AÉpžcKNoÇ*÷06QuÍ…6²®¥S¢q8å¥L|sf¼Ö ú#$"º'ÌGOtÓJ¤qf†ãç~G«A“åùyûà§ÎÁöë-BÒ¯ßì«6 åõ6k%–“‰øÞËkó›]¼òÊ k‰Uµ±xÄHÅà‘cýVÔûªâpx€™™¹"[  .!˜€ïÒ:K×%¾R}M‡s ƒmXf«ƒÞ /3¦‡óQ/NÃÅ&&\ÀË·ÁËxO‰#x3'’¶¼t¡‰Á°&x‚§CiU^`û:ŠàœÐy^ëA<`ŠÃÄL[3˜!uåfBñÓªT¿Î-‚ãÚÊ äÙH'Ú3¡‘=Øú°›••“",7€;ºûö ØÜù% Æiosçà—u>ˆ ÈéæÑñ¢ChÇifÄrLhnâõÖÞ³Ÿ¨ÎæÛ¯¶~¿übû`‡ˆ°àÅî^°¼ÙÜ;Ø~ööÕæ^ðæíÞ›Ýý­±Ä1ÓÔÜ‚u¶"="†ÃD§þ í®j¢˜•‡Q2g“Cä…ÉùåÈ­DìªÇ?]ËuD…0€8x¶ûæâ%[u™6²µKw½<|ô xHÛ›Ÿˆº}N½#úúz3XY[½÷Ÿàíþ¦3+H'X±Ö•0Ñœ¶iDä7OhÚA`¯âŽðö>ô¹%¹€bã†Ú:®òSÇöì‹a§¡¡ ¼¿z¹µ‡·s6>9ü•>Á1³ÞšÚdQèP{صù÷­½_:û¯v_nîØè´à‡ã$¹Yµ_ìmm=ß}m ò‘††œø§˜¼¦ÿAQ°¶b_X¬dÞÝ[©Tâ3:9#&ÅACÌÑ·iÜ,p —ˆÖìæYåãN ïȘ²Ã¥†,?‰ŽÝwÞp>¬kvuzƒ Ó¢ä8‹õçêŽÏəђŒ"îd<ÜÖK#f6îY£YÙlJIÄ9aã|ÚU¨¯+ˆ‰ð×4Èw³ 9Ì~Ö´n% ɵ5É}º¸5m̘\ò0íð.»-¬.àµ_B–³Áxžä¢ïÃ`˜•Ëœ.ÙiÌÍ•é\–ŒñÄM‘{8¦"pQàð¢K/Ò=DZ7Bè’\Lêc|©%î5õ™‚^WÀü|µ$®¨a®8ª|n®Q®èÄrÁbÉÀ;lR#v1~¤—q¿/y7:²¼ëniÞÄŠ ÆœÒ-‰$>^—€ ;¡i¼LyÙ`oIoËù4+LÚhÏûôÇE¤U†';BÂ0ƒ•@ˆ‘f È„^5†RÚ‹ßM¤˜ÁQ]dð9ù‚C(Iô-ÄÁ ç#»ò†fz¸“´ïôØŠµhÍ™…ù#XÍUUó±Žt(Ý%´'óÑG?é6Ͷ¹¸«h"þˆª‚o›±®àhR:'¡H£ !R b Y`"S¬l™ê¤AhR(du¢1ãÁ´Tg$rã¨×ã ûª‰ã&£±€/4ÐIÀC] $¤+(‰^ƒÆÚ8 p`èXú;XŒËUÅ¨Šƒ¥ŠÈ$•Šè¦h¸ø¬a±‘@„ÔåUÇ~9GWFŸª…Eþ|g¨÷­×»t×¼ÞÜÙ|¹õü\]±½ÐBEŽñ6wÃ98fq=¸Øš2œ |á°cöøÝ ‹3z•Ü€ üe\£ÍFU äí då‘âAC ™<£×åu•š; ±k Yº“óÇÛ|ÂWU#sI7üKÖ™nóI ¶÷‚œçêö ØÈy®VùfþVfm÷,ÃRȆÙû#´ ÙGÜU_÷”Žùlw$Šhwhæþ¡wö@÷6°jLTju§ Š¡…Öû A¾§°1M„$˜Ì¦Ö„Ž£U±ÖPÄÆÇ[c‡¸gˆ ÷ˆ³£$öØ3Fгÿ\ÕRÓ˜c‘0eT='Ñôc")n¥8KÆV©GÉ€óÏàâÑÏ!FGA¤1FW¯r ½ÄgÓÆ‚£üEg×D›CoÔRÇš<ÛƒèŸD”šâ$½÷Á3e ƒEɭź¹Xx†L¯9 é QC ça…­×™I×¼ðgæ"ë—ÎdɧŠ]ªW¦c¨Qõ¶‰å ^p+s^1 *’óñáÓsu;|9Ãõ©bìÙ‰òK u[ÊT˜C,B…ÉUäôÃמÌÑa¦é;¿z+ØçX¡¶aç‰É™ZÕbUÓ-¯"Ëéèõ Ó<çÙeÄåRÄIAŒºÞÞ§1ÇEÄ!h¢`g÷Ê™™ŸÕ%»*‰ÓŒE6ñ1£!®EƲ,HÕfävÑ-ÅxSËaKWâ’B¹ÝN0ô/ßèj=í²'Æ|Žg#ȱN »– ñÌ£ÕrFùF`{çWÍdͳ1†4ž ?)åxsCYHCô,êm¶pN -ásèiýîªw òÇœP$ …¯Œ'²Š'PÓñ\•OZfG¶SZö>u#8f ‡$ «ÛO<ÐPgJ‹8pÂ[œ³¾a£è KORûfD±aþª¯¾±ÍZ9”(p²+ÀˆÃóÌ‘0Ô×Û¤Ëæ¹×” ¢axàú5|’›0¢„°Ë3zÑùÉD/#‹ÊH"eÍ0nK_‚ٴWºÆSÖxØ'šäêoX£ú6ß÷ˆ«Ð|",w–?Åo¹ÔñM.ö×!Ý\ÞnZ„åPT:99iy äêćgÿëöà‰€Ÿé§bù>`þ_­þöù«?W·ÿ8þÓ},¶ÿXY]{ô(oÿñàá7û¿àSɰʦ\Â[(²êŸkH’2u²w¬}]ÂC¤§”9KG¿„ØKïõëÒU&ç™ÑdZÚÍ]#ô×a;ÐN‡¾ÀÚ¶Ó©;µ|ávõØêAZßD]tû¶ò|V÷:=øÒ~U§ï/Y7Ì@ÆÆ“+­X¶`L‚ò¿NÕ¼Í31ý5c ‰þ0×Ù· ëK?‹ñ?¢{zúã¿ÿ¸ÿ?|p/ÿW¿áÿ¿äSdXbŸ=Nˆ»n?Îͱü5>[Ʀèt<ž§¶rœ *,š`åýÀs!ºE•XËé¸?˜UÝ óÉ|‚ç v%“Z¦µEÖ¬ˆÅ'ƒÑͨMfb,`l§8w3Ë{zƒñ‰¦–PB¹'Aõà‘’uúKìÒÝ»Ìí¤ TY*Ñ4Ó’vZ?<9ìvCM2YG¼Y#p ä}7ünÂiÞDÂÚên«ß²ñX>‚­‹[H3‰ŽâVÞ<Œ§ti¶zñr÷8>ųez»Œ;ËÃÁa—ÿé¬~ß:ž Õhˆ¯Žá©Þ xDMŸÍ:4pÂlØäî*ä“4m.Ì©PìÞ‰Ó{|¤yÇÄ Ž?‡ƒÿþÔ¢j÷DMlùïƒÿß=¥$^¿}u°ýã/[ÍŸ7÷¶*•×?Âú{+Xªø dŸ#µÖg}Àð0Dή•†aµXÝ•z@§w‘m7Žß2rzéJ7øÆ>Ã^ƒ]–Sˆw;3é|Іƒ^èæ©89ì˜ùò87ÛuW".y݈N÷äPB<¤½þ±ój‹…í€ ®ZGÜœž¦—)cÃ&–+7"ÖË¥%à¸xÓ› S@é)×m­»ÁªÍ\mµ²¥Ï-™Õu™ f…£á>¤1w æc–¯¡â7ë!Å1Y´´a–“|}4YGúñô]:±»«lÅ´­„¼Ò¯;º{i³8UØùªkénè¸^;g×ýVØ{7Ïùé 7;öbR0#X–RI›'3™죺ÉrÉÇ9WA>¶ÁˆÎÅò|=|‚õ'[ŽÅ:‹Ý¹_Š2ÁˆÌpVMæ(ËUƒ†S£ª±Fœ-™&Óx¦ñHœÏ­£–®··®z#·V)2f×Ó‹ ·ÇÂÇ¥ßÐ~wÊŠY@ûox ¾µÃ‘ÈM¢°g¡ äMë £™Æ&çVÀhðVvSôüV²=ø…ƒ•õ`@ËïoñD¶(èý,…K¿ÕïÞ¥%œ¼|Hãx°ø>{B$ÁýŸÂsYü"MÁWì»ïœÃ!óGƒCzó …cÆIA½’s¬lÛIt&ŽÿÙë{z)âxg¹­ôTïŠÜÚ¶mÜÞ÷„—ÙAuÜÕºw­[Jo$•‰®÷{ÁF´,$´³÷%§Ñºúù/¾áŸd}ÉA‹}]÷F+Ag¯t³å®µ’&kJ†}ùõ2¹¼ÕpiRÇ6^vŸ”\&ÙV¹ðäÝÚNÄ9ÄÕŽI ïe¨}âaõÅH]»Ô/Ÿàj d¬¹ñÓ¡kà¯ìR”„x)Br&u5 Ó(¢—#‘Ë0H9ÄTÍÅÕ¥žÆœþ_ÍÞ]úYÈÿOfç_ÆùËg1ÿïÑÊÃ{þõá£kßøÿ¿à¿+Þæ6Ç“±q ¾ùd}óÉú擵À'«Ø#‹ÍÑp|Èéx$ûÑ ‘¼¾8}$á=̓(Ø 9¨ ÂYIr€úÙ­J¿Ê úH# çc#>§ÐЈB}ÍõåZRp±âsÂÜ6¤óZbâ À³D¢P¸É;åæÔÉul ÄõÀæïUá‘3ôpñžKl3{‹@ÏÒÑ gýLJ_¹˜UíÏ#S¿²~úsA…ÓÁˆmÓµ‚þLù¦~ï¤Aÿ$ Bއ³Ù9®A×OG‘‰2 ÿfYiÖdÏŒ‰OL£°¹Eô©îñ°÷Þg3¨¬ì§x¤…¡þ;Ø-„OüŽGHÿ"÷bÚ›}‘¸V&¦•ÛE]¼ÔÄ”Â'šµ6´.&Ç\ 946ÞAôÌØ1 yK*É®ýÑd·ìsP¶Ð†‡ïÒÁ ”‹Õ]!@y³g&ûÝô£±[‚*¼¿fÄH>»ÁPs‹¡üÇgeƒOºÍºyª– L޹ l…¡© rær—“Ÿ™(t"¨ØÜ«—­­7±£HVYÞmÃDÜNÇÁv@׃±ZœÆ-¤^)…[”Ká&«8 ™ ãÔf4$ÀÉ4‘aÒ ^A‘ ð¦®à\8;ô=dØóAÏNj>Y“÷nŽLë?@ æ³hx‹«ÁG|É`-€ôàLþÿìýûB[I’/ŒÎ¿ÃS¤ÕÛ¶„% Ø®ª_clsƒp»jl¶ ±ÔZ’1ÝíïÎ#œg9/q^çÄ/.yYkIચÙ{_««±´VÞ32222âÓ55…·„éÚHµÛª£ÃyÒ´ø´-zò=mÀÖ¼¨”en#âwÒˆèÉ÷4á`Ë{Z]ªD®lC­»bê‘^5ËuøDûï(´YîÏë‰/V;k]¿×Õ|íĽ›ÙÏâHŒ€Ò(Iå$+õ°äi Ì[ÍÔ`ÄÜ E‚ïë,8…0oÅaw—¨õÚ‚tOSì]èÊ¡¢9Æ»DÆîî‡Ý4DòéeywÒ#ŠÓTa¡Í§oš™Œå¬z@æ}´qpÁ0Xrý£Ñ€ZOTj[ƒÂs¤ ÆRއ7¹D•-¢? –“¸¸™M"“¶€i°s„=gkhÞrÍJÙê¬eè@¦hØ~¬—„¿þcˆñP—Z™OÜÚꦯá±[§#¹­’Ó»(íò·Leٜ鲑½›Å€Fqïñjk—z°föù̧X¨§ Œ×ÙE8PL²Óš…ëôü<§²0WïD$±×6¤ìçG/šÑœ7Äè^\¨yß_{Õ¸6ƒÚ9ÉW(µtÅíjÀ5†RÕ1üþF0[dé¯î‡]ƒ" â±â)j¤ÑG}t:j›‹¿«°Rzý d^O•„&äf™øš¿_‹š«\\žDÒM…©´I}±p1;˜+ƒŸüUŸ¨[þS{^¦vª0sS$bz¿Žo»šoÎOÎR«A Ö Á%ŒŽOJD‹g™ø¾——Êœaù¦‘2,ŽxØeˤQl‡ãU(_viáö̆3†NÜ`èwpÔÔüýW]AèhÏýŠÇ%£ FªÖý±f>Ô¥›<—ûŽAnç=¢´ßìïýR!2ûbº€FDe"˜7H¥BiÁ–¾´&W±´–©'Nï ûôqë} ã-‡»õX‰ê2ضñÀò‘„óbéUÃ× Ñ7©”EX—ŒÐ¸Ý^–MúT¨ý&Òó +Çà—+eeQoF/J Éd8JãÛHœ¼hûòñó Æ‡WõµdDõ¢à‘pÁ6n4_]?_*Á”]¾PË0ËŽÃÅ­ ¼Çt ~Ô*Yüï¶Þïîý» ú¦=öuƒV‡""Q_ØD‘ xA—‡Y`ûÂU;æǃ‚’#!®ž æirŽÃÀ’!EânIºÕÏhbÒ¹lƒÿEaŠJ'ÞÚÚœI! ¨oag9@éªé|¢bÍüw)Áýô¨ÈqK垊Oê‚",Øù£ *D·#Wgå0n‹»³Ižå­I¿×Þ¼÷ȾUÚ*‘–Â>]=ݵèÖˆ€¢¾árî bkC„èÏÑvGî"õ ¾]B!ÁRJloÇ®ç3×c#‰A›§vé rXÝ >-©°KÓ>+±&=À™ªHx?ïeÚGHEÁ_ÒB´tzh5á\BÅÄgV:{#’+I@·m¤Ê,WÕ€™Dal—›s>”ŠFäô…<¡ôkFÄt˜"ŽM¶r¦PH‰Œ@K’N‚ŒÐD‡ªnˆ –PJ ï£Ië·Ñ\¢Àé$Ô‹XËŽ¸…D¶ kmHºy½ûÝo]T¹aaåz6ذc-Ó]w4ìõ%¨6Û†W#˜ö€çG±â- žB_,Yt—´>ɳtCEML0ÉîàÊûÇÇ¿°ŽîOúS€d¾F~Ol:’C3¢5µ]C—܈l„@ò%Rïv?üeçàå'한Ž9ävK&½å'=„‰‡Ž$»ª¦ä·AûKp-’œF͆==ÓùäóZ„gQ&EXûhZKJÄÒ™tÏÕú'‰¥{‡å¿nÆ"ózÙø<ë1“#¥ÞΟò^ç—Ô`–,x¿²‚}“!Á'†KÎV°ä¥ˆæ5mTaìÁÐ+Ê€§¥zëÎKâWœû«f¹°æPè5ƒØÒÒ´øËsèÃêËeÛÝÏLù?÷ùʪÏ7Ôù˜ž34°¬ñõq«•”7†%íü ¹þ+R,nk$E-SXHËmµÂf¥qcý>úWZx×tß:vŠ«Ìˆ–£Ø’U\2 ;ÏÖ²¶²¢¶ˆÕeðù¢üÆ‚Žš\Qä~‚RQñêh…·ž†­lgûõ/ØJ`<à„ý1‚ìˆø^¾~ÌÔD¡Wµ7à¦Õ}YôÖÆ¤Îc_f}q†nãý;ÏèTÐt ô¶écˆxž4å(~]â‡7Vˆ¢`¶âèy(Iïxi ™MXžÀˆÉÉœÎ,%žv“ê`”õf¢×ét„€ˆ•‹m¬É”¸1öWk¾UlÄ Žæ‡"Iûxc:8L"‘06Äï²=D»º™ìýýûwðÚËXá` qŠjÏtŠS$Û.v€”¤mËrîÙÜWîaÃA–ÇÎúzOWn)a°¬&þê¢îÙ3fóô GP%¶Ò‹f¬‡°†Øµ·cÛWǯş¢*ìže˜/€òÃ(™²cqâØ ¬Ng]Û·¡XíœPÇóÙ8›œf£Y3ÚØ+ІL ™œ1ø¯§ªäJ‘I³6+ø“û»ì½#,íG( Aê6¢Í¥@};ìïm†Í&nÌÝ“»¦t(/§w7)ýÕ~\zžlq¾íÃý½y­ÞQ ÑÆä´&ÉŒ§X@ìÁU;=𔂧DlæúS~õíáo&2Zˆ +öµ0Ô`B¿‹¬ÏóP †§çý}¥µ©šÎªñ½vJ•dÒ u‹ØZÒL'WB -š^¶9(Lo:ê5N#Sú›i¢b¶£†4lÂt|/Bj†ï#CÅ2AWJh£x,²yCÐE>x WÍø…,Ý›·7Öv,XÊÅ,s"r8…)šYÖ½Òe|cÑ…à¬pOnafÊW9Muå-ÎÆ¬eìOùFÓHÈãdñ½ãìBÁKsÅʆâ®Tã¬káüÅG0ŸÂÝë¶s*g»ÉÏ[±Ö¡XÙò2——4½>"—žK—r‘ yÎ|Èw*=RV.ÇÕEÞ“àÏIØä‹v{j&‘$"ö )cv¹<\½ ´fMWÑÌíãÃ=ÄSÖ4¨Æ7ÕÏ×îÑî+i,N¸"Õ "æ§È­ÊJ€b¡Ÿ¡·£4Y5©ä>J_-2”z©ÛѼ†XÙ×.¦ô&G:Ò0;gÍ«ÕÊ™ nQÀd6f)3 v+¨q ÖŒÇCp´aÅ¡ƒ.Àd^nîˆÌƒZ4*ÕJ‰pÉœÛ}ºÈƒ2lZ3Už8$'Š!)zšô> ¾˜-¨…ý;¹b+\ëÇ$d_ õcØ%Ðf¥O³|°%„jzý)¶¼ ïËUÍŠ;8ˆÞ$`GOãÞ¬vÙ-˸.b7"ö…:¾"§-eV¬ç+nð-4Ü<Ê-^K뽫·Zã¿m¨êge‰•û`o°m¡†ŽFySK¨Û-îþi¿ËI$àœ`j`#€½å`Nhˆ½ÆëÝÓ vÊÞ¸ÿòòreÐ9®Œ&g÷ÿ¯ÝýL&îkcV¦_§¼ÍîÊÕ9 M6´.4W¢ÆØé #n|½3€98±Vµó’™ôE®¡RA÷gñËŠÐ4ñ¬§%‚È.:]NË«ôU#ç®Û]•LÚ¡!×Ì*ö×ÿ'ï®|ûCüË÷²´ÝzÝ>ñ#лmÊÔÕDUy<×Ü,T¢£2ÿ¡\ 'š§‰+YoÜ•'Qläèê¾Ñx©e7’ÀÂP]Œ‚+>P p-ä³X¢çÑÄãàÁŒ‹kÚàîm¸Û«_[OéOSÖIx@çáTcºÓŒ:Óôƒß ½0éÜ©p¡Ë›ÕIeþ¹Ãdý7Úâö¯t_êO£ŽykŽï»~‰‹Mš%È´s^#¿o*ø`ì'œtµ`I í÷qvÿqdkùôþ%¸Vµ¼dïP;B@‚òyÚ™¨qÙ. vÂ+/Ç5 =“L<7ú\†üj¸j'çÕj(åB£:×±+Í.  cOÃ0bå& {2åDºS>Åp‰*òýóDe#Ô}Ùg-  k(—ļ½<æ]MÐÈØ{§Áð|x³õóÛ­ã×4Ñ &8ZHçÎ'èœxpÂ^<Ÿå‡Ùt|Ä5ÒW\}ÓàþÚÚ¼3r¾¶ö Ö(·…Øéõ÷Ý1‚ºÿÔ„W­Ýð 1cMUC‡ú–œÃbsÞ¶ÑòS[¯Œ+nÎ-_Ô;±âu+}™Ýx–.2úIBrMwbŸ8z½žÌÔg6EÀ’ùýÛ=¡mï·‡Ûí7ïößìÖ1Zf´Œ~P€/]o" ¾‘özÐùÛÕ­[f¦l׌áŠ1Ü{ëŸÝuu'˜Kª¤[€Ì©)¶BU—-½Ã7Sa_‚“RU¼‚­´ v<¤ôŸÑ:ζX…¡=h¾s,m§ÏðØÛ î÷üf…°µ•“kÅrëæX=°å–„3ž\tgŒ Œ¿Áhn„êñžU/%ùv8jm›Œ ‹\ ä,Ð֮ӹר´æ®p/‹Œj‡$Xí‚·²ƒc~•O³ æ°ÒïCw}ñª÷ æèw‹#z·É¢·¤cî̪h›YøŽ4S&Á”–×°ªŒPëuæD0øÇÓCÓPŠ1×Zk/bÕO‰r%Î^é!S\‰á™ÇÍ™l€éíSÿ:ƒ;â%Õ¼D#Ð6ósEOJRZü†¯ÛBù¶û0䆚O©¼5ˆ<Ö?;>:~[pYq»¹Xä·h2àžû,„Jóv€ž´æïqómXliHQ6;Þì»`SHª`ÌU&oI5¡–k‰!(þ¯vYÿççwü\‡ÿ0ý ã?¬¯ÿø°„ÿð㣵â?üw|î//¹ewtN›5`ñéH6é³i&Û®ŸºÉ×/ÓÖúÊ+k«®¾M× ö>’Vníück& %¼Ê`𞠗κ—NF_á.ÿ´½Ôk€îÍNÜã ú§TÊØB £ÑD”oÊaÑ™b–Ô+zê>¬ýYå  ñÝ¿|I.æ÷¬Xþ+–`…àU,ß®¢ºûßW±ü›á*–+ZÅò÷UHÇ´Šåù`ý*EyZ‘=¥ØvWnMá–[¿ÇGp8«ƒª+4A#€º*`çë­¿ì´ŽI®{Þ~½ô'ôO8¥à%~9jÿòvç¨ç*¿H»ùœlïöw©ª4ÏlH4ÚK3X(Žº¶Ž¤ÐWí×´y°Ð˜SÏËíýã½´šÓîp:XЛ݃íbô†&æ4îí1åÛ:Üi¿=~ósCì“õU»½ýË«÷»ûÖ’;-“šN c¤²*[NÜnûí»£×* AJôr¿ mà#K¥ôyµsìÞí¼{qàŽwöv0¯t }³ut¼C«uÿ…“¬8­pq¿cëÈEªŽ T/iŽ‹ÑZÃù¾ h„»§tS|°1xûô²/f5¬ëgÒô¦˜ÒÐâÇòs§=À¸öEçªM| ç ÍŒ :Üxö¬¨8û’“0݆_~Ð>|¿¿ïX«ñþÐýƒ¾ì¿ØÙÛúE¾™ÿ") ¿p–MÙæ‰ÁQ¤ÍwdYº€LÆÐÑ{*˜ãéÅ×ZÜӎCjí¦ï¹9O 9®ß•æ­ËÐÖòÚ´wßbR,RâÑÎ|v^xRŒwñ›ÒàM(PèŒ~¨  ×áø¨J!öHÚ^ÿu’Og_.¿^ý­8L!ÿz9ÿºæ_][ððÑ?þôÇÎI—’„B<±òJ°j7ÑßMZ1­úþÖ+VɃÆ'ï_äB·ç&å 4½Ô¿ê_ß䡦×M Ö“\Ó†umÃúfBªßO࿎ÄoJäÕdz©‡÷Dï‹l|ðï#þ—¤ÿéM¥Žÿ¸óóñÛÃã]Œ…k@IÄ+1§µ/ÜÙzãÙÏ;$¯d cã 2òwQ/xåÄnûèýá4A¾Rê”M̤ IY(«¬§ µ@ãjhRÓ²{;ËÏ´ûWB³Af‘¾X{:žf´ólÖYx â¤Ç<ÙÅl LNò®DY=¤Ç¸w†=Êœ.Øô¿×Ï»ý1¾Æ™¦SX—t¦î/?6ÝCÑÁÈäçýÝŸ};%Iÿ¤?èÓä¥5[Y[løÆès1¹/ô²¡¹ðzh<¡â{õ{™&±Ø§æñ™gbKq’M/3½êuòs¢Ô³þÕ,§m^×h»;øs­aeéÍ »°='†¸Æî,5²š:þpAcªG¯ÎĬôàÈJ²«´‘½‚ÁÊ:Ã2Bªå| xÎÍÒo…[£ÊŠIƒNÑŠƒW»Q›¸,^h^㘠ԩ^½õÕZÇo†â@áç£0ŽS\Ï ÅÝÁ®Ëè³\™ˆ‡ÆlØ%¹f¢!ø C£ŸÃ‹IZI¥ZI…æbÈðˆˆ,uËñ,wÐæ1%´6¡ÒˆN~û^޲$ˆ–R¶…Л‰¯Ôu€·›ªš}8 š° D+ºTÖwªRóü ]Ûo4X¾˜·ÂxÖ¢ãM‘•€ 4•ê®O¦y}B[¸!iªéü&"Î¥ÝûNž›h|‡kÛ;~òÞ–¶Ï§hp™ë÷íf(8ìÚt—VsMfÆÙ Ø ãë›$i~E£´ð4KuÒaÃOÏ|×ÔjÜ‹#ÈCRû³Gy{VîV-À‡1å,Ú¸ÿ«äC?\ØÙÞÈ#EƒáèǾ ¥žJ,§ig‰,"Á4*&'‹YzHW@5<+žplO…^ˆ'J/òU?¢NÏŒeÛý%†àžV’ ùµ3ñ_tìM¾¿ªm¦×AÎ[þœÇ¯T7²â3âðeÇ‹å—z×$÷—<ì+§€`o‚®Ð1§&‰Ë`eÊEY|GjÅk¤8 h<íÜ S3&žcÖ_Zh`A­TlF!ß[2™^C±lËéWß- yt¡wðÃÏÛBû¯…öffú-Úÿ­­?Z__/Ùÿý¸öðŸöÿ Äx Ó¼!xð* VPb2å]œý“Igr%Yßn0v:ìôV~K^Šùgø¨†úgø¨$|ÔüèQÕ¡£,Ê £:© hÓ tË·ã l:æ®§²H–¥›þð~´çƒS¨ ¦Š¸‹Xãí`/D¤PÐN5ÄÎBñò쯳LQ84|9³¦u˜]´ ¨0#”¨¿ü¼?D#úC}r•£™¥dW¢ñ-O²6æÃB;‘@&YK1”Í5«›8ü4Ça“ãW±?»p9NS ®”5A¾*Áš|]œ:DæðL‘ >há" VFk»ÀY;Ì=ò¶Œ½:e“nή*ûõçìʇÐgCÆÖÚ"çL¢ È"x“–¿Ü ˆEµ¹ÿMÿ“d½Í¨yÊÆÖ¢ÃE™¹0÷Î(Kb©x ÍU/ë@'¦þÕÊY=Ì™ÕoF±¼›IŠ‹«v§×këÌ—Òp3(Ix Ü;›,c.JÔ†7 IEz©x6<ËÚ`ðŠÖÉg±XŠWr˽©ÔáH¾Ó` G¡8š¢ "0ª‹þIŠÐkظZÀ†Ð\³ÈLÿ6Aƒæþ?¤6lÿÔ)•ží©÷©‹ wÆXÄ8(êµýá^{ûàÍ›­ýí—ïöë§ wÚt8U÷n¥W´E"ÐhÑùFªdxDà UO€ É´ cfq*JrÚÿ:'ÐKû|4Õº.M[7@OEQž%C¬–­TúïŒ=ÓÒ `^‡rÔåbÊ=˜]Œ9UŒd(ªrIq6àçë=´êiðZT•ƒÐü8黿)Ì)6g&”܆éÑŽ½hë ÖòCöðº"r˜Ñ©_ÅzY!Ì}˜,™fKPë¯ËØ¢‘oÉÒ*•-»…Åá°ÝjBDÖt‹ò µŒÖû›RŸdŸ?Z€aÈ.¿×-$Gy¼Iž–’iKÉ´XF‘ŒµÌ¥€º^MÃzH¯ì'k ƒ+º[Aà 'ŒëjuzÔ“.ƒ,‡U’´’Φ@š a¹Â›ð¤Ë|Æ­`Fˆ©)ªþ¾xlÛ-¼Ñx$K™ßÍ«z»®mf– cz<›†ë ÁKÇ¡ž7¢ÕbYê52å¼2h˜µT`ø}«¬¼6Ê«×H~nês‹ÁËjÍÚhh/è?Û–Ø,rî´30ÑctŸ–]mº/}™â¯!~KZô俪èµG×1…ï©ã_} Ûï»?¬=‚×ëõZ œŸ GŽNaìnľôAk´+æÁ0µB®Õ;EëɃÕrO*XSE'BÒaJ$9cú¨í>[ ¹M¾9”Uί¥?ð¦óc¶MF—­Ù¸¡W²ž Ëdw6윙ÑyjŒ†ìòõC8Ä‚ÉÂëà2Ú_´ `ÈåxÑ áI¼ j¶”†RX*›ÿú¯†S+nª¬ˆv)n¼…)Fs;>głҦ ÄèÉ §á~0’ÑIÇX¥vzîœ G9öm¹ 3u°ÙíŒ;|MŠà]ŒÇ.›2ë †àKŒ­Õá&Ó!¯ÿ7œû­¼ ]sKC(ùº4yžùÉ\݈í0Éb®£+23S €üúÓêzÃìuŠ'n8eìe€öôؤõ†c áÜ=?ÜÚþsû-\€Ú/w÷w]½öqõÁƒÏÖWW>NjCÈÕßÅèK€ºÎ%Ú!~d´•1P*XìEœì~ZY÷Ðt¢P˜‹›V™Ã ךín›Öª^5(È ÆòŽ©±Œ âÞ^)¡~aô¸•ŠÁÓFP-‚yÊ3¨Ê _ŒÂoËyËÆW‡ÉÈz+®{ºÂXtùÆýûg$-ÌN M¸ï5 ÷%óý~žÏ²üþÚ?Uµ" r•‡U[žNZL'رNO=Gã8&l²å%nÊkYpÛüsMTm€(ÄÉE³¦iÂKŒî ‹2[6Ýà+¸“GCˆß]ö‡4ç1Q!2¯Þ¶ TÁ ƒ>â™ ß7\­&N ;¢†€Pž\SM¨V‚ñBNØÊCµ¤X£‹›ÔÍ>ÝшéNë©N ‚³Õ£Ä÷§z /;7Þ©6‘*¿oƒ !rg®…¾÷Dýu1T{‡œ1|d L8ÇïÞ–dzn¬£Öµ2Ü4Ý „†¸b|]?#&# L07Eq¼V•™õB‰¥il®ÊI⯠e§©ì‰cžrµy›Ôvö×í1søÒ̲¹Ü¡¡í¢yYZ…êÁ=rÓi³Õ–ø{Z°¨Ÿþ^nÎ(™ dÁ$j`¡>Aæ¼Öm؛Φ۹®!ß f/u¸Ê5|ç ŬW„h«³ÞŒ"b„͵ÖÍ.\T¯K’Pn{†³p[ŒœÀK¿áQ÷ÑO\ܧ ­/"evU®HŒY¾_AÁ‹+vgH/Ñz1mëM– %Ѫz|þbEJ| *]ÁÃoó‚nÔ˜«ŸÎ^ ¤S'-Z¹T›ÇÞ§c¤EbÝžz£H û:­¯2ùgC5Û„Š–Íº˜V\] ëÂHKÖ?–Èã]·^2þÔ>ʪ³P% yzŸ4éM’ÓÁàKŸÏoEúKvUe>„r¿a¶1þÎFãa}\]]cb /ëQ8Áò–àÛSŠG•Vߨ²u‰Ø©/ÇpÂ$»‹ÿ*là×â:ue_ÇŒ¸(S ày›ϯ1rËÏG—>jqúi×CÎ µ¦ nü}ÅÍolÎYði gñÐÞ‰×Tì,cÓÖ‹öëƒmGp`Èu>s-à½F=/.|¿Bz£nn}îó\")š+_Ó§ýªŒó±D>\Ý@› p~ÎÚ=ÜúÆ áy× O‡«bì7à´«‹FóËX”íÊk¥cM]”_¼ÕÄlHTŒ¶ó6KÖmb†BØ• Ãït ]6f ®„JKáz̦‰ièÔOÔîÇ?€®AžhB:Í`°AS4‘æwBí@ÐkUK„HÉΚ-ãEÙõ¦B_øw¸ªÈ’€ÝͽÍМ¶4¬/›Ù 6àI³ulRVuýŠWj5•/’¥.‡‹*LÊ2[*žrÙÒ` cöu,nX×ò›[ò®Tìq¸×þËÖáîÖó½ú²÷Ž]ê9HigØe™ÎVÜ31ð5¿Ü²lœ7ŸÒhLtï¸Tq+Ø÷[Ü$ƒBbš Uo¾,‘hi=É­²<É ÀSaJ§ßƒ—n44±Á.‰éxY0¬ dE¬3„ïÓ †þö¶b©ñ$ƒ£ÞhÉÁPW›ð6LNXÝÉìtj š°àŒàœõ®k\@¡™ vh¿ _·×Ïni_æ…4S’‹(ø¡Ï7¤…Ó,ÉqsÁPO%\®Â[{+Š(@@„X»lQ‹¹ ‡ElvsB¤Ë#ÕOf¯=d { K²ÞЬ ’Ü!«ÔÇæ Y„ÕßI)|-B íŒöìºÐœ,Ïš¼°ãxïIáuda zpÚU|xÍÖ™AêJQUÝ-xlê啌ôh˜ÓK¶-ã[ƒñ@ä\P;ÝsIm`¯'Vf·¢7 Ô U5¥øiÀb„HíØå>6½¸UÇ£ù$Ú(fCÚElà8’2Îsg ŠÈ)ë";Äñ¤ûg€}îöÅ•u8¬i×`%^»# E÷ª§G¥ó¦7@»åÓ¶í$“P3=›@È1 …íº¦—#‡ð†$Vr$Eâ’_D£eD q\‡Š±Ifc XÃ!U4¨Ž*€¥U¹j뻾ތÞpÙ‚‚})ZÓÓŒU ö g¨xìœI DÁS#V Ǹ%(ó‰Šx‚Ì|TöƒN¬Ç0+æàèa¸ œ¾7Ú„µa‡vÛá,ot¾Ùý.3 Ñ`¸˜úЯ&"Ó2}œa勼`ÕêEÂaTøÎôœèêlB²USÂAÌ.Cd8z®Nl­oqh´áPw=kø~ízÅ7¥¹Èè0ÈùlÜ7ìСVMêK¶\ÔÐËl0Ê¿^Ôxv;=´µ"U›®µ†,<ñ«‘]ýtÎ –*7ïLW"ñÓ¾¬ü¹éCZ¢¡ùÌÔ‹zé ÎÈ|n¹qsê!d“M_™ITçUžRϽ邬^S'5hU`á(¸3A¤£¼xFZ^Uâ‹N˜zt—re€¦ž`.6xCÐõ¾ìk|…Å×^qÌ‹ñ$[{#°c“næê n (ë k!Ê:LX•öA‚ š°!æ?M¾ñZ êñ—,´&h<¦GÕU0Ñm85øs“O §Y$°¥ý ‘ˆåjDÁçm?äxÌ6Ö£4Xå3™Çj§³è0@ùXü¿ ž5Íàd’Q^Ê%F†]¾&º°ßßkæ…ž †¹ÄîD¿6x雘IT\f~ïÞ¦'<½d$™ˆ±½øµ¿ìóâà´cŽºw…[‡ko¾û¿*„­` /ŒlT‘Ä;éÉî) ‹D”4ÕÜ9ϸ‘¼/#ņ/)õOë·èìº{tt¼u¼S§¯ü¥ýfkûð€™‚„‚bT}ëz3¶CcR!†Ó‰å‹Nw2j5ÊÆôµB¾ëpzÎõºì|,[‹@÷gbÞA/G£1É öݞɎÔkÈY"‘å z܎犯ƒýÑ©³“Ÿ»è²X+Ή|søF ¬k5eÕɢ˙ù‰ŠŠäÀ'¾ã&§f×bß{ßyÃÏŠ„¹ãE`ˆx¤`Ý. (ÚñÏGS aÛð‚S¿í&^O*®˜iå ïbí¨ÆÆL%ýbA;SAœ_ÁTÓ€ï6ˆãÄÁ¸ÔYYŽ·1²­Î{ãDBdú±“æ¢ûS/ÁßìääoAÓõÞd4n±]‹^ë¸w‘”ȑŧ²0>q—ìI‡;Çï÷aX0ò^*;85ÍîRfÜ5¨u¾BƒÅBí¿²a›nõ01b¥^¿;e‹.Üy‚ ¯Þ`XŠ‘K¿˜ñ²Z®GÿF}nKÃTê,ìa¥K0$—lsKbõä‚Oa¢Kh,‚ï„ã1‘!ÑQÂÈèEq¢¹ˆºTtÚÐB`â*7vQõó,êãšãÉàôÞ.Q‹F`¯EÂlqO膱ÉT¼ í´¼dN.Q8IÌÎ^OMe‚¯RNmì|Qˆ¦Þl<èw;Xo÷yǘ¥J·UÈZ‘‰¶¦ÏzÒ‘áÀŽ´¹ÝKŠUQ_‹(løw<È×|jVÚUJH'&¨ºGzÈ“¬p0‡ÊçP ÷LE!Æ›‘Š0zj`ó]¶˜˜0⮾©q:S¯E9Á. E‰ép˜÷ÖÄîkO-²þ”MèE•(2š[RTH JÈ#áll6~ ‘ÅóÆÜÃÏëÝ£ãƒÃ_š¾0Ò’í–Ôšºv»í £Í´‚ÈÅÄVèÑô›œúL÷ç·í­½½ö‹ƒwÏ÷vŽpÈÓÁFȪœkgo÷Íî>$°£wÛÛ;G»ÙYPÀÚ¢×mÝ!yûlzž”ómÉú2¤—JØK…Risª§%7ýë`uè á ã ‹¡Ô*×rýãäC}Åw÷îIA­V8¬”F†raÑ×ÔÌø‹oµ]·{ Õ¤"cÓ·\Ö¾Ÿ`"îqÞFë)S_3Zô &/m²ÃÿëŠD`Rá kpN°×¸“ yå¶–m;FgD±X6³Ýs\æÊJ|ŠÀJhïìþâ–mâE–5G »05û5‡J?a9=)B¨·ærû:ÿTÉ%&|ÚI{ÿ@çÌúíÓ%"??–YˆTɹî¦I* ƒ¡ ìßOb,—§-¸k›ùxX]]þð[ÕkÓ» -pKÔ†9d\Û‡M ½UŸ_€ ¯Ý;\6`¹…K :_^˜Â› [J°ª:`3¢˜ MZøÖLÂB¾>x³óêðàý>Mʋݣ·‡Å@¹ú©xÖK´Bì ¨°`•}ÑÏO2H¯9–ÖçŒuM0\ÊÔêh4 šÓÖqàõ^f>(äÅŒøò©À}ð%Äň] µPÕq"u©ý½ nº-n˜ZŰ.Α»=«³>-à9N}Ü:ÒСó!hˆ»xA~¨Ðú³ÔtÞïem?i¥+|Qc²æ›wYp¸`«WvÓž®æ ãÁ,o«½ˆrS[óS.LÕbÅŠDš(Ñiëél^¢AvZLã=ÀåÒvd;.y)é²ß›Â [5k+—y»;lê[ÿÃ.ÓùZ_kòf#éï»G`†DeòŸ$êÔÉ@lXrÕhˆä?ôƒkÎÞ™DñÇ,5²æó8š{ñÀž+›äÖF¹ÅFø-=ìØá=zlZ.3slº; K6ßu£Å!C¢²µÀ……øŒÞòŒ#Äs(A(…¶*û±YŠ@ROÀ×ÕÔlqSš›ÌF*›‘BŸY-,“Šõ•û¾ÑtÂ$îȽÈHW2á~uˆv¬¼B| È~Ó‰ 4^2’Úšs¶¾bMáÂT78èÐÛ£Iù_˜ûˆs?×ȤÝtâç2Ì.†‘e΃Ôè©æ‰É,ñ΀%*õÛ›ìEÄyÍ\–'à ð4Á.p{âÜ%ª1óᣋ‚KW¤î73¦ËóÑ ¹¿NÇþ:ý©Ê³¹z)ôÊE¿‡*ú¢\éõOOû]ÜH²å®ëŒá†#(xšÞ?¾—í¥ãj_úœœ"ÖXKæHØl_øèpPŽájË‹)šUÝÚem$N¢”ºǟq¾\K5èL±­i”õ)xUÒ)îia4ìÂw !';h]1‚ ÁÇÞS¾-”v £K=êÃd–é ¶b§.¹_ê#ÁX–W+‡†«ë%%Pâ(ÇSaá¤0oùPBEú Õ|ª.!4gµ2³oY’_00%Ÿôéq˜2ÛmâЬtŸ&}–‚å/ ?±l]ŽA;À±\Q7ʬ&'1Æ S#ÿ08Ö o-bu/Éñ¡($°ÔÉ¡Fb.¸éú4?13¥'tPVq¶4ˆ}6’_¾o§¨IŒØÆáäÊœà"㌣4³öLÀë½G£*Þø ’òÉ:&p*q!¸.vO°.Ò@™ðêˤAú[6ÁûC‡§ Ñ3Ÿl2­Ç/lèÿˆÓ>L®@Í.ûÒh[{&e7#o‚U^‡aÇ6>•ôëkpóASWmZÏâvmÌß²E/bÃ\±Ä7½&"âû‹£KÚ:”²¢~¾ÊbzKg‰[¸O”B(Zá%a0£J?Y@¦ª©8²Ä}[Ñ `÷v0ìÄ®çV%)έ32Ü,´ôéøÎ—ö)p„ª>$MI¤äÄftNQ,¹HÜ+ñ ¯Ê› ¿Ø°+ÌK«ª“‹Ê¥†êÔ:Hø"Š]¨?çP+÷dI¥Üõ¤ÎVÒI•Õ„•úPTlpa«ä¨Ç=±¦Ïïëxœ.`¯«&VœKœav¢F0:sÿ1oU-þ² £Òý¤ÐøFõV㻿¿Q'þñø IåJÀ„<æ[Bå|*ƒñªÉF›¥rc®Gµa²s˜'ëH^¹5y3Jû!-9ö³ §¥˜%D¢Ü­'º<ÿ㠕_Iï„+Q—‹WùÞò0Þ|4ù© ¸> H^z4·lgÆÔâQ×9YÃßI”ÕåºFÄ,,+u%õŠ«Øžã2Ì2?Ýêü©“‡Z¼ß­L/ûoš!b1-·Æ¹ŸÞÝ´AÉQ46AÙ|¬Nrç ãÈ÷"Uèˆû±i³åX›¤(F¾*ÖnóþYQ—¿ªkúÎÔ´EuSb¨`Mô1GäÿD…­³÷+JZû·VÆ=5Žô¡ Ïž*{ùê%ïm ÄSEîÈõªgbßĆAýW0E;xwìmÑâ‰H´®µï´GGúšWL–QœtÈÊ…Æm:ƒŠ?3E¥m‡deë]>·ª‘‚µVäÚa…IÃz` DyîGE‰|äm‡ÅzjM8ŸcµLPøˆ-|>†­h¼Ãµ\¡Jtj¨øÍ\MÜ·%/—˜Õ€aG§¹nV¥$–Ã…gaZ]r7ÈÄ)Ü Ånï´+ù›!2\pr*'[*·j¼ì…ÕG^aƒ Yð¡f6º¨Rß …Ù@& õß )‘Ó4†RÐLJIf’‰Ðé“õÒ“Þn±ðâ¡^4·EÑî°J˜x’ zÁU¼qËËùÔN‹Ëm÷<íãH0³Iåm>#£Xh¸˜Þ畨·ëëŒÅô¥^;Ü{¸õ¶MS|p”{Q~ò—Ý£w[{xRûÒw÷nï {)Œ_(Orx[×çµ"ì¨Åံپ×e E‰\=zIrý,6iC½•LÆkÔfu+šÅNûñ «/ÐļJ¶kÍy­/V³~}5EW®"MºÚí—µ†{Æ´YÙ”—ˆ·áI)Z·­a§×{`ºÿr.*Q ü„`Ù´Íp"§ÙÅx4¡ÓÁàJq’Ѐ*Œv¼nÛk5 $VTŸvéagJcšgom½Üã€.wĺ°TŠÄÄmèfB­É¦…;¡E¡|ÅŽS°æÚë+²Ê|·I [Jó¶0¡^2¬kPB¾X­S5báìýîË£ÝWû[{;/«ä®S‰\§fQ›.ØØ”{¶`ýR†Cv1ip&3ø4‘M§gñ!ºŠ(ÇèH8úœ·â{»·ó»s† j • ®Ú)@i6eƒÑM˜ Î{mÑWcݹÛv<—)U¬ÆylßJì;™Ë^¾ÙÙ¡Û]lï7Õ·Ê ²dòçomUÎf8I äÑôbÌ»)Bð°?£ÓñÕnÿoY{j ð+º¤½L_Y†'ìlÑÌNý‚"Ÿå9OÖ7½:ùV¤ˆÞú~††kМölاéoƒÓà¸ÉøYbj$±…¨åb 7^ý¾Ï½(½ñlzõõ\O£;ÑÜP‹’‰az. þñ<ÅÍõÁ㇠‘ÿçJ\^u…`-)GÈ E61µÊZÒþ…z’f×sÂ.Læá*Éåª>— 5¯ÃJ .¡¥dhÊ#³ä-·Å•E˜ÓhS ’‹yÀíÁxòÙI>íO·‚ûV"¡´ˆ1å/ñvÒß dLׇŒá¶btæ Lh‹úÙ×z1™1¶‹+ñ>©Çùî9Á·ë˜í»:½„zt ¢Œx+d¼A£ë k:ÇU~¥ÇÊ£#˜#A}Šu í©ùÄ$;ªãYõ^zÚ9á‹©ƒ544)åC󗿬ôJ&Pboe ŽÎLõ1OGï3u›c»­ëŸÖé7‹AÈ¡¯Ý]w—WæŸþô§—»?¿ÙÙ@”ˆÏíôîøåOM¯U§_k?8yü`ÝÕßà b¤± ûˆ4D@ÅgàÞ²Œ6Q ±*R;̷͆EÁÔÙ˜ëã¤Á2ӹݖSƒ1LlR„‰YT¢"ÄÔ Á_a±ÌR ª¦8ÚU—Õ 7tˆÊÖZ‚JÈ ¨qA…0è€á›™w‡ƒ{‚ƒöú€Óë‹fCÊû9a7ç:2×seŽJ¼FÆÛŠ*6ƒþga˜ç¾X7^áPŸƒ’GEì~P\°À$Žj{¸×ÞùygûÝñîþ«öŸw~9Úù7Þé UîGqA<žyŽøÃÊ™ˆ7[¿<ßiGÖ"1¿&ÍtÖL¤ÃWYw‘ȳ¿Ê2¨rÁ¬J µÄ¸ÑŠHX†,ùh=Sßgè û«w„nÏGhp·ÒÔå;»E åLï©8⨇£³:cí ,ȼN†ú½$ϼ²è’Q**]Q~ŸáZÒð5 —6‚÷Ž:l}cf"œ·HºÚJ£%“f:CÜ…L<?ì>œ•!KEÁ£Q”°Æï›E®†=­þ¦oÎÄ¡¶e½7Ëjdb'>™Ö“òi66X_rz‘xGX7à8Ã&Øãpò8éŸõ—–,Ÿ\Ù°@R‡)CÁ1Á) |ÈÅ`£t¡T/Kß²f5b¦"À æî=j<Üz^Ý*—Ô¶GºLX-yÓY÷ÄÜ}œ`ø˜W°Ÿ¬kêFbóŽ«›ñU];Ót¥TÎ’qgï=QK"~jcpïKn©qLǺùIÛ?EÌ3ï/>:µ*ú‰‡ÁnÄÎ_ñ/°˜-‚Ã,8/KD=2«Ö„äƒUjf"Þï(†ç§VwÌp]nÞ±ž+ Éqÿ=&ø¶²ìl wj˼¬Íj»V=Çö“þÙ£ìgzmS"Sø è)rÝ5J‹´D«¦öõ#Z‰ÜãW•.fØ®3"Ðâõ>Z9~©„ XÊë±Ô¶Å¼ZSãœõ„ÿ zàuï×,·ß)¿ÒˆøõXèE¥†§úóéc!ÿX~Ò¿2á¹ü~ú8•>üoù‚Å/è÷SškP˜PGÚ¦‹lÂê5°Åe7ñqÏÂç÷¾év^gwgï…ÙË Žš™¹w¦Á¤Y™BöuL’n¢© ²ä½þ³²²r+n|Ö›’ôúà˜˜e3îf¤<1XØõg¤"@ÎVÜ[³Wû°…¯ìKêªÀU_;Ý)1¶G| A”DÛ‘´Ö6'ïȬ­2˜Ñ°“ÝIw¨Ø8,}^õH¤/ŠM?OBµV?q°#ÏK¸öÉ ³ŒyT§[÷él1U§{¤+®òîá§ ™ò;åÅ—•ųnùRØÏëu &`ksðFÜS,ûåÅZ?›¹Ñ°-áLùüSO"!¾VSð£ªMˆšõäöàkÒ,/ÝBîðk˼o­ ëFùóBmƒXI–t‰}ç“Ãõ×\èÕ'UýÅž­’F ‹jg¶ßîLGýú¢6Y@Â1{M¹ÊF>±I½}RYÜ+øÅ’hDÛa¿£A(†Êe6l×Ç€¨å·‚oú',M†ÂÐ îºÔþëc›’ÒËŸ¥â°{>©h¶¢rx@_o^üë•®e}iÅhrÍÖÍìŒ!o›Amßo™4™â—e¢GÛ/t\Ó‹-hTL“ýHú‚Ø Ý Þä¸Ç4ë b q4èÕqÆ ¨ÙšÁLßpSÀúmöwvrÙ@dTíI6½Ì4ðŽÕÓQðÖpǹßW¢x{äë…c×Fâ8Tkâijý :MbѪ`9?ñ÷ãa…z–~S,A*Å¡€éÙU ¿ß2ë6>¬ÃéOólpÚ`¬¸!œ¬Ô¦¹pM_W’ƒcY¼ ûoÕZ$ëØ|Ai5÷€^T7*= ø”P8ÐD„ž; Ô&²™WWUàÜßT7kö’ª}0\e›µ¬›M×ãÕÁº&0ý“Ùþý8²œM€rÔdÑK¾/ÖÍ«ícívþ±Ö‹)ÔÈ¢“¯ ↯~´C$TJ®n†(ÃL´³9I¦ýÓ«¸y”ÅNõ–§Â§ˆ?ºÀ4°½¸8ËçÝÎðTÃsÀª·ÉÿQ ïăp'…;¡W-äóÁ»ã£Ý;õÁ¨yÞo~1zþ2ð Ìpñý)QhéeXmþÔ Õ5Ö^=Xm>ø±ªO^>\m>ü±5§ê )˜}Ö–â¥]3BóçÅ@FÂòc´ééæãÓ³§6Ÿœ=ýTQ‚8õIR7ÄmΡõ܇U: üô©é_=À³?~Ì–ÿü!ž?ü±ª|’Øa.´A«öÁ–†®2ø¿:±Uf(0M·¶ù`m“f)Oh7€-Òž pn¨™µ¡Èþ$1“ØŠž@›µ‹$\·ˆ %ÕêEͰÁdilIöqo€0ġ馓NŸÍÄdçÑp Q"IV¡/ùg.1€ÕËÐDÈæÊ¨ †:ZA›+H"Í3ŸñÏï*DQrøBŠº€èúUvnb’Šïb8î2eV½>Ük¿=î6<Œ÷ €qeÓ½¯¨$ƒüT·ÖXôã«úq«%k˜Ù£fR'–I€ÄÐ%™óÒüÉñ~̧h–óØ…ZЬÓâØWŸU>r¨‡Á$‡¦“+Åø ’¬ ò|HÓ,´QwbFN_¼,›.¡¡Ê*ýí”+Œ³\oj•§ó º)Y)¯”Ðe…Z:ǼA,Û¯ VEŒ±Â KÈÅ€*Þg‘O» OÑT0ͧ¯à_ØtyÁâ‚âcã,´¾° …¦›™‡íT›|gƒ¹Š1¹6$šÈ¼Lå Þ–inø1”³E'´Mµ¶q†¿àŸA±õ¯ž&#‹ûÁ U+Þh‹ïÙb<Õù­Í@²™^½„ ì½Ð”Mû ¡8aI¨Ïž…(†a¹¢éÚŽª­‹}M>åšpªŸGo0œ!&èêõªÑ¼ç= ‰óÝ{)®„Óì Ðt&:¬T÷–Æ$]ûqíþO«Töº"°‘ô t›pn~I¶4è¹ØòZסHÞ[4píÙØ_*eóPëjûAG~6†I´VR§¢ÖÑ@±šÉA¯[Ð ·ÖÞѬæR):à­!Q•qR7¦ 'žØÃPpaçz+% iù‘ô+¶`Þ5éèí/íƒ}?FQl%,‡€ÏÕ¿v‰•ÍÅ~W¦è²®Òªª›¢Ú±+«‚§Ö¢^‡“–l8ûkþá“ÐÇ÷÷;üfrÑár#?>“øoL–u|m©C×OLŒ#Hï#†xÈVƒe¿Š¨¸>6àI¶wþ‡M5O®|ľ.æÉà°Ã¡»ëGKñüîj¸ :¦N#ð°¹ö¢0BɇøÁì´§rcÑÊÍ´Ù{à9ñCn$9É$Ž5$ƒŽfÝsÑÿx* áï{)\¤»(Úü||Ý·Bœ¸T[ЛÑÜ“vmFS¢Ô¼qësâ9-^oÎ+ŽnÍ««áNF'2 F è+në{ÂÜÊgn¯S÷DEHøZ²›¬ðw@ós‹Ž· †ž(PB`Æãã ‹Ãb.²ÅE‘A$/j˜ `0š,ÆM§äáø>Ãø8JìMÎ[ò¨Kç 6Ð"Â6úŽ JYJ‘ì;–ÖŠ#rÂ$Q#rI…A©©»ìµŒI¢vZ–“fÕª"³ð!ŸŽ™—òwÛÎ¥¼k¬Ö­qÊsbˆAQ¤%þ¸Ë£Tâ æ1Œû§»‰ŸL é=9’Fê,,dÒ¬+´!•}f>™Ä¥«ÁnÚ±G£Þ®v{Mý2Ð~ï¿Q‹+·t¡ÓÂQm˜÷íæ§s žg6Ä•mCäÛÚ„°äά-¤ˆ!:’gK0 à…ƨþSÐ u_ñ°šÔéáP¢k͆løÈ7#Y}Ñùœ™ÓN“¹Ï¯áDìEUsk·?NÜ:þ<¸ý†Qô©Eà)ìÐñ‚±§äªîn« ̺q7„PÕšM¦ÏYï•Är-É Iî†üœ®—KN‘ëOlŵIvJ›l-ÆL Rø z´YÍ•–å6 Y$œîèÛǯwÚÛ[ûûÇíç;í-»;¨5(ftr ˆÌ ;åÁä«hüŽd¦‘V‰¿¡®:šR‘õ_{V(ÑZ‘zk8èúÖ"ø05Æ*1­¯;o a,e{A$²pû‰K©þÔÆ÷J«!¼²‰ÒcÉA’µ¢_™]aª6½%ÏqçVÔ?­·Ü‚$ÓÒ¾XʲéªZ½T0QMJ´d›KÜÃR¤êúÃlj÷êþz(3¹ÂÓ¤¾”È8% Aeí´Cò™™àvÁø;h<¦«l ‰DN|·^–ª¬™~ ê{°b“;¹!­_I¤Ú–á=I\>éãPs%Õqù,ÇaœM½5Þ¢ ¹=‹ñ®®9Ö˜ÝÓ¢T"4–çâ\›å#f‘„­Z×€¨#•*nÑË—8kðº6›‹>Ý™r<è-veÓÏÙÕ œ2sF²Ë.:]ÀTàŸµdØë 6¨ü¾È¦ûÞÂ0ñKŸ)_ú-è–ñÛ‚TÊ9„~‹Ø }Ų&A«ÿ¥3È$rDH¾)Å–“¤-A4&­^vÚÁAŸÕœ éøµ>SÜMÁH`ÓZËGDR§lNŒdVž ÈJkáÏ2HgÙ”þInÃÙ™•—¦ù|!ntˆ‡%EµO®ÚHVîê Õv¡Òä_Ä.p8Ì;„Ð2;"6ÊA A  ÷Á6mœæFØt Ä•>m LAüŠš ®hAS@˜x>À@ñïµt¶jÍZ ÿTD?qt’ðóØÁùC§Ü§ÛÔTsoXžKä2¾åÒX2àsÑô¦oçõþ]]ç%ɦT¡¡M—ÌŽoâdcÒ9ô[ØF»¹‚0ËèT#`^Oy(oAW~U<OĹônãÝþîqûxçèXî¬aÌ H ÅGcí40KÝi60o¹Å ¢§ÞäôîƒÔÄ‘9Ù+–«Ï30Ê¡ÛÙ?Þ9ÔSLðìûe4sÓ«1®›1@>6tX÷~’]ùVºG}ùn»ž÷¡@õõ/œuùïìC0ê k¦àVˆ"í-6syµSGí­—ÔÔöÁÛã݃ýöۭãÝýWŠ›ÑŸ¶mlêµ÷Ùù-5Nªˆ9Z¨á~èY½vL}ö:§ X$Ü)Lž Î°º£Î]xÞb‘gëŽïUÓ­y¢õc-Š» çðCÞk=‘£Z‚?²“ûœÙé©ïûDám™2êvýVœKe†~¤çÎæ÷Ìe2’.,œ…€z팶»s»¸ÙÆä+¥Ò3Tæ¹J NŸ´Ðz |Ïä6KÚóHüÿòÏÏã‡Vj>˜<\o‰@Ýú©ûãêO?ôîç“î}:D°õâÊùoª!ç~øá!ÿKŸÂ¿kW®ÿËÚÃÖ~\]´þ#=_û‘¾þËêïÔÇ…Ÿ¬¢¨ÊÉh4]”îº÷ÅÎýòÁéaÙn¹ÿ±Kœ Ìxó‹[[ù£[_]}pmõþúC·º¶ñ`mc}Íõ:#·óuìþÇk•är¨YÝIg€—=„ …Ð}6bƒ¤Ù¯㺾Ýp/:}ÚUwiãÍè!êZe7]Þâ-²v{”N§Pémº+â\Ш³™€/³"bØ»dó±VÚ÷§Qø()s; ¼Úçö`4q¯hëŸtîíìd@‚ô^¿› O-À“üœÅ ‡Œ/Ñ”#mŠ{ Ó_>`mZ@"sµ^_Y³Ê´H‹ÝSïLÑ…‰åöQÆËÙg^qG™™CÒÞ¹}ðöÚXþí‘Ýä+•ㆣgíóÑØßù›ñYžÎ|ˆÃþýîñk:»­ý_Üû­Ãíýã_6Í»ÙqØ:öAA„*™z>é §WðïÍÎáökʲõ|wo÷øXs¾Ü=Þß9:‚)ŠÛr´ƒïn¿ÛÛ:toß¾=8ÚYqÖA€¹˜3 §<cw;—‹§‘¬;ÞôùFsŒ²:ìÅÏW@Óh479„ïA›ØCÈwÅÙçc·'€¦ÛvWšî‡¹7@YÙÂÑx»sq2é÷àúfË­®¯=øcÓ½;ÚZ±•ã^Ó.)^¬™F»ÖHÂB°ˆï»ƒYO[ ì“eZ—–—%lgÈèò>®5úS5UÊü˜Ü-iÕGÓÑ8„2Ô*ØÑÖ ¥`<ô|okûÏí×Kþááóöö»£ãƒ7»ÿ¾³$üã½ÒJ—¸éè¢ÿ7>cw¦'fF“̆°°æÈJ‚ÂL¥è­(°ÈMÓȨ5”¹ã4kN Ì(nk—a¨Á ìlˆ VDhï9lXÚ.”m¾¾…¸.޾2TLIÚˆ]Í(×H­‘4'Y·|d´fq’£”³ÎŒÿ©P ™\µ›³Ÿ_•H¥CºOGr.§ ßœí7oWÜs­2”IŸÛ  /hjVAWÀ¸r/¦¸g˜^Âí댕E9Øî)³')&*ˆúê7Ð ó¤–p»ûÁ-<šÂ:¨,Ï…ÎÍOer"Ãø¯<ãöTZVω^š.kük}yBgÐÓQëéä¤Ý½7ü«¥?ÌŒ¥Î¸ ™'>mþëääÀ·HÆŒ©–×^DÎ${‡Š ³'j0Gùß0½ò =A8áÙ8îeÙ? 1h­qøýøNá®+5I½÷nçßÞmí¹UN€Yaq½…)&~u¼óoNÊÞ‰’Qk΋[¥’{ȱ^•¦Äåäà×8ùž Qu†A~ê8ÂÛM”F'°c÷3¾Ò¦Ü4ïþÎÏÇî‘ XöUÖ‹Æ×¬‹9ÞîüÅýÀ9ÞN²/œ#€[Tfy¹{HçŠ9ÏKv?@&†mìe_Ëã°E©’qèT$)¼d"¸ì >»–ß„ˆÀÆñ¸ÂóÇg+¢¯l8»P, ŒCbß…ó¡ÿAD濲ÎéÒ·¥¿ìíoB»Ç¦†FÞŽ#ÿjdWQÒ•R€±ÒX;¬^µ8݆žÒ}C`?{»4 …,Vw¹Q`èŠWÞ!ÔJÁ3©Éþ•Q¼L¬w^çætÄz eÓBVýj€==<íŸ)i@ÅN“RÕ`;ÊŒçœÍ ÁHñjž‚˜Ë4Ü‚á>i£Ȫðl¥\ [^ãë‹cF}¹qóá(Ž`ô\_c˜\TÜP£°Í›ðÍáH}Ä£j¸K¥Ms9zÄYüT—“6Kd§Mm$fÑÖØœˆâ¡ÐŠŠ¢—\xˆ|¿_+dC¸i;¢ÅùŒÛÐ\úWù(µ†ŸÍ /¥‰6XÕ¯8Éùû ]÷¯£«bS˜’#ªáD ¾î¿yÙ`Ñ‹ F ß—9eË`£ÎæÜyͧaFn˳ì—lZ꜈2/Ÿ{¡zÙ7PÓrM³¸3¦Øû*µFPÙVo¹˜t\½»œ'’§ŽÜM¢"Üæ©¤ˆt"6Jë¥vvE¶´¸ˆÎ×kŠÀn_.ÁGŒžzõŸ‚þÇÞ謠Bù¬]É}¶>(T*5*¬RAÒ·Ò gBšØ™ÐYõ°su1B©­è<LÂEÄõ¬·òÿýÿ¸¿ÐÎ:šåb?äràR²ð~.NÑžš|šÇ¸¥¢vœ F'2Ç홀-3à`Ú¿È¡"¹<^ÑþEýø)êÇ·úpcí§‡?†~¼ì¥M˜dd¾’>9ÔtëN¬!FãÍÚÊzB2ãÅ:~ä:Öï¯þtý·ú`cmmãájEwBŸslávƒ’bÈÁ?$h;?FïÕ«û¡VwÜï!º›6ô ‡p_é\¸;îˆNˆüË7 Öó,2u­ÜôÒ¦¯mPë<*Lsy’Q¢ÌšD´î\)¸Å ƒ-÷v£¥"ë]¢†^ÖÑØÁ´–¿d“)ç°V²q>Úú™˜cö‡bæ ŸTY725ÝÂHÃj³dETLAq ÛX¸À€ÈØTFOy?ã㢠²ñ:ޱ½Xò&Òî~nžƒ:E‹¡òû®Æî¢ù±±”`õˆ×H­¶k2â0[»?3˜ž¦s1i÷èÀmót«:ÕJÌ&“á¨Ô”Îä ÏØÐÛyÅDñy~>x»³¢LcÍ¥%S1tJ‹&ɼ3Ȥè(%î2´¾”DŽwßìTß²2‰p,Þèmxã‰'”‹?”–”Ňí4‡Gºµs|ð¶H£gÙ”Xô¼,GLJ”卨èé„òäq¦4ÛÞîóW;û…\4|tNžWÓö»Ã£bE@\Ñ¥;:Ÿøxçð$‹v=MÊNú:äÚ×:$7_}\]ö‡Ï@eÏXu&vu¾È¡4à~T4_5Qãÿà¿øYKÛ·½õÖš˜¶± 1ái\€Fœª?ʰ¢X;¯v~.Œ{…‰„Yãë­Ä‹SÜí„Ú4Ö´Î7탇Òl] oá&|Úí£°û†Ê†ƒ›¥B¹ovÞ¼9øËNRîEvÛõz¯éH<"á„w½z=§Âê=üBY§dDÞÿ"SyFäÕuuÞèiž½hèŒú¾§WÚñ~ ÓwÇ»{ReoÖ°%E2 “ô… ¹Eñó…d‹~g(xëq¡€Ð)çÅÎ6ím·ßî¾øËþÁ‹·[ǯw÷_|•J–ðòpg‡>¡ l"%NƒÈxFÈÉ ŽTõ"u?gÓâm‡ßcŠ™®rÛfŠ­´>¶·ß¿À.~Mï}’9½SRÚÞÚo¿<ØÛ;xßÞ>xófkÿÅW° )Ÿ¿{ùò×pë« »ñ›­ŸQåí–2ºaVüyÔøî%[¹Ú¾'?þüð+ë–¼K~_ú­Ë jÁïGý¥B7¢¯.ùw£õÅÿn$~]¿eߨ¢ß— o^¥Ò±¯÷ËÂÅ0žKÃ_ªê7’(Üöy÷Ф¶!¼nóæÀG³È«‹æírß¾¤§ÿZaνXj?Ükÿeëpwë9Hþ²µ÷îû0þJe™G’îÓÒ¬=mÓB­~= ëi"m˜î €SØXʾ‡˜upÎFâ¬ÄžôGã+½ÞµJîB¡Òÿ‚ ú2F‚À6](¥þ‰p±&£R°õNbš¾y·Gb%ÌAI~)œ2"ŒEky¤¿PÙ¤PL<|† è±ü5üJýÖün4ÂYáÚb~Ò!ƒAÆ$Ķ;/ÛÞÃI TÅZ‚=„öž]ÃÔáU<Äßf71—›qSï1óÃßQ›N*Ì™/:ý¡™s-‰«?­t7 4pÁwºm:a´O{›ñ›|Ðù’ñ‹<â2-N€#¼[¯ºÓ±ì‘¡ÈSwâesBOÞ¨†Îà²s•ûeQõ.‰Ésš“€ïâ¿.bÔ¦=b×{ 4yw|ÿ~Üïµ¹tn*ý*ôI#2Z‚R{gð¬ä¡Ç|2/'o¿ÞV–)¯8|«x1²mlÊ—ÔÞoÓpwÏûƒ^ù± R$χ#XH$x*‹óØÉóËÑÄãäi s‹•åæàh磩®,”S×(¼·à=²W^ÒC¸Ö „Lá¯a™l HOïËÔ0h’VO²a¿›Ncÿl8šd‘¶'1¦“÷ÖÔÞl<èwçÀ6pyjGôè*IÎX4êŒ[¤Ëæ’!ߌøÂŸo`GyÞT³17¿¾¾ØrêÏ;;oÛ[{{íïhK;*nÍ«>åÎÞî›Ýý­ã +º‹Ól”i­"euÁë7!^ÒE|¦ä-u¼CÄ0R ˾€ R˜H¹h¿ßÝß~ÎÀT¶$ÑEnñmï‘’D;%å7YAÛgÔåN[Ê›Ú9xYha%øf‘µ䲉8ÛC*Ã8¦öºd(ÏCá:ó⊑6³‘ŒQ›Äæ­b^¸Yf–ÓÎt†PZœ²*`³©Ñf§§” y\üc>$z@ %ÛŠ¸¬ÓÁ,?O‹Jw*/Í%»UxwiA¼'þ°Zž³žE®©Ô9š PßôËìî$³8Ü,C Șôc´‰[rî43‹ ›Öi®´I£ŽEYäÞf±¹%tÜ&à0›I6ÚævRE5Xr…C+ðíZ;À[Þ³#Oe,&i É%ñ-°î«’½š ûÚŒg³Y(étÐ9ãH[l‹ÇIš‚_ŽËÌsŽ·ÇðAÜ´oP£T<õjÒÜÕ/+ƒdéÞa¡²$eŠŒ I|)WQx«¸øÅ7òíäSQ~!tŠsÌ‹Àb­¹i\‡py¸s¸u´±ô´ÉÃÕ¥—,â²oþFxlÁÅÞ¼ íæRÌ«Hò悘_´ïó¶ŸgÐ ”6ý¬}F[BÊa9¸Š5€ƒ«ø×¸mu'“”ÆXg‹Û$`Ò¶D,Ô8“0ø|¥ñ¥/£íl«HÉãsTñwðضð×$2òj~Vj˜ âêNXíhjˆÎÚ^‡Ã•h;.ûÃÞè²c}±0lcŠãAéhW‘? Eû—òlíA®ñwØj/O/ <o¥Ò˜+qàÁÀiùZ¹³Ê õJ×v_=ßÛzݤ÷þ‹½Ãº4š`ófÅ,pøƒÑ™²7etT]ÎZ˜öµé m´ÊS($K¡6¶–¬!§ wç´éþpºd¼ûÓ. fÂ?N£îgM‘ss0\~Ó ¯I ¯Q‹8>©¨É‰Ëõ„Ö¤o­šyïU&¦WÝóA/y•ÏúÝ~/kŸ\…ÁL„– „ì¦SÄã¨2œ˜qÑN{’ÙiàÚWAgrÁ©.ò¬kÏ5’šÕ8y¥cíÖò»Ö/î±tõr‰î !s“.¹¿e¸È Šklbv–€{ƒí`,ï¹’aÓö©ðýÞ)¢ÇÛ6UIžd_!¹ñ£ÄU5±%éòX+mOCšs:ÉìÓ‰ý3µÅòÉ+ñÄ«ö´K'%„D“ñí™Vî¹o>ã×@É×íi&‡ã¤9õ0 v]ÏÏÊÝ´ùþ\„ð/ÔžHKU•¨^Ò¢¨P!0WïÿÁXdmyeG/¤Q”²ø\Ë€ezÚ´gï·÷ŒŸjaàf‘°£0gœnI¼Fq)Çb†@ÓÑ©ë"†6BÛØÎñJ³÷îvâŸßfû‰DêØ…hCKž~MD4ßùâžÅ_YYñcL«[ìéë`Ÿmp„¿…iJ,§“´&ż_`vìªÕfba+që:?Y ~CÐê9-y#¨¹¨J:îRÑuÖÝŒOÇigižºOtú„êî¤/ƘV27˜¶÷U—Ú ë½*i>†ÁR%#ÄŒyÚ¹+ñãRC¥$ž3p“Õ™Æ#×íA¦AÖåç>d(¿a&‡luÿiƒ¨0ö¦€ø¬I‹¨™mÝœ:‡ŸÏëÅý ”"É åÖéH¹_x…ð(” ª:ö×I%šÑ‹>îûY6.mÏ®7j+þq]Ø%–¢ÝW‡íhÖ9¿:¡ó ïÚsæÒÒш,Jæ)}:tÇW:c½¼°óäÀ«T,$ÍÙ™~GN>8h,Aœ/Û yRÚZ¡”õ¨KŠP™Jšô”A“m#ËHú‰søâ]K õðót8 ꕯÓHˆI)ÅVO'ë¥'"I8ÄØiž4\f‘ž4kµ/ Ÿtüãa™Ž>§M*òÚ#}ŽeŽ4Íì«b4夲êŠÕ2m^oP1KÞs°º øÕæ‘}%YM/”; ,pX©HÙéâÀ—œ±«ú’&­Â^õÐéœgƒUëS6X _×Ã×^;—„í¶¸¼@4Á§‘M˜×¹°Œñàüu6"þ/|ɦü£±b¤åbëë€q–“"d;[PD,úQþ3Ž‚hC}±^\ªô,Ù ´rQ‚ñ™dìXU÷û]£à}iÀЉùÈ¥,•²þ‡ckò©PP&ùkw4ð aÏËöèÔfQé9L¤Å+gÂïWM0Q*þIïhb`V¯ßbÅÔ˜Ö<& y|dˆâÖéÖΟ>‚W&E7ùL{ÜßN ;xœ ˜\iRZ”x4éŸõå4toQ`Í"!y&0æ¢M.ÒÃ0ÇàœèèO-”¤~Gcâo¾üæVY±èéÊMHJ÷}Å}ïÔr¡i,!ƒ´-”³F—Ùn¢P¬ƒäsÔ‹ziÓK3D‰´[Iˆë°Åƒàñ Æ@¹„;æiÿ‹•×χ$tOúÝâ¶åušû/Ú/wwö^‹Zn°\N‚†Lüg&ºÿ ä )AîP*?… Š™yQ<7(uÄ&g™”`j_þaB_²G¨~O‹-V¢‹W¶¯s-F/‰5ÂMÑZr«S1Ëníîl¬úèxê8RUêLd3˜Ëu‹œá ä˜òrÿ,z§¢¾ÂäÌÂsÕð°ò ßûÃD¡(Ðõ˜Õ˜œ+ÕäË)“_ˆY@R”ôZmWí4yYZ¾Q6½¢ú¾L -GUE{xœOÎ#;/±¸‚ñEeš½B+ÁJÝÑP.½MvòXU…@Þz·W¸a£Ò¦~Âù€´eäl²Lgz–Rÿ2=ée_´‚(×í‹V¥Ó˜FœVå ªòá´ç[Õ¹PùÅ£^h£²%ík¸m]™œlxÕ_øØ,NÒ JBdmH¿*bÊí]Î9’"æÇRŒ‹ˆ7QÚ<Ûlq‘äI0Þ6]ÎÂúÔk2™t7Èp=kÉX/dÇÓ¬p-å¤UÍÜÛóîpÔc¿“’±QíZyélk¹ä(ÒrÙà'D•8ñT`Y>tØH&ÖV|ª­6Œs¾‚Ћí n²ê Ý”.‚`…bN²òcØ+È&¾Ô€Î¥g½ÑeEJìKž²%Q±Åz°¢1ãBƒµéÏv{ëðÕñ/owœ?©K²¢,ë·Ø `¶ÏIÄ´»ÊÆfá*Þ·\Ù–˜lrQTz«·Å…"mûÐ ·z¼7$fdÑs?;ÁV†ú XSSEý‚ˆ<œSa: 0ö(çX”¾ Mi?šR¾Ë5b»p»hoiIT½.^ûœ¤u¼Ò¡Õ¸´Idƒ\èYŸ¢j‰ÝCÚÇ[¯Üú£Gþâcíî±DºÔa6R¦âáëÝ£ãƒÃ_"U,žn¼y»·Ôz÷ y!‘´ÜôŒƒã?ïüâÒí¾ÚßÚs?$MÝEØ…£ãÝýWÜìDÆûê¦3V%óí†ù ÃM~çì–ܱ‹¼¤ÿ¨éýë­cZ;í_Þú*ŽÜÚúKiJjÒÁá V:[/^´¢N·æjýQ:(‡;pk¿¤!¨Hû b¬ñO›¤ƒç[P#¯?J‡mçððàgÎ?Æ¡dtJÔ?ìÕiHÝêÊO`*B  ±ucÕ½³0ËqçrhñÓ ú¶È¼ÈX ôš–:bH¡h¾:!¾ÅfuÌRÐÚMg¢nEÔ6M”îîÉz)nM.ç!ìr©¸¥õƒazÈÄBM‹HºQy#d˜?ÿoï‰F8RÖJ¶shq¬æp_|/ÝjÉÚnù²ZyP£—[ôK4è.xì¾yo°wqÂm{ªæÊIh(¼y±=£epÒå{1|ñÏYSã!ްi"h6£ ]Û@PbÃç~/Utœ´Ó“\Z[œ” °è¼Ò¬V-’ña5µ})&·ÒºmVn|O#å\ÙösUÌ‹/×wO½›dÆÃbCe§ÕÁ/öI³ýµ˜IuËÈf~s:h)YÍU,Fh<ÊXàUä¦ç} mE–ñ,|­•<8L”L¢Ø®–9hwVþÀïcp½Þi¸Ç®N_Ÿ9|ßÀ÷F©êF”»óµ*÷ çîD¹—x+àžñN wVl‹Í2R^„âuîïdåÛҫí7@0<Ü9~w¸_÷y¡˜Mn2րⴙ±Ýn³‹¿ÇÒxó –è±´´áV€C.zñ+¼Š3½Ûw´ó¢þµ¡ßÚî ²k·a’ÃÀ@ív½Þn˽h»-in_4ìÉ䌫¤ƒ¹9Íé@­v}C¯iL\!{‡ù q e‹¼åèkp=gä±w Ó€KÄîÁÜvG(d‘ÃBÉÃ!|ÖKYŒ7ÏÍò°”å ð‡¿´‰ËK}³³\Ìò“pÌ‹š*ÆÜÓÀŠ’ú+¦+Õý¡”':]U”»»õ‚ŽYÛóÈýðÛÎQ!¸½d ‹®Ú£õ;/ X¿Pm½Œz’‹w@¹ÔýtÔ|¹µ»W]*À#x°:ýŠHRìàªjLŽ^¼ö :«?Wÿȃ?™ ƒã¡Ã~¥MPäƒâšÚúyQÇ]©îÄÏtÿÕÞN›DŒWǯç—P¯Ëí.ë˜è0\žaH”«$O®¯6XĈ’ËM·GÝžuÓÕ8,UÓùbçå´(atÿ(0±8T£¼˜÷æÌ¨¯`}Ù/ÛœEƒv|ýgÑ-û×f:ô —pq–¦´ƒ@Ë¥ÊL°MÕ¨nþ½T ¦¬½óscÁ.×Ó<Ë>ûâšnµéŽvv¨Àý¿¢D_ªâ „rk·[뫹»Mÿµ~ÄŸõG+ër„'If®œf‰ÔøK8Bä4Kå =¯‰+J­Ñ,W|ÜKa õåÞ»£˜AB/_¿ûqx·éü°ºMwÊÞpa¤7ÏÀ»}JaôÑÂeõˆP‡¥xÓ]8RØÞÈýG¿ØæÜݹ5ýïé¢Ü¬˜ ­y3“M÷í›Æ2•P³M_Kš\Š5ÿwo:ŸÌEû×Kí_ã¢*àSþëÛoUÏ놛ßóúÁÌëÍi?´ê_Ñ›‡‹{ÖûôßЭúWôéÑMúÄ•zößÖ1­ÿúîEýÛ9<|sô :¿äS?AÛꌖ ­Ö*ä¸ØÌ´V¯±¢XÚs:씇µšK1ˆ˜õnT$BBŽè’µKJl¢IÆX¥gáÚ¶! §:´°ëÞÜh»n’¸;S¶¸Æåêìbx«Q%-«H´·³óv~ù8Am“j ä”'íë;Ö6K¡³‘¾Yã¤; Ö»Ýcsn„ÏöEû½ø¶´T‚WY zÅÀõÒüê 63îfßh¹QÆ üFù¯eœ7*å† ëFe}£X\¢_š•+é%&‹ÀÞA‡ÓÝ¢6»81Ûq"€ã¬ìv†PAŸdlÓ4† yG‚‚rºÄ:è §Þš…ãµ×¬»„iɈú„Ex’5|ÅWšý+«Ê¹¿ûgß¼§’ cÖ¹n(JqK^Å%hTÉÀÿÕ¨ïá³ÿßû:ÿ¶:ãÿ?|ðデ%üÿðþ÷éââÏÿÃñÿäï§y#q½Æ¦ðO¬ÿbýÿë.Ö¸Dµ5xzÎGƒ #;o¦æP†ƒ`%ÑRÙ&'ÍY2ÞìÁ—Éôò<ãÕr™Éü"^r:1σI.çxH¢b±_í‡CF„ —ª@#èµuo Ý!ÚQ+vv‡”²!¾p¤L1üeóñ8iÐk÷hѨmfü2BáR؇B‚,p|tüVЇoà«À ¸…B.ûc˜‘~2ÈLÑ~4èµÕGH3…aËÛ†˜üƒtAEòé¨}’̇Ÿhøh÷Õëwo›ø—d¾¦<ù·wˆA‰ëëÃ7üeû`_ž¼;:\ÓTôuŸ1„V“dð8”- ñèßG䲂‰¹{¾ ÎiŽ$*\HÓÙa”@’YV:• ¨å:0Dø¦r ½t²äœQ1eÉÀóc¿ %¬(ñÎ^ú=PAxÒ0»¯¶XO¢S±öÞ 09Й­â“'˜†ö‹—þE$I® šµÃ¬¥¶´ÞÌ,\7q:ÌÕoç|+jPg6˜Öš¾k(ƒ¾7hë®+ZB.nÉ.|¢8Ž]R÷üʜ֗ú XêÑ:w;¯Ï­¨é ˜-¨Žþȸ¯ä¶ï©¥DÊJ–š7­ß Iv#(ðOäPpÑù, a“D|rÍ$kÅîêvH9bJ„'mÖ1ß~½÷Â=sG[íýƒí½GÇo݆[•ú‡#¼€Á*íöŠÂuʹ¥Ì:†6]œ6DW¢†|a'w¼“ÙÃ"’ó ß´›m.Æ3ˆ@oHz™]<{–TÂåðŽQ Þ*@”žn’æa†<ÌVÎVÜŸw÷ö4v7¬eRjå›69StAüÃÃ<4]í%mÉÛö_C- È‘¨â›ñ…¸=zÍA(1*f, …íH–Vœ[L¿È¶¤6ž+Æ:þÃ@I$²ä)m†ÛtÞ”} IDÆd¦ìk—æ/¿%³‡á¨÷‰ÈÖ6]ÿ±òdúzï^cÉ4Js6£FÃÏqÈRó«ØpC¨•H–¶)DY/Œ dª‘ÁsǸswÃþ'éscg*‚[ÕÝ›_HC†oáü¤¡Ñ©¨!E|®s­ˆ ÌM&Äx£èÌŠt Ežbž̙ãxþt9*wؼIót» ¥Š×Çüe"02ß–"ø¯nÀþUò,0R¸HÊÙ!·f{r,os¬!Ñ••PC‡;°‡Ër˜¯è²cÓqXÑ„­¼O'Rê¡”PCÔÛLaYÁPÖ©”$p& ePºGTfö…;;—4!1¼ƒkž©YwïðÉšqÀdYþÅ´=ÇE ³±\QŠš¶ °wû…âÜRÒ²Øb7jbÕ‚‘VG4¾T)èØF…}íEYÕ–|`ñL í´Êf–|œqËÀôjy?àÞ²@ù &­N–DzìëZ¼-´äC™²X \CZÝä\Eæ3GdrµÛ9p,5AñN}¶ U§wÓ³a«Æ×¥Ý+€^Ï·¯i òLÈú(GeaM¬Œà[‘œJ¨p<壘…&?:q] µêt%š»Añlª)È’Œ¹Jº®þúÞ÷²A4Ð}ÈT' öuÙO™…±>œ4 ´Íæf]¤¢7¯8bÕã•nKåã«â⥫7¤©|r©öÄñ¿Jõe~IB¥6,Ó<¢?M‰Ì©¾L¢‰™ôøŒ¶¹Û½2qóÕ] &V ÏÇ/hü_wÔ:Øø=ø$4:â¦ÌÔMF³qo£ºìšq„Ã[‚·¢·M«¡Ñ°•~­„ÊQ¦}˜j暬Ì%­½ˆ]/ä–"ßB!Àc\–( [º0DìS¨+=’/7CÄë:»5å³0j K6šh_‡Ô0Öèõ|9ØâA¾$©¯ECkkÏÀŒS›z?Š\’6DÚA¿?gW'£Î¤çÎ:8jѱ`¯%ðÌÞè"wÝÉìâd5-²Å’­Áè×ó¬3›öOg8- yÎ9 £«žÁÕ±ŽÓ×ও~ƪh&íôÀpîdÜ#„êÆ]øÆâÅZ1RßwˆÑji]Ž>ÃCz\Z N(2ÃU>Í.r¿fî ÕÒ¬å;É •hI`I¬ÂÖ³“j›%º¹lNÂÈF‚œr¬ˆFÜÜò,»À°3¢óXU3!"É¿íÿ ­¸mœQ– Ÿ?˜>¥h·ÕD¿z "³­AjIæ-G­¤8­û+Ÿ¬%‰w4—»SÙž»“º~ã=&Âfð‹8èè±c1Ì3£7[És`•ëþcîÞ)¸öJ*ñ<:~±»/ž=4˜IÈo¾Gt$|F\èÈ!Ï9ÛR¢ f±\Pµt¾‰3[¢]i²R‹5¢Ñ‘D¬c‹¾„ð1 ^ì'ºe‹w‘GÇÕàãkµK}o°®?ÞnËêäx»÷´rS•V·.Ìøá‹h Ó‡‡Ÿî¿söÀD«êʺÔ\ÁrSJ¯Ï RõÇyT$¥· “4‡£'ªRf.¤‡lSö>vjã)`Õ17§ "îÉ)´@ÁÅœˆ-_úÀ€X$Bx”ú;‡Ø*7ÈÕ&GŒü©– ‹ªWyÏóf2 !À&uE8­ø69F^êLéFY¢œ¶X5Þä ?;€ŽR­îÁÈðûŠÄ u7Ü·0Ž u‡Ï*¼ WÜ[ÜqEdOE/3A÷O—•ø2Î;¹Ñzʲq÷Fœ¤ß :d2Ë ÚºhgüEÐyÔ.+˜ƒh0ü¦kyw-ŒªÍ’ß/l!òžC«ñ¤sBÕõp;Þ=Ø>¢!;úwÇaëÆÿ|!V­£ZÐ*öêÌYêÄ—•¿$HˆŸèÏè@Þ¤(é™êóé¬û™-Eh=ŒÆ6ðÉ:üN†Ç°ÙfDX ¶:ŠW ¶Ò£|*„m¤O¿éæs+{Ë-ÖÛ´èäKT.ã]¿ÊdpxVúLzÓ‘î¸(:D4\<@_f,2ª2Vc©ËÌS—íæWªÕq%Îg{µK7ë°&çªü]3Þî5¡Ü"g‚r)ÅÕ©å.ˆÆb“àÂV¨ax«0]ð"ccgõŸTm‡°a@t êoó·:Órñâ3M’îb9¥á¢`رbO®øZ•EXúñÆL'yXMøÔÇ H´`’Ó~憎 ·°BÈ]7 _-µªÛa£&— Á›&ð²¦3ä¢UpßA;*A[1aœ'…¾âi¨/ )Æ–ÂÔLUBÉ;§ÙFê.žÿø©ê2J“PÜM€ø5P›§ÄAÿd‚ˆ4‘4„ Ö+âÜ0)Çà ؒ¸U<8BŒ¾•ž÷ôœè F#w¢µ§#H)q–u´yw;|ÇaQ¶n€\ŽOt§ä,7æ,Eqœ&%ãoÁ âìë›Ò8AY‚ñ©Ø}Â2½¾— :‚ ¸C©ÅÏ#÷]{*­\ò_u÷©ß*2b¯óù‘œHÊât=¾º)–(<Š7I“”õ’Giß<3¨ú`¶˜Gù}Q¨Y6ÆHšB·ôæMz¬Çá->¶v”5iD-O”²Eíó¨Ûû¢|VùåžL”Æò:ÉNq©,KA,–îë¡wé†ÖM6£~‹æ á/ç–¯|ðߦG˜ÓWý¦¶LÞÛ&z«:4U#Ȯޞé¬áÁŽ“¯AùÕ¡a? D•Ò²*ã/Tš¸gnÑë W|¿5@<Ç9„Æ‚ íæ¶Y¯zU,Æö$%FôÌâ)˜6Û–E'Àé%ZuYØ øõÜܪ¨l»{ {ßj!Ô÷r¤øi×ר†:”¬ât-·Fq¿zH^‰ªzêÖÀ™S@H_ $\xà ú.pïÌNÍûÁÑ&—®è¥jJ3–/ÖÚ”¯ cx%« ë'k„GÆ{NG7µI»AWø´>DúHu‚ÏÜ;š0B,E&MØq#^ÒÉ{Ï ƒ¡M[’dÓõÝ㨄èîÍz,0˜ ë =P†BÔ²ûöšJ;äkLŠÆ,Ó?­VtÖ¥"ÏFyÕ ZxEKáKu1¾g˜ç!<}¿E{R’'Qþ~[ú¦oÀcûUs–’nਅ³åw)ݼ[¾¹ Û¨N­8jv»×?-êè±ñ/.:©ß©²onº÷û¯·ö_5®½ WmƘï¼Cbxš,!Å9~­%W„ÍJ³j¯'/šc½LÜ%¾Ž>,™âl ¤S¾Îà­_U ´é°ý¼é^ìîK´/‰T€ãñ Oiø*Œ¼“Ñ«”òÃð)æÆ/®·¢Z½’Ez¼¨;l‡îûšN²‘Ø6´ÚûóQ§ép%Ü1)¡rôU8;H=·Ü.±YbÌp-X.=”CO+,\ýÎõ¸Å»UÓ^€e³á’͉¬Åjý Ó»^ÊH^1]œdPƒÅ ˆ1£êÊÄ=$h™"¾¢©ç#“Óä¬ ‡.)§±õZ'WDQÁçjgër|†â’¦_e¯³ƒNÏ#áÏýà$óm…öR•…vrÿa¾©„BËGZ1¨¼õë§V”¬¾—˜Z;ØNˆÆaÎ4r¹“Ïz½l¨÷ yÅC нp⇶˜O0b[æƒ&Y®LP/j‡·iŒÆ¸u¥}äœÃ8ㄳ%ó¡JDP6­\”f½[‡µ0µÝSv¦bA¶Ìjø®šbÕßÅ}³8Ç¥€šÔæ$¦&³T·#€{Ú“|0'5'5^+î=X ”ë¸ ÙàTˆlÖâòLO#|>ψ}À=jšé’ÙE£ê)ÛÊ)ß­¯ÈM–œC‘RʃÐÖ‡ƒÈŠûÓŸþäÞgâ1BŒŒorÅØ—V?ñÑK¶`МÜ%ë©´ÇêpµC_Zd£ef·^g,ð ðlÁ65(Ç·óÛù uÜA>™[ZìPììÃw¯šÉš£Ug.€ØŠØ–DK»«  rÇÏ–_œ=ˆ2{¤þ5± •,ž¹šR6\­á¼•À|»dNRe>(Rhˆny¸·û†–IS}üý0œ2/9ÎâêV;œdCL2liÞ‘‰¦»“ÌLíLz`Ú™»é²C†Ø³bè¹+¦Ü|µ4è<&¼+%Y…†'ð›ÕÄV€û9ämûwϬ5öÞIð8™ŒÆ-X J0)Fä rW_&š\–M«‰%à84™pñ­±â¶°ÞÒÑØQ¡ï[â’Öl¦É¥(¼1·ߦã]@c†+™/Áf¸”éãø1ù‚-G€>ž¸¿ÿ}µ¹ú­É¿™" §w\É}à…dY!)”ï”V¦_¨y]h”jN‚™¤¨sI´÷JÉËbŒ ÿn.EÊÔÜ; z›ô‚ë™JêÒK¨Ð÷`¢ÂõF†]…ÛL]QùDOO{™õkmï“Ûƒ^CTø_Àêeææt.ÙBæ÷A&NF!Ò¡à,™íÌtû),Œ¸ Fd†‚¶Ê—Í%0âPK#ËKezöÞ “UÊ9=óò6WÑG;t¨j©P0‘îX+ÄnûlàÍ9ùž“Å2ÖêÁ&(Uñ×£Òcíki²j EGÃ;÷Ä ‘V+¬‡WÔÇ›š78§õȆDìL(ËEv i¹Oú<ƒ+æõŠÈr}D…šAÈRnÅD’«Gsȼ̇¹Š¹XäZª#ÌÐØ´(šIõ#uØä+m iv‡*ièkuxŸZ"|ŸSÐ µ¤½½ê4[Ï}Iø^ Í– ß‘J™ ?8fýpeÝ=?záêx0…<Ó°£T¡a¡‹\¥®˜PæÎ›B™x°¨LÎ eÒרÌrR€SkRúZÝã?Gƒ÷g½ÐºçïŽÒÖ=Ÿå"ÎkçâèëÂæí¼ú‹¥Å÷´ê£_ŠUwzI g1†ן9á2´‚_7æín,|ŸCE`FEX§ÕT´Rá{u*¸O[*|Ÿ›j=Jµ^Š=>5«Û*S±#¨}ŸÓz˜¾[ëag^]ãAX¾l ›LÞ6šƒc†ÌÑ_\ýŒx‘5vÎŒmGýn”VÌÛ÷‡…²ß",!$pÀ…(‡ Ì95pvç÷‡ iâçí·ï,-¾WÄÏ/þݧ¢ïÕ©äâURñwHÊßmñ"nz©ñÛR¥“ÿ\L€ÅŒ›¹ÉçrÐÊWÂ6éÕoå•(â÷ᡤ9|1ií¯äs‹*î–Ôò»±´Eõ2ÑVΪ¾‘@Ï$ndž÷ÎÔƒÞÒP¦ã?%Ѻ5ÆÐBü§µ>\-à?­Súµâ?ý7|@‹M ÔÄOÆC$Õ·nzÔ¢??¿*w{³6vùM¨P|òd`¨_ Å‚pŠ õ˜P(!……*Ô¡~@¨ßŽõ›á ¾ êwƒš‹Õ/€>•§ÙçÝaw¥é­QªÎð3¯;šRz*ãeÿ”Ê9Á¿ñ9mÄHþfË jmµµö`u­¹Ä}ZþM."e•¶¨€¿ËªN↳‹v­r]b:¸Üâ<-[C1ÞÑÇÃÓìÒëfÙñŠænÐÿ Ä^ÂÊ@QÁ<¤77VܸܡbhK« Ç3m¹Z N¸-È¡PpXRQB›ÏÁmrgΙþÄ‹…H]ÔÐâ(x)ý,oð¨nÁv ôèðE•ržtr¢+ñæ7Äc{,؇Ð2ô:nÚ–'0e—ð!Ӫ̓W‰}éЩûvÙf&YK°ò5j5è—F¢âáëÒ2@#ôWgºaü£ Úuú‚“iXjóÚøB‹ mh èäeŸúž]Ìé¼öd…HšfRYRŽ8¸9IÎìÿ±êÝy‰€ÍÈÅ(…VÝ5&¿ß°«F8ê³u6kÿˆçS½'Âì­ÁÊ3ü\O>Àϵ8<Þt4¥]Um4Ç:¯:ÄÝ”uœ.PÏ\êÊc…+îV$|N³†4kbŸˆ¯ëáë5Q„¯“Ä} ­o–ž­Ó³Òø‹þ2‡X‹6°ÕØÛõ…oDo+ Û„ôÚ¸ùÅYª=ôêZ#Zê·j"u#è}“O`âó8YãëïªemÁ¿U6!)4¸^ŠÈc´ZQÌ"j †@·xÜYt Ü!ðN¼©^AÜj]ü‰uÙu×ø„ÉxÜœÖjêe<肋,‡Pü¤xq°lq§  `W¤ãŸiÜa©0›frr¿èô†üú=ëÄ Ì0MÈ’ßî¦ÀñeÕ9+~웋>컩t:†ˆ9s›qí´‹yC\UxhXM EC>¦ÓM›)"BCôš!Æ@ ìOWÜ‹Éh,ÔGÍBõ³! É'mø M`.§ª yƒ†%¯dãã¥f¥Ð µ3Œ”· òYöÛVŒgì¿+n5þnÆ@¥Žºðî´rkÀz Côy•åáÀÄ<ýb–ÞåÎÂÏ™–j&Œ¢ã¹ ùóá‚Û£-|)„;"­Nüœµ5ïL`3®*ÖÕ½öE«LI­àÝ¡Ë:Ýóx›‘â1 €ˆÂ"[Ãpóy*²ÖÊ’X}G§@i`BMóI¦ÉÁ?ïN:Óîù˜Pƒ-]$ê‡CoÈø­ÏÖ07Þ«£ç¼/Cøf—þF5©./½±b8¢c9N‡!׆ž7£N%GÅp7»TIÍõœ†¯Óý×2‹°ƒÈ5’Ëlê«¶÷ÚÓ}Bs0Š3TµT‘žóÒr̹NlñfD%Óõ±ÕÙˆü¹A÷î™3ÓØÝ{’¶¬0’œ¾`ĸT½¢ç ~w C6 ©¼8£5'~áuWFH†³zzBÑ 2iE¿Ký#HŽikÜ|¢y\ÍG€÷4Ñ'®É¿nkHd6¼/¶oÓ,÷£QÒh>]¯uòÆs›eµ&F.:ë±#¡é®•®ÜßkjMíÉ«q6^ߊú"eËKQ}7ß{:)Næùg“Ê_Ž&½ð|™[Ÿ5;„4KnÙiTͤ>ÞT3œœk|J q áÂ"[.«„ÛÎõ³;aNç:·KÈQ™HÂ0¨žÜ™{(/"éÀ½{Eæ‚„ˆ­ ã‘Jƒ\c*?̆ÑH?hºñTñL}¢7çÎq­³ jØdZ(Î&45´ÛÓY›NÒv¿4ñWT9_4uüeÌßÓ¹Çpú 𹤅XÏæ͜SAôêEGº¡€ÊˆÆÅÁgàYôƒÝ7—RŒðúðq’§ÿ©A¨CÃéõ>AkP¡ï—:çÞéófy¢Ú lÔ ‹åÕûqúqz2À4ßý8½æ«”fžßðâAÑẈ™:Bu Ôxå|•M=xŸé}kçLΪãþž¤tH£Ûs߸ RaFÄ—åD"WrTKƒèÊÓÎw9”Ì«-|ûiBIÆTŽeo‰´XÅ^x ‘«„´Lï%ƒv¬QÆ{k>˜ŸÝ”Ð]GIE±u’J£„Égj¿O*‹;ÒV”yÒœPÜe )ß-Tq*_®$¯:Ø*£ IÇžUÒ©(H9§?‰F¬ §À'.Néy*ô„M^78Ö| å“f7 ,Èå’=¨æyqu~íÚ0¾·&o¾é¹qa|*LI kž³·xŠˆué£âŒ|ƒ˜Ù›„wkX_3)"°ôU?ƒoæí^DÕM_<+Ÿm ù³èi„ü@:š‰'MF$åµLcËé<zÄJ±Ò–"´ŸÞÆâm&]Ýu^âü0çÔy¼õ6_ÊQÿ¦ùŸ."Ôu,ªÒjì `Yªû{X^cÛ~M%lxÝ-ý ú´N:im"¥f°—g¶¬·›rÂî8kÐy ļcð†–À¼ Ç‚xVo]˜1PÀZ›NHóx‚·à–GCoX ’(†Žo43²gÓ8£nÇŒ> 'µñhjVDÙWYCÀÝ€.¿vÀÅ%–¹€Äý=Ö^àpÄ]ÀÙpÚŸÂîª. B!ÔJøXý¢ž6ØÔ•¯²ÊCUÛßÃFÂRjí˜O¨”ËÔ(PøÔJ/×8Œ”»#ñÕïuC£vÇ'™?«2c8ÖÑ_äf9‘Ö’ <S§<ΧT/’%McG<±Ë¸Ô¹Ù=˜ô4ή 8ؽÎuÚÀ{HuT[“ÛѱÔ,@Fš#b?/ðF)¯×G)ø~Túê}¾Û¨—GšZä*¦)xÚà@(BŽË1yEzƒBO}£ʆWõª’OR£îñ±KÕòÄëæÒ™l'ð¾tßã¯óÈ%P?ÉA„¿‚HB<¦ûOZ^憚8 Bü+ÕÐWK¡˜"§|áùæè;Þ!¬ÇÅçJª€4SQ¤·©AKÐ4Á4†»E3™i{Ãñ]ß„¤<¥Â}ÇIJ}±T¸Yo¨ô:¹†µ·K‹@Þ$ݼùiyRÜœÞXqQ"©8 ¶ßÎ׺oJÓ…ïnY»ðƒè89y¹ M{FŸ—Z@ !sÞchYó{ŒDO+7£~nɵ=J¸ÝãÛeYFaæjþÚ7t*î¤)Žìú9Iµ(þSÃFÐé!Уs±Œ¤ ˆ¼öèŸù¹óL ŒJž¿fQIáÀÙûUäž>‰V9 åâ¥Àb1³5iV¸´ÍB!øPºªŠs…0dœ‚WܰÁ“º¬íÑÇäE]¡ñ‚SÁã£1(B/Dø\º¸«K‰ Q`€wA {«‹q]xŸÒæ=F'3úf_GÕdò@]€` ö¡<ÓÔóF¯¢I}:Œü'<œ¡Ç®q®NÉðê$‹—hÃÂ)àÃäùYHó3‘¦¬2úé½¢:9©ÊžmtX™…§þóÞ=‘!ý‡ÏŸŠÒ;&ãÞ½kº:És÷êWžÏ.Ä}˜¼òöÙHˆ±È®V!H…‰ªº%3ü¡O¿Š¥C×<‘ül)¡æ=¬™ÓHÓ Ú¦À*Ã(FÌ IŸ0èÖhÀÌÚ6LÞ,Sžõá??E§¯j¥I¬:_ªP§‡Ã€ê*‚Ó*³‹6OïèÉ…u„A XŠq+Pö¶{’ÇEZ"_jªºþâ8:lzž<öó—o:9ò¹ÇÙÁ@;‡:„(U+…S©< BX[ýÔdûp"r*–Xi¬ rRãsÖ>~üôíŸr—7Âá_Ýp¡*6ú{JéS öŸBNôüi ‰þXHt¼õ¼\ÒZ±º½Š’Ö¤‰¶+­ÿ˜&Ú9Ú®¨®˜êÅNÚ=¯‰b©¤ ó ÚÖ " /$siÜñá^ëv¥bB西ç~x¸³R+ŠÑ¬ß´8?¡º­õŸ>%å–J¨-Á¦ácív÷£`“Üî־Ȯ•¡Ûa x&¯¦iÙøLä¸t¡¸¢26f$èX?ó£¾!$[Ò1ÜDÃÂC¤šG#; Ê^æAÚÝ≊[q»jp¤¶ä$4J `Þjú‡À3°gèXf—M_6\hKz#bCc›ÔE™w棳·â˜v­†;CÉ!%÷˜{D'©ÂÝæ¦@3Žz|Çûç;‡­|z5 amL·¸E]àuhlò¼?X1áøÍó£ã­ã'Ê¢¥`}ÈæÁÎUÛÖê°%nÔó·Ðp©P¿8é¶ûCâßõç«¿ÃÔLº.Ò ºä$[·~g 0ªi#^˜ý¼Í{Î-õÂ{|âqC˨(ÞB-­Wצ•ßÓCoÅò*—9—¯C¹0ªªÆŽ¥q¡ Â!wÑÎFò-ó„­XÈûæü`)qЧ¤š§FdadntíRƒ*ÇâiFa—,ÛñW·,SlŨ’±\àæW‡0øe=mHzj¸Q[Òñ :ÌÒóêË!¿ ël‰Aú‚%* ¼— c¬Y-Ë’枘Â"“ËØi0šÃ/ >Mà`)îdDÒÄþ«½öÞÎþ+:¹ pJv‹i[ÖmFÐk|'©+‹ô5©ØûPÝ0ø­Ó¿æ¸.x~>_ò£*Ê[÷ßÈ·\‘Vñg ÖñçAÅMÚ’z5qä>:_÷ø<ôØ“´Å³'È~#˜*æì#Ðmæ€y Œûˆšnt¡w’¸!`ãC}áoâ|=¹9x{u.ÿ”6}VþväiäG yRë|\=/éö²?ýáVËe•q&ïúNþÔО!¶·Ø>¡˜Z焊þ¸*Åó=ËûÌ{x¨ c)‰þc\nó¿Ì8æ[§hûCÚ]ú£‰Gú³ £:\è!LŸgÔru2¿ ¯ƒÎßp°¦õnÅØÓqÛ¯ n4¸Zqÿ5´¬›F“88£È( ˜:0.UTr¢,AâZ†ºInálÛ«‘v޶·psX¹wýãç[Û>z»µ½ƒk«áÅöÖááîÖ«öáÎñ»Ã}θöè®ZŽÐ†—q«w‡{ÏK2ØJcBê°Ié÷ö¾k2 By |Ê_ú?·xšÑú‘½†”È®¦h56`Gƒ.;“®¦h7êwÎ2/¤é¥q š\‰­´|’)â6s*â]Ïu‹/NË|oÌ`;×È-°†žLÍ„Ï!ì@6éŸõY÷R¹pMHËÐá(®/ß9#ƒÎN™[•9æI÷ãIïãäc¦Ü²À*ã ` àÞX#íE'½#äyÛoV:ײ—L¸£ñº ì †|ï2Ú)pLWQ"Ö„« ='a²Ø ¿84ä:šlŽ>õh,ª®l±̦c‡saÁ8l»{®šKâ5±€ÈkÌ/®:' #êûÓg ædÑ€+×§ÒåÌ}<áÖ~œ¸ AIS³fÉãDãí—SþÖŒ]T“4¶OrDì ‡+ÜAš+jTŸ†Ïò+Ü¥¥Ä×Ô‹8¦9¶ëôŒ.e–Ì5ôÆX3<~bIô„©¯­äÇV´\7%ªUaL˜ŽžÛl(ƒ ô%>eB~æ_µè¿Ác-Gl©±®ü!.ÂT–r´–ƒ2 8\!Â@¤3Õö˜^¹•œ¦ªQÙ ¯YüÞÕÿ¿1_Y âþ¾lbIù„úÞ¾Ûß=¦ÌGÇKI48v‹‰ËJÔ2|§™jJ¼±ªÞ3ÇÊH\ªÕî\„É{Ne÷/A]è¹è)ÕpK!©ç›ùƸ{;¿+¶½$qàGdÓ‹Ÿµ¢MÛ"¥ Àj)ÂÛB½&w£œ§Ø/ï2™ yálˆ1¢8—nÊí—{[¯ŽžÜm¹Ö ?‡O0mw7ÝÊ}({Œà lb…×/ßíoב¤ ·É.ÿýeÂö÷~io1yµSGü"Æòêpëp P¤zíoXÐkYÕ­5k¹}j%\|}ý<4TBöUe¡O±!¦{iлfZÈa k†#>œ_åÌW$"©“9gÛÙ¸’æ'°ëͦzü¹0:>Ø5 ¸äîVóÔ»,¨þÏ*ö~—U½¬;èLÄ£óšüºr~·!{(¾ÝÒÙA›åÀTØÃìÒ¿¼æ(t]Duƒ‹N$?l®¶þøiùâ™´[Ñ "¨sµÂÌ‚Eçû€«f­Ÿ)ûâáËz«Àœé@j<³›„÷•›[xM#ŽûO<Ь>Áu~½Ëçþ¯|ì·÷s¶¯»õ»•‰¢õn#N¢'ë»4ìòª®Ù|ð2SÜÔ9{t’wÒ%Áƒ€ƒy@ˉJ gÙW<ÖÇÎ,5ž1âÏt¬¦·ê2iScÚ6u ÿ\ÇS} ¶ûq¡ltƺ¼Lòã¯ø|O©r›K…B«1§8ñÙtiK¸wîý¾nRk¸tNè½p‰EíôÔ•­Çp°Á0À¢¦«?pˉš·%åë‰òÇôEDЙ0x‹ð@Jg‚kE}3’Šìp*MHY'ä­L Nm!GñúÛ¥º£0NÑáišy^Іˆ" nBÓ=>¹q`m_õkÌ¿=¹˜†·æ+«©Ê 3c»2ž£2ÜRM}g½Œ~ý‰(‰IÈŇ\£VlÎøØÅóÀ”¤ÉO7BD£\zðÆŒå¢;o?§»v☛Fz¼¶£î&ÌÀC,EtCkAÜ?þán…Å\û𠦄õ’—F2ô¼~ך®8ÈÑì[ßó蕼¿L ¨‡a–Ùh°x[MVBüVïze½WÛ\][ððÑ?þôÇÚ2\T'›Ó¼°it³Éôý^l—çOWƒNT=­YI›£™lÀâ´R”1ZnÄÊ—J÷ÒþÊ’ý5ý¦÷ô:óTqõ¦7”‹á;·Žà3â›ÚWs›@à0"a/ßF_vñ Œ«]†ê.¿áb“×àÓäÆH#YW­·ÅÖ›€ZC­º\¦¼{ÎQÅHå{¢þ”QWgCo tÊ@YÌ ¤ºlÌYá@v§ê@î­XšE8@¾1¿<4BYZ$8w3„…³Þ'Ì’ð°É±(O2’„`ÁÚõ©uÁ/èÞs‘,Å!€)zk†;.\ä²äÞº-q8Û&O³kpˆ±¬n[ÂW—„èòéhÜîLÅ\® ù_Í(} 68;Ë%œ†VFB±Ñ–[±??àzchÒHë#Á`õº¶®ÜtÞ°« 6+TÄ}k4ö>]:ø?‹«í_" ¹‡ÌRóZœ0;#šÕÒT°å¬×°︇a:“sƒz¯áW‡„KŸ¸b§ñ(@/˜þùÕèÆ ¦Sn5¦*ºì÷¦ç eÈÓ!𨇥mTiTÂe¤s‰;”7YêÛpã}˜ùðˆÉ±(veCã qqÇ‚úsN‘>6<ÄÁ÷jœáˆ£«I7X‘f­ö8SgÊÞfßâu§òYô„ZA}{ú0cJŽ}ÏÍ(ÞåÁ½<*Åâ /ñä#p^ L ë,ªWtb ÎXvy ˆQ€ðfî1<^"mI›mWqÊtÁpíQ¼x¹·7üx[§*ÃÌ%8FÛÑÙ*‡$²V³îÙ¶·fÒ2ì··ïô”[qŠxJ»°–ù8)Ó_…G!êWñ¥µp#ìfå=}b )²Œ´µTÐ7Cýbª=·¤±ö¼ZŠ3}¦-×H_¨£PHµÊE,RÎÞý8¹k90Vš+ î>pßñ¶¼1ŽisÛ‡ìU.­¢²Ôû+ÙŠ¿ö5»ß‘±Bš…·é æiJ0öÑçcë,¶ü4Šh­5ZO™øcš,a„DŠS]Ló±ú]¼¡XaϢ×þäŒÄ|8cùTѿןσ“dlø2¡r 6?Ð÷‹Ý ¹?`qèNá&…9ÉJêýhå·žDHÃó>T²«[˜æ„ûý$ûÒÍHæ)lÑÅ1.NËï;6yaæQ`v‹ïý[¾Ã¨¥ˆBØ.Χ#q­§º[TôS K¡à ήçýÓ©NyéõRa.í³˜°ŠU&lU½(gh2Š÷T/‹hY訮º‚À ÷$é÷ Û§ Š<1Î2cúÓyÌ1‹!õ˜U·£ƒ.>²[ÿ5jñ“@wO­¿ñÐehÓ<Ÿv¨‰6Ô|Š´æÜù«šõóÞih⩬W±+Û¦ ºbC!pu'옢ø+±a‰—D¹žˆ’®kÿcW¢äÅã/¤x‘ñ )¦>1ˆFH]Tdì¹@yè0¼C¸‹‹G®ab$öN ŸÄÛ¡j{+̇—|?Jûü7fU´KƒÉ³Œ$স˜sЉ£LT@,‚+… QS´ÃÍ÷|ñ:8£—úÆg^/Ç„ r6 Wîä÷¡rd1"jˆÈóYœ¿¥l§×”’>æuâY_0Ì÷zñõU¼ÇëÅ×'ƒY&¥ãõÃâë‹Îk< _#Ðå ³ÂK¯»Wa(ü‡âk’Ŧ™oùá5ƒäØAuÉÛBõ§^õ fá^5æ'·YÛ¬5ã<*…Î|ËÇIÖ û²F9H'“DÞ÷1‰`˜{WÆù.ô^Š‹‹•šˆÞé}éÀÂÊý—Çc˦f^ß—F'gid:Äìú³ì|qÑ@ÓÊSCõ…ýä©;Àü,űCÖfÔÔ¦«š hu)Ĺ×~ÐH ¾¿÷ž¤ÅDsTš ¾$†uãÏÃé†!Q/±>,‘6O46/¼`(á6Í\{¸þàÇõõÍ"A²ã^y„5#wCM]ÕLÜÑbȓڀ Zèú÷.[‚Wó8.è©þ| ʰA+ô™ùÔE/oQ#c¿Xçé¡Px?ZÐe­ÚTKV¿2zŽ„»¾&æö©‡cµ©aˆ"ˆ=AÒ‘ª+ÂNzŠJ£ÐQj™1&ÎØÃÛç’¸4‰pC7Qq×[̃“ÍújZÌk¬žÓoc“õ~°Öë±2½ûyݰ×V=ÛjºrsY³\dœ•ô±>ëF5²‘Ÿƒ´ÜïÉ&¡™T)9 €„ÙäLŸ×#h‚y2¢¤ŸÝ/WXê sZi¸„_:m6&Cú\Ù=cæZç‡q£UÊãÂaz»ÿBÝÎr¥Q¨ g?(Eåwm-UL_¬ZD1i›ÞQònþ@Ý×XédëwC4ÕÉ_3öῴÞ$ÖŸÒð².v¤%|°,MŸ„çàÓRVÌÂzˆL[ÛS\Ï >Ã.oúã0–¾‹Â˜õgIûf ,²¢7ÓÚ±Åà{b! ‘Ë–|$3¶Rƒ\ ÂêPÿƒÕØ€¾:—ªæ•¡­œO¢G®ÕÔƒµ‚ šëœÎ•¡ú¹ík¬v­Òî3½¸4xñÊY¼°±bò¡y`íãèK6Ô÷«‹®ðÁ¨­V~ÔÙ³8%úáV=¢Û u¥Eƒ•Ul¯ã@œìÀ‡™M²š¡Ê@DíêfóÙ£™3><<OM×tŽ”G©(^ƒ¬ƒ±geϯœ‹åŸ°Gù±2Üa¾¢´¤O=eÜ+,S.ÌÝÀ:ª¼ÓÕ&ˆE‘ïÏú£žQ‰VC×3wOaÿÑÆ‹„§· tW î¨C öpçÉ³Œ'£iÖ²ÿ+| gãä¨&×KB)UJ }¥ÀL‚ͧ;nÿà-&=HúVÔgˆ„Ryndã²¼‰ãKª3kDÂ8ûе‰Ñ]\µµ¤iŒ_ +ÀznM×LHÞ°?(=‡›*~ÜæÖ˜ürK K\x<oZN1k•™(.ß=q¡áI1M§Í—¦oš .tá!OŠrL6‹-µ;¶ÕDãÉiÛa›(Å“—!¸a IiQÔöùK¦¾«¦÷’w££Ÿ­˜,l\¿†dì°€ MÐËì$c ©'h‹Žþ¼³ïîþén¬¾yuxðîí‘[gJ¶Å´yj~½v:!äXç.ý9•E­Þùð'Ÿ–Oÿ¨ÓËF{¨™Óå&©i·ÏTáYÆÑ üöÜðøA³f­Ih2ÄÕ 7ìÜ÷09áWäoÖê·»þãv÷Óòí.5ÿvÞ@¸™´MQsŠ?´.Vé™¶\‹¶ÜQ¸Ãáò,öËu9íLÄÎ&£ÙXTýQÖþÃs[9æùd>Jy b)1ΦÝó†kò-3‡6ŠÐÖXÎ0?¢àâÀÍçzÅì@Owy§ÏÞ 5Äšëœáx7¤ávVÎ6"Ì+gjnNÒV'kD¯üÛßþæNðÁ‡@„!¿Ýkð“?5Ø È§¬Ó?4d¼½Ã¸}2¨¼Ë¨pÀuú’ù>ßèØb‡ÏȾaþ'à(û’ÜqñD6+ØyX8ñV /•RQm¹d b®7jG¹ssd©¼™oý8®N$"rÉÞÿ…Ot!%t (:_á/˜‡(6ÖÒFðÕ’‚ùÔ­bwY1ì—»T¸!–¶âŪÜWYæ%ùHÔ‘²\j.à©°ÇÉU²¢êåW@Tl¨uk25öù·o ^ÝÜM»!Áw¶[Ùˆ¢_—G§Å1,зs¬ Or/âý¼‚ýÅq3AfÝz™“Î4]R_Ó³ìÇ k³óª½ðfëxûµš}³»¨«˰ᓠtM~šNºìMéG§™TlÙ¨[H"„À³LR]-'ød¤øŠQp[©òÅÀ ¯ÿP­«!’]®V`D&C6R€‰ŒŒ2è ‚³¶‡²i6ð\€ã?Ʋ¦½S^ÊöB¿óÄÏüÚ§•ÉE;U§g¸ŠôÙœôæ[õ¤PF«Ø†8»c„ U·nÍó\>ä°ÆUåH(é½ãWH¯‹Z ö;}ÜÆ.y5ßÚ1Âæ[!phKšF”%Þª§£òÔµÖ ž MÁ“†¹pX˜»hÓ¯ ¢ÒɈ!ykÕ»T*ŒiBÌžbJsõT,ˆ’!âƒ|hƒ`Ãv‹Õ-¾hDM_ÌíñeÅ_~.=½„“ú³IC›®èlÉÁ<3¡üÃ'ìšwµ_מãÿ|SÇ- \Í)Z¬s†õàP·'}hEnkÿh׌†´Cðæ« ²NÇš¸-±b­©æù0tzE|mL‡)HD×ÔÍ?˜X¨Áž· j®Z‡á㇫­?n~Z¾hÔRÒIºV¨EOúsç3ŒñØÓ_½å•»ÇnÓé8߸ŸcÁùt0º\!‰ýþ_g@é"!òþÚÃþøàÇÕµûç£Ëm÷­~Kì=[ÔÞF¥•åÝÎËêЂâ»ÕiÉqªˆß«éùh¨µ¾WÌó.jt?¶Nh“Ú^*ðelòpüÄ/a )ãHÀ’ÎqpÙz᜗ïŽ_¶~2½ÐW!G†ïœä£ÁŒåè®láAKÑ^]vn Ê\;ÂÉš 1¥Ñ âĤóÁµîZ&êù÷ôiý_Ÿµ¨ P†æç+×6ØþžÛm™„yϽôß ÄýÂ8C“èŒ2»QbÞɧ© úšò©ÕN[âÛ³½Ö~™Ý¬(]›Ÿ>yFäžþIûˆ¢¨gÎÕÑÈ\ód[a¦5;«ÀªGÃ4±ÁT’ 2^;Œ·´U1]Ä8'´ûö9fÄ D[t¸+énruWzv—VòDígãl"I—œ(iÊÙÄŸobûÆŠÜÉS ð‰!e¹†ÊЋ€ÀÐDD3ºIÆfç³ÉTÄÛØCV"ùp¾¬ÇM™fà @5\Œ€ºp‰ã;¶ )_†„ ¾ŸØó}ÿD3±¤$u:³Ú½›wtàÆc̲^{EoÛZ-úF§“–vWƒFÑs©ÝžÆ|ŽXR× 9`ë»Ê  ñ3£56H ÖµûÃ<ŠË†:H §²cÐf$ZÐ+órèN󎨴1ßôÈ~ oíË%àÚ˜Á™„bÃÕPm¹Þ¸÷,ñJtÛ>Db½Ø÷,õ{C3ÝFÉ/ …B=/)š”j´Pj`_~‡¯ŠZg³à;Ù€¦úV4Ð'AF?äl‡½å"ˆl&z\ï†#[j³„x¿u¸¿»ÿ*²…‰³p$¥-Tƒ¹ σ¡DÎòêã°–JÖ5Vg#0-¯+ω)Na¤Ôôu€TC-pƒ1"ÿônÕ¢±°äáFiÉÿ‰} %` '„¦óÓ—øMÚûÂøæçP§,WiÌ“ B~7‰¶‡ÈýÚÑ»çÿ¨"L¼ÝÝÞ"ްáVÞêE»u«tÉgUX'W‹Æ5”@(’ºKP»s%fîG÷#}”â vEŠ;ßÎa@ñ]èó/wÛowöÛo·ˆƒmnruú_swû‘àÆ=ñ!‰\½v6r6&T†àøÎäóQ†ÀÝîL²vö×mò¾@ö¿k>d m#VLE´æä¦;’ªB!µ´¾[õÁ9 ˆ°ö)T_þþp–mú1ÂdÕB{RLfDwOîV‰8èN¥ØOÛ2ÊbúœdM—´pñµó­äÚyÓ„rý v¨øeþ¿¶Ø÷ugÇ ‹+ˆÜ?†¡óò˜ŠDmÆ`™‹?v~&Š>z·½½st”†/û¥»•3ðùœmgè ð™m„ºƒ>N£Ùú_lݵîlÌr\M®ñ2¶”ˆÄ}9³Ôì"3SD†¿è^Ÿ F'c×á4í>Q›Ï×év‘úLî©Õm«>u{æf¶¥™²¾’ƒz>í$‡rYO ˜i)n}?Ï5RÊ–ŽåcPÆÑ¢y9Yð`àX7î)N³ËRÀÓª /±­•¶QÃÙÔ ­„· ®r’I@èQÀ«ì‰09ŽfMÍ=‚Ì1¹ ^µ)&_ùÖg6ˆRCIFÏÀ'äWf©KïpG‹Gu‹ðÖ¦nЛÐ4ÒF×=ŽIÆ¡U …6Wìq‹wAC¯±Uö/¼8ÑÛl8̺°9”(KÆŸ’¡2CEPà°²†ê ™jäÑÀ16…¬•áÕ]¸`5_ÒäsÒäQš0Ôl(ðµ^5# Р»³{ÊÍÊï•B‡š.] ,›Ñ xje TtÊ>ËDB¡ÊX=´¾aQ; ŸÄ[¤ª&}ÁX‰T¸™! èkÔ ‰t˜OMøš^ެ \»@iËé­z3®¨û 6®°ÁÔ°Ý‹æÒÕïDÙ?X%ŸëK½eâ-Y "—Ÿ¦+€²—Åbjñjù”þ"B5õ÷¸þµØºYèz‹O;ý­«>ó…ÓþWƒÜ‘2„å 1MxÞ±ã¢}HèWˆxJ= vÝçáè’¯­J»z^"{ê›Î{Ü fñü ÇC–¤Hr8ò {¢&êfâÅv=ÿ¯–ÏÿGK)Üo‰•›Eä5^=ÒÜ{a1óp® Ö l¾©”ŸŒÅ­ÊoÒª76nT®ò«ßFÙøfJŒ˜ü±•ÿËÿÍ?´ÑæƒÙÉÃõ–H5­Ÿº?®þôCï~>éÞm¯tspìùᇇÿ¢>>…N“+lìÂQ ü gK¶«þÒïÈœøÐhf³´âv…J!4­³“Œ)v¤²–-ð.½Z²@jPíŸÈ¨d ?5»n&±S¸Ú;%‘•†|ÎU(i„?ú8‰kˆž“#à‰¢±ßˆ±-i+OgðØó‹²3ÈGŽ3‡<9QÜÝ’å+î¹Þ¡--n ͈+HO Híç"@ó‰k2¥Uʇ ¢jâmKš’¹LïzhX@:J\Þ›X “~ߤR¢Ê 9¶,ðf£ÓyVó›Ü¶yyŠÀç…2kNfèC¥žÏò1{‡}ή‚•g÷ ÑU8è1‚´‡íwLD« L>­Š'œpaÑF¡!ôö9Œ7KµÄeÂOc¸Øê€ƒTÔá_È»I¦h”<¼qeƒ¬3Q”½ÍŠVÌÆUO{£ËÊÔƒìtZnó(¹b‡Ã3>²j^¼ß~wxDûÁ˜Lɨ»rp6rs~E44²ldJŸâè.¬ˆöJZasœ}ZBa>‚ƒJ úVbeó*š,ªh2¯"Õw3[S±¢Ï_«‰Ÿ+úüõºzhAœŒ:“4´a O¼PEATQÆ<°­áLÙ›'—Øb™Ù> FˆQºh€ñ¬Åwøbº'¼Ð]gP•ô¨¦õטñó’ÃQ”w­Ù’™ÌÖW×Ê– P•}Z2à×öy'Wƒ”|“*D¾„§ŸcˆxÆ{È.ìÀެIÔ“#\p‰%ÃdƒsŸ§  åYL¯íÁvo†%(‹hª’^Û¹gS@òç›GAMü½n¯ Ä®”¯Íåù㸎ù¼Z°ý2[:rÃ.ûCv½ÖE÷¡œJ­Ýø½ô%RðÊ2žl¦ÓÝ%Ù³ïk¥ØòÝŠ’™# âhô8‚›K…¦\\µ§à lyÒ綾Ò$PtNú$R]y N½Œb•<"coo½å+ä˜ùˆ6âƒ>±’Þ¬g}õáO$…,OOÜWHT¼ò¬ËÑ­µ‘u´îÎôDMDVm€«ÜC/ÂA9$©o8¤&MvAÔÛ¥( )·`S… ŸUÝGÓ Ü)3ÎiªtyÆw5kkµO,A¼§Ñþz\Ï›´ðJ¯s¿0ìæ§0\)+:²éoKȽVùVAý”¦ßIØüvŽ˜"U¾ç)|qNëh6Žu_…)nÚ4xì…ŠüÐà©ñ~"EÝ“vÓ¿ØÝo¿ÜÝÛÁ5:ãß-7V…TýÏ-Îzƒ„ÄS¾*Ñ™jð Kò8@$5hjgÃT€miHu/M—æuä )[94ÎÞ9þ» pýõàô7Qà÷û« Á»º"gç1žW ÜzMUßñR¥öÒ:E+î%û¾ÁÙÄdª%x¡w*¸„‰hÃ,´Ó]ݵ”¥DO¿v!éG J^ýüE‹©ʯG5×ah;»Z E}DMº~.¾±™€âTÐ2Û{¾µýg!Šý­=Wû2]Dü Hj &žß.y §rPKM¾XÑ.ÚxŸZ\‚ÅÅAq‰åwMÿ»^ÄÉyÉAVò-Dš @ð;DŒ¶exkI·»ý£¶±šÛž²óøìFC’ Û³¯kkÁ»žD¤éôªó‘Æb¨º|Úë{{5:ÃO¯j~~§]šG*pROÓ9"FÃ=¾LÔª¸9@¶G¤Z]<_Úññ ©…ýQw:(´îx÷`ûÕûÝý£§–ªds£–m³:ã'ž ‡Qþš™5Œ'=ÇÒzV.Y˜'ˆîîvoÓE ySœg8Cq bliÍB?+…ªžÌp Süæ*tf’AõKÓž¬²—FJµN7Fç¾]¨eiͰXN˜L®nÕüÕ¦Ü÷âÀ`Ffßî÷2š'Þª¾Ôk#¿‚ ¯<Ö¿8ü4[S_ŽâÞ,)V4W0Ô0|Ö…šèõÛÖ»ŸÝÚÔTÝ,? ¢­ÒŒIqË9[§"¨kFtîŸÉ1~‚€)Þ¿CÉÝ$†âšS‰5Øbn‹jHl\À“ÔþíoÏϦ~<›üðõòë¥$m­ñÏèn Ä)¾©ÃQ˜9±%uÿö7ï‘êA~Ú®++f ù¦Îáþµ©Ô•FÃæõT&Áìç²i“Ùi™“ø0ãTW|'ï±â ±`-¯<¢“þd4ä;o§ÂMñíðƒÃôQj‘ƒ °”È,y–¢S°:ÄÓ@ö‚ð’ÏëwÔqZˆ% î„É(SF’FC{2¸~$û•»ä…Åù†–|ñ?lÒ€ÝÎw·áFFÌ +™{ÖŸÚƒCz"÷NN2Êûì.‰‹è0  Ñ]x¾š¬ù¹ؼé”,ÝdFXã 1¶TˆØŠ `@æ§bv`û}ÓV1)Æu“²ƒ†ÞÎm w›?ü;_Çìu~jÑ‘Vªi|i•ðJ‹˜(Éã1KN,-¹¥`hT"Ž#¦3(ZùŽ%QµÖ¬Q]ÎÕ´ð>k-¦î$!²…N¸8Äbµ~Aëë ×› |±ÜNÎÊúÚŠ½’oaC‘…Ò·P¢šè%e¦úÐEež;ÒÌZ÷erdSÑ;Ÿ&ý¿ánjà5ϵ„-F âï4ÜøX=È_Õ| #t]¹§Zî°W,—óWlØ‹ žiÁ³q±à`9RÔŸ__jOK튥"Rn¤}¼®\P]¸ÛeúÐ0]ˆ[!%p`v~Ù0í^¸[g4X/¼àðÉgQöºfk#µø²ˆµ–MÞL·©?þ–™±¿·«¸ü3|4±q“k7Û¨,óeÕÚYgrB˰æ¡mÔN’õÖf¸(/ù2í<»0]rd]u# æ@¹iŸWWù—La“0¹y“P¯¶¶½®ôÏ_oÈÃTë3—NœáK¦ÎË­é¤3Ì/`HóZ‹ðjc¹ïõ«lÚ¨VWw‚àˆãoð;Dª;×k‚ž¨ç]+Ú~yм¾hÅÕ^Ì.NjÑ Ao$×í¨× ÞzÁ„ó*¢ØÖ=)j=Têg_§ .ùl}uõáy-Zmsn~Kùƒšµ·¼Uâo u>ᣂºÎ¸»(õnrERæO\ÍÕ6“ű&ZüÆ RÐpvQ¯É«9ÎAqæO œ\–QÙF°7½ÄqjgRU½´a‘Ø_1Jðà*ððâ#0ÐôàZ¥~|ë;Åò­IU3\Ž›¹A‡ŽËÙ9*–rŒ8GмÌÑb¬tÛÝì¼üä3ðµôu9ŽŽÞ~Z(£YåO´Я‚f\TâŠY/E•´³îùˆµÁWY. ¼ÂÍÒ2+zUùæµ6ùBÜxzÕf! Í²; »1kzdŠOпèw+.Ÿ‚SB°¿ÅµÍþbËtuà—If ~#zÌ…´žvÛ@»;OÜÿµ»½µ°o7Y ŽÑaS³0²Ã¯Ï‘'ñø“Ó ÐÉ‹ãÝ7;ŸÌ÷MçDù…ÚÿñÄíl¿>0ÔüÕ `†ñ©Ü-e ˜ägeR©ËÐ [^©a;Þ>¢‘xßt:ÒåèîCöP¢ãã_¤'—6 Êò}VÙcBçê¹”Ãù¡ÅnŒZSPÍ5@(ÜeqàÕ.|³ˆ¬Ô5fj¬el¨ÚS ¼iQ0c.À CZÖ°Œ¦£RböRC%âW‚4r¥Ü11Cò;Ÿ¡³‡YT‡Ž©Ø#7ÂWw6Êø&wñu&g®^û¾n"?{ð/5˜òâ’JpAão÷¼W5kúÞ¤åšTIB\ž¼i²çÓU›^0мÜÐDx’‚&É_»´m«ObŒ 'ÑÂRÌ6)®§ÄÄ++ Z{™Œ¹ÕÅËñ3¬˜ïq “ªr½Ú7<¯ßý8¹Ûˆjàƒ€,Döº¹Š>9²±Ÿ8[¹Ø=ôŠÚ¤ëØ%ír–{½\Ø§âø§zÝd*’îïU;F°½ë ïæ.>J2F}2H7 _Ô·Û=[P6‡ûLÜcòñ<ç¡0** ¾­ ±Z=æ¢ÍåG×êáDšçc!„¡#VȾÜ2Æžt?CÈÑ>ﺻR€üRÐ6_ˆ´R’"e–F6\°+ÏãᤖZ6] 2< ÿÍãï•ÊgÃi2ñHú´9«t6œÎ[§>ïw^¹È„ÞN¢å昫³® raUB™ »…­ cµË;\ïl¼ ÖÙx^ðÂ)Öø-.2ç‚’ƒHZ.ï*Kg”„0ŽÇoßµéÏv{ëðÕñ/ow\7ÚÙ͵ËÎTXí©ZøÃ'b’QààÝq¸m\áZ|aZYpy@‡ú³AÕDÃ(½ŒÙHR­0бs"—öêÝ­v w_ÚÇÔ½dÓ0x%)·é/èž—*öwXA<ä±.oŸc„GÅÖ 5Õ|Kä¨Teí¥•HÛÐrkŸ$® ó]òq‘q`M;T›© 'TÈÄ|£`7÷¼vØ•´ƒã‰]֋ѨG¨zÚ×ùËN£pu âB¾V¬d“°öˆ-ä—¸\Ë[/<}&L |ª}¬]¡¢ÐõÕF™è0 QnSïN1ÅÈBêýqx;gé‡Ý²+G ºÁî ð\dq-~:¹ê«ß4ù¬?åë$oµ«p u ¸Ygz’ÁLœƒL: ÌÒ¿ Ö4Åq㣪ù¢½S#‘ƒ,××üÉ’'¼STLË{ÊÜ^†ˆ31Uy~¹æ„HòOx(íHqúHè|rÄÂúÃÆ¦ñ‹@³±ùƒŽ7Ͼ‰èB §ØWOGcbÂx]n½ÃÞ¥i)è4A‡Ùºåh†h(1¸(ȱJúy@)_i¤+­¸5ÖÒP´±WŽú¦pmTúÙ¤3Ξå㾂}Ý c X¤ÌH ¢:ȳ5ý6¯‚AvAG©ÿœõ»Z ŒwÑœ;œ;~½ ¢HºªžÔš•õr5Rãxt‘Qç »äzãÂ$Ù‚šãÓK­øh^§£C#®=¢LÊm©®m¶÷Zú`^í{œx÷äJ*w.¿‡Ö”' ­ê@jðEyý_íª÷_òYèÿ9›Báò›@ûþðãÃGKþŸVýÓÿó¿áäºjþÓU󟮚eWÍj_Í¥à‘Ç-CÍ{:Þ8ŸW@áš @*ð é06¾=‡õ0Ût«Î²Á«L,¸Ï³>åê\­¸à(ÔVtùDgØ«f¢Ú%pE8¨3†VPvøÈ¢6ýái6é#Z¡TÚTJ‹ =Ò˜`z” €çÔpƒÑhL4{AëŸaÛaiŽZÕûf:LXzë e,¦UöXôœ›ƒ{K[gý/wš50^{ÛS^¾ÎaÕö’ª ‚Åî‚GF¢jBÂ+b9©Ӟþ¤Uµ5²ê¸¹¹\i'ð8ê²ÇèH QXͦJ˜9B0´¥- Èâ¶à¿®Ú8;ÿpDnñ)òylµDðOÆ™ïfŒÀUÖL[•ÇuK¨8µP!QÿŒ©çr4ùÌxÓD·µ(nyâ•ÐêüEUóîNû4»l_P‹ûyÖÍ}ѧWWÝ7½[TÊñPrñß;…ä¤éßÒáäv~³6™U~8æÀ)xi É3\´ˆájðŠZJ=w¶öÚovöv¶õàƒØ]mir½aÚi ƒT,Öë½5¨·Xç`*íól0`¬ ¿ÁE—/™7­½…±\_\ÚО~á¡ÁŒí¾Ú~½÷Brá8UÀQo,YíTt…}?HÑà;Ÿ³%÷«?ž#(mÇ „-î;ÑåîüVÜY·ëêW~âuÞ?#.мڒ/`ƒBÛéoh‚PSµ“쌶l† c3ÿK¶ûÉoh ÆI³á®ÁÒ‚Þö⨅ɩœ›‘LUÖ•ézص«ÈyIfQšJš —wª›6TÑéÔÚ`GD‘Ñìì\ÄsUξºüІ’d7,§k¥É@a¸y¶:ÓÑE¿»¡ÕQæ<­ˆ‚ ÎDVaÐJ'Š™ =Ö=[ žHã0f—–{XZé¡x2i˜I…ÂÙuæ²Ãâ&ûÓcÍ9[s€=h`ÙLÄC* ¹‘4€>Û1œ2‚ÁˆYŽýHæBSLV7§ ÙìÔ¬É[% ä*ZÁÖÆà|âzû÷Õæê71“ÒàÂàzºîKØ.«Ù†©¼"IʪïÑ|æîx4¡f÷h‚ÛÐ Rñ¤ü·!‹lÜ¿?ø|1X¡ ½Oò•¬7»~5&9žÄ¢ûL÷?g“a6¸¿úhõ‡•µûkk\[9Ÿ^ M–»¶<¬Õ<0w¦3%Z¤ý³ÉúŒžìÆÚzîú)ºcO: ‰vJ‰'̱X"(qð ˆÍ·t4ä-Si¸iB÷(Wé½7«©ü¤µ®¨Ü‡;m¨ï”ß±ÓpÓöp‰§©Nï´—‡,>$OÄp‰ò=¢ Ès0×ðôæÓôÏ`êAÙéÛE'ÿ f2óò—ÖÌaÓù¦…&EMIê´:‚œ¸K›C˜o q$4ÕkTˆ¢‘ùUeËVÎ@Òõ(ü¥J];ôÜ=”§fBñ½\n^–ÖSçyl¼œýóë3ÏæåâÅ}–r•ûÂæ—…J©I0âuÚõÛG;Ço¶Žþìç‹(ÖOÁÌc”O=ó´õÐÕÀ`¯ww$’“)<¯æ„ ÕÊæORù+8wÞ”ÒªJµŸØQXЦ¯Øn50Ó8ÕãÇä3óS¸a%]±ˆKîŸjr‘mD‘lç £^¤Š®>ìŽ*­;wl$žâºÊìáÅ&ç‰Û¡³Çáft‰·ž¥‚}Fêñè<6´H¶V}7`y)1ëâÀð=»z·ÿîhç…l‘ðMX`&Z‘âËF1ì{š ß<†F ‘qÒ3g•üРü5Êdº›ÂìRoÔV»%î“öD7äLGE\u.‡+j÷e¶ßCF‰­¯7 .}ýh²ÙîûGVGMžØ Z=ÜΕC´.ñüth£´’r9pý”ùÉ·p!¹ì&DØÒÖÂï°Ïli>¶cE:,ùVJìEÆôd iE¥Ecበ•É? €$YŒ—¾‚ræ7l=aâµ%„¾¿  Ü}Óˆ^€œ÷õÜ9îy08t¶Zx«m/ÿûcñvÖÓ$ïeb,aнÞ"uL&ŠòyÀ.££‹ðU3W™Ž¦´à yã#0R¡²m’GÅûdï3*¨àk~ñöOëõÒý;úa–):+÷Ò†4¥?ã?¦å÷XXƒ2´Hùƒ2«]ÖŸ!ÃÛÝ·;0›¯û£Ò‹qä™òŸf¾ Ð¡PßÚÛŒHQß\ ŸNĽ'¾Q›KÖÓÂ\=Qû'ÁÜöÈùò"ÀÓoþqjZæÙ¡¬yV%õªÌ(> Ò–Ûu¾dqÉ$‰…K}¼°P/¡S†;æt“mú0'¿ Û›D4æS­O ø&››¢]dE9EUŽ ÞÆÖì †FòšsFíÄñ¤{^Ùªí|pf’hn¼¸m©•÷­dÕ•_‡eXý®r(ÊIÓ%œq %¿‚¿°|õixœT©jJæ&>ÊOq¦Œ¨ÆÞ,T¶·C©:x‡Ž4jMãAUý' a+n>_yê"wÖΠ3¹(Vh¥!‰¯•‡­°0:Ù–RG aF®À$<@ÊŠ¸´"’>H¹‰)±gKQRõ¬{ÕH¥¤yŽæuDi„Ùõ‹õ6G¼‘@š:ËŸÕ$,O7KÂÌš`wmZp[{‡oÒF:W|_”§=i'´£ãó-ú^äÉ ³N l2ó†cçàe4•][sØoû¹1.¹¨ŽÄwšùwRO¹"ÛôßhY‚“ãK @cäÖ]åâ÷ÅÆ‘(¤ŽoKfŒ­‘U³§Â‰ƒI!¬j“ìÙÖL½Êäl.H–¾žÅ C͘dÑ̘L6‰Msýæ#÷=ˆ "Ïú|F\!ý7°ãe÷$ª\Yµ|¯Èµ)^ ­ÑXæz1¿Œèôˆæ‹¿–7–9ãMA‰/¶L¬Vn­ÔëßMØÞb¦X^‘á}‹8’ ÃF‡Áذd£G¾ËäH!›Bžq‰°$^{tZ×:<æ™5æ´ͤ½zþp¡†5=JÚc©½ÙúùíÖñë½}v%J8Þ›?¡‘G §¡X|>¬'%q°1ÍO=¹ß¿·é¿Ÿù#üžÛ^„ÀQ‹ý¥mg«ˆÐ74ó3ØÈ8/ÖjÞ’O}“©Ë.Rs¤§% 6RKMÆ»b6q> fèû7ëûíýwã®Û¯1° €¿– GâÑa£òB›ÚÛ‡;[Çîôíý!â6ÝQ{÷ðÝÑ!=£oïé[“PåƒPò ຮK‚ÂT´¶à®¬,e6‹‰14=Û´Ùˆ„UäÍûcò6õyDáßx{ŒüY†_Âå·Gb½ÆØ.n÷pæIÑ…{,G1¹ƒŒî‹€€`ƒK ÃRÕã Þ6Â3ÿþÞ„žiš(°¸êªO·ýº`-ˆÓ«5§=µµÒ^·<äÂ3>UÄk§)å¯ú\¸Ò§*ûËúrK`¥EwW¢8ˆfŒU¦ñ„ã©bƒ¾@µ3±×¢!d/ëË‘¦ƒ«¸h #@d³0”íË1inpE!Æà˭ݽw‡; UÊ „æ× õJöºß›µ¢‚¼Þ0M²,¼¸ÒFtG²°+7«Dœ[®)êôt0ËÏëâI™LqJÐ,Gw&Ýs®KÕ×ÅW«¶éja*¢ÐÂg¯âÌÍB6bD1P €fu"º9¯M–tÑrÆÌGø¡ø¸§ìðÍD*½åŸþô'gZV „rÜ ŽäÂç€\ÕòÄÈwïD0)im·ÒÕ~ï?Ô6¸¨ Æ·r6?iÜêÜžaqµZÃQË'ª·(»x8ð°[Ë— i㡇leÒ1¥ûA«bÁº T¦~ñîÍÛööÁáNû`ËæàP×ÜŸ·ÚÏÞȈÀTÜ&ÆÖ¢¦A[^×¶>)Ìœ¦¦| 8 ³®÷¡XEa0Ä÷Z©ê²ØwWp¾Ù™1ÖpY´÷Òww#26ÛÎZœ–:²|:ÆÙ]õ-pîÅU[<#ÙA€Scø>Æ[ç¸_åd3-áv÷²¼;éó¼ºøhv 36:¡†h3;]bÛ¢bÏ~Ì—wy]6­øe‡_ ŸÐ×5½C¨™ÐˆvÛdŸr÷å‘ÝnI;t4jÆ¥p,Gî¡Ò× ¿xö¹˜kdñmA©!nà˜#ðu­j ±EãÓtRÉ9£${x>  (‚ñ `¡ÃD nø£Kás6{wijƒo®2Ýn; Ö&Eªƒ9;ʨ{“¢SÝ[­â‡‡„°?yÇgÎs‡ò7âF‹º±ªÕ^ÜÇJÑ1ë‚ìô±”'øK(_ ªU š8`±d^úi=tÿ ©nt†‚bŽK ‡$_ctªKùbsáß„$‚Ó`¢óƒ‘:%'# Ô÷>ÊÏtÀ£ÐVÏ“¶® UÐæj¼Í!LeY0 Ù˜mz4ÚÇ&÷þ:´Þ¥1I[¤)ÜÛ‘½Ð£¼ÀÑ3GÖ=#a±å/í·»LþQƒœ8‚kðÇ.×fŽÖ A±]æ´s1ÖûƵ‡‰¿¥ÓoFš¼ÜëgÖÞàG "a(ïl‹±š²­/«‹Õ~´/œ²é%/ÁVºx¤O–`MÎ5ŽN{+^1‘ùßßDE{†eí¤ºÐ!Ùa Xµ=À·-»U·L.Íp¿å Ô' wÏ'àœ-—$™™!€u†ŠÕÜ·jVL+oùZg³aèB”aX34ò/h{žMhEgýaîzÿy²Þ„bšQÀ†‚ˆ£%®Aβl6Ä=+õ㾄Ämv$2³rö‡¸$-Líôà§5Vk Œ‰gN×C$„ô)Ž•’f(p4 4]m»39ãs9mæ+Þr¢v˨ÌÞl5w·›[ï·ùôÃÆõŠ©ºá‰€L¸ÄþPß¶ÞµâWʧ©j£ä‘ʃ*½f†Æ…š?꣞}Ǿ¨üDö“eÓ|06ÈJ °/ãɼ9x·tx@—:hˆrù¢‹0Ö''fUAc…Fî¡Iû; ø2hEdä?Š•ì„|6'AБϾ±”È/›ÍZùó9'¥DÃ˰Ӆ(XrT1˜j¿ßÇ$LžòŽîR¨£üÔŒbÀì-øRMø´ÇÃI÷¬á€IÏ ]±ì‘ïJ8¦ddaè)$˰U±Ë%Û;[{n‰þ´°½¬îî¿<à$uóg·ô˜Cà)]ö‰Ñ7ÎAî/‡IÌ3;c)ýÀÜ>X^ðp‚)ún­7øf„[o÷vŽv ¶Hu¶Ôƹ¦ªÑš »è À‰]<Ë]/FS^vš-z+•Ëμ„ ¾|»³C[·¹·ûæX?Ú<êü=Ðıó7µ;Ëœ±eZ<œ3Ÿ½ì¾=s…ñ%€È‘SòZ}ZšÜåòÇÎÐoB¿öÉŠùqçí¾[Ì}%ælž 1°|¡¦e™Rº€ÄVW›²!rÆ’béŒ{£¡¯¨7!üîîý{óå­é­×ÁR _°%X?º;FôGeåçgqsb%‡õæËúQóÝ˽MZJÛ»)«Ÿ»Ö‚…¦KÀ6KYÇ9£8“Ì ÇfvR‰5hª^ö­Ðä³Õä.`zbÜSJôÚ™ÃgåÎOÇñ¢%]ÓPà6aRìÆÏb/I²Ì<[Ái’fh¢pöŽÙßËóÈk¤eô%€í¼ÒÄ5Çõi¹«œj{Z0׊šÊX4ûxü•ÔQNƒXª^ÇYø]ü—1Îifá ’ëqŠ`V&ž­ï³,¬i_POˆí-PÒß*6}˜Oã9½ö9ÜéÂn]H`>ûî¬zû™ @–ˆ!O‹ Î?2úÙPßó{¬k±¸¿´×Åç´ûÃCöp5º]Àþ€‚!í“ü}ÁF*,Σþ•<=%ŸÉ’`6з•^Î[u›©¡F§6h~ºÌÛÍžmÍlÚÇì j¦Å‘µ+»t ª±y«Õlÿ‹Ã“g8Øå7‚µsPuG|±r?3£ñ‚~À-¥Í­Þ²]Þ¯*Fã…Re!P»É¼ˆØ kh‰4NgÀÙ­©Úú³vjO¤]ñ¾šóBžúv®‹BÒ·$½³ËR׳¶ä8kßk,~Ÿ ´ZœžŒó×Þœ¹md·214*g™*#HUë"jqÌúqì±ÄÕ›R½)Õ=2 ¥–ɤO‡rw|1U5 ö)üvØÅÎIåX”ÂÁFcx†´©AóÔïÁJ SÒÓY£Ä—\;VQ!ˆ„d”¾BˆƒLè=B81Ÿº[rŒIŽù3C$’Nö®™kŦ')žõJ9›>Ñeô:ô@bWr¤[}95?‹µzi÷èŒÄP]€Y}Ër²g&@Õeçw£5’*úóž«lNÍ,3 îJ«+¬ZLþùJÛ–f$$3¤p :ˆÇ;m Sd#¾^iÔW;G‡GͽƒýWâq¦åúüÕÛƒëMúFtsqë^6WF$wÛ”¾D¨_ Fcz`¥\´¹ŸËáè|Òã”;b×g³\XÓ… “Æ€NÒÖ…-N$t¢À÷ ÂéiÔ´•­Q]z,~Q.c8ì¡D%¹Ü¿36·,§_¢vê6‰‚[ŒDjžšÍ ðli¦Ù˜•N}ŸyC›Ö¾H0Áxɽ™üIé†Ó5ŒyšªóèGç!¶Mµ3@{)?F0’Zvç@Þ}»}ã¢xþp¸†y½³é;^îÜõÊ–_»ïº½D[S|Ï&Wh‚Àxe¹ózsõ‚| A.ž®„ëÇF1К‡¿÷¼¾Ý®ÓûŒã/JÅǼ4ô›=÷ýUµ[þ Sxê¡h£±†ü''À«¹s:2É o¯,x¸ËJð¨ÈÒ‰xlCptï9³62›Åé`Ãø£Ûž)=P“8bk0º™4 ù’2í™!û ñ?æñÊmÈåËeåã—{“x §‘^$)s&"LArbvÆücp:Ù+±NÚ0¬ 26ÓÌH|[…Z+>òg›‰õCÛË …ì··SåŽÆà4y«ZÔèÍΛƒ·?7ßlîo¾Úy³Ãj"_aÓ²$6U®[·vLo¦º»ÿÊ­ê»›’ƒïMØšÊí- 2ûFËüªoübuL‰5í"XMÞD6ÄúÑæ›Ãº¥× ­z—ÉhÉ8K±xá”^¼ÝÚ¡nßìÐmýý>½‰íÝúáÞæÏˆN+•V¸7m^pv“#ÈÓeb”îÀ„ Íú0­CÅ=Vœ>ùÞ*){¨ÏÎIŒÒƒ¸; ÏÕƒÒëhskð‡½šA€t¡q§é܆Á/'„i úmNë+ËÒÙ«D‰B¸ÉHx7‰çgjO¤BÚõë–~)½]ÓÄÀÞÛcŽxÊöœ,j+›V>…ÝÖî5ŽÝE•ó QŠÂñRûÿw‚û”×…àb{çåæ»½£•ù?g–‡@Ùx‰Èå‚–!E@Š˜ÔÃý„(-?P Û!œë3 ¦4®U«çñÅä¡Ú«.|{UÎG«øÂì,§|ÿ‰kDýƒCÕ+Ö}Ô—+O4¸6GîqëN›ˆ×ÔJÔE€‚5$Ë ¨Ð+PE,?/Ü^ÓÙaÎyç:Xi7„…"ÕŠ{’ƒà$\¢vq*ér²£k¥Î¥Ä¡ÏãÄm¶¤†Tj5—…ÿBÿ™cøÀÇEµ¥ìöv‰Þ8m·ˆ=\X¾óC¾P2n’ ø-¢lDT`Jâ¬ï-Éës®òý Û¬"¾eÊ*æhYЕ³ÎÀ…ã3+Bwó˶±yN]ˆ=^ënSò°ÑRíô036ÌA*H ç8rb 6jãqoeŒ»mÛHlåVwŠNùE£Ç÷làÃ^ÒÁ¶m‚‡Ö³`ºÔ…¦¼Vò] %dœ[:ºÎƒ.xÆÁÙ‹\fŸ=ˆœ¨[Œž­¨>S‹OÏþSÓÅŽ¬ËXb jJ´—`˜6ûÔ—`çÉSrV½ Ð ;}“Ì”¾Tu”Þi»ÐÜ)ë²úÎQ}w›m¾‹=ÈÿôßáA}÷Ï"ZlÎ'¬4/N™c€l%]‹(ba /fzšR!ÒnzS…X¬­«³Ä¥Ÿó2³Ó0þ¢ƒí#üZ<›§ñ)"üÅpŠ°ê´­”a@¸-#‘,ëà´Q,A‘馠™88J¬1–óñ2;m –¬µØ†KNY,ëò²ú. < dw¢up–˜G X=RA¢ô> ²BO‡"ÐQ[ ô6<³M†‚<~éêÎ ¿Zئ•ÒlxK$ÁnùÈX3³Ìý ‘»_ÏþÃÞNóÍ.¨ŸUMtl^Õ9S†Ø3guØÜQÌWÀK{ÑÀm*SqÕõ³{¢¯ãΉ5¦VuªE Bçhl­c組v ùô°ëÎAYv.¢lYýˆ“RZMÌâ![+“ÅJσ¾^EHmù ÊåìÝÙzºÑ±ÅVCšO,£]Ø.Zp[M÷Ûá¨]“[KýÌˮśEÖŸ9¯Ì¤]6_V—;T›áʾgJ§@(A—9’0ÚJeÖ+ÊéCI&D[ŒÕÔ‚²°lz»pù6/ÓNÚù€eŸÙ’.•g2²¸9Ÿ„È/iès‰‚.æCmÛ‹}Ù‰9T_Þð~ÌÁ uYËn·øÍîž@(¥oØët“nM°% dPÑGÂÈË.q»Q:ÙsÒúhXÓ¢5vsc¤z¦·8ct\†]Z²m}<kÀêðЙ\Í&¥÷´YB몱,¨èÛ ¢Ñ®j­¼Z¼ú¶ÒþèÕ|*HÐfƒb,ìí ùvA1`›˜PÞ½%e¾¾=ò¹ÝŒHùY Î#f4—øTôm, öQ_õÒI^‡cíÒ ÆÇLP´âS¯K²¬‚Í/àåöí·Oä”ï™ü߬=Yû—'L÷·þŸç¼ýýãŸVê¿§ÛßÿúãoÖ²ï}uý›Õ/ù?ÿŸ‡ª“xT=íô«ˆµ8ŒF]8aý¬9?EÞñ­„„ë˜óQ'¹­•Í®ÅìÀ°Ž¡× Ñ|·Ø#n÷/S€=:Ø>¨1P¤w®ÕÞÒ©úc4Å輪ˆÇD…Éøì; Ròù»t=Y¡)ÝDûcâµÁÉkŒ êöÝÑËòw969¤óú×Ig™'•Õµõ&Q”ü†ÂŒ4(fA×î<1Šˆ ¥®iqÞœEái‡ ß‹©1F&ÿ3®Ò<1›w”°2â´†TkŒ€{Ñ Q Y4›^ — ž:h7d¬yµ3hu%ÊŠ¨bna5Ý<ð>®*bNóë•8â3ÚJÚÅY8fî×D}š ”=ç„ÅÖ…çü¡ÖµxÜ65¿5$¢<&¶DŠÂ^œàx"÷ˆÛ¨pó³ -‡ÛR•6¤9Ü5UÈ÷¤²ö 7zÁÔªV«é* ojf5¶zSS€/gÓ.g,ÿ/|/E.¸m“y—g&ÿa Š\Hð›üœ{Šƒb»V„ÄEªèpD\[̘W"ìã†ÙX×yÅy¾At"“ß²a02®ïU«™Â~ïŸu9Ó{eDD#‹—¡_ip…›gkZ‘…OŒR5 o^B¬f¢QT‰ñPe…f¢‘~jL/š¾2Û.Ñ šÊ‰ƒmGÚ¶@«ø×AöªÉåt00Kd$Ž`YB=ºÇyxq, én>F¦vÁҘ˘ç*ONM—ïEAXœB_ä™ÄÀ Œ  'ažùNØ¢µà!G}äø®šôôés|µÒMzD£€PXœâªjaЈ•åR©*Â0ñ–ÖKZëT G“~ó4Œ/ûü‡jr½Žâ˜ G®¬Õ8MôÇFÅ[ZG¶öટ´k»!½¨…¿ÂºyaèZ,;û?}‚Rí³mÔh´ÒšQw@Ä…“¬pi@ÅQ#^Ž•O^4Ú¬¸]3"‚ÂîëÒ™B ,ÒG7ª ylß?{­ÏÂþÇisˆ]QGŠÆƒs„5No@W©+•Øì5üÄ;-¢VÖí×V*šÃ8vÏ-ꡪk]LÐ{ÜB€fóK+¤Í¿ú‹­:Ò·‡pòÙ×ðVËÂ+÷(®ªSú9“N÷|¬sB˜zôP«Ó7ÌÖ)ë½i¡ÉUÔqÆq)WûA4‰¡;HüHÓ•½vSr_˜¨Ëf'q®Ö²Ã0ô mŽŸÒ9ñüDÎ ™›€ÆÛ(༠¾¶’#‡yomÍg‡IΓ«EæxÿD /ÌfŸ áLÿè"©Iô£1²r"¥ª 4´ìË0É ^‰¹Úk90Ê|`>¦›c‡ËiŽˆ©…O,‹õrµŽÒA/!3rVâ½uôvÏlq[þú*Wëêj×Ür6êéBä÷šf<4°·`ÃXÖOåsµCm%ÇI®6Ò$IoqN°å›$“(‡ãrX† Í/ÖSãìœîZÝ?8aa—@ŽÝµø ÖVy6@ёܛ¼“Á9Øåj´ûF’Þg qÕµK‹w>˜€…ñ¼w$탤t×y¹ÚUŠô~;»Ñv š¡kY‰q!vl]|Ñ9ƒ_PÞk#Ñ¢Oú]¬\¯MÁõ*‰µpþjâêÒ°ŠÒêùœ¢qõ—ñxúK5âÂÖ1Ÿ9dÏí_èîòM>$=d÷NG‹JFn!%ïìçðª+DN)ÒçÝ¢y¼³¢­ì“èW–vÁÓñÃ+vrdÙ—ë2ÃRÑ¥¦aÅ ˜¢®z{Ät:ƒÍÖL]Âg.Z,éw"¯„ÍS漑Æ(Xãšù?`9/ºˆ»àNZ·½óÓÑÌ–ŸWÛÑe•Ý‚»&‰ÀMlŤ!ùŠ@ï\þŽ(ÔƒÒbR$½ø«MXj4 ¡æúõ+äx0èó£X–™I’ð2‚GLÄLª©ÔlC–#—9”Ñ‹F¿P­Ú¯þ«Î7\•ï ¿F !€Jyó°÷L^[Ô°èšùÇhJªæÎ4n°a'Ô0¾(Ù#!ÿ*)Âêðbmð'3sîîÓ­P±}çsK^å˜iŸvC±*hy|·ÛÝ<–†!pЫÆÒ˜óÂc%,±da(qèÚŸÐô3žX˜T»Ñ7eõ”[1—¯Q|MŸ¼©i1÷ œKW ÜNt¿–ø±¤e¢&»7¿ÏL ±Èôßùœ’¥«j‚èêy4§J4Ú•å¥F©Š·yÔÜŠ¤“åàøƒùôùäQ©ZX§¯°6·2!¬ñ)`°Ÿñƒ¡ {ÿ™¯ŽÇÖEaÙ•ëñšANS¬ï¼ú©¸Â·˵Óòû”,£kok(¿$ÎvR¸òõZBSN|ê÷´}\òH& Ò­W°üñ˜3’$w ”a¥6¢ãµÂ§¤Îç—ÑóÕ^ž©ß`gñ¨«Â]ùæïìft}9¾iMϯ:ý›.‚IÞÀ#êߌ{“ëª7d鯹Pdë6¢Ž.à Hf[øJœ¯0Žø+¶ó¥ 1_›¯5ˆ=ƒyÞ–÷¸rü%ï8£HÚ,tfÚçëb7‰tÎFáyGŒö…áZ[Å=`}}ÕkP¡;×CX‹µ­AgáLòÂØñ[‚»þõ·Æ’àl·¿ý'_ýøc¨‰FÄNŒžÿÇ9k£qç·ÿ6túÌoÿÕ7¿ýxôõ"*M¯sžÂPxÅ=œvúRˆp‰%¨@sk±»yàî£éí÷Gmö§ç¹!6€Í©<€¬˜5WàAo'|ò|:¥§ªElÖ·vw €= gææUºé±F‰„ñ›(«X ¨?“¥¸/Øe’¿ߣ´ÒO“šÖ°¸åÎqØÊAgTÆ óJdTC}Z[‘‰NOiÆêê1LVX®J;ò !VÌùØïœ_Œs‡!Øþî$¦½æˆ_Hû†¨‡mp¯å°æß6Œ-ñ¨¶²Ü {mŽ˜ t{9˜´.âðŒúGûˇÛ`%‡¥»×¼õ¦êñâÜEH5®kSÄ6£{AÔ·3 Çãeî0M„q챃‰Ï¼b~ ½äÎàÑÙ·±™zÂãŒ*æ%„»ÎWæ¿ulDŒÚ‡º‰`Æí]ÅÎdx1Nâ ÍH<çèŽÏ!Œi!ÃW؈-n'{§TÌ®‰Ã©9›ŒÀßI]z€†SfÏâ‡wAÃËÛ9±îvd~"6ö. SLÈô7`yʉáerípªkfDWyÂ/ TÖ›É&΋)y=8Ø0tØ%–^MŒ¡"˜Mˆka7 8Û¤ËÚ$®À{ê=„#\°ˆ´ÅCÚ¿ôˆVI4… 0"î¹-~t’LÙôˆë;çðëtОòˆÎ0±JÅ«¾ gH+C\þ^‡í(F‡‰¤>éŒ u}Fo–×ði‡½JéÁ(â°V f¦è¹ìœØ=m{aÿb0hWXž™Ú˜Ì‹ÄªFøG‰¼JJw2_ɸèhWRe$GÚŠ)‚æ7’›Ï UeKU$¹ÂNŸ¨ªxUXì„nÙÄ»®~‡Áúj q-‹w‡8jM”EŸgGYd‚ZÜà립6·‰ ª­›+ýNIZ‚ÝMÑ~É‘Ð9G Q¸õÝWM—ÍÀø i7G­&ZÕý9uZB·©„Y˜Ýý£*ˆ÷V8!bÉݘ@L Ä&^`IɹW¤œ¢Ô‘ ü1?O, °®üjÙ ¾Û·Sôg4gJ“þüI±\NŸsµxVláÄ(úR:+c³„H„.¢^~}Ò Ä䙯Wéé¤{ú8Üz½·}³EÿÕoöß½¹iVuA%wEáäXdlUªŸüÊü5ØÙz}pƒ~¼ÙÝÚÜ?Ø/ùêMjÑj?ÁÔ² IIZñ¹b޶êà½Ïƒ{à¤E•îŽjo,äÂѬþÞшÐö>øXŒ‚ßÝ)|ôøM+)yŽÔÌ¥•Ëtõ[â Å>œ*iƒx2EµVá`úܙǞaÛ}ΚéÌ'~ ˜¸\óažWÖñqí7©œT‹,ÇJtQðØDÅ»‰¿Bzg„æ@.1gJ$ø­.¤åñ´?¯E£·~Rù¦²ú¢”³ùº!¯Þ?øRyüḦ£iÄè¤TÕÝ4ßh\/­®_Cî:é‰ 1ùý ›$_%¡r€bv"þ쪓?ÁÙw]Û ç\Ã0ª«y˜^¤ÐÆÑµär•{höø;þ=É®µØØò¡Ùé·kÿ4Ûò»í;—í/>wد=y¼–µÿþöñÚã/ö¿ÿ€ÏÃlû_°y.³|œTËómö3"%q«Ëוëk:™‡^ŒjÚÏ#ø NÁœ{°`:Q,IbÙäåȬÑOÕ§?ÿZUkGÜ™ò™At7;R9c†ŽÌË©Óô x žg‹È»Åî¸3]λ†ßÒýý¡9ëärh•ücŠËä§hš?îã=Š8ZŽÕòËé‘°<Ÿ7|˜ÄÎ Ù0H…Yɵmƒ*ËõF—B{€›%½Y´®Ý{¤öS0Þ›ž÷nÏôÿ°OôûüÏ?{ƒù|ù|ù|ù|ù|ù|ù|ù|ù|ùxŸÿA» readline-8.3/examples/rlfe/config.h.in000644 000436 000024 00000022423 14617465701 020037 0ustar00chetstaff000000 000000 /* Copyright 2004 Per Bothner * Based on config.h from screen-4.0.2. * Copyright (c) 1993-2000 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program 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. * * This program 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 this program (see the file COPYING); if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * **************************************************************** * $Id: config.h.in,v 1.12 1994/05/31 12:31:36 mlschroe Exp $ FAU */ /********************************************************************** * * User Configuration Section */ /* * define PTYMODE if you do not like the default of 0622, which allows * public write to your pty. * define PTYGROUP to some numerical group-id if you do not want the * tty to be in "your" group. * Note, screen is unable to change mode or group of the pty if it * is not installed with sufficient privilege. (e.g. set-uid-root) * define PTYROFS if the /dev/pty devices are mounted on a read-only * filesystem so screen should not even attempt to set mode or group * even if running as root (e.g. on TiVo). */ #undef PTYMODE #undef PTYGROUP #undef PTYROFS /* * If screen is NOT installed set-uid root, screen can provide tty * security by exclusively locking the ptys. While this keeps other * users from opening your ptys, it also keeps your own subprocesses * from being able to open /dev/tty. Define LOCKPTY to add this * exclusive locking. */ #undef LOCKPTY /********************************************************************** * * End of User Configuration Section * * Rest of this file is modified by 'configure' * Change at your own risk! * */ /* * Some defines to identify special unix variants */ #ifndef SVR4 #undef SVR4 #endif #ifndef _POSIX_SOURCE #undef _POSIX_SOURCE #endif /* * Define POSIX if your system supports IEEE Std 1003.1-1988 (POSIX). */ #undef POSIX /* * Define TERMIO if you have struct termio instead of struct sgttyb. * This is usually the case for SVID systems, where BSD uses sgttyb. * POSIX systems should define this anyway, even though they use * struct termios. */ #undef TERMIO /* * Define CYTERMIO if you have cyrillic termio modes. */ #undef CYTERMIO /* * Define TERMINFO if your machine emulates the termcap routines * with the terminfo database. * Thus the .screenrc file is parsed for * the command 'terminfo' and not 'termcap'. */ #undef TERMINFO /* * If your library does not define ospeed, define this. */ #undef NEED_OSPEED /* * Define SYSV if your machine is SYSV complient (Sys V, HPUX, A/UX) */ #ifndef SYSV #undef SYSV #endif /* * Define SIGVOID if your signal handlers return void. On older * systems, signal returns int, but on newer ones, it returns void. */ #undef SIGVOID /* * Define USESIGSET if you have sigset for BSD 4.1 reliable signals. */ #undef USESIGSET /* * Define SYSVSIGS if signal handlers must be reinstalled after * they have been called. */ #undef SYSVSIGS /* * Define BSDWAIT if your system defines a 'union wait' in * * Only allow BSDWAIT i.e. wait3 on nonposix systems, since * posix implies wait(3) and waitpid(3). vdlinden@fwi.uva.nl * */ #ifndef POSIX #undef BSDWAIT #endif /* * On RISCOS we prefer wait2() over wait3(). rouilj@sni-usa.com */ #ifdef BSDWAIT #undef USE_WAIT2 #endif /* * Define if you have the utempter utmp helper program */ #undef HAVE_UTEMPTER /* * If ttyslot() breaks getlogin() by returning indexes to utmp entries * of type DEAD_PROCESS, then our getlogin() replacement should be * selected by defining BUGGYGETLOGIN. */ #undef BUGGYGETLOGIN /* * If your system has the calls setreuid() and setregid(), * define HAVE_SETREUID. Otherwise screen will use a forked process to * safely create output files without retaining any special privileges. */ #undef HAVE_SETREUID /* * If your system supports BSD4.4's seteuid() and setegid(), define * HAVE_SETEUID. */ #undef HAVE_SETEUID /* * If you want the "time" command to display the current load average * define LOADAV. Maybe you must install screen with the needed * privileges to read /dev/kmem. * Note that NLIST_ stuff is only checked, when getloadavg() is not available. */ #undef LOADAV #undef LOADAV_NUM #undef LOADAV_TYPE #undef LOADAV_SCALE #undef LOADAV_GETLOADAVG #undef LOADAV_UNIX #undef LOADAV_AVENRUN #undef LOADAV_USE_NLIST64 #undef NLIST_DECLARED #undef NLIST_STRUCT #undef NLIST_NAME_UNION /* * If your system has the new format /etc/ttys (like 4.3 BSD) and the * getttyent(3) library functions, define GETTTYENT. */ #undef GETTTYENT /* * Define USEBCOPY if the bcopy/memcpy from your system's C library * supports the overlapping of source and destination blocks. When * undefined, screen uses its own (probably slower) version of bcopy(). * * SYSV machines may have a working memcpy() -- Oh, this is * quite unlikely. Tell me if you see one. * "But then, memmove() should work, if at all available" he thought... * Boing, never say "works everywhere" unless you checked SCO UNIX. * Their memove fails the test in the configure script. Sigh. (Juergen) */ #undef USEBCOPY #undef USEMEMCPY #undef USEMEMMOVE #undef HAVE_SETEUID #undef HAVE_SETREUID /* * If your system has vsprintf() and requires the use of the macros in * "varargs.h" to use functions with variable arguments, * define USEVARARGS. */ #undef USEVARARGS /* * If your system has strerror() define this. */ #undef HAVE_STRERROR /* * If the select return value doesn't treat a descriptor that is * usable for reading and writing as two hits, define SELECT_BROKEN. */ #undef SELECT_BROKEN /* * Define this if your system supports named pipes. */ #undef NAMEDPIPE /* * Define this if your system exits select() immediatly if a pipe is * opened read-only and no writer has opened it. */ #undef BROKEN_PIPE /* * Define this if the unix-domain socket implementation doesn't * create a socket in the filesystem. */ #undef SOCK_NOT_IN_FS /* * If your system has setenv() and unsetenv() define USESETENV */ #undef USESETENV /* * If your system does not come with a setenv()/putenv()/getenv() * functions, you may bring in our own code by defining NEEDPUTENV. */ #undef NEEDPUTENV /* * If the passwords are stored in a shadow file and you want the * builtin lock to work properly, define SHADOWPW. */ #undef SHADOWPW /* * If you are on a SYS V machine that restricts filename length to 14 * characters, you may need to enforce that by setting NAME_MAX to 14 */ #undef NAME_MAX /* KEEP_UNDEF_HERE override system value */ #undef NAME_MAX #undef HAVE_BCOPY #undef HAVE_MEMCPY #undef HAVE_MEMMOVE #undef HAVE_MKFIFO /* * define HAVE_RENAME if your system has a rename() function */ #undef HAVE_RENAME /* * define HAVE__EXIT if your system has the _exit() call. */ #undef HAVE__EXIT /* * define HAVE_LSTAT if your system has symlinks and the lstat() call. */ #undef HAVE_LSTAT /* * define HAVE_UTIMES if your system has the utimes() call. */ #undef HAVE_UTIMES /* * define HAVE_FCHOWN if your system has the fchown() call. */ #undef HAVE_FCHOWN /* * define HAVE_FCHMOD if your system has the fchmod() call. */ #undef HAVE_FCHMOD /* * define HAVE_VSNPRINTF if your system has vsnprintf() (GNU lib). */ #undef HAVE_VSNPRINTF /* * define HAVE_GETCWD if your system has the getcwd() call. */ #undef HAVE_GETCWD /* * define HAVE_SETLOCALE if your system has the setlocale() call. */ #undef HAVE_SETLOCALE /* * define HAVE_STRFTIME if your system has the strftime() call. */ #undef HAVE_STRFTIME /* * define HAVE_NL_LANGINFO if your system has the nl_langinfo() call * and defines CODESET. */ #undef HAVE_NL_LANGINFO /* * Newer versions of Solaris include fdwalk, which can greatly improve * the startup time of screen; otherwise screen spends a lot of time * closing file descriptors. */ #undef HAVE_FDWALK /* * define HAVE_DEV_PTC if you have a /dev/ptc character special * device. */ #undef HAVE_DEV_PTC /* * define HAVE_SVR4_PTYS if you have a /dev/ptmx character special * device and support the ptsname(), grantpt(), unlockpt() functions. */ #undef HAVE_SVR4_PTYS /* * define HAVE_GETPT if you have the getpt() function. */ #undef HAVE_GETPT /* * define HAVE_OPENPTY if your system has the openpty() call. */ #undef HAVE_OPENPTY /* * define PTYRANGE0 and or PTYRANGE1 if you want to adapt screen * to unusual environments. E.g. For SunOs the defaults are "qpr" and * "0123456789abcdef". For SunOs 4.1.2 * #define PTYRANGE0 "pqrstuvwxyzPQRST" * is recommended by Dan Jacobson. */ #undef PTYRANGE0 #undef PTYRANGE1 #define USEVARARGS #undef HAVE_SYS_STROPTS_H #undef HAVE_SYS_WAIT_H #undef HAVE_SGTTY_H #undef HAVE_SYS_SELECT_H readline-8.3/examples/rlfe/configure000755 000436 000024 00000530404 14617724616 017731 0ustar00chetstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for rlfe 0.4. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='rlfe' PACKAGE_TARNAME='rlfe' PACKAGE_VERSION='0.4' PACKAGE_STRING='rlfe 0.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="rlfe.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='LTLIBOBJS LIBOBJS XTERMPATH WRITEPATH AWK SET_MAKE CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INCDIR VERSION target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_pty_mode with_pty_group ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures rlfe 0.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/rlfe] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of rlfe 0.4:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pty-mode=mode default mode for ptys --with-pty-group=group default group for ptys Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF rlfe configure 0.4 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status ;; esac fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by rlfe $as_me 0.4, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" old_CFLAGS="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test ${ac_cv_safe_to_define___extensions__+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_safe_to_define___extensions__=yes else case e in #( e) ac_cv_safe_to_define___extensions__=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } if test ${ac_cv_should_define__xopen_source+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h if test $ac_cv_header_minix_config_h = yes then : MINIX=yes printf "%s\n" "#define _MINIX 1" >>confdefs.h printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h else case e in #( e) MINIX= ;; esac fi if test $ac_cv_safe_to_define___extensions__ = yes then : printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h fi if test $ac_cv_should_define__xopen_source = yes then : printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h fi if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(){return (0);} _ACEOF if ac_fn_c_try_run "$LINENO" then : else case e in #( e) if test $CC != cc ; then echo "Your $CC failed - restarting with CC=cc" 1>&6 echo "" 1>&6 CC=cc export CC exec $0 $configure_args fi ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(){return(0);} _ACEOF if ac_fn_c_try_run "$LINENO" then : else case e in #( e) exec 5>&2 eval $ac_link echo "CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;" 1>&6 echo "$ac_compile" 1>&6 as_fn_error $? "Can't run the compiler - sorry" "$LINENO" 5 ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { int __something_strange_(); __something_strange_(0); } _ACEOF if ac_fn_c_try_run "$LINENO" then : as_fn_error $? "Your compiler does not set the exit status - sorry" "$LINENO" 5 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done if test -f etc/toolcheck; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for buggy tools" >&5 printf %s "checking for buggy tools... " >&6; } sh etc/toolcheck 1>&6 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for System V" >&5 printf %s "checking for System V... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main (void) { int x = SIGCHLD | FNDELAY; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) printf "%s\n" "#define SYSV 1" >>confdefs.h ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Solaris 2.x" >&5 printf %s "checking for Solaris 2.x... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 printf %s "checking for egrep -e... " >&6; } if test ${ac_cv_path_EGREP_TRADITIONAL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then : fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi if test "$ac_cv_path_EGREP_TRADITIONAL" then : ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(SVR4) && defined(sun) yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "yes" >/dev/null 2>&1 then : LIBS="$LIBS -lsocket -lnsl -lkstat" fi rm -rf conftest* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for POSIX" >&5 printf %s "checking for POSIX... " >&6; } if test "$cross_compiling" = yes then : posix=yes else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main() { #ifdef _POSIX_VERSION return (0); #else return (1); #endif } _ACEOF if ac_fn_c_try_run "$LINENO" then : posix=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test -n "$posix"; then printf "%s\n" "#define POSIX 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" if test "x$ac_cv_func_seteuid" = xyes then : printf "%s\n" "#define HAVE_SETEUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" if test "x$ac_cv_func_setreuid" = xyes then : printf "%s\n" "#define HAVE_SETREUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "_exit" "ac_cv_func__exit" if test "x$ac_cv_func__exit" = xyes then : printf "%s\n" "#define HAVE__EXIT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" if test "x$ac_cv_func_getcwd" = xyes then : printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" if test "x$ac_cv_func_memcpy" = xyes then : printf "%s\n" "#define HAVE_MEMCPY 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" if test "x$ac_cv_func_memmove" = xyes then : printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mkfifo" "ac_cv_func_mkfifo" if test "x$ac_cv_func_mkfifo" = xyes then : printf "%s\n" "#define HAVE_MKFIFO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" if test "x$ac_cv_func_strerror" = xyes then : printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes then : printf "%s\n" "#define HAVE_STRFTIME 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes" if test "x$ac_cv_func_utimes" = xyes then : printf "%s\n" "#define HAVE_UTIMES 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes then : printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" if test "x$ac_cv_func_nl_langinfo" = xyes then : printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking select" >&5 printf %s "checking select... " >&6; } ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes then : printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" if test "x$ac_cv_func_select" = xyes then : printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h fi if test X$av_cv_func_select = Xno; then LIBS="$LIBS -lnet -lnsl" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking select with $LIBS" >&5 printf %s "checking select with $LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { select(0, 0, 0, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else case e in #( e) as_fn_error $? "!!! no select - no screen" "$LINENO" 5 ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking select return value" >&5 printf %s "checking select return value... " >&6; } if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include #include #include char *nam = "/tmp/conftest$$"; #ifdef NAMEDPIPE #ifndef O_NONBLOCK #define O_NONBLOCK O_NDELAY #endif #ifndef S_IFIFO #define S_IFIFO 0010000 #endif int main() { #ifdef FD_SET fd_set f; #else int f; #endif #ifdef __FreeBSD__ /* From Andrew A. Chernov (ache@astral.msk.su): * opening RDWR fifo fails in BSD 4.4, but select return values are * right. */ exit(0); #endif (void)alarm(5); #ifdef POSIX if (mkfifo(nam, 0777)) #else if (mknod(nam, S_IFIFO|0777, 0)) #endif exit(1); close(0); if (open(nam, O_RDWR | O_NONBLOCK)) exit(1); if (write(0, "TEST", 4) == -1) exit(1); #else #include #include #include int main() { int s1, s2, l; struct sockaddr_un a; #ifdef FD_SET fd_set f; #else int f; #endif (void)alarm(5); if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) exit(1); a.sun_family = AF_UNIX; strcpy(a.sun_path, nam); (void) unlink(nam); if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1) exit(1); if (listen(s1, 2)) exit(1); if (fork() == 0) { if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) kill(getppid(), 3); (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2); if (write(s2, "HELLO", 5) == -1) kill(getppid(), 3); exit(0); } l = sizeof(a); close(0); if (accept(s1, (struct sockaddr *)&a, &l)) exit(1); #endif #ifdef FD_SET FD_SET(0, &f); #else f = 1; #endif if (select(1, &f, 0, 0, 0) == -1) exit(1); if (select(1, &f, &f, 0, 0) != 2) exit(1); exit(0); } _ACEOF if ac_fn_c_try_run "$LINENO" then : echo "- select is ok" 1>&6 else case e in #( e) echo "- select can't count" 1>&6 printf "%s\n" "#define SELECT_BROKEN 1" >>confdefs.h ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent" >&5 printf %s "checking for tgetent... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char tgetent(void); int main (void) { tgetent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : else case e in #( e) olibs="$LIBS" LIBS="-lcurses $olibs" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking libcurses" >&5 printf %s "checking libcurses... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char tgetent(void); int main (void) { #ifdef __hpux __sorry_hpux_libcurses_is_totally_broken_in_10_10(); #else tgetent(); #endif ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : else case e in #( e) LIBS="-ltermcap $olibs" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking libtermcap" >&5 printf %s "checking libtermcap... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char tgetent(void); int main (void) { tgetent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : else case e in #( e) LIBS="-ltermlib $olibs" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking libtermlib" >&5 printf %s "checking libtermlib... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char tgetent(void); int main (void) { tgetent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : else case e in #( e) LIBS="-lncurses $olibs" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking libncurses" >&5 printf %s "checking libncurses... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char tgetent(void); int main (void) { tgetent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : else case e in #( e) as_fn_error $? "!!! no tgetent - no screen" "$LINENO" 5 ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern char *tgoto(); int main() { return(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1); } _ACEOF if ac_fn_c_try_run "$LINENO" then : echo "- you use the termcap database" 1>&6 else case e in #( e) echo "- you use the terminfo database" 1>&6 printf "%s\n" "#define TERMINFO 1" >>confdefs.h ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking ospeed" >&5 printf %s "checking ospeed... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern short ospeed; int main (void) { ospeed=5; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : have_ospeed=yes else case e in #( e) have_ospeed=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_ospeed" >&5 printf "%s\n" "$have_ospeed" >&6; } if test $have_ospeed = yes; then : else printf "%s\n" "#define NEED_OSPEED 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5 printf %s "checking for /dev/ptc... " >&6; } if test -r /dev/ptc; then printf "%s\n" "#define HAVE_DEV_PTC 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SVR4 ptys" >&5 printf %s "checking for SVR4 ptys... " >&6; } sysvr4ptys= if test -c /dev/ptmx ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { ptsname(0);grantpt(0);unlockpt(0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : printf "%s\n" "#define HAVE_SVR4_PTYS 1" >>confdefs.h sysvr4ptys=1 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test -n "$sysvr4ptys"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ac_fn_c_check_func "$LINENO" "getpt" "ac_cv_func_getpt" if test "x$ac_cv_func_getpt" = xyes then : printf "%s\n" "#define HAVE_GETPT 1" >>confdefs.h fi if test -z "$sysvr4ptys"; then for ac_func in openpty do : ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" if test "x$ac_cv_func_openpty" = xyes then : printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 printf %s "checking for openpty in -lutil... " >&6; } if test ${ac_cv_lib_util_openpty+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lutil $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char openpty (void); int main (void) { return openpty (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_util_openpty=yes else case e in #( e) ac_cv_lib_util_openpty=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 printf "%s\n" "$ac_cv_lib_util_openpty" >&6; } if test "x$ac_cv_lib_util_openpty" = xyes then : printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h LIBS="$LIBS -lutil" fi ;; esac fi done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ptyranges" >&5 printf %s "checking for ptyranges... " >&6; } if test -d /dev/ptym ; then pdir='/dev/ptym' else pdir='/dev' fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef M_UNIX yes; #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "yes" >/dev/null 2>&1 then : ptys=`echo /dev/ptyp??` else case e in #( e) ptys=`echo $pdir/pty??` ;; esac fi rm -rf conftest* if test "$ptys" != "$pdir/pty??" ; then p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'` p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'` printf "%s\n" "#define PTYRANGE0 \"$p0\"" >>confdefs.h printf "%s\n" "#define PTYRANGE1 \"$p1\"" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } # Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; ptymode="${withval}" fi # Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; ptygrp="${withval}" fi test -n "$ptymode" || ptymode=0620 if test -n "$ptygrp" ; then printf "%s\n" "#define PTYMODE $ptymode" >>confdefs.h printf "%s\n" "#define PTYGROUP $ptygrp" >>confdefs.h else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking default tty permissions/group" >&5 printf %s "checking default tty permissions/group... " >&6; } rm -f conftest_grp if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include int main() { struct stat sb; char *x,*ttyname(); int om, m; FILE *fp; if (!(x = ttyname(0))) exit(1); if (stat(x, &sb)) exit(1); om = sb.st_mode; if (om & 002) exit(0); m = system("mesg y"); if (m == -1 || m == 127) exit(1); if (stat(x, &sb)) exit(1); m = sb.st_mode; if (chmod(x, om)) exit(1); if (m & 002) exit(0); if (sb.st_gid == getgid()) exit(1); if (!(fp=fopen("conftest_grp", "w"))) exit(1); fprintf(fp, "%d\n", sb.st_gid); fclose(fp); exit(0); } _ACEOF if ac_fn_c_try_run "$LINENO" then : if test -f conftest_grp; then ptygrp=`cat conftest_grp` echo "- pty mode: $ptymode, group: $ptygrp" 1>&6 printf "%s\n" "#define PTYMODE $ptymode" >>confdefs.h printf "%s\n" "#define PTYGROUP $ptygrp" >>confdefs.h else echo "- ptys are world accessable" 1>&6 fi else case e in #( e) WRITEPATH='' XTERMPATH='' # Extract the first word of "write", so it can be a program name with args. set dummy write; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_WRITEPATH+y} then : printf %s "(cached) " >&6 else case e in #( e) case $WRITEPATH in [\\/]* | ?:[\\/]*) ac_cv_path_WRITEPATH="$WRITEPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_WRITEPATH="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi WRITEPATH=$ac_cv_path_WRITEPATH if test -n "$WRITEPATH"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WRITEPATH" >&5 printf "%s\n" "$WRITEPATH" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "xterm", so it can be a program name with args. set dummy xterm; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_XTERMPATH+y} then : printf %s "(cached) " >&6 else case e in #( e) case $XTERMPATH in [\\/]* | ?:[\\/]*) ac_cv_path_XTERMPATH="$XTERMPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_XTERMPATH="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi XTERMPATH=$ac_cv_path_XTERMPATH if test -n "$XTERMPATH"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XTERMPATH" >&5 printf "%s\n" "$XTERMPATH" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi found= if test -n "$WRITEPATH$XTERMPATH"; then findfollow= lsfollow= found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null` if test -n "$found"; then findfollow=-follow lsfollow=L fi if test -n "$XTERMPATH"; then ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'` if test tty != "$ptygrpn"; then XTERMPATH= fi fi fi if test -n "$WRITEPATH$XTERMPATH"; then found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print` if test -n "$found"; then ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'` echo "- pty mode: $ptymode, group: $ptygrp" 1>&6 printf "%s\n" "#define PTYMODE $ptymode" >>confdefs.h printf "%s\n" "#define PTYGROUP $ptygrp" >>confdefs.h else echo "- ptys are world accessable" 1>&6 fi else echo "- can't determine - assume ptys are world accessable" 1>&6 fi ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f conftest_grp fi if test -n "$posix" ; then echo "assuming posix signal definition" 1>&6 printf "%s\n" "#define SIGVOID 1" >>confdefs.h printf "%s\n" "#define HAVE_POSIX_SIGNALS 1" >>confdefs.h else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 printf %s "checking return type of signal handlers... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef signal #undef signal #endif extern void (*signal ()) (); int main (void) { int i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : printf "%s\n" "#define SIGVOID 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking sigset" >&5 printf %s "checking sigset... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #ifdef SIGVOID sigset(0, (void (*)())0); #else sigset(0, (int (*)())0); #endif ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : printf "%s\n" "#define USESIGSET 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking signal implementation" >&5 printf %s "checking signal implementation... " >&6; } if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef SIGCLD #define SIGCLD SIGCHLD #endif #ifdef USESIGSET #define signal sigset #endif int got; #ifdef SIGVOID void #endif hand() { got++; } int main() { /* on hpux we use sigvec to get bsd signals */ #ifdef __hpux (void)signal(SIGCLD, hand); kill(getpid(), SIGCLD); kill(getpid(), SIGCLD); if (got < 2) return(1); #endif return(0); } _ACEOF if ac_fn_c_try_run "$LINENO" then : else case e in #( e) printf "%s\n" "#define SYSVSIGS 1" >>confdefs.h ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi fi ac_fn_c_check_header_compile "$LINENO" "sys/stropts.h" "ac_cv_header_sys_stropts_h" "$ac_includes_default" if test "x$ac_cv_header_sys_stropts_h" = xyes then : printf "%s\n" "#define HAVE_SYS_STROPTS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes then : printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sgtty.h" "ac_cv_header_sgtty_h" "$ac_includes_default" if test "x$ac_cv_header_sgtty_h" = xyes then : printf "%s\n" "#define HAVE_SGTTY_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes then : printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "term.h" "ac_cv_header_term_h" "$ac_includes_default" if test "x$ac_cv_header_term_h" = xyes then : printf "%s\n" "#define HAVE_TERM_H 1" >>confdefs.h fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by rlfe $as_me 0.4, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ rlfe config.status 0.4 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi readline-8.3/examples/rlfe/configure.ac000644 000436 000024 00000024341 14617724610 020300 0ustar00chetstaff000000 000000 dnl Process this file with autoconf to produce a configure script. dnl last update: Fri May 10 10:45:29 EDT 2024 VERSION=0.4 AC_INIT(rlfe, 0.4) AC_CONFIG_SRCDIR(rlfe.c) AC_CONFIG_HEADERS(config.h) AC_SUBST(VERSION) dnl we don't do anything with this yet AC_SUBST(INCDIR) dnl dnl Define some useful macros dnl AC_DEFUN([AC_PROGRAM_SOURCE], [AC_REQUIRE([AC_PROG_CPP])AC_PROVIDE([$0])cat > conftest.c <&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out" . ./conftest.out rm -f conftest* ])dnl dnl define(AC_NOTE, [echo "$1" 1>&AS_MESSAGE_FD ])dnl old_CFLAGS="$CFLAGS" AC_PROG_CC AC_PROG_CPP AC_PROG_MAKE_SET AC_USE_SYSTEM_EXTENSIONS AC_TRY_RUN(int main(){return (0);},,[ if test $CC != cc ; then AC_NOTE(Your $CC failed - restarting with CC=cc) AC_NOTE() CC=cc export CC exec $0 $configure_args fi ]) AC_TRY_RUN(int main(){return(0);},, exec 5>&2 eval $ac_link AC_NOTE(CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;) AC_NOTE($ac_compile) AC_MSG_ERROR(Can't run the compiler - sorry)) AC_TRY_RUN([ int main() { int __something_strange_(); __something_strange_(0); } ],AC_MSG_ERROR(Your compiler does not set the exit status - sorry)) AC_PROG_AWK if test -f etc/toolcheck; then AC_MSG_CHECKING(for buggy tools) sh etc/toolcheck 1>&AS_MESSAGE_FD fi dnl dnl **** special unix variants **** dnl AC_MSG_CHECKING(for System V) AC_TRY_COMPILE( [#include #include #include ], [int x = SIGCHLD | FNDELAY;], , AC_DEFINE(SYSV)) AC_MSG_RESULT(done) AC_MSG_CHECKING(for Solaris 2.x) AC_EGREP_CPP(yes, [#if defined(SVR4) && defined(sun) yes #endif ], LIBS="$LIBS -lsocket -lnsl -lkstat") AC_MSG_CHECKING(for POSIX) AC_TRY_RUN([ #include #include int main() { #ifdef _POSIX_VERSION return (0); #else return (1); #endif } ], posix=yes, , posix=yes) if test -n "$posix"; then AC_DEFINE(POSIX) AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi dnl dnl libc dnl dnl system calls AC_CHECK_FUNCS(seteuid setreuid _exit) dnl library functions AC_CHECK_FUNCS(getcwd memcpy memmove mkfifo strerror strftime utimes) dnl locale AC_CHECK_FUNCS(setlocale nl_langinfo) dnl dnl **** select() **** dnl AC_MSG_CHECKING(select) AC_CHECK_HEADERS(sys/select.h) AC_CHECK_FUNCS(select) if test X$av_cv_func_select = Xno; then LIBS="$LIBS -lnet -lnsl" AC_MSG_CHECKING(select with $LIBS) AC_TRY_LINK( [ #include ], [ select(0, 0, 0, 0, 0); ], AC_MSG_RESULT(yes), AC_MSG_ERROR(!!! no select - no screen) ) fi dnl dnl **** check the select implementation **** dnl AC_MSG_CHECKING(select return value) AC_TRY_RUN([ #include #include #include #include #include #include #include char *nam = "/tmp/conftest$$"; #ifdef NAMEDPIPE #ifndef O_NONBLOCK #define O_NONBLOCK O_NDELAY #endif #ifndef S_IFIFO #define S_IFIFO 0010000 #endif int main() { #ifdef FD_SET fd_set f; #else int f; #endif #ifdef __FreeBSD__ /* From Andrew A. Chernov (ache@astral.msk.su): * opening RDWR fifo fails in BSD 4.4, but select return values are * right. */ exit(0); #endif (void)alarm(5); #ifdef POSIX if (mkfifo(nam, 0777)) #else if (mknod(nam, S_IFIFO|0777, 0)) #endif exit(1); close(0); if (open(nam, O_RDWR | O_NONBLOCK)) exit(1); if (write(0, "TEST", 4) == -1) exit(1); #else #include #include #include int main() { int s1, s2, l; struct sockaddr_un a; #ifdef FD_SET fd_set f; #else int f; #endif (void)alarm(5); if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) exit(1); a.sun_family = AF_UNIX; strcpy(a.sun_path, nam); (void) unlink(nam); if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1) exit(1); if (listen(s1, 2)) exit(1); if (fork() == 0) { if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) kill(getppid(), 3); (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2); if (write(s2, "HELLO", 5) == -1) kill(getppid(), 3); exit(0); } l = sizeof(a); close(0); if (accept(s1, (struct sockaddr *)&a, &l)) exit(1); #endif #ifdef FD_SET FD_SET(0, &f); #else f = 1; #endif if (select(1, &f, 0, 0, 0) == -1) exit(1); if (select(1, &f, &f, 0, 0) != 2) exit(1); exit(0); } ],AC_NOTE(- select is ok), AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN)) dnl dnl **** termcap or terminfo **** dnl AC_MSG_CHECKING(for tgetent) AC_TRY_LINK([extern char tgetent(void);],tgetent();,, olibs="$LIBS" LIBS="-lcurses $olibs" AC_MSG_CHECKING(libcurses) AC_TRY_LINK([extern char tgetent(void);],[ #ifdef __hpux __sorry_hpux_libcurses_is_totally_broken_in_10_10(); #else tgetent(); #endif ],, LIBS="-ltermcap $olibs" AC_MSG_CHECKING(libtermcap) AC_TRY_LINK([extern char tgetent(void);],tgetent();,, LIBS="-ltermlib $olibs" AC_MSG_CHECKING(libtermlib) AC_TRY_LINK([extern char tgetent(void);],tgetent();,, LIBS="-lncurses $olibs" AC_MSG_CHECKING(libncurses) AC_TRY_LINK([extern char tgetent(void);],tgetent();,, AC_MSG_ERROR(!!! no tgetent - no screen)))))) AC_TRY_RUN([ #include extern char *tgoto(); int main() { return(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1); }], AC_NOTE(- you use the termcap database), AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO)) AC_MSG_CHECKING(ospeed) AC_TRY_LINK([extern short ospeed;],[ospeed=5;],have_ospeed=yes,have_ospeed=no) AC_MSG_RESULT($have_ospeed) if test $have_ospeed = yes; then : else AC_DEFINE(NEED_OSPEED) fi dnl dnl **** PTY specific things **** dnl AC_MSG_CHECKING(for /dev/ptc) if test -r /dev/ptc; then AC_DEFINE(HAVE_DEV_PTC) AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi AC_MSG_CHECKING(for SVR4 ptys) sysvr4ptys= if test -c /dev/ptmx ; then AC_TRY_LINK([#include ],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS) sysvr4ptys=1]) fi if test -n "$sysvr4ptys"; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi AC_CHECK_FUNCS(getpt) dnl check for openpty() if test -z "$sysvr4ptys"; then AC_CHECK_FUNCS(openpty,, [AC_CHECK_LIB(util,openpty, [AC_DEFINE(HAVE_OPENPTY)] [LIBS="$LIBS -lutil"])]) fi AC_MSG_CHECKING(for ptyranges) if test -d /dev/ptym ; then pdir='/dev/ptym' else pdir='/dev' fi dnl SCO uses ptyp%d AC_EGREP_CPP(yes, [#ifdef M_UNIX yes; #endif ], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`) dnl if test -c /dev/ptyp19; then dnl ptys=`echo /dev/ptyp??` dnl else dnl ptys=`echo $pdir/pty??` dnl fi if test "$ptys" != "$pdir/pty??" ; then p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'` p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'` AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0") AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1") fi AC_MSG_RESULT(done) dnl **** pty mode/group handling **** dnl dnl support provided by Luke Mewburn , 931222 AC_ARG_WITH(pty-mode, [ --with-pty-mode=mode default mode for ptys], [ ptymode="${withval}" ]) AC_ARG_WITH(pty-group, [ --with-pty-group=group default group for ptys], [ ptygrp="${withval}" ]) test -n "$ptymode" || ptymode=0620 if test -n "$ptygrp" ; then AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) else AC_MSG_CHECKING(default tty permissions/group) rm -f conftest_grp AC_TRY_RUN([ #include #include #include #include #include int main() { struct stat sb; char *x,*ttyname(); int om, m; FILE *fp; if (!(x = ttyname(0))) exit(1); if (stat(x, &sb)) exit(1); om = sb.st_mode; if (om & 002) exit(0); m = system("mesg y"); if (m == -1 || m == 127) exit(1); if (stat(x, &sb)) exit(1); m = sb.st_mode; if (chmod(x, om)) exit(1); if (m & 002) exit(0); if (sb.st_gid == getgid()) exit(1); if (!(fp=fopen("conftest_grp", "w"))) exit(1); fprintf(fp, "%d\n", sb.st_gid); fclose(fp); exit(0); } ],[ if test -f conftest_grp; then ptygrp=`cat conftest_grp` AC_NOTE([- pty mode: $ptymode, group: $ptygrp]) AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) else AC_NOTE(- ptys are world accessable) fi ],[ WRITEPATH='' XTERMPATH='' AC_PATH_PROG(WRITEPATH, write) AC_PATH_PROG(XTERMPATH, xterm) found= if test -n "$WRITEPATH$XTERMPATH"; then findfollow= lsfollow= found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null` if test -n "$found"; then findfollow=-follow lsfollow=L fi if test -n "$XTERMPATH"; then ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'` if test tty != "$ptygrpn"; then XTERMPATH= fi fi fi if test -n "$WRITEPATH$XTERMPATH"; then found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print` if test -n "$found"; then ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'` AC_NOTE([- pty mode: $ptymode, group: $ptygrp]) AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) else AC_NOTE(- ptys are world accessable) fi else AC_NOTE(- can't determine - assume ptys are world accessable) fi ] ) rm -f conftest_grp fi dnl dnl **** signal handling **** dnl if test -n "$posix" ; then dnl POSIX has reliable signals with void return type. AC_NOTE(assuming posix signal definition) AC_DEFINE(SIGVOID) AC_DEFINE(HAVE_POSIX_SIGNALS) else AC_MSG_CHECKING(return type of signal handlers) AC_TRY_COMPILE( [#include #include #ifdef signal #undef signal #endif extern void (*signal ()) ();], [int i;], AC_DEFINE(SIGVOID)) AC_MSG_CHECKING(sigset) AC_TRY_LINK([ #include #include ],[ #ifdef SIGVOID sigset(0, (void (*)())0); #else sigset(0, (int (*)())0); #endif ], AC_DEFINE(USESIGSET)) AC_MSG_CHECKING(signal implementation) AC_TRY_RUN([ #include #include #ifndef SIGCLD #define SIGCLD SIGCHLD #endif #ifdef USESIGSET #define signal sigset #endif int got; #ifdef SIGVOID void #endif hand() { got++; } int main() { /* on hpux we use sigvec to get bsd signals */ #ifdef __hpux (void)signal(SIGCLD, hand); kill(getpid(), SIGCLD); kill(getpid(), SIGCLD); if (got < 2) return(1); #endif return(0); } ],,AC_DEFINE(SYSVSIGS)) fi AC_CHECK_HEADERS(sys/stropts.h sys/wait.h sgtty.h sys/select.h) AC_CHECK_HEADERS(term.h) AC_CONFIG_FILES(Makefile) AC_OUTPUT readline-8.3/examples/rlfe/pty.c000644 000436 000024 00000020132 14617442406 016764 0ustar00chetstaff000000 000000 /* Copyright (c) 1993-2002 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program 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. * * This program 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 this program (see the file COPYING); if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * **************************************************************** */ #include "config.h" #include #include #include #include #include #include #include "screen.h" #ifndef sun # include #endif /* for solaris 2.1, Unixware (SVR4.2) and possibly others */ #if defined (HAVE_SVR4_PTYS) && defined (HAVE_SYS_STROPTS_H) # include #endif #if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL) # include #endif #ifdef ISC # include # include # include #endif #ifdef sgi # include #endif /* sgi */ #include "extern.h" /* * if no PTYRANGE[01] is in the config file, we pick a default */ #ifndef PTYRANGE0 # define PTYRANGE0 "qpr" #endif #ifndef PTYRANGE1 # define PTYRANGE1 "0123456789abcdef" #endif /* SVR4 pseudo ttys don't seem to work with SCO-5 */ #ifdef M_UNIX # undef HAVE_SVR4_PTYS #endif extern int eff_uid; /* used for opening a new pty-pair: */ static char PtyName[32], TtyName[32]; #if !(defined(sequent) || defined(_SEQUENT_) || defined(HAVE_SVR4_PTYS)) # ifdef hpux static char PtyProto[] = "/dev/ptym/ptyXY"; static char TtyProto[] = "/dev/pty/ttyXY"; # else # ifdef M_UNIX static char PtyProto[] = "/dev/ptypXY"; static char TtyProto[] = "/dev/ttypXY"; # else static char PtyProto[] = "/dev/ptyXY"; static char TtyProto[] = "/dev/ttyXY"; # endif # endif /* hpux */ #endif static void initmaster __P((int)); #if defined(sun) /* sun's utmp_update program opens the salve side, thus corrupting */ int pty_preopen = 1; #else int pty_preopen = 0; #endif /* * Open all ptys with O_NOCTTY, just to be on the safe side * (RISCos mips breaks otherwise) */ #ifndef O_NOCTTY # define O_NOCTTY 0 #endif /***************************************************************/ static void initmaster(int f) { #ifdef POSIX tcflush(f, TCIOFLUSH); #else # ifdef TIOCFLUSH (void) ioctl(f, TIOCFLUSH, (char *) 0); # endif #endif #ifdef LOCKPTY (void) ioctl(f, TIOCEXCL, (char *) 0); #endif } void InitPTY(int f) { if (f < 0) return; #if defined(I_PUSH) && defined(HAVE_SVR4_PTYS) && !defined(sgi) && !defined(linux) && !defined(__osf__) && !defined(M_UNIX) if (ioctl(f, I_PUSH, "ptem")) Panic(errno, "InitPTY: cannot I_PUSH ptem"); if (ioctl(f, I_PUSH, "ldterm")) Panic(errno, "InitPTY: cannot I_PUSH ldterm"); # ifdef sun if (ioctl(f, I_PUSH, "ttcompat")) Panic(errno, "InitPTY: cannot I_PUSH ttcompat"); # endif #endif } /***************************************************************/ #if defined(OSX) && !defined(PTY_DONE) #define PTY_DONE int OpenPTY(char **ttyn) { register int f; if ((f = open_controlling_pty(TtyName)) < 0) return -1; initmaster(f); *ttyn = TtyName; return f; } #endif /***************************************************************/ #if (defined(sequent) || defined(_SEQUENT_)) && !defined(PTY_DONE) #define PTY_DONE int OpenPTY(char **ttyn) { char *m, *s; register int f; if ((f = getpseudotty(&s, &m)) < 0) return -1; #ifdef _SEQUENT_ fvhangup(s); #endif strncpy(PtyName, m, sizeof(PtyName)); strncpy(TtyName, s, sizeof(TtyName)); initmaster(f); *ttyn = TtyName; return f; } #endif /***************************************************************/ #if defined(__sgi) && !defined(PTY_DONE) #define PTY_DONE int OpenPTY(char **ttyn) { int f; char *name, *_getpty(); sigret_t (*sigcld)__P(SIGPROTOARG); /* * SIGCHLD set to SIG_DFL for _getpty() because it may fork() and * exec() /usr/adm/mkpts */ sigcld = signal(SIGCHLD, SIG_DFL); name = _getpty(&f, O_RDWR | O_NONBLOCK, 0600, 0); signal(SIGCHLD, sigcld); if (name == 0) return -1; initmaster(f); *ttyn = name; return f; } #endif /***************************************************************/ #if defined(MIPS) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE) #define PTY_DONE int OpenPTY(char **ttyn) { register int f; struct stat buf; strcpy(PtyName, "/dev/ptc"); if ((f = open(PtyName, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) return -1; if (fstat(f, &buf) < 0) { close(f); return -1; } sprintf(TtyName, "/dev/ttyq%d", minor(buf.st_rdev)); initmaster(f); *ttyn = TtyName; return f; } #endif /***************************************************************/ #if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) #define PTY_DONE int OpenPTY(char **ttyn) { register int f; char *m; char *ptsname __P((int)); int unlockpt __P((int)), grantpt __P((int)); #if defined(HAVE_GETPT) && defined(linux) int getpt __P((void)); #endif sigret_t (*sigcld)__P(SIGPROTOARG); strcpy(PtyName, "/dev/ptmx"); #if defined(HAVE_GETPT) && defined(linux) if ((f = getpt()) == -1) #else if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1) #endif return -1; /* * SIGCHLD set to SIG_DFL for grantpt() because it fork()s and * exec()s pt_chmod */ sigcld = signal(SIGCHLD, SIG_DFL); if ((m = ptsname(f)) == NULL || grantpt(f) || unlockpt(f)) { signal(SIGCHLD, sigcld); close(f); return -1; } signal(SIGCHLD, sigcld); strncpy(TtyName, m, sizeof(TtyName)); initmaster(f); *ttyn = TtyName; return f; } #endif /***************************************************************/ #if defined(_AIX) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE) #define PTY_DONE int OpenPTY(char **ttyn) { register int f; /* a dumb looking loop replaced by mycrofts code: */ strcpy (PtyName, "/dev/ptc"); if ((f = open (PtyName, O_RDWR | O_NOCTTY)) < 0) return -1; strncpy(TtyName, ttyname(f), sizeof(TtyName)); if (eff_uid && access(TtyName, R_OK | W_OK)) { close(f); return -1; } initmaster(f); # ifdef _IBMR2 pty_preopen = 1; # endif *ttyn = TtyName; return f; } #endif /***************************************************************/ #if defined(HAVE_OPENPTY) && !defined(PTY_DONE) #define PTY_DONE int OpenPTY(char **ttyn) { int f, s; if (openpty(&f, &s, TtyName, NULL, NULL) != 0) return -1; close(s); initmaster(f); pty_preopen = 1; *ttyn = TtyName; return f; } #endif /***************************************************************/ #ifndef PTY_DONE int OpenPTY(char **ttyn) { register char *p, *q, *l, *d; register int f; debug("OpenPTY: Using BSD style ptys.\n"); strcpy(PtyName, PtyProto); strcpy(TtyName, TtyProto); for (p = PtyName; *p != 'X'; p++) ; for (q = TtyName; *q != 'X'; q++) ; for (l = PTYRANGE0; (*p = *l) != '\0'; l++) { for (d = PTYRANGE1; (p[1] = *d) != '\0'; d++) { debug1("OpenPTY tries '%s'\n", PtyName); if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1) continue; q[0] = *l; q[1] = *d; if (eff_uid && access(TtyName, R_OK | W_OK)) { close(f); continue; } #if defined(sun) && defined(TIOCGPGRP) && !defined(SUNOS3) /* Hack to ensure that the slave side of the pty is * unused. May not work in anything other than SunOS4.1 */ { int pgrp; /* tcgetpgrp does not work (uses TIOCGETPGRP)! */ if (ioctl(f, TIOCGPGRP, (char *)&pgrp) != -1 || errno != EIO) { close(f); continue; } } #endif initmaster(f); *ttyn = TtyName; return f; } } return -1; } #endif readline-8.3/examples/rlfe/rlfe.c000644 000436 000024 00000047050 14617470741 017113 0ustar00chetstaff000000 000000 /* A front-end using readline to "cook" input lines. * * Copyright (C) 2004, 1999 Per Bothner * * This front-end program 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. * * Some code from Johnson & Troan: "Linux Application Development" * (Addison-Wesley, 1998) was used directly or for inspiration. * * 2003-11-07 Wolfgang Taeuber * Specify a history file and the size of the history file with command * line options; use EDITOR/VISUAL to set vi/emacs preference. */ /* PROBLEMS/TODO: * * Only tested under GNU/Linux and Mac OS 10.x; needs to be ported. * * Switching between line-editing-mode vs raw-char-mode depending on * what tcgetattr returns is inherently not robust, plus it doesn't * work when ssh/telnetting in. A better solution is possible if the * tty system can send in-line escape sequences indicating the current * mode, echo'd input, etc. That would also allow a user preference * to set different colors for prompt, input, stdout, and stderr. * * When running mc -c under the Linux console, mc does not recognize * mouse clicks, which mc does when not running under rlfe. * * Pasting selected text containing tabs is like hitting the tab character, * which invokes readline completion. We don't want this. I don't know * if this is fixable without integrating rlfe into a terminal emulator. * * Echo suppression is a kludge, but can only be avoided with better kernel * support: We need a tty mode to disable "real" echoing, while still * letting the inferior think its tty driver to doing echoing. * Stevens's book claims SCR$ and BSD4.3+ have TIOCREMOTE. * * The latest readline may have some hooks we can use to avoid having * to back up the prompt. (See HAVE_ALREADY_PROMPTED.) * * Desirable readline feature: When in cooked no-echo mode (e.g. password), * echo characters are they are types with '*', but remove them when done. * * Asynchronous output while we're editing an input line should be * inserted in the output view *before* the input line, so that the * lines being edited (with the prompt) float at the end of the input. * * A "page mode" option to emulate more/less behavior: At each page of * output, pause for a user command. This required parsing the output * to keep track of line lengths. It also requires remembering the * output, if we want an option to scroll back, which suggests that * this should be integrated with a terminal emulator like xterm. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "extern.h" #if defined (HAVE_SYS_WAIT_H) # include #endif #ifdef READLINE_LIBRARY # include "readline.h" # include "history.h" #else # include # include #endif #ifndef COMMAND #define COMMAND "/bin/bash" #endif #ifndef COMMAND_ARGS #define COMMAND_ARGS COMMAND #endif #ifndef ALT_COMMAND #define ALT_COMMAND "/bin/sh" #endif #ifndef ALT_COMMAND_ARGS #define ALT_COMMAND_ARGS ALT_COMMAND #endif #ifndef HAVE_MEMMOVE # if __GNUC__ > 1 # define memmove(d, s, n) __builtin_memcpy(d, s, n) # else # define memmove(d, s, n) memcpy(d, s, n) # endif #endif #define APPLICATION_NAME "rlfe" static int in_from_inferior_fd; static int out_to_inferior_fd; static void set_edit_mode (void); static void usage_exit (void); static char *hist_file = 0; static int hist_size = 0; /* Unfortunately, we cannot safely display echo from the inferior process. The reason is that the echo bit in the pty is "owned" by the inferior, and if we try to turn it off, we could confuse the inferior. Thus, when echoing, we get echo twice: First readline echoes while we're actually editing. Then we send the line to the inferior, and the terminal driver send back an extra echo. The work-around is to remember the input lines, and when we see that line come back, we supress the output. A better solution (supposedly available on SVR4) would be a smarter terminal driver, with more flags ... */ #define ECHO_SUPPRESS_MAX 1024 char echo_suppress_buffer[ECHO_SUPPRESS_MAX]; int echo_suppress_start = 0; int echo_suppress_limit = 0; /*#define DEBUG*/ #ifdef DEBUG FILE *logfile = NULL; #define DPRINT0(FMT) (fprintf(logfile, FMT), fflush(logfile)) #define DPRINT1(FMT, V1) (fprintf(logfile, FMT, V1), fflush(logfile)) #define DPRINT2(FMT, V1, V2) (fprintf(logfile, FMT, V1, V2), fflush(logfile)) #else #define DPRINT0(FMT) ((void) 0) /* Do nothing */ #define DPRINT1(FMT, V1) ((void) 0) /* Do nothing */ #define DPRINT2(FMT, V1, V2) ((void) 0) /* Do nothing */ #endif struct termios orig_term; /* Pid of child process. */ static pid_t child = -1; static void sig_child (int signo) { int status; wait (&status); if (hist_file != 0) { write_history (hist_file); if (hist_size) history_truncate_file (hist_file, hist_size); } DPRINT0 ("(Child process died.)\n"); tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); exit (0); } volatile int propagate_sigwinch = 0; /* sigwinch_handler * propagate window size changes from input file descriptor to * master side of pty. */ void sigwinch_handler(int signal) { propagate_sigwinch = 1; } /* get_slave_pty() returns an integer file descriptor. * If it returns < 0, an error has occurred. * Otherwise, it has returned the slave file descriptor. */ int get_slave_pty(char *name) { struct group *gptr; gid_t gid; int slave = -1; /* chown/chmod the corresponding pty, if possible. * This will only work if the process has root permissions. * Alternatively, write and exec a small setuid program that * does just this. */ if ((gptr = getgrnam("tty")) != 0) { gid = gptr->gr_gid; } else { /* if the tty group does not exist, don't change the * group on the slave pty, only the owner */ gid = -1; } /* Note that we do not check for errors here. If this is code * where these actions are critical, check for errors! */ chown(name, getuid(), gid); /* This code only makes the slave read/writeable for the user. * If this is for an interactive shell that will want to * receive "write" and "wall" messages, OR S_IWGRP into the * second argument below. */ chmod(name, S_IRUSR|S_IWUSR); /* open the corresponding slave pty */ slave = open(name, O_RDWR); return (slave); } /* Certain special characters, such as ctrl/C, we want to pass directly to the inferior, rather than letting readline handle them. */ static char special_chars[20]; static int special_chars_count; static void add_special_char(int ch) { if (ch != 0) special_chars[special_chars_count++] = ch; } static int eof_char; static int is_special_char(int ch) { int i; #if 0 if (ch == eof_char && rl_point == rl_end) return 1; #endif for (i = special_chars_count; --i >= 0; ) if (special_chars[i] == ch) return 1; return 0; } static char buf[1024]; /* buf[0 .. buf_count-1] is the what has been emitted on the current line. It is used as the readline prompt. */ static int buf_count = 0; int do_emphasize_input = 1; int current_emphasize_input; char *start_input_mode = "\033[1m"; char *end_input_mode = "\033[0m"; int num_keys = 0; static void maybe_emphasize_input (int on) { if (on == current_emphasize_input || (on && ! do_emphasize_input)) return; fprintf (rl_outstream, "%s", on ? start_input_mode : end_input_mode); fflush (rl_outstream); current_emphasize_input = on; } static void null_prep_terminal (int meta) { } static void null_deprep_terminal (void) { maybe_emphasize_input (0); } static int pre_input_change_mode (void) { return 0; } char pending_special_char; static void line_handler (char *line) { if (line == NULL) { char buf[1]; DPRINT0("saw eof!\n"); buf[0] = '\004'; /* ctrl/d */ write (out_to_inferior_fd, buf, 1); } else { static char enter[] = "\r"; /* Send line to inferior: */ int length = strlen (line); if (length > ECHO_SUPPRESS_MAX-2) { echo_suppress_start = 0; echo_suppress_limit = 0; } else { if (echo_suppress_limit + length > ECHO_SUPPRESS_MAX - 2) { if (echo_suppress_limit - echo_suppress_start + length <= ECHO_SUPPRESS_MAX - 2) { memmove (echo_suppress_buffer, echo_suppress_buffer + echo_suppress_start, echo_suppress_limit - echo_suppress_start); echo_suppress_limit -= echo_suppress_start; echo_suppress_start = 0; } else { echo_suppress_limit = 0; } echo_suppress_start = 0; } memcpy (echo_suppress_buffer + echo_suppress_limit, line, length); echo_suppress_limit += length; echo_suppress_buffer[echo_suppress_limit++] = '\r'; echo_suppress_buffer[echo_suppress_limit++] = '\n'; } write (out_to_inferior_fd, line, length); if (pending_special_char == 0) { write (out_to_inferior_fd, enter, sizeof(enter)-1); if (*line) add_history (line); } free (line); } rl_callback_handler_remove (); buf_count = 0; num_keys = 0; if (pending_special_char != 0) { write (out_to_inferior_fd, &pending_special_char, 1); pending_special_char = 0; } } /* Value of rl_getc_function. Use this because readline should read from stdin, not rl_instream, points to the pty (so readline has monitor its terminal modes). */ int my_rl_getc (FILE *dummy) { int ch = rl_getc (stdin); if (is_special_char (ch)) { pending_special_char = ch; return '\r'; } return ch; } int main(int argc, char** argv) { char *path; int i; int master; char *name; int in_from_tty_fd; struct sigaction act; struct winsize ws; struct termios t; int maxfd; fd_set in_set; static char empty_string[1] = ""; char *prompt = empty_string; int ioctl_err = 0; int arg_base = 1; #ifdef DEBUG logfile = fopen("/tmp/rlfe.log", "w"); #endif while (arg_base= argc ) usage_exit(); switch(argv[arg_base][1]) { case 'h': arg_base++; hist_file = argv[arg_base]; break; case 's': arg_base++; hist_size = atoi(argv[arg_base]); if (hist_size<0) usage_exit(); break; default: usage_exit(); } arg_base++; } if (hist_file) read_history (hist_file); set_edit_mode (); rl_readline_name = APPLICATION_NAME; if ((master = OpenPTY (&name)) < 0) { perror("ptypair: could not open master pty"); exit(1); } DPRINT1("pty name: '%s'\n", name); /* set up SIGWINCH handler */ act.sa_handler = sigwinch_handler; sigemptyset(&(act.sa_mask)); act.sa_flags = 0; if (sigaction(SIGWINCH, &act, NULL) < 0) { perror("ptypair: could not handle SIGWINCH "); exit(1); } if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) { perror("ptypair: could not get window size"); exit(1); } if ((child = fork()) < 0) { perror("cannot fork"); exit(1); } if (child == 0) { int slave; /* file descriptor for slave pty */ /* We are in the child process */ close(master); #ifdef TIOCSCTTY if ((slave = get_slave_pty(name)) < 0) { perror("ptypair: could not open slave pty"); exit(1); } #endif /* We need to make this process a session group leader, because * it is on a new PTY, and things like job control simply will * not work correctly unless there is a session group leader * and process group leader (which a session group leader * automatically is). This also disassociates us from our old * controlling tty. */ if (setsid() < 0) { perror("could not set session leader"); } /* Tie us to our new controlling tty. */ #ifdef TIOCSCTTY if (ioctl(slave, TIOCSCTTY, NULL)) { perror("could not set new controlling tty"); } #else if ((slave = get_slave_pty(name)) < 0) { perror("ptypair: could not open slave pty"); exit(1); } #endif /* make slave pty be standard in, out, and error */ dup2(slave, STDIN_FILENO); dup2(slave, STDOUT_FILENO); dup2(slave, STDERR_FILENO); /* at this point the slave pty should be standard input */ if (slave > 2) { close(slave); } /* Try to restore window size; failure isn't critical */ if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0) { perror("could not restore window size"); } /* now start the shell */ { static char* command_args[] = { COMMAND_ARGS, NULL }; static char* alt_command_args[] = { ALT_COMMAND_ARGS, NULL }; if (argc <= 1) { execvp (COMMAND, command_args); execvp (ALT_COMMAND, alt_command_args); } else execvp (argv[arg_base], &argv[arg_base]); } /* should never be reached */ exit(1); } /* parent */ signal (SIGCHLD, sig_child); /* Note that we only set termios settings for standard input; * the master side of a pty is NOT a tty. */ tcgetattr(STDIN_FILENO, &orig_term); t = orig_term; eof_char = t.c_cc[VEOF]; /* add_special_char(t.c_cc[VEOF]);*/ add_special_char(t.c_cc[VINTR]); add_special_char(t.c_cc[VQUIT]); add_special_char(t.c_cc[VSUSP]); #if defined (VDISCARD) add_special_char(t.c_cc[VDISCARD]); #endif t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \ ECHOK | ECHONL #if defined (ECHOKE) | ECHOKE #endif #if defined (ECHOPRT) | ECHOPRT #endif ); t.c_iflag &= ~ICRNL; t.c_iflag |= IGNBRK; t.c_cc[VMIN] = 1; t.c_cc[VTIME] = 0; tcsetattr(STDIN_FILENO, TCSANOW, &t); in_from_inferior_fd = master; out_to_inferior_fd = master; rl_instream = fdopen (master, "r"); rl_getc_function = my_rl_getc; rl_prep_term_function = null_prep_terminal; rl_deprep_term_function = null_deprep_terminal; rl_pre_input_hook = pre_input_change_mode; rl_callback_handler_install (prompt, line_handler); in_from_tty_fd = STDIN_FILENO; FD_ZERO (&in_set); maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd : in_from_tty_fd; for (;;) { int num; FD_SET (in_from_inferior_fd, &in_set); FD_SET (in_from_tty_fd, &in_set); num = select(maxfd+1, &in_set, NULL, NULL, NULL); if (propagate_sigwinch) { struct winsize ws; if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) >= 0) { ioctl (master, TIOCSWINSZ, &ws); } propagate_sigwinch = 0; continue; } if (num <= 0) { perror ("select"); exit (-1); } if (FD_ISSET (in_from_tty_fd, &in_set)) { extern int _rl_echoing_p; struct termios term_master; int do_canon = 1; int do_icrnl = 1; int ioctl_ret; DPRINT1("[tty avail num_keys:%d]\n", num_keys); /* If we can't get tty modes for the master side of the pty, we can't handle non-canonical-mode programs. Always assume the master is in canonical echo mode if we can't tell. */ ioctl_ret = tcgetattr(master, &term_master); if (ioctl_ret >= 0) { do_canon = (term_master.c_lflag & ICANON) != 0; do_icrnl = (term_master.c_lflag & ICRNL) != 0; _rl_echoing_p = (term_master.c_lflag & ECHO) != 0; DPRINT1 ("echo,canon,crnl:%03d\n", 100 * _rl_echoing_p + 10 * do_canon + 1 * do_icrnl); } else { if (ioctl_err == 0) DPRINT1("tcgetattr on master fd failed: errno = %d\n", errno); ioctl_err = 1; } if (do_canon == 0 && num_keys == 0) { char ch[10]; int count = read (STDIN_FILENO, ch, sizeof(ch)); DPRINT1("[read %d chars from stdin: ", count); DPRINT2(" \"%.*s\"]\n", count, ch); if (do_icrnl) { int i = count; while (--i >= 0) { if (ch[i] == '\r') ch[i] = '\n'; } } maybe_emphasize_input (1); write (out_to_inferior_fd, ch, count); } else { if (num_keys == 0) { int i; /* Re-install callback handler for new prompt. */ if (prompt != empty_string) free (prompt); if (prompt == NULL) { DPRINT0("New empty prompt\n"); prompt = empty_string; } else { if (do_emphasize_input && buf_count > 0) { prompt = malloc (buf_count + strlen (end_input_mode) + strlen (start_input_mode) + 5); sprintf (prompt, "\001%s\002%.*s\001%s\002", end_input_mode, buf_count, buf, start_input_mode); } else { prompt = malloc (buf_count + 1); memcpy (prompt, buf, buf_count); prompt[buf_count] = '\0'; } DPRINT1("New prompt '%s'\n", prompt); #if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED */ /* Doesn't quite work when do_emphasize_input is 1. */ rl_already_prompted = buf_count > 0; #else if (buf_count > 0) write (1, "\r", 1); #endif } rl_callback_handler_install (prompt, line_handler); } num_keys++; maybe_emphasize_input (1); rl_callback_read_char (); } } else /* output from inferior. */ { int i; int count; int old_count; if (buf_count > (sizeof(buf) >> 2)) buf_count = 0; count = read (in_from_inferior_fd, buf+buf_count, sizeof(buf) - buf_count); DPRINT2("read %d from inferior, buf_count=%d", count, buf_count); DPRINT2(": \"%.*s\"", count, buf+buf_count); maybe_emphasize_input (0); if (count <= 0) { DPRINT0 ("(Connection closed by foreign host.)\n"); tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); exit (0); } old_count = buf_count; /* Look for any pending echo that we need to suppress. */ while (echo_suppress_start < echo_suppress_limit && count > 0 && buf[buf_count] == echo_suppress_buffer[echo_suppress_start]) { count--; buf_count++; echo_suppress_start++; } DPRINT1("suppressed %d characters of echo.\n", buf_count-old_count); /* Write to the terminal anything that was not suppressed. */ if (count > 0) write (1, buf + buf_count, count); /* Finally, look for a prompt candidate. * When we get around to going input (from the keyboard), * we will consider the prompt to be anything since the last * line terminator. So we need to save that text in the * initial part of buf. However, anything before the * most recent end-of-line is not interesting. */ buf_count += count; #if 1 for (i = buf_count; --i >= old_count; ) #else for (i = buf_count - 1; i-- >= buf_count - count; ) #endif { if (buf[i] == '\n' || buf[i] == '\r') { i++; memmove (buf, buf+i, buf_count - i); buf_count -= i; break; } } DPRINT2("-> i: %d, buf_count: %d\n", i, buf_count); } } } static void set_edit_mode (void) { int vi = 0; char *shellopts; shellopts = getenv ("SHELLOPTS"); while (shellopts != 0) { if (strncmp ("vi", shellopts, 2) == 0) { vi = 1; break; } shellopts = strchr (shellopts + 1, ':'); } if (!vi) { if (getenv ("EDITOR") != 0) vi |= strcmp (getenv ("EDITOR"), "vi") == 0; } if (vi) rl_variable_bind ("editing-mode", "vi"); else rl_variable_bind ("editing-mode", "emacs"); } static void usage_exit (void) { fprintf (stderr, "Usage: rlfe [-h histfile] [-s size] cmd [arg1] [arg2] ...\n\n"); exit (1); } readline-8.3/examples/rlfe/ChangeLog000644 000436 000024 00000002473 10142531027 017551 0ustar00chetstaff000000 000000 2004-11-04 Per Bothner * pty.c: Import from screen-4.0.2. * configure.in, Makefile.in, config.h.in: Set up autoconf handling, copying a bunk of stuff over from screen. * rlfe.c: Use OpenPTY from pty.c instead of get_master_pty. 2004-11-03 Per Bothner * rlfe.c: Get input emphasis (boldening) more robust. * rlfe.c: Various cleanups on comments and names. 2003-11-07 Wolfgang Taeuber * Specify a history file and the size of the history file with command * line options; use EDITOR/VISUAL to set vi/emacs preference. 1999-09-03 Chet Ramey * fep.c: Memmove is not universally available. This patch assumes that an autoconf test has been performed, and that memcpy is available without checking. * fep.c: VDISCARD is not universally available, even when termios is. * fep.c: If a system doesn't have TIOCSCTTY, the first `open' performed after setsid allocates a controlling terminal. The original code would leave the child process running on the slave pty without a controlling tty if TIOCSCTTY was not available. * fep.c: Most versions of SVR4, including solaris, don't allow terminal ioctl calls on the master side of the pty. 1999-08-28 Per Bothner * fep.c: Initial release. readline-8.3/examples/rlfe/README000644 000436 000024 00000005514 10142553403 016660 0ustar00chetstaff000000 000000 rlfe (ReadLine Front-End) is a "universal wrapper" around readline. You specify an interactive program to run (typically a shell), and readline is used to edit input lines. There are other such front-ends; what distinguishes this one is that it monitors the state of the inferior pty, and if the inferior program switches its terminal to raw mode, then rlfe passes your characters through directly. This basically means you can run your entire session (including bash and terminal-mode emacs) under rlfe. FEATURES * Can use all readline commands (and history) in commands that read input lines in "canonical mode" - even 'cat'! * Automatically switches between "readline-editing mode" and "raw mode" depending on the terminal mode. If the inferior program invokes readline itself, it will do its own line editing. (The inferior readline will not know about rlfe, and it will have its own history.) You can even run programs like 'emavs -nw' and 'vi' under rlfe. The goal is you could leave rlfe always on without even knowing about it. (We're not quite there, but it works tolerably well.) * The input line (after any prompt) is changed to bold-face. INSTALL The usual: ./configure && make && make install Note so far rlfe has only been tested on GNU Linux (Fedora Core 2) and Mac OS X (10.3). This assumes readline header files and libraries are in the default places. If not, you can create a link named readline pointing to the readline sources. To link with libreadline.a and libhistory.a you can copy or link them, or add LDFLAGS='-/path/to/readline' to the make command-line. USAGE Just run it. That by default runs bash. You can run some other command by giving it as command-line arguments. There are a few tweaks: -h allows you to name the history file, and -s allows you to specify its size. It default to "emacs" mode, but if the the environment variable EDITOR is set to "vi" that mode is chosen. ISSUES * The mode switching depends on the terminal mode set by the inferior program. Thus ssh/telnet/screen-type programs will typically be in raw mode, so rlfe won't be much use, even if remote programs run in canonical mode. The work-around is to run rlfe on the remote end. * Echo supression and prompt recognition are somewhat fragile. (A protocol so that the o/s tty code can reliably communicate its state to rlfe could solve this problem, and the previous one.) * See the intro to rlfe.c for more notes. * Assumes a VT100-compatible terminal, though that could be generalized if anybody cares. * Requires ncurses. * It would be useful to integrate rlfe's logic in a terminal emulator. That would make it easier to reposition the edit position with a mouse, integrate cut-and-paste with the system clipboard, and more robustly handle escape sequence and multi-byte characters more robustly. AUTHOR Per Bothner LICENSE GPL. readline-8.3/examples/rlfe/Makefile.in000644 000436 000024 00000012167 14617476335 020072 0ustar00chetstaff000000 000000 # # Makefile template for rlfe # # See machine dependant config.h for more configuration options. # srcdir = @srcdir@ VPATH = @srcdir@ INCDIR = @INCDIR@ DESTDIR = # Where to install screen. prefix = @prefix@ exec_prefix = @exec_prefix@ # don't forget to change mandir and infodir in doc/Makefile. bindir = $(exec_prefix)/bin VERSION = @VERSION@ SCREEN = screen-$(VERSION) CC = @CC@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ #LDFLAGS = -L$(READLINE_DIR) LDFLAGS = @LDFLAGS@ LIBS = -lreadline -lhistory @LIBS@ CPP=@CPP@ CPP_DEPEND=$(CC) -MM INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ AWK = @AWK@ OPTIONS= #OPTIONS= -DDEBUG SHELL=/bin/sh CFILES= rlfe.c pty.c HFILES= extern.h os.h screen.h EXTRA_DIST=configure.ac configure Makefile.in config.h.in ChangeLog README OFILES= rlfe.o pty.o all: rlfe rlfe: $(OFILES) $(CC) $(LDFLAGS) -o $@ $(OFILES) $(LIBS) rlfe-$(VERSION).tar.gz: tar czf $@ $(CFILES) $(HFILES) $(EXTRA_DIST) .c.o: $(CC) -c -I. -I$(srcdir) $(CPPFLAGS) $(M_CFLAGS) $(DEFS) $(OPTIONS) $(CFLAGS) $< install_bin: .version screen -if [ -f $(DESTDIR)$(bindir)/$(SCREEN) ] && [ ! -f $(DESTDIR)$(bindir)/$(SCREEN).old ]; \ then mv $(DESTDIR)$(bindir)/$(SCREEN) $(DESTDIR)$(bindir)/$(SCREEN).old; fi $(INSTALL_PROGRAM) screen $(DESTDIR)$(bindir)/$(SCREEN) -chown root $(DESTDIR)$(bindir)/$(SCREEN) && chmod 4755 $(DESTDIR)$(bindir)/$(SCREEN) # This doesn't work if $(bindir)/screen is a symlink -if [ -f $(DESTDIR)$(bindir)/screen ] && [ ! -f $(DESTDIR)$(bindir)/screen.old ]; then mv $(DESTDIR)$(bindir)/screen $(DESTDIR)$(bindir)/screen.old; fi rm -f $(DESTDIR)$(bindir)/screen (cd $(DESTDIR)$(bindir) && ln -sf $(SCREEN) screen) cp $(srcdir)/utf8encodings/?? $(DESTDIR)$(SCREENENCODINGS) uninstall: .version rm -f $(DESTDIR)$(bindir)/$(SCREEN) rm -f $(DESTDIR)$(bindir)/screen -mv $(DESTDIR)$(bindir)/screen.old $(DESTDIR)$(bindir)/screen rm -f $(DESTDIR)$(ETCSCREENRC) cd doc; $(MAKE) uninstall shadow: mkdir shadow; cd shadow; ln -s ../*.[ch] ../*.in ../*.sh ../configure ../doc ../terminfo ../etc . rm -f shadow/term.h shadow/tty.c shadow/comm.h shadow/osdef.h echo "install all Makefiles and config:" > shadow/Makefile echo " rm -f config.cache" >> shadow/Makefile echo " sh ./configure" >> shadow/Makefile term.h: term.c term.sh AWK=$(AWK) srcdir=$(srcdir) sh $(srcdir)/term.sh kmapdef.c: term.h tty.c: tty.sh sh $(srcdir)/tty.sh tty.c mostlyclean: rm -f $(OFILES) rlfe *.o clean celan: mostlyclean rm -f tty.c term.h comm.h osdef.h kmapdef.c core # Delete all files from the current directory that are created by # configuring or building the program. # building of term.h/comm.h requires awk. Keep it in the distribution distclean: mostlyclean rm -f config.status config.cache config.log config.h Makefile maintainer-clean: @echo "This command is not even intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." # Delete everything from the current directory that can be # reconstructed with this Makefile. realclean: .version mostlyclean rm -f $(SCREEN).tar $(SCREEN).tar.gz rm -f config.status Makefile doc/Makefile rm -f tty.c term.h comm.h osdef.h kmapdef.c rm -f config.h echo "install all Makefiles and config:" > Makefile echo " sh ./configure" >> Makefile tags TAGS: $(CFILES) -ctags *.sh $(CFILES) *.h -ctags -e *.sh $(CFILES) *.h dist: .version $(SCREEN).tar.gz # Perform self-tests (if any). check: config: rm -f config.cache sh ./configure ############################################################################### .version: @rev=`sed < $(srcdir)/patchlevel.h -n -e '/#define REV/s/#define REV *//p'`; \ vers=`sed < $(srcdir)/patchlevel.h -n -e '/#define VERS/s/#define VERS *//p'`; \ pat=`sed < $(srcdir)/patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL *//p'`; \ if [ "$${rev}.$${vers}.$${pat}" != "$(VERSION)" ]; then \ echo "This distribution is screen-$${rev}.$${vers}.$${pat}, but"; \ echo "the Makefile is from $(VERSION). Please update!"; exit 1; fi ############################################################################### mdepend: $(CFILES) term.h @rm -f DEPEND ; \ for i in ${CFILES} ; do \ echo "$$i" ; \ echo `echo "$$i" | sed -e 's/.c$$/.o/'`": $$i" `\ cc -E $$i |\ grep '^# .*"\./.*\.h"' |\ (sort -t'"' -u -k 2,2 2>/dev/null || sort -t'"' -u +1 -2) |\ sed -e 's/.*"\.\/\(.*\)".*/\1/'\ ` >> DEPEND ; \ done depend: depend.in ./config.status || ./configure depend.in: $(CFILES) term.h cp Makefile.in Makefile.in~ sed -e '/\#\#\# Dependencies/q' < Makefile.in > tmp_make for i in $(CFILES); do echo $$i; $(CPP_DEPEND) $$i >> tmp_make; done mv tmp_make Makefile.in Makefile makefile: config.status $(srcdir)/Makefile.in CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status config.status: $(srcdir)/configure $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.ac cd $(srcdir) && autoconf ############################################################################### ### Dependencies: rlfe.o: rlfe.c pty.o: pty.c pty.o: config.h os.h extern.h rlfe.o: config.h os.h extern.h readline-8.3/examples/rlfe/os.h000644 000436 000024 00000030110 14617445262 016576 0ustar00chetstaff000000 000000 /* Copyright (c) 1993-2002 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program 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. * * This program 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 this program (see the file COPYING); if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * **************************************************************** * $Id: os.h,v 1.10 1994/05/31 12:32:22 mlschroe Exp $ FAU */ #include #include #include /* In strict ANSI mode, HP-UX machines define __hpux but not hpux */ #if defined(__hpux) && !defined(hpux) # define hpux #endif #if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux) # include #endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */ #ifdef ISC # ifdef ENAMETOOLONG # undef ENAMETOOLONG # endif # ifdef ENOTEMPTY # undef ENOTEMPTY # endif # include # include #endif #ifdef sun # define getpgrp __getpgrp # define exit __exit #endif #ifdef POSIX # include # if defined(__STDC__) # include # endif /* __STDC__ */ #endif /* POSIX */ #ifdef sun # undef getpgrp # undef exit #endif /* sun */ #ifndef linux /* all done in */ extern int errno; #endif /* linux */ #ifndef HAVE_STRERROR /* No macros, please */ #undef strerror #endif #if !defined(SYSV) && !defined(linux) # ifdef NEWSOS # define strlen ___strlen___ # include # undef strlen # else /* NEWSOS */ # include # endif /* NEWSOS */ #else /* SYSV */ # if defined(SVR4) || defined(NEWSOS) # define strlen ___strlen___ # include # undef strlen # if !defined(NEWSOS) && !defined(__hpux) extern size_t strlen(const char *); # endif # else /* SVR4 */ # include # endif /* SVR4 */ #endif /* SYSV */ #ifdef USEVARARGS # if defined(__STDC__) # include # define VA_LIST(var) va_list var; # define VA_DOTS ... # define VA_DECL # define VA_START(ap, fmt) va_start(ap, fmt) # define VA_ARGS(ap) ap # define VA_END(ap) va_end(ap) # else # include # define VA_LIST(var) va_list var; # define VA_DOTS va_alist # define VA_DECL va_dcl # define VA_START(ap, fmt) va_start(ap) # define VA_ARGS(ap) ap # define VA_END(ap) va_end(ap) # endif #else # define VA_LIST(var) # define VA_DOTS p1, p2, p3, p4, p5, p6 # define VA_DECL unsigned long VA_DOTS; # define VA_START(ap, fmt) # define VA_ARGS(ap) VA_DOTS # define VA_END(ap) # undef vsnprintf # define vsnprintf xsnprintf #endif #if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX) # include #endif #include #ifdef M_UNIX /* SCO */ # include # include # define ftruncate(fd, s) chsize(fd, s) #endif #ifdef SYSV # define index strchr # define rindex strrchr # define bzero(poi,len) memset(poi,0,len) # define bcmp memcmp # define killpg(pgrp,sig) kill( -(pgrp), sig) #endif #ifndef HAVE_GETCWD # define getcwd(b,l) getwd(b) #endif #ifndef USEBCOPY # undef bcopy # ifdef HAVE_MEMMOVE # define bcopy(s,d,len) memmove(d,s,len) # else # ifdef USEMEMCPY # define bcopy(s,d,len) memcpy(d,s,len) # else # define NEED_OWN_BCOPY # define bcopy xbcopy # endif # endif #endif #ifdef hpux # define setreuid(ruid, euid) setresuid(ruid, euid, -1) # define setregid(rgid, egid) setresgid(rgid, egid, -1) #endif #if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) # define USE_SETEUID #endif #if !defined(HAVE__EXIT) && !defined(_exit) #define _exit(x) exit(x) #endif #ifndef HAVE_UTIMES # define utimes utime #endif #ifdef BUILTIN_TELNET # include # include #endif #if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME)) # undef USE_LOCALE #endif /***************************************************************** * terminal handling */ #if defined (POSIX) || defined (__FreeBSD__) # include # ifdef hpux # include # endif /* hpux */ # ifdef NCCS # define MAXCC NCCS # else # define MAXCC 256 # endif #else /* POSIX */ # ifdef TERMIO # include # ifdef NCC # define MAXCC NCC # else # define MAXCC 256 # endif # ifdef CYTERMIO # include # endif # else /* TERMIO */ # if defined (HAVE_SGTTY_H) # include # endif # endif /* TERMIO */ #endif /* POSIX */ #ifndef VDISABLE # ifdef _POSIX_VDISABLE # define VDISABLE _POSIX_VDISABLE # else # define VDISABLE 0377 # endif /* _POSIX_VDISABLE */ #endif /* !VDISABLE */ /* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD) * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE) * to hold the whole packet at first read(). * (Marc Boucher) * * matthew green: * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100 * * Joe Traister: On AIX4, programs like irc won't work if screen * uses TIOCPKT (select fails to return on pty read). */ #if defined(sgi) || defined(DGUX) || defined(_IBMR2) # undef TIOCPKT #endif /* linux ncurses is broken, we have to use our own tputs */ #if defined(linux) && defined(TERMINFO) # define tputs xtputs #endif /* Alexandre Oliva: SVR4 style ptys don't work with osf */ #ifdef __osf__ # undef HAVE_SVR4_PTYS #endif /***************************************************************** * utmp handling */ #ifdef GETUTENT typedef char *slot_t; #else typedef int slot_t; #endif #if defined(UTMPOK) || defined(BUGGYGETLOGIN) # if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux) # include # define UTMPFILE UTMPX_FILE # define utmp utmpx # define getutent getutxent # define getutid getutxid # define getutline getutxline # define pututline pututxline # define setutent setutxent # define endutent endutxent # define ut_time ut_xtime # else /* SVR4 */ # include # endif /* SVR4 */ # ifdef apollo /* * We don't have GETUTENT, so we dig into utmp ourselves. * But we save the permanent filedescriptor and * open utmp just when we need to. * This code supports an unsorted utmp. jw. */ # define UTNOKEEP # endif /* apollo */ # ifndef UTMPFILE # ifdef UTMP_FILE # define UTMPFILE UTMP_FILE # else # ifdef _PATH_UTMP # define UTMPFILE _PATH_UTMP # else # define UTMPFILE "/etc/utmp" # endif /* _PATH_UTMP */ # endif # endif #endif /* UTMPOK || BUGGYGETLOGIN */ #if !defined(UTMPOK) && defined(USRLIMIT) # undef USRLIMIT #endif #ifdef LOGOUTOK # ifndef LOGINDEFAULT # define LOGINDEFAULT 0 # endif #else # ifdef LOGINDEFAULT # undef LOGINDEFAULT # endif # define LOGINDEFAULT 1 #endif /***************************************************************** * file stuff */ #ifndef F_OK #define F_OK 0 #endif #ifndef X_OK #define X_OK 1 #endif #ifndef W_OK #define W_OK 2 #endif #ifndef R_OK #define R_OK 4 #endif #ifndef S_IFIFO #define S_IFIFO 0010000 #endif #ifndef S_IREAD #define S_IREAD 0000400 #endif #ifndef S_IWRITE #define S_IWRITE 0000200 #endif #ifndef S_IEXEC #define S_IEXEC 0000100 #endif #if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO) #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) #endif #if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK) #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) #endif #if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR) #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) #endif #if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR) #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif #if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK) #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) #endif /* * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK: * * O_NONBLOCK Same as O_NDELAY above. * * on the very same SunOS 4.1.3, I traced the open system call and found * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked, * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through. * * For this simple reason I now favour O_NDELAY. jw. 4.5.95 */ #if defined(sun) && !defined(SVR4) # undef O_NONBLOCK #endif #if !defined(O_NONBLOCK) && defined(O_NDELAY) # define O_NONBLOCK O_NDELAY #endif #if !defined(FNBLOCK) && defined(FNONBLOCK) # define FNBLOCK FNONBLOCK #endif #if !defined(FNBLOCK) && defined(FNDELAY) # define FNBLOCK FNDELAY #endif #if !defined(FNBLOCK) && defined(O_NONBLOCK) # define FNBLOCK O_NONBLOCK #endif #ifndef POSIX #undef mkfifo #define mkfifo(n,m) mknod(n,S_IFIFO|(m),0) #endif #if !defined(HAVE_LSTAT) && !defined(lstat) # define lstat stat #endif /***************************************************************** * signal handling */ #ifdef SIGVOID # define SIGRETURN # define sigret_t void #else # define SIGRETURN return 0; # define sigret_t int #endif /* Geeeee, reverse it? */ #if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT) # define SIGHASARG #endif #ifdef SIGHASARG # define SIGPROTOARG (int) # define SIGDEFARG (sigsig) int sigsig; # define SIGARG 0 #else # define SIGPROTOARG (void) # define SIGDEFARG () # define SIGARG #endif #ifndef SIGCHLD #define SIGCHLD SIGCLD #endif #if defined(hpux) # define signal xsignal #else # ifdef USESIGSET # define signal sigset # endif /* USESIGSET */ #endif /* used in screen.c and attacher.c */ #ifndef NSIG /* kbeal needs these w/o SYSV */ # define NSIG 32 #endif /* !NSIG */ /***************************************************************** * Wait stuff */ #if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX) # include #endif #ifndef WTERMSIG # ifndef BSDWAIT /* if wait is NOT a union: */ # define WTERMSIG(status) (status & 0177) # else # define WTERMSIG(status) status.w_T.w_Termsig # endif #endif #ifndef WSTOPSIG # ifndef BSDWAIT /* if wait is NOT a union: */ # define WSTOPSIG(status) ((status >> 8) & 0377) # else # define WSTOPSIG(status) status.w_S.w_Stopsig # endif #endif /* NET-2 uses WCOREDUMP */ #if defined(WCOREDUMP) && !defined(WIFCORESIG) # define WIFCORESIG(status) WCOREDUMP(status) #endif #ifndef WIFCORESIG # ifndef BSDWAIT /* if wait is NOT a union: */ # define WIFCORESIG(status) (status & 0200) # else # define WIFCORESIG(status) status.w_T.w_Coredump # endif #endif #ifndef WEXITSTATUS # ifndef BSDWAIT /* if wait is NOT a union: */ # define WEXITSTATUS(status) ((status >> 8) & 0377) # else # define WEXITSTATUS(status) status.w_T.w_Retcode # endif #endif /***************************************************************** * select stuff */ #if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_) || defined (__INTERIX) #include /* for timeval + FD... */ #endif /* * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93 * tschmidt@vax.micron.com */ #ifndef FD_SET # ifndef SUNOS3 typedef struct fd_set { int fds_bits[1]; } fd_set; # endif # define FD_ZERO(fd) ((fd)->fds_bits[0] = 0) # define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b)) # define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b)) # define FD_SETSIZE 32 #endif /***************************************************************** * user defineable stuff */ #ifndef TERMCAP_BUFSIZE # define TERMCAP_BUFSIZE 2048 #endif #ifndef MAXPATHLEN # define MAXPATHLEN 1024 #endif /* * you may try to vary this value. Use low values if your (VMS) system * tends to choke when pasting. Use high values if you want to test * how many characters your pty's can buffer. */ #define IOSIZE 4096 readline-8.3/examples/rlfe/extern.h000644 000436 000024 00000002610 10530140726 017451 0ustar00chetstaff000000 000000 /* Copyright (c) 1993-2002 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program 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. * * This program 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 this program (see the file COPYING); if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * **************************************************************** * $Id: extern.h,v 1.18 1994/05/31 12:31:57 mlschroe Exp $ FAU */ #if !defined(__GNUC__) || __GNUC__ < 2 #undef __attribute__ #define __attribute__(x) #endif #if !defined (__P) # if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) # define __P(protos) protos # else # define __P(protos) () # endif #endif /* pty.c */ extern int OpenPTY __P((char **)); extern void InitPTY __P((int)); readline-8.3/examples/rlfe/screen.h000644 000436 000024 00000000074 10142522024 017417 0ustar00chetstaff000000 000000 /* Dummy header to avoid modifying pty.c */ #include "os.h" readline-8.3/examples/autoconf/wi_LIB_READLINE000644 000436 000024 00000004326 10557745030 021172 0ustar00chetstaff000000 000000 dnl Borut Razem dnl dnl This macro checks for the presence of the readline library. dnl It works also in cross-compilation environment. dnl dnl To get it into the aclocal.m4 dnl file, do this: dnl aclocal -I . --verbose dnl dnl The --verbose will show all of the files that are searched dnl for .m4 macros. AC_DEFUN([wi_LIB_READLINE], [ dnl check for the readline.h header file AC_CHECK_HEADER(readline/readline.h) if test "$ac_cv_header_readline_readline_h" = yes; then dnl check the readline version cat > conftest.$ac_ext < #include wi_LIB_READLINE_VERSION RL_VERSION_MAJOR RL_VERSION_MINOR EOF wi_READLINE_VERSION=$($CPP $CPPFLAGS conftest.$ac_ext | sed -n -e "s/^wi_LIB_READLINE_VERSION *\([[0-9\]][[0-9\]]*\) *\([[0-9\]][[0-9\]]*\)$/\1.\2/p") rm -rf conftest* if test -n "$wi_READLINE_VERSION"; then wi_MAJOR=$(expr $wi_READLINE_VERSION : '\([[0-9]][[0-9]]*\)\.') wi_MINOR=$(expr $wi_READLINE_VERSION : '[[0-9]][[0-9]]*\.\([[0-9]][[0-9]]*$\)') if test $wi_MINOR -lt 10; then wi_MINOR=$(expr $wi_MINOR \* 10) fi wi_READLINE_VERSION=$(expr $wi_MAJOR \* 100 + $wi_MINOR) else wi_READLINE_VERSION=-1 fi dnl check for the readline library ac_save_LIBS="$LIBS" # Note: $LIBCURSES is permitted to be empty. for LIBREADLINE in "-lreadline.dll" "-lreadline" "-lreadline $LIBCURSES" "-lreadline -ltermcap" "-lreadline -lncurses" "-lreadline -lcurses" do AC_MSG_CHECKING([for GNU Readline library $LIBREADLINE]) LIBS="$ac_save_LIBS $LIBREADLINE" AC_TRY_LINK([ /* includes */ #include #include ],[ /* function-body */ int dummy = rl_completion_append_character; /* rl_completion_append_character appeared in version 2.1 */ readline(NULL); ],[ wi_cv_lib_readline=yes AC_MSG_RESULT(yes) ],[ wi_cv_lib_readline=no AC_MSG_RESULT(no) ]) if test "$wi_cv_lib_readline" = yes; then AC_SUBST(LIBREADLINE) AC_DEFINE_UNQUOTED(HAVE_LIBREADLINE, $wi_READLINE_VERSION, [Readline]) break fi done LIBS="$ac_save_LIBS" fi ]) readline-8.3/examples/autoconf/RL_LIB_READLINE_VERSION000644 000436 000024 00000005613 13534466726 022307 0ustar00chetstaff000000 000000 dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB dnl require: dnl AC_PROG_CC dnl BASH_CHECK_LIB_TERMCAP AC_DEFUN([RL_LIB_READLINE_VERSION], [ AC_REQUIRE([BASH_CHECK_LIB_TERMCAP]) AC_MSG_CHECKING([version of installed readline library]) # What a pain in the ass this is. # save cpp and ld options _save_CFLAGS="$CFLAGS" _save_LDFLAGS="$LDFLAGS" _save_LIBS="$LIBS" # Don't set ac_cv_rl_prefix if the caller has already assigned a value. This # allows the caller to do something like $_rl_prefix=$withval if the user # specifies --with-installed-readline=PREFIX as an argument to configure if test -z "$ac_cv_rl_prefix"; then test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix} fi eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib LIBS="$LIBS -lreadline ${TERMCAP_LIB}" CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}" LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}" AC_CACHE_VAL(ac_cv_rl_version, [AC_TRY_RUN([ #include #include #include extern int rl_gnu_readline_p; main() { FILE *fp; fp = fopen("conftest.rlv", "w"); if (fp == 0) exit(1); if (rl_gnu_readline_p != 1) fprintf(fp, "0.0\n"); else fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0"); fclose(fp); exit(0); } ], ac_cv_rl_version=`cat conftest.rlv`, ac_cv_rl_version='0.0', ac_cv_rl_version='4.2')]) CFLAGS="$_save_CFLAGS" LDFLAGS="$_save_LDFLAGS" LIBS="$_save_LIBS" RL_MAJOR=0 RL_MINOR=0 # ( case "$ac_cv_rl_version" in 2*|3*|4*|5*|6*|7*|8*|9*) RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'` RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'` ;; esac # ((( case $RL_MAJOR in [[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;; [[0-9]]) _RL_MAJOR=0$RL_MAJOR ;; *) _RL_MAJOR=00 ;; esac # ((( case $RL_MINOR in [[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;; [[0-9]]) _RL_MINOR=0$RL_MINOR ;; *) _RL_MINOR=00 ;; esac RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}" # Readline versions greater than 4.2 have these defines in readline.h if test $ac_cv_rl_version = '0.0' ; then AC_MSG_WARN([Could not test version of installed readline library.]) elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then # set these for use by the caller RL_PREFIX=$ac_cv_rl_prefix RL_LIBDIR=$ac_cv_rl_libdir RL_INCLUDEDIR=$ac_cv_rl_includedir AC_MSG_RESULT($ac_cv_rl_version) else AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library]) AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library]) AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library]) AC_SUBST(RL_VERSION) AC_SUBST(RL_MAJOR) AC_SUBST(RL_MINOR) # set these for use by the caller RL_PREFIX=$ac_cv_rl_prefix RL_LIBDIR=$ac_cv_rl_libdir RL_INCLUDEDIR=$ac_cv_rl_includedir AC_MSG_RESULT($ac_cv_rl_version) fi ]) readline-8.3/examples/autoconf/BASH_CHECK_LIB_TERMCAP000644 000436 000024 00000003044 14644234224 022070 0ustar00chetstaff000000 000000 AC_DEFUN([BASH_CHECK_LIB_TERMCAP], [ if test "X$bash_cv_termcap_lib" = "X"; then _bash_needmsg=yes else AC_MSG_CHECKING(which library has the termcap functions) _bash_needmsg= fi AC_CACHE_VAL(bash_cv_termcap_lib, [AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc, [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap, [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo, [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses, [AC_CHECK_LIB(ncursesw, tgetent, bash_cv_termcap_lib=libncursesw, [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses, bash_cv_termcap_lib=gnutermcap)])])])])])]) if test "X$_bash_needmsg" = "Xyes"; then AC_MSG_CHECKING(which library has the termcap functions) fi AC_MSG_RESULT(using $bash_cv_termcap_lib) if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then LDFLAGS="$LDFLAGS -L./lib/termcap" TERMCAP_LIB="./lib/termcap/libtermcap.a" TERMCAP_DEP="./lib/termcap/libtermcap.a" elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then TERMCAP_LIB=-ltermcap TERMCAP_DEP= elif test $bash_cv_termcap_lib = libtinfo; then TERMCAP_LIB=-ltinfo TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncursesw; then TERMCAP_LIB=-lncursesw TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncurses; then TERMCAP_LIB=-lncurses TERMCAP_DEP= elif test $bash_cv_termcap_lib = libcurses; then TERMCAP_LIB=-lcurses TERMCAP_DEP= elif test $bash_cv_termcap_lib = libc; then TERMCAP_LIB= TERMCAP_DEP= else TERMCAP_LIB=-lncurses TERMCAP_DEP= fi ]) readline-8.3/doc/rluserman.pdf000644 000436 000024 00001457067 14772523235 016536 0ustar00chetstaff000000 000000 %PDF-1.5 %ÐÔÅØ 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xÚmTM¢@½ó+z&ÎÁ±?tBL$ñ°ãd4›½*´.‰<øï·_•èÌf’W¯_wÕ«îrðãc;Šòê`GæUŠOÛV×&³£øç¾öƒ¤Ê®[vïÖæ6ïWÛ7ñÑTÙÖvb¯“uYt/N¼.³ó5·½êÿ¢¥=åS‚> stream xÚmTM¢@½ó+z&ÎÁ±?tBL0ñ°ãd4›½*´.‰<Ì¿ß~U¢Îf’W¯_u½ªîvðãc;ZäÕÁŽÌ«Ÿ¶­®MfGñÏ}í I•]/¶ìÞ­ÍmÞ¯¶o⣩²­íÄ0^'ë²è^œx]fçkn{ÕÿEK{*ʇuÄpg6;µÞ$4»¢;»µgZ8, ’ü²M[Tå›P¯RJG¤eWxm½ñ­ž÷ŽE™7·¢â žÒ"/²îÑ7»¸¦‘¼ýj;{Y—ÇÊ‹"1þt‹m×|‘£o¼irÛåI É‘c¶×º>[TÒ›ÏEnn#×ÛûþbÅø¹‘ûÒî«¶BS¬ØEVå¶­÷™möåÉz‘”s…«¹gËüŸµ)gŽÏR©ð133wÄ xAÄbêí;¬ÒaGL6K& 0+‡}&ö"?‘á°(Ò¦Òa/ ¡cì,•!£½¥‰î-fö3¤Ù*IÃx {aªùð”sIC%ÒðhSô¢¨7å£Å}­HÏ=ŤIYƒ¹(îƒêjŧ ÿZóéàü4{ÖØSOØá5˜‡áZ ä®ekxvKº·Ǭü÷…Ü@2aÂ> stream xÚmSÁnâ0½ç+¼$z Ø¨"¤€ÄaKU¢Õ^C<ÐHàDN8ð÷õÌŠV{Hôüæç=üúØS`¾Jñ m}u%ŒÒßE Y]^/`»w¦¶oâÃÕå:1L·ÙÖVÝ‹omy¾èUÿ­àTÙ ÖÃþŽv¹Êó‘DM^ug{¦…Ç‚° ÉpmUÛ7¡^¥”žX[“ÖôÚã{=1î+kܽ¨8 …@iaª²»¯è_^|Ó˜¼¿µ\¶öXq,ÆŸ>ØvîFŽ^‚ñÎp•=‰!9òÌþÚ4gÀêBË¥0pôùÞÞ‹ ˆñs#P~k@hZ+vQÖÚ¦(ÁöA,åRÄÑf€5ÿĦœq8>K¥Â_¸—žX NˆHæžÐÔ3$¤Çž˜{<Ý0Š*¢5cÕ~ÿP÷õʯÂùÝ5WÂ42^!ž0^#žrq‰xƘœE„3xÎü ñ ªz“)cÒgl1BÌîÒ°õ•?ŸXqû!òŠNA‡¨Wš»A*dý1ùÔ)iȧΰÅç“Оó â9ç’†NVf¤¡–kô¯VäaŠžUJü†ôì?%Íš5Ø»bÿTW£=ј«±®–¾Œ¿É5ëñ2éfè&p2pj³V^ócH£Mc†VYxLS7˜E=›þ1âj· ¾gÈÈ endstream endobj 6 0 obj << /Length 394 /Filter /FlateDecode >> stream xÚRÝKÃ0ï_‘ÇÖ˜ä’&yÝÜ"‚ÚéƒøÐm™\‡ÙüØï¥é¤ˆˆš»ëý>îA8>‚8N sÊ’Õ6ã]5<‘ÜÌ3Ñ÷)xþÙRÄžBüƒ¬@ÕÂÈŽo\eg3SÉY©­&Õ&zÒ¥`ÆZR­ÉC>¿ZÐŒÎo|½~iZŸ²Ëfêp¤ÕE6­²×oúˆWŽY.N6¢3ô…ôÁ“MvTµ&‚3LjªÒ•ÌHK4X&URž®›C³kQ · F)ÚìBTE†rÈ`JÊuØY„ ÌþvÀ„=¡î¨…܇ýP•Enýiƒ§dN‹Ô~îW~K¥Í—´À· $¹TI 7+UÊ(U€v œÂ§UF&–ɳ?ô®·þHÊG)ŸÔû~Û÷Ô¡±=ù+"µ=(æÝ'Þ)à‘ê‹¶I)ŽsˆA7>NGq`’ø84uO4‹Ê»Øù9T‚ï ow›Žç#¾êà‡¨·v]wÿê·ë 8îXÀð:æœ®Ãæê´Ø endstream endobj 14 0 obj << /Length 757 /Filter /FlateDecode >> stream xÚ}TKOÜ0¾ï¯ˆzr$âG6‰z*Pª*ØöRzŽ—XÍ9Y誾3/»PZå0Ï{¾ 2øxTeQ!eZ©2Òý"óZws}±àÁNIô¿&I.D”D;Y-ŽÏó<âYZeVkLÇ«,•å2Z5Ñw¶jí'"/X_±(Ù¦îHn̤½¡d&ØÌ­!æâóWb®MÝtvê+{çjs¶%ù6˳ÇX̸Ɏ)ËTW&3ÒœmzL²9R‹L(ˆÀƒuMÚÎçØÆ?VŸ ë„˔眚yj­Æ0mœ(™±Ú6qv êëW’3=“f3è-½Œk¢› ³5·®µ µ§‰"4ÆcæðòàÆ{W÷!Ý«:à¥GÛìâ¼(žj×châDJÉh¢Rª—U¤Ï~Ë”+ò;Ðbëì}ëM½M®RQÈ-ªõÇçKuˆ†D¦™àØÝf<'Ó—Àá*ÍÕ’{+^•åoØONõžÇ¥dÎ’nÆõŒ¥<áækglÆÍÐÔ3@ሔ—ƒ¦¦¹L!&µ&C-_b†ÞN=2…q6 )摨Átˆ•ã®f€ò·…&0çãÑßs]oCœv—¢¡'½é mÔЂq;[óa]Q”W¢Ø](èr€y(šJg¯sù)ÑÛ•Õf˜ 6SVìúg»›‚ð<•!Ÿ#JǼ¥×®žMÐ?ÒH½ç•?lî:;µ8SUepDU<Ü(÷ËFõÁ²KZ6j}sÏË~'ù²bOvn)Ä0’Ù¥¯ò1Îsæ6씬nŒFï Ï¥wúûl¨˜‘f–œÒ¡Åá'"yÁVh`~ÍEŠŒÑÁÖ€ô¤ö·úsï\çåÞ9ÅíØry†˜—pÅHý€éh_$ ˜<t·i`°oLOx ®~¢ÎIaç΄ßÃ-—Êãm÷8Bé_8B·€£wþâW‹?¯­u endstream endobj 62 0 obj << /Length 2608 /Filter /FlateDecode >> stream xÚíœ]sÛ¸†ïó+t)]%¾H wv&Ù¶»Ét6N;N/¸ms*QJNâ_Äe>YÛuÖÖì…å,Þï#ààðxV¨ÿðL³ŠR$™˜-7o ýi9ßüúÓlâNTàIyvþæOï9ŸáÉBâÙùÅŒcdå†;_Íþ=oÿ9ÿÛ›wçnNPpˆ¼£X•3\!‚9Õ¿© aÊFµó…dóú·u³8¡Ÿo/Æ×·ÛnAñ|ߌ/»áß4Åe%†RߎT02Ž„'“áÝlên5ŽóKÛ™‘ß­Ú}Û]Žá‚„#aIÀL¨Gú³©¬Æ—rò§~ø¨ƒ /N15LMR9Ì‹$÷¸e£O‚p瘟œÃAÍdJóqÆ¡Ò&úŽôO\0…›•„£’b0œ.Šbþ×nAÄ|ßo'êuu³Ü· ›Jé|¿_ÿ”Mý/éD¦¤ˆ0ü;ítSŸIáKl4ÔÌý},1c¨z8h’%¨¬Š¼GÒ1„ âµ ÃЯM½ZH¨%Jý Ïûž×ËáݾUoY1tC„”¯G[¾ Æ*(r><‡ÜÄÿ(r0Y\Vc‰„3.%¢œ8äÜÂ5…î¬îíµÛ5#m½ÞEyã¼z­¼%€± &Ï3qÄ€ÊÀä%0¢D¤€‰¯R¶#_¤š7Ìø7&÷‰££W;í#æ8ψS 3P|x„Е80Y BVÒP ?sìA Q~n×ë!§qÞ»UÝ©Ý*@)ÕËÀÓ/f^¡|øð¡Y4ÊLVó‘•t|p‰¤§ƒEé8í/oìòÇAÔ°:©“ðú¢çJ α㌓ÔÜdÄ5¬D÷ØpƒÍ§¦î—&Wn1¹ØöcJâvýqkWW&cùK»ÛoûÛ]D¥åü‡KURÆŽSuÖEç¬ f;î-HS››Ó³®~Í*ͰöÒħÝνo×jŸh¢ë‚zOÙkØ&ž¯Pc1žA¹óá9ðBX”<˜¬F/+éVR f ˆŠ½ÄI'¤OÁ·6‹È§Ûq“ª¿Å<*o-_ß;…Œ™j(2><‡Lè_˜¬F&+é)*Dd€Œ=ë¼ÝvC©nÛÕë)5CŠÛíöýÍ2‘ΔÂ’¾äeëÐ*Ñðåí\Þcމ> ÂcL :‡¦«¡ÈjZ(˜d*#­<vûTo®×ÉU$º‡©E¨x)Çݧ,A–5HVž!kê2‘ÔÈÊkÚìˆ õ™,-YöÄtÖv+sõI‘îV,_L©0ª^Ó%ƒfZ¡|øð¯D”˜®æ#«éVµyæùpÌôô~!è|<¹:\ꪫÔÞJŽ¥Ú)0fž¡Àøð0óâÀÀt50YM g¨”ÜCÀÔ]{}³®÷îœ}9HS˜|Ž8å¡ùêP}xÎÃÉ|ʨ‡0]íaVÓyȰú‰2ï!½ß÷Wuwéýþªù¶Ü "T¾ Å‚™B( ><ÇBè ‰^¬êj²šŽ"• 6E˜ÙOuc‰zó¯ÁøºûojñWÇæ’Ò×±ø?p51%ȇç Ý$Ñ‹6@]MPVÓ„9"Œz‚\}õZ7¨4ËöâÖ‘ôñfÓôíZªjìBüÑ϶)ÌÌAðá9B;H´ ÔÕd5EØ#¥( ¿4{¿éOçƒë·‘Ȇ£WšíMŠ Áø}•IQQ€ZÉE®•ìpБŠhU¨«©ÈjZ*¨ê PQÙ­¥¹ýMû¾­û•M—ý6¾¨Ñˆ”ÇŠÆïÄɺÄ)Ïà4±–DK@ݧ¼¦Ã©â¨’Øã$ì>³ÝØ‘v·lÖëºk¶7;@5C”¨ü‹e4ÞÌÔxž3>4!aÆè“ <Ö0è81"ÕÔ¶]ð‡Ú‰Ÿ?.ƦBâ›IÏê=Fœ5WõÐø¥UÉcäw/•8J]!µ ǠˀÏ­ ¢ÅN ®^ ²š=•çJ·øøRçÍn¿Ýg–›N߃±K]‘“¥8æ¯OpØú͇ç@›˜­Èu5hYM›Û¡^1u %I&gæUsŽPÄèñÞŒïN^¬ @š‚ð Mgi£ ¨;Д×t4Uê\S4Ù…ëŸÃbÕ7„-ðür̘kS—k¾šæ‚…`vA‹÷% Ù {õ}IÖ_3×Ph|xšÐ@½ÔÕÐd5í^GJŠ8¶GúDå?tù¿o‡ÞÄn§Îåå±ÿäIP3AQóá9ÔBÛ¨Át5jYM‡š:ÐÒmüíÐîvŸ®mºe͸Và‹Î÷S„˜‰…âÃs„„nÑè ¨« ÉjºŒ·Î{B\>ô±Þ¸ë 5pÃ"ªŽäïÁÈÌ>#žÃ(´4LWc”Õt†ŠÒSDÜëf¹?éçævS_Ç’/¨¥áÿ‚Ð8óP‚\t ÀÌ? QONÐÑ3~æñ¡A÷¤ƒGQÝ…¤|@÷Ò1ÊÂeŒÒåÃsx…nÓh} ¨«ËjZ°T[³©Ðén7>ÝcÙ]saæcNmõ¦1ÝZã³_Ô2fèÜ¥zê*þ÷ $¬´3´2ÏX9™V=su+óšÎJÁPYo¥½Nuº^ë~Ù¯ÎÆÏÝj›êŸ"ê°^7šï®ÝØé‡räÃs…ž²èÙ¨«9Êj:Ž*uxá•ç¨t§£U»»^׺cG¨*äñ*ÇS)¤È3†AÉóá9òB X´¨«ÉËj:ò¸@4Ì–m»Îó ©°/Û\¨/ñ?náÅ3Å—±Ê—ÏñzÍ¢í`@]ÍWVÓñÅ8Â<àËöï¼½ªûz¹oz{ŸÛõÍ>u%W¸‡fÏÖ(P><Thn(˜®*«é€¢÷@IÔ¸8õ›ÖÝKû¡îêKÿРèmK ùÊïýOc&JŒÏºÇ¢d@]MLVÓƒœeÅ óyß®Ûý˜[«Ì*U/+q|ZÄwohÆ(M>> stream xÚí˜ËrÓ0†÷y /í…UÝ/ìJéaX@( †…IÜà!±3©;ôñ‘,ÅvS[Ö”2t(“Eù÷ùås>ëAýA‘‚‘ (*£Åf›ÞÝ*²ç3ät©¦=åëùì茱A  BÑü:bˆETo¾Œ¾ÄE‘|¿ÎÛH ã@K£œðDH)e$t$Âzb@¢IŠ „ññºÎweVçIJ‰/ËËXw]g‹¦‹Æ§wÙf»ÎÍ8Î8¹^pÀ‘ÐÃi¿Ò1¹°_üÞ¯ðÎÇÞ÷tõ Dó¸ûúk²W§=ù@]ƒ6écè7ƒ¡¾ Ny"H5)4âŠk&Z˜áCž-×Eé8øX¬ÊlmÛYi®¬  (¥IÀß/öŸ6Ð>ïõä€î“‘!€} @~Ï I€ |wÜÞÔÕÆ"sR™)CO#7ƒÐ`}—â/š§sãÊ•#”«Nîãª_cƹ óm¸òzî). `’µ\äȺ¨Ì¢ôÓ.G­¢LP¼²]ŸIãj÷c6*ì¥Â6Ëu(4ÜM¿€#Єù6Ðx=[h˜”ô ÁûéÈqR•vJ:K$‰oË…ééÍŒ|áKÙ/.Í¡¼tr/ýÚ11ÈK˜oË׳å…R€%íx!#¼\^²]‘}[çü½õÁèÿÖÇ7͸l‡bÓÉ}ØôKÈä 6a¾ 6^Ï‚"¤Ã¦=?¹ýò÷jW»½¾˜ô•›v]è–Åjâ4%dâßj —ÏP0:¹Œ~‘8#Ì·ãÀSp½DB96žú¼Ï!º=Òñv« ¬+^.‹;ÝÌ ¡añùûOº#½)ïrsÄÂ0~S™ïxq»ÉËD7êÌM>Zù®Xäå£AÜw&”5ã:Ääði©XOOûQN<±S§=ùÀSmF ;8z»hmÅÎ:ߌ À²¦'U¹È·µÍôe¹Ìï“…àïœOŸÓÛ÷|ð.R@!oó:õ.ZuÚ“r´I»úg0ÊB½zÂÛ0¢í±r`6ï›ÛòYP²riWæ’[ݧÂÐÄÄÏú_®±Òºt„–¶“ûJÛϱģ¥õyÿá„`Ø endstream endobj 10 0 obj << /Type /ObjStm /N 100 /First 831 /Length 1985 /Filter /FlateDecode >> stream xÚµYKs7 ¾ï¯à±½PAð1“éLuÛéc:qMÓT{ëhªh3’ÜIþ}?.Ö±bïÚn½:-E‚߀ Rbœ ¦8Cl(Š!o¼$ɰ÷è1Éc,™Ì˦|Š!'ÑÔŠ©ñ„Y)›*Ï_ …RŒ˜Ox€@`à'@„`šyòÄ,N nª#hB¡|ÕD¬ôMÈ/~Ývg§íÞ¼./NÌâUûqoÞ^A*IᦖÐç1jèVW_£\ô7•‹î¿(·xºÙtÀyS³XÕƒÔƒ¤’zÎ;ý~¼~X?A?j†W¯(^Q¼¢°¢°¢°¢°¢°¢°¢°¢°¢°¢°¢E Š%(JP” (AQ‚¢E Š"Š"Š"Š"Š"Š"Š"Š"Šrc5zï5‹ÓË?÷ýïŸV›¿›Å³n{ÞnÕñîm]œ3,jÞ„häb 'ˆ³U£xëD ÷´S³ø®{ՙŠó}]ã”A)<[ážôl=•¼7°yg‘æI'þ¬ÇL¥sÑŸGéüLt9Zï”Mé¸tÉÙ¢¾”ì,޶Q6ž‰M’­GIOS×£Òáý@'Á²—£Ò!ô-JÈâ ¥ 3ÑQ¶õˆìé|¶Î‡£Ð!Ÿ8µ(§¬/Yé(Øœ&vùL|¡ o!ß÷|ŽlšÊ*2¿å 9[I~œ/ÏÄ6åKbƒ§ãòá4ðEo}šà+3ñἦ–Š¥qwzš‰Î#o&͛Ŗ8~*x?1Lø¼·(dÇùx>Æ1T)Ÿ+6Ɖsa¦íÇ8‡²š‡ªÛ  ~¦ÝÇØ©¨yœÙr<2v@ÔÍÀ8q÷§K¥ 6àêžØ¯‹2F±&Sœ3mx¦h åo#*´© 1óØtƒKÉÙ0µ!fÊ/>'˜¤êK²œÇùØÍė걫ês€k'J¥™š¨&h°/‘u9—¡Éq°u®óã|i&>$i—µZòµP‹r\>O°iàc²‘ãqù\¶)k½äQª…)âÆZŸQB׃a¦žé3kú$Ôj90a¦—æµZâ#óáHÊYó5¡Oòx=f:q ÇQ ÅZ˜X¾8¶@rƒy¨Õ&nía¦ÝŽ 2ç*ÃñÃ(Ì´ÙîbYs5ê´2ñF¾8j_˜7Qߣ¿½þ½þÝPÿVØ\®×oï|Dœ†îÝ~‹€Þ]í˜ûÄn»tùþÃzÂö‰±[ÏV›óåŸ*yhÝ—ñr¯ÔT‚è×òD—ñ{3?Œ ?é*&¡–›Õ‡Ëõr?Ä׫{Âh¢¦¾Iüçï–›‹+ì*øÄaŸ)èÁ¦{ªéîõró÷¨ý¿`GmWg#;ïôC{¶úëÓ€3*÷ÅÐ…P¹N‹?µû+Ç®u=ïf½î.¿nþÖà%h endstream endobj 329 0 obj << /Length 3225 /Filter /FlateDecode >> stream xÚ­ËŽã6ò>_á[l ­_z`Oɤ³Èf³˜é=,’aÛr·Ò¶ä•äéôß§ŠU¤-'@àƒHªT¬w‹«~b•Ç«T©(×Ùjwz»ÕæaEƒÿz#n €Ûäwwoþñƒ1+Gyœ‹ÕÝaeDm¾»ýêçµØüz÷ï7·w‘‘ò+wDÈW[¦ÉJ¤‘Fã–@T’éH(íwÛšD®ßÖ§ÍV¬Ov#ÖÕ~³U©Y¿+«‚F·û²+«$lÊðûÅ1£»{,[øF©õn#Óõ£=wEC û¢Ý5åýf+³uÁ@ÝcAƒ{Û–;êõ¡°Ý¥ñõ¡‡tÛ'b¸½”Y”¥9ᶨ.sDJÅBz ]}:YÇ$à=“°oÁLºå²Ú™@ûÁp¢ u¤t"çVe€«,¦,ΈúcµQbÝ55àëýeוuEÒìê¿&_‘GBf^¾ð‰ÑùúP5ÒøìhÆ¥³mìCcÏ-Í/-ÃÞžìŽ×ÚÕòrä7H >GºáW~§ªî,ÏH÷ão›â Ú*H`È‚£YE¢ù ß/-ƒ†-šš* 4×àÓ(ùö<ª<ñÿѱÒåP&½&èüíöiVç"2"õ@Î*eSXT|ž­-¯üö¶&Ò›ú¸ýé~éÌÞ¾2Z$‹èËÐÄ30ñÆîÈÈáÝ« ð‚QëÄ“AtOBì<¡Pfä:C@*#©‚"ÓÌ]G²äWu÷HrV©ŠR!XÐômPpYq,¬3Çm§l{°þž(ÊÒÃÄ1 ¯–÷œÎˆRdi”ôd~ûîn!˜è`Èu3‹²® ÿpv!s•Ê"“gw9È„„„ò|qBV]Ûfß:®³õ‡j €$(ˆzy26Õç¼UÙ¹„á ²šéõUYÅ 8‚¹&«8JÍ@íñ¥½Øãñ…I¨éYQÎaÜ–û‚F.ÛKbñÕò/Ñzo(N¼É|Ñ9„Œò4ý+T:- ·=‡n@Yg_«Ipf'뇢*欳-:ZwìÂóV7O4³ü•%h6aXð~š)È[­’õ,È ‚sÒA¤ Œ«<Še~q#õ$0´´”l„Hܱ­i9DWœìêê—Xè(ÑöcnÚúÄ¢’¢™$«š¹åÄñ·DLEsC«í…jFšYÎC–²¨g²ö–óÙ ù)(‡ÎrŽƒs(äìnÇ¥ ¥D=\írvC_Ó™ ¶`ÏxPn%vKšdX¢—'üÒâ͹OD-­Ž©£5r`ñF1¸ÏããŠ_Ü—Tzm'}EŒesÞÉr4O (B®ÿ·É4e+XÞYW¨ÄëËÆåQátž-zšÐ1$‚§•½?[LÛ'`}.)Á&$“ÏÖÓ”øoT3%¸ù¨LEÈÑlB0©ù Õ) J~îk_¬‘)ª8’Y>6ÅN)ht1|æ|ÊWG±bÅáþEŒõ%wK eçœÔPX†…Apgð~ƯñLq*+{¤/¯V‹¢¹mçßïHTI4];WgÓ¸$í,mOóÞSŸ>„v~Eï8iÂZ[üÿRT;FÃÉ࡬*r'Xs¦8{ †Å!kööÓÛ…Ø“ˆ#‡ÎQ½'JÊŠ©õàÞ8ï¦õl’è±ñ ˜ÌÁ+)•…— .:eÈÜ@¡Ð¹b¡œªØu4»gûG(:jžAÆýÙvRÆ‚Æ2óÚh²‰ÑèxPG Ý´Ýœ¬Å"Èú†\É•ÒL|èò)b†¨ÌD"–_,­M”Ê@ ÒÕ£s,æPf˜ën¡ã௠ëVˆ£ˆîÏhOU2~®Æ)³×£J>…J7O'•<Qª̲j ¤Vs‚½N8oËØë¸ûq[ö9Þ² ³µÃ“¥&ª³!Õ3Ä ˆÛƒZ©=¼,ôH€¨L‡’z)YA”Ȳ+G&•è_õF I¯ãŒL3ïi ÍÈ'e:8“àdxîl ÒÒ#xÞÞ}%5Øð΢<÷lÇ'Jû’íîÛï*q‡, Ū’mGÍVR!ųÚFÐðÔÇÏþÎa¸Oì²4r:«¸ü\2F›Á9udùYºà#´0wþuãÒ†1bBÈVxÔ‰•¾“=ôv>“§HÇ©©‰ùÆ,c*cDIðPA‡p˜`Bú%Ÿk`õU®‘P”%PùJ¥!-¨+|yèí|†¯)ÒAåº5BÐѨéK6eÌâ±tzjij绿Øt¼âu`‚q²pA}ù\b°_ÕÇÓßwù\:+škìètç «‡¦ëiŽ»ígHgÈw]nqûDGm–Ž:B©asgÁסÒFX}÷+Aé.i¯4¦s<Їü±è.ÍBïýjp¸­n6@×2•£æ1–$õiÜ™äÛ jßÏÝ +¼9O¦È/Õzà]p¶çëä±p±0¹)þpèèš%…”ÞP­cËkႆôh°uݶ`2¸ÌJÃyÞ7ƒ D1ìNÓÐбö;ùÐÀ}k“†°ÜÕ•k•¾€gUwåŽÑv¶ã·l©“V—ï8×å {+‘î;G0ðt¾øJÖ§²õ§‰ãÑÝ(a\¸ó ã~~ߨæ…&eŸ úBï,=¨õ„hÿnÐÒì@–7e Ê36üHQ2éï":ê|ÁÈï¥Û6¥mŽ¢Fpxå¢0¼*«º:±£ÿ HOy¸“IÖ¿_ZÞ‰úCÈ&ìl öØ]•)÷Õ Kmc«q€é÷¹ÛãÕ¡cêùè{¦x;†>±þ½nÊ.4Xs¾É<\îTÍ÷&ÿm‰WzÝ2@ÿ˜xÅ BI;Õ}»uBÌîÒ´óJ¤?vxÕÁà|¤Û+·†½ÆŽ&UQ8{€á®nʹ7tµgýßoöí:þšªÔh[4Ýd6”M.5ý«;V¶&u}ªêfŽxªldª†=E÷¯"P ¶Ùú®2¾ñ >Vàåï fŒ¤-Og×YLùï ³UÔý±È¿¦VÃæ›Ôx‹¡ÂfîžÎq0>8‚$$Çi7ᦠjê4ŽäÈŒ /è$™„oü`e‘Ï2À_,‰ÿ‰¦!úÝðF ܶl&»sˆƒ'^{éÊ hjŠÈBGêÄÁÛ×äs¯Žÿè3“ í~+„ˆtž½¾g.«Ñ»4Ƙü,ÿþW=Éb endstream endobj 338 0 obj << /Length 2131 /Filter /FlateDecode >> stream xÚ­YëÛFÿž¿Âß*µªÑÛùvÙ¤½šCÑnQ®ÅuÖš] «‡!É·Ýÿ¾|<’å] ÄÔ<8$‡ü‘œU«þ©Õ6XeQäoã|µ«ß4Ú=¬˜øù‡7JÖm`áÆYùîöÍwß'ÉJþ6تÕí½Ëê¶Xý×»ÙëÃ`ºõ&Š"O½]oâ8ñnÚºÖMÁƒ?–aêCQeó°Þ„Qš+/\ÿqû¯7nÇã“0¼RN\y&h–®Tä ©𿱝¢˜U~è«õ&ICïçõFyFK–ÅÞ;Ý•xúÞ4ëHyC©«%œ[L¤2?"æû±Ièµ]AfH"ohy…™ÇÖÏÝ:̽½îô†z^Z68h7 {ÃÃ(Ù·Hf^_Ö‡êYãâç0ód%l©}P+½[Þâ²l\VðºÉá¼LpI–èHQÒ,òU¢X³§½!«$©,õvÇ®o;¦ŸðÝ£œ©òø¾Aàa¿V(òš6×- ôüÏô¼±mx#i}Ð;{v;cÓ•{²ê­"ïã=?ã`{þe"œY $^ÒubÔ(Š~à»;Ý0qìÍdZ\ßtÚNÌM‰GÀÔh¨wh·Gávà_‰–Ø+Le‰ÖPæìNçù¤–Š!$bòÐŒ5û¥­ÍPÖdä(w•ʽZ“yäcÙb0£ù‡äžØhkåν¦F¢ÜÉFQ®¸ëèâ<®Ñ10.ÊjA¤½>ù…0ÊQsÔr3ªé\aoxW§‘¯‚ã;&§¡~ƒì¹ V£ì ”îPy¨\8‚! rXÄ7ZˆHŒièbDBF’›»%$ €‘Ì."ƒÜȰ 1¶"ެÌý ‚ã­Â4÷Ãd+†’söF\y×vÙ KIŸ1ý÷`º'Ñ]AAËžÑg!2j äxò¨œÈAáLŽÍóO%@É‚q£mäÇ`ÉѸ÷KÆ…Pùx›h›øé6âøÄq~cƒ$™‹ €…4óJ”äˆÖq‚%uY•Ðí½Åú±žFS¶OeU17„; ÊF–1¹b’-$ ¹r÷x6 ,DëFB©ØzIâ¸PìqÒƒÁ?Ç~O¨£-r”PúFv·¼®—àÑ®¥hkž¼·ldzÄp4Ä!–¸1Ÿ‚=³<˦7Ý` Ñj>ð©´¹œ§à^bž˜ã‡ER¤Y¤î8h÷%Míe [æ[<ø0C^LY’ËæpÀ0{»„ E¨ü8{€i Ÿ¦¸‹ÙZîC„hÌ¥´;?{C|7ˆïùöE”zY°“EÜ+dHÒWdxÿáÇ i(W¹•®f\h”ÆvÍ;½{do[bè ì&žýþ¼ªy±NS&5×ây*¹ÞþÅkö¿VÈc•~Áµ?¹ë¸ü$Ô’?uRðN?)ª¸ çm®ù>*¾.™ÓMLŒ8v`zøB#þïzšr›:ÐÍæ/>ÿfs|Õ‡x˯Mz¥6ýQé~`Šqîá¿wÜ€bƒ¥ËÖyÄ9'µuÇ‘!@Ÿòªs<®õh`Z»§’ŽÓÔ³ M}ÚpÛñ¦nq§÷FJɦ`¿H¶Ø ѯS–¥èÕ`6x8vz(ۆꋄd^ŠYlÃ䪠M?NÇ¥œtŸùÌÚ©Ê@ I üÑ›qi²=µ/@‹)ƒ™§ramýy]Š,B»- lìÃÇ~0¶–H…L8v!ÁEK$PEj ô‹8˜e 6¾¬' 'B”Ÿ*›¨HåQv &aÍCØpõ´…×pY•i:w©»–ZàTÅë…°îà?Ü g7sd˜ÃËBÁnÑ93ô2°L_f6K´ Áé2uzž /=Ï@fŒdFøÏÔò<ÃÏ5òÒôâC<ñóHAÍ.<Ͷ0>è»JÈÂ^l¿ëÊ;î…{YeÙÔ-¡PwºÇ*Iñš~èÚÇñmƒviY|*€3nè*¾3®ïp¾&eç0Eh•åcÍ´2t ¡í °…U9Fò¾'XìxÚÁøœ9UæMyzÐQ\ZRgs`{û‚»lÃM ä^è‹ $NåfYiDÔj”TV¨^+_ ûriçàÆ…Ònîö |RDàÏé"/rQ×Ä rcZ!éÒç`f>´>¯`Õ¼»…¦%óþÉïuJÙÎü·­…rn¾¤YS¶Wç¼Cßvk§p?eAðí8ÝÐÒâ©SZ;«T°õUΪpýùEðêôƒî.ÁÎey–ªó¤1öåî‹dùôUÚ-'Ë]!XoßqÏHÕ(]x?ûµ½™éI]ž!&o•åC9ô׫ø-Ø‹z^áÕkÜTFw³Br€1MœæpVÃNõßI³;­¼c©¼ïÚƒÔƒqè§É4Pþ-¨ax{2ÊÓ’ŽPµ%yô „œ*púº‡¤[q¥ŒMŒšŸ¿‹‡9úSY-–" ,§#Ì}ú*ò,‹ˆtºu°\ä}x½ØYUÉãToœ—ÐhÚRœ²\nÿV#™gLØ@É*Èè,æx> stream xÚÛnÛÈõ=_á7S€Ér.¼mŸR7ÛmwƒY‹E·@h‰–ØH¤@Rqü÷=·!‡4•5XÃ3Ã3ç~cÔM ÿÔMßdÆD…Ío¶§w1A»ý />ýã’s! ½“{x÷—“äFÅQêæáÉGõ°»ùOp(ÏCÕmBcL ~Ø„Ö&Á}{:•ÍŽ¿ÔMÅ«»z¨›ý&Ô&ÍU`6ÿ}ø×»ãõ‰Öo¤O¾"4Ko”‰b TMs)c™PéÈlÂ$ÕÁ§M¨‚ªÜ™²Ì?×Ç#Qf²‘úÉö Ÿ}Ê¢ÔFêÞã“3A™4ÒpẇêÛ|*8UeÓãRCË ]u¬†J`‡ŠÓO]{Zl"åw@m9æ°õåFgÁ×Î9]üz‰°güC«†>µ -I‘¸¼ôý¥¿”Çã rx O!ˆY%Š9{dT+²R6ÊLæ$ðB÷6_®ˆËªÈwö8‰»*¬›¾êÐbàY!a‰°’åñ}hƒ,€ÔI)!)E`‘FÆÏ÷—á–wÈ8qñù\öCuË/–¼xjy•]µ­9ïü¯ìömÃ{(8K’F*ÍæbùüLã–í~t…Ï/¨ÂmD,áÛ ¥Â¢L“(ŸúçuƒÒo»ú<Ôx5îÎp§äçíäpš TÒ;$åÀgë!DZË@´;|ÛÀên¼Un!•µ¹¢è#pŸ•Üuéªå=î5’ÍÈž'Ae‚}E¯XÇ©«Çi8C ãS-o”ü³«ÿˆ•!Ò; NM¸ên%( n r9UlI>Ë­\J†½Ö†û D'É$|áEÉ?(U^‰6îPP±˜#€Å£aU÷üËšúŠ|Vh‰%FéŠGi›DzŒ)xaØ] ?YdâѡРT¼o𪾉֗R€*…hÑñFûäØÿÛ^†š d}ê"‹l¾0v2(¥'–(ú ¤D±S^°B`¯U;ÞÅãv fq¨:4G á¬uo±}Á3(À&uà[üTËagF‚mö†˜_Á‡™T”Tj‚‡ó £ŸpdÓq¶]âoÓ"ŸdTï™åºEkµÛ¿4•ðdF{ óæ[˜‹"ù R†•üsu{é!23ry¹oǰ‰G£è&PWËÇãœGQ&†Qr@FÆ.pm~ç¡9{¨e'ºãÑ¿çBˆåøJ.ÉÔ² q£'nQé‚‹÷5ü©rxˆ/?|ë^"lm]2'è“ _Æ„¯ƒ""v¢TûN4E¯<ŠåöûðËš¿%P8oû™ÍÄ=S\ãl>ÛÜ^ºÕ(ðÞ̪mûÚ%#Šò¸¯\žqÌ{r¾âèfþ„Ááîm ê¼pµ ¬†³€kG8Á[·/›D%.(Îäù´ƒr˜²-¨Vi;Ф®dQË›b¢ƒÔ5¤(RçòoöôF6£bÅæ¯K®爉¸Æým“[|äóœÛK³+»ºê—öî°a ’½Þmµ½€ ¡8Ïòjª¹¾ ZEZqýcø´¦+(QU®¦à¿¦x üÅܶ?†ÿðË­;Íœ)Ê„¨Ì GK&ËÅx×.ÎôCÙ ¼$q/ÞŸLž `mN&€‹ZÞ\˜@Î& o¢ 9d&#RÖ]›‘°Xì vš‹­ ¸Ì|så91‡ØÅNßÈæ0!Í÷«3‰9Äß3‡'Ãǫ栿oëpf îÃç7¸‚Cî|'·SüB`»ØtŒŸžƒ%ög¨Ì@¬ ÔØ‡ZN¸_)ý<+!¬BÖÜ ¦,µ“»\±ïÐô³½˜Ö¶¼ôÕ"b;åû™ræüc‰*uehu”&‹HˉÌB:Fæð÷вÓ[ë²Ìrh6’eWµÆ”Î#“Žj'Ú -E4\M œh›(:åŽK•+üŽ!OZ8Ú“^Vˆ¥ßm{–Þr†åÔöC(†V/SsËú¬ãK8Õ…ßMœÆÕc/,í±[VfZ;Ž“ˆrXIÁÕzîµ”{3—{£k~è—/æ7¿c¸àbÕgÅÄwú™˜u Bº¶áu!ÆÌgKæÍBBå²ñb~ß^#ü)‡ŸÚ¡h¼R8§§Š¼üºÆ , Cs¡¤G†³^Ÿ»^ÀMõ,¸Ú3Ɔ\³ ©¶0÷”°h¼»kÝí;`EIçç 4tµôñ‹`ºõ‡Xu¿&™4ŽÒtœp\Q»Ž£\åîßµD÷?L½¼9«Ï‡^¡J‹(5Цé(+Ì4ù²×&_ï*ö—“ ØÌ÷k,†_£ü-hŒäouœË¾ç™/`íê-Ÿ);¼„ͳg… 8ûi$ŠQýÀâ—jtž™8øµ=UC}ªä Ž/>jr`Ü*·ÌÄR­˜i-özüÓUÒ4¡G ` qœÐÜa'˜¹¶·ÜÅÒ^Ò¯äø"š„œ°Âs)ãµÁµJ_Ù—r-¬ÂO§²nvTi)iqU:í‘Ô‘êXÊÞnˆ<3eLñ¶¦øƒHÈ꺟‚µàY)5,˜¶çù÷ëÓžÐ[±V!éø«^É3æ¿*F‘oN‹ç!ÁÅ"Z!hÝÄuÁFMÑJfø1½+<Ø ŠªqTr+´xY ïsÆ_áF1–XÆ?DkÕx&oæ­"c,;H6U'ÓŸqLçBxÝœ/ëyܼ€‹_—n —n¿RuVbÁºÝÆï•<Ôô?\ò„¤á_)¡“৺Úîå{•|+ª1í–‡-}T¬wXiìÆ»ðCÄSÙ±@äc/Ê k/¨è0Ïû& =u´#ø¸eoäÀÎ%ß<^•v2d›Ý]ËDUä M‡Ìð _¹Ìê$ƒr//VÄNFu õh„$ñÃê7]DY2úWÝl! ˆ{@F\ ÎE”Œ =Êc +X‚{ù¦mÂ7 ÎÒ(-²YÃp– #™ùÇ.àO;¾A¤\»p¾§oT¹rÏOüµ4wß§aqéécœ9”ò2ꢩû}è³Þ7~×ÍõL䈤:QÀÞ Âª?¾þÑ÷J,²$¥MXîqÉø*Þã‘Ó2mSѧ=¡º±îÏG®qúÅ ÍX zþî…Anjæ?LnŠÿ9âÿ”H endstream endobj 346 0 obj << /Length 2869 /Filter /FlateDecode >> stream xÚiÛºñ{~Å-P-kÅC×û–I‘¢x-·Eñú€jmÚV#K®Žd·úÛ;ÃR‡åìb59’s”¸‹àOÜåÑ]ªT˜ëìnw~Yh{¼£Áç?¼Œ·ÄÍó÷Û7ãøNDaåân{˜µÝßý¼?—Þ´÷¥T ~ºßhï›ó¹¨÷üSY}Ø—}Yï7R%™ôý¯Û?¾ù°õ×ÇR¾’NÄ|™Ð$Ó¡Pš=ýî^fÁÉR bô'Cƒ®oG â<_€Æ,0{^oè÷P´áý&ŽTð®&HYïZs65nꋊÑMÑÂUip¹ ZóŸ¡lMG«M]=Ó¨`ˆÊ^J3ÚY´ÅÄÚ¡ˆ€åP¡ˆ‰»-IƒÚ˜½¥0I‚¾!Ø?#¡ë{ìiJÂúÞt@COe×7í3­ í€ÓLÈÖÁßO¦&Ô΂ë0 £#͹Ø1 Æi:7Vj{óæi<%2òð1‘SéH„B*àLiÓÖ\‘2‡Œ¢D6ZÊPEŠ#h‘Ÿ¡à%ðXØÙ×ïø¿h÷ÕÈŠ]íOÀ’¡± "š–-^ж/wCU0˜Ìd¥el‰I ‡2òR=rØ­rM‘F.Ðd hÎBj›áx"Q(7˜‰‚4¯ÏiWg2غ%ºÄ[š…]ÀNÙ$[iá‚?ðÛ}œE5ð´9ŒëÄZ2c-Qa玷Ò2wÚÀ…ç².€²U!Ã8ó»èʶ,+¾µh 3Ÿ&æ }èÐÒe.­[€ w!pQøÊ{q±3hï kÁ®ˆbS"øtà3OEO# +ÉBÈ }O®Æy$ë75ßÜuå±&ò”µ/N59ŠÝ'ŠnI4š+ú×÷7L*‰„ Æâ5ë„ažŒÆùï—Oº²¡§Ò[´ÒEðuljMºk„þU”oR&=$ê¦í»WÑác´µ#™Ç¡€g²å–BG'²\¹¨ªÀöÛòŒW® Ï¡­€29€Z\Ò*Žgy¶—î<'¿=j^eî‚i¤V>RÃyIƒ]ÃL•5ÇŸEªàƒ)IM2ŒÙDwÍ™t‰Qé`7´- ŽVˆG¼HhȽnËÂHq-°½Ï ¿¡‡F”‰ö4nàÀ–†”…‘Ì)H_Ñ––À¢ ¹ #ÝÉæLPXZ¾œelJåKY& ³Ü§¢¦]; $«Uþr0ŸT0GÅåÒ6ˆ½µ‘(—c˜­cÄ­\F…C¾’ÍTŒöN«³ V†±3&À  Ú7Y®]øyêiÅi…wxÍq©ä·f³¼‹G±u­Øã²¸÷´Å•ˆ¹¸Ò`þï|9ËÎvã+‚ Ã;(ªL½3´„6œÍ`-æ¶6ƒãÏgSì+*Caqç«Óiðêx§eÊ^à™š22 Zäy2»ÁîÆ%ñ%ÀRÉà£õŒ––ʺë ý-Ë`«ySÆa$}Øýüa{£4Jc_8LY!b ¦ÞsO|±Û™K?A§X¨p˜E,Dñ!Á)f@ÓšGÖ‘†z‘d`í«ºà^Ð89´Í™F¼>©ºŠ.ÒJÓàA ž„;¾!á>~¯ü½¬ª5[›d¥iLõú–VÎ-ûY]O ªרyýÀF6©–aR;aášoƒ8Ì­_œKçÛÑtb´6gsÆ+ø›|3ÉDÀ€é…ÑuÂËäÜGqîŠØ8lmcC„ï(ðf-þ©H‡qœ¾IE õº·L&lãÓ°ïej†ÞEÃ$L2µt7gn –m–3Ó~³z«ÉðuUœ lol&b‰ÁµùNƒ©\ìÜÊ-='*À%¨+;>Ħâgš°fRBû¬ksœÉ_MÄ-íÿÜÔ›+EÆB-BZ ’FÖpÀ{ÊÖ,7ñœó?ŽÙ  #Xd4 lxÜ2†Òµ#”#jGýD_óf[‹I)£E2Mø`I®©)A¼™>pΔâ¶sá¬@¤ŽlZYZ!8äÄ…Âu؈¢±×M°ÕãåA\TœkÓU^ÌHG:µ½ÐZ`H¯ê§‡i‚z‡fFrU¯ ˜CuaÏ¡)ƒq}ÆŒ<èý>ÕeOýõDz2kˆ¤æÐXóYï*ô®#Ê3ã’ Û†YU>¶…UL¸Ä!º& úé ($ |À×€MUº Š0ÎÔe½åñQ6íU•ULY=ײݛC1TXÞIhZ1öb/y§´í°HÍ ´RÔxÈ6zð;t (h˾ïWfŒÎ¸fYÀ²€X rmgoßxÈÉùà–F;Û=â`‹>—ÿ5tÈ{šæØçn­`àÊ@j¢ ÀìÑ…_†žÓ©ôÉ®£¦ü*Hõù¬ #’Ò¿–”5œî´b$*³±ÃÂYQAâÛ Ž®Hhsªç) ±mEN¦liv£áú!a”/"øbÑŽ^"”}‰9½ŒÓ .Î<²*‰Ña­¶ã”I#¨ƒõœ²kšRiAÛøœÉ+ÅüX_ßʶ©ÇÒbÜÈMýJa¦²,ÌRß|úù/Ý~^mÁuâˆC÷n•…y:³w›|• V±èi²xòP‚»E°Äì÷­Ûb#ç3s…p‘é0“>yÿï!üuÄi(Ç– Õ¥Õ„PG%êˆv$îéÚȈAnžÊއ¶í€5ð"¿ì"0ŸÄ–Ï3×S“ª ­† ÿ¯«ÎÚUÞE9ʱó`úÝØO²0•ÉBq"*çIšú|Ù§ü&#M¼BqÂÅCÄÙÿÔ$GŠR0ãôK-ðQ&ËËšÃ%NØq®sôìq»Ë_ã;4€§¯[Ý¢–;1Ø5Fy\*9ÓMÞ&ºÛUÎ'û.7ï±njûô%o=}¥`•ù¤‘¢«nÔ¡BaäÕ· x]k6,>™Ç.ÖäÙÊžF> 9ÈÊÀèö)|‡y¹ÁÏÙ¨-øÓF®Çò'\”ÖGÃí¾€vºŸµô€Ü<#~3lÏåñ4y~9cGäš—½kpÚRö“C/ ¨(€–2‹2_`„â•%†}y®ïÑ÷‹§[%G&î[Ë;D| ‹¨ðÇ}÷° ú9ØEWîhVß°³¶¨UÕpO’Ñë„múrÊA±+gâ™sÄ+G¤Hl,Au¿¯Šú+Á·I\ɨ屆’Øvð¹´_±ßWŒ"8ÚÖ»‹Ø—K@`A?ÿZ GIƙſYÀm<ÆïøL'K4fWz®ÓGfí>Û¼ž6¥¡Ž}Úúíkià °Ãn›š¸, u.—5399v2:Ö e£ÏÅQgÌò« ”:Ô©¸Ã Bûñ‡A‡¼±W¾ .Ž´ä}òˆ#RÐ=$ y¿¤û—Þ{~Åá·¢£á#®>oê"ŸÐ¯cÄ!ÿ˜‘Å‘\ËÅŒ"‹ÒàÏöñŒ5âÎ[<êpÜÞÈÇœU—Ňͽ‹ñúV°Oº\A³?IÕëÿoXùÍNýâNEl(9’9uÿ°f¶ìÆûÊXž àŸ›Ú¡ÞôåÙ˜½€CfiÛ=Û¶EÏ’¯Öc¯+EÕî9§§ûв£9´4¦¢³ßH)T©$›V. fþnšÝÊv"–áøˆMË£ùu’ÃcÑßéî|ü aé±Ñ0|lŒÁé³ ¬wÏœ¹Ÿ\åù*Êg¾\²ÕtåùR™ŸV ÔÉ6+DY¾`añ>/qè¿õy ‰¡©øfKxö£ÿoü|â endstream endobj 349 0 obj << /Length 2352 /Filter /FlateDecode >> stream xÚ•YK“ܶ¾ëWlùbN•ÈørN’JI”ÊIµÉÅvU¸CÌKrBp$¯}ú8Ëõʵ‡F£__«îRøSwuzWjÔ¦ºÛŸÞ¤Dïxðùïo”ðÅÀœïïßüåoy~§Ò¤NkuwEÝ·w?GŽÍy¶Ó.ÖZGê§]lL}O§fh™ø¯n°<úØvs7<îâL•Šòݯ÷ÿ|óñ~9>ϲïÔ9_QT™2)îŠÊ$JÖõv²oA•´ˆ#¨œÕUdkNçÞ“;‡Ô::Ž»¬Š¾ñdùw´c3Y‡ˆ$Ù;f|œl33ok›ž‰ã§ËÏÝI+#{lvð‰¨è⊛×ÚåC—Ct:J4ƾçÒ·ÔND Ïd«P úuRf«ßìÁ6†LëÆ!vs3Íñ~ìA£ æX¤C»½Ãj˜Fnž¤2ª•¼* kû‘<:Ocïüšå¥Ùþ63‰O§!Õ\}hÈ$_§ñ´K̰ÒmçÎ}C‘CJåFñ1¹Iå$a ¬–È虳I˜ ƒ×Y{³£µn?uçya¿`ñ@?; iâ•á7Óp#0LW!*ǬÁ,ÉëèþÈaS-nÀñ‰ÛQHÖÑ0ÎLžo8»œù·‘D£ôðç®”>‰Ãu{Œí¬L}ŒNpÊK ¹Xbnƒc—'ïhîáê{²È¼ÚÍüëúVNa›½¼þiz1ÓL UÑN§n@M ðéöÍÙ×^\vö;ì15â꧙т¸Ès¾ SŸD­ÙÆûZû=Qh” ( q„Q¸Z’(daÎñê°«‘¼†6’äü*^$tÜ„N*J_Û­ç)&—e=&æ–m¡‰‰LW\ŒŒ ×ê…f,½oŽ|îÀðü,åJ˜IØà`‰mUKAA*8ë–1T¯&ûòv¨%ÜWÀìİÞBé…] ƒPÞ4"k|ˆ7 ×@_Öâòè@-͉'ì<ÈÙ?¢/´7ÕaäÕ \€]JSaùD6GM-3]í°¡Á©{¤<œW@“ÿn•S'8ò ½µý9UÕú´YÞU’›°Ü„XåXŠ?B;´Cr­ç:»Á\e—ã^0`ä»»˜Ê5-µÝcX }»"ƒþI¡–~{­=WAϲ²ÿ+ðX”IH(V²h¢s3T Ǽ4§¦ÿ «ÒËa‰¤el¡)Á ÜBõb å´•‚Í‹1ÖÛ„4Y謩Mª$«qÖœ/uÇd•Ô$/Hã+Ä D‚é!fãé̽h³4vаÞB‹y-9AK¹‚–kç»t¼[ÐR´–œ ²—Ñ%GtÙÌv†*9<:<«10[¡ ›e ô ŸæuQó(C¢Æ—ê׆Nâ^]gÏÜ‹4–ò3ލþ…K¡Ÿq~Å8[Z‰: ñ…‹$ s~O¼á\î™‹Š¯T”r&®@“°ÐÃôhŠÊo+C+#ùh€´šÜ”4[`ì0 Á×N7kÀõâ&ó­+R!w}‡Ì3åö6:á›yNcØÌ/,ŠÁf” $©’è93‚EÐR>xØÁ‹Ä‘Ä‹ZaÎu~y¶Æ=ê»Í`º~5³ƒ`ú§1Gà¢.o@gp²*)J^œºNj­×€ó`û¾Vžzû]óaõáa áüÆž­¯®Ã²f^ûl›–_cˆŽ2¸vÍÂJM"0JÈT’i4@Gl:]zÈjéé{Ì¿¢Ž>˜î0–¨‹K+éC«mc×:¹p‡Msd «ÅÌo1<Ëðn =HB“Öt'çí+ÚR\µ•¯ˆ"ÉŠj}ñÍ+è$Õêú:溇m§š4x"ÃKhÐáz ]døçxÔðuÕŸ×ðÁG¿»[öf¾Lu=¶ X\tJ÷Åu)tÙrWWÌÔ*à^¿isi¿ï¦ÜËó#“ôúRÏäéÄ€n3ñ#bžñ Ç-Ÿüe "iø!²ç7QëÏ~;=%×ÂÜì ØÍóSìÎvß5}¼,w¯ä©F6®ä‘LWüH†„íö6OêR½ò ¥“›Àš(m±&AÖÄŽÀ(?SP7ø‰ ñœW»¢¯ÞW(^dðÐÁ†…›š,_…Ȫˡç³<•Èó$f|X²-¯;îƒÈ¬ýÓ|/Uûv_è!c,á--hгvê|¾¿ôºšS-ë&‰3hp:r(•pÔLœb a0ô¾Å§L]k™<¸v¡ø mäá­ŽM!šÀPË4|lÆó‹"º¿iJýJå:)¯¯+â•ñ.n¶¢H—I]‡9‰ÇÒW(Ððô}ãŽ<:LŸe‘lIϾҷ«ZÁÉz O¨õxA[WÐ×\¦ÉttBÖÛ_óñ©Ý¤Øâíû ÿg‚x9+Ž•ŠcEäQÉ ÁM”òq‰FÁ|¹¸ ݆1KØVeÞ:ûó]@+¼«ÄÿWéÿpù endstream endobj 353 0 obj << /Length 2123 /Filter /FlateDecode >> stream xÚÍYYã6~Ÿ_a$‘‘V<$‘û¶;È.² À¤<$ÁDmÓmat8¢ÍèéR…Í"?ôdRØFëÀ/gNÜ.ÃwÜsÞ'µÓBÔÓbÛ9OG#º ¯Üé*šòéq¸ÔÚuŒJÌwœÿ£¶t0PDŸ$Íâ)ŽU~UA™œ+૯¿º©¥)Þ¬+IA§€I×Zã;ÿ§øCµŽOÊïØïà-fgÀä÷윈Ó=£*ðëw½ãÔ™‚ĹiCZ dÏd„ú …L|Lšp_ 6H8‚å N„t{- Ù¡0Ì\A©áôP˜™PYÊe 3÷{ì’á÷¡E4CøËIµó¡5Ëv­NæòÄFÂ¹Š„­¡áPÊÉ!ÏeÍäQ8BúÞs­¢ñðܲ,çHN¹»+)n?ƾ¹ É$)_K îŹf˜ ¸ÏCÝX玒æ:^ÂuqðõÈ&IO±ZE±X·ä`ˆëfÌê‰w¥wOµ ¹JI9Ô"áV•"ÿL¨-æUl>·EÏ$smÙ8æcRÛ*Ìà…4Ýw ±ùuˆ­Z–bɺDÄc­‡ 8•Ë0áPúc0ÿçjè×õDÒ©ôI锸B`Qê.ȹo)»)OÏÔ´/á¤J³}#a]Ó"Q@ù²¦— t.HM<Ù.äb¡Å,B<Ñdœ"Õt Ê™K܇3ß–˜!‡|âCn`A¦X8ü‘“)HÒ§ÌÒuaXˆnSŠWå šâß7°“à=Ã3”´íÞõ~W¥ÓìíÓ¬j2 ··N+ÖN {»ßÎU€ÁKµô Ôãh2(04«¯’ÕU×ÑÆ.\ûì²EpY¤Ðí±±ˆ3Vˆ=]¤pWAâqŠpÛíô"QøKEŒÈ›ë›^Çå”0€ž“1H¨¿›òcÕ  Ï Â&ÔFäÂ/£_Ù—;ˆ~ži”}çãë Uò ?Ä䋇˜i*•ütBå‡i`EÖW¥ÎfDC`¸UÊ ‹ @¨†cws›Ž¶¦âHC…3æ*úñèV“F(Ã/fø-ù3‚î”4ÐTJ°õ»ë»—\.Îê;èÝ©ÆÊy‡XA¥»zŽªñ DèB\Mê®}À3F‹-Õ¿gÚ'¸PÇ1”³]]W'?®`‡D:b¿ßÅX¨äHÙ0Gõ¬Èl¦, e)GvAhJÌ=û—¢Á3YÅV¹L« À—ü>Ȉ㳋*ÿ9¶¨D–fø)µ¥ÜQÊb|M¡—cH︹M$`ê‹$îi%Yº¤·mú¢„a YD"‹úíìúOq5¸Æ?ñ‰ÚàÔð{?%ÒÍãÇOc®^LÜ ‡öŽ_FØZp„ÀØú5ÁÓ“;º¿7z&va|äm‚ lQ²œs{«j€}¶óà×uØkªt4  ›ï ð™rªïã?zþbÏ⦠endstream endobj 358 0 obj << /Length 2680 /Filter /FlateDecode >> stream xÚÙnä¸ñ}¾Âo‘ˆIÙ—d o`ƒ»‚`g‘È»[°ZêHjùúÔ¥«­žñ,²X,ëfµ¾ àOßdÁMb­ÊÂô¦8~ ÚíoxðÓŸ>iÁóÑ_`~ÿðéw?DÑTdúæa·$õPÞüâÝòÓàº[ßZëéßßúaywíñ˜7%¬Ç£û²ªfë§ÚKn}øË§û‡éøÈ˜ò‰˜_aÔ‘27q*mCæu8#‘6^skRï|ÄÿÀMêáp¡ÝáW{'‚¶}_=Ö²§h§Ú UÛô ¨ä»ï\>0 Gä’î?ç¼æáÐâá¾¶JG#SH(Ô©÷|E^^ŸÝoan3ï'——5 /Ô™—÷O‚÷rpp“Ž'mÇËM;0€.‰ƒsí ÞKÕœ>hÏså^VéINÇï@e±õZ< ö"O6J<ÙÈz}2yãq]õCÏCb³Ìnµ×#7 $ï.(|é®ò·ÉIú,ŠtuîœÅ¤´Äs<éÝÀ8x-ü¢ð[‘š·'óÀ$`žNŠ£Í‡q[+Q1û-ÿëºVm¨ñ° <á2–‡Áôèr4.d³þОë’Ç{¾kÄiN"{BUаÛçCÅÓ1A„S£ÛT'ÝS¼iZÊ=À[CP†cXévù®Z<¯«c5ð6PP‹—>¦“P…&‚é ‚­±”Nõˆ¤¶ù&Ì” b`—Bþ‘×oÅÚ— ­ÚÄ’‡Mœ¬ÌYh Š‘”l%â"+¶«8ó!Ö¸R:.J\S:¾Ãᲄ'ÁâRø&ñ,×ïþu÷ðÏ¿ßoiÀqW7Z‹t\@2Ù·ÝÛ-¾Ø û(¬ÍRCDŒ˜Vµ· u'örÀ{ꬪfïúÉXv-œ÷)8¯{¤?àvÖd¥³Ÿ$gjâ 뇪!UÇíã}Ì ”ŽRoÑUèÊTÀB»Û”1$­Ð&£ŒwmW8JZþ©s»êu[زi%l©FA*ðyÙN•’õy²¬z‰¿(·>œ-m %eÀ€R|·³¥U šñ’û`±<(̼ÄÒ‚ë8£j¸Bϳ´•¶Ã"…r'à/kG4(HîfíýÚ—4ª yNÉ7ÑTÑ„s,ˆÂÄŒUbËk\='#£´Oö£í ÊoÅœ– )IÁ5izÌO'†”²«Ý’éÚ€{Wï|ænK¸±k¨Â­žK5ún*1…aœ}[(¾R±ATO@Î+KtÅ¡3l†®­ýbޏ2ÇPzÖ1HkØ íƒŒ#¥ão-ßj+Ç´¢¢.çäNG¿õƒ;ör<g8€Ùa ôóIÞŠ1I¬b­oV x²¶ËÒüÂq„äÇú=9CŠå~VY‹wm×¹^N¤ƨì¸É¸³¯ö ½]´w ^P µÁíºöÈÆ2Œ¦$µ¢6ïʵ­Ù¥­…_¶5CM¯í7Wlͦ rÜ…­q7Á?¶¥û˜=\I‘ZEɽ¿F6ìÙì.ò5LÆê< gg•(ÑaBá9™9°í€ß¹„·ã˜¤øµégV—…ã÷ˆ‚‘0¼ÆV¯“˜ŸÝCÞá±ôæH¼ó‰—ª†çî˜=ƒÜØ¢AøQª".ݵGôCì?P( ¦¢ã¬ä=È€‡h%qÀØF¦—<ŒzxbÖyÇëdżG~°S`¦N¬®Ex=Ùa iSHrΓ‹–‹OÜ@¹jºØYš-‚ijõ„HUlã¹d%zÔ>ר¤k@‰ó«ë¹ú¿=Bc®3—Ñ%ÃõAö¨Æ—I°¨ ³•,f?ýk4 êÈÌ›IK ¤ Úö<•Ô _× ¬Ä@™dÒC¸ÜL ›p¡à‘”¯mn‘­/tª¥ E£ÀÊ4‚¬x<‚mC¬É½Ìh3P¬9ˆ›¯Îû7É“'2â¡’õN]uÌ;¡%×§ñ f±÷>!>‘Œ} |Š;¡éäfHÙJÁ_ûw0k#OA»j--7Ý¿bÁ õ8݈×ÕXýMÎq`g6»o v¬ïc(©®ÎÆúÌGäX®ÑŒâ HJ€Gµ/ƒøiƒE\ôë$¯y×_ >æ”úž(ta¼äFØaÓ•û"?Mî‰j|?÷<­ä›ßN 38`i(Txºp^ ¯ø«†‘žñ³¶¡þ€ÏʑԿFÚj¥C»¤l>PÁ0ÁÅ¥åzbÍûª™Ï&1&”ÆÚ¹¥b—²Â6©ÀM‹-…±´=ìÅ#Zz$/‡Šá‚ƒSDÆÉ¹wÒÃᆉoØ´8ÙE­ÊˆŠøÀiÇŠË-͈‹”Õ]áˆoféÒp¿9úE´œx“\€/ê ½xßøKÆŠo}¢ßþ?C™4Qă}«ýòOQ#¶¿@ßú9ê‚(1÷³+fnÀÑ•æá/òU>¡÷¶ZÆ{ü•òï3Øï¯”+µwʱ½B$Òw?©éÌïcw±¿r—K¢Á‚HK©jƒLE&y_|óOdîuÀQ0ºû@¥$׌?£9F¹°eZ¤¸Š‹dNâßâ6ΕB¥ehÞÏT7 œP¡™ÍϯÁð¥oí¯4WL°x›§I(ÙÜŠ~àK’‹â!¼"/p"¾ö  ”µßÚÁ_Ol×ÕÒ`¾ ×a³T*ªL«$ ×Ê+&{ E®ø-=4úÁ1yÄÖ7‰‰Æy¿ÒH™dòx)u0alÉ6QéŒ òg‘ïµcù÷*ô„ÿ¸Øo endstream endobj 193 0 obj << /Type /ObjStm /N 100 /First 864 /Length 1577 /Filter /FlateDecode >> stream xÚÅXÛnÔH}÷Wôãî‹Ç}oK‰  „˜°ì.›ãi Ù’ü=§| “±ç’a%’nwU®:U} 1&c4–™ˆ‰#‘AËW­bÜi´øã$wL˜mÌ$}sÁ¤rà’I7L‘·LIÈEÄ”åh9S±B«˜–Ôj¦I_8fGÄÌиÌÄ<R2KöÒ0KóIËl TÄœh9sr¥˜sðWiÃW¡‹-}#¤ˆ´@ÇFЄ,´aœ êXthRιňAÔœt Â~ަ‡yo¸DX\øj,p01Wde¬ˆNdÁ_d`ô¸¶4d‘†¹²‰1¸U@Žl-DHw³#MÜIÇ$%ÊCR¦b®Ðr¬IäØÑæ‹PÆ0…DºçQ ‘/ÁA–DÂeU"cÈJÄÚØ„³è ‰b‚ca @EH9Ò'4r![ú‰€ã„¤$/5Òih^AÌÒ¼D§éˆYM³ÀA³ …éÅg­j9G}i … µ´Àž¶$Ç´:Ȉ´”:2¶ÄŠB:TG5H‡üHT¶ŒÛÕ¨Kø(•dŠ‘FêŽJQ!G( ÷$RŠÜ?JƒMxÂåJ*”µi=T×ä”ñ§QáŽbAY©XðàÉ6›³Ù‹ò¼d³SöÛŸþîs™T‹ÿ"½IÒª¬gOŸSã#Û7YúVYƒ¸;óþƒÆú÷Ö߬»²Û“¿’*K>ç~•¢ÏËâ›/2_¤~‚šƒ4wÆú6YÞ‡Úõï#Ý"–À2¹ŠÙç>}@Q'ž¨¬XôzPéÍ7GVÏêºL³d˜aÃyß®¬™¶¸:¬ùÃñìy^ÞôŠEyOÖ”`"“‹¬¾Î“»!]ÃçxÇ(Ù—»ïÜß6Åxx¼n®’*I_‘Ê«âzÕ›NŒlÏ}…”'y·—É¥_ú¢·ß"a|h² l“èËp¯ÚÎýaž]ö9z‰ZÎïËsÎŽÝgf…£íwM2²YÞ¬©ôû±¬¾ö(;äc_z¥n­nž[„{P6vâmÂéj˜_•U³î~g6.Œ=Š#ôþ8=«|›¨Ó2]Ñ"KÃ×YꋺŸáPå &p&\7]-üí@ÁÆèÎs¢ß(¦6°Ò~0£˜ÍÞa7 fð A5.•1ž6ïƒÙ{_—«*õu{×l‡Þ`ÏLNÊ[ö)€ÁåÐÆâ"D[\W;µgEQéS{×ÅH{Õm[Ü"»ïnü"€Ã?Ë:FæwH\GÞÑîàé!#rzÁ£¸}ã¹0²¿ÄeâPâI„§]·Zrðv ñÄ|”??Í Þ¤!Ç£Q€ Coc%ÃÈè£8¥Ä»¶vfÿó/Þ­ÌâÍU¬òüâ'uð„uìöêá1ÒÿÞVOЙ֬×?ÓÖö]”…”ÑðÑVjÿrâ¡‹š‘bø@iãýF˜c†'@:÷ ëõôŒÍèú±¹|6²t£…,Ícò Òî'ô¼•Czw?ŽÌIþŽeIñ1KñA,I%6iRÑ~ ŽÐÁ>Šå#öêqÍC­Äãè|Pv¹ýQƒÿÑfD´R"zí`Qòg!TH?¯qãBN¿lXl×\1nã0ÒÓ§‚Ydt¶v7¸a—ÂpÝT«´©7÷*¥ÈõC©~Ù§'„ 8délÛo¦kàèôޝ ʽŽöìß“qNo¥ÇÆ£å(ÍG‹_Ïø4ÐæØå§×îoß ²O endstream endobj 364 0 obj << /Length 2590 /Filter /FlateDecode >> stream xÚ­YYãÆ~ß_¡7S@ØfŸlÆo^ìNbð¯p¤ž±©ÔÎÌ¿wUW‘"5œCA uWŸuôWå*ƒŸ\Ù*×ZƯ6‡Y¤¶÷+jüö·’ç¥01ÌüùæÃŸ­]ÉLY!W7wÓ­n¶«ß“»ò؇vj­ù×ujŒM>6‡CYo‰øÏªÔú´­úª¾_§J;/¿þãæï>ÝŒÇ[¥ÞyOœùÆEUf…Z9o„Ô†îZnúêûZù$üï™%¿…r»×3²HvÕýn-“=þ©<é;$û¤ßñx{"U5ShÈ'm¸¯&žºÈãlé÷µuI¹?dXH¥ÒÒ­š;Ž·q2ŒnʇVBkkÎ,„”ÎK»¾lûtÓì›–—ÎD œâå°˜Ö…OvÕ…°£c·á®<í‘YíMÒ7çËÄF×·È^;•¹Væ|{I»ö»¤¢ŒLB]ÞîCG¸ƒqªºÜÿÀpçzÛœxÍ΃»lƒ@Aé䆖ɉ®¨?H8n±kpä¡›Is¼ÞÜJV—¶ ÔÕ…¶[¢ßâÚ'¹m×xªû[< f¥Ç²ëy2b˜XÖã*¸tÙ“£¢qx8K&wÍ Ö<×òùT÷Ù´á°NQdHîË= ðq.©A¹4k6#‡#»¾iyŸ.”-]$t ?+ È 4—5»$¤ª£ùŸ%‹“f°˜Õ‹f%… ÏùA,í‘z-2˜”ÊBäÊÑT2ô¶-7ß&’^8ÂæÂÍoüïHì·®{jD[…ÿE&\.´SW1‚  ípóMSͤ¹?µhÙñØ –=¿ µ™ÖŽžOî…_ɦ¦|Ž˜‚ŠŽïÁñór1:·'¸‹F´Å9eGÔ’º;{^ů6¶_pœ,¥áÃÅ;`VhŠpr»d#´[ãëCk-±Éû2sF°7ÛIžï¹£~ÕSçEÂm|û‹ô6 wmsàÃIžŸç-iÊv+–î|³CË6™Kè?O6å~/iÇSO²Äž_JlšŒKMÉ3“)¬ÈõhWhÊ8yÚÕŠ›·h€à£ ­‡Ý~B¯¤QNÑ^t&…svn0m T¤;¢IÂÿÄdJ8Cb'<†Í‰¸ÆîÇÔĶpdC>»£!–ó)Ò(Kq³RK ¼ËÿžB½ -åñHê-É‘†~ÿé Áš((ŽCÑ C^Ç£Õ¯X¸È´|ǃ7o —¶Vd~º¾…§#½–w#Vî±rÆ ,#–ÎûárÍ;KÓ07‡§u{>¯àÛ3-ʈ  }µ)ûèVq„µÉ F¼‚bÎÔCdJŠ^s!£V°O ¨eò¥9"wO áÏ©*Wõ»a]D<øîiñÕô²mÉÕoØ!‰'Ëv£§vc^·›üT1šMsw·(öâ(õ†ÝH“ ŸëE»9„¾Dã¹Ær@A´lD)õ‚å(¡Lq­å(''–!ËÁsè<}Ö ´GìÀrÄ-F¸ ý$a*8 ÚæGp’–©!ÈÅà]䙹ÝÎ5×Éf_V‡hÈ–­;1ª4ÑÅÂÈ¿²›ôÏkFƒ´Î"ÄÁÃq[>¼ásc¢à½°É¯‘Ulx‡èaÀ…žºû@Á[âj¦„˜KÀ£KoñzHš»a€|›;~8 ™‚³¯¢Ø —ã= YcD‚1gK Mä,4‘ ‰cy[íáÌzœZöÔªê-Â…7êå=ê¥ëŒÈ0DÑ+ÌÝVÝ„Jg?Èǯc<;`åÍ·£(>lÄl ‘ºó°ã¹¿f6ËT–Á¿„E#ZGÔ‹¤³;ƒN4#Þ…ý–ZÛ…þPS oºÓE 4ݥǥOÀ3;Å- ãõÊ%¹ÒóBÔ¢’7E6æ>ò¬“Ö ãíU@±ŒuJA&h. îñöÕ~ûΘþT…"zËþʾÑ ™¼zÇåÍÌ?ºYD›—=8¤c´8<2^7D:r‡Ö †h{Ó•Á@˜Ö»™µ=¬#4mIQ÷ýëë*«è¨¹¬5—ý¿\”Òfâ¢rš è±aÑå]õø†ò&ºs’u¨;øIwJÊ«c7 mœûšˆX@¬znp>±+Q ß«ˆŠ@fEâĺŒBçüÚ#é¨Uç.ìtŒk•É1!¤Œ¼ª¹0òãgH4§%2`¤¹¯R›_ÓE† PÆ(“vQ÷J9©wÒRh5š=‚J‹I šç ùºëäg’K·´·+¦{WõeÑÎ@ô¡Z)\®ó7 wÃìt2}¡xw¹i<ûKØô\r p,$©LqJÜsbž¿Oì²Ç_êø†¡õ¹Ú3íË+òñÌü3ÀæòžÇÌ%—:Wºb¼ú·¸f§“é \^n:hOÒ%Æ’‘÷ƒÕQî×rÖ†96ýmÙû1ã¢]¬„Ïs{cÙÙc@à°dË€=Þ»E[.^†Ÿ‹æß$J]¶w#œ-–콘'{Âk¢/ž6‚I ̦ìö”T€gmÒ ¯ÃS ^JDÚ vÿôåãÒ !])„“~.öå›*ár?}¼å–QÊš¡œ‰7†Ñ1*€ 5Bà#6sˆÈKÕ€Üg—ø.°—™JÚŒ1…5ƒ›æhÜš¡>Óæ:oÅõÔÙEuÅAÙ +·‰#…Rœ3Ç„˜c,ÑÔøFçé.1h¼Èrý^Óaþ³ú±ÉüKõcá¯öõF¹éçØYÏ™u>ŽÞoöŒuúö’¡H»M[ÝÒÊ-ÑJ®eüD_©0Àj]ÌÌ`bÅrBe7fx‘Q=­8½féržwO9U6»÷n P # ›¿ybr9Å<Üù²€Ôó'/\…æyšß¬]ÑÚÒ·—‡ŠlõYÁOмC ¬§WÍ©K‡S”SXQø·—ììÐêðØ¿¶£óÑy6¼g¿‘¢˜}·ÃÇ'láþ§ÏwW¤Šëþ ›”! endstream endobj 370 0 obj << /Length 2791 /Filter /FlateDecode >> stream xÚ­Ûnܸõ=_á·È@¤Š¢(JݧÆH‹ûPlüRì.¶´†ö¨«‹WÒÄq¾¾çBj$™†'EaÀC’‡ç~¡ÄU âªJ¯´”I•—Wu÷.%èøpŃŸþöN¸}1lŒW;?Þ¾ûÓ_•ºiR¥•¸º½_£º=\ýÝÍãlÇëXJ‰?_Çy®¢›¡ëL`àMoyôéÐÌMÿpg²(ET]ÿzûwŸn—ëU–]H'î|Ih±&Tä:)®Š2O„Ì™Öc3ÍÃøOÍ7‹wïySx"2Š|¶30”•Ñ|´8¨¢Î|mºk€œ:ônÿ2BYà‘áž7›kM×±ˆàn>3ØÒÁylìÄ€É à þ³FÑô¼än/=H;È)Lj KÉu¬Týn–:&¤^j¼˜ßì8|€a™F†®æuûÃe"z`€¿‡N!¥:ša•‰Å f´¼x°­‘^‚’ÊÚ!{ûËy¹åŒ(í…ìäeÉìà±bOñÏ—kàÙ´'‡¢µ“Ã:KyÆUƲDXHqk¢™fÔ¢”j%˜lé@ã~ûaæA‹JïPé8˜-Ž0B–T}$D9HïÞœÚI“…# À$ð½Mážš€7´eEJ´á/цƒ¶é𙥛¥$]„>ã±áÄ“9ÍTE¢FÊž¦Úø˜®’"ˆKý+“ËnÛxúúØéÄŽMM¼a HJUnY\þ¥âä&·ÎéY) åZ­ù^­2zjÚ–—ð´ŽœzØa ~Uš&ŽßMŠ]@)“\8ÚÃØ|úÙ´ñTCÛÆÝp¸8qô”9†²9°%–ÆØ˜»ÖºµWþ¢I”¨ôJúÐÝB$¹ZõžÑvÖôîNð¬ÙÓaÈ~u ’íz©…01ÌiÙ ýЬLdªw&|h8¤ˆÊ«F,.;)’ºLÛ>3tèù׸p ‰„[ë–[ÎGˆüèaL«[œB~å"^µCÿ@f¤3a´+0xjó‘‡$ ¿~¨ÀP€¡–q1~š­9¬O’Ñ<>²®ÊŒðd0žYs¥>ˆ¬€“—BF·d-kQgkAˆ_1§yèÌÜÔ,PÂFéÖТð7hQ¤ØLëï´(Dw?ŒÎÍ+•h)¶‡ª¢kzÓNk—Í££mŽ$Ws$\spL•›˜*½ŸÀhË9BüÊD:Ùùt˜U}ÙÂêý}WˆrÙô>dž'ÃMthúÇÓwv6oD·ŸS£^qN:Ìܪ‹ü]©…~Jœ"ú ¬Ô¹ ·=ÊÑ%ÚE#ñ]㈠Nxõ—T¥àP8@39”~óaà°0ñ3™…*’LTƒ¯[kÈù”w«â|ý‘˜XhúÍNÕ˜Xf45×Ä0¿k3£9ø‚ (ä¦*탮¶€Ýì© Bˆ™Cá‚K¶J.V̳º5M7ñ/&ÆL§ÇGÊ3È¥\•¡ã:4Ϊy¦ܞ˜bÂåp†­¶’‰‚$zÕŠ•ÖIvhYm™»#Õ*¹¶ Eyqb8É X4<|%9~o*Bü÷?§ A™,b—Ô>;4œ³rÔ}¹Ñ=ÀžÐ,Òµõ ©>óÍÙ¾fôÉ32(5|ý,1†×íé`yrG ³uŸ2KéS 6öŠ'H\0R0Ë]ÀFØ&½ 4ŸV` l;¶?¸:†á˜ó”;˜ t©Ä¢ƒo~»¹ý×??ÃO a~ÑÄFâxAmfû€µT)1·å@ õHD3O¼É[®;ã¥È¢W"Õ. 8­AÊqTNóèVGØjÝi910 ïD¸Ô›.,„J'yVxÖ0þÆ÷­yJA%¥\Ü„´˜ ÿLÏ=ÛÝsç›’I¦ôÆœ\Ö{AD‘Õ¢ˆ73A¦— N0BŠDÕ.ÁL>ëcì¢Ô¾Óe™†d¨ H5Pca‚c ‚ø»«ã‘N‡S{pPw¯C†‘ÁFÛY_Ð…ìœ'ÕBd9ùÕ€q'Óén²œ,_JÑü«ëõiiqq‘ ¨jxÍLî7DHíß6rع“¯Ý?fdºLT®®¤¬Uê74üîxµ=ðú²GêƒznÈÏ"‘d‰Â¡Š~þ¼È Tö+:%ôŽ˜‰Ñp‹ÜS ;’J‹ ©ö»ß z”¨ÆäŠê:üœtBÑ F›bÍu‚ˆô.:QS²È]ã],Õõ0}hø-ÁM ÿlÈ¥x/^äˆP.M¡}:PŸ>ß„ü'èín í)²ÝÔ¤ÛtÿçMDgça‰@1ªÓ]j¦~kÛÅ£4y”+t½=\Ú®þnŸ;óøjˆH—Îô ! û‚à=ÍÁ±Öð Æ „¬PŸÆqÉT¸ò;i }‰î$ÆJ¿j}æÉ]Ó| ¹í‡œsbä×ZGOM;ÇMÎ|PÉ¥*zS0Ú Äìöa™8IcK@¬ò$='Û™:c¡ó-ä²íCS ÙO<ÍÀ¢!„eº.à>„»•Þ·Û„ù²TÄ*T"´ÜZÏí×ÿ º/ÍÛUáEhânø|hÉÓä¬ÞËPùpƒ±ЀŸ7oõ½s åö}«“ì8ñoÂFÐWªŠ7aì\öqû•é'|¯tUÚ¹Ž„%~~xa¡nªò2Éü¢3ÌœÁ5Éò‹´¦À²=¦ð©¢.wCTIŠyuSKœË4ÌB?¼âňÞôb‰hÕ† ¬<@Ž/„ˆ .(DÈéºÐÿ«£SÕÑ_Ûjp(&Çz^$JlkÏsÛÑÑË Áƒ”' ¹¥‡ Áåâ6-(îXÕñ¸Ö„s¥,’ªüÎ@øVÒ¥oÙõê&fªPI!vÅ©Í}¥ÇB8‹©Xþõ껫ÎYœ-pûº*sgbxù%j¯i÷ }–L8«any¥L/ Åkõ"íB=ÏMg±Æ½¨BÿüÈ(udåôú¯3 ýái4\%"øÜ¸ãŒYq×Rk°E8e_žïJe:@O¨¸8Ê8’ùÑöî—ß㛇Ópš´dwœp%_[žaœz7qïÎÔï9l@cçðâO…%À#~“Z0£øÃÅr”~§‰ -Ô¹ôX0ùF¤}ØuoFW>¢”¨z4®Ìœ¯ep£÷.¬»[1âгv³Uºbg(þ²Z^žäù¢‰çĕԹtŸuàÌJѰqyhëßÏ Y^½jëJeweîÌ÷úd¡(=Ø5~,ìyê^c`Àv‹â)2÷¤AÂô&¢ŠóFh Gþx ÷ªT¬5¨ô™S:`ãØ˜ý„_V,—itòyìþË .­‚NIöè)– m zGž î—?¦ÁàUMòû Äþª‹75­"Š¿Uœ¿ùÛr^Î0œ†ÓX»}¯åMQåIqþ®3¶¿á—0Û.˜‹‹¤8w1wË[Vმ’ ¹"‘»> stream xÚ­YK“Û¸¾ûWÌÍRj‰’9®ËI%µ‡”wªR©ìÖCBCÄ©åÃãÙ_Ÿn4H‘2eKÙ”¯F÷×/ˆ?ÄðãyüJÉò${(ŽobO힨óá/ox˜ÁÄh1óûÇ7ü³RJµ{צ)‰øƒk,õÞ—npÍó>’g|ÇãýÏ{óþq>_ q#£8óœŠX1ñ ³„q™³®þdºëí@¡¥Ö`“í>í•Þ™z´D­m •i¨×vÔÚ_GS/7Év¿Ù®ýºZγVû§»¦m¢f/²Ýx´+ðúpˆKÆq8sÉ”ï>XSÖ$@Øö×7ôô9ú½WÓ§iÚ¡òª€8d_éÃ…§ndKú@Þ°-máÊé€ ¸‚…ÕŠ5N¼·” ˆð×Ñ6EÐ¬ß Ú¢=žj;XF8x¬Âxif¬ú€;ª eüæà0О^iOh–fðàÏVqf­tÌSÆ31Mb[E2æL¥p•Œ%<\åhºQé:[ mçl¿µ·J™^ ௸Ï| ãÕ í¿·N€·8Ÿxk›Mþ9K€æ¼Eô$1JqñÝiÏ‚ØPgx° DOCÎ_‰Ú˜£í©[TÒ'¯)¢˜Àsmú*PN'0A˜Ð”¶ô2{ʘÒÉ Š[ÊKJ@ܼr*öî¹ò¶Îx"Oô†ÒŽméΖZÅzûGeÁzE®ÁŽ‘‘§ÁÐ:gžPÄ86xíúÉ-6¯Ê¥byšÞp×d©^' ›ÆSJןj¯µ×À€ Ìš«ë?Ò×O±Š·9QšI=í›2a©˜y} [qR»Œs¦Dº—Áû+²¨@"ƒé­=P r$üá©ÂO=;š¶‚#Nx‚&%{¥À¤cëáXºŸbž "¥ÀÏ…=WªúÒe~‘|–~{8|Ûƒ¼¥­ž¼:ðýÛ8Í2pRb¦ýë¤òpú?y­áP+r®Hؼ JX †r' S)f_]Ò)Á‰àA %âˆélàèõˆä'¯®¶†I~¼—wígn=´´fb}±¥$¢T'èHµBg…ÁYa—œU@L'Ï‚ d)°3'ÿÀ®4%åÛÊRgÐñ³=l‰p §[BCΙ–úvÀk'“¿LÖÁî«èÌ {¶ÜÛº DÑFf_D¹¡¨¢Ê•¥m¢ƒ«oE`0=­Lï;T;px»Õè(}l¢ï,aŶ àŽç÷¢;´]á œñÁ{ pžp–œÆËNž>Ñ—ÔÓ—ªíÉuÀ=ÁdS¹¾ð@³$€Û>;Ì÷2µ{qCE#†ší Æàƒ“ü2ùЦÍЩ“~è´ÀµwÐ~I{!fw £O¢i=ÎGöÃí¸`qªW€vîÚ†Qzpr02¤1òZÃc ·€”¯"d‡xÔØû¼ÎðdìÃÉ®)êÑ'ŸÈÆ4»û+^g*M–÷țΛâg"¾ðOÔð,¤ê zÊn6Ö©n9纓©¯S‹o&M˜é .ï2Ž;ÔȡÒ—ÞÁ6c4Ý"¢4ä5‚áà>ß©¤ž€lQê+S¢X"ïΗRŒî!Œ´÷Îtæ:ò\x=B¦iZŠ¥ªõ3´‡óTÊ5˲uþ[»Þ§ùÂÏÆ–L°í{ç5‹¤37=Т)~¦»ŠHGô„3†ðÃOƒ +ŸNx-j4†‚l¨ºv|®B 6…ï{rÍ|÷ÕJŒpyͧ)Åt¬ÿ/ÑIƲ5þÚq8Ct´ƒ¹n2 JÐCb$ÔöˆÑéý!GçËü¹ÈÏá8 3¦3äç=Í¢0ᙪÂBë@5XŸW´ìÉ ü—. èƒ[J¹Bæ5Úv¬v u=ôa7î+ü0}h©AQFÐ}™DÛæ4;®ø\¹#2ä„ ˜8!ch>¸û$KtzLPÒ9ˆdDI@Ü#‘ÃͼÔ2ê©ç¥–‘¾ÎƒˆÁ‡ÞUxÒnî@§Ö€PS1R˜:pR´ôÊb\¤p¡ ¼Z@†“¬ÅFiG$ójbªršçžhg¿Ç™ ¦G«­GŸå™\ü`ÂöÈÜqg³Ô{¡Ìp ¤ZÖ‰ ètí¹i®‚ULªVÈ@È»›’Üï@ãmCmðœ_‚!a±œÑðû_Þ=þóïï·ô‘dL+—µÜá€Â öKÌLî¼a£ø¤è™—çüž´ ¦²‹än3zº »æyz|:\zÏÖ_ÛkÂÔS¬ŸWõÛ.8«…w;™g-£Ãí.N«à"txƒÂ¶‹ƒd/»÷I¤+{CrÖO&Š#ÈÛ®Á7NÁët4ØÙÞR8Å%84[e4…J5«öØv{…¯Vü‰„Éó+ ON±OšJI‘ƒuël…Ü…[ÆÔN{ÈArEgmsk¢ú@ä‹ÐC«ÐsÌ°Ø DïŽä#§·$^}‹à÷=FÜæ¡î{‹,†ÕkB6g»è“ó÷Žžl]ßÄí¶yçLæó-p»¨^k{eS‘~ãmÝÀë’i× KÛ‰*¨Äk›ÁÔ¿Îÿâ¥VÄá¥:þ¥Ú«/µ2½ÿ¥V¬ãî?Á2õÙR.2DðáèZp/,aU®.Ú°¤o;|–™fó‹B%ˆƒÂŠ$JÒtç+VhM}ªLxf\áÿ¥Hñ‹ÒvÀ¶ârN(þÚ€^ÙâŽ/ÍD·Ô!‹b[hÿýOÄ¿#©ä ¶ÌWò ìtö“톤™!jì‹ws·BFŠ$3BQ1#®e—æâ»ŸÝ¤ÐËt`óW×Ô›²¥ƒÍDZ„"L,ͯ¯8=¼¾"}Y<z æº°ìÎc×PyOÏ92‡bä³-ÆáìÒ¿xÁáç"Õ…= Ñ5áB2”ç‹×Hî¿¥VЂâÅC2Íoúø§à Ö?N endstream endobj 379 0 obj << /Length 2331 /Filter /FlateDecode >> stream xÚÍYKo举ϯðmd`Å¢ž9f±l\¾e„Ób» ëÑ‘ÔöÌ¿O=(Jj«;™C`*‹¯bÕWUlu'áOÝUò®ÐZTiywh?IâwLüþçOÊËÅ ¯$ÿôðé¿fÙ’¢’•º{8®§z¨ïþý|2çÉ÷±Ö:R¼Ó4‹~îÛÖt53ÿê:ËÔ/µ›\÷x'Z•*RêþùôËCX?K’wn%ÿÃN™‰ä./S¡tÊ›mÍ}RFßa“Y}…}”‘åFÛS«v_¤JmÍL:ƒŒë˜vÀT‘{võÅ4̺tuÏTãÆiôƒC?zú`šÆ“S‡†½æë½‚Ú•*ãmÖÔ hí‹Ì$ü+?bsº¬I‘À@!Pïiôp"M§QmæÒL¬v7ò÷Ÿ{+—@ó4ýñ¸·–*„*ÃZŸÅÞ˜ÑÞ8Kî xÜoGØr‘Áø‰ P}wÏf"Ïu8D·{%Ò, gø ¦+³èw¯ižüÌ1û¡™åºÃ`[Û¡ÝLxßÈdÓ¢ë»ìBE‡ûXEAØX)(N›»=…ô˜`Red.Hå¬({²#sÐÞPÆpuk¶Á‰žïÙtQàhÆ“ë;4° à2ØZãWx¾ÏòÈ4º`p^ßošˆJ„}”¥(@hk§þ%߈Ý16íW÷xé/ãû,äáD{NÀÑÀ¢AóäÀ\ aO/"{ï/¢g×,ܹ; :ôí¹±(“Ž—î€­‘ÜK³U‚ZåZ‰¼#2Q©nè0R}ÜDe½àU÷C=òì/'ÇvÂÍ!Ú3Ì2§Ocj:™Ž©¾ó,¶pÀ%÷µñ¬Í¡±m.ì¥pU…Hób«wRV ˵fZ x~ü.¸ ´p‚S ]ÛÚÚ™É6ß=£ƒNã{ñ6ð;@„  AsΫùI›F왯Ç=½Æ½teñ+LoÜT€§úGº*à®a[zñÚÒ/]Û×îè@/0õ4Iƒ©#íU³Âzlx=y³ SG6+w5h}ëØ¦ÎMçÙfOÛpЩÀ\ë3à²r nÕ&Ĥ¢Xì4{[ù=6ßð}%QB”_…:0ôEZ#„_›»×›I‘$ÙGÝ/©äÚýp•ÅýØCÒJ$¥Úê'ø$yÖå쓺œ}(öI]¼òIèÛø$´_Ütê/ËÃpþï7ŸÍïÁ“£t%¿ºû\G˜f°a@çÕ„Ø¿È,S÷Ýç‰Éñd/fÂì-+øÚn΃Åìê¥4°ÕÄc ‘Ó b•§Z †­C+thÁÆ -(àZ À+x!æ /(M`_„—x7"æ NLsåÃbeµ{(£e²W(s+’æZèꇄÓD—fe\0SˆÏÜÛôþ|+ÉsïM@7Áw?ßJ„’é;¼)Ûx¸ÁܹƩ JlpÉiàš`µ*]þÂ! tA¨?^ ùƒ Ù¹;ª28Ó"4zÂ4˜ªëlPPÀÝB “É<²­9Œƒ‹€eÈÈÐ æ|µï¤t&`!ÂN(fr2…˜•é©\&Ï–É÷’ƾi8ñãMçb--¢ÃeÉjSuØKúEN}97ˆé¯.-‹è×ûRG³<yÓ,] Äü#³½?Á<üëví+Ü~žDfš,DorÅÖÑ˼ÙBÏš`›[í$h1àùkAÖ4Ëaî3`½Ü]ø€rOÈ4Üþ[‰(’€çŸÙ­5¨È«aÐóÁ­…T ЂóßÌ“=ºfw9@´R­Ö£9_\Ó05Ø‘` é7W,$ÔDú¿^q0 ÆiN¡o®”g"Uêz¥[«å%è3_¡±W¨…¾JÌ8^Z¶’*S²ÔÒ_zI ~z–…‡·%=/×FæœË9­,óȃØÿãsͳ‹mÍ æíÔaD×yÍvr-EZ½.—,åÍ\VÏ€çᬶÁq~„«’®à»ú¢šñøsþ©ó*ÈÖnôSéJÈêÊÎGFðÄlCÑúq#ÉB­r¤Òœ¯ÑzõƒAjGIí"¤!©u­ü\!Ú@hÇ&(ýÄ€’Zh,&ÇË‘cá&cˆ¤ÍP¹ˆ Ì0 …Îù•9[JŸÑf>ÇÃM|Û+AÏ0%é õÆ=ùG+l. žhOß¹ñ•éÎ⋇±çŽø#ò×fðõ„¯]ŠP ´v2±¯5:¿ì¡çð8ôMüVJ•g¦fÍÀuŠÅO#ÜÞ‰ûìx0çP‘‚Ìhÿu±‹üX7ÏAÏŽd˜®A#œ¹oʾëÍ >ÐË€P_”NÕ;ê­e÷œŸW‰Ð×ùù~ R¯KÞµæ*³:èR©„f©à¸Í¿© øL¬´†”UßÖÁ øº8Cy•y¸†p––ÙÆÔÖϤ%Ø3½º@Ú°¼ @ª©šû)¡ŽåÇ(ò}†»`=@ú  ÔlGÙ3æSð·Ê~b}׿¶öOÀsÆ¢7ŸÞ†~]@8+We›À¾õRÈ©ómÀ_ãþ £”=ï endstream endobj 383 0 obj << /Length 2698 /Filter /FlateDecode >> stream xÚ­kÛ¸ñ{~…‘/Ñ+‘Ô+¸ìmŠks¹Ãfƒ~è¨bÓk!¶äHò>Ú?ßy”äpoÓ¢X`E‡œ÷p†NW ü¥«*YJ‰J—«õáEBÐþvŃë?¿H-^ ˆñ óíÍ‹?½Ë²Ušˆ*©ÒÕÍv~ÔÍfõ÷èrWGÓ_ÄJ©(}skE—ÝáP·¾oZã«M36ííE,UZ¦Q*/þqó—W7ž~&åw2Š˜ßršÏ9Mu!òU^j‘*ÍÌÞ5qÓñ¡Û˜x{ä881Ã}qªDšñ¶Ÿ·À‘DãÎXüjޝ¡+ |ò°ë.dÝ´Œ€TÓÆÇ¾;ǵ4)EždnûÝE–GußÔŸ÷†©6M‹°ÍkœUÀ‹ƒ[Ab•WwÓ 1C1*‘T••'e"Ç}<>â?f’™ŠšÃÁlšz4ûGÈè3±o¶]o€âÓ`_#oÚ“mÖmH*:öÍ¡îíYV|ßïLK¼%K¦îà½ÔÀõUf‘SâE†ˆ€V¯ÇæîB ‡9ù šÖ"¶ƒéǦkìÍ!.â¬*¢›=5¾?oâ—Vs@†4–ç üKg5~Šè éô‘'Ÿ—ŒÑÞ¾Fâ`«ŽXK°káÀºß0x0#H›°|0c3ˆäCØ$cßíã½ù=IõƒAA²Ô* Z¯qã—ì·ã53¬ë#Û™qóõdÚµÛÛ¸3PPVT³G7%êª%ZÃÀÖZï^! ãÜy÷ïŠi0 R¡3¯&Îɉe%…ÊÓ¥œAzJ$*S“ORÓ3jZç^dÑ48•Ù(¸E¯B¬š,jw´v0ÓîAë!¸í0ð6¹4BÉ»º6ýðÚ†©ºÌ®v¿k•ýq]“#+ÇONƒ±n?v 1Üd‘ìZÍK@ïдõžgäGùœ>Œm{ªM}ç¾æƒŠ<§"ÁZàèÆlëÓ~ä y|ƒÖKU! Yzû%YQ Ÿ ÏHHœÊ»Ö+:1–îˆ\à R+—j†œî€zž¹ÒÙ%¢8 Íè*,ˆÖ¢ÔÞ»ö;\ózƦ‚ÓN i»±ï£Ü‹ŠÁ¾7¯Ë%ö)¦µ½ÿhÁœÂæB8óÆY.du&:h냵'%piÈ€ƒMÕæÃ»TË 5dý½Á<üïN!K9wŠn» j³i)—ΰŠuš‰4]ÿ¯˜‘ÚÛ¦ÅÔL°8±ªsÈ õΓnD^˜eâ=‡7ý€¨Ÿ Z¢’saÍÈ Ö±…Zô¡AíâJ™Gïš~°¸¶Ý)­!Ë&Š- _<¸u0R~¢#Ìaõ³œáÌX3 ²œ­àZ<¢ŠHÓ)÷8©YK¢käpW··tO€£Ü¸s· *®lñuv¿fMîØ•ö ®éN¯€Þ=v‘x®Ï„íx(º+„”N*‡0÷9À¶v²"Ô2j¶¼ÈR=^@æ{Ò³/nk(úúÑ9ö°î›£-<”Õ-… i°ÇÝS¼á\já)‚OWSü•3ð6Ù¥hY›<óª°ÁZeçZÊM«ò±GÞU¡£A¼Wœ*mË<5í%rဆœCcUÊÈ0°lAJlÍ—|Øàê$"¬Ü7T­ rÇ_´Ù|;ì˜4IxT$—Ä>Ì×ݾkˆ¨˜çÒòiÀùàL9–3kGWá"ÀÒÄz<\¼w tUg|UsŠ'uüެæÌ_å#›‡ÆîôD&½,˜q¥Ñ™Ö9³è’EÆaý›!Ä8ºoö{yþpb/|ÓC9š ë¿Çºù8.nʉԔð`‚‚Bвôµ¡ó¨Û>É7š‡+êGž°¡Ù™ôó \÷%{$€7 ¸œø„TR‹ˆ{ J\+‘F¶Ö£ðç#ÈëqGjQúTKŸJa|è†1à6àp;Œ\!Ï£ØvË?·ì‘õ›œ®]ú5ìFÆ&GFµ Öq¯M½±qˆ¸4j>k„á,P|à'ÝiŠ{Ô¬ÝÜ£‚UáàªCl®\}i+‚Òå…RÍ 9Ûu„ó{®®mݪ¨È«Cmµ„±.}u¨×},+‘çÕ¬fL©ÃË]‡§g®áŠÛ'Jeî8t‚Ò/‹]â€Ó>'mN牜«í´æn 5 }Å,í;Öî´uÕ.éj¨®w×ÃÉÖU:úzEv#kR„”—,kë†j)Ré+é7¡ Q^ÉÛSK×tüÔ…@ÚUl}è@ЬÊÕ7Ö]Aî xY¨þ9þ3‘å¾B$ݦ¹Ïð8¶™F”ÆÓŒlÓ)¿l°ò~OHwL€+° \HT×TÑ» p² ˜‡ ¶7Á>$ÍE‘—Ë;ý²k©‹?½‡•Ytj›;h ë}\÷·§ƒiƒ7ë/ø&p}ú ¬Ù}ÐØ¹¯ûMü2{|ßõ›@ ;bÝôòþÂ1ÇÓø2¤VÐ…8cXš(›þaT8±-¼¶iÕzGº}ÍGçrù8—ŠB{—»ŒOOtxY"çv%|p&cf:Ï•Íî8q^¶G‘@xœ¹YØß¾Ø)‘øX‹WBoW8”_⟮Þý”0=ý‘|àú‹LM’N>œü±|¹2“KùÂŽòœ|qY®à8T…29™1œ¡1<Ó¹˜ )qŽBâ·?µ€.†ƒYrHóBÈD-ÅšUà.tgIÊûÐ7·;[àtG™1†fcQðâ|³/ÝLsCCºîxl…ó̓…Ÿ¢ ÁO Ÿá~`tš‚!Í) IrþPeo ÷23o&°8àÛ ñÖEôÞУ±¬f]*NlÄ“y·‹óÞ¬»Û¶ù—±;ñÊ(z;:Íßšz^ §K:ç€(6V÷ÍšÁˇP ‹5Oð R }P=RRЬÈÏ‚syN.Jåƒîêãeð˜t®ø'ÉgÇüøÛU0ÆÁ•þ~†Þ¿ûé ¹ääLÏ3ôáêoïþä(Só§’ç9º¾º r¸ÒÿÕ1Ÿ®?U´xõ žq£DQ,]å}éÓÛ_?ùˤÈg/ÏTfº}ìOóŸèDZ;Ã0 ²‘ÊBhéEúø¾üˆ/ƒªV™(¦{à åy1ø]ÞèkÐPÙŒ•šWæ 1øö š•tá×SèwE á´(&_†È‚ Ò‹áºó5œ…”Þ•ƒ•Çâ´ÿS=*«ï(Hu¸ -t,H' —fW"/=9×~`•y´í¡Í i0ÕT?Wñj‘U>†¿-º˜­øå› GüBo9áeJü’~Ù ¯áŸšÞ¸_5Ø^/n¬éúÐóß pFM;|óI8¶²^£.4ýŠ)ñ}IÙc°9ÜCÆôPŠ(ù§2­þˆfcIÚ)p«|=A»DЕŠ>vN©P•ÌC±jj[nÛpMª!{úøº?±Ïë?½ïí«ûÔÃdö;›Åæ· =ïÑa‚?ç¸ûzßÚ§z~¢ÇŸËÿ¨ìB endstream endobj 388 0 obj << /Length 1877 /Filter /FlateDecode >> stream xÚ•XKÛ6¾çW{‰ D¬HQ¯ÜÚ éûÒlÛCR ´EÛjdi+ÉYoýíá²äe¢, C5œ~œ'ù*‚_Ñ*‹cVÈ|µ=>‹Ìl·_Ñà·ïŸqKa8¡üîöÙ7o’dÅ#VD_ÝnËÕ»àÕAÝ º[‡qüå:”2 ^µÇ£jJšü¥j4^—ÕP5ûu(bžó€Çë¿nzöúv”Ÿñ•Š"傦"J˜X¥¹d<–¤ì®­ëv-òàÞ¨!‹<Ðgu¼«õ‹u˜ÄE°9 8M‹J#A»£çpÐô©¿ƒ ÀÂm¥jú´E–Õ©­A§uÔ= U§qŸ wÈcÆR¥ÓÛvßTŸtÉð+(ŸÎ”ÏYô)ãœèoÞÃ.^…§€8IpjªºëUªn:êfð±‹ÎôèÜÚN‡VeX5Õîªz®ßT ~ÇùnÙÍ›S³ª¶¡×Ÿõ øÝÁ þðÑ~„…YT’8P@2 àD²à#bhçÇ31lS1eËEÊUЖÌ/<ù„ É .QÕ[y{UY¬ä©Ñ©é–;·WÏá„“\̰öȵb<ÊY,œbï£$úçÔ£Íe L•}¿GHÆÉ†&É aâ}Äeç–ZÄ€GKæi𷼂31ïlN>EÁRžÏ Æ»ƒŒñ|ÜÁsòlDŸSXña5σ â‹°âÑFyâX{­ôQ8ÊXœŽÚ¼ icèùÛ'&ŽX^nÉë·¯ˆö>dÀm$³Àdœ%â ˜ÿ|Š$,¹y…ŠQ©š^wà !ø¨ÏôçqÁ9‚tqI\a\’váQ1KXqÙøsæ¶~š¡-,JmT¿5Úˆt1×!G#äÁÞZŸòNÁ¬/v½oü^ á:NGäjÛ“0cè¡¶Bu¿U6ÈÚïúß“n¶Úg&¢šy…š}\'I ªZmÜúûƒnìÂ1Vï0䛂‰ôêL?˜ðcÑŽô9Q4‡Šb«×$26nö[: -œl`èÚš&î:Ž|f>I¡á@ÒŠ‹´_—¥•¥IpqjŽzP0Ê¢Q(Í·=n'(fù˜ÁUö4kø’ù yKOåK*¤ƒ€ä?˙෢à&Öá·  «6tt%Í)zm­ŠÆ4pœJw^G)rHü£IîÚn«C”ÂöwÕÙ#&E2 ϽÖÞa”%I6K¨®²VGûVbÿ9A •«šëJ(‹d¼’YÊâD.TCŽ:œ{*¢k¦Fö[m&Î`78äÁ»ß øÖÆã5ÍüؘÌdo0›ÑÛ2h Rç¿^ƒq.YŽêLþNí-0òz³"6E‚Lc&¢xa¯–8œPûŠ¿9KwœÜïg9œ%ìÖzÑÏlÜ,ˆ 3ë~ŠoãIêwʰÿÐת?,2ŸìÇgȘ·2ÇùUÄQpó9"~ji¿e{Ú€ ÔvûÿžÚA]ÒÒQuüzÂñÄ&½^ÁðÜ«êƒç‹9x®`žèµ³Cûà³9=HÑ=D滃¶©q¦]~)bãø–ØÌ´öÍ=|íKyÆdºœÓü:=WL¹Mѵµáw—¯pÏXçºié¥4ÀvŸ›©9·å Šæ™×Ndõó¢ÆåÞÔåÞ—¾3‹Ÿ­Z²oUUF`›êý׋ýÖ¾Y’3Bp§¶z‰ñdåãR×zÐOPu·Ä²×‘Ùi]>A×f‰s£ïklп^Ùn‰åVu]´ïôpêš'¨<,ñ?´]õ‰Š•AÙ:jP›'láã’ª0 Ú’ù5ŠëH;v³HÛ4þ“áP‹ÇŽˆªp šTûƒÙn¸ÁŒSוLÝÚÞ. ¿¬OöÕø¬´w8hOm >éjh¤'¥ŠYXJ#P}AsÁY‘ÓÊÉÜ ©­í4rÁRh@¦%Ópè´5”²ÚWC?IÒ_…ôÙÛçB{žŒíÿ?ø–P \"2AÇ ÎÅ,™cÔÑ´ƒMá†× ²@OÃÁñ=@‹^Br4Ãr¹©¯|¨CO.–6:ª)¦ð'n &Î”Ðæ(ds÷wК†Jò(Ðävº£ 4˜¡ ÎmãŠSæÊ žŠȺö–ÂâÚÈÚ®C ‘ kš‹(E÷v9J¤Kx۸ć/§Û#¼õµUS‚›d/)-ÂèCÃ’Š[n.S`ܘ”ÎðÞŽ¿7F‹’Hm[#r&¼®éOÇñ³åH­þ\àîÒ£ÃÞ 2Ï]Y`QZÊ\f6SWYf®[$œóµHqÄm»ŒlÎw Ú%K^5ôyp‚0‘C™¢Dù°Îe€ €±¸Ú3ôÁm5–<†±®id«-ÉE L¯ð@/-Èíˆäúþ”ÇtÝÅcg]±SÎÌÁQ 9Åȶõ©´¶ø¹û!™üRã~¦rÌ&·7ÈÌÜ"}+K¥\,G³ùu v=ÿÍkÎÒ endstream endobj 393 0 obj << /Length 2710 /Filter /FlateDecode >> stream xÚ­YÝÜ6Ï_1W¨ˆUK–üÑkúÐ )z¸§bß.¢õxvÜxì‰?2»ÿý‘"å±w=ÉvQ –(™¢(òGŠ–›~r“G›4ŽE®³Mq|9jw·¡Æ¿½’Qs1”ŠD”›ôÞÓ,“,fE"“™Ÿô$æY‹-‘ªÔOú­š¾ìÇ©Ië’H×VK3arù²ÕP5CK=T¼¸Ó…×âlÊXHCoÔpî?­î583Ëw((øÿÌÈ(CtG 6)°‰E|M˜%BoÀ–D*%1’" ÞMb0Á­­m,"žVj‚ß›j ŒöC7C¿¶qp ¶ã­æÒîjgÄ:Šƒ æX6xîðº£YzìmQÕ°Œ< E0:;VµíˆúsSûSÕ¡0ØFmâ˜3A$“ìµ'OÀI4u_ÚaìJ^¾Ý»SˆXý¬ ²è8 Þâ# N]yê`)®(ûÞ¹ŒžUgz ®uÖŸçžÞ"û~ Îí-GÙÉ“àËÖ˜Àv•½­yÕ¾†ËDg1@½uëó”uº}ÛËsìiÌ›V´°)ØòX„&°kxê`(û¡<:¸9”]Idи ¸½oGF¨“ízV»ª+‹¡ú‚»/{¢YÜ.m›kŒBe"W9Iõ}µ_õÄvŸÚÎWPÂÄ“]á£Ð·üœÂ[.È ^ôohù‚S<€®S§èíŽ[·¶wš× Ï†ß8ðXéáGd9;‡—úr>¡Ž…NÒG¦WvÇÊYoœgþ̉ôGX¸h© ‹DkBÞNuU°¥Óäé=ï‡pÖIœ;•ÒËåý@-gsvh¯×œÃî)h)PaËô40cСs]'…ÝxSµCÛ¡Jœ+Kj9½÷ÄÅ)]yUB£t~¢Øhç#µs©òߨKƒ±©Á5i¤…9ݹê×ü i§C4Ù¦%#/pÛÙ¶æÍÙ{CçÅü<₹K «¾|á8] ϱúc»+_nöq>…DdôfS¬„Ò“å#J |’=?ò6ø˜»ID.ão;UšM÷ N £žž#9.׊ZçC‰‡DÃhž!ù„Éã8_š‡ˆ>ÈÚ=›5ñ5èX+/Yy´Åj‚Ü'“¹ŸŽ´ÂJjq ó_ª56†“ M^>–%àch2‡­d‘@Ý@þ ̱Czâm¹'@Õ_cS8_&µ€ÖÉäGg×üždi*a1Ô÷k )"3 ÀaTçâD HW?P«ÚÓó’ö8jÏ{ÎŒtZ ì£ãHqy[ÖÍ;Us»½nÞàû©Z±Ë–K*‘@{O„^ŽO‘œL­ã“ÙE¥„O*7ÎIRtìLN‚r•“‰!¥jŠzÜñ°›aÏñ¦¨>DR4úÉ%*ž-X$£$H «‹±jʲtÖ¼6>‘¶ =§˜9ÏørÌâ>%8FOcp¶'w¼ø¶›¹¿=!#ÞÁýZÔÝ{8U¢üB.wS’â9ÒÏHo»õüìÁwÕÝÁ%ßÔí«`XXÌü¸~¶¹0äóœ›2CtÜýK–ÍÞYD:ƒg€KÌ=ƒ¿E„‹Uî£~Šp7Hh5öÈ4J f“fYô(ÕžŸ\J×vœ,}•ÅÊaðÊfJÐÀ€Á¿#h}‹vÐYU§ŒRpÔIYá·Õ)ðrÁq» |g9ìÊI.’tòÅûk^ xaô´ˆ³p`}´Ãt¹™6ŠÇ±L³¸{u!à ™)Kc/%Ò–êL9Ç‚9í±¨À¡2{îʽëç¸:½–äI#Ô¥h=Ïb•fT¶‹Š‘|0#DƒÐ©•dßÏÀ K]–2Eèî;el‘"pÆÐái͉ãDdés¢,žæóKâµÅ„Ëõ¼HDúÑuÂvw£¯ycƒ9vlŸ„ü“ÅÌ$4€&ä÷éô1%Ã)w4™?»PbWO3-¸ŽŒ.%ÃXõµúv<¿¨B’´„^”¡ï :šK<1XzÄWWN´_-;³ç}ÆÀJ“ûnáOÌuÒÝyZÈsÁ‡ûC{±VMx‚<ñ@» $ß—ÍŽÕÂßAæYß¼Šz-ó[°»ä?ù£ôU_á[\áúcÖêÔJSýŸ|Ö”ö¹‘é ÙtNçw`˜úâ[ošˆ4Y~qrߨ‘ßYª‡"Ê…ºö®³GêsU› LržpA¯FT¾íl÷@}²Tÿš® ) º¢, z[«Nšy8¾Aþ þñà.È#vtP؆¨”u#iOñJS3øÑc¨ŠÑ}„B29Y=z+G•ÉŒodŽg;Ö;j^@ÍLå ãêÆ´+t±).+$Ѭ”D‹RBÂÕTxúš“a ¸óóGhXæð8·Gâ‰ÎU·¼ßfš‹¡]fVãC¤ü}(‰ŸÀT2 ©cw®²ŸÄ$‰šoŒ?ò•ŸÇù—ØKv Öç±…SZ ËæwE­ÿpÕ•_ªvdÄ:oÝÍŸ¿°WŒt¿Úþð7¡ _ñ_áÿsª%Á endstream endobj 396 0 obj << /Length 1343 /Filter /FlateDecode >> stream xÚWÛnã6}ÏW¸i€Ê@ĈÝRìË›n‹¾t7oÝedÚ&ª‹#ÉIöï;ádËQ²A€h8’Ù3gh¾ˆà/òh‘JÉr•-Šê,rÚv³ áËogÜÛ…`Y~¼;»ºãXå|q·>Þênµø;¸Ùê]oÚe(¥ øõ2T*nšªÒõŠ”ÚÚôie{[o–¡<ã—ÿÜýqöénðÈ(fC<>Ìæ€¥bŒï/—t1 ©Ì§7›?‚E’ÌžÀ9S±::"ŒeLAQ¹zeÛ”ey>¬ùé=ûBHs ©Êã)Vœ¦Ö•—*Ló¾ëitqM?ÕºvIÀáºm*ò³ßY—,“Ù¤~ŽS%RI©J}ªHuï‘…òÓÖ¸vº0¿‚"—TÂ"Ó“ ŽçW çnÚêàîLezç#N Q‰iˆOæ[»ÙâY= ·”&:(”ÄxÔnáO‡_ûÖ‘#NâÚ¯Èÿ†þ—F#¼yì=;O‚j¸6Æ,ákÓ¬°Šd||×^cÊ_Ùl†õFÛÚ-QH³KîV¨ø¨ç8+Ë™HGbƒÏ7›¼>R/È3)G£æ[Äå+…ñl0à¤Ù@-€à¦,ñ=¹ÄH¥ó¬=ñÁ¼í¼òao=:LMppçP‹i$¦9ìj†ýÈÚÓòÐFÞ©š•ù`*]tsÞ'(ŽÞc.hk`颵ì® «@SވǗ˜Áë¹ã‘˜…蛹ïRТ\k3Ô¿CôŠ4@[43¸xŠØÎø¦Úm›'·0´uý¤Ú ݶþQgäê¤1^˜²ûaWôoŽBbk C¿µ^sßêºÀhliܬ‹Ù¼ð8;FÔ9wꀈŽñ´²­)z€‘ŽKCëKA"–L±§ž…Žç,)]k[Bë›Ë˜ Kcq¢!~o¿(i£uI§i¯íŒ©ã'ˆíP8<ŽpÚ—Å¥7Ân\µúmt=ßb‹#ñŽˆFéá]âÜœ„Ì| FðÖE¹_™w†"’/²Aônä-4i;¨G ‚QPü®M:“Žl­â¸Ýì«Hãž6 ´ð0òÖųÞâ%³’'ØD ÷Ò\o:ù¦%‘quO:r ˜ Þ‚Áí2Sîy‹6‡œ©8÷m 7™’ZžD­¼Óã©3ù8©è+ÓW¶Þíû¶˜%³ìø95ON2g9Øœ°“O°c“—§@;7"nAÏl?¸w :“°:Á×ÜÓ8ø½¶=I·vþÉŒ ?/>|QŠ> stream xÚ½T]oÚ0}çWDí¤‚T§1I TÚÐuZ»­Í&¶“8Ä*±™cJù÷sb'@ iؤ©=Ÿ{Ï=¾÷BÃ’ÐXFß¶ÍãAÒ²òS>3x¼mA}È‹`ëæÈo]ܸ®-s`  áGÛ¡üИ´Ç1ZÌ;À¶í6¼ìÇqÛc–$ˆ†êð3¡X¡ëBgе¡Û°×ùåj]ûe~·Ûm(4»ùVio[)„žé½¾<ñ%ö´#‰nÛIªPDæX¡€QÁÙ\Ÿ‹XOqŒ^ãê‹Ôÿy^R†],…‚¸¨.,)²8)@Û„.ܰàlÆQR&C:Ä2Å•ü·ßxÄ(ܤ“)G|mv´\«}ýJÒ> stream xÚVÛŽÛ6}߯”j¡kZÖ®·@¼Æ¶EÑMà·¤´4Z±+“Z’²×(úï¥Ä‹.‘•À€E‘Ù3‡g†ÂÁRÿpð° î£hñ°ÞÉñfÙÌŠçÀ >ÿvƒ­Ò†¨cù¸¿ùù×8ðrñ°|ÀÁ>ëºÚ§Á—Ù.'¥1GQÍð/s´^dz? KÍ䟔=¥TQöZô ?–(˜€÷‘$‚»h9QfD8쌳 f s( 3¤L«‰$Šr6çVÓÓØ=™X$ ¥6Ȳ$*9×Ðè[Ú<ÿ¶ûß?Üþ[?þ«ÁXØi¦2ó’…´¨JŸ»#_]J;Cº¢0ã3v„Єc+ £}¾Ö³{“‚Kw²¼:8‘4䘲ûü4ýO%ÝYfM±÷ˆm!4!Æ€;’ëGè‰nÞüßÂLÚRw É‹,j!4¯_µöu†¦ÅŒ¬ƒLH9ŵiHx­€% ‡Ä4òÖað÷rl’ê¦ÙLLd÷©a®ÏkR ákÅ•ŠëTÁL`y퀃'Û8 ¯“±MÓ>Ù¦Çô…! àøõÀ Ýñß[€9Mì²ëI;ðŠM¶€T3²L Úñ‰O¾èODPâ•ÏÙ¡µ¯Åµ~àÚü©ÇŸ-þz¹5ÏK×z&—£ÇýÝ_É~{8QI}"‡¶Mf.5è³KN„Mê#Ñ%¨ÖQ÷qQ®ãJ9ûÉn–JÐÒ2š“ºYƒ\1÷N3Ê 5w=Bit4²²RèŠø¼ŽŒ?;8*ˆnxž»MOqÝWè B7·ëúÒWëÜdíNçWgFß:ÀÛN2•®õÖM8›ÒHJeYËxŽgª†õô9w“W">zJ$ª¸L$n™@lÄ62©;B: ¾­0™WjòœWýîœù´Ü¥êoW/ûmòÈÝRÉe§‚ìGŒþºƒoÒvÔ÷TùâÝ’âœ0>üêÐõl×΄©%€×°;x¿ÿ8E]›Ò DeK†ý°þ}›& endstream endobj 408 0 obj << /Length 1910 /Filter /FlateDecode >> stream xÚµXKoä6 ¾ï¯l{ðkײ,?¶‡¢ vû@m€º=8cÍŒ=µ=Éæß—)ùo‘M[ÈH”DR?Š’Å&„?±ÉÃM*eÇÙfwziwØPã×ï_ žçÃD2ó»›W_½Wj# s±¹ÙOUÝ”›?¼«cqt·õ¥”žx»õãXyWíéT4% ®M­we5TÍaëGRdÂÙöÏ›Ÿ^½»qöU=ÓQœùÔÓdê©Ym’,„ŒÉÙ/¶°PyïÛŽ7¿   Ò2Šf}Yíyx8φ¿þ ¯ü‡×oiÞ냨…#×þ7¯ÿiÙà–/ÿ´l²êÚì¢Ç¢¹óë¢ü¢;¬™ùR7%lF¾zŸ q ã$B@üñ£$ȳœ&‹ µIä}W5eq[c Råýª‹²¦°¥.š=éœÓ爘 7Ǫ‡ðBp{½ª¶¡N©û]WÝbÇÓ? §˜å”ñVMúq®©Äb@®ÑpoˆwÿtI"-lã–É£ùé£ ñòÔºÔëÁÿ”óq$"·3wDJ¤¨È!¡4›Ñkуƒm¼ÒÍèÊt• €"€Mú'A(ƒP$sæcË8&;ܱŒ¥ ¥EÏ}·ëY¸ò4ˆe6Æá€(®Å+7Aáy¸×ù©–ŽSSF²k!›ÎIÛ=;dõgsôÙ¡´ 8‹îQK’zÝVá‘ÿ>å\"· ,i‰òŽˆòÌŸq{è§Ðô)’YLÖÍÉ\NL7š¡š²êϵ=Þd¦¼c }8ÖÕáˆëVD–3gÙ̽ôtüLÇï·JyE}á®ÁŠÇW¨*•²‘€–O6|ÞO™fQ?ÝàïÚrg Å$ˆswX€G œÖ wj¯x“…€“¼N7¸ÂŸù´f ‹}(Ó5s°÷ É¥L›ž{¦NÉ(ô ŒðK×|a“äâošÒ¾+jÎÀ!Õ<Î;[ùØçRAщ‹–ä<’Ž ûk8¶=W.ÒkÚA»ú` ñ™÷Œå20àREAf®´‚ŠûÕè ¤ÙûméÓQçºÝÊÈ»G ­Ä‚ª{’òFoa#Msývï×îZ÷!Tá•_ÀX JƒÅsÝŽ'*¨#‚,0䢦aï8&\mI½è F °£ Nw÷ìuÏÜÍÁvR[…×Üø¡=qëÎxû¸rC³¡íi.8Ás¹Æ]ÙkèúŒ œQbé^®a«Ÿí*´Š÷¤ï Úì$Xew«FóÜ⨦8 ÆQMqTó˜±Õ.4¿£‘Fr !¡Anåö†}Û=À|w,º)û“Ò•b“  Ÿ Áä´î?%C‹_2Å/q•ìz?hЦ4%—þ}h»róú_PTZŠÂe‹]I2Ú¹%“´€ä“u:Ò˜K&¶ ÑÁ3Æþ÷-^#:ªq‘­P–>{cÖ ¥µó>0 ¯,ò¿¬Õðì³ÑÑo‰ØíKOÇ$Ÿ²/É8ïr›w™+CÐ4ûšŽÍž88bj* œ;}_µ—žz&è±À{®R!‚)-˜IÆ`¢Â˜+d#håÚØsßY>Më¤oDx@,JγýÖìÐ'¼—Ç1åþžÌcÔBû(Ákïéƒ+6úâdW˜3ﱯvpÿ¢1ã,µáæy9q»mJ\ V`œ«àdÕFiìŠ`¤ì× >TuM-¸“Ñšc1åJ†#Ì€6¼½+óxÂ5¯”zÇ ñëJéµÙ}î}°â<Å)‚]¶î{Š Cv äCqçnV¡w9“ôÔv,Žøemâ9"(ÍVƒÄ¸ ý'oKUK.è« 5ø4ûÝý¸ÖͰ3l¶wƒç®5Ü2íúÒ/îÖ6ræC ~ÛAz•Ãñ¹i€'Þ™QJŒŽÒp‘(y‚Ýd6ÓÁò[K¢†¢ŽüGyË2§„¿« Ï|5H!^» XÍðp²) ì=0‚ç$§ S”¡±H¸/#ÿ¡3á?ô ‘¦sçߊ@0¾­7äÂÈxþnü7ëBÙ£ endstream endobj 411 0 obj << /Length 1780 /Filter /FlateDecode >> stream xÚÝXKoã6¾çWøˆ\SË*ŠÝÅnhzHsë #Ѷ°²$RÒüûÎp†²¤¨'è¡-Däð5œï›-kø‹t½HÂp•FÛEv¼X[©Þ/¨qóý…ày>Lô3ßÝ^|õ1Žb½JשXÜî†[Ýæ‹ß¼÷Ù´J/ý0 =ñõÒ¢Ø{_²ÊIøsQ)j}È‹¶¨öK?ÅVx"]þ~ûÓŇÛþü8ÎTg¾ ©ˆ’Õf±ÙF+F¤lU·pxšz­ü¼ ¶ž¢^×Ð÷Xk–´YQ«®XÔpÅ“)2Y’¤,ÜX­ñ»õŠ[Î¥ªöí'M³NkUᮬՒ¹ÝÌ×ôE¸1i^öF, ~#º öZÉRÇáXá)j;5pªA3y°Ñõ±á½š²3“a“i¥*>y{X¡z`ìÍÐØ~ŒÆöüOHã¬TRûyašR>ÑòOëx}í¿÷KhÞeo‚×L/ÜVok´ NXv…-²=JË­WSÜ—ŠÇú¥`§cQÉòÒÐdت.Ë{™! ŸIvß}Z‹Pi»6íí(<>R«\Kœÿ8ƒ›-ƒk1¯h î„Ö«ùUa{äÉv 4ê†F&ˆ†l Wá4DazH‰³t’°xá­¥|Eãh<°'Ü?ûÙ™¼d;¹<œÉ¶[2Y‚&ƒÕûÑYÏ&Îj0$ÛÓÜ´¬ 7lÂMìˆõ&ôã0ñ~äÑ}ñ`£FEs$IíÁÝQé"c¹ÞC—ôAõàÝÁº-ÌÖj§•9(CsûÝ{‡ ñe¤2û±huÇd°à htrùWqÀRúÑ'Zÿl çóà†î6 ³œ^Q¢xÇ‘!W;Ù•í•[Z˜q°ëìú{rí®Êù^ Ü+\­A£Á½‚`9Ä*Z"¸>ç$Ü0‰½Ë4´a;ײ*š®””œÂ$ònÑ߉^‘÷CaÚZ?Í™±IWÛ”ó‹Ì2ÕLí÷‹zíƒ/ÈHB.ÇÚ21/ SD*·wö¨7âu8¾úé>Lü«±«RV1pœ¶Öjâ;8 ÏHjŒ›O§\â’;JkÁŠ=f8Î-”gF«‡¢îŒ?Ò™’As6S¯k›Ú\uÞuçÒë%öñêºîö×QÔèÅ…&Þx;ÕÚÕ*a¿vI®‰m§3-ËÈÅ‘Ìóa6 N>Jâì CeiØcÔ°ƒghíA¾îúJ­k* ì8—lÁš 2Syóîà¹æLˆ*õg;OõFxBzw»Z?bô¸$Quxâé\8„B‘0B ™ÚÐá*T™Zt §Þ’—üh3û? KN`°áP­v%Ç ööÀ> 㓼 Ÿ{¾Wüz÷§kÿ›·âF½§÷—ÄØ£M;E5!¬„ê3¯¡ªüo.ðíùÅÀ7PàL[TM×C Ý ô¸B(Vju5ýd‚AÅQ2È„¥ ¸} bžé1?»TzPÚ(ß@á•æœQŸ ò¯¸‡ n°> <(;’b¸n{¥A`kÚÈårŒ+¬¨ÏÚ8ךDÇz\?ÃØ]×\ºœÃGÛV qü9¯ä8½M> stream xÚåYYä¶~ß_1DŒQÔAùmwã b$H&ÈCØšv·°ÝRC‡gûß§.J”Z㌗$Xìˆ,‹d±¾:Øê.†ê®Œï ­£25w»ó»˜¨ÝáŽýý;%|!0†ç‡Çw¿ù]–Ý©8*ãRÝ=î}QÏwÿ >«Ë`»ûPk¨/ïÃ4Í‚íù\5ÏLüSÝXn}õ\us¸­Œ ’øþ_|÷Õã´~–$oÜ(rÞî4_í47i¤tÊ;=ÖýÐv×°·U·;†OÕîÓKÕÉ&¿‰³þ+ÜÑúÈYåw¡Ò‘ÊXÒßPÂ}b‚#L6I¢°÷éÿ²H Ç®Ä¢ c™*»`ê¾í¯ ÷CWß«•„ÝvÏ_^­êª躗UAE`‡{øK+[ÛÌ‹Á9@S¼kÅÛ€£LYn™Éº@Ø]ÓA”pœøÖ Åé3_`e´uƒ«Ñ}˜Ã÷‘G³ ÷µÜx$:Œ‘>ö²Æ¹v¸¤0VÃ¼ÎÆöŸhU{¨›†ä¥ÆÐ9RS&åâžöV*{«{æpߊyš¶ ëf×Ù³åÃT'—CàÞT R>\yìÙî«ñ4<,6É{h!Án‚@–Ž8Ò"|v„Q<ÀH®ƒ§q`Ös…«^¹#Gö;4„ -ÓùZ€ð2¿ƒô~Ûb÷¥a¦O÷,H9ÑmÃl}{ÞÔ6O¸Ê¢`Ô}$ØX€,dp$**•ÙÄØø/³¼ Jš†„ aIš²:ÌY ;sÄ6šòMWÜ@”Ä(Ã!¹‚”‰l„²•DÄÕ†Y¼vœc=Â*ØÎ`CV2™Åœ°¥*c°á¨g§ÜŸN§=°QÀ&ÊÔ¶Å:+x½rÄŽÎ<°!MÀ–%±€ 9ø;M؎χDê„4ÀH6ËLຠq€¡¤^v‘™&3ÌtJ03„¤N0›:3èÌ´\7<˜Aïï¼0‘ÀDQ~8O|¹?+€©ÿ‰¦r–«œ÷ƒ†‹`&‰`Ðb?ì3ß‚J—Á`tÁ°ï"˜Ê=áÎÀh{9ÚÎnÙ¦¸ÜŠ?YÐ\á´Ð$’å.p¸oÅÎ{‰¤Â!)_!I¥‚¤b$=!)'$á`ë*xÞÒùkˆúÙöûSÆù¦Ù*2¤Y:[.ŽÒ­#uN2‰ < G·Üv7mÊ-²ôÆrqlÄrÝb·Wÿßj¸êÿÒr ž­šOa3ê;ÌVúuø1¼¾ÝTÿÐô¯>1bˆØø&V)&¢C AöÛÆódÄÞ®¦]:û}ÝŽ=OX)@gñØÕét]Ííí®¥ÜfRÓvÒƒ`µ¡<¶8ØÌ¼¨NJ¸côí–ÎOJÚ‘íÆ0!¹øG=y¸jä럒Xú L’42l†6Ñlé8â\9ŽÞE-ZƶàyCx–Ey™¾]¸Ûƒ1ŸdÉS-o—¥cðÏéä}˾oIâ>t¡"],(ÆÝÎöýì8 ¨s ööÜd(Þ˜zÀe¼e0{)Š(€qn}5àT¸P^BOy"…TdؘD |jèQ·ø9hºb?Ty%Æl¤ ø¶‘$õ£!ÒÑø¥˜™½zk<1õIÒQo¢™|/¹Á)ú°[[.A)”Û*Sâgð”ÕüàÁ/¯å¶i Žxì|Ê„´å}ãÞàJ²Òb¶R LV*o¥eЗ˩ƃ‘ V¾GÛ[nö+CAš 6Ÿ-TgØ_ÿz&Qí¹îìn`÷e»"£(flå×í ¥èëÒÝh|ÓÌŒl€– €ö>%PzÈ.X¡¶ŸkþÛdÂÛ&?“á{×Í;]êW-&ÃW&£A¹ç¦°yi©ò ªòTàRš©Ú@Ö±·ýâ]+õŸµ6í‡R*"ñ"3=GM®,¥˜d@`Ë‹|©áȇÓêýjÆfäÃ0’Ìþà‹_m9¥"¨-½Ð¶ªfýƒñX%…°<±ØFU­Àµ­r ·Å»Ûú¨½Ø®lA%<Ø!l@QsÌû¶oqï*KWë–ë¸t…q{ª;¹ÝqùfD/«Hiyt–x“b0Œ€ÝU&$ôü¥tEÑïøiì‹«ÆKRêë¿Kг0h\v •4DRÄò¦‹OÓN'Çäì¬?lÉ{0LéìÉÏÌÅ*½iÙRMþìÔ¥ÐÞ#¶áÜB—_ótXþ¥ñ•'ä$ô:^ëò&^§JÒ½Ù%9^›XÏL’úOɸöœw;¿Á–ïmÞÖ%s”´øïµK3¿SÈOÿÛ” endstream endobj 418 0 obj << /Length 2162 /Filter /FlateDecode >> stream xÚYK“Û¸¾ûWLr¢ªL„ øÌÍvvSN%9¸T•C6H„F¬¡È1z<ÿ~»Ñ Š”¸ÞÙÔÔFèFý$ø“uòP*%ê¬z8^Þ%ž:>>PãËßßIæ‹1^p~Ü¿ûËÏyþ Q'µ|ØŸ–K훇ÿFŸÎúÙ™q+¥"ù×]œeyôi¸\tßñŸmo¨õSÓº¶ÜÅ©’•ŒR¹ûßþï~ÚÏûçiúFA‘ó^ÒâFҢʄTIz2îxŽÏ­uÃøJý’ä ü{9nÍKQ<ÄR ™Óüÿ´î ¢Y¤éÓïÒ*š.flHÈ#=îdô”],iÔ½‡‘²ò{cŸpgí¨eˆ Âîi.ÅТgX3ÈŒý:,ž06.ú W1ÔkÝuР΋´¤ÆqGÞ>ØG ÝR¯â01]÷ø-A+T f”^º ØûÆ›"åRê#RŸh–hÀë_™ÖÑèBmkûs+mÈú 2X öV"‹¡Áb²Xš‰ª.ˆWŠL¨]œi€¤…õË<úyW«h©î=.U™E{2ßmQ¤KL€(©Ròò¦oâáŸÚÎ0‚V, Q¨&yfÄÚd'Ýu ¾Oqó[Ø‹k‘¨b­÷Þ¢*#Êg=ê£÷;$µ}Ó5ûVUÁðÈ;? ¬iiÈɺŒNÏ6ßõå¹3L> e^·ô 0NPÈ:÷º%|šb3p!²Ò:ú|¢½X–"@5boæX%R¤jís¤¡ª#? ¾£Ñ µ^Î"ßÔŒ†š:4ú¾×]`)^c¸Î£zjŸ{ÐˈwxFA£¡ β”C»›5žÙŽz4Ãp‡Ù@®²°-Ò¾€ZÝ'yG3>ÆYbF¯Æ1moV1!ΆõÛþy Ì4–Á±¹iì-cZ.Í¥@Ƭʃ½ ,³aTY‰ªW£nÀ#VU á]0a 6¦3ÎÄG°Á5æþúwa÷o~˜ ±”†ÆÊ¬DB‹à­V’Õn¿\ü”‰h@d;Mýѵì*Yq˜þèpÏáfo«/›Rl˜Ü«d”ø†[x×Ú9 ÿ÷¬€®Ugiµ=©–¸ãFÜ*r!«0 sm)”œ8B¸zªJD½_>èÁŠh>)aÎ@?QP]¨l )stMQ¥ÇZK/‹D”ª^ÙEÓ yØê΄v¯eg˜òÝpã3f€H©‘ôö¢.×aˆ€¯B» nN.ˆl®'úøôâMˆ™I߀rys%ƒòæ@âƒ8·¤ü’yí0úL®¢D[•(H˜“9¥ \Œî-/5Ð÷©íºëâ[5Ä*ª¾§³µÞrß(‘’5.™zâ`QÕ¼ŠF`çù-†^‹¥“óA~Óü¯V~«•ÞH?¶Ö·S–&¤6nì„$ !¡wåôFzF’ÑÔwÆÚMhKÊ6HÃØve‚®0}ªÂ<§À°Y3Q¦É%•ZY é³ ©Ê kkh€Œ”ÝÕHZƒoÅÌRãZ>˜NºADVEôE~ #'=uŽErTâ®'¹[Nvýà#ì¦SÈkÁóõÚ×+ý.>x‹¯Ó2ÆmoÍè–ê+GŒ1TkßÞ’ ÊW! Q¥oÝú4rùGå† 3*Nç¸<€ÅÛñ߃j A—Ñó„ïÙGè—åš0”…v8²û÷æëdú£á¤ÃÕ)Zn¦˜Zä×ôÇ·UE”‡ÒÀĵ¥ ¬d¨ݶœÌ2åéÚxNî,÷¯xÿá㛫‹Ï‹Ùš1…¹ û+K½OÖt§;™4‡¸«ü¿’éâ¾âí [Š>g¾»Œ¡nÐõæìK<¡ûÆÏÚB¼<`iûÿÌ=UüÒkÉ…=¢^‹]– Lñ;çük‡<ÉÄïî®"%\ çËן7eåõ6ƒú¢ äŽdQ‘W~kƒR‰¢(¸~%Šzæ0ö¨Ÿ— ÷¢Z(­kpr}tvNÔ™LÊڒ뤂™/m¯»;1µ¨„*·Só8OÓç€F̦Èá“ ŽYÛ>ö¦a–y·4„kˆ5EYEŸówxÙŠÜ‹ MÎù"ðä!u@ÃqC ŽÂ$P}éŒ_° nǦ¾e¦—Öçz²À5ázÈeôŒž3\^Ξoê!q~cü¶'þúÜ‹™°!å ƒ·O¤Óèñ[œÌçèÊà…òΰL]æ‘áö~ê%yŽË4¿uµÈªŒÄ„ïUYì xòØxAbà½¹Ý ,³n™•B•j¾é/bÚ΋J¤å tà£úÍˤûnŽY&«ð^ŠÀy¥Ž¯eÌ..ÜœãTæ¢ÈWˆ:òŽ˜OŸW ~\y/Õ©:g†fo–Z>hŒÖ|y œ׿[à ’£”ŠMÓÓÈíSÒèò]ç×Í.z| óÖžww˜ÙøDÇð¥}æýÏ×Ûü6 1°ZY1O0À&í7ïBU4î î2»<¼ú[FMDRV?¾ð§%0Ét8Ü÷‰çÁR‰m—%Õ¹Ú{qâÄýeÆØ PA˜óµŠÆ‰X`H4¾e64¾¸¸Ž¡ Sï÷ño +.ã7 y× *\„ë…H•¿&“gzy€àÃ0¬ºc-D^ÿn1/ BC6Y>v0î*ý*z¢ZÍ¥—¢šn aä>tϯaž³u–„w;lyûÞ­ñD>í´F>öwOq0%¡åÃ|~Œ–YôoóÁ<<.ààòòj·Îþ¬Wïà$=»Ux…á'‡_V nº endstream endobj 422 0 obj << /Length 1917 /Filter /FlateDecode >> stream xÚÍXKsã6 ¾çWøHϬTQÔ³=uÓ´³íö²“ÎN§Û#ÑŽ&²ä‘ä8é¯/@%k·Î­ãƒ)| â›~|“›T?²Mq¸ 4µÛohñé—nø<`ôÎ÷÷7ßýÇøyóÍýÎu_nþb·ò8¨në !ÿ~ëEQÌnÛÃA6%?V¢Õ]Y U³ßz¡àga¸ýûþ×›»ûñü8 ¯T9/5Mš&Yäs‘¦C'›þØöÊ;·]Ù“J_‚8øÝà£2KkãÔO6>IÈOýE³áqË™¢õyf „ÒÓ˜1µk»‰ã¨imÕ ç€´ˆe?XY+‚"&wäYg?H)Þ!=g‡­ÇY‹»žµgµÜ‹³âñ¬Î’š ~$Ã8YæÍ9“=ýkªªk€)û°#2) ‹ªéU7TmCG#‹%‡Å^Õ˜ÃÚ¥ÔB ä軟ð£zÕO[VŒ©É\x@o‘mD°vꈘÖùMâÙ¾‰…YSsY ³çÉ…<²§¤Geu¿@ =¾H0´gþ*+m¶M`3D,ú+ŠØ$›Ò"ëÚT›vÕ1 a"R«a§d‰íÁ·îK‚ËÑGý »Á”ê¡C'8Åd³Oæp0'ŽÐžÄOÍ…ûûâ4bN…´q‹äQDU‚6!Û£ìdÍcO<Ô‘¶'l¸ðyÝÚ0Èý`²¶WõÎ3Ê®šûaM®9Ö²0*ȩ́PÕË@$Ós^™/>Ë(˦1œ: B:\c‘ňÔã©Ôm.‘)·èµ>Yð–Ó[e$UûGÝØ@p‘¦8±ŒÎAN×9FŠswòAOgÙ•^©jÉ´¡«!Î3f 7Í;’F+SÆ–egŃ’)Õ)üë ܆’9Ù ¥÷¯t™Jµ“§Z'Nx2-6v1ÓÜ–0K<é#'/™]¦TAJ’øÞH6zO©ñ¬>¨µ†Nf{Ò‘ýj3ÕZ"ìÛƒñÆ“.ůæÀ¡7å/Є€ûÝòyF„$ƒû‘ALB ù­ªkš TÔJÂâÏmþlžðÍz„܇€Ä= ¯'\Ì ·ÞÓõý?ê€.³­dfcW»s:®–èk¾v¶1¡y )8OÍDÎÛ" ÐãE@1u.£¶þÍRœb¶˲#>%Ö/ ¾xÒŽ´ Y¶ÒÅŒÙxþÒ„Õ¾jB hzjt¯Q­!Óm\7À×xÇ’ûéôО†·bA=ׯ§®ñH%ãq¥UD>Q09Ó¿¶Éh¿Ã—(§ˆ2 Êilû.Ü&× \Œ„a°è¸x~1#†¡E^Bžr†í`xEði‰-ÑÌÄŸ›o@¡oùôæšyܤ·SS½h½²ê éN·W å.~:ì¦àM/ƒw>£.‚×yIYj-xçáïÌúo‹æØÉEçǶV‹H~sè0âÒ"¸è'†M‰B/X|©@‚ù‚ñF"ä Ë®ÏPÜÍÖ#åðj \_A:‡Zœê‚…LcÁrc×V•m°ÌLµ(XؿɃ‹±´|«ûðj˜ÕEá…hïFH0ÛÆ=4áá2ÌÃîàÆL+³ÑäŒaú€¡šq£wõ7- ZQ näJ¦¸Èº.Wî÷Ÿ>Þf}9õ²«”ALvËY¶—C’ýj¶—œƒ©[ãµÖ f~ŽÝìz€éEa?Ý}|s@À-0ù,™ü¯Ÿ NÐÕ–Ä·¸ôMÒög=vw†kꬬ7yj¼éž¥&ÂÓW< Ã_>Ma£ñ_sk ýSÍÜŠŸðÿÞEA endstream endobj 425 0 obj << /Length 1847 /Filter /FlateDecode >> stream xÚ½XK“Û6 ¾çWø(ϬTQ¢^½%écúHí^:m\™¶9kK=âu}”)¯2ÙÍ´D‚ @|ÐbÃO¬ªxU¤iTÉrUßÄ–ÚíV4øõû7‚ùB` =Îw÷o¾ú.ËV"Žª¸«û­/ê~³ú#x¿W§Awë0MÓ@|½¥Ì‚÷íñ¨š 6¦Ñ·3˜f·“T”"HÒõ_÷?¾ùö~ÒŸ%É ŠœÏOšßœ4/e$RI'óžÛnvãC;t¦?ã,~žá#ð4·æfE”¯B‘F"#)?™ÃvfY0ìѬLçuR —f`^è½±ößÉZÓ¬á3Ü1ƒ±·@ÐöPûµÌ iGR5UÏ_úœQ«Ê¬*Ð<6Õ]Öe°ð^!ÛGÖ@'Û9²D)`Šf' úÉ"ƒ¶aÊž½†laÂ"h†rH%i”¦¥ôÖt£ŽúØ/@ZÌ ®*>KUúPÃl5ð=ƒZŠl‚ÖÏ{Âö:ŒªÜvVSýAõ{â«Qã^uª¦(’õ ³/Àêù(•3Ýß=úÜ÷Ò-àš·;¿¤·~‘Á#†Ì+]³Ñ=èpßvæï¶Ô!t8¼Ú;ßXQ´SYGÁ™¬´ž‰. ê¡§eÕ!Dû*ÂÄ!ƒwbÜè­` ½/ˆÃÞ°X÷ôÌÞ—B@á¬wÆúEAé;âê#së£zìÀˆN£»ÉPb ý‹FwN†³´¾fS93ß݀ט_·§ ›ª>|œÌy! œõ۪ǃÎÜbÊ"EBHøKˆƒ…ž¡ñ$H㟱Hu‡X@^ë[–:Ðr­X<¹ŸU\ðHªyĽ?¨Öìöw˜Ú+g/¨Âè¤)ƒhé“OÒ™Ol‚̵_ä ¯n)^ï–U?ž¨3§×çÕ-2IW\3’L„ËšÛ¶ãåùM$&ôÍLùÆîgß@ô"î—´$·yˆÊ©üDêì¡`pòè—€“qT$ì²Üs¸*d$3éØÿûÛ&Š$*J±àYû_rl*_û¥ÈÛö€)³ÅÈ>SYž[ï"ÍÞ<_ß<yÞ•yNÞeU®ò"ׄ{‰Ö»V,œâÆÁ_âßh 0å¥Ïý?¸7/¢â‰Ü[‘Ú &¯“¼¼8‡þŽÛ´{ªþ¸š±íB_À僛°[ÛVçE.»ÃrÉýLjò, Ot*²òÃ+¬üµ”m ×_•6Ü D!Ö, `:ªÜ4ï”Ìí.UÐè3ËjOàñ¬LÇv$2W† ڥÅönZ§ÝºFf{sžiÓvK9é6Í/€–ÇQžOh#bš$2™9.Rv+ §¹ô%Yä¤É,*…ü–¥ÈQB <Ö—I ï£*…A‰„8E$£ €Ë“à7tièÚl/PEü2ugjš¼ív0mÖ)ÜéEË«r^âÚK³3C¨h—×óÓÖ<ñ·–À1™ú!Œñ("Q&ŽénINå#ö!Ÿ#®bìÁ¢(Z’—ƾÊaøùs}ê2„îQœfó€z»`JªŒ2©$áÆÄÖ-j0šœ½-åÐiµ¹ÐVU×ãsóxPÃõ*Å)F˜eïÕ ÌL{‰ne/‚1OßW0æC(– «Î=(ÿ4z§óÑöe¼ð\ñM*ÊH‚ÐY&‚‡åGÝõðjyb/NH÷„:Üz÷UM h#ZlS\lqÕ:¾ý‰zM¼-ngÆ@S?lIÚ0)›Òˆ¯+v;µ¤šW<ím³Ø(¡oÓ$ ޶‰Ã‘ !û¼Ä:}°Ëø0»ÐúÙ {)ú †èÖ£ª cOSû<ÅVw×°Äaßö3M<ÖPgdÃ+”OQE.zt S*\"N<”jÓu²„®>PoÇžñÏžt=Úÿ™â*)D”N™`! –®1oò£Hí”}âÈ*ÐÍÆ6@¥k§*zêM‰~ˆà13,Ñ­Þmƒðlz–av 8wƒHA]|Û³ ⵚRh±V½¾[Þ¼> stream xÚµ]ܶñÝ¿âЗj‹[V”HQ² Çp NZ8WAÓí.ïVµVÚêÃçû÷áµæ:×´Á'r8ä ç{¸ü&…?~S¥7*ÏY%Ê›ýéEj Ãà >üù·x[@ܘßܽøã·RÞð”UiÅoîîãî7ÿHÞëó¤‡Í6Ïó„¿Ül…É›þtª»ß7¦ÑÛC35ÝÃf›å¼äI&6ÿ¼ûË‹·wž¾Ì²g2Š˜_pªŠž³Xµœ¥`<Ä)g‚›­,²äýfË=3¹É¨7<9´Ä®’ÉÝ&çÉÓ&Y¢ ïÛM•'ý@ë?m*‘ô3^¤T„R1f)ËSE¤÷ýéÜêÉŠáçT¦w¯¿·{W–Š7[¸—´ûõ&+“iÒ§ó¢0îé ¬ÁŠîûáDK¨é;šÓW%ÓQÛ­ú³=dG›a¯Oë›Îc I^$wnc½Ÿæº¥Ó€ Êë â²ÄàxgÃ4'®Cæ´5…f¤o}>·Í¾Æ­ÛÑ"S.öŒ,ÈÐEÔƒ¾¯çvZïGÌVwõÉ ‰àÚ,¦­iÉDe5rîDZٵz»lí|·ýÓ3´c/ú¾‘½2%)ãÀŠ’HhMý=~ù²‰Tƒ£•j‚óÕÈR&?uGˇf<·5®=‘E½mT-–‰[@+xòA×Îâe‘ŒzB\ÈœOøß²5Ђá0÷};ŸÌ¥8FÕ¾ï-^ÀÐzW$>mà_ÝÎÚ÷¨À%inéü§ícs˜Ž1ñ\1!s8Ál½Eö!Ò4¤ŽS¼~í:D#OÍÐw'OáÆ¡©QÇŽy•³2+Ý7}ÿ÷ï¾ÿ!Æ¡HŽ<ƒ¨6ˆ0œåj­¼ÞÆYþ¸´±ÜZGéh}:ÖÖuúá ‡çzGÓz˜®ùÆžïïÌA¸Y‚Œ[|>ÌéÖ¢rg8 €ÑÚ#°ö·.[$íçö@ Gc~ŸðŸ&££¥>†~~8º‰¦ÝGÆá{6^²¤1·CÃM++(ï‚®­\͌ĬÜÔ„¥4K¦yè0уoRqó;; h¬$q`¤î:¤hÑëįÊ5‹1¯UÙ³¥©*–¥}€‹ŽDÇógÃNѳÆy‡•fò/½·Ü‘Ó€n$g¯©Ù\“aþ%Iâ$ž `Gyvv@u;NO­¾âÇ®ñvs²)Íq0èq‚:ÒÌ‹‰ÍCÓaÁgV ƒ¾ ™&¯;{Æð0‡ù0à·Z¯àLUÒ1ÑE 6/J–çÕZÿ§>ŒÚྱã¡ÈxþÕÓa(2nÇ66ñ`&‡´bÂK=Ðt«" uVÔ>€èñjX`”Á…N?@aëØFÈ¥¨ÒåjƒF² ‘³â2ÝïÈ—>.Ìå\ÞË]®„rh\ª‚ÚÙÔÉܸ‚íÃ`â€6g‚WiwbO_M—I?w RÄ!W±\(']hk¢*PŒ—Y˜ñxe">U:à2»Ð¾+õçn)=-3Ý¡èžVÂsk›•ÃoAÄI´ÿuR|w°J…VK›òš$øìâ¿qÔ««ú R”óRÛQÖ-Fv¢¬”"°3Ñ4°Q¾”¶9Ìh„ƒ[)Q])¹1ò‹(!y臛h *K]Êó/]2•ûw¬tvX¨ÁôÁ:–beTe.g—ÃÀ•eät»B±<ãkeîÃ' 2>qÝøÊ_i|úó¹¿VX?ßðþ¶ Ú~¡ÒUÛsó-*¿°TO8[UÓˆwYM#j¿ MFc·¿¶"Y¢˜…w–ÂãК£I=ãqÕ†²Õ†ú²ÚPM3L¤‚¯k[oáýáûQ[˜¨…ò}ß¶†óG\ y´…ˆµžlYŽ¡#LWEkFÎh}·.Þi†Œ/I•…Xù”eˆAœ —•¹Š†ÌŒÒ»ÏäžC:”ö ‰ú„ë˜mgH=T¦§XÚäxßÌGäïc@=_øÌú*vÔÍ⺉Yýà]˘™—¸/é¯Ð§3¯Ñ¯®Óöá+*ŸÊ^FË –æ¾Qca±½M!’Ç£tô¸‚É”•'ÐBéµ€þ«±R=ÍWÙ‚¡ZÒtMo~…{,Àiêa¢×=ãÄÓnЃLsz2ÓûÕföfnº‹³ýµZ‚¥B¬£B럈w3ÒÒÃ+÷~¡»_£ù¯X^Рï'Ößûξ¬P4¢‡m‘,ìgü2¦¿3a&À˜× Y’|Öõôõ}¦‡7×v.¾e‚?¦½ŸݽÈhój"ËÅ×Í&ž‹ôwö(J[†“¸dd3zòªÑñm·ÎÃþ ‡Ú,' áëY¸nÍ‹?Îð1gƒÀVùÿÁÛžïlØmç¥QòlÕL¢TÌ5:Ó}ã%à^ZèÖ W@2pey'WBÈŒe—V\ÓÓµ?TH«Hí{: n:êðÖ`m¢Ê”xÒó,,Ïð=õ2ëŽF½;Ô›ò¬rdz‹6Gr$Õ¡™Pƒô;h4ÅÏ4£]Ÿ\Mäì‰y» Bõ=©IüÁ` Qo¿ÁoCôîy ]Äñ¦e6ا7êc do1HS–™Õ#½¶á8èyš¶™\¨“ö ψ¸Ë®­»†K#TWæ~"˜o¬^6Ò—Þ¦idÑéê8êíwuõL© ÙC´~ƒE¨Î²_Ò{^ùŽÊ˜%s?9Êž™ Á• tY^vGt)½"A@,Êê·øœ³<("{zNìwȘ}Z¤2? ^xÍÔ¿÷>À%MÂÄ#M@}Óã°é߯ÿ1 & endstream endobj 431 0 obj << /Length 1910 /Filter /FlateDecode >> stream xÚ•XKsÜ6¾ûWÌ-œ*!øæžÖÖ:)'QÕ–­œ’­]ˆÄŒqˆ HÚÒe{ºÑàs¨xT*Õ€ Ðøúë'Èwüñ]ì²(bEœïÊÓ›ÀΚ㎟~|ÃÝ:ú³•ïïÞ|ÿC’ìxÀŠ à»»Ã\Ô]µûÍ»yçNš½E‘Çÿ±÷ã8ñnôé$šŠ&Q¤Ñ‡Juª9îý0â9÷ÂdÿŸ»ŸÞ|¸ÏOÂðJ ¸òiºBšæ1ãQLH+YËNúåƒ0¾6~­ÚŽ`ý$üsD³V7ÉXºóyÄxBRþe¥´ g˜y݃ÄAê•{xÁ¢´\àTßT4œ/ëM«Ý¤:Ðo³çžîh,ºÕ†{à*÷äQ5%_jw€D‚íÄ&p¨`NˆkËVÑZ=îQ¤SvÁX\0Âö5][Ĥ!+ŠbXŒô±½Ïƒ(ôÞ¡üŽN´ŠàÀ‚Å‚]¼Axoa˜åžr»œÖ%}±pð$ ÍÜÂÖÃ󢳎½F>u=öØodÔo•£Ûù5!côÿoK…0ˆXZŒ´NZ|Ø‚BŒL¥ö»åuHþÙ+Hè)P:kác×ä=ÂÙŠižÎ#öÖß<ó<œ®i[6‰Cβ$\ÜhѦþ—°iÇŸ+Ì8请ÓǦ4r(K¢v·Âï®Ú¥²Vž–ÄÚ™ןp½»ûY åÌA‘‚ìKOxk¾¶² 9úÂñ; eÕWt¿K)†EMƒ)Å5Gico_•¤·[ÞÑM9Cˆ×çÔ¹l?JØYêú]J‰fÝÊBÑ(€-Í›[Cn»fžvÈ…6ÃEa΢¨XdÙèþè8îÔI¶K_=Jk÷ÂðèVêUP*ì‚ ÒƇwwµ½:UWx÷9_È`ÿEO© ÛìA—ºrجà©Ä¿#ö‹»¶Í{úúk´p÷0ó¸úçõØ?[Žc÷ NNéÕ+WÜ}Ü×l}†—‚~ì»þ$*ݼ9ö§IE˜±Ž¿-TÖZÑm1á¨ÉßAÙ¸9»ú z;dí«.Ñò©|À€òϯràLŽ7…§ë¿MX Š3~&äÃÇE¾âŽæ¾ªîGá´ ±Y“i2Îâ&Ü'N¾¤ÀmÔ+óoÕ£ !oG_>8Éõíyâëâ+’®«ñsRKy5ö¨8Îí„_¤ÿ¾ äÄ endstream endobj 434 0 obj << /Length 2152 /Filter /FlateDecode >> stream xÚíYKo举ϯhd‘KEJ”’ÓÆ˜$^$@°c`3{ Õl·2ÝRG{üïSÅ*êÑ-öì1 ¦X,’Ū¯d‹M bSÄ-eT¨|S?ÄŽÚ>lèãç¿Ìc8ãüë݇?ý-M7"ŽŠ¸›»Ý|©»íæsp³7§Þ¶W¡”2¾ •Jƒ›æx4õ–ˆÿ¬jK_·U_ÕWa"E.‚$»úõî§ïÆýÓ$y£ Èy)iv&i–«HHE’–{Óšd ;kÚrO2}‰Óø&üÒœ7ÕQ¶ …ŒDJ«ül ž+KCMy•ä_šGjf968øˆÿ,QNpø˜¾’*0íÃp%‚ãU(;JŠqJrëÚŽXw ›ùÔÚǪ:êÉØE¬Ç…1BRdGI"ÖíÞ›òë“i·“aþ¾Í4ba›D9Û$é…mpÄÙÆÎlC¶.g#Û ÓtvƳë…}¸ósœ}à äÐ3ûÌ C’ÿHgÍ£v4ÏqÍ.ÚÛENvé†ûÎþw@víÙ¿×:Ý×ê–]ÒŠ¥¬ònƒÄ1@«Àå’¢XZ¥£qÔ³kêLDCÍù‡C_…_µž‰< †»–å™~Ù=`»é¸‰ok¿ÄBÕv»æ¤IPoÔQïP}õ&æÍ‘¿K:øXo#Œ|Ipóé–H^:^âÞ™Á>¸\ÿ©ê÷¼57 ¹mDø4éz·u¸›mUšeNrŽdŸnÑ:×HQÁÐ æpx&[eÉÜV"N#-XÏ-ôñÓ Ù÷óša“,JUæyñ¤ é펶í÷UGÛÍ tO¥“7dP]Hc¯€PÈ"ÒYî·ùÈÜkÒ©Ty6ûym-åºWZk¤í9P_… ÈÊÏàÔ’ïl‡“j¸t$â3”“Íu²°9t÷fa€R7Ô"¥-ÑEµ†ú`;žc¿UYõ‡gê{í9¤oÏ+jÐÁ”_¡WRÚ½^ƒvUw½óÆ$/\„Jò‰}£ãpf†Ñ®oäÏÔ=wW¤qŒl¨ç‚#~Ø1ÁCçMîê¶p°)‚;†Køvpk]À !V`owâÁ5Aö~àPçáî’Õ½‹Ì¬89aîÌ ”ú>X ¢I’GBÅQTqÛ‡h[÷óÔöÃÛãè/-w̬ º£œÖ T¶U‰Ö×29jHç,Mã"£\¦i`8ÅÒTWËÊù’421ê€OÞ» ¶r G*ž¶Ë@ÄÊÜ,ù’”:Š ½<)fL%$‰©D2 œµCÒPГ 0»Ñ9Dàs%2¢kî²< nqlGdC³ttŸlµ_1ЬÝp¿´àZ¡’ żK\–¾ìU2À]p²,\2rêöÍÃÃÁB¥œ¥*¨v4FG‘—Þæ&ö<“˜òK¥­9_‰â’¶Íj-ظøSGÓ¹S{„è‚Mv¸ ¬Em¡"ˆŠoG…šGohO]Ýþ/pŠÒ8Œ´OUÇÃ[{°½æ8L‰<4pqЋV¨`nq˜LFú=gG ³ïÚæHy„âa¡.섃.öΙ¤J Èò4f+<+ —¦³¨&ÐÀtL…90Y€ï0^³*®×MYZ¸›q=m¸ZDĹQ_r>M3÷f;žÖÖ<]$¦úØnßZBn‡ã)Ü uÙWPÕ}Oýøïv,Æ€ Dwú üåf»8FŸB€¡j‰6֎ع¯ê-X„Ù©øŒ§<6¥U·ÛПr£5ÇhÍŸ° ’ʹ96ËøŒôÕ› 8{)=22õ×A¥Çý'Þ+Up[2.’k¿] ¨Ç’<á^éÏDw“ËðUqz*M½@uŽfË(9™Ö_.<–¼{‹ÐI?cŸ ápuY±¼Ì¡^ƒèçJq½€›”óG…Šñ4¸h}žì¹rp\,¼”²“(ÍÒÜ>r®ú͸Eõ8ܲ¾@@s—¹¾wÑ‘ç9²ã©ÉRŽHÙ 02ƒï|Õ|<Â÷û¾ÿð=š²m~+v]U‰Ø«CûüÊ 1„Ï=p?™nè:^އ⳻LÌw¸ß{Y5GîÅ6YŠÔîú³÷eÞó†G¨¥’VO9ÏâÇ쮽9«÷Š0ù 5K?H/^dR6f*—Ùz‰Òiߘ'Æ o@rMíìI#¥Çhž®Ü›$ý+Îã– õ ·Ôa€/v€”mŠk¯:€y$'\¿æE§Ù¹P•Sri&ïrîjáù-xÍB½î—…ˆýfË¡·amŽv.‘®bßÞû¤•è ’híJ á@œ…^·Â!ܾ¸RÔšC6œr‰6N`±©ÃœÚ•:koAXþŒÏ+®}ÚW@Ø­ú?òËÆ¤Úkª1 ¿ÕT㛎%ÂT4½ï¼² “]Ô~ù Èœ¸œ4íú[z^ÁÆ› S‘»ÍÅÎI•üø„£¾œßÛ’Ñ%©Gn8ÏÁ;·Y»^Si^ñðdºÎvk³#®<Ú’²¤ôÁßlGqòy"[üÍ´Bgò«Kxl¶vþ£†}ó¿ì©Ò—/Ü‹”š¿~-š¡óE–!Rv#Ÿ”/=I4ÝÕœ&VCS%ZŽlþj!׺º¥J"¥‹¥Æ«Ô?Uüç/:ïÒøë§K^?ݵ‡Þ‹*‡Ô…ð6µë"ʤ~^Ñ9þö÷?Lwe¤ endstream endobj 438 0 obj << /Length 1103 /Filter /FlateDecode >> stream xÚVKoã6¾çWøˆ¸|I÷Ø -Zt"5ÐC·À*’qW¶\QNÖÿ~‡J~D>xDŽf¾ùæ%¾`ðã ÃZJjT¾(77,œöÏ »áQ/ÅäDó—Õ͇_ÓtÁ5ÌðÅj}jjU-þ%÷M±ê~™H) ÿ¸L”JÉ}·ÙÛ ÿ´Û¥‡Êvû¼L„ä9'B/ÿ[ýqó°šü§Bü$P¯ù©Î\Q©2‘f¹¢\*DÊiºLÒLÇeÂI]T-ÓŠ¼ø‹ò'/w sRÕà%@7”‹HÀ?m½•‘¡‰Â#Z_‚cØ`6þO2~úv®©Ìäøö®söûœÉ!™S¹:¹è+Šq©©‘)å±³~÷nyNº¾ “€Ì8¹W;”ž·Ÿ!Ô8 Œ mx¹°@¼Xogy2‚æìXÀ›¢t³aÊ™Õü8š«N™ºV!Š¡ß6 `žÊ%tŒàdïêH@¨OP)ã,Ä|ˆSÃÐ7)Ía>öͧä>ù:èè)÷ŸYʱnï'­âi ]ñ )I"Ð䤤ýåk´ɾC¯¢yj®613=ãÍ—p^ì<–ô=0ŤRWœ(&¡ ÕywM.€!Ný>‡…TÇaÚ¤ª×žbï¸y,VÌÏÔšÐâ !cÏhFE–cÏH3î Ÿ) 9ø–èöøPãhÅÊ€Ó3{2¿š´“ZŸ@Þ¡áÃ2ÔRtÛ×è¸h{ ì€§;˜ÁmQ†õYá½1|±[W÷~Ý¢îh~ÛÑK›þ½õ¹Wä ÈæFžç³)‚+AOÓÁ[ÝK¨5¼û2GJfh¦¦91KIJõqö߆já䯾vηøŒÍTQ–§ãßÏYŒÇç4ÃæÌG¢E˜Ø>Ý] #‹[¼œãP(ßÁ˜ž3[‚”Ȇ #*r†‹ÀSË€Rs±ˆêï^Oó¸pÙ¸pùXp þæâr\ ³•˜e4Õ×LJ2§•8m×M(.$½~ói¯aÀæìLÑàÇÕÙ×/¶Û;> stream xÚYY“Û6~÷¯˜ÊËR)‹!^qíCœŠ“ly“-{ò”¤\°¸K‘Z’òØÿ~û gìl¹Æš`£Ñøú”ºIàŸº)“›Ü˜¸´ÅÍîô,!jwwÃ7?>S²n ·³•/oŸ}ó*MoT—I©nn7©R1êÛýÍï‘.6ÞþãÙ·#§Të/ÜW>Ø3ÏnTk•ZÜ¤Ê +ce»Í6Ítô¯ÍVE]{×¹ŠN§ª¹ÛlMžF÷ÕpäÑ¿üƃ7Þíëªñ(æõ‰àȺŒuj˜ùí±ê7[›h·ÑEttçÁwHÐÑÞ÷»®z“"ò²h8z~Y5G°öàvB’•ò¹Çÿ¼G‘~‹_’8™š‹£A˜"ÏA,箹¬ ­MllÇ#‘^Wï;Јë>ñÜ5{´ ‘ r¢3©ïÔǸè!5±ÖÙÍV™X¥Š™ÿ|ª2ú„'h/¡¨B×âëâªá†tÐü‰p…4Ö:’GÝ¢ ‚¬)ø>s¸Oþ¾¡²Ê$Î’,âäªz6‡aÕó5Ny\(V†óðlªÐO³*øÅqm\å§b Yo¶Y™G¯6…ðNQ/W˜Îi’/A1ÃŽIÁ(ÅS˜Ô‚Û;¸K=ð}Zá%Ó½j€Ü¢“H ØZ¿ÛÃ×bRð’0ÏþòG¢²]åùš@Ò4IÅáâÇ=~;‚×iG†ØÌÕÛ7“ØBÒ½P^ÍÚ¹¡e0ÓÇòcMs:ΔšrŒºnwO:òr‰ñ,/0D$¼húFÇ€ãþØ^êÕô¡(â2Asèü“º09$£„ãVbéx4r¯8ª~1ÆDvÛ@N¿Ð‚,…š®ý«I!I϶¼÷»ljJLcþ¸L° •ŸW7¼ª?ÈT§$¿¶ßýòögÅß ðÊ6ÛÒĹM—sVH„Xñõ¸1MQ©»¶ÁT§³uR£èJ³$6SP]x…eä‡Ì;O€·öbí [ õ ì¶öm+9KË ]¸`LÄ{®eE\õÕÎ {9õWñŽò°ý™ðÔÓá|rŸ…Oú ŠYe6µ«qBí{®¦ˆe”? 3’2 FÍD.¡§×Ytç…E2X‰{ÂÔ!Ò=VTè"‡|x¼±ï·çG¤šB‚¨,òvÀk²ÕâÌT9£ßf¸A-;U?’B²*U2vföûwÒØ~*–åŬiÅ-5NPó(´ÈÉÕ‡Ö]èêYîØñ팽;;fûnÕQC¬ÕjôÔ¡ï¾^e帰®B¯r(c§¾ê(T¯VÚ@ñ^^m¦›)u–¨ÿÅùñ« Ääл?\Ðq$~ TWOþ] ?…íñ5þn„?AŠô\Îç¯ïú^ ÞJ*^,,Ø0.®~ª¨ñ#½`‹¿UøƒïBÉJÓIî“î¼­öLê¥×Ì-&»èWÀ4äº0ä¶S£zya?àÁl†½¾,Aó•ÏùW3zHòÙØ™Ê †VPÇ Çœ9Ÿ÷„± :ƒœ†«á”OG]IìTÓÐñã}íšÿð"<ˆ”Ê?ùN–‘¾¦å‡ËØæ0¥’ÞŠš|báSØ|ßÎ '©ëSHÞ!Œ»nµq°Ló?×s6Åd#Œ!#÷¥å/X߸þ “nÿa“¦ÁÇRžLÍ@ˆHn ßš0ÄßŒï–øvj$vð>¥ùý·ëU~¬—0ýæk6ÅïøvÃñ×UŒWœ‘ÅÁ±­¹ÆHµxòtºK*˜¿Y-ûfœ¯Šëw\ÑÎ*ì)g§E!gkìW«å ÞŒL\8KÇ¿H¦¡'ÎÅ;—|³…g¨cÆòµŠOìâmãWW÷Mh›áB*&hÔ [¨ÚªÀŒê dH¡ endstream endobj 447 0 obj << /Length 2138 /Filter /FlateDecode >> stream xÚ•Ûnܶò=_±èC£-¼ŒHQ·¦§@´AŠ¢8Hܧ¦0äw—¨VZè×-οŸÎèjÅva¬E‡œ çJ¹ñáOnRHu²ÙŸ_øZ74øðî…d¼ î&˜o®_¼ú) 7Ò©ŸÊÍõazÔu¾ùÝ{{Ê.­©·» <õív§uèý·®Žuv>ÛòH w¶=Ñèݯ¿á@{L–¶ÜJÏlw2 }å©tûÇõÏ/~¼ •z&çˆùõhʺ”‰H6Q¢… 4q¿?eÀz¨Bï$ Gíd dH«uqs4mCŸüЇŸœáIBüÇ¥:Ôó•WßÐî÷ú¶'CƒÛîp0Lû”1¬¨A+÷ŒaLÙƒ‹jŸµ&¿":±‰šsjÚ®.$Îæ\Õ|X[-µáÑ¥ª ÁJxåìfX{õ÷fnÕA!k²O´θi?8ìõšz ÚôŸqïäþp÷¯¿ýòËkaJ–Ïùßd xU‘üÅ=½3-ëœ>HºWXu^è°kL=×ܳ¯Éò'*øê«™ìkŒ=0 ñ„Ñ|Êþ¶Í_,†e£°íŠí0‰&ûlz,úVKS:Ù¦[zÌL±}ý5ï~žõdy~Ãdµ•ùuª‡þðÔ¾ ÷Î@–ˆ$;Š8aÌk`m»S:ñ]¹o-j gGûy«bÏð¢S ÐTf ÔËÍ!늖 ·ðIAfð–5…Ó;™xj\i2ú¹:M„Žth›Ñí{š'Lœ¹VÈêcw6dºÍ·|^:“Ç…öãAml +”•¾?˜€íI:sb´ãØ;Aù“ÕÙ* ª(XiOYKÈ£DÉÒ­ð¬Š6 ÐgâÖó5®w ¸I–Œ÷:±–Sˆ{ ŒCtÖkT¤ôx}n‚MB£W´uå AîN¦\ãV“aœ>OÇ‘—\^€¯Æä­b¥½7®Èt¡aÅèÒTDqøD @åƒ2@5OÑ"ÐñÄãÉvWCˆ-!´™mè»ò…O;f»BjÞ8Iž!Áè[D•…9¿1Åa5ØD¡ð£àß±TøÃÕQnˆRY•»¿M]1ÝÃÚÕ§Z¤“ ôøÍj~ó!å Må~>oCð‰ÂæH¢ÔÏrþß¾wÉ÷=5(œ_À)¹­Ñ¨BN½ BPœ²Çâêu<Â'$ôEj‹ÂµE‰ì!ÕšcYÔW¸¿s‰6:¿†}¹m²ÛÂЄB¹nX³ÁBèè8_²j *«=í@ì :ŒWwCG×t°£½¢äƒZ].HûSáÊ~;QBÏFÊd‹Cï§mxœö›5SÃ9RñóÑØ¨ÔùE¡Ü5P9SÁsO³Ãp2M]›DXöÒ`^˜ê$×Åë†qäaù;Ó¡]úÎq÷…߉ÿð1—ßóß5ᕈÃäyj c¡b5{wÁ üR•lk endstream endobj 450 0 obj << /Length 1729 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾ûWh¦*c²¾šSšÚwb·ã¸½4E¾ Rqüﻋ)R¢m©íè »Øç·» ÙÂ…[Äî"ô<'Ñ"-Ï\½«Ö ZÜþ|Æ Ÿ ŒöˆóÇ»³ï/}Á\'vc¶¸{‹ºËZï7IÓIµ´=ϳøK[ßúMÕk•”e^­‰ð˜wZý|ó;.„u+“¬È«%³äÒf‘ïrËs—Ýýrvq7äs~¤åÈyhz06¹¨bDÂaž û™! êÞ÷6€¥‡:4o&?¹LT²E|+Á¿ÀzOO’ª—6¬T¶m­hûëÒN•'«BÒN·I::Ùnê-ø_dô¸Ò‡{.0¬“™ÑÔGRÑ3„ 8;¹–êܘ=ñÔó"ðÔëí¾ýp\ [0áD,ZØÌs˜oˆï~úpusqÿÇÅíÇ«_oæÂ3'ðü^Ü9Ø0ëq“§h$– Ï*|x¾s)ÛýÀUW9­«,ïòºJŠâ‰Hi]6y!‰ž4M‘§ rôT-03ôL6¤ÄÄ´oÆFr‘¥xÜ‹„\Ò"¯Útê¸FˆA€ž•d˜ÀnbÆP²jA¹³´ý8´îúã”ÌØ·†9o‰’ÐßF~K2™æ%0é Yõ¦S-ÀVý01ÊÇÈÙ ÷³† ʪ2í’;uªIs„iCãa[.y¨C"‘(Z[èm°(ò•JÔÓ2ò0‘¨ÿ€å¡V%­Üoñ܇2sƒ××e9‡!‹xÏåÌIоƒéõõœî;<=OÞîÙÚ¡çèxmg9dfwD)un‡Ðjxô1Ù¿øÀLSuNâÌÃ#‚Ö]M©h(í‰ZoKIºŒ,œ š¦d‡÷UÑ#d  òù< p®‚U Õn έ6!$hZ8áú´NÈÚA_‘k€">$D#+ÌEgnh@ññÝÐÀ8=Óî½p(e¼øŒtì§€ˆd•OLbÈ€qHßRBkCy…Qâø<Ükm@-ŠçCGM³Í&t‹‡–^u³n¸÷‡Ó^2Q‰N& ‹úÒa5©j Î)fË£“4r}·ÛäF.ý3ê僫}yÑväÑ}`·ÁûCl4Tpj&ësñ…ù{ñj¬azL ë @r¦Ýj˜1¯¶…Ä+‹@G—¹è¢#¤bÞ h>àÿÛ¹èÙc1`ºFª‰yÂzwóñÊ6fµÃbÒ¥ÿ+bš2¬Ž39NcÑp1×ýHwÀã SÅ=ÜÊK@ê=ZuoÌÔ&¾}nÆí÷~Ýi¤¸{¶Ýpk˜´Ëù‘C§v õ»¢Õ÷CܧÛH^$+}ƒ1ájç\uõ¹ížœÙ$ѤB<çú8)Þ$)û—õ‰Øt“WÞàFVz: ¯E}|ú#î«­WWHŒñÉú^òóU7ÿÞÖ> stream xÚ­YëÛÆÿî¿BßJ'–Ë]¾šOi.'pÏ Çp÷¤•DE*KÒgå¯ïÌÎ, _ã€ãì{Þû›•XEð'VE´Ê¤ •¯¶§‘뵇o¾}!xÞ&n&3ÿqÿâo/“d%¢°ˆ ±ºßO·ºß­Þÿ<êsgìz#¥ ⿯7J%Á¶9X}:•õžÊîHÔ·¯ß"¡‚7F者^‹À¬7"O¢8býþþ_/¾¹Jâø™œãÌß±ž¥+!ÃxgÖÓ\…B*b=áo½IÒ8øi]ÈÀ–1œ%¦ÏkóDÄËu¡‚¾ÞveS#“×j½‰,L¥¤­_Õ°L‰ ±;§ »†¾OpŒ!²v»±ç[n6¼†udî°—uœMï›Ý|çGTfƒsxÛîÈmuU‘hØ â<øˆÿŒ#¯Žñœ<2‰ yÝäËÃzßFÛݦ7ih¬ G@ò ã2 tí æˆZŸLKd³§EÃØÇu°¥~y*·oë§èŽæìL»µ%ñc®öÞöÖ²`ÔÑvT¾ –;œ’–‚S¢²©Ë‚ê‰jÛkºM„'S°SF1ûÒý‘ת†%­ùµ7õ–‡È¬@hÝ6§j†Ü)º“ÈÀ™Ò øu»ï›fÉéâ(ÌEî'U Yç±¥Sª’í²°?œ Ó¸˜ QÖ °$NÜyŽø%J¢¡wÛôuwGôÐùh.0I,±Ü„ùü„§£±ž¡b:WB(Fƒ¼xÙoa[ R…ŸZ¢´›dB ÜÂþdl¹¥mÐüzP*g  }Ê=}wf¯ûª3;'­L4ã8–I˜GÒóÁ²h&Æ…¼É°_ɽ𙼠°,0ŽxtºŠÙ“iÓîX²Õ}èÝvÕWp@œHÇHœÄè†çÊt¦ºP¦~L+ØvŒb‡ßšºu;Ÿöä8Gª=6}µ£Ñ!B±±kjÓÝ}à–¹kf7wÀÄn$ÍfgÃÿnN°ƒ’Å4‹b³o±_EAÙQ‡æMkÎÄœæqòº ¼Dàæ*M!öO¼ÉÕâ_"‘èÏré {ÆòDÔ‹Û8rlz–tÕñÅXÌÚ×ù‰Dcåµó„]Ve”Öì­i.Ó¨,%5âà,ùá¥4r"@Os>{nv4âx…‘ù®‰ßô°µÆÔû‚¯'6Ÿ4º†J¸”^É42U¨„,8ºëiЃLé`/ucyn ÖÞ$2£K:¦6VWx—d1E*ôjÚaßîÞ/±ÌÞÒ Š°ô:%¤ÉuJÀÝÚÙ®Ö[5•9YoHSÈšˆ£É(éñŠ‚†~¨˜r‚ÃwÇ_t´ŽMbßWHg+ÀÍ‘ŽŸÆ¡)˜W›ƒîÊ.=ð5ìm\ºñ‘…‰èí¢Õ¾öj‘¨BRÒ´‹½ðíbtëä–Šä–cà#=Êí.<J C[ã¯\Í«J>k«ë…¥gÝ:7Åšº¡Çý½P™O³Ä'½`%²áÚu1§aË  ÆB×[î胮ç¾]K„ž¬õi”‡Ú~»5m V„¼šK—Pd kúÖ›T½¹àEÂV9F$j ©ßŒÅ¨ÍSb z8Ye¬mxÜÒXð}|]U<´÷{ò²‡¾¬SÃcO*ëy/¶¶#z¹ö )œë4lЋ·<ÝUê éEì®B©Ò˜ñ5 ‰4õÈ]nƒŒ ŒÊL?"’wà±SÜ@êE(ûxàÖ²¸³2­w,ã]Ï1ŠÆ*+c”ÅcÃÁ\µƒßrtÉ< Èè€YF‡¾û]‚z?4IâäÝøeµ%ÀõWúØê ýá¡ßï]„„¾&v¹'ÍC%á¿.³¢Y‡@Ax!NÛQËá_øîñž ©? ~F¨‰¡—³ÐO.U[JýCu'òÄ]¹¿ðÙCuÒPäú¬DÛE ñw·tKö1E€¶Íuý(ÄÑéJ&E õ™ÒÏÞL¦/”À×›Ò]g¼'q¨ÂȼÞA¸QMæjÝMx[ïHöï1+D ’ÜÁЀú] Œ§ùsEð³?#Âõ¦N0m*—2ùˆ§– ˆ, E”zïg4ŸÀ~;òIÆ©PÇE> stream xÚÍYÛn7}×Wð±}¡8Þ#@âÀE0âh›æAµ…Ô¨¬ $¹Mþ¾gä$µE»’)¥‰aaGÔìçÌ…Ã]‰Ñ'±:’Škr”£“$Ž“]ÉI)¸&2ÆRV\ÙeÂ}©ºìš]¥8’LŽ‚Ø ‚iâC”L€iÆ<’B…ñ ÉŒ‚#… ÉÙQ ‚†€a)¸=eX.°œÉ–B0X¢£*¸«Ç¡ØOÕ1³Ýž Ø\•¯ f=C¨P©ä8ŠŒ+á$ <Ž3ƒ‡d‚¯ê¸`·à& ø©ŸÀŠ˜ QÓ£b:ÄTG°4ƈ!\c5›J+Óhº ‚¦µ°1ê°2G¨c¸SÉpi)ÙŠÄF`¸bÙJÙL‘×øÕ\ˆv¥ä”á8e|0§ƒsU5…²ýœFJ#58´Ø`ƒ‚53›ÉØ-18³_a°T­fŠ ÁÖ!ÁE‚À‘‰GT‘ð«U 9‚芋öM&F›_BŠàטl&èfÌÄ 5f›I0S¡qòE2ôžº£#7>sãƒ?wßWW“ùÅò· ádXØåÇá¯Ëù›oÝ“'#üÛRž»W‚dî…ÿü˯I” óëÙìõG“a¾Z[?«åF÷ñU?ˆV$|G Â}ö·OÃùÙÜøôù‰¿œ¾[¹O–oˆ8¼™ŽÆÇ˜e:_-ùj·ôåp½8Ÿ.×…f=ôãôâròlxwÃOBèçÊ@:Yà^dѽ5·KÌj¥ËÖb¥Ë®S?ÆšØÛÕ£D¸–“úJõ^ú_L'³ËùÔxÿ~~¹Z»ár¶þ~ö~¾š¼»í‡Ç/ÇÊ_Öµ”}D5áH>§r€åXX øï·"1bÕö ‹Ú°(»…EnÃ"("iíT/oeX4?脳édqþÇ=)˜êWÆul¸Îò(®o˺'8ì²"ûá©-žÜ§ÌY½xŠ4x õâ)üy‚ïÎÎд´HSoÖ—x³Ô°oö Ô"ñɺkŠú(éKíš‚·V®G‡¬™<h3(ûö„ÅA²¡¶ÙP»³¡nɆ{t’FÏØ‹¶3r‡†[ôÀmù€|¤–Ýš>â|ÜÕ?¾Â)ýUähh›…Zº)Økwî†Ð´Áv¨ìƒ`Ô/¡´R7„¼57uRÈû65œs}E…{T¼ÞŸ²‡èV”¨¥­öÒFa;m:‘«·³rݨÛx§îx§¯ëð¢Ôfí– Jµ·C&lè$QŸ¥;ÂÿcûÞ?Ü™n8ôrô› Ñä#Åÿ9Ü9¶¨¥µî€ú®[·šò!B¢›‚6)¸;)x‡¤àž.öv¡¨@¨£¸Ò–|®½TÈ%CÇêCy«ž&òUè0[åBHÚMC¸›79à!gÿ>^¥ÍÙ1?¤·C~ÈáòãÎ&qGksƳå1\üûÀ^ìûôGF¼pF‡ ¬ƒ8‡Kñ<e.ßÎ&ï7ÎÖªÛOœ=:)Ÿ3?΃w÷öÏ×inݻݩ{»³ ã-ѱOë×[Õ@dåé_/WÕ=29®ÞΦ«ébÙ¸6íà¶»:̈¤B‡©<èSbh=Uz‹Öø¨aŒ>P¿àÄØn2‘{ƒ5Ò¾ÁJ1û”’½¦÷\ìZq|MöRÃS½?XŸÎfÃß—ó7®?Í/†ö„½ÄÜê›”iÐË|ÒûfÁ‹ endstream endobj 459 0 obj << /Length 2498 /Filter /FlateDecode >> stream xÚµYYoãÈ~Ÿ_!äe©Àê°y3û´ ²‹Ø ™õæev`´¥–Ä …¤ìÑüúÔÕï(ê~ ×Å^[ÞÕçên{4mw×7w-p$Ìî 2•­6:Tpð‹í{M¢½þXtÒk¸5ܜ֛ óš®è‹‡5ô,?¬ãÄ3åY>ïi•Ý7­ lMYâá'Bt®â0sŒ´¬û›ûð¯—hO´ ´Û°5çÎ ±¢>;'½µý¹­ñ å«4rœk>ÂìÙXr`s»µ'‘C€ÀLÏ•©‘å ¯Üb¤l¶=ÚŠ×ÂÊ;7`n>(ÂôGwj„­t²'§kï|’éF.ç5Ó“åhs®I—ÀúŒ~Ø¿ XX¶íÄÄŒmH:K" Tžçn±¢[‚L«0 Ah`w:} Ó<ÙÙ¿+êÓ¹Æ,õ•]i,v¤ É [Ã`€± ~VæY§,.zÙt”ùÚ~”!^wéú¶ù è'вoåÎØswnq½“iн®?ÿæëpF`<”vI{×ê*ÈÐÈ,ˆjì°ÔhÐkMÅz ãT¥ oÖSözÚÝÉôÛãè³Ï‚°™Ä,‚„¹†‘´©7ŸÐ/lÛðš XàšbÏòe®·}ÑÔƒA æ@d]ÓÊ`3› œÛŠºf³ÄÛ÷W‹P—Í}iê3ªG™¿*NbjÅfûÇ1®‘Æ^f³·„²r)Èh}ŽÉK%%XGA(sA–¹¶#ÈÍøƒ!o0dÚùrvÈS‹)Ì@ØÿªÜ d¤Û6äp_½ã‹»cs.9GÕİt¦‹ºArò˜ôšR¬…ÓuÅ¡&4Ï%‚@; ø ! HrK‰N v:0QÞhD#_â$Ë•"·mvàrÜ×Y{ùC: ’8_E:Pa=“ý»Õ›Éò¥ àêP¶ 5ŠTÂÝw`3o yƲyû‰Ê𺩱JNPÞßp¼8™zMš{Ñ“ºê•gñ*Ìsøá3ܹ՛Éòî®%ªH%DEåò§0óG«À³c —8à–†@aWì/2q–Ä © #ô]~Ý/"i ðþ~g`”äßW:«aR˜è\Š(Ûî1h«ŽG»¦róŽèÛ'Sw§ðM®ÆS^>Yîá¨ãÂö=A+tÆÛï³ÝÍTvŸ­#òð÷¸W¡¾ãœâÔÚ½…¹“#ŽTš¦ß’1¥)Íåë¡9Œ²Ñz¢ÌãƒØLѰÍm3 f‘¸‚= )ÃàP¼3½½:g7Š@@ŒE¶Å¤4Ĥ4µÄ :wH-V¡rjµsÇB¸Øh9Ó¤ƒ`ÏÖÀÂÑKqˆö‡¡0„†Rö{WݾbmøÀOˆz‡SýëD@³ ÐR .‹{@ïË݃m1ùšHL, Ý 52ª3™¨Ø£ðGuaèžX°Ÿ‘çéEWÒ2‘ùq°n†'·Ah VÔÍ’Q‡IŠ}'ž?,fŽ* †’%RÁg¯¨ž?F¹h«bã¯[œg¾P‹òˆ†’O‡çL{à,<òl½uI˜s¬® >ì!sK8ìaž¹èâAÑO#cQôÙ¸m3ŽègIZ®2¢)`Meƒqÿ£ùÁ7{‘=Ôç‘«ÓË`û‡rò£ˆ¼-s„|ÈïúFmÝô“ fÜ:pòQºœaö¤à«,^­€ÎEâf9Çú!¥pa$@H=K†s.<õ+WuýΧé endstream endobj 467 0 obj << /Length 2287 /Filter /FlateDecode >> stream xÚ½]sÛ¸ñÝ¿Bt'b üêãer7îøÒ6qúâËx`’ØP¤Ž¤ìs~}w± ’¢éØ©Ó= ìb¿w%VüÄ* V‰”~¦ÒU¾? ìj»]ÑàÃ/g‚áÖ¸ž@þtuöן£h%? 2±ºÚL¯º*V×ÞÛ>ô¦=_K)½ðoçk¥"ïŸm³mõ~_Ö[Ú¸/û~yÿ Êû`tQ•õ¹ðÌùZ¤QzRž¾úûÙ»« ( _H9B>CºJb?Ñ*N•/¤"ú¯ÿ}žJO·¥¾­ÌgÄÇâ•~E![Ë”Ît"oê®?„‘—ïtK£¿Ð§­n€ðn]ÝÔzoø¾2ÂÔOWk!}¸Ò^xµÈ õÜQž‡©÷p8_ÃǼ5!½cg ÜM¼MÓXY—}©«ò«î˦öA2ö.6´Y7= :Ã[{+c ĉ§‡ªÌ팈¥c†Ó>X@„ ¢¼ß•BD^ßà7vWFÞÝy{º:Zo6 ·3#GžÃ³øê݇_Yû¡r@¦Æ§Ü•mSïiÜ.BM±Ú­ß¡Ú®çÕrÏû%Ÿt¯ÉuU™Âò2Y €ç'¾ÈâS>€X:Roæè·å¬T•`ó…¦Çƒ4 7 –s}зe"u7ZÚÎYŠg ·SŸ\»ßàÖ¸6 /t¯oug|û %~ú·¥'âÿd -sî{LÁ²O…(Äh"DXq;¤ÊJ‡aAÓçX—¿Ö"´@ƒ¾ÃªÑ9Îv´3Qz¾ #C'sTD°…™Q«¬”¦Áûï;²àN(ƒ3êƒn ˜E2ÚaYŽ}›(êjÅ¿QÐ3w2 ý(ÌVQ¦@œÏxH¼¡œäìJû°&g.)—~H^¿]xáEMÖ”x°»&£ Á/'ˆzÊ®®oyß}~CÊ{Ð[¶¡æï”«(~eÏ<ÔA¯'à /_j‰F 2‘0É|™†¯5‘Ÿ/.ßÍí¢«ÛØ?cbTʲqC{ÞŽ7mãû]é§£ÇcGC«f ÚIa¤XðÇa"ý4îï?]^.Â0uPoÐX²ÚÂlô±ê3˜,]“M¯Y‡Y<ѧ8°%¤ ,qHÙŸIå"ea…?RXͱ‘´¦±‘î„ „8pyñþÝÇE¦…~0ðLÃåKwÁp°†·ÿ¸üôëûÅ»”ôUúLòD²q—=·8É™çFÉ A«ÌÛ‚jÛô_)ÐÛÖä¦0unh³ßéšFSVá|czRLgñ(;1{ˆO±¼nkSÑü~gjΛ=ƒ £îÄ4³*æ­1œ!é2@¶²”þüÏîô HÙƒ`n6Ç:¿éç¾£Ò]o·¾ÃwÄÀþ¢hM‡Z+Jb—ÃÂ/¥#'8DÃQ:ަР3ó‡É½Íh#™º, 6öÚ¥G0¹¥Rƒ&\iÄŠíÿQêo,XÛí ÐÖRìn¸¤ÂšÖ:HrLK{Ì,°^r.˸‡‚ÑQÌ9²M«ÊÜœ&¾^wt÷æÀ2.``oã(1èý¡ú±y/ˆv×4_žz×ë¶?,È˽ äÔû¨Pp1¡bqÀ`PÜmø¸¦Ï¨ ¸‰W±¦¡ÑŽ(:Üc®¯øÚIì†Ù¡-É50ž¹¡ —3¹¢ Ó80äCÿ'rœÎMh^Â‡¨7e·}žÕFذß,`›ƒ…Ñ"aµá㚦ÃEàa•ØmÁ6Ô™Þ7² V‰e´±ÓŒä–rS/q| ˆôÈ €¥l'E²Å…‰K@ÛA%åRSÃÁò,/¹µ.Z·:‡t¢LÍ©ûﵟ4qÅ ÷åàOìGQsÛVš¦ûÁ# }Ù~`Ä-™¶¤ÊÞV@ÖA $¼ê \¸š&LÊ‚Dï‘Õº¤ &Àý—ȦýpLÝ• ¼Ÿ‚Ó5t|áЀõû²âS£gnnˆîimßt<êmÌD¼3;ZÓô錭h‡Úr34"Zsê×kî‚P0 BÝeûÑ1y ÉÅŠ5lYù¾ØW`ûe’ÎŒI9NÈÍÞ>­(!êQl ÛµÍq»›·‰H™gÏíióhk¸ûÃaôÄ"9Ðaæ´Ø›C…‹jY›Æ# A©RVƒpqÔ (lÇIÅl4xÄðÙ¡8M@«LçXLAGcéØ˜N4kChNl-€rö`zÏJ P•’ÚdÖŒ›˜o?Õ9iä+¨8… }ÆÏuz=_ê(Ì.=mž 5¡¯ü”†×o'Ï‚ù> ›!˜ÒR3—Õ£fˆL…¯‚ø…¤;ègHŸ_:i†¬ð*ü€­©M«+&Sóê´•F‚‰¡À âK‚j€ãŠk'ÏkJ¥ü,ÎFEr/ÿ}["üT™aæ+Ûºþ¬ ØýUXÝ[ÀýJúa‚•Sµúxö/~ð .‘D~ no ?Ø)î icözœa'§8¿å@I8wÝ®9Vì8±óZÎ]CmäXà©PïËo2êrpz¯žŒÎìyƒµÎpfÊð±¯Çš¥Ö«œ`µe •²ee[È(PjÆë(P ·"P§솶ÿR”IÀȆNæX 9d|UEñ0òƒTþ€hø­B¥ÜâU/ζƈf'É–²gÜ /·µqaH¶pµáãš>£·¶GZ¥0j/ÛЃcªJ ÝC×›ý#pÆ2ÄÓöxÀ,y!@ÿ ŒU*1d(kë¥Xï2›“¤yú'ŽB‡ Ɖ jÝ›ŒŒ± endstream endobj 478 0 obj << /Length 3095 /Filter /FlateDecode >> stream xÚµZYä¶~ß_Ñð‹ÕÁJá%‰Jžâ 1#AbOò2^ 4-δ°}YRïîø×§Rb«5;cxÅ )²HëøªX\¹ðO®*±*µÎ*cW›ýA½ÝãŠ?|ûFzºÓˆò››7ü{ž¯¤È*QÉÕÍC¼ÔM³ºMþº­OƒëÖ©Ö:QZ§ÆäÉ¿»ãcWï÷íá‘>¶Ã–[ßþë¿Ø0É®nvía-·N¥Í…J´Y¿»ùÇ›¿ÝŒ åJ½’s¤|uSY.óUaM&µaþoÿ·¶:©»¶¾ß¹w¸?L+VRfUž+œ–jËóÏèvwÛãñýÝÃù°¹Ö°sžü`hh÷îxîÜwˆÐ¯yÁв™]¥Rg°,-úÝÃ:Ue™Ž(‘$’üâºã[èµ6áɤí™$ü[‡"©›¦s½ï=ú…jC&‡å)GþÝÔ»·žÜkën|ܶ;?Ü1ªBácH>G{8‡ŒFt^f%œ/U nQý>â¦ýîêu»Ã_#p9I\K‹O½¨µ’‘ ´„C£"Z>Ê ©Ï½ãưE=`+ˆøkÿݹáÜxþ‡už'õîì'}Ü:?Ð~wç?•ƒ¿Ú# ò…@ïàn¦(’£ÿ=lähã>äëµ²ž ‘>œàTçÁ/tà_2)llÎ]¬ÂÔa¤ÄýñÜm\¶N­QÉM˜ÑxGN QŸwÃ÷[´?›€ŠÀŽl²Y«2Ùº î󾟌aR[^e²Œ,¡=ôXß~IÅ…„†å«ÒÛ¶Mj²þ*©O§]»©ƒ;TÞ“P©TDÃ=Mû“š„)“ ðr@R–yhEú¤Îíñ¼kèì©T ¹Ý¼w¨÷ i]”,’’D‚ŸÀcw<{ n÷´¶&9çÆÄf ³>»®EÅ4šëU]LªÆnÂX⿼ ¢J÷§Û{-?ëÎ4ÚÕé{l¸§´w°ùaƒZ76ñh×óWsîHÆ”£Á”ú6ïPT︳wuç ¡‡Ã–¶£jýŠ#|-ð¶GŽÎ= æ¯S¶äDµupì#’%Ø2øÒî-®'ñеä2å…QÇUÁç@‚—‹G+„ÅçÎ|Îi`„Ο̌¦=–@ÿ 8Ð@+¦ßÉŠÓþDþä6h®fÃ^'üqOÖ5:æ±ó«±¸8>ã¢ü3ÂxUluÌJï·Ø.‚ËŒÐN•&9Õ}ïn¸-¸wi2¥ªÈ¿Á?îÞ»§ûcÝ5Ûýq~¹€?¹äùÒŠ,ŸÖA =9@ê…ñ“Cä8NëÀ°‡œ†7¨â R•›¬ÌgÄ»xDd¾À&• ¼±ˆ8ü¡µ2X»¶ŒÙº‚зö’c7™6î½}àhd} c'„Á ¿¯ÙÌRÏKll˜ Ü× Á ÜRŸwÝCnŽ](üÞ¹yv¦T™UÅ R·LÐ}>AóÄiD½£Í–$t>…AVTÙ„B«’Û¿ì€Í`%}sþ: ò©~ôÃÆÎâÊd•¿òú…#Ì¥3 éz† ‘"qo™«ÉÛá#9iJ+‘iÜ+68Æ‚B„è!™›…hºà_HËŽaÓ6Ô¤zΌɄ Ô„v¸BËÎï–¹éÚÓÀ!gf+o9„±#'*LŒs¨ÉN±“í”#¥Ãúò´ˆIBN¡8„aìôX«ÈÀ%ZÚ~à  ÊpSÈËèg`©Ç¹„j°R —°x´0wÑñà7Üð9lëaË7´(°sbêÁG¿Üu®Uâ>m¡áoV®Ö1œâ'ÀÖ4É¢ÊDn‚Ö^‰I2ËË1Ã~ËëSJ ¿>…!^(b×½ç`äl 1ÈWÇJTFd ð…)áQ•ôù2¶â$°’³Œ‡ºÜ:Å¿8cÁ幨 [¥øjä¸}‰eHxaŸdQ‚ÆÝÁuõŽ‚{…Ê_ˆh3£ÉYÍÔ‚“õ‹ "3"JZèü|›w)Ь¨èºzûN¬2S®>å~¥ýw·úñÍ<Ø\즴̴”´” ˜ö|tÃfa×\‰ý"»æ9øk~¹kœ«]! ‘ôha Æ àAÛP°PC*z%W©2@¢ÏÉÕH› ñEäj wf&W†ëmÍLÿÛæ3 þ]l{}…»f¡‚LªT_„…ÊfZØK&Ÿ]P.F50‡Ë¼¢î}åáÎív 5ùJŽm³\è\Óö§]ýt÷9ƒ¼®DàøcK5ÖJÞ›¶ƒ\„` A|ÛÏÛðAø-ôzø*B PùÆÎœ¶7”¸ðdßh¨ÎÜ£Ôžx×Î.ÈâëùBÌ9ú­ùÓœ C&w|h8Ì(S„û3GY¼ÖK|óÄÝ{À»<`¤±\´ÀÞÖ/IàNk.f÷`YUêHk£nïï6+U%cˉ[ωώŒ3¯žS Ú]Ø*$WÚDµ0$x.§…;Iž—`©düò¥¤ÖS§ùRV;[t–ÖbåÒÚ‚Ù¼ý!fýÎ>…–Q×i,x¸êëxÔ/ð<_tLcÙ“Ñ5xçowäö0,;ò©s§;,…½Ö‘£Jj¡ý%},¼åúMäå…A/Ǽ”?¼£C ý|§HóÄ#“Ë:¸¹¹òO‘gÚŽWSPÄ¢€ÁÕÔv%òúѳB¹mÏxÕó×T£|À_®Q ®A#çx™á¼²!ÀžËÓ»¤Œ'Hï)/…[:‰ê®Þ€Ü°T”•.s (<²¶y¨Ï¼ð˵·gkÊ—©'Ó °®W—o!9³rÍ" ˜&˜ja=“¶zÉ9=u‘/9çlÑù=Ù T-U&Muá%·7è«ál„+ÿ¬€1Áræ¸c“_cež™ªÔ™ÐÕ‹XÉÔiD¾ˆ•—‹ÎpG ÖbÏ ¢q¿z¢7#dü¦io:8È©…Ê#Ž¡+ç”ZàȈ3F„«vÏR‹Î™®s=áݦù ‡÷ôœõà9èÌi}…/Š•ð5&ìX<4Ç© H G¹ÃfðsÇ‹ê…ɪ„˜-—üë³R–J@Ê:ÎC¿¯Jö{ØkJPtU°¤Øæ%Ö‘Ô¬šísRFý@rT£‘A<Rqöò\ra!ÇÑ0µ‚œüÅŠ™§N#ò%‡™-ºœ\T>¹¸ÁG…Èï ú=Ä#YÉsî¯Ü?UVÀ†¯;M ~á4óEgî¬@Vò[óôýÑÝ÷õ¦;Þ…Kïz±5¶@cz‹k™à§Ðò5=•œƒ[¾N5F‘}éÊql™åÆFöè9>ïO®[ŒK2SS$óx;x¼¬:Α ½}Ð/#ù]Úëâ÷ô¤+IÏ pà3Õ ±ÚsäßšwiðÞBÚä»ûÉ!ás~ªÿ¯•0l¼§;ä„[Ež"æBÓµ?Êà«%1AôVcô>‡—®C¿ƒ{YóÌkd9åK_-ß…æL9ËfHaÀo)ã¢~"P´™ËЄD¸ë™R$TÇ*“÷ÀM¿eZ×ojŽ”ý•å›Ý¹qŸ]ûn®˜á*øC%Ά¿—Oƒwy~eaÞãühlü÷˜"/y Üø„PPÒû¨zNMàUFçq:z‚¹ÌxÐGPŽs\Ì¥«é± Ú˧¬ dkæW¸‘ÍãÃøƒð#`ACvÚ½Ãh>ûÓoì]ìIV3Obßqü6—Y'»§ Åvÿ% )ß»§=š”GB÷ÉmÎXÀ78x úœ¡Ê/Þ¶¸‡GBê Œ ypmŽH\à÷3SK¸n :7/Dš@œNÔ f¶ä,j5suË‚êßQB'BT"]^åû%>º¼ŽSOûyF/ËKøÀNJÞguVÌìl4«¨z´ó¥‘QóLqYJ‰ë& zv¬î= ägAÿé@È endstream endobj 483 0 obj << /Length 1478 /Filter /FlateDecode >> stream xÚ½WÛrÛ6}÷Wð‘êD,Aðš7ÕQµ‰âJt§SÇ£IØâ„$ã8_ßdHE‰-ÇéèA¸,°gÏ.v—İáGŒÈ6J­È ¤8±Õª¸1p°zyB´Ü§Éßâ“_÷<ƒØVdGĈ¯‡WÅ©qažnÙ®áb2¥”šÎóÉÔu=óLT7‚EVÞàÆmÖlqôry.®¹â,ͳrBL>™’г“z“Ëø“yÜòçÈ¥ä=ÐÝÀ·<â~èZ„ºˆÿâïIHM&2v•óK©Žù!VäyŽ<6¥!ž³ñÄŸü®`» hôL‘o®²2;7ïq/éuB+4¦„Zp‡º!Þf5yæÇ‰çwÊqw\³æ .4•þßrÜy?qSców¶gלïSG‰cQ›~HB÷ú:éé@ü…û—*sÖøø'ž´ ¿‚%¢º'úÈ(ü,„Ÿ7?Xév0üÀR~°Ð“ÐðOz«ºÆVJ6îp ‡'-x)£´Éï¦=DV8Ÿ”—¬lðÏñ¡lhÃô»êÌe ŽÖÖ<Õdl1]ÉqšÕ;ÖèØÁ3U'¥oTA È9@ÄJ¦=“¥p#¤A}éu[ª·ô?UóÇpÙæ5 nó'_Là®–—‰” £ŽFXïiT«úš=aEq8ù6‡ ¥kˆÊ}`íëO¡rk@ܦ³v“óò¦Ùqʬ¶qwi¢OŒ_2ÃK ÄÖ¸‰ µDC-„F–ã:N‘w öCŸ6ß·ˆnB^$2k^\ÚF ›@žåÆ­’, j9…Qn¬OþÒ©u¤ÍœJ\O]å¸>êü⛯TSâ[¶OžB5ulËŽ‚±j߈c àcÃ8žåÊòtá t,nê†5üa‘0—á~+º_‚ÑUÖôB«ó–×8×O F€PeÛ\ªÕ[z0x<¸Ð?5SH-° ˆ:(½ºL«‘…àÀëB€.ñ•²žªAõ‚iÏúêõf=×ñ,žbÆ,ú°*²g ÀJ™¢š¶T%IïÕ ÍxÉ(?_~O}ZQDFê?rÌóšWÓ”:>„︽}‹õ·m%V@ÇÊ@…©Ô§þ¹ì2äèvËA¯“Ðd¸¶c¢Ép¶À9F›*ßÉô<ŒI;bžáëc56?ÚÈÑY™ämÊŸ²b^cßJK'K«7˷˃¦CöÇ·âÒÝ–éWVºøÞ©‡­'Wªµâ¼ÔËsž>Ó©´£; “Ñ]Š>uÓ–Ã* ûeÖd,Ï>së g5ØÈ ¢hϾÅr/f¯ÿ.–/ï±ó™YŸÉÔÒϲPC7z¯éÌ@¯qQ²\7¬aºIkD›4­àõãM˜¿ø!O%U±Ëyƒ ÂÖì²¾/ž¯Þœ­ægg€G< ¸f!y­TmM³w6qPÒ}MÉ𙪸•òؾ§*Éýñÿ©þGû@°’Eû¶ÄIVîÚT¾’èþ³z:Jˆt—3l—¡ÖÍËj>{qúæQ.ë¢NÖ©¾ Õ^,¹ìAEUìõüº¾âSª˜HþfÏ–óâ'C^T¢ÛÖìKs®›®… ÷†¼aÓà2>éöXGÛõb±>›Å§¯~, ûà/ «ÜÎGÇ3ÿv5_,ÏÎ2õð똽¦/<ˆnññÖ,ÖóÙêôÕp½Óöu%ŠN‡ªà…®”˜p!ÙeuS ý}[s&ÐQGc_>;9|WËéÑøeŸþþ(ª endstream endobj 488 0 obj << /Length 1535 /Filter /FlateDecode >> stream xÚµXmoÛ8 þÞ_Ü—¹Àâ³üžû–¥^—[^ŠÔía؆žf«‰QÇÎd¹[ÿýQ¢œ:©³.ëE+š¢$R$R%= ~Ho`õÇ1nØKÖ'–âòe‰Åù Ñr}ì·$ßÄ'¾õ¼±Ì5 ½ø¶½Uœö>£ÝÆOûŽãö_§}×õŒ ^.9]¯³b‰ß2±Bê|v% ×X0šæYqJ vÚ'¡gÙ†ãŸ~Žÿ>‰â­Bžmÿ¤æRò©ê~[uBB3ìù¡kÇEí“›ËxG7—Ñp1z'ß7Ø L¿×'ŽI<½­mÛ1² ÇŠQžœÚ¡±RFKÖªwßä_ÊSä–ÇÛ’ïNˆ/ëåªùÐû¯²J”üa» *Û€³‰!8Ü!jjíwlîkõÓö÷Lž]M£Åx4\œ?c6Ù·[úQÚ-ÝÈ»u3Å¡vÕkƳ…(_§b‹cÕœG‹ùxvq«¦í{蓚s­@þ€¬%}%å„ÌŠM-¼åå)ŠÃ†³û¬¬«ü¡Ÿ²Oq –âÌÜ™=|¯Ð(¥KAWÌÍÖ4áå/™½}‰öŒ—S;nƒ0 Œå4L®§ ÜwíEC4TðK¦Í¯£Å?‹q½Ä6@õ]Jóî•ø7ž ¦+•¦);V¹Ñ|z1‰âñìEÙ±Q§3‰Û€¡k¨´/ñêàòËõ&g"+‹cU¼Ÿ¿ÎÎ&Ñâ7ûÎ’Zl]¯°¨Ùzƒ*[4GzE‹4güX ®fgóÿㆩŠºHŽJ5Ñìì[Ñmdnj@fñ¨'Äf‘"X#3­õ"Q¶² |Bó|;Ñ¡¾MˆéÚ.ŒR€ç7è2vS°ïâ“åYðKº´¦ã;ÍÂî»q|ßt ûzâøÃèrx½èn*ú˜®é^”ÝŸz¾AóšiÙòvG&]MóWªTÔqd’®Å¸µ£Ó8™¼ŽÞkeàahÞ“Ì’Su¥|/g•9’GsP° BJïIÿ«î!0î”'q_Ü b& 7‘Âcûm |Óí9®ezóLㄲý–pG×·»¡²ù’%´tãgBSeãÅ*ƒ ÎiƒÂã¶æŸ_ãš ]êi7Ü7À =ÓƒÛý9égŒØßT™!¯·;8lHƒÀ#Ýñq=žÎãñ|öÛZ§mt·{%”ÛǸÏúªª…PÕ:ÁÁöMßñ›ÿ£SE3°ÃFb]*Gvlí4œøÃ€'[ ‚Z¶†JpVÛôý÷9½šÄã÷чßÝŠ®U+š‹ jl_7/•à%6lÛ |XëÃq=MÏæ³ÑÑí‹k %ÁšÔ8è:À$µb((S}ÝêršA|âÛ^PìœÑJ «lŽÙšuµ¨iÍŸFdƒc¤óly"¶ÛŽ@®-ÿQ]‚û²ûÇuÉv¦g…ÝÞOßGZ®.IFR-øQ±¯5+½H÷ùu¡W¨ÒV`w›f4IØFôÕÑŠÊ¢K‚­p³u¦Õ£Í™¢}$\Jà˜®ïí¼P95/öÊjžA`lR},k(”Ná"Iù¦|6!È~o0žFógßiOÒ!ðt:!S|àƒ©Ø=IZ†N&P$ÍR$ŠRs8KXv¯3ZŠSä?î/ßÍr¬t–dòuÚð½*ÿâ-3Þ•ªø{òô:èB2ðf%¡×›Ò&Nuá„ÙÝÞ¥Q wÞCg\ùžé’A«û«˜¸iÎé¸ü~³bÇ–ÓMÅRÄ™…~ÍeUóH”qÔª TÔÕ¡Pt8þ)ÍߣNƒ£ŽN_IÉæ_ŽrG ìÝç-²d<©87—&xäµü·•ö™\Z !}ü€_ÿv:Á M2 ¨–’p k¯p¿øÑðÿÒí™´'ílè´iU ǵN¹å’Á8—.ÉfT— „ -¤œ ˨~ëÐtõæ·àÑœ`³«É)›nƒüû)Ò²¯û1| endstream endobj 492 0 obj << /Length 2546 /Filter /FlateDecode >> stream xÚ­YmÛ¸þž_áo•1+Š”(Ý}JÍ! îpÝì(rÁ‚kq×Bdi#ÉqÜ_ßÎP–ínŠ ¬ø2$‡óú -W1üÉU¯ŒR¢Ðùj»ûÑî~E«_^H¦ÛáfBù·ë}¦+‹".äêúnºÕu¹zý¼³ƒëÖ¥T”ü¸ÞhF¿wí}g÷ûª¹§‰c5ì¨õËo`CGWΖuÕ¬eäÖ™§q)³þpý¿J“ä9GÊgX×&©LWY®…Tšøÿ¯u®"ÛUö¶vð|X–­¤Eš&¸l£rZÓŠªÖp\uõûòPWÛj¸±Ý=¯™ä"_m¤°Ü/~ç¼~ -}-}š¶ÙüÇu8¨ãèó:Í"[MVwLÛÐ7œÊK׉‰{×U[&ëî¡ ÃyÄ$GlÛž6ïÖXá¶ÕŸ±Ô®$’[ÜåļíøàCï:*Í’èÍ€÷Ðm$Ë¢'­¶M}"µ2ëUIUCÖº·US¢ ©·m÷{Û0åÝ¡ÙUÛŽJ0 ´M"E–©ï¡«†dô¿©JÆ«J9‰&êÁñöކ­ù‰};hÅÏδ‚$Aõ‰(¼bò©bpôv²éÈ*&Lû5wmç–侸íað~¨3Ü€ü ÛÛC×ùöH?m&úØäÚ þ=j¿¤q$œhÜ44l©{Ö8‚,dÄZ_àö)H¾‹¿– ãfß–î#+HLê­¿?ÙÔp´tMKbÆ^ä_zêQ›ˆ7c>¨³o½K‡®|¾¢á‹Àʈábʰ’…0© w•K—*„J²@±w¶éç\zaoTRˆØ˜¯ý[«xj+^íIAz†)··[¦ò1p‘Ÿ–X•:yl#ñ« ÆX^°Š;;;бŸ«ÉY(4æ† -ØÏgä… é ºÞ…©ÒAž‚”äÆ=ùæp[‘Ë‹›Ï¼ãÓGTŸ;ííõÇÀõÑÇáÍÛ ºËÔBéŒ,“Ì þ§9§ÏDh0Nˆ¯Wè£*££ŸÛf­$˜üsMåš­ŸH£×ëBGì)ýù%b#ž^•dÂèóBÒ)¿á)–󲡰L;ª°ã’ZÐMÈBÎ<Š$Ï¢&–$'Ï€~éúmW==Ð`?tdïÐnìžG!jÑR÷ÙK·;Q7Ä¢â})æakk¢CiÓ÷Î@›eQ§G€}‚Èw !ÊèåRôé[ò?<m$á“p¬<×ÕÖÖdþàÒx¹mîõ)4Ã’[i¼Ѐí{²ÕmeÕœ¶FóÁNï>yyéqWÕ.0…ò›r=×ÅKÔ¤b²Ê2ÎâY:Sˆ‰x”€tÇkh¬sw®ëxŠx³&)!Õ\Ëç¸þ%ÙRÅ»x”˪Æ#ÁtV»E™· c}u¿ã‰]\B9‚ÂûW!:Eð¡_Ý`7W‡Ûö0þ”qG·vûñh»ró±ªëͱíÊ%³FNrØ}¶Œî‡ÖÅM/l°¶Àœ[j.±(5:KâØ„¿%.ŒI¦1 }vâÝÜ/óYdר1^žõìÀJNÊ QÈñ$´€E ot §sM}›HeŒa(1¸(¢WhÎiÂ>’Êèë×íè\¾Õ·šíwí¡.i y8Žòâæ‘„— , ‰*„6I¢cW |ˆ”â<ñ6õž¯bÆp ãZËߣ÷œºÆ ­õ$â$ÜW®JZ6¢Ýsó½¶£Ù²­€i*´Om?ÞÉ¡z1÷5°ŒC<~åà±eyS:™_—Åse¥"7ãº?ÁsΉû¼½‰y 9Çû(ª„‚€Òú‹%Ñ(¹—4ÙÕ¡–û4i*¿ùJi%Îb™öþC¼*aƒÇlGOº_)H‘ÈX½z÷âŸ\Ì͘R21°…{%:$í3´¼89SBоËÉÀÒ|~0jzáÔOf¾Ï©E*’b~*ëá‡`ga7Iš ý’[À2K6¡À$²lb‹ÀXN1?âUY.á¾D 0ÆiÔYÚQÅ"<‰‚*7œz QWÞê …Õ~)|ùf¸? ®Mgѯv›ç(\%Ïǘy÷êQ+©%Z|M\Ü[æòÞ =k#CÍ,ì ŽðÌk5Öw âÊJÂÄ àœ/ÝüöZsXD* n_ÝÒ‘ëü9¡'`(i:‰Öòø›ÅBêŒ$Å]Ú3†œ4fÿ@lBuDœo$íSÃàË„ž¼lëì[T°0o|a #†ZÀ©åaYºùèNó£Axú,<Ê1#½x·øƒA™/:èÉDÎ’Ô-5#¡8 ý@P¶­&UH’ˆ„ú§ç!û€Ï68€ù½áÈ@[ÅáA'„*p×”ôôóë™!]B‹Bë™Åz|]˜-pö¡çŽÜ˜fehµ¾Ê,²q¥çWB:²‡z—qÃDv ªIQ„·ˆâ«°ºB(ª!ó€ÍúU#ŽÀNã\9ç¡l—qÿÞ^öQ œ¢/;„{–&' Ìø=¾3<^œ1 ÎímðuXNÜKaäÐ;ØqãJêêÓ%ò¿x-aŒBX†Ãצܫ=@9ŠÇŠE%2ˆPc±˜P±øÎ—JµÛ—õâ[ªƒŸ¯ß†ÂÆ×Åõô\/…í{µÝr³õµø†Ãý‹‹0ô/*4S,*s€÷nVwùzûU?+äô¼n«Z.oéñt@CóŽã\s±0ÔìL¹y’ÍUljB2&Æ•·pÀÕÑJø1°§Yzm˜ÒOµïÇÃŽ÷^mÜéä"&ú7Io‰0ìëZlìG5àÉl­Í‘Ñ0áùùÃ×{jãöá3æE©ûéz|ü¿X:};SSëÊsmK°‘€¬5Ö¿TgO_Zîd{¿€_cè9ë_'¾+˜fSxäånnmç0;Œvw«³\dZ~ ¬Ñ…¯?Úª\Ú®PHó,$“Y@CÎ íÊ ‡ÎG׌b6–þü›Kt|‰Æ "Ý? ™pþìþA2!ŸÁ™þÁ»)6ï0ÆwÔÂüÔ§°_…ƒëš]‰^@ Þ¥…\¬R P}¬7ö¸vûTÖ€Xåu~"¯ÃöòI³ "øÅÅX(6}…Ö9¦ ßVôœñªGðƒ´gü€;±…<Å:bz3^•b0” 3Š\åOàÿ¿ƒïžž²`eDr³ßT¾¼>²­‰Eläó† ˆÙ€X ™Ã×éˆ=&/°ãñ6LáG*^6Æ-úåê´ yæ wI0€G³³ÚE(ÿ .#…l endstream endobj 500 0 obj << /Length 2648 /Filter /FlateDecode >> stream xÚÝZ[ÛÆ~÷¯úR*°¦œû0yKQM¢µ·…c,¸Ò¬–°D)$µ›í¯ï9s†q¹’¼Ž]´0àÎå\¿9çŒø,…|–¥3+%Ë”›-·¯Ò0Z­gÔxûÃ+ç-`âb0óû«Wz£õŒ§,K3>»ºnuµš½Oþ|—ï_ÍRÊD|;_(¥“¿W»u•o·E¹¦EsG­þöOl¨ä­ÏW›¢œóÄÏÜéT$ÒÍ?\ýøê/WAZˆ )Ç™gHW¾Ú™qŠq©ˆü÷oæN&‡rÙ;¤åR ÍŒs–i-páBº°2¥5?ùÇm¾ŸÃ‘:©6×Ûü£¿þHca±I‡§ri™ÐY»ø—T§ñŒlx†bB‰vÒý\¸dW¬¦ö°†»Ávædž¼byÊ%Õ¡Œw¾¨hÌÿz(îçÚ$ùÆ“k Lä´ÜuÂÆv{°KVź€ñ¦¦îsgî+lØduXCé1'áÌÃÖWÅ’œ1¯ÖÐ-‘­¦fa‰Ô D;[€Zlk7/q’{4ßÖEVE½Ì«Õ)/Q’i©/ñ9öCäd`¾»;ËÀ¾ÎúŒõuì3õÊ£Ý Hˆ¤nvU¾Ž¼®wA%Ë"oüŠ£ ­rT(¶À‹:-˜âª¥óc0Ïž§cj%ÐjL;—!ðòäê.ºÌ7›€ÊHëÝî°‰TÝ"+Gs®˜ò޶ýÑÁw”ŽFc~'£AROYŒP̦æs,Æ…«'ùL«á0ωçŒF:ðö 5z£ÁÑ'FƒÁh¦Ô£%3νL= š ,£¨é 4ºWF¿N[&ug}ϸíñQ<å,Õݽ€ޏíx¯7‹ˆ­Ê1kFغ«VE ìU‚gÕ#XÄ/Û|Yí~g„*ʦ³5¿Ý7ÿsÆÆG׺´IØ_àIÿöUP‡IŠ[ú@TyjæÔ0°€¢ìkêu7 l¶Š‹ãÄÛ(å:î=d i'ÌÅöšõjùŽ §¥Þ>¥ÞêɨD çÈ#çËÃ5÷xt/ÔÔë/ÎZ°Ì‘W Lá(•áu_S£ö÷.䈑¯Êv¤e¥¬ò¤Æ8`&5Bs÷ˆ»à1 ÝÇü¨ƒRÇ¿K¼ËËuÜâá® ¡È‡‚¸W‰a óàKE”/qÂ(Xo‘AvSv¥§5!@Êâ$#PI @Ïã~UÄ>ncâ1ºÁÛ]Ìüoùv¿ñÑÉ?ÛGáøÚ7'£qŒ åWÆ…cRÉ)¿2§ „µMŒŸ®‰ °3ÝY}­ç$z – =4=»§QI¥ÌÈî6Œê‘OÕ£Fê2Gê@Jf_ÐÒ¯o¯Ë|ë'5Râ™ú$U-›šÈoÌy¨÷Ís§dÂGu>† ®Ñéë˨(fHˆŽÐ >lóˆ7ˆ2S’ .Ïï©<>DÕG8lj#Ç\&Ïí ’vÛÔ 5ö›ÃøáyˆÀáëMÇ8µ>ì÷›"D0³ˆRȧ¢3n S¦‹À=ãè K‚ްÿù»ÖÂ]›õ!ÐþÐT1¤;[h#áê¢\aX°Ê ÜÙå}º&ÓN^ô³'ÒöÑ–°wžü"Ù$G{ß_Í8þײˆFú¦Øø¯©½¶JÔ˜x…Ñ‚¼Œö8÷4éÇv¦On!;ärŸíôËà|èòßLyþ³no ûï"´@‡³ÙþŽÒ@NB笳c™O»—åÉÿ>Ï¿šÓ‡ãäÅ^ßO?åöqÖWðû‹Èïÿ$õ£-¿Œë3Ôú—A íôMEûÓ ;Û8؃Mϧ±2ÕLŽáGJŒkQÁ‘/BË&»ÛIÇM™Îô «"Z¹6÷…5˜P¯1!ã,iŒG?é£XuÎ:–ÿ0u¶fVtGW~]Ô6úÕÔvÊ0îÄÉÝ2f; ¢ ‰‰Y—‹M~³‰ÌPêC_ãVŒ§ÇõªB`ž“ $ÄkÍåy¸Ñ“Ú<…'’UQyŠ– a¨~Š72Ì‚w ¢•çnêvöb0}ÂcÇ›ŽðƵx$ ñÆux:¼Ét‹7ðý)Þ¸ ®=w!ýíì3ô7@ÎBg"”~'\d!-$2vtW< ;°ÔΖ·mê/”JÊ]ƒ ÙùBè„ ?ƒƒ†Vt¬iüæPl|¼(©? ìö@IýÞ²¯|à‡Áá²=®ÉÕŠFrê¯pë_R.ÃÍÕffdé‘™§Œý‘g@ƒîplÜÒß! Ø'ÐH²á;Y ‚7"Kþ…ÀŽTãÜŽjìT~¿É—qw5hô$ŒKÀÃ'"·}…ãô^Ç“u—i‰âÐQªý›–h/C) ðŒ'ñÅN!óàk[‡¢ÞvÊk ,ò8¶+—qìw Pwí6ñKÝÛÒq²m ©¸ íì#muïS Ó€Øv mè^Úf\P§ 9}z¹ÇÅÊÔÂ]ÿõ¸ÓA©Æ?¤Û«ÃPéôn—¢Ž†ŠP3*d •c;å˜N9¶SŽí̤{á4Ïj…gˆ³ÜŠŒ9ÕÍéA¹PάâédN–JÉpôJ Ó f³£få·;ü­˜Ø‡†Ûã ¥êL oEÍ#¹B?rïLä9ÎÆ„1˜NÔÔî‚oˆ’&öö€>œÊdø¦ µÍÛÊ=î‰Zîö-sHÇdd’^ˆ·£‚ÄBŒèO"~@¦DÐ‰Ýøt|ð®NÖ•Ïã/0TkÐj è:9à_O–IJV_`–‹£ìG¶ÙŒÈÙÿ¦ƒSª9IÍV³ŒŠ?ã*5åAWm1ºšŒü,KÍK yOjÜD»Ñ.¨” ×1ƒ´#I–Â!T‹ÔøfóKf £g ¦0¤ÐF$ßåŠ<ßjŒ§ë)JÑhl ¶MÇcµÝÿzð`îí«XÅÏžu÷S…2W@L:¢Å4wÕî°¾k-f¢ªìp˜u)z!j!ÁËÅÔ¯ Ú—)ÒáËÞ·S1&ò¼W¿Í—õuÝ@p{æùŒWô¯f¯§¶6Lëã·¾ÉOlšY&8·gŽ´é²ÙüvnSyù¦÷Åu|V犹Qyo»»÷Ç͉óøZêúóè¡©œL9$;Öƒ“é73`2'_~ÐeÇu•QjÄx_zù­Br(íÐcU[+RF'+›6Íë˜Ï Úèi¥{8î¬;>=µ/]eû¹Å²-=Ȩ%úÖaëÛYyÃÚ ÿ?A«Íp endstream endobj 503 0 obj << /Length 2717 /Filter /FlateDecode >> stream xÚÅZmÛ¸þž_áö!fùþÒo½¢wh íÝ^¿ä‚…bË»Bly#É—îýúΔLie[›µ[YS"5CŸy83›QøÇfŽÎŒÄI;[íÞQ·z˜…ÆO?¾cqÜ.“‘ßß½ûÃJÍ%Ž:6»Û¤¢îÖ³ó??fOM^-–Bˆ9ÿãb)¥šÿ³Ú?TÙnW”¡ãkÑ<†ÖÿørþSž­·E¹`ó|±dVQ>nññîoïþr×MHq>qæ8òÂÔ•Ð+gÚJ„ óÿ¹(W9ª…Ñ:Í-aJ€p?¬ ³Í¥ŠÂŸèÉ×”(£Û'вn²í¶†ÕR1ÏÂO7¡±ß„ßu¾É[0B¼ÿyÁÍ<Æ >ÿT”k0aÑ<æ¡ñ+e²ªãM±‹·‹x§ˆãW =_¿Ç ‡WyדŸ-D + “ζ_ÜÂláÏ3ÈáZ½ØXgåît¸™5ØR¸2¼±:ÔÍ~ÚqÞ¡?Ú!_Ç>ø±ó|³¯òVR€¶»•y‰ðT²Û !)1°Ù¯Û!fXûÄ×¢U€“³»H 0íÂÂØ=Zä7ü“WU±^ç%Y,•bó?•`U &Û‚”YƒFÖn¾ËW8ø1+‹zn“ak••¡‘uR÷źU€=êpQÄ_0@¸¶ [‹cÇg?³çpÑÁ—Cûë‡[J xô¿®Q]SdÛâ÷¬)öñöæP®Ú+\×ÅC‰;ˆW8ƒ¸ómÓíÊö¦\5‡§ûÇýþóئ8F˜í6å·…Òó¬*²OÛ<èÁ ­ó|H R[Â%Ÿi)‰¶ü=´£—ÉðŠ ‘'¶àD˜%&îó!’Z¸îß 4^XKýñ}¸ù”=䮉sC,³3-QâÒšÚÑËdøÈš†BýLÑCHäΉ5Špûïó:®¢ÅBf½Ëʸ‘À:>y2÷È ’‹„r ‚Q,òí‡Ð(-¼ØüãCŒ8¥8Ny)¬H@T”à8Š+D‚ûþ3èôiÚC’#švHBÜDá..ý¶u¢q M·O¾º÷aMÕ¶Ý¢/ÇMlX©œ!” ´ú‡t¶†Np7X©š}õCw3A”ÅUlg?¿ûWÜ›Þ\¸t„ΔÓÀe:Ìiµß‘×/5 `&ÐzÍ‚*Øœ¾bÜé­xÒ+i0Èúj£õ¿ëHgdk•!R¥[;ÊïÀâH&¼Ïyßdê#’w'|‹å±Èh7ÄÝiÔ“ µìÿþR#• þ€³y<Ü¡±:TU@¹}·2ŽžpaºËžð B©æPyÿ„Þr_.Ï«}¸z)?«óöü·Äèù¨D„Óá¼#Pò¶X­[sb¸™`D¦ Õ݆àFá·ë q_”÷`£141Ø%Ô¦oa vbq Ò¾)œ œ*X†`—˜8ÊûÙ4 i±Ý×|‚* lóë¨lH=P;¤Š÷Ê\h¢ÕÀíÿî]$º)äs2!@zB0`YO0¢ÍN ÛŒ¿õ l±-§²IŸL––s+*ÙÜÊOûC»ç:¨QËo1áD³ÙsÄÁ ×—ˆC§§‡$B‹›å`-AZîP¼.÷ML·˜g?‡ÞË{¯O•á¾ç¼1f¼€$˜Áë¸PÌ„°æN¹í[-! Ñ# 9$ Ñ8:M@T¤aÊ%þîÜy+``À1©ÀãZ¼ZhÜݧY¾VF³[1Î{@y«ÅóûkÑß™ ŠÃù’Ô¿nÆ‚ X!¸@Zò&.‚è•+ãe]$A €T_C±d†8§zŠÇ9PJ >®¤U*¢àØLµF ÄtP;Ñ÷º$Ìò8ìETˆ«Ñ5Ä@ìxŠŸ¤G& áÔLåG à4âG_;AèQMŒ«D¹s±ÒJc¥•vÄŽ££ÂÝ££ÆÑãA™@T©WGe°GRôshIÑϰ wCínxèR?®ÁH/Jœ7LþúÁî²”¯:‰,C-¬Åu¢D Æ3E)`K^$|{®9"[(bµºìh`R©ÙäÆM3?SâgKˆìâ)lÔܯààkÕ&­'cŸGg:xXô€¾^ц¤qÂRi;¿{ô;Cï nØ“[g»¶¨o!1¤pYDL÷ºÂc2FãïŒ!´Û¥:ßn–EYçU3ú²H¢õa&åÏc@Ù¥„êe“WÕ¾Š8fÅJvÝlçˆãs¥™—µ×,LHÔщ¸Ô—ëRcL/’? t ©&Ÿt •K‘®T|-†#Òñjƒ[Û‚oœÊÅá¯OÆ""ßËŽ¿ù ÂÚnRù¾•Å1ÊýƒíøQ”ª„±zîòmpoÞ†sÇý»[à¼å¤s`ÇàÚ¼ ë£u@Ü_³7–!³€£(y© ¨ w슅¢ÄÀ=ŧª€€z­ø’´ž,Z"Ùÿ¦Æþâ]ÁÔ†Û^&S·™i§ìÉÿ?ùêÐäãY;ø»Öÿ×zš’¡%¥¸‰×E¬žu:6H.ç‘«}YG¯ð|yÌbˆù]Ô×Ï`B¡¢'Í)Ï©ÜR[Ë/b_+8Ý—øJ@äSÅBFZ^ñCÆs­}ñоà‚áôÀƒ7·Â ~\£Ämê¯uþe<*œŠ+¥ÝŽüK[|€ Õ @æÀZÌÞøŠC §úš“ãü—[N(RáôZík=Å'ÊÔù7eWЊõ·zZÛ ¬ñRߦ;’÷,¥iË”&ùŒ/‡¿ ócªü©ÊkÌM̼ÉミüçQaxÂçuSax5hJ§ð°´Ûaº?e¡‰0& 6½Àb;ÛÁ±ÐSe‘Ç—Ëçá¶âÈ÷ÇOŸØ  ?Øz(Ê2$I4–m?Isizz隺M× k—…ÎxYæ_ƒŒãkí:ÜȺ«¼®³êɤ—‡ÎÊG˜½OÒ‰¶‡\#ÅãSˆ~%—÷ ?±Ã"DáÓÕNÚâƒ&ÖÚ›Qä¹3UcKÝ€*cÍÎ 7ÈÆ"a~«á”@ævŒ¿‰O˜‚¼ \eiu©z‹&À×ÐÌ)²êkçO.à1ʯ£¹Ô¾ †CN¿«_N­ÁÜ]N­@H½_ ×¾~q2ù&Ì¥dŠ]G2µLñfK¦=!gÈbSáôDçTéËx_£JµœeRí·xÚ÷<àžçÃ*TGu=†š\ëµ´¥O©zô —>eZ ‹=ž>¥NéS¶âþZøÍg˜|fŒùðOø«Í¾ÚùÍ’êÄê„Â/Dì7D£'Î]û&/r»tÎãGÎ/k ›ñ´Ê¥¼6ÏÝŸ'oIëèÿ*Áu endstream endobj 511 0 obj << /Length 3035 /Filter /FlateDecode >> stream xÚÅZÝsÛ6Ï_¡¹')S¡ø$ˆ»§$ÓtÒ´™\â<Üä2Z¢l^$Ê!¥zÜ¿¾»Xð3%7Joü`ˆw‹Ýß~€bÂáOLŸX¥˜Óéd±yÂýÓêzBƒw??aÝÎ{+Ÿ_<ùñ¥1Á™ãNL.V}RËÉÇé‹›ìv—W³¹Rj*ÿ9›km¦o«íu•m6EyMwÅî†F?¿ù€=}—gËuQÎÄ4ŸÍEj¸œj>ûtñË“Ÿ.ZŒ”'JŽ+ˆ®-ÌÚI’j&”&ñ?¾œ¥jº/»b‹²|B àÅd"sÆH|q®Rÿ&§wŠr7~fZ­/ë|wù9¿§·>ДbJêæ¥ÿrÃm×§­™ÔªY´Ø–õŽô´˜I;½É‚bŸ~žÉtšß×ù—èIµntõ¥U‚₉Tø*'Q ?ñÉ&™pf„™Üù¥›‰b&Å ­'ïŸü;(k —â†%\µµØn6Y¹Œp6 s‡s"˜ÒrÈyGa K´<Û4e©QC¶á0ž®‚…ü€2LæR;º™ Å€…_ù:¿ßd·´ƒ°œq+z!‚A ¬tîãiC\Ð⟾ì‹ßg&™fë¼DSØ‘í¶½v$ˬlͬôª(—h¦`>—EyÙÊ7ä,$g²ù½ &,ø–p,IÒóxÍ@žÕå¾¼ÚîɬÆ:©eÚ~'òç(4Ðj:æWB§,AÓÆ+è[ÌLV`=-.Žù•ähØâ,œ%‡œã~%¼ÆåyتppÄvìW±£7pò@☻«ÁÊìðŸƒÕ¥tËacZµ&ÞDŒ´2`z­­« è 8I³f¸Qôp [ÎÅ 4ºišp|ZÔô½ižeë bä=-¼šÍAVï&ôBIÏw79=Xì«*`Ã:¼“0¿û-Ò’°]pì_Ö¹޽Ëwûª¬é|Êm9ÿ#¯¶6ž%<%–è^YÓÔvEO²°¤ð‚bØE±ŒiNrp„äÄ“ÐÍ®Y» þ :ŒÑ='útÓöL®;½ÃÎPïÖëtfù¥ pè¾'zè蟚›ï‹©a©2§£I¿ðÀh`îÔ‰ÀxÎ 08? Œga€qÀöë„Ã[áë&O&mZº£°)dÊ s˜‡P“s{2jrEM#ÕI¨)!¯´Ô4‚PÓԄߥ‡Lt® ³Èķʸ,˜a´,äF%Z1(sœ X GÓŠÑÂ%±óÿ.)kLÁBl:t«CUÀPý E?é_Áº3c¨{† ›ø´â¬ z—yU,<˜FbíŽð$Ì,º\¢æý­ßKürªiª:R°æ—Ù. pkÉßXM ŸÃ6\B¡\‚)qé)½ÏËE˜ªòÛ*¯Cj‘/éáþº©wVü1ƒ’Ž9u²Ai“ôdÈ$«®Š]•Uù-9y8©¼Šº¸Ðàx­®PõQL 5(Æ”æšs(‡ÄPŸ;¯ ’$R†µkÔ™_ž"äôî&ÛÑè³?y(€ÿ^R?*ÂêÑvÃzTþ§ST·Î™“TЦ¼ÿBª˜b6Ü›<£yH+áG±…qÿ«ç_Éð,,`‹¯Þ¿üðæÅ3èaÚ7:’€˜¼FAeÈå0€m²…G_©ò‡ ›:Ù±ÿíÙ‹w§³¨ñÈ p×Rõrê‡ùZˆ2.íø¾þíÙÛƒ|UŸ/-¦t Àb“Óš$(ó;zÞ‰f²ðB™/òºF—„mÉåM²ú£ú©(‹]‘­±l0H×¶[„ß>°ëÝÝjôØ!<^né71ÀAMO‹:^ÀvÕ£ƒo¢D¯Pê¾l‚à‹)àžœ;˜¤*)iÂ-Œ¼Áª¬ Ñ ¤‡£1òÑ•©G ÷‚Wˆ ]}µŒ«îŠ:§()Sl2¹xç¶´ÀÍþÅ`y›Uu~ ™õáp i‘4î”pÙn~âšîn¬¶ç,ÕêxmŸ@¢¨G…È[ä‚òG ÊAÞš H€9Þ)†ÜDRv nã³Kø}“-iÐ./é'f64ZUÛ ½’¼¯ÐNClïeGåí~W-´’~v"ô:'&™ À#¤Õj[®YÂ0®kC8Î\Í0%ÿ -KÈéÆÉ'‘#$ ¯Šìj²Ñ¬®‹ërÂ~MGºÚzË[Ò/´‰:ÏÇ={éÀꤘ€syû}¸o߬ž÷–Gz÷c¢^ü÷yp@`Á‰õ1Ü,„¼*‹¡½,Öù§àu·Ùuh]è±üP €åëåoV‘L´‡î͘ôYÚ›¬h¦—ä—+ØøÙ|ü`l¶Ì6q^<ôûx¾*AšË¡¾#Óm,ºòÐÒ„K†%ÃoÌ8û•1ÃCï¼Ñâ .‡®Ømë+·µ¶d1Ѐ7&5{Heïƒ ‹çÝê˜= IŽÜô@îÛìÜ KfÓ¤>ÚG„Kplb”=æ#ÍêyoydOc¢Cùñ¥M°qÀa9¨JP N#Tà‰œ>ÃøXcuîSÂé¢Èvt!iÍôåÌéi—°Â“7pÂ5 ɘ`ð¼¡ci9¶žY¢‚ò!Ÿ¢B^´‰°Mlã®·hww4{?óM úás&XƒFFX,pNPÍ)šâFMbAë1/±SßÛÝ~n:¼° ½"Ûø,hI+ÂŒ¿EÓÇáY» ­„dz ÀÍq.Ú*ŒÊçÃð2‹]±Ø¯=,ð~T‚Ma‰9(Øà¼*`n“µÄ°ã ÉÖ8‚<¾<ÌÒ%¾+Ø@{–8ƒÞêGá♋&Ïm­WM¢É7Ú"TØúͨ `™—Èà2`ôÓªQ^š;t‚ ”¤òLP}¤`zpeÇhY»Ñé£}3 J4, ýšP7‡£œËTpvcZ ¡®4Ló`¥nYÊÓ£t ÖtÅ U¹TÙÁ¿e^/ªâ¶w…ÒîGû:¯ü fº)®ošFÍРhJ U]4ft÷Ši0ÁP6 4P]üØÔåvn"¢V˜`ðøöëØ È>Æ…ç¸o¦Ç­°úÍÑp þ4Ò€eV0kìñ‚ÃÁí!ÃNÃvÃN$L<Ð1À‰ŸÞcM\ÒëJz⽺<ÂÀÓON©¬m¿­­ÜôÕ*ÞAê÷Ðуè+DÏ¡b5ï»æ›¿þ¥$qد•¥h;Q}¬îŽ„2lä 9hõ.EñJT ®@ç&µ6 YºK»KŒ£ý=Ãk8’Ò­D¬…wwâñûwªÙ?ЮÚîGʃU¦bØ¢¦G¾Í‘ŠnͪYH‘ÿÉ"= ›dq¨„•0æÚô+ŒhLHÆÅ(&Ð'+mY)u¨­õ¨úT»^ïn[†7¶«¨Kðî—#mDÕé1ö¹ŒÏ¤OëÌéE&Ø ŒIçXªí‰MÆX³ïUPÓ.#'¯›žcL|ðáÄøfegÍUVÖë ›ÇjÚ2—¸©9q`\]OV¨Q ënè Ð=¨o¶ûõ²ùÎ Dˆ®¯ ?ÀÇÃÚb5úò Ë*‘Ò€õ¨és…Ð$[c~¸ µ 8Üÿ=¶^âW\±ø úKúæ,/t|$SR‹¯uñG»_¯P¸¦Ì‰oû²Ä%žTbÌàžôpÖ0GjÍñ¹ˆGyÙF²W<ÑãQ”O}”lj¢¼çtêW.ŠYÕ}å²"â ¢kH›#Ä5h¾»oMjTT'ýÛ´"l¥wkK8³N<úF\ðæ;Eì–7_,4'ˆúŒ®h!ÔuFÓ€I?¢ ?§©£=ƒñv— ] HðÁ¡$_.‹¦Z !ÒOwíêñ"ˆâÜ1UC>Ûº%ÔÁP*ìòÊ'UšXï².㯃4ñ, \—j„u{:¬?L  übtòжÍã>’÷\·®¢n]5pTM÷Äb½_†™ºªþÁ·g– endstream endobj 515 0 obj << /Length 2722 /Filter /FlateDecode >> stream xÚíZ[o·~÷¯ØÇ‘áe‡w²oiÑIƒ qä‡Â5„ÑWhvf=+ʯï9$ç¶šµäJ@_ ^’ÃËá¹|çBÑM ÿèÆ¦Í9±Âlv‡7©mn6¡ñþ‡74ÎÛÂÄílæß.ßüå{)74%6µts¹Ÿou™o>&¿ÍŽk.¶œó„ýõb+„L~mê›&;Šê&|¸/ºÛÐúá—ØÉ{—åeQ]ÐÄ]l©‘)K½øtùÓ›\ŽIÆžI9Î|‚t¡á«Þ(#å"ÿñû Ó¾ÚuE´|B `¡ÚPJ¬” n¹ñ+Ó°¦¨º 8O&MyÕ5Åá*kn®öM}¸ºs­û¶Péülª±tÜâß©LãIv~’ LðaÒ®®Ú.pmwÁtr›E6¿½»`&ñg½ #-°0)þtÿ>Œá–·Å[sË5?¥›>þ´I‰¤rsï§6œHƒ–›ßßü¸ Ž[MŒ4KF KW½ÃÓ7[& I…Ül)'°»ŸôO÷pÈŽa&6V8¤S’j:c ZÈpk)Iˆ›Ó0ùÇ=ì,uÒݺƅfцß,üTȰþàšbÇ›èúá.Žtã&¡q}±E.ßUU€fxU†áz? n¢‹ E¸E7 hí4®ë› 6Ò<\ƒi»äî0¤û¡ø—©hPÇpt‡4ƒŽe;oÏøÌså®Ô¦DˆçÞT:UÃÜ}]–5ο÷×Z³~™Ëˆ°0‘\Þ‚`˜ JØ…–í2¼<¨ŠN#®`§o]Z]¿,iïŠcñ´|ñhâOLªÐäFr``©28­øþ¶Œ C¨w~2®þrRÌŠ2».#-Y;áËŒGÔ­GX©ÂÁˆ,kL5)¡æ‘­NYÆj–Zâñhz]“Å wšv„ç óиó_"¨¸Ï½«vÃÚ[o!5jäZ„Ÿ/¶Uê›f2.įúpȪœx2¹” B„µÿ=ï< "¿};rQ}©ïàb‹Ûó`lžÆlÊcleÚl¤…Ëpû"\e†ÐnØKcØ€þže+ˆNNó×9™sC¨bË“÷ †•c~Ø×9VI¢ôɱQUÞî-X‘œÔDHö¤“à)8;vâ%ÞGtäÌÓÿ‚=6Á"Â0$·àÖ«›6 6îØ¸6ªs01è:|ŽðF“‰KôøéumG¶³†°\¯ÍxÏ%GN‚F ›…&€‡Ní’£•Ÿ˜§îžù`¡0pu&&`Œf!ï§£¦5Cå &s¹‘B‚×4/Ó]ž†p¯ÔЧŒü´ÒüuN˜H¹‹“×U¤ @“^ãX‘Z¢Ò“c»è…•%ÚžÚhÁ18]¨® ›c)ìõ”qS¡!¤Ð ÏÿÛžypã3ªäa4ª%Ò‚ ›Ns'³Ô‹¢Á¤Ñ!\C ŠXÓ ©@óÌ+%OUvp4S 'âh¡Ñs›R4shg¹êVˆœeŸÔb<ßbÛ_›bDe&fÚ¬šk| ÉIÝWyè{dcVíBoT.ß˯æ. ®¨FöΦ-ua€Í´qNä9] æì9ʦ&eÛ A1§[K= Q°øëûm(™:IŽ|FÿòáçŸßƒí@ao‹ÉžãŒhþtô“ÚKæ~r+”9C%CôMG†.µåÄÄ!PQ#æ 4VuµýÓ5µ§SL•E)fîëæuË# 6ÊØè%EiÒöC¢‚½,üÜãíF˜¤tó¡UÄ_ŸUa#&Ä¡sÈòØ:fMœé!÷®Ö²FÁI5)бïšÝ*S` ŸLˆŠÒ ;ç¡Ñ¸-²5Ò\ƒ;ìÜp7$ ?Ìɸ8ZMü¼nü³@ºÁ¯òþp„ts è@|†²oJLŠy ×ÄrZ¬ÿÎ@”b¾|ó¤£5špcÎc”\¥e<ã±àë  ‡ÀÒ†f#,‹ëùLvéjí"^-ãŒáGü³Ñz^„鉬×T’bml–â]Õ}ñËk Q¥3=Ç)ÍÎá”õá×3`Jý0 €E‰ðظ`Â?¡ˆ±ÐÌæ1" ƒ÷8ä 14Š6Û ^b½ 0‹+|1/9„ÊLø»”Êyñâë00ã÷|PÔ÷Áj©UûÌ›­|%£EN£åä_ý]3[0(Hi¿ÉlCù¤È×Óž“òÄû„HN³e¡unžóŠÌ`{sñ”eD?€¾ !°t‹Ò|dö`Äqùº%1ÈÌgÂúVSòñ%ŒQõRéŸÅ·š}>)K=ñmuú×¥pÓÕœ†‰–‹?»„VçšCQeÞàýŸìx‹Æ®¯ôÂï]ª­q› ±çyà «&¹D¬¹ Þƒ5Ožpª/kÂo[7päã5+ˆ;O¿R ÈÒºrÛmøÍ°Œ`²Ã‹ ÈQ–\÷]øZÕ±”>uƒónâú¢j‹Ü!5\%ÿB]©û8ó¶îKĈT%ûƹ“&Ú`ÍÚ¹kdȰb¥>Ú™kÚwÁjz ,¼Ãx׬ÄB\ª§Ô [‹‡‘bŒ“êæŒçš=7 ^ŸÙl ¢÷·.¢øƒOSûM¼[^W.‚©¶#˜¾(š¿–ey> «ºæáµb g%{«…!HÆ@(ãSzQy³Taü^X|üzaH¤ÚKð5NÐÖF-O>Sâ4ú•Žå " èűCaÈB"bΆVófÒ¤gòfÐŽ“Ìî»<_’#Œ='«µvŒF|©ÒhìЈ‘´¼Û”6zË2~Ÿ¹Jè Òö¯þuO%ãà!;_b6ðgU†8Iéc¦ѺWÁ¹™a¾©þŽAvvÄÞ‘@Û#ÄZDË$`—x’ [5gqÓ“#ByxЃ9lJ]:Ò¦ŠÃá=ÎïÞ1EÈ3Ù¨c£r÷åÃÐÅ­jDJ‘Zó…Ð'eŽy ®3«!zžÅS³d‡‡doÓ’pˆVˆÙ)œâ)‚”T¦ˆ®‚¨4RĈ °R±ä;\ŠÞ‘³øTʵL>Ty=–È–T£³ÒD ò¿÷Ç覚.º£yº†ž×!›tÖ†çKŸŸ…oǬ¨J×¶Ãb8Z V ç8OzÜb?:@3:@'iÈŒŠyX†Â.úHA¬@ŒS>xÿA3cö&ÝÀ^[ŽH:¶!†»´Ø±MüÑ…á²_dµVø¹+]çÚð}ef ŽùZÖÚC3f ³¼cðø«Z@°°„<}ð9@æ|€|2XQÒÌN W¹zjo+‰Tú›½Ö§<¸ú°®zŒÆ4ÁZDˆ/½v*:Áz-ÉwöÈaü<ÉF³¾«!¥.¶CF¬‰<©×"nú’ Žö?Ì)Pô endstream endobj 518 0 obj << /Length 2507 /Filter /FlateDecode >> stream xÚ½YÝÛ¸Ï_á·ÊEÌŠ_u÷–d¤(¶ížóPä‚…V¢mµ¶´'ÉÙÛýß;Ã!eÉÐî¦SCŠÎüæS|Ã?¾ÈâE*%Ë”Y‡W±£¶Û n>¼â~Ý ®F+߬_ýé½Ö ³,Îøb½oµ.Ÿ£·»ü¾·ír%¥ŒÄOË•R:ú[ÛlÛüp¨ê-M^ W×ïèé¿?Ï j5p3ÉuÓW…»—æýœrt ï™ às§$ K„‹6¯;¿{CB«ÀrÁj­kA#ö÷þ5Ÿ€ ŽÉDNØ ¡|ÎØì”)°Õ °=o1ñ–¥@ÏkX²gèˆâÑ£¢qFY†÷ƒaï÷-x¶qìÄ%·¡‰ê¦':„‘ú0^{:dÙ³y[FMOEåÐ2+©˜é”¿`Ÿà:”ÍDDêæÌÞ°tð&`hkp…|‹ž:•Q^–¶$â³Æ¹cf™˜wI/û!™?ü‚ãÛ+s Çó3\&“‡Gº^šàeR&¿I«w ú—‡™(Œgu¨ÈûHr±~L^Ja¤:À•<µ'<Á(\s‚>à‚ ‘…|¥4¯Ó6–˜”Øûü~i”… ƒ<úr’g™Ö¿éPÕ=¹ŸEÑëI<‘ŸÊœ‹ö¯£¨ý)ÙøZ9ßÜTåÜ~C2nFÛñy/¨RÆS1ÑÆd×É2‹:´ÔÏùê3§lpô\rÓ´ŸHc\v9ýø€Ž3¤}{,œïHdˆ>ÏîvìŽù~ïl.216Ð8†*¥“hÓ6¹ó)8ï0ç5cëqX'ÿ{‹Ní9tgà@_ò €­G[“O}ykΙ„÷Àë)“FwÇÞ_ÉgGZ;°»ß.˜€#ÕgÞºµ¤{g6BÂ!ÄϺ—˜)­F§ä@û÷©¿D&$@Ê"Þ†’ËØÐÔÍZL™8)÷9 ’ßlAéË$`ã,|»o:—JiáC" ŠcÛúLŠú0 †îÏÛƒ><•Ÿ G @A§(©ã-²õœz¿I“ ‡ì,Ö Xt;¥‚û=ma‰aÜðï /\Œ¶i|ygóãånÊÀS´ê4¹”Ôœx€(ù°þQÀ,oæ±f&Mÿ¯@A¨ÃL›‚ðD›caûÛP±‚õ°‚’Æ% P³~þ/J˜Ì4ˆ·ô°Läa¿øåÕß}e;9_$’©LÃ^)Ë‚`Æ© –à¨_‡<ÕÂ6šÀh‚ 8¼xrÔ]Þúú²›Äˆ)FÿˆžwÖ°f²ìEÆȘñid¼±K5±¯3™TÒ—TR^šª`ܘÜÕôë²Þq=EdÔ`^8Ù`ù\R MGV”MØ—‚ š}8U)zº@¢ÆwD+O´»ÈÕ¯1—¶ Wƒ‡¡´ÜL{tÑh.´Î°°:¤œ9§¶Yf&Í‹Ìß 6 Ÿ[Κ`2²ŒÆÜç:Þ™ Îâ(01`ãì„l¼Šlœ0‡,¹°oZkÉóì«®ŸO Áʤ¾l@û–”0ûH¦ºu·ŽC†íöwàÝ'†ò®Hsx+ŸRk 9æeÓÛS2$ õ£¥–Åp¹³4ì“sBó¡…c°;Õ‚Æý„“žÐqä:lŽäâħk_ÝØþØÖÝ|^¾íÄm<Ǫaê”ËV›áPW•è‰óŽ ürçÚèËs‘¤0_¯þmÛÆC¡!DžåB•o%a Áo†øx@™çÝ©wTÛЭò™1^ÞWµ+4h÷JÐ¶ŠŸº‰øPÛŠš„ø0ôVp¢ñDßépãÐfQ’n7_µàá$÷tð Óè­}~¿r–mÙ\4”/¾ê-¦óØÃÅêEÞYÄÖÊPB3[È@`ÆÍ€CL>7Ï¥0Fkô¦.¬?çŸG$2àËdH°Ê¤L'3m´ì¬ MòB.‹Ä©¥Ð»¹¿èpïïB˜¢QåL ÜîG½ªóŽ7¡Úw"DH…Ž—Þšbjdî+X¨˜ºã]g;ZJÄAubðÓæY¼»ÔTpp W£ìÐ0ÿ+R%V xc & "ºÁD×–À9î÷ùRò¡Û9‘Ï` Òe#—IºZ<N}œµ¨1ù©QüÃò­8ƒÒê,@¼ Ák—ãÿÁ}ºR±O-bDsIdÌp)Y :pV6ZÔBdá¢ÛÙÚI_Âz:}öA*xáÙîz `G"´ÔÛÓ§i¦5ÔÝq³±í¬ÆÕø“†w“P_›øÂýXðÈ…… û¾~û"  «Þ”M ÓzúÑÔ]ùÆO/Ay2‰¼_”^Í@9õ x¤/¢xÑ’(®^ÂuÁ苯f À…O­°¬ié=÷! #oì©êu4š’gQ1`Ñ}há—"‰Ï‹¦ÅÄ‹…®Äÿ/“!O endstream endobj 522 0 obj << /Length 2593 /Filter /FlateDecode >> stream xÚ½Y[së¶~÷¯ÐK'T&B‰;ØÇ¦Iæt¦™öÄ}蜜Qi‰²8¡D…¤ìãß],À‹Lû¸­íñƒˆËâÛÝoW|‘Â_déÂJÉ2å›ÃUê¥Í킺âaÞ &®F3ÿ|}õǵ^ð”eiÆ×»ñR×Ûŧäû}~êŠf¹’R&âOË•R:ù{Sß6ùáPoià¾ìöÔúéçbC%‹|[•Ç%OŠåŠ;ŠDÉåçë¿^ýpÝH ñ“ã̯]Yµ ããRÑñ?ý¸t297]YãY>ã àC³àœeZ üp%ÿ2¥oÊc·„ýtÒTëú¸>÷k¸HA_št¼%çŽ)?ü5ÕiX?¯¯˜P"Nº[ —Ôåvn9ßp7Zއå&÷\q®™Íà¿d\ÓÜk¼fQU {a“n_Pã|Z®`»mÞyKvgPi£%I·Ï;š|' óö9vîF’C=H¶$â5}ž“ÔE}ÔFq8u8çÁßÅ£*¿£æ¹=çUõ@|'Ãcò¤Á[ƒ肜nXŸ»Ó¹ëzÈåô¶Ã™ÿDj͸]¬@©â¯Ž€5Â|}jj¼Õ2ɬ²ï‡Œ3žÚ©º@# ¨) P°;£R6¨ö®„–Ç.°qí).PÒãÂz\ànˆ ëq½œæy\`#@XDl‹»‚÷è5ÜLrË2Á£š*ºß{¿ ”bÖ¹…’9kÐ3|úœ.¶0bð÷~æa!™°h©Õâ—«÷1ÙM)ÇœP~)Ñ3~ì©Ú¥cb@L^5àï< WÒ8&áÜcÝ–í©òÊ{ bàJ¥K®÷%"Wɦ>W[jÞøG*¨sn½½q bPëµóÓ©*7y4d [þÁr2Î0VÓ2¢8?lîèÛm× …ÍØL?´EEOߢ§6¹ñ‹¥¾+½óISxh^†PÜŸ¤¿=bîƒÔŸÄý)@NáåUq¼õÁ仺!aSŒõéT⵩’ÝÜÑÛ}P­”#ÕB'¨>Ìw}k ò23€äR³ÌdÏRÁœ4 QHšþ@ cÓÒ/Å]öhÓe*˜´½ÂÆ25 }ÕdczŸb;g Ê0lµ/æà½ ¼®3ÞTEÞ¬ïʶ¼©Š§£2¼4úÝý°Î˜zbößã W„tÀZ»iŠâHB¼BKÍMÝ4EKþ¹>nû@çíFF{ʼng˜Ø[7ŒT IXç›–º›—Üv&6Š×y8oÑQhl; )s¡2æ¸x÷ÇP®+&ñ :r<(Ó¥¿ìGè"~ÌkD9u|ÇG“òã–dSŸD Ð.üâÉ`$¸EZª ¬äõ1n9ãLjZÔ¼ãÙ4ÕnNóKöîVe9sZOñ·zÂN/Œ£­›',ÇëššõîbìX| Cƒ}ª7Ö4¦ûõfŸ7³†“jpÿÿ›,Çna3«uɴ;n>©b.sSµÿe‚omaŸ*4ù£çLÀt–©oæ¶Ê˜JûÐZì58Ò„†9fˆºk 1@Šü0· /+ÌŒVx͇xDI ·‡7Ë[jëŽÈ€ËúLQ MBnC§EA´t¢c 8™,¤ºp7ñ;5!½vVhŠMWyò‚l8ÓÅÒód §_NPGì¢ÐoFÃ3+{Þ ‹äÃäÕ©)~M¹úâ:ŒýæéúuÚâ÷sqÜœ_øœÀOÁ,Ê^Ê]¶EàT»hpÀ§hÎM‰|ÄT±Z°/7x€},´û©Ánë>d–aiâŒÁ*gèß[™è¡hÛüv6²A¶'h½À>û -ã8ý$À©0 >Zr6¿b`·—0 '·}¦8g!çŒ+MÆ#.¡Qå>sÓî©(…|ؤc™ bº;œ•*,1RIž‘oóF ›–¾ü=Þ|Î,«;=Ú|j·xÆ4yš>qsR#äpéÅOƒ¹yÆi–ãßĸî÷}téi.lK(fêÿ"Žõ*¶%Xj.\Í/“Ò·²¡¢£¬H*O¹Q“Ô² œæ¯‡EnêNª8;pÌÇ<_?«''‰O±ý×KŠ=“˜B!¦åô 3\~ðHã—”ÞŒsàÉŠuý¯{³Gbû±Qà;=¥ÜËôŒj…¸ª~elÍYËem ,Lš÷¯M‘ö¬¯MuÞA)“`7ôGÀ‚i1¬âÈU0QeÜ$2oIJÀvØ-KuVƒÜ´/Wá¹G?yÖ=^í"eÜñq’žÆ$]Ò/$ÞUB·î«ÎS÷È™žþE´%•rB[`ý>tùäEêX¨Õr -Z^M¿?†ã…Ïf5³RƒGæôµø!Æ™ŽË¥›©›ØR—!¬‹5ëzfD½ÉñibhÌ•½|Xs>oË hOÏ”b¼æÌ\–íž¹2XÄàHB¼áš¥îuÉ\ñå¬ú9ð?¹X„!·ùíÀ“æj¨`ù©øº‡°1ÍWðg'{2C´ô>#7‘…Ú·|eˆ~S§¹¡ÖÓR·<Î¥V4/•Rò§, ^MËá7Ðx:_.ÃþÚ<ø3›’?³ÑŸeÉGŸ½‚O£_0BBDÃ=ÁõV2“*í º[j¬`”ùMU`*j ¥+lAf"‰ÒàY|;¬æpn43ñ ø¹75ßp˜áì‡ñ©)y¤ý©z~ÖûöÐú endstream endobj 527 0 obj << /Length 2956 /Filter /FlateDecode >> stream xÚ½ZÝsÛ¸Ï_¡·£2J|’lŸ®¹\&K.uÜö!ɨ´GœP¤Ž¤ìsÿúîbŠd(Û7u:™X .v¿ýÀ‚|Ã?¾ÈâE"%ËTºØìŸÅ®·ù² ÆÅëgÜÏ[ÁÄÕ`æ_/Ÿýég­oî¨÷ÐÔûCGÅõhfå‡CYlò®¨+šqlm{š_fÈ—ä ™9OM¹®«ueo× »Æ7«0gÅ%ãš&¢R×Ä˧XÇðŸ{ò#±“”%i¨_« ñ&³$ª›9†tÂÔé à'/Ø­;¿(lfî8른YjåM‘_•–-WF&Ñ›ŽmlwlªRÒöVKºÚ/E]-Wð×6$ºPSÒKΉzZ—:º)Ú ‡ RØåM¾@¶Ôç6~i{ Qæmç[ ]?éz2 Õy&Ò¨nq;êÞ;Ë®Xá»Nß®ŸÔR&:Ž~¤ý_9æã1Û¨xd,£}ŽÄpÊ£¢Ú`0„(ï,ÍèvyZ¾«´7 h©Ë µDèŒéä_ñOìx ßªöÄwŽ£˜/GÌïí¦±Öi3ÁÕxt€esDz¥ÞÛ]ßí¡ôâ‚[ê¾ "Ë4ºññ+þ±ó8'§áÖþv´ÕÆS¦ ‚Þ# H½¤=ÚïÄ;lyc›nAKûj7H¹’*hH-@cÆ’^N¬/~Y¿¿øõíûËõ‡Ë/.×o^¿ûõâÕ¬=ˆŒ%½¡G™!.8“&ù–ø«w?ÝG™”&¼†hÝÚM™7¨h©À)Us‹Áa1RHC~زÝÜR&†™ýJ9hYý{Ž<×Ì$½ýdzIl†‰?Içr…Ñó´A—*VcÚâ´_ 'IAÆ~Û»âÆ!®¼Cû›UBD—»ÂKÖ›%²âý=€ßÒ Øc?¸"ÂaÌ6õò’ÌZf±ÛQÀO1W`?àÚ#ÛnrßOÿ-=ý’h‘m™Eo®©÷ù¨ô°­«:jËÔ[Mt5ê¦ÝHƒn†ÖêæÜe9g;eñÕëŽb9pãxÞÑP±Ç9ï(ðÙ9)pò–~Z ýä‘p<0 Í}Þ‘AÓ#Åh›ÆÖÕ4&mÃoRkÆœ™Î?þ¼Le">Ÿ°ÄY¦!:93H!K讨€-4ƹÖv>ÆÑ‹&›]È¡ÙyúÙ¾bBõ“@­0¸+zz~Ï:±`qªëÌš$M3éx‹Þæ´E°/™†ËE”-¨‚Ô(2ãPѳ=Hì@‚¬·ô!wãeeÊŒâ}:„[ª=^fÝFÓJch¥*r¸íÍ ÞÂükÖërŸÈABiÙ#ò•ŒÁiM¼Ú,ª=$wCJ>±"+ÎñͶ›gN£Û2w^]ˆÒ´÷Š n…ž  Fo&°Šd1:0”CHÍ¤ÒØ`:õù¶`Š%X#£·HŒC°½¾£D;ÑÑå2S ä™s¸Gr"{ƒ)ªÖ6ݺëWœZLÊÔ£ FŽÑ’ \Èí¤$§0Œ@„T—_=©&a‰NFªa2}©œ þ¤Æ§óNQMD!5䌄ô% ÄÕ'õ__!?>—X³4IþÏp1ÃÅ€W¸¼À&à9t6 ͘?ZŒ»õämÛ':ù,ätÂbþL¸Øð RÄ7ò¥~UW¼ [g·~z ó›Û¢õ/§W¨< b9‰fC X·JÑq}è·üöºsrØ^,–£±å>«ênäÍqŸ_:…ŸD%fÎý[ö–xÒXbñ‹O‘ʺ{Ú°zSÛÞA‚ôe¾±®€=ë#%´Ó§<¼¹ë Ü”6oÂÂoýU413À‡Hàˆéî >~Ž[K` uëfîxìBËŇg÷7 #¥åqåH Èh£Çj[Ï -44åƒ~Z$ᎌúS(Ý®P¾…ç…oª+Ø[_ÏžYyl/ÜíÂÕñúÚ6sŒ¤š*n®¬:çª ‹O5¿sç$X[~ÖÉSîÊÆ'*Ëy¼ˆ:ƒú}ÅA6@U«“ãòVsá¦ÞJG#ñ•|tY:–g\V–›3ø*†”BÃ~JWH%üW˜àg >¥X ÙРŸâgâ'SH‚ÔÈOjôÕê?¶©½ÌÞ'À€ãÞµE(’h»VYPhÇÒ¶TÆÛyç*ÈZöŽ%L@0s!Mqœz©Aêõ=Nއc»[ïóMS¯‹êpœOÀTæ”ú‡œ‹?} ÏÝ s´bÜ<ª0硱Êî-6𓸃µ'å€Se6©EØáM(5C„»>–éf]\,˜Œ‡e¹Ay꾊a¦ÁPšm;›oÏÔäðP“¨okr)Õä^îrÌ;Ý)–ÒÊ7'œ~÷rÞ嬿†Ì@7˘9ÁçQVá\2Æõ¹h†ÅƒôASÈ ÿ2|ä¡û#ª©À„åwÍQ!  Í!Rë(/ÊÜÝ÷b·OJ¡å¿%°?x¼½’5n‚k¶hiïè³cg¨ðÙ[Ûmi]¹:dDÆû*YÖˆcNªÉ|Z–ºoŠ|þÜ‘ß BôLî"3ÆEJŸ2dÿKè‘ $„SR2ÚoÍô 3Y<å,“§X’‹T©ñâÅ9CÀ—šr[k§_Š(i 3=Éû¿ ³Wƒé3_ŒL‰:>Xÿn%xÚ߈ÁÕéc ÉÍôòŒ>7àÑ?ÑÈý§ígpÕ }È¿øaɧ² )àD,\iACRv¿laöj0}F¶)Ñ“;.Î\XC¬8p±mä‹j÷yØsßtpSÚPDh½üôÉä3·úÜÝQSËÙ<%x†ÈÌȵø³|˜|HÊ<‚i££íŠÒO¡CtÑù«EWYØp@tçò©D?œÁ·ûb^aQ+¯úZ PÃ:èð H³Š/};ó͉{p-4§tFχwa7¶êÖ»ôü?§+ðñw8Xÿƒ÷Œm endstream endobj 531 0 obj << /Length 3212 /Filter /FlateDecode >> stream xÚÅZKsÜÆ¾ëWlåPå`žâ“’]rIŽ#S•ƒíÚ‚v‡\”°ÀÉö¯O÷ô€ —²˜¤xØÁ<{zº¿~‘obøã›,Þ$R²L¥›ýéYìz›Û 5Þ|ûŒûy[˜¸ÌüúúÙß¾ÑzÃc–Åß\ßL·º>l~ŠþqÌÏm®¶RÊHüýj«”Ž~hêÛ&?Šê–>Ý‘Zß~ÿ*zcóCYTW<²W[žêXDJ_ýrýݳ×#AZˆGRŽ3/®M6&UŒKEäÿôÍU*£¾ÚwE´ü‚ÀB³áœeZ \¸•©[Óš¢ê®à<5åîÖv{ZbâéY‰b*ÓÊŸcû³éÆŠ %†Iß¼|õ‚xô¼í›ŸV÷,ËÔd_î÷ÝtËÌ“À.×4ùíú¦ºÚ 8¡;Zlˆ¨²¿uÔµ¿itÌ›|ïž»rìúp¥u”eþ®´Ô}|jêS¸P8˜g‚ñd¼÷ôs ¥`‚Wÿ6Ö %Ç‚¨ sŠÖ“ѶýɈ஦Îwð“Fvv½ÇåöwL¢:o ßp³$•›­àLÇéÓ<}Ûõ77»=°lí¡8Nhù aw$¿#!X+!™NÒËÏ'ðDÍžÿeÕÚ¦[{4 L Wܯí˜1¥ø‚Lxibâ½4|PhKÝEuî;j’0dœ‰^úÎEYRkxÉ‘û“ëÆšÉ8þËiš%b$:¬oÄŒ4î“1£GÎzšnêÆ_g~¹¼ëìéܵN¸`¦`Ò¤žÛœv@ö(ØÃQ­,AQË÷yèYKC7¨Nnºã¦kØà3/i‚ÃÏÕ{e, R‰çíÞÛßQàî“§ šð0 øÕ;—Å>G}h‰Š}^QãÜ·Çá¶ ³m³Û¾Ëâ¾¶eIÔŸé×éjf"ÍuÌ0¦ek7â"„3“-õlq—„™Œ‡÷GŒké4N§7žK*¨ë#vå~]Ûï÷¶moú²üÝß96̤ÉLŸ §Oöð%©kLV­†SšEk x¤Ö ˆO‹;ö7»ï;»sн†òêàÇkú-òìóS>mµªX˜¨?Y±R¸ü¸íž±ÏËÒ‚%ÚžE×GxòÂ#p›‰d­%`Y² dæŠ_é×Ñ â*eb£UÆ$º@?ýo0ðÝ&f*Ù|t³N<·)7?>û—÷“æF\ƒq´ÄbãñL<¬èÓÝ=9‹Y ¯ôùggŠe 8³³É–¬ð[h2€ ™ Ž3^㒧Ѹ}iófw¦Ëï&Ô,ϤÌ3ù(Åû€šQ‡U•ƒ5<¹¬rư8æs!z è´nìXBý é X¾7¨€Ûò9¯i5dê¶RÃk<,I"¿)}ŠÃ´ðovø#E R•f‘ý9æÓDÇ=•“°U:ȹC‰ñ ~‘Ù†­Øwø•Eõ õæ^ýÊsc?ußÒ‚M´Z"Z¸šÚC)¼:_@ÇÔ4<„SiŒ<ö߀z\¯—d ëæ½ÿ¬+wgh¡%U\øÛBÇì)iJ…nz~øuÌýUí{òqÔïGnºµ}ÎÛfKôMmȽÿ'ý3þZ†f):qO"Øiy‡‘áÆ®+N¶^LjÀÆšO '†[EýꮨñeÁÃ3¡gLÿ÷±À˜O©Ø;H…—xèט“+u!u{ÿŸš«ŽpÇæ³žÕÔ$çÜ‘ê"‹)Ñⵕƒ¥#j÷k§B35ã”S±t0¸HÌupßÔ­Ý×Õ­¿ÌˆQØ@Ž€ uô50 ÀçK²nÔ(/ƒ4Ú¶Åmå\y/nm½½öƒ­ºÝ±®ß?&&XáTÊâ!õ÷¸jzµ^¡o;Ï«"xîyØ0:f*‹náý)“¤1ªÄÈ»ûà×þÚc4äkêúÃ65õ Èä¡s[ÚêÖeœp¶×87ê|2è„Ýе@²£ M¶ö›ÀÕe‰ò@©2JçÉÂ5§ºr°7y_zz¦-¨™gBº¦¨Ý†šæˆÁ ¡²ÛΓáÓdh9p(§O’($@)ŸÈñkÉÆ¥ß5܆ýûÿb<‚ ÷ªqž2%? Ôú*È·œC0¢ý‚úïÎJ†¦Çi«Ä€Ÿ*õåü™ r…™½ðÖÉwo?ÏÚÃ!ö¶ý»„k"T´~Q½Ž…I>Íb ž=„:ÿGLl¸‚Èõå 2ÉVm:ëIp¶”šocðä‘MÈ„ÉXεõ\ÚÎQ&ÂÍ|9'ý„.Œ™Èݼ?ásxïg8™†_J„`Ä…àè^aR¤¥Ñ¿½¾ì p§Åjvs˜¸v±ÀÄ ØUýÉ¥ Ú]Wï&Y¡9¬ƒg¨ÕÌš€wã‰vÈLжÖËü¥½ttè›ÜC³ê½K4¡æÌ(Ÿ[ˆ— ­`Û…w*X2•Ú¸¨hgÇ-27NR\'Àkø¹ãQû{ÏJ¨gQÌ©F OALTTttܘtAä!Þ:Eí¹/º]fè„ñåÍ«Ý×_]¿Ø]¿|ýâŸo¯W ¨hðîq283Áp{…w×v`lV·É7ÓäÊÄ”j ClŒé!õħ˜k2ˆT’‹ !GÈl„G[ò…«äâ£I>eÆ>¯ö¶’ fjy‡Ã¼!t2$¥ûNñ‰hÀ#Ü—(ÒÞëÇq* 8ß¿°pÍ?Q^•yÝ'‘ãÙTM)²öç<w<÷<¤]iNluƒ®‚8©4‹³¹Àyÿ ‹E˨>5± >sGÁ T*I¹v0¥ÁZ;ö8£<Í‚ ]1±O”€ðt€ôžò¢òqóÛ¦!"LÓOJ?Ll(O'6>ž¦Vˆ§ÝkkEÌ™2ò¢­•’jZ³WŠUJÈ!'®‚eIϱ¡.Î*oìti@lLá‹æ>º Åò }ß4£w#Á¿ý>OiÀ‘f†fÈ‹/Ü›ç÷B¾ ‹´KBðùý0Z‚|¬°eX Ô$¡ádw«d}]aöìÐL3êÿí¤d*¤†Çhî6š>ªºÚ~ÿöÕ+ ë±™Ãóê¹ò– Ûzbq勜à&;„©sòK&³èÓì´åô]ûi¶iæÀý*J3»Ö, Òzëš¾Úp‡2_¬‰¢U’ B‹lŒËáÃe^d Îoç¢ñEvwÀ B¯ñL–yØŒ™Xyþ€³ œÜ÷âœ%¡ØûÀ‹c¢Nlò…šêÖ·#ã¤×x N?¸=#Æ “…¿6pG¤œ¸#Ò˜|aìqlrIz,·¡öÀ碀1k|JK•¾hê9(£º¬F^6õ di(±«Þ4eø÷ƒA9V¼Ê,TWDø¢ ^x|dÄDòñ³¨X'´C41àÉÌsG  Ä;9ÔçïT’QhŒÌw4&p f(£PŒaVN‚5õÿ³!˜bØF#¢ë+ÈÇJ©Ltô:¯ò[{íÀX•22³¸¥ˆõŸ7Ð0m?Xhð¡Î»±f»f!¢:ûóɽ“íò•t9°^ƒs‡E€Dðe¾\Ãs„„¹N“» óp6¼,ƒø·RF tr¯»éô¿î¯NÀ¦¡ è•ñµOƒ7˜ 6>xtPöÆhÊv˜Cié‹RŽÐÂÛ¿úP^ÇQ»îw‚ýU“Tã#Âk#˜ ©,*ƒÃI¾šqާÈ+‡8X’˜Eм,6ºäÿ¥Ô jÑ¿¸¾£ïz®ÖôZüÒÊ7¼5o€7~)(Rў˜¬›7íq6¤­î`3PƒÛ\•2ñµŠ±Àˆ¸’|NUFá[ÊáV܈»R¶€(80©Ë›Ûþ48fÄs1ãE­‚‚~H†… £”ÎQð9CP(røå4Y‚Nýd±OÀ\[ÜÝ©ÛwÅ`‚ûi³j3D9ØË˜¢ÐÇŸ„) ލñ«®+f<[\æã°¯–ÚC5¬¥ÏÑ„še‚å%–>¢˜Ø/LbM"ˆ¨™b v» ŠòVÐAÙýC&«œ°q—X`Yr¾I4X´Ev_†4í©n= 7vogÿvá*ÎJ®'  ðœ}>£Ø àÿ{¤Œ{ endstream endobj 536 0 obj << /Length 2629 /Filter /FlateDecode >> stream xÚµZ[sÛ¸~ϯÐÛRˆÅ• »om“´ÛÝÄyJ3Z¢"N)ÒKRNÝ_ßïàÕtd¯•ÉŒEÀÁÁ¹|ç‚ðÃ?¾JØÊH&*^m¯˜ýZY¹‡÷?½â~Þ7£™½zõç·Z¯8 –ðÕÕ~Lêj·úüíÞ¶Y½ÞH)ñ—õF)üZW_êôxÌË/nàkÞÜÓO¿|¤¼ÏÒ]‘—kdë 5ŠÖŸ¯þñêÍUÏ≜ÓÌ3¬+ƒQ³Šbr©ûŸÞ®cœÊm›WÄËgâ £ça¢µ …Û•Ì­¹«òÝê .®ÛöþºÉÚë]¶OOE{}“—;»qt"6f@°(”•3ÍüfÉx3 %ºIÿÌîé­“ÜèiªÑxD•{ª“³o„ŽCN2â2äÚM&@aLí!s6qÕik•Gßšû¦ÍŽ?4ôP6ôšn,ÛåÃÄíKin1©qß蘩_ú•Æ«Sá7½q[¹—]ÞÜ)M¸§?Y?G|é•2œˆù£pw–ŠX:¸xœŠÇJ³­œâä¹·^o‘™{Ë~?åwk­ƒ´ÈJb©mB²n\2·ÖêFCê¶ÒÚ/¯ê#…¾ÁÖ{uüIÕóŽ¿AdzS@ÇQo:!MYÁ$ã„2]КOå“í™Ça¬ÅS,Z~‹6,ŒŒžšÁû ̃ºJœMÓCûvLËüöT¤­Õ ;£[01nx¨DÏÉYoŸ2Èáqjpå¦êØJç Â[6V¥)’06'íœMŽ ¶¶%Ï;[g4Ó¹Vu*wnÖ¾t¾„á|Ñè|9t_·K§Ñ<ÔJ¸1`Üz‚ê<ÁŠ˜vïÙ 70߃æØy -{ÃF(ØáS¥>Ë+l’™—ûE^¶@>Û*RÀ‚Ír%C-£g¡{îpÅ9ƒÇšS¶D]éGê¬K`NÈ•˜JïCf"z|#$ׂù.KÝHµw¿_Œ²ök7­¬üú¼ûõë­^æ[©ØÕ©½=ù‰„±naãIž üa¼ië,=Zµ±‰ÍO¥7ÃXzuÑe ¿÷i—<ä,Yi% 0I‰À§ÏlµÃ ö•Y}µ3@OaÈtŠÕ‡W¿ùla²—9,^“E ŸíàtÓó‹‘ùŽà%Z±àÝ~é,BÁ÷z•BûÑHû3;O¬V;«! ‹tÀ^ã×øD ru‘+Š‚]5¸ŸkuHã0k?tú¢…=JLE„b±ù–Ø‘ó…±Ô—»R„€üŠýGœ$æAZö ¿6IÈÔ S*gèʰ‘çÙ׬LoŠŒ Ìtæ EÆÐƒ;C¢&y·¹f¼ÚsãÔÈûè¾Uºá!Ï ïyi åÿ붤°0v ÏðwZ(¸”Dƒ3kØw(gßê¬=Õ¥j»¼å¶ÎîòêÔôÀã˜÷ªa÷ÆÏš¢òu‚%ø”&°„çÀç¶*ž]0toï4µT)“ЦB_Ìâ¹¥j Ð`ªÚZýÌTf¤ÚâÑÒ¹Êô¸à„q=!K‡ƒh=ËÒ!?9½; §'rúuªŽ s__$<[û‰ûqÓOMÕf¾ob„ý>Ä>.W%Q^Hg4a$xDŒ²¤Ô\ªSyI2ÞK5m&‡ã¼ r•ÉÔ¡ú*-ZÜõˆ°˜…_Â×K‰*HõIûI,‹¸CÑ,"Dš?¢Iu^Ö"AŠ#ôJ!Ú«X½DÖ’‰0ÆIˆ”PÉYi+-Gah)¥ä¡½d~ùøóÏç‹2Ä1Å“1,2€Íš{ül¼Ž^3c°eÎäi‡Í9CÈ()zÊ©î¯Þ¼ÿ×#å(Ëuuß]^Wå1r5åY¨s ¡£¨Ä „ì®Q B„¢2ör!ð‚ašÛ¼@>%¹ÃFo׉êv±œðèjq9á—Áå&½Ë®›µÐ"&s8¢–Ï*ï¦OÛ¶ >^¡-±X¬ ý"± 5Ó–VÄ㎠:“ Íb©¢0OdÊYîðÁ&Pwk‡’Ë€à—#¡-ÓÛæ`s-îÁ˜Ïàï>íÏjÍig—ËÇr0!m÷¦“òb9„G9 ”Hã› Œhé¶õÍŒ)ƒ÷L“`&È â£U Ì@"¡ ÃÄ‹ððˆ³¤TdÆ ]ÒewX2l;F0ß—AuâSãíÉú³ \@°¡¢¢š4b~üð°X!#ƒæÚÄŒyñcƒmZ¶M*\~Hß¹˜—Ï%î뾪=×EQÙá­oÆÑÇ.;ÜðD‡‘R“T¡?öwMåÚªþj L$ñóÚœOC ×*£u?,êE¹µb‘§-–< 4ôyÐúèAcŠä}*9AzŸ"}ñ¼Ð#UÑö×6ŽÜ (íú¥Kx!á·ÑsàAþ‹*%w½£~¤çSã÷=¤ä3îÑßÂ¥ÊÆ26Æ]7ÃÕšôœ:ËÈ›™PSùÅôªp Æ’Q«j»¦‡3jœ«ôÎè²a‰lc ‡ñ·à0aê<Ê(¶Ý ‰ÅL¼¨ þ„¸"*—8>‡¨3¸‰¦~å`§r0ˆcî<®œº´Úrª‰™½@ƒÊ#Ð(è™?ŒŒ£.zŒÔ#o:°¹ŸëèˆÙ©Ð­³¬¿_ò¥­œ# ˆ ù…»ä´õ<@xÆðgåKÖW,m ;G[«—ˆCˆœ'ç[€ÐHMëïÙ8–ïv2RÇìH»VÔ¢½wc>,å½u¸•ûţb4Ì¢W5Q^2Røò´m;§ƒ”Ž«sT4ü¢Ÿ3•t@5$hŽå¨ð:ÇΉáñ«&.Ǧp¤ÅÛÅ]M0ëR¾ ¸œõe¨7ËÝ5¹ÛõÍi¿‡ï,…a P¤žgŒ“~4Ýz-Ð…(ôÑÔ˜Cü›²qPÄ|0[µN¹åæsºĤ⾒<ØÈgeuúrpÏÍmºív¥;¦‚CUìÍ…)ªžŽ\/‚Yàœ©c§—žÔ“e ááƒä ûçm³¨E2…Ù½“{™m³¦Ië{2“ï—ÇzJ*ýz([¼)DævþJ#Æ‘ãOÌæÝ¨ûe¯¨©m %ÖÙ&Ÿ ó*šÒáWwÕ_[Ûøi›1qð®ýÁßUÛ.¹®óm[Ü;*ƒFÜ]yåo»)cYjÔòæÇ%Û€‡÷ºI²}L ÷IhCs߈¸qþ}UûðHTû¨ØuÁýõ³mdÛ¨%ParYƒÚ=r1F™X¢ŸU\À’ ãyuž-¨YOÝLj¢xíÞ+ÿá~!ÍpíSG¥Ú/j[°ñ™n@wÓ´÷Eö” ‰´D ’URZÜÒ›¬Í·—òúIÌX¤Šh¯Í|;PÛwV5Ñý…#δóÅÞ©Ž&7K;P0š\¢9qÿsà ÆyIÇe¦ch»,ÿÿ1\B¨ endstream endobj 540 0 obj << /Length 2746 /Filter /FlateDecode >> stream xÚÕZÝsܶ÷_qo¡2:”ø$Ù>%™:“¶N3¶2}p<*}é8á¯$O¶ò×w ðKÏVÕN:ž1ApÀ~ýv±+¾Já_é*“’*_mö/R7ÛÞ®hðúûÜÓ­p=¡üöêÅ^j½â)+Ò‚¯®n¦K]mWo“ïvå±·íÅZJ™ˆ?^¬•ÒÉOmsÛ–û}u¸¥ª~G£ïü*ymËm].xb/Ö<שHTvñîê//þ|5H ñ™'GÊ3GW|ÍV&WŒKEÇûò"—Éé°é«ÏòO?4+ÎY¡µÀ®eî~™Òoîšj{꤭¯·Uw¬Ëûë}Ùov×uÕõ´‚I§[s“3£xXá—T§~£bº‘bBÉ@´¹y²+½h¿þzbJ`7m»Kš Â{O2­íáá´LöåÇø¡ „˜ŠûCÍĶ–\2ÁÍj O®‰øX9Ë“Mãö¹Ãÿ졲‡¥7A¤ôÖ´4 i!õ=ÙÌ•ôp¢s£æŸYÒ!Ã=(¥Ú޾U‡°q}ÚÊvXäïí)оÖÈðG'çtt0:û.g€øÔO=»¾µåž0‘Tª™ÉL”ÓµíbÂR`[©„•ߦßYx&g’vEîPm™!ö`¶loïhD¬]z‰œHûžÈ¯^FÖF¾×\,ËùœýM³?Ö–t#ŒqÌx“z„w΋q-R–æbÊ5®ì¸Æ³‘Óÿ3`*-}@!£½¦[P5i¿U‡èi„fè꟡ 8Sè@~"+’ò°-* ÓZk~| ™[Ä8d'È|i9ó¢Ï³¤n·†/d4Žó]dÀ¶úR¶À±(’«;.,>º%¾:ëç‡cu¶ï‡£T`SÅà G8z¿­ª[{æÓ”ñ…ííš¶ú­9ôe]ßÇš%û̹À3ÕvCXàÞw ZÒz!×*ò©ÓDÙZ"™€ŽÃ©-}Gî¬]†…xlÌÊðœIpžO‡@½žÇBÏbQÇß ÉȉöÖ‡FK‚|1f.É•wž¼¬jK£7÷úåÇw—4s,oý7µdSHÅ .W MÈ3\âõHar±äTÐ •Jþ±³È«L…d! ÀœS0‘O4xvzgÇ8š„x£í…ç×CŽ·EÎ ØâÜ'H¤ ŽñIq½Bè[šv §ÜÑáXtzúˆvêžÎ‰€èîB›¤¬Oþ5îF‚gUó!Ú´ö)ÅúCµD‰¸ —SZÎÀMƶ'GÔ ‚×Â]ø‘2LAôv¼j›ÃÞN“XMƒ/UåûÚFáµ>BÎwÿÛϯ~|ó9ˆŒ«»Ä¶÷çI·i-Ù f €K"¨áÀe~ºµ-ó Îs–ÃnkÁÁW¼í]¹5µíÕ5a™L8À riÕTZ[7ôÌ;”@ÂŽžûrÓ6.Lk@ûKÊÕ!ÐÄ![hÃ21 ÙR¹­½éXT¥Œ!“ÜÖ)O¾9ëjS:T¥º]sª·^¯"g…ÌgFÝÚ›¶ ¢ºi›=N÷3'hÊqV>©‰ì)é0À?eÃןŽGÛnÊÎ^£)§P,KÍåÁ³Tv[U@˜Íò³y,ºLd3½¶ý©õòâÞÒnÆ#MdàLbÌÍ#@6­²Yê‹–Zƒnšth®¬»ò=M÷Õ†&CÚ_nú`Þ"÷yܳªªn>üŸ¨Šÿ¯tåoQ>¿páa®-D~8>_aâ™¶­n«>®¬¢`&ý¬ë¥xv]pµü¿«*óˆª|˜·-)grj}„û£Ë'fªÏìK}CÈu$H‡ò,{ªrÔ'”Sœw¤T±¼˜‰¢šà˜®óOjrWUÌo@)jè4ÙÜiÜ×qÁcpræ1.{ѹÈbð»¿TqHŠÚÖvœÍaK˜?ŽžN7ã1O”‚0~m;ðük›ŸQw&Ï©»03uKžQ<ƒçi!÷m©lœ\*[ŠtP6~§Ì e烲q~ ÇΑ/8݆}Ç-B¾>>¿vö 5ãÏô0ß…”ûwŸôUà,ÍÕž¾EÁÀ½UƒmP¬Æ±g„^€“+-G­~ôƒQQõªim —®Æúuó«‡:‹8ÙÄ6.4ðÂÇŠÜH6/Š€ÏŒõJ,…ðœn¦¸:ZE5­(¢ÂdV,ýRBWÌÙ êÁå{Yátô €iF“H_”‰¬, 6–Ï •i>Ï¥S±,Üp¶h’)•I";fœiaÎÊS‚gšÁ>TuMûyÌ ›w¶¥+üpWM„7B `…ÍK ¤8yƒ©…wuJmÄÌ!òm¬à~n·ò—¼.Z"És–GD¸µÌX'˜°¼ÓJXÒõ¶ÜRüâYÆtaþó6kbDmOûÇRX ã\>ý~Ñci¾¸®w6™œiØofê?µÃ6¢¸"KÈâîé%ÀGGDd)ÍÉÁVš§ ËáãÎV-Í ËURª*³7'Hb¦Gò¾>y9kF 0+©A¾0VA?Í©§îTL2  ð£_ç Tñke|ATa">Ö’hb‡•-$)»®ºuµ,Eé<>¨êçÂ3¾ÆÏ) LÊBLê É÷DC#2b™-;€ 1÷Nó±HÙ5cJȇ{NŒwÙ±Fq‡ÐYÖ5zo^PÊÏ1:‚•âœïÎÁ·c°/ÊFsl!¹FB¿ƒµáü±tª,7£gð i˜Ï[K¸Ó-ü¤'–°ˆ›3!@ßï\6žšä7‹’áP‡9ß„›ö½D‹¾ÙÏIWÞJz¸|Û7MÜ„/¼âïüsC»ë)öb?qëGDzõ”Nœ@XF ¥ÒH6Þ<«ÃñÔ·›x'š(§„…ØÚ†ZÛÖg‘áÒ¿nä|öÌLïÎ×ÅÏîžœgw„@´¥/‹Ï‰ó9±N»’ˆ@WÉó­ÿ@×,.”¯Ê!S*ÂeC×ʽMÏuäB î!_4Ð Á¨wåøW±Åv<k’Xd/jž¥¡a lxÓžnè¿”þYÝ|R›&4¡-ÝཷØ,ùgÔ1$“ã­¿³áOKÄ"­ËÇ`,Ò÷nã:Ë'­˜¯8§ªÙ–ÆžmjÄ@$ýh7' éÿCfx3†Ó4àQwVp3Í&69£Ö¬kÆ1ölàC{VÁ•¿ô.;´rèЪH‡`'AfЧg;´žx=RÇ:´ó%GߟõâÞêG‘⽚Ä^€øÎ^ƒ?šË“fÒØòLþú†—ù endstream endobj 545 0 obj << /Length 2639 /Filter /FlateDecode >> stream xÚ½ZÝoÜ6Ï_±oÑYE)‰º{º š^Å¥p|èC[øh‰ë¬¥µëûëo†Cêc-ǹÔ)x)’"ç{~3 ÛDðmòh“qæBnŠæUdgÍ͆?¼bnß6îf;ÿ~ùêíû$Ù°(Ì£œm.÷ó£.ËÍ/Á»ƒ:Úlwœó þËv'Düdº£š¦johá¾4úá_ÿÆ.´*ëªÝ²@owL&Q¹ýíòŸ¯¾¿ Jâø )ÇÏ.2XÍ6©!ã‚ÈÿåýVòàÔCÕ!-¿!ðbºa,Ì“$Æw\Ú7#z§8(à7‰“à;ú1õÕ2•º®5 ꓦCÒh~;KÒ0’Òòk”Dî®|~—cÁÇ›º¶HnÅ6Î{1>}w·MÒÀݹz[$BÍocî¶…Hv1Oœç›ã!Khó…N¦…‹b(úéCº„±ÑG£{Ýnc ãìpÐ4 ÊPö±ÛŸ­;½O»â„ïYA‰L4òˆ…)DZò˜ó%K< y4J0DƒŒ«åÎÐ×ÛÞÁß,èj­Z<”Ì%jÁ‰‚=¾­C–;ªžÔ0ŠÆ4' ¦îýá?“5ÍT#’PÈÄSصk\€EˆDø=¯é8Ë\±zlÌÃ(eã©ûýê±YÈä¸éuh9gIæl faæàk㮫ÊÇQžš#dÍHEJ‰KŒ›*²;„qÑ#P%Œžò…4¶þþœ+0 –ºÐÿOf¼PÈŒ¬“ãÓÂ&íL«ÝÓPµåørep˜‚7Ñ' Ùt¤ÌŸ?:{wèÖT͈d;»; `‹Z5kœ¥2Ìâtæy”ök¾fÅ|àÜò)ofâQ¶Öpßµ»ÿjÓ¡Ã$‘ó}˜¯+ÎD:îÜw¦QàKz¬ZúíOJý@OŠÞ¹GA)œ ùá üqÍÊ@>®iµQ¥#਌ÛÙíÉë ¥«vÕo»c´Ããi0ŪL8È;›ì ´ t`k Öpõ¥Jþç)¨3þãþWµÃè~½®€[Ý^]ƒÞ^ U£ÁJVÝ0‚EöµnT® fÏ{].Â(O— ø¤ŒÎ)YNœ%’OSîfmœ¯Ð,ƃ{t®ª0]¯!–½½›N±ƒû'ÿÅy²¬jèÝãA·´­?txÛ½ò8¡hǵªU[à,*0ZRO¦«Œ*0tâŠMeiÈâѦ¬¦vàÅŽÞYõ­' aÜ¿uP.9›GÚñÑÆÖÅEgj,B™¾@¨_Ã@7`rÀqS¨ãª™AfŽÁ¤^=q‰„¼9eÁÏZKù9ì1•¾ÛRܧtÖŸçqLˆ¥>QêÁ„8‹í^ö꺪!BýkA7,”ùèZ#ggJOCž.p çf Wíõ@¶‡éc•"òâD‚"΀ŽÃsCk*1.Ó€b7 Šå*òúÔº |t@žR£y r08õH¾èŽñâ¨ÆÅŽ~ëj^þö$ÓüaHÇŠ¯õ…±s€$ 8u$—0˜fh©#t†‹ž]ï¶ë‚V»£ˆÚ(t Ä~q÷Þ@à0ëbBÐY`«™z]M4¡®X4éjÎqQvDªcúÄ(Åå¤Pzì ­ŸzMª®iÆš NУçìuOÓs¡[FR/"éÐ,¾µ÷!ÀÎßWþpã꜔mÕ RmëyÕCÏ„(¡%øwÐÁEd‚†¥Fãm+k­N ¦kV‘ H'Äóã§«wüxñi¬„…‰H¦°c³ËÃ<–/¬˜J1sÖ8tæá¥ȳzù„ÂE˜²|©—wH,ÆVéƒ,x©#Ý>ÔÅѵC¬8.u­—J¼ûæÎ}çGùhLþʯ[p3ßÒÛ€‹£Fµ­vĨþlÛ?&yžºº6Ê<¼î×L`1ÔÃcJš«åþ”°rF|´P ÊD—6Òˆ, J ´\÷ø¤ò|V dy{–‡ÉH³CC…²Ñ¯©Wè'9³3Ì¿‡<âÜæh*Jòƒ L¥Ôã€%@SÆrÕÕú°çÞÐ(¾ahÀYÝÕW2·šÉ/ó x)ïï[W,cÖò(W."ð9Ñjy[oøð0ŽF#1ú†,.K£àg äŘåpD¿9¸˜ÅÅà^"®°‡éAÿ>ÐFg@ƒ-¶YãB]5VîÜ¡xÙov2Œ¹ä%îÌ#‡"çK6ÖØ>áj),_ø[Vý±vU2â—’¦O=…éxÅË8\B ÿÒºæoyìmìrëkm© y”,Õ¸#övαuÅ–=È~€J}G®µ4²0ËÄjKÐ*å¬Ö¤œ¤a2Å'U¬Z¤7,Ig"F{J$D0{~q|¯NµS½=ff[¾MÄåˆá3°Õ–X†Ûm Á¾RSLØ!ðg~BADD-“8¦Þ¦×û*iÚë ·ú®j‡UŠ{}Þwåchv‹®“ÇôzðSn«5h;"d›ª¶×Æï‡Á!È­©öÚ€è&RWÕ¤. T<ˆQÇc]j†alu`Ác]ÃÐYêçƒçWt+_BÉέ²k\²é0›.òŽ Góµ,ø¸øÍ$x«õÑÊîjªÿø7—!¤!–æC[¢¡Ùv­tö/dî;¼’ºH ‹»[ZéÝ©.iÑèFaªÇù¹¤ñ™ºGtª›ZÔθr1u­}9Ÿê¯µžR×:Ra/0cZÇ·ãý@è•<þv•BLô¶gÀ€sÚÜt„PÑ·z‡3™Ž|É?î"ž{ZuLgÛm=¶ò[a`Då‰*jgº{g®îƒ $)®«¶ô!âìs!NLàò%MzÞBóÕ-Kþ§G„X†\ðóBqã" µ–ëê›ñ´6ÿ<‡xu†W]´ç"ð¹fÆë‹úIû¥‰é|Û_¹¯zÊioßg mHï@<}o”!ÖP‚H,á{ЀÐSü­Sn wg-•Ú4O%j´±,LýÇÜñ+ŸˆÅY*±ïþâÈu¶è77Ñ´tc”åõT+C3E犱®Ïié5pµjµ¯ •dòdBs”{?W:¥ ü ' uêÒz¦6šíSAy¶ˆgzHàT4‰§Ç®9Šë±< >u[=“¼Þj+ÄuÝÙ P…Íu¸æ{b,x¸&l¬Œ{ýÃÛtâ½ím1ÂÐ }y³,J}W#RšRãÀü=ÄêÆãW%ˆÇý`ïlènzC;-d8Vˆhñšº¯vì 0îT4CÁ'j÷YøèNzâû[Æ|ôûŠúbøœn9LhµsWyÔÚz¢Â})rÿâU<¦# endstream endobj 548 0 obj << /Length 3002 /Filter /FlateDecode >> stream xÚ½Z[ÛÆ~÷¯Ð›¹†5æ\9lЇ$ˆS©ÝÚkElhiv—°$*$e{Ñ?ßs™¡H-×»À€5÷™sÿÎáÊEÿä¢Ì…Ö¢4~±Ú>Êi´½Zpãõd\·„…ËÑÊïÎ={níBæ¢ÌK¹8¿u¾^üœ}]íûО-µÖ™úËÙÒ›ý³m®Új»­wW<ñ±î¯¹õãË·Ø0ÙëP­7õîLfál)½ÍUfʳ_Ïÿþè‡óáAV©¾WÞÿtçÚðÓס[µõ¾oÚNœ-WÙù™×Y4H•U«U³ÝÂÓp@ÙºêÎ謿®;^sèâЪêÂShj•½Æ-HPVï†ù7ªMϧú,ΠóÿkÞãÿa×Ç›*îþ¶ª6›wÕ —¼ŒÜê—R i™¦ËÃnÕ×ÍŽ™}Ù6[nU;æz ;]×óІékö‚…w~Úw¥F:¶ã-¿Öº¬ª7Õ»Màá¾áÕÛŠiೋ.¯ºä° ‡kÂ*K%…—Q›~~Žó‰™ýŠ+AŽn!¥(­U(ÇeÜ™óžM ̲Êfíæ"òçýÅuµ[oB{QïºÆø—õAåNètÊ/¹Íãeåø2#”QiÑ 8Ð3U ‚"»®¢â?Ù§÷ýS"l)]. UFÁHÞÛn’rÿ>h­4^8«N;¡ …zûó¯ùb “ XaAªiév¡…õHòfñæÑ¿¢vO*­yQÐYyR’öj⛹½4"/‹¯s{é´&—GN=Ù ܺ]i%¬s_åvg”åôö¨s‚×¥P²I^FÉOÜÅRÚB˜üDŒo¥L‘öüÛ_‡Ø-8¼jý˦åÆktoYµm&FÀ Ï^<{ųðHn¬ën¿!»º99·ÞÕ}Ž Ÿö°%ÄM`‚\Ê!®l.<¢ÖQzŸÈeM#X[!ý ël¤K“çB󦜚xaø­ºÐÑ'Ѓ°;ÿ ÷6Ýs‡v(^Dš—É£µÃ#åP…¾­#3WNx *¤™ÑŽ)L.ÜÑäɧ)äê‘VôÈ8PñO:ˆ:#ï ½´}ïýxv“Ýbö›Ð‡è7ДÅTáXi´SÈMú­wûCÏÍkz¢ ]tð¤‘a ^Ýj‰^=mI†ÎèÁÐkÃ*Ô,W:}7Çgj‡Oýô!}:óøFxÏ8(E(úXÐööê°oÃwI—}‹7YÏapöGiHhv0Ö–QC@w}—á‚Ù¢C‰;ž&J_t¤4¢zÝusجg_aÀ•C°¸lC˜»5-,-^Y$ö •¨$k­½¸01¬:zÌ:Fæ_ri0 ÖÝ59‘õ)˜ªûJ­%#¥PZ~íPŠ<¿Xa¬›ñ¥ÒÎù0:°qN½ž ʰG÷ûf®>—öý˜ñ ÙcÎzçʬÚï7õªJ¦™ôcoÍz^‚¨ªžg¹Ü°=5U»æƒÍA³‹‡Gd#ŠH–®ð,DX•ж®$2U¯ü*Ì0ÿs/µÀaG*¯@í>^×AY”F C7¤tAFÄcd ±#ãÆÉlªÁzb9Y¿:´í€"q€Än,¾fBS×ÚU@ˆ©möHîÛ¡Ån¥¡è»´6p­é麊r0¿Ï¨ð ÷”îh¶Ì'¼é6*?>e&®¡Í`p¥œoŠÕzaJPãÂ~Ix“¯¬+á(+¼‘÷†7?Rözt€ ý ƒe‚ƒ Á‘VÚ…ð{q÷ ¿ÁAËÂŒ#,^À„‘%P]Çoˆ§‰‘“h À]Ÿ³ï@.qdg”Z^qÿù€¾ˆ¡½[¯D©ì—pùJÓQ®|ÑæTNè\?Æä9’Û†.ô]"5Fllˆ{°¦‡„œÖY'GÖ ø¤åô”©žÃ]%úÉpƒ-´Õ5½#¡%æ—edþÕ|-)ãø£zc„ÓöP—ÎäìKJ—ŒRŸ—±ñRhˆîÆBÅüoAÆ%eõýB†°à„rÅS£4¹éö‡•¹‹ÑŨœó“GûÀe¬ØïÞV5æí¸x°o:EF5‚£ÓÖmCqo]#ôW€>-çàÝ dùXÉtÉI×}a #Õ ©,Ž%æcÉ隟¦kwç–áßN€G>­ÎRö6¶kzn„Oul±ó…Æž?Y¢OV†_ÄmœãiîÇ<+• <OÍ œŠ…_|¨ù<;UÑ4‡ùp{‹6—¡mÉñ¢Wkøw@¸Ê§“ÏØªðSœ( €jÄhPÑ6ì/Ðr/R¢Íkf­d¨–ÂØ!g1#f†:Õ`9ÕÜį‚Ÿbv ‡ˆ”Ð&wœ6“Yè¥<#f€Žá‰9¼ƒüTxÞ±TZ2 C üô‹ÑPeßr”ŸjÉp2 ƒ?|"¤†µ§9Ñe®HßÿÆßJ Ë‚Š+ûrò)@Kq8ñÀî*ÄM›&‚7 ‰ø1™‡'U±¸”±›Â%4ûM[Ãï‡:fï!t„7$¹Ø™èyëR ìxŒî÷þö“1Ï=çã~Ps?Ñc'„ZÅÃb™õ€^|øo³ QJº!Jýc¹šuÅØ<ÆL7'níøh‚É7{þÓ¸rö*°fcrÑ`?ãç2åÅéâQ,7þ±«V]lü›L”Gax–š,¸&âŒ(ô· #:aÑ,Ò„UþH©dóÊÙøî Ü púH9ÿ*Ù§ÀLå´r)ך)›ýe³‰šÿ˜Äd2>Á¬ã)B¾† öaøÓ“á¤Õ¡íÈÇÂé$†ÉMÕE‡sÊêãE@Ëz¶b2Ǵщ> stream xÚµUMoÔ0½ï¯0·lÛ¤v>öƒÒ@´e9•jå&ήEâÇé !þ;vìd“lX² ”ƒ{ìyoæÍ(?–Ì=ÏYú ¦X­ò Гû» 2v¶4´[–¯W“ËÛ :K¸D`·¯ZEàÁz³Å¹ |j{žg¹/§¶ïÖžm8NSÊ6zcGÅVÏîÞVߺ'8J(›"‹Lm´ kpú¸z7y»j®;¹²<„>kCGtÜÀ³¹\[ø?§òl`}äÉ:Ï(zåæZr•°Hî#… äøòy ¾„Qr¶¿*ë«ÊÜ®íÝ™ãAcy¦mo)‹ôLl‰žz%‹{;³™ŠLiÑø»£Î.+‡° ­¹Ï°)æ†à¹¬dâª>;3ã¡ñLEÁ“YW ¦¬ô(¨vЀ7£ÃÝç¤ôâ]0öIQÃrüJð$ŸðHzÛ^Zñ¾¾nRüÔ”q=ɳ‚ úl8c¾)SÂDqavKQ›5ZÇqUý%¸0»áVe4j~8¥¹³÷jªöÛ¾nß³ðçÈq—˺v}YwH–$àÄ“ƒEêÏß›`îi†Œlði„žHœqòwŒŒfm4wÐÂíå¦Ó"ö =Z?Ÿv8?¨>\ ªQV-›]ÓÔeþ\uÒŠ¿î0бõÕry3N?ö;A§ŽÞ‚¤ùaW¹‚ÒÖÿa´ŽU˜rÒV}ËÏzp»a_‘$1 B¿5°øm¤UCm‚½WŽ<|¡ÃÒ…¡˜u{ãŽÖ~ üÜ×`É¢ÚœI‰¦R×'¼¸&¹´*1®[ƒ:D‡R§!éáE;SzãüüTÉ Hq-I”yNxˆ ²Î;¯Šðú©ŒcÂè£r6ì°‰F÷@‡’ò#²u’íÿƒ“¡G{5ÔÝÕÅÿÀ@¢Š×8®«ºèØ*óÊôoRMþÛmŸŒ endstream endobj 555 0 obj << /Length 1077 /Filter /FlateDecode >> stream xÚ•VmoÛ6þî_¡u&-Š’%-Û€6H“ìC·u.öa F¢-a²äRtwØß‘<Ù–­¤Ä$u÷Üsw_¨Àu²ÀI#Y”:ùj˜U¹tìàýõ„¢†þå›ùdú6Ž,Ȩ3_BÍ ç÷²äk%¤ç3ÆÜð;Ï¢ØýE¶KÉW«ªYÚ•*íèúÝ=ˆÜ÷‚uÕxÔžOÓ8ݘzÍš\Íw„â0<“¹¶<¡žÌÊHÜ‘ú,e‘¥˜DžÏB÷5ppkH¤á ø°$roQ–<7K±{õÈWëZh–ÇuÂф̳Ø7B‚O2·êì/·?y«~\ÛBÙ‰*¹BŸºÞtJtÆb‰o{°=UcßxaÚS%žŸP X\ÑK#tš¼aË©e»-p`Qtª,Ó`Ð>^ÛeÞvP@¿tFÔ]èæ^˜¸Û]J±z¥ÍB—ft_( ‘¢S€Æ%–à@ÕJnν4r_¿±,^Õ6£Ylš\ëˆV¡­€VÚ¦)„4Qm(½†y2÷êç·vëTJ.y¾“3²žv:df ÑMÔcjˆI¦½…x¬Ôè%MÒgq2ÂfQo¡ZKËà ³@‘±0~Èb$ (I)îÛéK~»¿íº¡gU“×›BØÉ¢ª…®¥wª¨ZR¢Ug¥ø´©¤(Ðæåt¬+_0¿ ºº#åÛ'L%¨çØtvÓT€|`Î è0×À<ÐZ›—¨E®þ àøôÿ$²í¦j»† EP›Û`O<¶¯–°ûŽmÃQ[!eÓžYRÓÆs@ë6çµøBE‡ê‘xJ}AKg•·Çšöƒ³òÛy• ‡VnŸLua¾*ÄÌ‘¿–©¥‘Âi0ñ¨OÝ>;eÆáb4#Ñh¤|p©*·þ÷m…áó»š{ %­…ÜSÊáTÂÊib£±ÆAD'h@|€rÈk—”Ü4 ì½ÑP;#@€ò—¥ÈEu/ŠQódt8H¬Õ—°?/$\júgÏéîÆd…¼½þýöÝ噋C€ZÑ>ôL?‹…f)ðüz(E3ª\üÞ´ÈîÈo_)Ÿöï”($3Êœ0HI˜Îú·JD²”ÂYìHá,&¿â{jx ÀálŒ²„ÄqfÓÔtÌÅiî‹gî¦á.Ò¯ þÏ«áTËOHc×Ù“-€Ðÿ˜EJIGGAå0è. ÎxZÇǶhßéK^×w<ÿ¼â±$ðíäD<ÇkjßÐ}£yž‹µò÷ŸÄ£È7J¯ìT?L‚‡UÅü„hЪeƒæìåm¢PSw^örê„ê-]Ô|y¤Z)ÔF6Ý ±ß8í¦.ƺÁë®ÝעϨ2Ó-ˆEkö?¿Ù,6 endstream endobj 455 0 obj << /Type /ObjStm /N 100 /First 878 /Length 1860 /Filter /FlateDecode >> stream xÚÍY]o7}ׯàãî EÞ/’@P Ù E±[ H‚¢mšÅÑn…:R Ë@òï÷Ü¥µ5v,Í$Žì¡fî—çžûÅ¥‚h 9e\-IË…qMÝX´iø3 ZýJ¡äŠk ÕŸãýÄ31L”YqG1(xTJÈ$.+!K¤¸›•q§PÈæ¯×riþó4òJê2-P.e&ÅUËxT ƒÅŠ’„µ*„•|1è&,Ì—¨)êoažêªWÌÓ-Ñ Üj™ámN>)§À»"ÆŒ-fàìûÆrLl´À¬X¼AÆ×“¦Í±h¸¨,ɵñŒ„7jx‚i ÒDARI=–VWŸ¸& .êÌéëiîì‚A*ŽYÆÀ7$m¦™|RöËØø¦Ô„U€ þa* Ø2°Æ¦ ´Š¯ Õ¡vÂS5K3òå­ùTø+Ø®V­þ&Ó&Š~4ì[É‚¥â –›/Wƒ1̨MÁ~˜gº˜²Ë*þ°6ƒý±Q+æÖÂtì€Ò€{ Y °SI ó¸’`t…}€‡Îw ¹²Ì¡0–T°I¹„b°öJMJiPš@­Ò ‘S°¦ä"ªÃèpQ†¾OHø‡?ªÀ4ØguKS•ýeÃ;QÀT VØ¡8‚ ¼£Â° `kµ:{ôh6¶Yï£Gaþ̹ç{Ž!È]öC¸`û4t²Ñ§ ¶é?¾ûn6ÿi»9{±Ü…WaþÓÓgaþrùa^ÏðÈyùñýÿ[Îæÿ‚Ëõîlê&žÍŸ//6—Û³åEçØÝ­—oW‹'›áU ËX¯±Ìb‹wÁÑý«×ë ¦zÕ… ×ÅÃ_–îäfó—ovÝïÿ¬ÖÎæO6Û·Ëm¿Fz튜aB ºIjÑÈYzSŠ`dw`½óï7/7aþ4üã9t½x¾øøOGbô²îÓÍ¢–\56pιž°êSh¯{#þòëoNçY_žŸÿÈ¿ÍÊx9M²²••áäGY¹¤C+í­ÜöWžjmVŠîäÚrôæÖ¶D±vš qÇÆÞ®v«Ízqþ{’ôÃzµó+n_ì¶—g»‹É,ÐRc…éc†‹im±HþÚ8àdnQ=×Ô%  wHõf•þXlg»å¶Wèýåî¡f_Œ¡cIYꀔÅF“Rz2–¼¿îIZÓþ7ï¯2•¬D%¶.íG¯ cFÂGnŽÜÚæx|S¬»eoüøïâl9ÈYQªYKL^Ÿ±Ä WdƒzÌ_3J¢Œ ‰ µDôhàîÊI"—›äårûnµ÷ŽkÐà¬8ÙG©qÔ@(æ¢WO„èAto tŒõŠèˆg*¶Nd®{Sƒ3EF‘TûD ⃖^yßš+ÿ½üønñþâ0"”òÍ#BåAD¨ylD(:9-í¡5«‘¼Ýé±µ7;ÛJßÛa´­££mŒm.(³°©+ªeXfÞ`§TGÑéI, n£¸-î•-´üù-Ü ƒ¦ åÊbhL#š™;å•6È1¾d½Ú»üÝ£ ”u&5,šÒê:–Çm_54Ý_mruFwm¿Ö(Ò7-Õ³r‹¨roÉÊ‹·ç«õòjñølu>µ>ø¤êñİWLá[›¨¯¡£/X?êÖæÇ.Ñk?*ŒôÝFkÒñ¶á*×e² zƒ'‘û oocúh>rž÷ÃgM6às¯‹!MmÀ=ç¿&hÉüÅ[2´iÕäN‹ý¼Ø®oΗÓÛ0#´aØŒU5ûYÚ°‰ÈW÷*Gàq]&›¢'}8a=×!6r×e²7Ç¥Þ]xøq|¾phP.û7„‘àP~X!Êps:6¤SÏrÿŽ25¡³Eÿ ‘3Ó¹2jÂr ={1è§$LÑŒüÃ`´jã:ÙÝ®q нS.דµRxX+БµB¯ÄÕ½ò)ç@†`;ï 6Àƒe4z×eDR4僇¤!õ$<®ž}ËîO»+ïkK™\SJFGáŸv³⓾³@ R㓊(¿¾ø¸Þ->Lo3Àl/*‰%6”-†¨tjaù¥ÔCƒ.õÓyn¦Óç>|~utJÿA”*Ç$þû3ßCOQ¦s©v„Û]—að&ÃÑ¿´ÛA-EdÇûà° “äˆ2ø@&3²»}±}íðnz€ÖÄb£Á9¢&>!oÕ’=˜€­Ã„.£º¦opð­:ä»Éwý«’ÿ?.Uju endstream endobj 560 0 obj << /Length 1072 /Filter /FlateDecode >> stream xÚ¥V[oÛ6}÷¯ µƒXuñ¥A¶¬K3A׺ØÃºy´HÙD%R£h»ÙÚÿ^R$%ÑVÒƒLŠüÈó]Îù¼@þ€7¼iùóxæ¥Å ¨¿ò§ïnÀìËãÎΟ–ƒË_’Ä?æÀ[fÝ£–Èûcx½…¥À|4Ž¢h¾ã8¾ålÃaQºÑ "¶zts÷A âá; QNè ñh fI“pôçò×Áëe( Ã'"W;O¡OºÐ˜ù3o2‹}Å}%  éHZ'Ã=#HÝ/σȉޒ®W&ÞBŠrå§Úú1H‚t Íì\­ËOÀ±Úü¿ú#~œÄîÊå¹6¿†TvÖƒ¿~n¯©„¸×3̲ú’zÂÌÝãÏD¼ÐcÁÌFùÉ7Ð.{<"Y{¼‚®g¯^éÿ»‹…}ù¢ÿ+ÁÓ¢tm.ôôLÝuÖ²‡M8ú<ïÄ$qW‡öÀ©Ú´ä„ŠŽùÙG™eZc»ªmÆ}PN¬”CÇ–Aâ–[RéQ¶£© Ìä‘bŒ*7%kãI ó#wã óiköIFIòÀÜ$ !©T]XzüÓ$šø³ÙÄK&‘Iç Ib>²ö=޽lð[/¦ű—$¡? ›e‘·@köª 1ð2Ί# m’‚|¸4!`vþ,8ÔÃRTv}د$ðà rýšûʇ'¸Íýx:Õ®­qã"U™Ã{Œ\–ŒÁÔòx'Ù<_©X¬aúie\\q\°=n‹Æ©”pâG5ÞQÚÜj‹¸[Gåÿµ§Põ Î¥8ü?>¹2ÕsDh%KZ0~ï²ð¹"´Ü‰¶>^êá•æÕE»ò Å2Žñãú#†²fŽW_Ä„&.Tôc moU{4 âŽâŸïŸ¯÷Z5DÏPuÕ§ÌöJ~Õ‡Ú Ïû½@8ƒ»ÜƜɊ5 {˜ï°a"LSÆQSM» {Â-°½|9ëW=úùNc?ˆæÏÑH2ZÆ&TŠ"Ó‡±è¢Vá_\¯~\,lŸ9;åØQPÞÔäÔ㡈Œx’q“?º±Á8l1µú[?DÌ&+é” 5A,ÙyT6*u®•j„î›AVŠ´Ã¼êS˜Ð­‹Šl¥WŽ¿¿½ùýöîúÍ…Å¿1ºó ÌØÜRùžÉóïItÿÛà½#ÝsD­ß–Îé» _Sa»´¥ÍÞ7e˜3VJ¨@Þ×iµH„î¨ ¶C²‹mÛ°lÅï!ÉU)Ÿ&Ê j›0D¶_¹eñœÕ5ù °hÃaØwÔóeÌ(‚uÌÛ‡’ª¤žè«ÐWGù[ïH.¬05•u Û&íøma×ë'aË[ãb¸Së§b´…¶ìíiC$»?‚'_­ÜƨÿÙòô5ÊþÎpØ’®JC«ÆJ¤¾ÔÈOQ endstream endobj 564 0 obj << /Length 2008 /Filter /FlateDecode >> stream xÚ­XYoÛF~ϯPóR@Är¹<“ö¡‡“¸HÔ– MaÐäÊZ„"…%å£Eÿ{gv†‡b*qЀ¹ÇììÜó­Ä̃?1K½Y,¥›É,ß<ò쪹šÑàôå#Át \Œ(Z>úîE΄ç¦^*fËÕ˜Õ²˜ýáü¼Î¶­2ó…”ÒñŸÍA:oM}e²ÍFWW´q£Û5^žœã pNUV”ºš GÍ" =ß åüÏ寎–½@¡ï?Pr¤¼/z4]½d%+d@òÿW΄pÐs!¤+BÚxñËÅû£Ó7sà:¼Ð{²*øŠçö„ÇÄ¢§>;ZÄ+]ªª榼ÐUÓ•mÇSÚ¹ÇÒ\é1KC4?ЧQ¥ÊÛ!]xvüþhÄ‹‡'ç¯_OʯW#Yiø=}õÃØÉª.24!+ mM¤Îr­î˜µÇ&•TU`öá êE;…γ–éÔm®¶­®­Ýíµ•Ÿ ôu÷R“V| }v 6HÇŠXÖ@ÂÑÐ9±½Ú;Á<zu¥ä[4G({aÙmÑ agÅ»y"4c˜8XŽ‘8#‚®AƒÛ€òÿÕæ#‘@ÎWP µ5sHfͨëãÜÔÄ¿†^€´aƒ²4D“1«2kx½K ‡ÛX1Ökµ„&ò¬¢{˜&ã@“} q Éq¨¡b ³ÚÃçÊ;ZÂâÑC]mwÌqe0Ô,ïŽ'ۑĨ3S`ȘjUÎ$}NxŠ(«®P¤@FÄ8€,Úβ¶5úr×vd7kÙîè–VtCs¬€ªŸ‘àÍЩ”*º jZÚ’á̪6Zix)×tktÏ`\.>U‚„‘qä4;Rg6Žíb_uHJüRã²¶+x§¢Cµ)ºÈ3´cýhÏ4mmÃ(f;ÙAo§1mFÌš¬b²¦…”ÄHObŠô˜Ô ®u¡&‚-ÛnKLdˆrŽ”]ÓÅ©­8àW•Ê+ÚvW»*ì"±¨9Nù»ÉlÜíÀe6]jm`Y,ü¡§l⡎Í?¯™ÆpÓ!ü!Ó)rÙ[ÇŒ•ˆ”’ —53Á¾k£‡Vµaæô!Y7øŸ³Ž9aâW5ܾ:-F‚½“ûÍ@\?ðÁüÔmŽ_®œjK\ÝÓ)N±ÅñˆÓïçÇ“¬Ï…þÿ5œ–G§¿ä$¾ŠÕ«ó·Õ“_ÅéÇ×ÿ›P˳åÛÿÉRË㓇µ|HÔª˜âé§n”î3}sþe¦° GQì¼Ã¢D¨5I]h²{É=ÂEa8®F ­Ô´Õ5¥ëMÃÔæXL" Q¿L§úDÃ]–Ý=âþÛÕ¯p¯ÎOõu,Ç)vŸ…¡!f1Žnñ:–Süªžö‰3ÎÛ–Ñ «‹H¸IÒ{Û°‘:ð`d2Ù†E‡N„ðÚð¶]êŠ6Gì->ƒ#p¼Ú>z…䧉vóFÈ.²á"àO·à%»'ƒ|¢Å¢•§t Ú×NѪ…*ðÍrÄÐŒhY {G )&£9MÜô]%ueÚ—]Û #±P°Tuq‹{£f‰¡Á¸Ë{ Y™¸ÄûNÃ.´~âûM•B1, ݽp§CÝ(€à`ÝÃ+ f마ùì[Á²¨º×¬o3ƒ>)ïpct……[°ÅN„‘'pr@Ò°˜1 5ðvªDö'¥öÀ0àÕäFoùa;õjÒ18¦ïãðj_¥.P¢ Ó>—ŒBÀ3·¯7,siqÜ U²½ð]ÏdQDÌšzÙ¬µì|lxœFª>ua‡=lSÞ³iª{ç#ŽbïÝñÉϯ&ûWè&ƒ>Ìväh¼“Ê †§/ͱ̰&¶¤ &¬ŠQýI¹¿l17éÁRC Þ® }Ûñø)ДÜÑþ³Ií/9WîºÍ6ÛÒ¢mx<ãÏ?H’Ñ&D*“Ñï^Ì;«¦ )cß E_{oQ¢)+úhïèHûrï~Zþø¤ø endstream endobj 568 0 obj << /Length 2875 /Filter /FlateDecode >> stream xÚµÉrÛÈõî¯Ð-P•‰ ÝX’“ãrWAy¾R™t`ÍùÇõ?ž½Z{‚¬ÖO¤1'=ÉL¨bä %^ ¸Éר0Ñ)M˜ï.^ÿvqùò'Áœœj£0Ê”ÃÜõvOâÈUp:ž¯tl‹¾ìâ®ü“¼ÿ: @~u±gH·i˲–uõ{éð®APM{(úª©Ÿƒ”£$(Px[FèwðP*´aeg+‡Ê2Q›b¿Ç S…ßÀ…w°œêø),›<ÌÏrWÝ0õp<²D±R"‹H[CÅñ¸¯6ÄŠû¬ãªîzÀ,·áùÊÚtPíŽøÀƒ»63®bŠF烠XML¨Óä©Úõ=V³d¤é,%ûnNÀyÏïmÙ•}Ï .‹à ip wDßð³ê;ÞnÚê†\‚1Ҥї!sª” c¯Yaõâ-ʃ ×Söð#ºñG[5¢ö·@ Ø™)ìš¶äÐFÆœ¨^ ‰aL8.¶eÁ4ž wÂÀ²õ& p´ä+š˜j[ö§oÔ6øwd#6{~/ÿ[Žûò9¾õ/)VEY˜i¯¯}Sßüçp\´á8LÅ~*6èŸù"Ò‹6AÁ¯‡¢ŠŽmC½Aq–]Ç Ì=˯9ÍJ¬z¹7›P˜ä¡ŽŒ»øpêú%òtšØÇ4üEvsXz;n÷W›}YÔ§ã[L wE‘š9Ç5häŠ-%Œ/QÅa¦<ˆ¹-!8UŸØR¶Îå ø‡Ç­ã6H†æÁz¶&îÜc~Ђrd™°`/Æ6Ÿ€:Ó°a®r&å7 u+j(ÜsOPuü<±†pIWãe9¨›°]¾.6‚„ìvDc9OI1&a&‘M¢IK{5B_HMóC9.•›%€‡JóúË=¥Œ^¨½¨W,.Ëmc… cA1²Æø¿Lu`²9{*U¡ÎÏl–‡±Rp'È«ös³#=)"ÈBŒG9”7(Ô#ad” :¸Ðk8Ë`æƒè%›M½À¿\c¼0é¸=µ¸Xž°‰q 7zï‰ÜŒ?m–Üm•1»cé¢Ó±E}¾j![]mvE»äOJGt|ÖÄ™àÅñH|³õR45&’Îû†ë|vé:dl8¥»3FPi¿åµ¸)¿ÛòX´¥l1«À”Ð7)0œÀ§¹æðŸÇ“ áä­¼U]3(½ãÕmÕíxÃB8ëx<ÞtºE PzM1c‚ÅÆ1Òò˦Á¤€Ö8›¸`WKœ’0ÔqˆÅ!Ÿœàmy ׿ÆLåZ¸‘2">'e ÊH‚£Ópƒ¹ªò˜äÄ%¢æÀIL"Ú—sÑ@FÅCî!/½|-¢d:FÑ¡òLþÀO–1.ª®(ñ hÂ%¸ [ÌF}´§#çrí•#zÉ?l‚=º¯Isx][‘D”žÞƒ¤8«Â(EЭ n)WàªÀ‡ñÖÂ@1)Xa8ÀgUO=/©(ÅoÄ$ÝIèåϱ Àú‡1œ«á6~¼u.% ¥|$¥#è£êú²î%-»ô-˜côú[*i²ÐX_Y|9·P$µUñ‰üͰeáEa °4õê÷² £ïO`ÿ+£L°ÞU ï%»»÷š¿ŸÆpþ¶¼&çD4P„‘|Gb2®‰ôâV¨Ÿ*¿rõ3.X>¿ þ€o@ y9’–êšÑ&ùùÓ9ÞQÔ¥³a}êJws%Û3y„›Z¾»-ÿºªÞù É(Ã8tÚ °‡ñÌGì(– d`ÝÑùEÝô¼]lzAÍç£NÌT_!4M+G8…úÏÄÙ³‰Nïçܯ`wwŽ[*¯TIÒÛ‰C\µ÷›Œ=˜Yúp,Ñx½K¾1Ë&Pb°1Ǥ©Úwh¤\WÒ:Çqê8ž§é7&´@ÂDiè{;¼GÓñÜ/yU>ˆkN3÷g~…ùu‚ gM.áV ÜEÚ°ûÖ*úéÉÔÏ]Çôïæqü@¡—æPFgÔø¤&TyTró4žàÞ¡þF¿€ZÛæ¸Ã0 ³a”Y.Pôlž™Ã€0mBkŽ7*à•K’h$XG‚ÃÙaM€ßû(!¯óÌÛ¶ê©À]²j…é•=¿mö‚µ+Áû[Þmä)ê¾_¤ A3N Ä'*o’xˆí¼±)Ûž{rØ»ç1€Àe.(NQ®Â¥ÀîVP£š`׺)ÅmiÛàB¨ªäŽêÀÓ½hqnƒg—JÑIÂ1”†ÄRQS3I͈ Ÿ‹‘zFè&(^u„EU®˜5ºBÆnKuˆÎÂÈÕšÏ×FP¡éTÌÛ(ÉCxW%wLÁB!DM…àh`ÔRÊ8/A56¼žLIãx>%ÅÁèé@Qê{¢ ›¦mOÇ•ˆDA-˜ÙJ+(6¦éÿγØÉòã *æÖjêûÜwÂyUÃñV[Ž ýfwåRôÒ$' —fvÊÕ±Jç±@ñq\‘F3¥hââ³¥G$?Á¯|O †0ŒCÙ;Ø!/V¦y¨òñXÍK± Á;Xš°‚¼òÑIÿ|±x”‰B\}í(0ª(Té$DÀ‰ëWoyðÄGhK’ñhÿ§÷oä2þ¦“^üü½hZ¿[¿ùN'­/.ŸpçžÉÞ+ÆÒ0KóÉ™¿¾\›’ª4Î}5IUk×€C¯PpnëãïAØ[ &ÏÃ$O'¹ùÌí8+»ü«¤ÑOt˜šô‡„(°7»§ÇCù—f—j^ ÄíP‡IÈ ? |èQCg|rabœŽÇÓÜåÜJ§º˜áO2xª¶àÆ‘#š;çÃÙñTY,D€?Ü@Ô‡‚“çùC&y/‚höMä~ËÿµÆþb¤î7³ 8n¸Q”q>™ùä·*.\ü(Ê$Ã(ʤӕø×ؽ QˆHc|·„kÁ¿É*3¢Ãj1X‰bc²ÂBM´c¦¡™½xË£òΟOæd÷«xZcŸô¯=FÙlœñ ÏÐVîßÂŒ ž‰5 5:wÝXî¼·Õõo “Î|b+ –ÈçÝŸ/._½[¬³ bú¡ɧó (ýY/ýùý/—‹§Ù<̆?NÙ òÉ!™‡Yÿ„ “Ø0SÔþÕàâŸÎ`¯&TÉlvù‡²àðÔ§ù‚Ò1¬ÓåTˆþI½wÐ endstream endobj 574 0 obj << /Length 2708 /Filter /FlateDecode >> stream xÚÍZK“ܶ¾ëWìÍœ* €9ÆËÊAåH«ä ¨¶¨ìKrBr´–½»Ñ œ¥VëXq¹T¥i¼îþúÁ•WþÉ«J\Y–Vº¼ÚŸ ×;Ü]ñúÅ3Éó¶0qÍüÛõ³¿ü`Ì•i%*yu}³ºÞ_½K¾?Ô§É›m–e‰úëf«µI~ú»¡>›îŽî›é@Ô‹Wo‘ÐÉk[ïÛ¦ÛÈÄn¶²4B%ÆlÞ_ÿãÙ߯ÌRO<9ÎüÊÑ¥Ð0ª¯òR§2Ótþ—·p-’ºÃcUI}:µÍ®žš¾£}¿Ùª2±#wýDý÷Íx jêièPo`â§*ðJØÃw´4¸îpÆ!ìÏÔ›»®nÇçØ’I?\rîö­]ÌÄ—ºÚJºÑVf©4t¡~: 8´ÒÉtÀ[Õ–ÈùLØ gÂûie’ÿ#7<^¾x¼B§¹.à±Ý.o^¾øñíOQþBÓ)4»s×lðb-ïoyú!¹¦îFY z\ÀÅTšÜ…Þý°)/Ý ¸¼Ÿ¥$ÓÊ…¿å•üúM{xÏ¡½9ÙnöxCûÐâ\,Dœ©2•_iBï¡S¥•Ÿä„Ñ7û5~ ÖÈ2b'×ô¤š%«¥ø^Ûé<àã Á‚Ò=Üܽ?4éÁøÿ²Ñ¸—… €9]>öãD£ K²œ¹K,ÏlÈž÷ÔóáÌLõè Åœ>;ÍœœÅÂ(É€÷ÏIÔ=Ã¥ EhXÐpYŸš‘†ºžÚ¤M$Áu1&•^]Šÿ]]>¡ ½¾8•>Ÿnê[ÐùÇ´¦”©¬ô®5E™³„¾ëƒ{·Bë§Ö}Ó¶D v´‘¤U@x3Ò)ŽcÅAz†lõÌòP3Ÿ†ïñN5ïÏú°g×À4Ó&­T¸äÀZ‡o÷Å û5 3™7U °¼e°$ÜRxåc?Ã&õÑ݈ôZÁ”d˜µÃo$ê–ÇGÄ3oÎoÚì-*j1+*¬pBà=cÃ^LÎv ¨¸ò`Z#Þ ´üÖá&ò…⓪Búø+lA×”ÌÖØÞ7Ýî°Ê·÷™ì¯ÊS :ø»áza·ƒµ7(›RÐ5ÓÓUZJõ‡›ž.nÔŠééL°±!…7 *„:Ø8ÕÃÔÔ<‡ÏMG µv ôí=7 ‘r:‹Äî< À±£éNg&9° ãÜaðFS@ƒ·kúwt¡è¯ñ9ó":'4àzS?ðïÍR'ÑÒ‚–æ~iûyk]7`ˆ» }tîäóg'}=ì‰å±Þ }`Åþ8+Ç^îPú X¾Ûñ|´C³£Žz¸ƒ&MC¡¦`ºB–,3œ1úsË˺¨AB:IG~ÓDª„Œ‰=i~|qع<†~¥HÁÏÌV·-uçGYçq˜­ó2 ÒŒbÔ@ûBd+‹,Šl_¾º^l«TÁðiFb<‘òÃIÐ=`OM¯Ø“ŸáCÕ*KK•/lg¡Ðj:…F8Äk­8ùo2Î~ÝÅç%Äþò)8“=gНãLž§âRcØÇËàÕ%F×M× 94¿X#'Þ[ú`^*· ‡¨Ùx±ùDùDXî}"z;™³·saÙ*´„X²=‡@?Íï·Ùov{ê)nOýn·‡qFZdj©“.¡6%Ôæ2¡6%Æ,Ú¦‘渨 ~ÁBw–ÈH °ÆO‰0mÀù34ü“; ÎL”’S胫†¡¡öž:îMkW²i/DäTeðÁ0h;jÚŸíî<¨Ÿ¯b Ðyµ\v÷ÑKð1È“ž¼0~)k;츫=åßè;>Z³‘‰÷7¤´U¤ÀU6á›}Ë$ËTËHšS-Àfœ£ÐÉ2ÎÃa¾`sn´¥2nÅ€ þÃÆÚ‘-³ò‰u·w>–Pµ@d¡l»Ïj4úA”2Rçq5´„ÄÂ2€WpÝÇÕ¨²LõB8wvÚÝ„ÜaÍ r`#—­½,Z)S¤peÀ¾¨ÔWêV‡T¡¸¬Áøó1UÉEj‚¢|! Q€&Ú#óq9twƒGx\ 8vÐñYUUúpJUEôî8à'œÉï]Ž FdŽØÛš(¬‰!R»Å>¤&U© ˜,— ÍHq¸Ã^˱o3…J¸ÇgFìzõ5D#ÝÓ…N¬T ð÷+¢vwèÏëaÆ ä,eù›R¥&Îý€ÿßLA\_=!eË• a8»5l·æÒntÆé,Ö°AÂoÈŽ\câQWG¼g>¬Ž#]bõS&®"ƒÓ¦¦ ³âïcØ\ àöÍxjë€[ Ö" ×C½›°£Ï­jN™ïlgþ2£ãkކŸ-}krÐg8{ÇѨj -Wz ²‹Dñ² .#ìÂ$1a z@UçÌ5j'"ÍJõ„ ~[Ó3¾­°‚€X¸:AüÀñŸo_®²Ô" «ó÷‰5Q. ¯ß\¯~Ô`dq‘· ¸”føGØO2B þÉ‹wùáC™f*ûöE„üçþ”•Wî[òæûð1r‘F_.¹„hhλøgý…-æC(à—‰ ƒOcæ’ϤU>à µ°mÿE« Çø­äÁ0¤.˜´¹Ÿ/^‘q¤_âË<-…²u9*pö¢2 œ~ã B,CåLvÅ8Bß5ÿ šÇÕ-‘{â„~ ¸ C}î 8_-#)“fÕƒ‰n—¹¦T]zá½ÌÏsÁV¦ó{äó±Ã‚椮lìmãÛ•Ê"uù”ÓƒòÈT^VrúU® ‰LÊ‹3­ÂšLË£Ñe¨¬HZ—h ElÆã*Ë)ëøï™ ÎÍééW€N)“ÇQô†¿4é¾›¨‡±»³a™%;í›£Û Í‰>Ì¡úv©Oî™®=ê endstream endobj 578 0 obj << /Length 2739 /Filter /FlateDecode >> stream xÚ½YÝ“ÛÆ ÷_¡·RkÃýàWÞZOì\§uû¥Éz _Ôd†šÄί'Ûs3`þ/ŽÔ[¶\ii÷¨–¸_ÿ×’¾tfš±º2âòÝóu®£S[yÉèýY¼RI¢PfÞÉBûØ`ùIÔ77wv¸¡ÞàI´=ge.Gíü'1ŸRLO1B™q‹›.ýW‡ºå6›¯ºÆ-\ä";ó Ë%Hl”2æf†þÚ§Þ‹0¾PB J°%µHúq~<º•°ÔË„6µ³¥2ú¸NÎ}]Þ6–W“õvk[ÞÑÑï-ûìÀ²¿;m–¬€æ©8V~’™Ímõ›•ÆðêO•sþ]êÿ¸örØ.у2ÿ¢ReRˆL]å³üúܲB$c vÓÝe=w}fbÃzT©®ÒÀ®‰ï'³vÔ8ü’ÏÌÂsÈÛv]Ótxõ{´áTB/¹‰v¬%à\âŒàžˆ¢]ö#®¾kKÞÏN0%-D¬ÒoGJÝ#Pꌢ¾jCnO'R¤cˆâωC¸`VƒïEõØÝ¥Pgë²÷u[í—è ‚tô!äðd¡DžßM^Õ@ þY—§¡ÿù>OåBƒ«‡:—ïdáq¹ˆ/ÍìÝÔ‹ïGªäI-g¼,©1M&Bœ?(–ÇîR¢t2ÓåwÏ3 þƤAA©01À®­2ΕHAO©Žž¨vèþ'ѳîplì€7X8Ã+06Uð›íïsÄŒò@À XTû°®#¥â!¤„-‡@¡ÜrWu‡Œ{»¾;ÌÒFŸöÔÚ—Žæ˜8¥Jœ0œóFÌz]Iie}w‚œ Lú·)ìù`<@c[¥XoR))‡ƒ¡·SO½ñJ:ç¼;lð`ßYï]`Ìø(è303¢#äøï·ˆM…úîh¨BüJ¯×ÆÇ x3œpÝÁòRûiM©‚AŽc»:\×Ôn 1„Žp6ä\}ÛØñ†ˆ£µTW ;IñLº$Ÿ–$QY7˜d!Thk\ÐMíSN®@0(xU$T¢ÀÆ%CÕ(pmYU'Ô&Ö„pÜ~:z@`»äÝe?Ôè+qý=¢Äzîûîć}h x^YžŒ—4¼|ðì½=ó•|-\Í; 8Í—5à¸}]áÈžº‡òCðüÐs¯pÓ§A©aÿ…­ªãÔôÓÒLtʶ•ÎÞè5õm_ú"t& v"¯#'LJQeWVvÁmQ=PN €ê’I(ÝðÈPQ4@E?Š~˜!R˜ÊÁû™Eêï@!ÝÂÊ*Xá/±4mËâ3ãȧ“àÊ0Fð³’£Š øpý“‘Ùx jûà©,O Þ«“BQX†k—~Žì³ËŸm{÷}í+2Ÿx+ŠOKSÓ;ãdÈ/ñ(R*Ð.• É[rn;u–üêÛOe54\¼º'Ü ï:qI“ÒÜy2{æß—Ⱥ§³´V_ÂÇ×(iNÃkpgDa &þ"×j̬û¬÷£G…\~¬º“ŒþÓõ‹ŒùðÄ=›P^í"] Á³,¿§`è‚ÑĈDÁ¦ü™,õÀßÌ1ïÇ ‹!v‘jQL#^Y>'eF˜Äœã¤Mž)®ÀÏô½0Zqè†múŠ€­!pïëTû„`5Mó9L°(5ÖŸ@Hÿ2Ö±y[·ÛÒ{RìMüôvg£âIȨ ˆÇ´§êN\\J?cˆîR‰â"zÎ/‹mà ?ü:~÷0MÅJ­d …JðËÇ»÷ñj “`3Âd«{¿ò°‚W9Ã(¿Y½yò™m À‡€TÌÁ%ù㇥ëÈTÄéD™)ï•oIp5}'Ac5Ê…ìK‹Dsêu)Õø8PÏÌ€ß1ÂN€¯ñ–éÇ%n¹òQƒ’¿E*¨ôæ€išýll/u*Ôy`êζ3y6è‡lQb ×Å"¨s†É‹Ç[›©ãw‚è«f8r…–­°ÐƓܸ€Ÿ'‹®Ìøríi+H¿WYjñåžÓÂ×?"à¢ÁÏžøÔš€#¯ähˆ +g/&’¸Ìúqµw°xà0Ã`OÁT¿xˆWpÏuo·¡Ð™ˆ4Oæ^PM½ y×ô½ÇÒûé?µŸwJ -ÓoV"23zCðÂŽ8¡ïUÅô{ÕÆ°Šª‹ŽCêÚ#=Ð £0—`ûõÅrK…3¾”({¬L|rœúãdŠþ8øbh0þc qä“8„¢ñjµˆ#£ø;î"¬ã¢Þóp3ú_õý˜kÒ!äø‰ã —‚ás&çÎ3hÑ˧rzZzj;ˆwäèzÛÅF¹ÝöÖ9êøëÁ¯/®cƒâA©²©ÔTÎç.ñ£ pÈç: à‡•Åãßm‡þáæ™sdØ™ÏÊøfüŠRH endstream endobj 581 0 obj << /Length 3098 /Filter /FlateDecode >> stream xÚåZmoÜÆþî_qýTʶû¾ËöC›y+Œ •E¸ôOGäŽTHžç×wfg—/'ž,[B¿†qäîr9;3ÏÌ3C‰‡b•ó•SŠåÚ¯Ö‡<Œ¶7+ºøþë"®»‚…W“•Ÿ_¿øÓWƬg9ÏÅêz;Ýêz³ú1ûbWÜöe{q¥”ÊäŸ/®´6Ù?Úæ¦-‡ª¾¡‰»ªßÑÕ×ßý€:û¾,6ûª¾Yyq%¼á23îâçë¿¿øòzÈHùHÉqå‡D7,fe½fBi_±‹+kyv½)¤ÙMY—mÑ7-Ýn(á$Ìz¸¨ššÆ«Ž~×Å~_nèº-oáÂgeÑ—›ý{äÙ¶mx*ÆN…‘¤@éƒíþͺ9ÜîËÞðæPôë]ÙýÄ ‡ÿ">>;‹P‚9iÓó—ð2ë@‚þØÖ¨uxdu¥,g€r„‚_ZY€öMžu}KÆë²X_€Ø;ºë«C J}’Rp¬hoއ²ÆU}—5ñ7­™(oAqë>¨‹6(ã)òé)”ÐÌH•NÑ—¿õK‡•ŠImÒª¢Þ,í%Óù°U׃Îì…Wq[ÚɃf?$Ò•Êã°Žt+hu”#“RDv[´}Uìiôõ×´›¸¦¡ß·`:—•t Ü, &œgÒûŸÑ1£ò´, õ{Ù6$UOf?q¡Û®áOÄŸQ‘Ï_’In˜—n®XÐàaïÈÇòôÊœÏÜnƒ`þ6i`´ 5í&Šàuïiu]$–]W´q¨ª+Ôpõ{‚4×ÁEèiZD¸l:Xú·+i¶".o ~áaø )Û £v„ðwÝñmWþzŒh 1Ô`F{1£ýì °d¢J€Ú-§™tƒ‘1¬wE °/1|÷ëWKfwœi©ÏmèUU½Ee.¼I{f„„ 5r€›ðs‹~dtŽÙÖ»¢G(ô‚¶¤K8Qˆüx]7ô{hÒl2XW½­ö`µí—Ù>x:Hú†5?tGPþûaº•Žå™h4ˆô<œïØÓkxÚ‡gûªëéªÙÒ/9jl_ŽÏ’nâãw;ðŽ¥e ³c ;_Ëœ±Sü⮈_Œó˜r\>øQ’úA™K¦ù<ð75Š«eŒ¡bo ö8t#wYOcèáª\èìË!_àS)“„½vq«i…ñ‰®a2 & r£ ]ŒnÑ¿hÿ)&£Õ8s !KÙ; Íp‚'ÄÌÁ8nˆ{,¸¿€}%RÁŸ_?äÕ"piý_pw—hL”aÛ–èCxI.HA]eÛEÒ“Õ4XÅãìŠø,Æåºêvt;tarÆOÁ‰†G“Ûìõ1ÙF ‡ÅŸ‰5ðv´Þ¡{áo;@‹¢ðš ÎùKÂ~qmqƽ!·ÚA¡Åíí¾Z‡°|ÕEf´®ðhkÚeÄMôÚøü,'Yì¡ò{©|¥+¸6ÌÊHò~üêb„Éá†"ûyô Árc$%vr°rU÷È…Ì„¡EÈZ>ã–9³£/¡7‡È®å¸uÊ Ø«›‚ß%QãùL¸y‡Xl~ |ù&±ä_ú‹D ¢ËÊ-” B À?þÌW˜A˜7«»°ô°RÌx<Þ~õúÅ?#Mž ©„gÖça/Σ  ióýÒÑ1¶N¾0‡c6ùíI¡I`&< †‹ŽHá>b~rNÄ\•†1Êèìßhñæ˜p…Ú2?bòˆÎYnNÞ1ôÑ•á]só2ñJ˜š°Pµs$L ¾×ƒQ/—N’fÌÔ–ÛŠð1ÕZÚáA«zÏòÜO¬jr—}¶œËý£Ò1™-ªÔ9ÞO(ñ`>Î-¤·9mU¡“ŠO}ïv †À0¿Ù´PÐÑ =ÄhtCcFOKÞ$÷AŒ¶•Ycϰÿ%ž—3=‹jIìa‘ÌïˆvÓð  ‹6=ð¸ø$…G<&ÎOjœ}Š“c%ŽŒ ž‡È‡  ´À” ô~`UJ¨”ÁœÎ¾ºÈ‘÷¬©6Y8*f0,bìý¦L‘}7-*3.‰¥`y–‹.¦çÁ5·X)±ŽPé¢"Àþc9Mü'L$ÇlAÄl‘Ù­ŸHéÞÀ`ÙÖ¼—ޱŒ{ÿr§É݉{œMBPö¿RZ0“Ë'q6 üÓÁî…{¦ÀQ‚(Õ³¼T ,gíü¥›fQ…à¤òÃ$‘ò¬=G5&”¶H‘D¼C¢†Ó¡ÄáCSH"œ’Ä¥îZ®˜ ղр ‚+Á/-òSýi7QŸtê¾ú&å‹F~íÃVÂëlÌL[ÿ,ï4ˆ¸™¿3™ì4C3=éU¡ ב6ƒnÈ `ÓÄ™ÐèŸY 0v#± ÙsšDc¸BvâDöæb‰!Õ' ·!¶Àï3«‚õ_—Nb€ èÿ#íu(‹~´Š=•Úxqšµœ‡æ ì¢8¨©Tƒ<ן}¾¨[Ú—çEÚ`”.»PÑnbŽæpïÎåè _– Šk5~pxùÑŠ’Óº²ª‚0?7ÎLwî“ttø^zÿ>ABêyÊlSu·û"5Ž£¸Qœyoï\H—©„‹Sû»i³¢Ã*Ýû¬Ÿjã¢5Lš,jºjê2>º<0êÜ2(Ò¹8êS'¼Å®-µÏQ øá~—zn|­ÏŸËAµ{”j#Ã_(f«=õ Ed3glh!p|„ /i³·Çž.f¥60ñ&ŽG”*1:R‹êm$í83kÄù·Qä]9>;–:j·<‡¨HQº]¤u:|R jshêÀ þ-Uµ† Hÿ§-(‰iÍêgiAI håîÒ‚Òéö]Ƈdg"»€ÙY îµ <çØ‚Ò¡…ÂЂ‘±¥Ó'9ž4gÃpz÷ˆ‹û1€ÜÛʱ¥ìØÂ‰y Gºr_¦^—•ÔvBR:O8òPç *¤Ü¨'´&€8ŽLkü kçŸX½ šìã œ)+NÚ\àD_ê @û¹¦—Çš---Ÿµ´r5»´51@ÜøÊyHÁ(ËÊdŠ/èr¬IT¥Ô«¦gQÔ©½9‚]±¯1‚z“þZ¡Þ ¦Ñ,ö°þQc'jˆ>Dƒ…P ! øÜ„f…VO"¬ÚA(T2l%›Ñ÷XëäKì§ž·r¼IäÍ4W,†&Íòñ«ÑÇÔ;EÒ÷¸ËiLžh÷ IBËÎf-óÊ?-8çp:¨p/ãŸ)6{à ^Ï¢Ú«ñÁ— ¾Q£¯O¨ÔEcw9µÓ£IAÀ`lxöºŒ‹7e·n«ÛbaÃåî¦ÔŽñÑòX>„F°µãb|55ñUgc€Õ¡À»÷%ŒÆÏ|‰dx€Â{"ÑùðzS—J å*‡ëÜÇV]„D¡$sâ™{8T–|‡VBP6ŸNž ‡à"†“‹'ö_†Wö²Æ<ƒö$y}›*?›þà ."#L_¹Mš3iXK* ÙÕúéfT9D(>@¾ê,òƒrôIÙßåsxÇÈnâO"GË•é_óQxì.ŸþYÑËGbÝþ¿»Íb endstream endobj 585 0 obj << /Length 2945 /Filter /FlateDecode >> stream xÚÍZÝoã6ß¿Âo'/bžHŠ"u÷´[\‹+Š¢·—öe»È)6 °­¬$oº}¸¿ýf8”D)´“í¦À!@Äo‡óñ›¡ù"…?¾(Ò…–’™Y¬¯R×ÚÜ-¨ðî»WÜ[ÁÀU0òíõ«¿~«Ô‚§¬H ¾¸Þ†K]oï“ovå}g›åJJ™ˆ¿-WY¦’Ÿšú®)‡êxGU·£Òw?þŒ…,ygË;:.yb—+nT*e–®¿õë %Ä3)Ç‘OžièÕ‹ÜdŒËŒÈÿíÒÈät\wU´|@ `b¾àœJ œ¸’ÆÍLiNuì–°ŸJšýͺ>Üï-N¾9ÔK³ó4Ü–g’)©úÙ¿¦*õ›á&™ì5ûž‡#Š,g97Ž~Y<äûébß/R¦¸Z<¸¡‡lhÜýâ߯þåY1ÙL(ÎÒLLyg9”ÇÍãe*˜–¼ÄÎ2Í™6Ó·ÀÿÈ®¢`&×/³«öÓ];È×ë~ûùÅe‚qÞ÷÷6‘ª•Pšå¹Z¬¸d@“üÎv§æØ‚6(•t;K…òþD¬©ï›ªì|Û§%vìO®š%]MÍ÷eÛÏ®G‘wÀÆb$n”D{âi›c¹GA;G4—PÎûÙ{¿\ “ØãÆi,Úó@ô¥f…ìOÇiÂÃΡšQŒ¦I–¦_9àí”Ø?/Š~ØÃv/ñÀ™IÖå~o7Tî°ã¡Z[ª‚¹pßö´^Û¶E•uu”Z¿ó#­¹c«_´ÞŽbìÌ=0¤ÝÕ+ cUmW=2öcʆòp[ÝêS;¡Ê˜ÚëÕãkdFg±mOG°'Õ¶²›èýnˆÑ"ÑiAªn÷¶epR°¯oîï÷ÕºDÓ´jýý®«_Sž­AðS™Œ¦‹Ž(RÅ w"Ç[o[Ò•C‰÷ñ™ ø©µÔÚí*ßß§(ËØzߨÖqf×O°4¢-~Šúm³-×¾³lc“©ayšGÿ’¼k¸=5ð™ùkf øp–‹¯pë]Ù?xý:êÊn½³mÔ5 RõEža —áÙ¸^ ¸ÍëìoÝŒg0{*«1Â3॒ Uh¸yõU–+P|­a-°ïJ¥·,îz›Ï·–,ƒ } "œØÈ) qç"$ØOþB»·Á©Lví \ÃÁA–bg”¾Ðc@–tüðsÁ‚‰§=/`y¡§‚4º6Ž 0GÛÓô¦›µ…/ŒâÀ ðyàWZú°«Ö8tGC*ß\Ru_¡tkä™ò{në¨ãq …‡BmˆZ΂ai°«¼àÉ?=½èÔ¬?òäX{vå44mWpá¦Hψåâ)gÆ –ëÇŸø!F \ •.’kg1µIÐ~7ÎèP«\½#~»~0ƒ¾kÁ¹Ñh³aiæ‚c¹=ݶ]ÕF§ÀEÆt1sÿgn€çLð/æ&S8Ñ eut8«ý+ôäØà. (W;_&+S$HMÁÝà.Â3‘–8Õʯ Þ"–²ó!I²ñ¯˜Lù ñLuRàdñäMçLeƒÀú# ŽÅX¼œ’ôÑÊÁ?7ó‚qå8>ÀùJ€qß>30à{Fû"´|l_Â0íKá–âðÙ—ÙÑÀ»!^BÅu¬rÀd üp68MGXàÀþ«ý„æõ*S…GxÐÖ æçóEš‚Qzgg‹£8Tøs÷⨳Œ×´ É,шßN6z8ƒ£ª6zUœ{qKh0ž­,‘!&Yðú*;f·ô]EØÒ qDØß¡)É~·MM%Ç{øvýãQ¡‚ŸiÏx!ÁW¿»³#ÆeÈLýAcb?žFä§¹[¸J¶É> ·v /HtŒf¡ÀÞs.¿F¤€z°P¡eÖæI‘FtÜãÎ^ ñTQ1ÌàöÇñl@¡Ì9@Ë;_²ëÄEꊇîÆ(ûBï¼Ø ™MïçP7¶‡õaIKw³JŽ¿(4ñ¶ÚÛ#àþ"qC ª@D°èHÏÉaÈÑ °aÒ色’nÅHBð4|Êr$fÊô7xÃ`FìÑ6e~ÔUǸÉÕúfÔIbÕƒˆÍÕ+ÿív6\vïG—­eq¤T0>驈È" 8®ZÒç¾lºªß‰è"e¶`†ð è…¹ð^XªämÙî°”'m}jÖ¾Õíß’º ÈÜžöÔÔØ-Hø‘FæžMÐþÐTáér,çÃ^0 {ÓKñ. ›VeòmŸ£ÙÉUpaèëg¢Šú(xˆŽ)ÅBí’'aÔÎA™úóU˜Ûü¿«"ÿSuQòÙM‚€º‰Ý[*ˆ¤çVÜq¿Þ\P*-MÀwp¼-íVÒ^ƒza[¿±ïjìÚn¨‡¾[±ÞȃŒÓ×CÕÙ«T\û¼½r7yjO ³Ÿ©á?ÑâÜ,˜ÿF³^L‹áx!1—&oZZ¹GΘÑÝSyªMj¼ƒö*ÎlÉÒa›@6fÌÖLª ŵ á®CŽ3¸|–Üô~ ¹d6èu ÍŒŸì"qÁÜÖþx«Ð‹Þb®b=B‹ ÄS`˜/ˆÁ@fAWs™|²GgÉ/ËBù¾(¬8…Ù\Pô ¾ÿ͆ŸvÎfмiv͉9ËpÓÍmH`:Æa£™]ˆ;ä\s>Ðê€O޴Ъ&Tƒt#Ö†¨t*µàÄT?N¹¹Ë©r2Or‡ó=@õŸíaÂÉ:ØÒ©<ÒK!¸e9KÛa’5v(`df‚3]BUO‡fkÌ×_Í´»-OûnT„Ž.Їª`ð½fžPý£2œá±Ð•]g÷Ýœ÷\go”;„1åÎxÀX%˰TîE¥«>á0KðSÖuN#XmV¯”1>óh²³L0¡ùÀ6g'#¦/Y©g”Q# ŸóÀ†6ç–ÅäCA€<¾f³`z„•ö¹ÈP÷¤Ò¹ÿ' 3LŒ9Ì3ùK³â ’àˆFt»Ø _£«ã¦ZcÖ ÂCD(5Ô‚‰<4-ånnOÛíð86ÙÉ(—ožÝP£(Õ…úLƒl† oIROÇMI¹0ŒÉëmìÐyfŸž+!íO“³ódƒp&@”ÀÔ®KX(J£ŠòâŒQαÝþVµï)û„Æ…ŒéÊr¢·³¦¡Ër• ŸÈd‘T[úzº >˜ù1¾§µì²Q„/üYyÜ9EF뱄a>J}é£V@{ ã¡Bd‚”F¡»Ó™É+3´r3e7¦Ð…”ó‡£/óñ<ÇŸ; BކQCÄ‹±[‘†‡+l)(&z¨ZKÃ'¡.L Óa÷ˆ@¤ßè1j˸Æï£UØä3%òéAA{‘õÏ^$x&°ÝK¥{ð‚}a4o?ó¾,ÁZé,|µ]Xÿ¼@#âÏ 7õ§3¥`*ú L·óHׇrxØ7ÈÆÕÃ4÷Œ§É5ù¨ºÀåCŠªk©«Ç îHDÛäzæQ³ý„d} õôÒƒ2] PÞRýX‡ù+æ¯4Óþ~-ùxª;{… ˜ Hýè«¢ÐWyè ß’>°_>ÊŽ*þ‚ ähL› 6¨W~²ÿ^üî[¶;èd‘TÉ(&ÂhŠl°hüíac˜ÖÒÉæÔøW=ËlÁt”I”þíeœ†BߺߪÞöû “·ä·Žûk¼ß”‡¸Ù+ŸoŸ¾r…× ÀzÜ!fõ2ˆ|ÍõÀ_ú8n–Ž IsLoIÕÞ¾o¨uä‡Ë’É>KfBz/å¦RôÉñÿ¼u3 endstream endobj 588 0 obj << /Length 3038 /Filter /FlateDecode >> stream xÚ­Yݓ۶÷_¡éKx‹%@ Ó'7“ºÎ8ž6¾ôÅõ¨´8¦H…¤r¾ôŸï~‘e*w{ô `±‹ýøíR­"ø©U­l‡¹ÉVÛóˆ¨ÝÝŠ?½|¦„o Œkóo·Ïþò÷$Y©(Ì£\­nwþV·åê]ðݾ8®»YÇqèooÖÆ$Á?»ö®+‡ª¹ã…ûjØóè囟q`‚Ÿ\QÖUs£w³VYé ÉoÞßþðìûÛI Dë'JŽœˆ®Tf«43¡Š KOrÁ;5÷Yµ £4†‰kpŸášo˜‡8®çK¥ag#Ç¡¶7: öã1™äWy*““tqšã Þ½V%,þ°ŠBcW÷ÄyXÅ¡¶(Y½zûì_r̹ì‘U–Î:à{Ž7køsKgÑ4<Ÿe­mM¹¨44i2òþrj÷ù‰àù0ÍìW9Q…V›ù‰ø,-Xü¡. ÍÁŽr†`›: n÷nñLy¨“ä±רڑ©êA„Tìü'R¦vMqp²ÐòÿQ;MH]% £® ³ÖƆ±ÎWk‡*yÜzLæ èÚªP«/ÒµJt˜ç k ´ìÉÖ“õzŠA_wà]ÓŤ>¿Qa–OþõöÕ›—¯¿ßüøâö»,ížfpýÖ³MܼÚá¿FíwNHòÞ¶©x±mdiÛ޵ª¶áV¦ öÏ…qQL™0&ÿñç×·ä[­ckÂ$5rAJÖ¯@ga§ž!¦Y¼mÑNŒ2ÁîÔlQ´§Ipê…>ì+!¡%!¥tÛªtL»ß;R/-´›vg[&TMï:¡LÚÖmO‘i“÷‚ѱ”³#±Å]±CÁ“üšÑZ?tÆÉ*5&Ì•ý¢  ÁE0ÌÁVi¦ÿ@PÈC•ÎlÕD éþpËXÚ¨¢Ld¢}xÒŠ?4¬K ð™i8Ó“(Lànt¿*èXë \Ý‚„¾«Ïü cE–šà-¤Êö€Oâ>6žÌèxkä­-+¡6þ;×»AHlX0º”Ó²c1“{àÑduÖL»geF:J47?ÆÚ€%òÁe 1ø.ßûõþP;ŒF¯†oz^9vnçºâC-»¡Bÿõ†l¬EϸzîÆÇQ\F#(øÔI‚긲p±ª¾¯øõOþ'‡å8S»^¢OYõÝé8T,SHÆ \2ÜîHFKÛ¾û÷MEWá©ÞŸã‚XžhÊ`àa¢¦´ÔÕ›Ò‘æ7xùÐZ'þ3ÿÁê®b œx3YÉr\ÊæG}Á:üÌX³-ÿË N;‹Ú‹G÷U]ó¨s‡wð¯§8ëj[àƒë^L|‹¶`¶Ìà]Õ…õLÛuà ×Dá-›ÙQù˜}wm瘡w83/71и câ[€PL†xü±ç!×8À¹w:q£_o`.w+\ŒÕá¨Å°§ã„ é—r=vqY2Nõ;¶€ù³šHEYvÜŠRâ/Š6Ê£s# ÃŒ<Þxê:fLð®™Q>"¸Xˆ$äÂ8‘xÊóÅÆLCýìºK¥‰o HŒÆÂBH„•,;ø‘DƒËÑÁuñâú ^Ú ƒ OEa0*ø¯q÷þ+Ÿs€¨†¥cŒ%61‡Maª×à²Sðƒ6k‚¤Ù^œN†ìä _Ý0•ž)ŒüWbš´çVša8‡tEUKû.¹.úý’-I Êç"Œ!¬daCÙyÊ­<¯‹ÆÁd0*$¡ þÈ@y‘þ‡ñuŸµ×ðÆŠíÔ~›ÏZ¸Þƒ•ˆ€e ½(èƒÑ“.ÈØÆ‘ú¼­nãjKɽþ3µ+úÅEçg•Ë[+ykÓŠò †%ú+õe^=~`p@ÕÃ0‚«¼ìgIdž@±6~/•±1¶«§ïúüõa¡kJ;Sj2cƒ ðñú¯ê*_ÜĶ}ÀÀ܆ai8DS=ŒŸû©Ú޽þ²Œ8»äxÙü޾Q,Á6€<Üp!QÚ£kà1Œ\Œ–p cÎÚ¸Èu˜QeéÓÏt6ó=œú¸WCƦ¯)Pc|äiç†S'_\p^4üØØ“¸£f\65ã€e¼D¤N• .4m³Æ^ì°ÁÐÖ ~,¡Ï&±¤gât'6™Å›Ì5Xb¥¶Çµ&¿)®Ú³íá˜; þw²%G?k~ßyýû_o`ªXô*(*úÚ-©§À¤ÎÝwÕà#ýõI]©W;NPã=‚›$ô?®q‡ÄŒ]<$LÉ©¿,u•pêy>>Òò"÷­"¥ÒÄD)€ÂJÁäß½tcú|kÚ™(ö_ ³Šj4NY”Ú-ö„† ™óªgb8•øÉgÇÈ‹8ù,ûÑ zÞ³hÆÞìÿ¥…Û endstream endobj 592 0 obj << /Length 2752 /Filter /FlateDecode >> stream xÚÅZK㸾ϯð-r°VH‰"¥½%A²Ø=ɤ7—ÙACcËmadÉ+ÉÛéüúÔ‹e«çl â›ÅbÕW_Ñ£7 þéM¡6.MãÂä›ýù¢ÖþiÃ…·ß½Ñ2nwÁÈ?<¼ùÝŸ³l£U\¨BoŽáR‡Í»è§ò2Výv—¦i”|»Ý“Eí»§¾<Ÿëö‰;žëñÄ¥ïþò#Lô¶*MÝnuTmw:ÏTYµ}ÿðÛ?=LeIò…’ãÈψ®uç››X§†¥/û§ë¹j·Iñæ'ÑmSĆ …5ìâø:6.‡-izß<ê¾Ú]ÿò¸ïΗ¦ë®}ÒuÙè÷ÛÄE#_zšÙXÄť“{¤y5U9Œ`˜iw÷ yrË=õ¿6Bƒê¸ØÁ´ž{«^ÊvÀÃòà¿lLUÄIý™ìð ˨ih£ã×Ý〱ÆÁ-·§îÚ@ýÀÕ¾ï†Y2Þ£$ÃgV OþùÚ8Èå°2Œ9•}¹¼¸íØwg.ññ]Ø U PÚ¼ sv„¶`î <ÜÜ Ë}E~v…–fä¦çºi¸$ÞÀ•K9²Ì;6Kñý­tk¨# üǨ³X˜Ã~6.¬ì÷@ ©³P ̧—8=÷x7cÅÍ“•ñ¤¾¯};p¥lù+¨D³ŸªžGºŒ¯÷ÀåIEXi»v÷¯ªïx'´=ž(Ý`.ûÝªÊØ]v°‘Ä—ò⮳Ûh–9ÅúÀ¾#^j»Ÿ÷rc™ð{±ãQ–³27AçFäpcóäjåk©OšÅŠâ LÁßú.Icç/ðÝ?¶y Ö%`÷ûÙx4 ]– - ř΂ \ï/Ôç#ì–%Yô[þ@ϱn*tÇa,ÇWãr‚Ä t»ïI|5Ý!zPª%4`‡ÿ²~ Pà=ÒÚÉô’?(š(k]3Wp¶òí4—äzPZ"l8Tûú€ìjå2žO5C…¬‚Àéac¹Aypk7|\/—ô¢c$xÌÊ+`y¶{‹E]RÀF¾Ž5¹™´¤F-Ì 5o48ãûæ°5‚¡Ë¬N3 ØLrÈÔ_¶øHs%¯@S’gqf7.4›OS Ño¢O¤>ƒ·ª>OBNd%C·é’ª±N~gH2 /ëåâ:±ŠOŽ}!þ#õ{Æš"²£ ¹œ7_ N>°N*Ù‡GµU%Ë£ðØrŸ°M¢Ð­…VîQbø¹¸ .>žfÜ6Ü2j›K!0C•àlà:a3|ï±™ôíW™°Ê36b3®räïèå˜ug̽Q¯œ™MÜ$ D6é-"§‘¡/ð˜8Á1”Žaíì<¯ÑÛ}’yG -À†Øõмÿ]8>Td0Ÿä¾‚` þ•}BT6Ö£2tø¯¨É¨ ÊëdzÉŸPÿFPÙø¼mMÖ`¯6ޡĹ –zÌI.¬Ow²Òù¢l‰-ô5¡4ˆ·X·ÐÄÞ2¼ cu–A$FNu†Eî@¸€ÜpY$/)+Ð!ð»Üä5,– ª) R~y…Ð ½eíÏ[~àš¸‰õ@¸†\uôl 1ý0âû‘ß…iW,LºY,sæÎ@¹hÊFåÀÂv—Ý ¹öy"k_‰Æ€[ÖäùŸ³`mr(» [F*hØõ>f¢(|O6Ð,Ö„ÂËÛ9B %ÖDí–—)°ˆ0…™Æ’_:©b…7䆾†oå„Åâ„»)==ˆ½A­ø²ËóP…šs–ÀYî.å@+jç¸Ô’„q€|M²t Ö_ S3 Fj4JÅ·Z$ˆ7 óËö _³ ØWÝrÛÊßFNŸÀ -M4hsÆ¾ë µªæŒg1 sY–·¤‹žGg7¸Ž-HF(^)¤íþ¥R%=-`MàtÕÀ ™oKåSY·ä ó´å±6vÜí‘âÞz&ˆÄ·JEp!%~rœ£ÂäçƒSø ±‡Ã°3Ê»‘¼6¹¨©éêŽwË :ÀOƒœúåE_ŒúJÚ|Šp«êwB¶6Œßÿ·”í+B^@ÚôÌÚ0:‡¬MyÖ†õmŸX[HQZ»J© úÚ‘!†OÓw¯¸6Õ| á2œ€©ð°7ãcÓ×øθáÐ40÷³üÃè§–•¸€¬­¶ö|Å<.-²‰b™È|‡Ž3(ùŸË¦x¥I2œ" ­rššï,Ê/Ä%Oøî#|î»Iô]ê ;a¿ZŠˆFOÏؾ{ÞVRëó¸ÿ[´âç yB> stream xÚ½YyܶÿߟbÆð¨¢(ŠRz M)‚ u7 Û˜jg¸;Âj¤±¤ñÚm?|ßE»²½Ž ÃðÇÇÇwþH©UÿÔ*VVë0O²Õîø(¢Ñözŧ?>RB·ÂÍ„òÛ‹G¿ÿÁ˜•ŠÂ<ÊÕêâjÊêb¿z|w(N½k×­u½Þ$‰ þÖ6×mq<–õ5OÜ–ý[?þò+6’à©+öUY¯UàÖ•™(Rµ~qñ×Gß_ ™8~ äHùÑ›†F™Uš%¡Ò ËÿìŸëLE[—•{ûòt¥T˜ã²Îx]Ä+Új»kާ}Ù¶Wçz·í×°» óLW®/›z‹TUñf{,úÝÁuÛCÓÜÈ&3Ùâ,ÌV¥C؇vùé TçAÝÔ›ÿ¸¶y]£ƒþàjœÈ UvLâaŽÅ~ߺNFaTðJŒ’ “†GwEUqëV6€19ÚpÂàv ëšv§•°ÌŠ…æ¹sµÒ,ÙÛ#0~ƒ½<`U Åžfya¦*»ž‡HXø=­7È©ëJ° ¡×± @‹á5÷$Lðg\Jk8í‚°eÝõÀ¬¦"ÚØD£„T§ITl°¨Ø*ûÎUW(ŠÕÁO2Ø7x@×ùe­“…E{}>‚jQ鄉Ímð<2Ñèq£3èX‡i<8ÜîPH|=~,äùŒÜ†yž{jÖS†zZr4…&I=ñ“¥í7I…ÊÎܱ¬û¥­ã(Ì2ë¹ÑéÎGÄ/‡èT© uºJµ mj1<Ÿ½ˆV{˜«„‰]Ýáq¥ÃØjhU«<ú»ÄðlC•šPç–X?üÈæGNCkOñ®³f£š_ß?glâ0ÿúM¦°Ýì •«¯!‘.åéKY¡Ó jêkGåFY‹Ü&%(FfJ„Dmš£$?µ Ò¼*÷˜´iOì2â+Êçuéê¬ð5e1‘ VˆT6Á r8ŸæÔ6ØReYРŠteù˜¾6&WrJ“ÌKtwEë¸E% ~÷p؆+™Zž–cš,` vŸ PMTÝW¸9÷§sϧñ2ÍLÆpÅ1D˜ÿB7g.[Ç15hØâ3 •Âf;ܸÇ]žÐxÛ=-ehÆ7!É¢ -htC‰±¿Ó±;q\mç€î²èÊÝöPÏöy³E¢b¸·{˜Ý\0Ô1qâ¦G=FPlMéfàLcâÎÐêÊ뺨¸]7Fš ¸5M0ÌŽƒØ„áUÓzÎ"“=HQS”$ f'«¦©•cD6Ø»«â\¡`†ˆIƒ¢:;îÒi€FPØ@Àæàž±" Ü;:LÞJF|Üõ‡êé‘`´ðFΞSŠW}[t‡¯—‚7ϱé}â ^õ® =þ©ñÏøÿõïo¾üóÿô‡ÿýî¿ã¾X ]¬Êzp2vXÞ¡¬úûòÜôîá¾Êœÿ‚u:ïÄ×r7³¨€9cÜ"èxvb7\·+jYUœ;aP¥¿KP 2p¿8åàiØ™xvËzW÷\žï¿ƒŒ‡Þ¦¥r’å)ž/y<áuŸ1 ‘öѹÄbñ$Y•‰pänÙT •O 8ZðÄ5§ôÈâÍG g&ц]‰¶{•J}bõ[2žÖ—@!¸s­p-…!D uA`˜ØÆcml’£:Çõú^ꀱ=*ùÈwC04Ô J‹Ô™\‰r7–þÛ;ÐňýØI6"Ë}{ ›® «’+gŸÎW2ñ¾©3kB† ZU‰û¯EjÂL¥ó7"DeçëháÓ«÷¾€L$}Àã‡_?t’âë¨qƒj”GŒ{0ïå*bƧåÌe8Û¤“§ZÒð¤àá§l±‹Àε›ïCÞ"w3^®îMbmÓ s'0 %MèQPqa—ê°Œû$hvñ´'ØœolB/ ÄóÀï+Øn]nkn²| 8dŒÓUÉ`ñ·C×ymýL¦2ÜðüII©òy‡;T T°çž'9É Tv”²w»3Ý=i?®0Á耹~÷û¡ ì x;¬QУdøÛ¹~9jñ:/äÂÑW¡Ÿ¯þ½)‰Š’ãàüåÉB(§37œø;äv–nIÜ ®€ñ°Ñ/¿þüób”ÆStô„¹ŽÉS˜oq›@Ê>VIhã;`j£L¨Rõ¹ªö*5"*ëŸu*¯#0r·rყŒÀ’x‚†à{÷ÜâÉpCÿtçË!ò'{rä8ëÑÁw#P^@Rìú;ˆ416€60LŒ\ p@ž5ËÖñ„ß"óú ;*A0¤Å/eÍma0.¸^¼SÇ© mbßç>ìžxï6X ‰Á’®Ï¯GÀ´'5g];,j¹0ã`ò·<>³$†FžçºâJÄw-YTT]#¼N’× aâUà J†µoft¥Ï[¯ÊÊÕÅÑ}„ÿg‰÷ÿŒÁpäžÿg‰Èôp]ȦH&ð>CnwçµáÐt=æŠOú€§nY/Ï®}³-{w|Ø+Ï…¸U<:‘ôŇcü’P1ÂÏGXü¨ÍÿòöÂ¥è¹5û”»EÂÛUI‚L¤¼"¨©÷%.¥oʹ¾Ö†¾S¾I#I<Ð86Ô‚Ù;Ÿ”qr& €ÔµçUR6JÓiñAÎÝÍ@ìü—–ÿeˆÄ$ endstream endobj 600 0 obj << /Length 2470 /Filter /FlateDecode >> stream xÚÅYKs㸾ûW¨r¹jÄ€Ÿ¹mRÉÖæJvÝÃÌ”‹Å EjIj<ίO¿@2×ãM¬ÌuÑ&LšG9ìa£ãÈ伕w?^0¾¯í]ã>`7ÐyŠŽÊ4Õ¨s8P¥0Lñˆº…Ý¥:]÷Íí¶;‡+ÜÚãѵÕívo{»E8ñT3ói´+"æÉ~Ú;0PjÔÚògc4Ëñú<»ti`Þö¬X·XÝ£úp*ƽô€mq¡Ûq©8XߊŠ~»`¬³ÜÃñÈHj«%8[=pïߟ;n¢%QP·€×ÑU2"8!uwŸG@RnR Ê&â€Zµ³Š2‡£Ý"Vò·’[AÑ{•ª08Þ@9†uÒ¼\ÿàÆ‘/Tø,Ø7N_ºÐÔâáNM3Í_,Î?(°zžF™)<~ÞÃÕUKèÌ%iâ»Ñyæc/hoñT£ìÐÒŽa˼ûéŽoH7PÌ#U깊¸oš„vþZãÕJá.œÆoÍÖ6Í#^T”ÊÀ ¤»µ-dA‘²JÚ{W± n§¥¼ß`åÍ «nk¼[yFÁSøíNí›Ðð:a@Á÷Øw¸Þ§ºrÒ@xцô{ÀótÃÈ’Ž‡<=`¡¾ƒR#ÃP¥]_…=Ц‘K°Š·Ølþ`·$è°­"军´íLŸ×‡.Ï×+ÂPÉâ£ýŒ(ªÀ±ù4Vˆ¼—Y7r²u#ÖøÝˤgz‡îwnžƒ®YŒg–Ÿë×½ÛŽ]ÿÈUZFSž`6ð|ÿ„Üʃ$ã‚‚ +ŒÕnwÑŽ)ê àe$À.°’†ÛŸ¯šbã·T»EK*ʳ)Yƾ™A 06™[†±R þ8÷¹Fé0tü-+õôªy6ëAꊚ­È;¼’¿î)Å -¥ÊQwoOî›îÎ6üJƒ(çz×n%tÁ주¶Êõ§ÚJ@ó ¯ÿÜÀ*gúèÓ®ª/i?6:*ÕeŠ éI’˜ •x ŽšEFgORb}w„!#½$ãX,…±L‡O.&<-,„”ÐÃcc…€I ðåÁ²×–½¿T;_ âè¡àœî cl ‘°œˆ~‚Žüù,Üà-_ŸÚÞo\öØ+hÃÒŸ‡Žb§ŠV FP>Y­‚XU& ­”:ZØö¾kýß'<ëôô†³§Èügè _-…VßÃV\ÈÏÕ‰uî†_ñªUùŒ™c:˜hp®“Þ|:#çW.ƒ5iHÝz»8ðS’€ ß C;yfw ¨MFm,¨?HÅžÝlüµ\ß®fg2Ó±àÞW/ò|ßÀY²ð„µà„Õƒ³”·Ï<”±üŸ5ÿ§õéïÄÙü í2€NdÔò¬uÊ28éaÝ\à:‰^O/ ¥Èù¸Å̽¤‘*'‚´Íƒ}\ÄI¢$›ru¬Ä’ËÀÒ,óÍë‘ÜŽ£;Á»£ŸÍ”¤ÀqØCÒßI¤¿5KHI4ûoÍ@R endstream endobj 605 0 obj << /Length 2478 /Filter /FlateDecode >> stream xÚ­YÝoã¸ß¿Âo••*RÔWûÔz‡íCQ\Ó¾ì-Ŧc!²ä“乿¾óE‰r”lîøAäp8g~œ¡Õ&†ŸÚ”ñ&O’¨4Åfwúµ¿ßpãçŸ>)á 1ô8ÿ~óéÏ?¦éFÅQ—jssðEÝì7_ƒŽÕy´ý6L’$ÐنƤÁ¿ûN§º½ç§zË]øX†ÍÂÉEó¬,®U¤•~mqšÛ½ÀæûµTZD:ŸTGï¸"ï¸ÂCCBÅð®Ý '·ŠhƒJåQ¢Í&Ô:JÄÄ×ÿm ˜Þ×Õ]c¿Íú«¨LS*„I‘E)¸£Ó¡…µSþÞ­hŒGß³ÿ†Zæ s/¨{²U;psÔA×A]\:¨ƒ–uîÔÁúÍ37ç 5F2q#2EWpÜDØÊ®¹ìÁ¥^A¸ ’,}#1â36žo;˜€b. ØAÎƒÒØ›Ò¥ãâ¼þÁ>n)Qá }G^“±áÖu8\¼ƒ“öOõ`¹;ö¶±wäôÛ¼l.Ë¡’¯›Ãp€ÊâTð Yj‚ƈÒy™4}FeQ<»«xHf,›)Ø‚½¦*_îYL'ÖðõqŠ<¤%WÑŒSÈÁ8…­ §°ã®Â)$8œ"©- y3Q&)óɾÌb=|*Ò‚ñÉäÊ»ø‰xOH#|†|Ÿpå­@ÌŸfa>>Ñ$8ÃŽ›¯ƒ"A¬ •ä<„¾8ßXfK¼ÒÊDi’~$^Mq;Îm÷ÜÛ %[ÂÚFÅ û4¾ãÄêÇ7æÓ` ÃPß·x 4Ê÷Ä Ãƒ.¹É<ÃÏ;‘#ßǼ=¾i{¼kòÉøJƒÛ¥`å‘"[€Ì©3ºŒuü­ø3¹°3Càe&ó@GŸjôTž5²öN……µ}¯‡ˆÒzÙíí¡‚–©3Ús¨z Z¾|{ë®ÿiX“`ßz×PÛÛñÒ·ƒ+7¸Ðð@³9c‚/RŸÌɹ9s3aðºJ7£ï•¶À¶ÐÖs0Ž¢$Í£\}h ]?ú„»Å{ã=ÿ2ÎûÁï¼&°ûa‹Ý[³ûÑM„D~GÀÁø3÷½Ì¨ìdØâ»%ƒÚN²p5õ ¤Nôš·µz±bmót¬ùp1û…$&Ô–RõX"ËîÒÛ½=u[ÚäÄYé×q€¹È… b™âéƒUÕ’Îâì)°Ãf¢ü‰4XÝBsC>á]Ž @íÞN£§œ š’s™Ä·,ÐŲЃ¯eVß|4w.-˜ÒÞ(œ¾Ýs"b°\àÙ"F¿ùþ'µ–/ëŠ& T»Þúnºw–]/ WIMâ$|v/w´Yˆ2\&»W†ëEÚ~>@ìz‰•¤á¤)$ ÓHo“ãóÙ¾+ÿƒx£sŽ#üVüqoIôÈÃ$Hìw}}GÇE3Èû°A®{žJ< a‘¿vÌýèÄW¶—¾·œˆPÁˆj°a±¿®¹ï`-ᢄíÎn©ä5‰uç¥ç!îéàLiû¶j0¸é©aÍ=À€e1dÈŠª\=Ø&¹ŠâÂl4ç™É¿óhë¸C}åáöZ¨ßnÞ1Ð#ÍÖøúÃÂðIð#:Ö¥¥º9ćVºp¡ÐŽt±,ü)j¿¡ãC5~®î)ó ͯw©Š"Òe¾ÑºŒLù½]:îÐc_{ž¾ê̬X‹¾(%¦p1a·aŸCФíò>‰P …ƒ”)†Ùø¦5rƒ˜| —Qß!)xM±¨H¡{ÇȺ00…ëº|‰€Dœ3x]xÏ´ºXÙ˜^ÀôÕÓº.OØp&CÇdÐ :ŸcôÞrϽ¥·q ®µH’?È<8sJ°æš ?T;¬†õ`J¢¼ÈW‚é­Ê TƒæêQ"æúë¡aÝ>vX{<ØçWP1/Ë¥] ºE'_)“±‡HÁ…¿1‰žçKH}Né:ƒýõbÛu<Õ8ÍÒ_"Ý]%{èZáE_È}Wq‰^¡”[Hi.WγL"­Ó?ŽiT–¥÷~™¶sàáúüÕò*Ô1w„EàáÈ2µ*AAsýxF÷E#ùêy’0ƒåŸ_dÍ+µúU•öZ}¤“ÖínT?~¯ÒlE!é1¶ØX®:C ¸¿Üóu÷—÷ÿ.@Þ}ÇH$Â(YÅÆ²ü2…Ÿ‹ ¹²¢EÌVq÷Ar"Åo ×ÿâÕ.ÿÃÿ¡Í‰wGþr­„8žiyÁMèÏ3Î"±3ñu0&ò×#‹lÏ/±Ð£‡-˜@… ·ÚéÛË*ì\Ý…ÿÂz«U:pŠÎutsyéÕ¿Êô2fäŽý?Š:ƒ endstream endobj 611 0 obj << /Length 486 /Filter /FlateDecode >> stream xÚSMoÜ ½ï¯ðKküÑ[¥i{¨ªÄ=U=P›]#Ùf…Ù~üû²Ú¤9T>ðfxšyóóŒÁdz–eµ´•MÖÏ;¶eý1Cðp¿ã‰W±¸b¾ëv7ï•Ê8£-kyÖ®KuCöÜŽúŒÏ !)ßä…”Š|ñîèõ<Û刿lÝþ$F“]rNL^ðF±’T2ÿÞ}ÚÝuAª,ÿSydþ#½®2.(íIzÕHÊ…Dé%­¨Ì U•ä-hªyoÝ|šL°nÁøî·Ž‰(ð¥%à¯i%–ý`ö 6cƒl¸ü£ÃlØc˜ŠI¢ûÞ¬©SpéS˜#8Øî–  O?Î_™0ö endstream endobj 614 0 obj << /Length 919 /Filter /FlateDecode >> stream xÚ­WmoÛ6þž_¡¡_ì–E[öìu¶Iê¡ËŠD0lƒÁˆTÄ"5Šª›íÏïh’Ž$¿ÀÞ ÃMîž{x÷茂>(˜GÁ·ãq8gAZ\Dë]õØÅýírv04,ß%ÛÉ$@Q8æ(H²¦«„¿õÞç¸ÔTõãñ¸7ú®?ˆãIï³’Ï ÏöÆŠéÜ®nïÍ"îÝSL8}Ô£ýšM¢Qo:éÿ‘üxqlMF£#‘Ë-ècÌÂùtäÍÂY0Å!Çüð²Nzã´À"LíÏÁÀ^¯ìE3ñbW¸,9K±fRØUÎÒÜ. -¤¨´ÂšVv'—+ç@Úk]Q·YçÔ$ €3ü@q<µ¨Ö3G‘{ˆ³'…ÕKlE“¨—ä¬ÚƒŠ 8œjö…rœs¹ª60Tµ¹¸Èö8 VÖ2y¥ÇÇÄ¥S¦œ¹$´ íúr¸v<ði ràdÖîß°ŒÐÌÚ}¼úåzùþç»›Åíòc ‹³uY2‘òš8ß§Rdì9ÌØ…þ „eþN;pËKõR õK ˜;ŽöÀ|øõay³øtÝŠ!51 mGamÝÙöSi¬~Ö™¡=XïɇSÖ‚UšÏénœY*4ß礓’&LgJ•Gšr™âÝš|“fÐO®„2ì'÷‹;¨CØ@'±V o{‰ã¾Ù½È|ÓŠÕj—âí+Z{P'<Ø™PCŸïN*x RõôËH³bë w7±rÚ8ô‹}ͼû)O-ALwÇ¢_A@˜¦9v:wùµ02ê^Ÿ¯î¯~z05d¾û›.µ) ó}»+U,IîÐ\xY•Žü¬©ÑñÊ‹,ÖNwS]Cp§æDnD¸£Øðlx¨´àÕàÒ’Å’ »’i¤¼•Ñ^g_]Í™¢†œ³¹3 úŸœíðU®ÈÙpÊ©>_š9ååÙœ¥ä\ŒýU³“Ùov£o7ŽÖÐ Šn`0hÌ|ó0‘IU4Æ"Ýt €ƒÆ!›fóU©$ hf‚ÝÑU)vÎjA`šÒàæÐä,˜:6Bkó°ëÖÏÌÃÅ8¯™ŽxÛVøÇŠ*(ÇO¼!-meÙ$í%æ L(¾diiL—á¥ùÑ ã\µ§\xóöΖ\ý)Ÿ†odMd7ê™Ö…l_CÃAwϰ‘æúme™ÿÿwcnã endstream endobj 618 0 obj << /Length 1061 /Filter /FlateDecode >> stream xÚ¥W[sÚ8~ϯðòR`cbƒa¡Lf'Í¥ÓB[–n²Vµh"[^Y¡ü÷•¬‹m"·tvxà[:ßw®’}Çã?ß™xÎoƒAoŒ0>ñЧtãHañöÄWë\¾Ð­¬|³<9»ßëM¼‰ï,×USËȹk_nAÊ í¸ƒÁ ÝÝqƒ`Øþ@Ɇ‚8FÉF¾Ø!¶•ÒÛù'!íFIÇoÃŽë‡^¿=uî—œ\/ ¡a¿$s±òõïŒ{“Ñ(Ì}Ü;£qÐó$ÿÜáû†íË÷··ó«©@çÖÜ>w·ï+ÿä;¹0$q ’(»»—ú¹üûVlœô?p\«`¤6“ï[aÔ:5Va¤”^²RaDþGˆÂº—êÕ»EKJϧšŸ "‚2X…‘O4ÔU¡IåæÝìÚn´ns qZµ(tce)Š$Û¢LIð‰Å÷÷&Ãî’ìc©­ •Â?bÉ«£,c”±ªq¡kã3.+ËCÅ™áO…gM渋%¯Ž xº« Wµå%L[¥1Ì)…úéŽÐ‡¢Ýj5t”?ÿæ¨0¡kÜ\–bžó7=ë*þ„îTÝÁÊÃJ’¬§`Î,NUXdŒ¢t·Ez6YHNmI¨Íåî%ÑJMçÛ±ù±Ôi*ËQ§¨œn©<×T<žyàªÚYS¢ºÐÍãwo‚ÿ" ²@¶žAšãç­ÆácÆý )9=d¸Áä ÀRŽ!H²ƒ"Ì3¨ õŽˆ$ðE‡W]æ'táõw]1í%ÌY¨8k3å)/kî2‘<{#6œ»•ÍÔJ†ÖÎï§`Lœ3Á:Ô…^0(Ô_åŸßX˜|o˜î+}©r”5î å´‚FË•Ö~´9$âo1T1l’Ä‹3Ôƒ« UWÔìÿ‰5¿Îé¹ÞͬqÏ ã¸Òì³ËÕ…Q­Vc£ê©eNuÙÔÄÀè+äGNq׬ J˜BÕÝõéÙArj¦z*®MôEíÛFÈŒTJÏô’Ið †93Ï!ÕdyÂnìTqwœš›†ðLJÓÃæ>Wó¦f©oR:<2×e ÏKGëm‰ËÁ-H^«„6æ­ËM¿VFríŽóP鈡= “GÅ[SÀ(@Ø<.Ž,!<œÞ& ‚X¯öùwƒøÆ¨Æƒ‰ª\d Ha}‚dÏç©I;\ëk ˆ-}ÇÒ×ÏÇpù) ®‘úé?î:‡# endstream endobj 622 0 obj << /Length 770 /Filter /FlateDecode >> stream xÚ­V[OÛ0~ï¯Hƒ´%!n.´ MbÜ´©í&Tž!+qkMR9®šößgÇNssXA¨qãs¾ó{€f±Ð&–vbÛæÄk~ܳò·d©‰ÃíMH9ƒ ɯ‹ÞñµëjÀ2'Öh‹° µ´{ý"‚kŠHß°m[ö ÇqõŸ$]Ç8YŠ‹gL#qº™ßñƒ£ß"¬pÒ:ê`ìZ#Ý;é?.¾÷®[Bîh´#s.Ù¢nmlN<ÏáÌL๚7vL`;‚>L‚>ÓuuôùŠÄLMqsFš˜ 7ÀáxB3ŸÅ#£¯Ÿ#\ qVJy£jB*ý-o\É_Þ„uºú¤:1LK$k«Îåx ô¯ª9„âá§q¼M2§YÏl#H8¡»ÇÎ ‘`…ÿ*å®ü´dÙC‚[eö.~ÌfçóKiN:¥”¬°zNI ,¾"`ß²t‹€Ñ)BÆ1Ô!“«µ¥¤ÄúbÕ(–{ü(^H;¼w²5ôÛ‚<°¯5Ï:«‹ó¯Q,s8l¼ZS»pÞûHÒ]á‚×ÂÒBb8|¬ùyøÀ†œuØm¤–f©â$xª]p <†íAÚ\÷¤êÛÆY1QÖ„5A-£"äH¼Øÿ”ŠÓ<•#wãGŠ‚ SYþ×,3˜˜<ÉþQYÎ#’ º!IIÀïŽEƒÝ ÙÕ,71*zœ¦5â’[I˜¼¼:¤¥ùáEøÞÎi — ¸Z5&K¸I|ŠÓäµÒLB¾ óq+‚e|á([ÏZEú–ýÑ`> stream xÚµWmoÛ6þž_!ôCâÈ“¬WÇšÑY–šlHTl@[ŒLÙÄ$Ê èyÙ°ýö‘")‘²lÄ+Ö E‘wÏ=wÏ‘ö-ýùVâYWaè&ÑÌÊÊ3¯™%+K ïÎ|¹Îa må÷éÙä][¾ç&^â[i®›J—Ö§ÑÍl($—N†£àÛK'ŠâÑϤZP–¯Ä‡¢k1º{øÈÑè‚eð¥?‚—Ž?‹½`4]~I<»M[@q¼9_¹=ô­™›L§Gî37ð#kzºÓ«HÀÏ+=âÑg/ö¾o.žYU–/ëOè‹‹A å4ÙŸ#¶7òcËa4ES_Fyg·¦$+7Ý;·òͰñƤ@¡`^"Ó tKpgù\³Ç÷Í›Œ^w$–°<¶òÿ7?Ýß_?ü &mnàá㇚¡7_^Ðu¯øb³Î¨œxŒÛP Ø7%^ñðçCé`¬!ÒÅw†‹óó# Rîh0H Úq̈tïöxluñÙ#ïb>$3­z@¢¯P¨ýuÿ˜ÔlC==2'B.!sí%1û*‚”JSÓý-N1m¿çÎ[n•fåÁ!goªrS@Š*FÃ,L’>ޝ‚ñ?¤çASµìÝ‹Ī‹8«pM÷Ú€ì¬u*1ãÖÛ9+kf‘iŒ½ÖþOC•¢èõõæÌßO]ž /âe]íÌ4K˜Puú_ä®ÀÔ\I…hoë~ÿ—¹U¡KÆÅ ?~¥¼Uû¢k¤fê^L9"б]E–ŠŸÞ*¬äN¥Sùæé.÷Ó¦ü㊾âlú½BË!í!Œ(ú.ˆA<Ï8ßtò¤r|]*]¬r–ˆYßR7÷>ýÐn ùgâ"¼Ù² QÇ‚;Ø@d‡+Zì ΖÑß¼c»ï~sjAª!j¨TTdd¿i™w5=P Kv1^jr[ä[œuº{Û1`Êò¿5òkáqXDféi<°‹im&+½ý5Uª{J¯ÓÞ•ìVÝŸ«-kojš[=$8~“QÞ•ÆR“Öçmžïg‚C÷e×iíPŸàè[Í$çSªåd@BßÖ°‡‡±‡ÈQ6{aˆ]5# ¬ï¶º¥|Ö•’B8fCzCwã0 ¼˜K@³5dwʶT×â¿ú½’Ö&ÄíÅýå´ëôà}úô³ŠÂ?´SJû=ÑŸd?(Tßã¿4ÿÕ@ endstream endobj 630 0 obj << /Length 1035 /Filter /FlateDecode >> stream xÚµW]s£6}ϯ oØÂà˜fò°ÝñfÒɦ„m;“f<d[S!/›vúß+„>L<Îl›<@ÄÕý:ç)À Ø/p’À¹œÍü$Z8yut«dãô/7g@ØyÌÐÓ,HÏ.>Ʊ? à¤kÝUZ8Oî‡m¶£L¼Ùlæ†ßO¼(ŠÝŸI½!YU!¼é?´ˆnû·›ûÏü%r`V”O€ 'XÄAèΓÉsúãÙ2ŠÃðÄ̹åAê3à,üd>xæ,ü…3_D>˜E}òóxNâG rØk ˜P¿…cTÒ:˜.Zï^­†ŽqϪZ#¶øjDS7"͇F.„©Ö—ÃVq‡â¦ª¦(·\ñ¢Vðë¹_¹ÕRâƒýFY³¤ÃÖ–;[m†šEY‰þ’¢R·’¥©òŽór_°‘|MÊšìKw&™xB¼áÇ“vºü-µf®×(Gç/ç’ž…•ۡﮣcmü’”ýQB³èàšöÉ€C{• oCá‚QÌK9F×’wdX’ÂwŠVÒgqåA“@ut0Çö!ÒnQ.ÐÚ±ñe/…L‚¬F*ºÚN±U4‹Sj¢£¸6¼5Oª•Ï>·…œŒÇ»w£3eeçÕÎLNjžÒ †Q—Ë g?‡ŠýŽÅ’øN f~Ÿ “·â,5× ØFǯ8o=+~•: ›]‚u“×±o8Z§ßöÃn¼Óc\ôÇÅŒ…’˜}íV¥"Èe{‹Âà2v?2Î~ÊDùCÙÇ\FÿA¼ÿ½ú¥H†y¤D k-'¿i̕楡°2p#'Dc©ú w·©`Þ/·Ë_-‰X²lïßZ¾zÉ‘rpÂÍ@?€5YÌÇÂèùè©z‡û²ÂoÒ0¨yçsU˜·ëŒlŽŽ¿p³¬VåÓš'æS ÿÇí_jõ¢ë endstream endobj 635 0 obj << /Length 790 /Filter /FlateDecode >> stream xÚµV[oÚ0}çWdT´¡jR›$¨¦IëÖjÓnjÙÓ:e^bÀ*qmZuÓþûìØ$š®xHb¾s¾« - ÐëÄóÜ¡?°¢¤²U6µôËåE œ#NùzÜ:> w†ÐOŠ¦Æ±õÍ>›¡…À¬ëxžg÷F]Ç÷û K§ % ¡S½qGÄL¿]|úª^|û£xNhÚ¸ëÀAzö è~¿o½¯½^Cå ¹!݃ÖÀöû¾RáÀXýïBÏ×â+>kèúзé¤ß×ëdÒ•ûàbSù„+h` Pcå¶¿Ôvû4ƒ:Û“±“Ú2,§ F¨(Xç÷Ü^Îã ¡8^3†áÇ«7Ÿ¯Â°DSÑ~|¨ÿ¤ »22ÆVŠ9=0ê§,½1e0G|†M¦‰·@bFQ’/×Åîéõ…9ßYVuE±‡çoé¤'+RûE4– Û’ŒÿÓ °¾àºV |¶~iƈN1K—¼Ðš¦Ýtà!lkk»²ÿ&éi­¬FBYj2!š…+Ø.¡ IeH÷32N}p˜“ÃÙ9©¶U ÌXÊJ<›©‡OÈ}›Õ¦n_I_ $2•8É%ýèðƒÑµ> stream xÚÍV[o›0~ϯ`HÑHSæ’B£=lÓiUeOmÕ1p‚%À‘qÔMëþûlìpI ¡Ù¦HÁç;7€b²P|S¹±mÃw<%Lf!%E,–óz:SÔkšVƒÉg×U€iø¦”Õºnj)÷ÚÇ8ØRHFºmÛšu;ÒÇÕoH¦(ÛˆgDc±šß}å G[ JP6éÀsMK»£ÇÕ—Á§U ȵ¬žÈ¹æt(žáO§G€gxÊÔs `;<Ê(¿‘YЙ‹ÎTHCœ>E0”s-W{0]3Œ"Þ®²aÐ8ÄÉ_…Ð7à47(ÆOQm Á»¼²ªŠkTnoÖf@º#YuTšzý¡ý{oÂbñb|ÂÉ•8¾ ÜÛb‰wrÃd+Vk,Ý{¿œ_K-r°$‰ÜY‹'%CŒ±4È"éZ—¦¤ /€ƼšfXB٘Ì’ä‰ð±q¤=f  ZåÎ?”™]¸°çµÆ©ÜÞr–a$^Þ‰‡9kÄE)iåXÑá­÷èÑÈ‚J1Ko8p·§Gû¸ð ßpNÄëËK%Î) Ó‡LéºK@€Þ£æ¢V`gpœÕ°©Ãü•(-þ†¹ÁŸ™Ú£Eá°³ d|Æã–"õ*Òy·°üÖ-é[=š nå%鈌;ÜVci@ÃX,¿ ó·¬lSÖ8ÏÑw” Š Ô ¼m0(‹á?IÊ–ö„dÃËÑý•É.Íòfo0»“»Y„ÿ´Wjº­éÒQÎ'ã&8?è×nß|êª õD9þeŸÉêI}žƒóEujú™—O?ö™Â¦¯[ø`|EˆÀbò³œ[§S­{…QïùóŠfÆ a£)w_\Ön !øØö¬j=àUÙdUmŸk ©Ujð¾?9¤Î endstream endobj 643 0 obj << /Length 807 /Filter /FlateDecode >> stream xÚ¥VmOÛ0þÞ_ÐRDBœ—Ò‚ö±‚„CU§}„²ÄM¬¥qg;T¼ì¿Ï‰/om€BÂÎù|~îñsç"Í’HYÚã˜#w¨óžUXY¤©É䬇ÀÏŽFÃóÛ´·êy²Ì‘5BÚtÖ 5 µký$ö³¾á8Žnö ×õô+F#æÏç$ÔÂ’ˆXÍÎ.æWŸ`?LHÚG:îhèY¶~`÷o§ç½ñ´äÙö†ÈsÏ5èÒ†æh0psäÈš6rµÁÐ5‘ã*ø ‹Œ¥}¹ÝÓo,ϲä?t”Ãd˜®t7dòî@yÿ+$G¶$DX÷wÕö+FR¡¦4ƒ‰ˆ±šc¸\^Rö§ &ÿ àìÁTß»ûå!ÅÁH’‡nš•5 ó»Å2¬á±Ï ‰RÊpžNW¼§ÂØÌêØ5²l÷v"ò£Vú°«Õ¯jˆ°š€dØÎÉ#¦3°° ³¡Tó¾šù¬ŽVž‡YUvy"Þ†.ò{jÝ3FY_T7#™=T³~#“nïU̼·)¨·„d즚ÖÐ4•S‰E}þ)|ÖÇ„>-Eq ¼- 1€T3"J¿ŠS—˜ªGHÕ#™¦~žqðæ&ß\ŽÕ,¥©!Å#fô]U‚ê2©Ñ¬Ô‰Ï¢µ"yCA!MqKõoSýZoA]œ£6ç§YB!Ú2&A „â$FhV’ì‹Sà§_J Ñú*^eóž’°Ë.(½ ý4’·‘ñNN?I0Û¼÷(ûlUû\„˜Éþ‘»»¶é í@Û; tJ!©\³²°ç¸-ÎpÁÈïLàR€¿àDjöÇÉÌ,««K[Uªp³2†ï¸ÙIC%¹Îs‘  âxrÖ.w_ ÷~B ÕJgóªKTYŸ_\Œ'ÐpÂqYzDVÔ ’¯¡ÄÔì\wÆ9æÜ €ŸÂ¹M‰¯W§Ñû…-’¹kçÑ©*ÈæsÜ|T¶ä~õõü¬Æ­VÈ÷¼-/J¸0Ôz=nåɰìN ‡f«‹¯*«Ú‡šK׃³m(ÿ‰ö–Iœ endstream endobj 648 0 obj << /Length 2819 /Filter /FlateDecode >> stream xÚYY“Û¸~÷¯Pù%TÕˆ&xˆäæi¼>jRÞ‰k­$µçCBbŠTrÇóïÓHJ¢“­©Fh4úø£Vü©U¬Ò(òó8[•§WQ»ÃŠ¿~|¥„oŒ›çÛÝ«7’d¥?rµÚíW‰R>6×®ZýÓK£õ¿vyõ~7®”„áÜ9oöL·+•ú¡JbܤÚf±¯¢˜·»?Ÿ×›Hyº©Ìwh¥‰w¿Þ$ÛÈûøø7îXç±×iͽw-ñ—ÃI7khôEoÚ†Ç>™R7Vã®ÏªâÄ¢Õ&Œý¤¤½ÿ¾Î"Ow–çG‘§üèŽ[~bï±]‡™÷;þèþ>­7Øî˜+ ‚ 7[m”Úú!,¯?ßæ¼üÏí§¼tæpÄFO¬Iì‡i¸ ü(¾’åÝÆsy7‰;cû¨dùd~'pÄ"w£têŽÏÍp¢¦w3ñiüÃ:s*†Þ—vߣÀÏøStš¹? ¶Ú¡©Há²ÄCSú×ö¢Tæg«møIþ‹aÞÍŒ™ít{q‹é˜Ç¾?ÿôæÍÞîý¶;¼¹! b? þ¨ŽûVŒdA `‘€b¼gÓè^ðÓ6¢?cY9g1–“é{]1­où[¢q¤Þ ÷ŠF†+cûÎ< ½(ýwdÒÝèü4N4Ú’)ƒ«ÈW‰Óîe‹# {µø/Ý’8ì8hŽr…°s—H=ÍÁ42½|e½¦BQ×íh!ºòÙ ÂÐϲDœ@ÂIà¯7Ûmà}þõýý/o?½'N`ØŽŒbÞ»#È™wÖÊëXw­"ž-R9Rœ¯ÙQ»Ø?ßHqÜ+xðTй‡¢†“ÇáÖëõ÷žU“zí7h;Ùµ?êŽ×ØM‰v_Ô<„7¶pƒÕû¡F%)Vxêž²ÿƒQås£Ê”Ÿ¨Ìyï}pÁÇCà •ã2 oÐéjϺ[VbŠVªÚÓO mì¬.ð ГòìÐÉDÍö‹Ä´þ‚bŠnyˆÍz" Çwܳ $ü®rÑKI{Æ [zF–=¶ô£Í…­Ã!‹ŒSïÙôG&áEà—(p82UèŸØ–+³ac…e:høÚxóÓIw¥ƒ}a6·dÓ6›¥¼˜ì7Ï]¶ú:ÃTÜ*WÎÕ²`2Gìœ;muÇÚ’ñ=í›æ¢U C$"¶8]%“‡§ÚX>ñ´g¼š‚¹ 5);ßzÊÁêP¿=yï½G›Žiä¹mG¯BïùhjÍLìäÀ"¹Ž }P€5•î(”#òÌ~ô'7]6ÛNwÖ—”4.ÃK~** PO³€Hžgý‘ÿ"P ÎÃ$žtŽG,øóÍ ¡a =¿_s¸¨[ë}ÿŽns"Ÿ„ ‘t=sîbX{芓ìrl‡ºâ6ØŽ,Èq™é¨)uA\X‹´o*&j+Æ 1VhIF±Ž/RÉŒ•ΚÎq)PåX¢Å&Žrï-% ZÁÈZSp†Ž#rœƒõkì'µ 1Ê.bph#Óÿ©©`&ˆ–EÃÉy¡÷YqKl{++¼p!É@]Äh\¹Ó‡¢«jm-sªµ OèÝÞ¿!E‹dNY¶Y¸‘磞’¤‘¬Jš¯Ë@•¤l!2Ún|‚Pðû oòÕè{ÀÐiJªð˽ÄÉì^dÝÒœ]¦NHCK¢‹V“>[‡pÏÃ6΃ij ¥TŠ‘ èôZSJÙ\ S #J ìýçÏŸ~¾ûðéa÷O¿|Çë½{ÿááña÷ð×Ç/ÿáLæØ:Åù\#¢'ã%‹DgØ™ ÷ žF<ò‹t¾)^]-“Cf« bk²[ad/CVÈît«…iDÊbIûà5 <0@2<×E‰F'h²Q"¾ò¦&Þc[SE˘†âöðû at¤N±âQ(Gy¥dÚLÿ´„4¨†P´aKîï7ͼ/W@šºµ-|Ê‘õ”“E%¼×±Æ1W¢©F²\*;t…Å8¤O‹Ï;gŠBìCöj):S¸„Ãníkî‚À°]ެgã`ö)XO³¹'Õ6{Ó×Úº5…È*¨y´Û\!îù12$çstY^šlÊ{ ÷âG·ù€Å‰tÇWM‚çò~… ‡Ù™XÈ,©4ì5}œöt€CFfUé²Yáÿ›þ «Æ endstream endobj 651 0 obj << /Length 3156 /Filter /FlateDecode >> stream xÚksÜ6î{~…Ç_NžÉ*z?ú-‰ó꤭§ñ]Ó»ÜZâîr²+mE©Žï×^äj×rÓñÌŠA_Dð_ÔÑE™¦aUÍþYDÐasÁ_ß=‹oˆ«æ«Ûg/ÞæùE…uTÇ·ë9©Ûöâ?ÁËÃáj•TîZóíj•¦iðòþ¾ûùŸØÈ‚·WU Zsﺇ eÐL{Ý]AcT£é;žòÑ4º³€—ERevõßÛŸ½¹õæIò7·‚˜ßÙKÇaqQTY§ogêZ=/QŒ[s–;ÂXxµÊÒ<ø°Fh(´º‘-@§íY–Qº~dø—(ÎF†[Í0uG¸ýüü‰?o5bwÆQMƒ~Í#ŸtÓw­ZŒ,c,Š D°ŠÓ0ÎyWÌDVj·ëQæ÷´XËÀ8Nó(¸£sÑÜiµ5›NIY†è˜Ù¼Ô`Ÿ Š¥N‚Û­L¾fÈW¬¾WØy`Ø )ÓñèÿàÔ=ôÜóëän$3ßZÌ{ûÄ·ÈC’ÒÑ$eÄ2NÊ8¸†C Pã´Fçpp®pÉùÕbÓXò/0¾× Í 1”@X¿¶¦Ó«A«VÝíôÙ °mTíOþ0h+A¤@¾ <âϺö$‹:î·½Õ ¶r%6Ýxãî7A¥áùÞ‰šc*aOŒß­6ºÓƒÚqç0ÝíLCÌ¢Øsšv2ã‘°¶´Aÿi¬é6èd+Yí¹“Ÿ]v”Ùl 4ïQ“Ô€ø»Ƹ7ã–[Ä­i„6i¶tkFà†ïÒ¬"ãÇï—(Ö®cöì•°ÝôûՂͱT{¶Í""µHŠ88˜ozgZÌ}Ï ¢[6Þ/ôÃÐoµ·8bcAhð÷ÞI–%«5|9 …ÆœîiÈ%ÖüÈê±ÅZ Ša·=J”hÈa"ƾŸæÄz!†êÜçp¿¿dÈì¾ÁñíŒß§¢i8Ó¿¸Ã`”ö ùNA71/3~9(8ŸËÓË1eÒo¾©ýa‡~0¯X‘òjnHõ6&Æ¡‹|ƹ;Ä€­GÐtÍnj5Ï8ìÐ//Þñ<-J³$Œêxc»·#¥`äÓ*CؤÃÅ» Ÿ8N¦a–žˆîhqêbÓ­éÚ+½W«KÙäs¶Šê–(ÆeæQ}±JBHDb4R„ìaþ|F±ðÝê°†·PAXú-|z÷ÓÇŦa䑸r=£ga”{±}^&“”aìq&¹ŠSż®èšß=ˆaÝüÜû¬CnœÇ¼dyXç©[çúöz‘—$ÌŽÌ °‹ˆ/£ ôí 2Ív™ XÅì×ÔÑ%UXÅ~Õ÷·OH2 £ä|Ù íø©Ìad¥\aUÇnöÍõÛÅåaqÔJÎe%¢[¥E–iúÈIaÔäj§½ê8ÝYpà9JH¸¦ŠÓØçË]zr±À »Fj®1Ðû¥!±ÈÇûLó:Ìk/Ì›Ÿß=q„Qy傸Â*óD>#S¯%†Q3Wqb®¨ Išq8š?Þ,2ƒcÏÊ,Îv}œ¨¯b˜9&ì@€vÀø‚ªP%A…VC‡”ÌÒ$ìà=Æ-Ödh`°åN?‹‘ÅÓÃï; ærHîäÀö pyæ€Y[ÛvIöq ‹Tõw=KÆiõ×®¥n“ï¹–:Lr/r¹€í­á$ˆ»ó/¨I4ÿž¿óμéx_H’weXdÉ©Xç"çQ`õƒaýÎrŸª E)¡B$çÁ#!¼Ëæñ58Œ}&Ü-Ï¥<‘çùÓ‘ƒ?7.à7Íþž§:5/Рæ–'vrî¼ðª_<Ç¢¿T~ÏyeáÑu;!¶Sã‚§¤Ø¦ü›ò’yæÍ½3 åh„Ã'äoùnDÌiðÉ••a´ 8LYÕ1\[åi°Âå¾²à8ÈŒ”¥@ÐDÒwÉ£”•c¦S̓7óé6\A”~¿Ê¬Ñ-4ºE`&¹TŠÑF«wkA=ì&ËvrZ½uï*Ÿç ™ˆY²O,ÊJå–4Ö-ñ‡¥ÛžaÛ~‡é®G2lÌË !QíJ¼˜.ŒÔbtË)—–e_ðN©ñÇdW9vK)WaWƒ”z;_ü]ÌXHÆSò»¡õ)Z¸lçrQ—¯.è—H~–Ä%sï]W(€¦Ï ¶b¢Rªª]T‹9?’¦Ä$dNW˜:‰-škb5iaŸ®Ú“"mlp ­ŽÅuÌ9k¤âöÀ: ¤ñ¡2‚f’V”ÍátJæk8©ýÃ-Žü>çöaÐ`¦ÔɜǺ&×ÕÆt`J}?uO`§\ŒÛ˜#e)•Df!`Ó¬X T7²_2Ì—É¢ãAaçÀåðÁR âÚH0cF_“‹\Ž-È@ÇÁÜM£¢.ãÀ6±\Å®tÍ_f¹ÞBµ?í´¯am~¢²˜³×˜$§ý¿á3†crf˃Ÿÿ÷%Ïq"¦â±NíÉæ‘àt7uô¾pÚPâÔKµHßoÑR¸ Ì3ó‚Am°>±X`$ãGít¼6ÆR­ -æá^Þ¨f(2QP2ñ@É£[ÍÞ=Ê;”ú{6ÈÕÌ &•!½@|©BÔQÝ8 vªÛL`»T Ï©¾ö^>R&DÕzL2,¹B@Åý³2ªLp§‹xH v‡!.Ýû¨PöI³[a‰}˾uæ%¿Kt<ò÷vKЙ^’çç„þ,žSËàLÔ®…[÷8ÍñÙU„ól§.C®2fà3¨ Ð9¹Ášô Þué!uª¨r›¨Î…Ì6» ®‰#ÐÛtîùFÈ­M öi¾{!@–Y.½ã1 ¢vê@#ßAïEA‰‹Ñy’"‰·Y)ȱͦ©³Y|„hu¼e‡áïV€Ì_QŸ~\Cu^ÚT4{‹•çƒn„’ÿ†ÇEE<žxœpml³SfÏuXŠ#¾§W»vOY؞ݸô¸<:û“Üg±@È…µdO@X ÷ÙŽ=q)o øÝ²gÁö£}cU,¯Q0Þs'öˆNöXÊ£!Ž€g²¦ƒoýòOÞ„\z$à–á.ÜÅö ×@ÒWZQiOÆrGD u×»IJ¸Ð’ÐQÖÑÛ¨¡•N+›áBGœòØáö ¢üaÙí9#©> stream xÚYK“Û¸¾ûWÌ-œ*k—Dro¶7v&µko’qª\Ù0$$1K‘Z>üø÷éî¯AB#Î:¥F£ô»[ÑMH¿è¦o²$¹+Òü¦<½Ún0øÇ»‘âmqãa¾~xñç·ÛíMÞaÝ<ì}RÕÍ¿ƒWçóí&ÎÛVõ×ÛM’$Á«ð}÷þ#Òàímž½µ˜ýØÑ†,(§“moi0š±îZlù©.m;b”íâ]moÿóð·y˜o¸ãÿó)Œù·DQt·»Ùåé]”¤xΧÛ< ºév“FYp2|¿o˜”ÝÙ›™¶âATõ0öõã4Z,ŒG‹yfîž™#Àu‹¯à7LN¶ª§Û(8Ñ×Kˆ¡5‘ê±^v§“íËÚ4îèzæ ½t%wÑ—o»ö“žBĶaœûŽû\W–ï½ã{šÑê#å¾îÁKvËËûúpt/!pÛ„?(6²Ë–mÊÒ¿gä.Ê[IäE FQ·ÌqÍÊI`HÏ"¢iÌÇΡ+~3ØôºÞ[f£TSÉ\` KC°šzk-oJC2Y­=Ü‹‹ˆ$H¬a…ቩ*Äô@:ȇ%˶Š5+üÌ/DiÀ½ìg¾·Ã; ŒÇŽy ÔöT€ü$lŒ&;ðÀÞ±ö„‹3Öɨ®ájzóé‰lôe¶däc[—†y²£íÖ S/Œß…`ŒÁµ~í×’7M{ЛìÝUðŽ»µ‡Üó›·Ér…d›ÒÕ|ÇžFênxÅ»1ýÁbhÛn";•±Èb:ñ5Åé «i[§§(CŸž˜²gFÌLÃ*Ê£}×4Ê6™C4D‘½–›^ëU­~°¥s÷i,,ØÝ…YòÄÇqæé.}p5–ý #̧E0µ•ØO¬~ˆQsÒ‘Þñ–ípÐEŠ>¶RêàQÇO‡>(UãÎZô‚¾7;³û~$—GnwEª¤{çÆá3à Ø¥ ÿ£œØDÛ»]¾½äqi³#3xóá—O÷ïßÀý{°ðï_½¸ø$Û×v³BÅÙλ;MÎÝu8꤯a´Â8­àñ¯á6µ}-§/‡.ƒ¡:EA<º–cÏŽfáè³'Jx‚tf8ééª÷e¥#Á\¥/YãEïsÑ{& §B{ND„4çû¶€Ea¨;EÔ Ò3VâøŸ`4sx¢ÉÑhGoŸê~ÝO½ñÊbg{¤w>p†$€¯¤ã y@’{:Çxò$˜eFÖÜ–‡D¸¯ƒÙ¦ C¬îŠ¿Xƒ¸dÕô½ËøÈ²±¦géñ"8BƒÆêÇÆÇ㨹AŽ–ïÄQÈm^úu(IÜ%ç†IÐkÔØ¼ñŒ7ÄoHdö³ë`0Ò ìÝfÀaXÞ±ËÙQJ~B¯¸ß®Îò/7Ÿõ¬öÅað¨”hÂâ™G˜4 ^Sü_Y°ß&a¨%øÂþXó*^wì(åqxt½ÿ†å9Zz®JµwÛ¯=H‚4Ê”Íj³ÍÒàÁi–Çj ]HWõÓ… 1s"èï˜ut?IÂŇÖc£‡~©…[¬sXÍ88s®[ €ã¦ì¾ÖA²@äÊ eÒ”÷êv¹H’+WΈâªdÛ|‰<¼tZüuŽÌŽšÑa$¿"Y/´øânI~msI®QPÈI°¼[÷~TÌŒ¡‘Ë(ÈIÄ] €7õ©‘Ôfš;.—‚‚ÓÑl‚m#J .L¥s':‘ø†‘Ȳw4<ò¹(êLd¤Ë+[+‹BWOÑ€3©•š'Ε„Ù’_Hr³Ój±¢^wPš)Œ¢¾*ƒG"}rÔ<3 VbïµBÑë5×+Ça5kAâæ 4 T †[ᡤQ—±$%å'ÍðålÈr¾ ~›Š§I¤é08_RWž~\ ÚóŸ¥®j-@é’øèc×ë‰(<„µ1Ñ\×F²{ô "f¡ÊÎ"û’H¥K7Ÿ'®GÕ€¹\”.Ý«$ÊÁ_ÊÇõgõŒBV æ„e£[@H/ÛÒ¡vøzí~ ¯õSƒcedéNgq.•3¤t®afEÛ'®ûçý§Ã·œÿÈP.¯u¶ôß–T;[?øñþíý›Wì:î?¼ÿç³Ý¬¥7˜ùÙ¬ðÂ7ÏвËÃËŒæë?ë_5§¥Vqÿ%忾“’—åš”ÆW*$ƒ]ÛqFÍÃï6D…vº†(Gjò'1€¸> €—Ö¤«¸5¹žü±Ã;´ G£%?M¸ýÎNÎ:\³!6$ àž—ðyNËz°ëÍNý‡zùC)‰#§j-´^ŒT™w^H‚)ñbÓ¨½¹"›}×(X”·´–6ð5¼¨BXèâ1áïÒ$K]7,¥tÛãÜb2µìÌ9I\ñ˜—ÌÔt3Î Á»”‚´ “ì†Eÿ€þÚÿ™3ô+ý÷QzRip¯fîZ/aÊ‹“M.ºÿ4«ºÙÚë"@-=ˆS×ÜŸÃõ› èéÕrCº]ž_Ú÷+õ­}…ô6_ÊêmÑð¾³9XWûR *âÙj7ƯÆ/»1RCR¥ 5»ºo­Fi»ÑÝËY¬ TXß#“—ŒÜøO%Ÿ+Ï(¿K£ø;Ýé¤FN­"G8‹Üÿ~<„J±ñÙÏ5j~š©‚ p a ²@)E ”ùzJ½w¤m¯¤¿€!2‹ç0&YŸþóþ?îoˆ8 endstream endobj 660 0 obj << /Length 2528 /Filter /FlateDecode >> stream xÚYYsÜ6~÷¯Pùe9Uš ï#oN$;ÎÆÙÔZ›T*ÞŠ5Xó˜Ùú÷ÛHpDURó@Ü@7º¿þ\ùð ® ÿ*‹¢CçWU÷ʧÖñአÿ~÷*q{¸wF~w÷ê›·Irø‡Â/‚«»Æ]ꮾúÃ{s:íöaÖ_wû(м7ßò÷ÝÏÿÁBì½Ýå±7*ŵ›&d^uîT¿ƒÂTNzèyÊOºR½A–†©—¥»ÿÞýøêön>a†Sù²Ð^¥y|¢˜Å¹gaà4qäµÚLªÆrìéžÛ¦£â† sŸ¸Õ¨J„€ž¡¹JçVâÜ›>ùIpØíã,ñ~ßå‘7œyFWb÷Ï:u±Ž);)Mzjw'µÒ š@ì}‚„%)Y£§Q=êálX÷¸¾ͬpÝð—÷€èt_¶2û|J8ª‘«Ã<ºœ^XðAs“l(Æ1vÚà˜n÷P$9|ÓC|Þï@!iêƒ Z;ñxÉvQ¡|‚Kñܧ|P×\-|ÏÓq͵]CF#»aT룙¡7ë1rKzÒJzFeNdµ0VßÛ40å™Åq´Ï§8jÚ%%Íá—ôŒ…Žm¢ÖŸü ®È ÷ ¥­†~p‡¢=bã¯èSè(ÞÚ1XÀ;<<,`öð &º8ýEƒ©„‡ßV•FЏì#z¢Z™QÀ’ÐÉÓPŽ“¢Eé¾Ò'4lI¹ïbpøÜôy8€_¶²O[œ 7leY,¶jYêXʬF}Ù±ï¢N6$«#‰a0zâ5Ûùo•1³;Ê­åM-ð^ v—§Ó8€ýñ…@Ãú dÀØÌárC¸1 ©m{8mRÿ¯¬f <äk¡~ ßpI!l­´½u¨ÈÊ, %áZî·"÷û¾jÏ5AgÀÑuªF‘[4z@¢™ÈhüDNm[{B³ì)+•ÜØÚ0¾ŒàÕ :èþÛç•O`§h>••—íZ×:Š ¿ç¤3üRœ¤â¹]cï¯hm¤¢y}Mðèα;ÃmŒJ¹86–„œ åÃ4N9Êö`Ýì˜ã€úúÒó%éþÂÔÁ<;® iyÎâMP–ÕU¾Ûô¦0ñùdðå(¥ù>°b`!.¼æLhLc á0I Z ®þ¸K º‚kÌ@]™ø^¥ìkn ”Ú÷ϧ;´Â9zº£ ú:™5‘xImÏœýB9ã›cQc\xÄkàYeoC˜fÙ‚UPT©×Øt‰B6ˆð¦ñ!ŒÃ5Óy¿ƒ‰„M,,|*·–Ž´„ÑÐò øªðÏ×èyI¶±…S,P¡a)ß6–µzާÔÑÛºbs€g+rc²³çD(ð+„‹âÙ¹CS‰—DAˆ D£© ÷A›—9O0Ò2· ’“úùŠƒúÅÜMžG1íí>Y »F†¨Û_À°¾P´te!îžzï›yø(£´±ñA(»›\\$´¸éæñFò°ßÄ?*­€h5*Ž\PL}óй.håu¡u²VQ§!ÉÊ‘)$.æ0éÂÞLtï·id½£ìûœòm$'¨&`©¤ÿŒõÕA¾lºÅÂ~ Í¡ûàĸ]ÏcØ’‹”-—f«Ž»jeªQß³ð… 9Å¥ÆÆU„ Í&ž#[(ÐýqÓ-L 9ÃUý‚AÉ!Ò5ýø ØC¡W®D w?sc+šæšï ™qc}a ¤’×ÜÎ4V»l°ulf‚…‡i^½ª˜.ã#…•Íõ4´âÁ=öƲ7§rt˜Oè‚iJêl­4ÞÈ®g¾Æx cZý™¤ú¢Ì’éÁ†Ú q¥6Ã3V@¢f6Z6ÛÔSœ["˜¹V5'G6<°6–s•2ì¾4 pÔR³»£2²'¾ d¬§Ì}¦€ÝZ`“5—>®¾v»5܄ẽî:o8bÞ+CGi”Jü$¬àÜQ06¶òÂ#;ØDª™çÅ8!³bËTl;etP±HSoB8ê°ç¸ņ¹w  •£a캧ó¨†sÿÂH±™Ÿâ Õ65ÀOY”üÊ켕k\,Ä”eôÆñ/Nb¶ J5Ú4tà¾Õ£JôÒ£ pª Y#Ë?YÞÒÛõg\ Ê °rËp% [ÐbÞT8þsÏ”ºæä–ã×<Ô.Sn Ÿÿz}ÍpÁSSK>¡À(oyal<@‚ X#ÓC‡åœÐ|ZoPEߘɕ©I{9â|øÞWRŸ(šb‰ãK¸$Õ×=Û¾W ¬2ˆGçi5œŸ½¨Z¦¢õ7<:†p6ku“#ƒ®ª¡ì<·ùq±&¡?mÇœ<—d<· ïÉ,€ÿ§+þ] ÿÇsgæ|Ç~ÄšYuÍõxž¥™€œ§¯mbÈR8¶A‹xžXðÓ(æÀûÎüq¦_ÐC'€<+Ì, 0>ÈÃ_aÃ80}ay[½@Ì+„qá‹`-¢@â›ô0Ä/˜ÃB ÑÏåÌt[¡£õe}˺Q­²/E³cÅY-»¤™Ð‚.yÛ×@æóz`ÝdzµaZõÙz©×‘¥;»±ðг„¡CeP|YVˆEà‹.Þz}ŠÝ×§­¤Môñ³ÕÇÀÏ| óÎI#>FÌ‚Šú q‰`àVeaò" 4^(Z6•È]d?ÎJ` T¢«IXz‹n,Ê¢{\P ¿ÑÒsXïä—/$ߨ%Ö½…ÿ¢¨½üäæîñ†‡ríêKÏ6U[ê®Äšç!Ïq—â…©$´hé©å‘é½N“ z¦Ö` ×8„B3 Rî»râw(h5 Ф’á[:ÿ>Uv%ùwJžËV7O/% ~‚*úºåáË3è”4aìÆªÈˆý„Ó;øÂ \J;?‘i%SäeØ}A³|¡;žÉ¯Z †²<.Óâö"|z·ß`΋#ØÇp² ¦>ú¡çdªfè„ã2˜ag5ü„kâèE ‰ü³_½e‰`` X<ñûw¨A¶ÁfÚþ;A)ˆoßlù{ïÿvå“ endstream endobj 664 0 obj << /Length 2581 /Filter /FlateDecode >> stream xÚYIs㺾ϯPÍ%T•¥âžœfñLœÛU½÷*•É! 1E*\Æv*?>½\Dû¥t Ð^?@ÞÂ…Ÿ·HÝEìûë4H»Ó;—¨õaÁ¿}}çɼL\ f~ܾûã—0\xî:uSo±ÝYmóÅ?œçórµIUæúy¹ò}ßùð'þ~½ûóe™N­÷>W° vvÝI•Kh´Y««’—|Ó;U60Ñ‹£MäÄñòŸÛ¿¾»ÞZ ÃÍæÿ< Îü³xž·ŽQ¬=?àã´º-TÂ$‰ÓVøMö¨˜Pè¦åVµç¡8Aâü\†‘“Õ:ãóð”ïj‡ç^ºœðº­Hm¹þázÊ™øë2ñU7°îÙS4‚²j¡»^®"Ïu¶GtМwåùk/œôyB:’zl)îäp]îdh_W'6OFGzaròÖÜ$«8»ÞV¼ÏÚJ¯Ý4bþŽç¨ºå*ˆBç” Cìdy. þ4J8bçš¶&¾2ëæºÌ«ºQä-0Ú¼¿‚±4qÎuEÊ×¹™­[þî*žšiT?R@qG]¸óе#µy,´šì§$KÃ÷‰UWsï–}x`= ¬‡ØµÿÂmð‘}¤ê&œ³ºÕªù゙ê9; u…½Øi ,”‰Y²\š[ÂÍ´­Ôê§VOÜ®ˆ†N—µL!÷£†zÒ1k¸!Þ[Ò¢ì¼ôXÇ1#¹™ÇæÄv&“«ú•ú?É4ÒLv̺öXÕ£ÙÍÙ W¨ÐR÷^Fú‡oÆÞ j)ó¬Îßv;ÂúïyìvHÍøsΚÝ9;(&Ð6ðíμ€bú(ŽˆKô'rƒ:o„]#ü¹û¨ÅûVŸØ?QD³ä"Ï-Ù(/Å‘¼¡H3šB7iìlBþÃnf¾üù˜íPŒÇ^¦Äa‰G2¹e,†‹1.¸F8‡Þ`/érÂdš/=|W˜ú6s_hج]*nôªKÅiàû¶=`Â+…‚ŸbŽ!WÈô—ˆþâþ€ÂÃ7<üÛ¥}±x$å wc Û?ÜÐ¥„íöXWÝáȬ®³ò0ÊN@=e9Jêú–{2¿påó@C™ ˃ 8h4€¸ºÙ›=eæg6‹T鄪²-j•å/s'‚bRt9UžxCûŠG$N=8‡S_lv…±&;)&¢k‚¬çR•¡ŸZJÉ `Ñf<Ð&%ió€ÙÌfåøB«3Î'N¢žq›2¡%©Ú¨–hýþ Å‹3(yX‹HiŽ˜“§³b/{,s®;æÑ{t ¨ CÊn¸EIûϰÒC—ðœùR7Ð {ll4V«s‘íÄÖ,U‘K£¤úAC‚Çèøg€(ºåž£ú¤)ƒ±ÅC†g,S\ ±×=@*9ZÁrõFÈø†ø-Kæ“d³5aKy&N¥þ`|5%D¤Ü +Âd%¶Xp6fâÉyÅ_² 6Œ—ñbÝpËâ[ìL!d &ª›vµ#8èSØhAg%ø¡`>Ž*¦3íz‡ŽU²Îð„ì©êv<¦޼0Éb# >›p®)ÏCÔ8EG3¶åt_yá:J±ñBÌ÷‘ë|º¿ýxsws÷•ù¾ÿôËíõÝö;­œ[ØP¨ÖÁ±³Ã€?‚´Ó"ɺ ¬ë"ùI·Gn Æf>½Ç4̬V…Ê-çLéÊÜ,bWÀ–¸ÂÕœvÌ/5¢¹6ëSÃ4AI{¡‹%¿#„Ž„€?'—ABeŽä 8á4½‹ QR/Z¨ÁTxSÄíd‰ÌLJ¹t[© ¨,)ÿ±)ÿ1¨ÚÚ€GÍŠ‚~vzL®xtá’Œ.äkV¾Î Àèv•á|jùæËL”E¨É“D%ß`"ÊQ'n± Øhøk¯áø048…àüö· à”^gJvô÷È=ÆXðm#§™ñ•òÊDqÎi•튤¾Tø”¶!M0‚’x4ÉÈœ‹ç7UTYù\&1ÀÕ_7»"Ó'p«×“5¦•ñ ‘ÒŸ{¥2ôª49jpë3CÄÍ“˜?[ALÚò$‘bÑz¢ˆCbtE«áfÆp~Q;ðKwŶ>xìàI Œu7ŒWsèHιÇÉÇ Ì#¡ôPÈÔ ¹€Ê!Y†ž@9ÂL%³z‡Éq`h^ÜG:f B‰›3‰¡’JitÕ&…‹õ¾X‹õ' öÑÔÅ40üå½i&,Ãò£Ðzò²0Äúß ‘!\€ÁÀ Ûí²Ð5ˆpäž ºXªçÀ^N‚/3ŒZ¥`[ßrèñ•MEJ ©˜‘¹+—6±h#6A‹-ûª‚-Ã%Ý]žÊ+ôµˆ_€® $]ãÀªÛtžŽž‘¨Ü©zÍõë¶·Rl¬„[Óµúd8æÿêšv^ﱑy'ˆbf`åbûž…³(³ gKº$áÃ÷•'9œpŸg`^уÙÛÛBôlÞ¯ƒtÆ-™>‚ëo`ñÈ‚÷hÞé%š¶C²½=óliè2×€™; ~ž>k%ŒðD³¬ÍÒ /“×0öæÞOg@“ Lñ»{l1¶waO =LÕ²X|nz<*"Å£:B×½x˜ò4élFö=ðáHÇêØ¨;ÊÿØ$uјÊ7| $m¤íñq¨æ¶<÷á[ÄÚ‰‰5ñ_ndù*~'=Ž©V’Yõº¢—/3y²ÿð³Üówíïüu⃛+vÔs[gôMrÀ„=„ñ|.Bóú‚“->²‚±õ0YIìôQ­Á)^ …!¹3¦ß¼[Í>Ó„È{ïÅ&¸ŸG…ÖN㉻àøàÉ àK)/ üôK/Q{´&üÍzRFeä²hsöÁùB“W\tX5£‡®Š• ¶†ã5ÜéwÙ3ºS’††qhŽœ×ÚΕ]£¡}}`ÆÕF 2%žþ;dð•½É]œjmþ\ý37þ® endstream endobj 669 0 obj << /Length 2774 /Filter /FlateDecode >> stream xÚYIs¹¾ûW°æ2Í*Ké}ÉM‰5¶<%3åJer€Ø ‰r³›š¦õïó6ô"µÝ³ˆ_î6X‘»ûw·¿Ý®£¾÷¦}ÁiŸþù_EÙu^f+Ðæ:¬210† ~w-ƒL7·@XÝŽÇûƒfÂÄ\8¡Å zæé,³˜Þ1¡ÖÖ|[gy ~CÛj¸˜þ s`a™æôIYÕkPm-«µµ>ÑžàSqi±%×Q±"uGŽ?‚P¸Wž±Tð½ ±³_Ý[è ¬;'s•»ßˆ½!5ixÇ_v}gÕ^Ï—¨ë­y<‹ù€rÔµ9ýŽ"ÑV5®—tPwað;ø_í÷VïÁ?1ÍìøËž€Æ¶;¡ŒOÖìÞ @¶Ú›Þ´{îî,zöÙÄãit2.íøÛv²ÆÙéZ&uümÌÑôã:SÙYôdmÀU°@yûhº¸Ša"D—æöD†Ÿ… 6µŽG9‡ŸÈ8~9¨Þ/¤™±a¾™úìw¾à¶ècîJ)° :¤Q ²9@p,žVLãøµðN㈬„,¦Ý6ç Ä=U-÷·ÓÓ4…•y^4d“hÕ²&Yž–9š'¦¡é‘4ÈÆ¹² ýÚœôFª—8<eâñËÁlqÆAF­°‰ûQf}tº¡ ”…AÉåLr¹ dÒÄ䨥4÷^(¯×ƒX…rÖàC$­Ä³Yü½Ã=x#ˤ >ý½gN«ÿw6Vûdg–N–qzËÑÄ„iè종ÍV=6Z¶ì˜ÞCpP[ŽQ3ÚÍW|¡×Û…¤è1Ü`^FÙ§¹Ì»Y¹*HäsÌ×hç˜ÒTË´®•¹ÕÈr,Væ—Í1‡±Â: Ç8OFÆwÏËåϲóÜò Ñæý IvTT…¸#‰+éר­–ä%gÀwëW‡rne…^¦[E‘ù•vïý°¬·d2Lz8LLûŒw¦wUQ‰ö :é"Æv-$ÆU胋£½ éÞe6ªQ²H£]¦úeúÒÄÂçx˜Ò÷ší»Î¡\eU|ÂŒ¿§yÄÐÌý2ØŽ¸ÇÙI«“šÊ2Ácš“5, —ø„t)¦ºPúªž[ì’btÉ,»/‡®a™hOotÎñ«ÞL/Ðlnî?ÁÌ |’O¢ÍªÖù+MJ.ÅðÝv­3P™¨'ÎHþjÚš[è/üÙµù=ŒÒ-­„õòŽ9ø¬9 »B•Ÿ¸3œêšûý([Š%ڳȄ…8@òàŒ}ÆÚÃaå¸ÉËäW$©gHHÁ‚U˜Œzä¿k9$nY£¦;}æé²0¯¥3pª×UZ 5VzNŽÓ­Áã)ap¾:Çâ‘¶@+c¹9Ç*”ºi'P×€ ‘e)dÿ¹gîÑÐñõåeÀËAŒ…í™W€Rqm„×µP,Sqã®åÐf3›¡á{³Æâ%KR™ÁêÚȃ[w<ÊÅ'Ç£ØìMK È>³~/ ×pJt ¯È…\Þ—hŠ2ø7¦š § a‹Á:8K1­Ÿ&Òǽ©*‹ „¬i)(Èd2‘rI‰f7¡è:î@Ê´aãE:`&–1ï… ¬ïw¾àeMYë y‰ë·m”9r¥%8–˲atF›bÖ©—a¤®Õh2ì°¼I5ñ&önÛ}cÜ;þ“ÂTI½©<êƒÖˆú°>µõŸ¬ç†ájG¡R¤£­“"wµmƒGINåF¶ŠgŠï¢†) Ê÷Q!Ó#§8Ù`¦Ö²ŸÅó ÂÛúUŒ@uÆž“po€T£jÇ9‡Ã…œ¸¹Ph åµø«˜›­1mA]U^BÍX–bšª<÷b î_†ÌÉjNNÓ¼ g“ˆM ŸY G‚‘/K-CäC•£ ‚ŽQ]ßС #xC¼a¬ÔÒù}¡ýà<÷ê•Ä÷.¡|æ d²,óÁ¸«Euöé'‚Or@Ååì.a“0 é•$ð°ˆ)P#nR„É¿ÁY¢­w8Rè©Y6¨Ûdµ©Å«‘OhvOuâdðBýă"ß’>|çQí^îÆ£¶=Ý!‰ˆ’üÀTÀÜ>üzwÿÇf¬Ðq>©ÐÐáû^"ätDNtP<,»)Õ›±>ÇâGX¡Æw›¦ ‰•‹á’õ÷­>I[9–ˆ|ø}•”oB®yZ ÿY“ËÄÉpá^ÏÀ^„ÚÍPÕaHõ½>žzît#Ê¥:þ’UÐXpÐe:g«S« ¬"7”øxe—*Â7pzYz.šš Ün7žŽM~2õ[¹'SqEÐKH¤sß!³$)|µÊ/ûD×ã³åÞðT#0[ÌÆwnãfŽ‹…åþ2”L)X(añ .-~J Fm5W|ºÌ4Üøfº¡`g|‹D²È­KÆLòPn´8I6±ò! ñæÁ¢}ˆÇýÑœÈ$À–„ä Ôo¼à-¶òâ±ÅO†\ðÄ䱘<š‘@‘a<‘¡ü`„>ÇÔ@@4>ª#…ñNœœÉ¡/îÐ4vSybN_½XQ.Ä&Q5FÃH™GRüóq*x›¸&Úa‡v¦÷’hú쨢Ò#ª¨š"ª0¤[ÆdÞâ%‰êo6 ‘(/¶ôNOŒÞT5÷)ãRÀ*R–뎌•‹n ’‰'™GÏ1|S‹Ë±:Íå­¦äÿÔHûòÔ]¾Z+œ: ä¢?2UïØÁƒò?ùÛeòGì'ÿi¤“„#Øç³Fž8þ{,Åÿ®<Œ¼öÿÿSFð endstream endobj 673 0 obj << /Length 2236 /Filter /FlateDecode >> stream xÚXÝoã8Ÿ¿"è˹@“Zþö¾u{¹¶]`Ò¹Ááæ[i„qìœ?šéþõGŠ”­$^Ì¢@-QE‘?~(báßXäþ" ÃUe‹bÿÁ7ÔöuAƒÏŸ>æ[ãÒáüõåÃíÇ8^•û¹X¼l]Q/åâ?ÞÝáp½ 2OÕ¥þq½ Ãлû…¾Ÿž¿à ò>^g‘×*E³¿7°!õŠa¯êkô²×MM[~Ó…ª;`i$^š_ÿ÷åŸ^F ã ø‹WAΟÞe%‹$‹V"Œè:°z½LßûøååËçÒêóÿ׿?¯é¿$òË?׬öãýÃóú•]b%¢ÅR$ 4'¡/;¸Q'hˆ Å©·¾^³íÑÇk0¡l]¶f¨K¶ ÒöYÞiçaØTºÛÑJ­Ž70ÊRü¦;UÏò«¶ 16[Zé­:ÆA'zá"\‰XòÆ]™uW6¹+&w…±ð¶m³'r¯÷ŠGÍDÃFyî­‡Åìh”§Á©ºH9êª"ÉB‘;½×•liE³"ÝA·º?QŸ´7 ¤|gZÕñEˆð†ö§ƒÁŒ!˜q3ðÚŒ3·ñHí©Û'¤ÞI0á¨qJªf êßXºñQAãZl==× VÈ!E¡½„z}FŸóÆ)4 i<˜¦2’¬¹íÅH~§E9ô»¦ÕC?9M¾â%ÃñjÀvvb©±µ<¯1(ý4ZYdÁ¦=mVŸÝ÷(qÃý/±‰b |?›­Eô“i„~Þ({ÓFü°ŽbÓFàœZB ¬MµÅÑøËNœ$1»í¬¬ãš®i©·jt£hBîŒ léÄ› ®¿ÂÖ_1æÅ`l =§Ž@Ø_OÃñwOÈþL¸^‡Ž÷ 4a~C$§•,ÏNçêomF÷)ë8/‡ÈM9+û›ßÿ^ZY endstream endobj 557 0 obj << /Type /ObjStm /N 100 /First 882 /Length 1411 /Filter /FlateDecode >> stream xÚÍYMo7½ï¯à1½ìr8ä,ŒNZ °Ý¢­ëƒ"¯]£ªdÈ2œüû¾Y÷CH¢«i¸rß{3;®ÈFcKbXLl¢ÃW6ä£ BÆy'ãb˜ cL6ÏѸlŒëð!n‚`NR¿`"‘ Ñšäõ÷lòà'˜k3~`Y 2äÈÆØc.îOœôJT¾£!]ÂeoHl€‘`ø,( F²†"HÁH‰ [¬“ €"¦ç È¼qTÐnØ Œ‰sN °b¶0²Rוáã!DȘ3œ…AôXÈÀ=ô˘ž<5P]ƒwðF¬bòêœ`³Xo˜¢ΰrÄ‚=î.ƪªX(®3¼Xbhˆà!,ë•G> Îg¥,Œ·¤W ¯Ó£ñ…²ñ3„4G&Q#Ž÷º CX½.þ> Øâ0]±ˆó0Ó!–ˆ…0¦' ÌI‘DÂðÉà$øœc3ˆeñ!*ŸÆ]<$&ˆ$H£à”²æ™Ë˜î{ЀÑ=î,šŠª!«dÍ!ixH¤Œ¨úI¡«QCåSÌØñ¡a Å’¸iPJŠ9(%Ä\i ô Q€ >¢K aE†™¸¬ÑèÉ0@j âàèeàÅ„LÀ¬žõ†Ñ›îÍÁAÓ½3gh¬96ÝÏ¿üjI÷šÞM&çÍë×ûͦ sp`º£Lzð=ÂCÿ6qß<˜ðï>Ìgã“~aÎL÷áÝ‘éNûO óïR§Ÿozü0ºê›î-–í§‹[U[§7Ýq;»›ûÛ¡ —~è/®GofŸÌ™úhªÅìÎq›Ñsá'ƒß2›\Áfw ¾ €VR@2¬ ÚŠžèÖáéß‚êR «Y§’µlź;œNgXêl¨çŠEë¹~¯Üzðkº“»‹aüýõô¦{3›_ôó‡{Øs2NÜÆ Õ4·‘ñ8;­R¶ÅSŸÃA’Ó}7;ˆùêp²èçÓÑ¢ÿÍzûäæ—£qÿÊR!ky—V÷ŠÔjÙϱE©D0Ä<î’Ú0±)0ÿ3@Ag·Søc™ôÑÕ†›ôŽawcãòÒZÑM%´Z±±Çµ9>ùã~t1¹ž²ÿ4š_>NúÛUÙ#ï&;Ê›n,Ï'{ùÔE©­51®¯5+>Øã[A3³Î]j À³ˆõ Õ*Q©[ÞL·äVuKv½n+>œ¹õÛêñH‚Gâì®G(ôH\­ÇÆŠÚÑ6 ‹üßäGù\%©Ö£ªV/óÙ¹'É®à“m-ŸL;î=»×½,%_Í'ì›Î %ŸTÍ'?ŸGB5¹¢¸èÑnrzözÜèÙU±ˆ;·†èŬžÑ9·Ù ¡ ¶M.?Ù¼ýy3é׳©vGwÓ±Ú·;·†ÎIq¨§”Ðêë€ØâHW‹  GÅçjkcNTÆ´~ƒ]ëóµO®BE¬Ôj×ô™LúŽc7©$!Õ$â~H¸b³Ó7L•$퉄”$|5‰°lK›mk® ‘÷D¢Ü¾˜kI°ß‰\’ˆÕ$Ò~Hx.Hxª%áÝžH”%ÖËV$–º!¾Ð=Ýr¥Vß°ã@.É8ëÛ¨o¯yŸ¯ô-æ¿&äÇã÷¯~_,n¾íºËÛËv6¿êV»¿þ5ÂZŸu»µxCá«tâ¡l\|®Í±PÓ”~(œõ$Ê’6,Y!$¶/Yµ¸Ë·ÿ²áÛÿ§pç—Ã]ö~¾ò·ðËá.w‰Õ¸Ó‹áŽåFi+ÜK5ôáoŠíj(Û6뿉8»é?®Ô²þçÆÃx›*zß^Mï†J:žÝ|žô—‹¢¤Æ/ìUú˜Þ endstream endobj 678 0 obj << /Length 1335 /Filter /FlateDecode >> stream xÚWÝoÛ6Ï_aì¥2«¢HKT÷”&MÖb+ŠÍÝË: ŠDÇ\eѨ$þïwÇ£>ü‘-ñÈ»ãï>yf³þØ,‹f)ça&䬨^Dn·y˜Ñâ÷» æùÀ¸˜p¾_]¼½].g, ³(c³ÕzªjUÎþ ®v»ù"–ªKý<_p΃«wô½ûü"¸K4Juc@ Šn«ê9,lnµ©IäW]¨ºF–&qÈhþ÷êÓŇՀpǯ49OlI“!IìmI¤Þ–››Ÿo¾þ†øÓeð‹™s<a };Dç66º¥ž³ÀŸ¬~`$D°G¦kè¨D-ÌÛ Û¢Ç>† °,d±wñj.yà®Ïüõ2®ÏFŸá¶®i3'ïƒàx_ËÀÒöצ#ÖMŽÔ#†BÑÎS£­Uõ%P•EÕ•^N…Ù!ÿž(³î1y'Àú,*»Qh¯3‡lIö ¹×%%Ì®µ–Ö¨Á®MUä~Òõ9P2Ø7úasª‡Õ ˜kclé䟮õúóµ%XÐÐÙp£Õ¶òË]þ ÞQä8›É0Kã2Œ™pÆ oܵÙ9@ /ƒoÑ2º†Œ¤!Gé4 “(ç8Á½Êþ`ïòÅë|«ÎÜ‹’¬ ‹L0“Á" œº³/ªÙê¶uõ†ú0‡ðûÐäµU%˜êøî/iYêÖ6ú¾³Šhðé[ã1mM©×{/ºé5–ÆÅÓñž èêR5½€×h™Åt:8s·®‰àêÆ«÷½·|ÆyĪf4“…üÁè Èk¾Êmëq*¾ëî+ÝnzÿÜïð°þ0kû”7ý¾KŸϹáICÁPX½Ç?Öy£!^›*P¸½<äºmLm׿±»R϶grÙ>å~Ÿ?<ó N4ôyv5Æý…H %4Mß Êž:’iÉ " dXFž÷ûw íX¯ ô›7á¹æ¹ˆy§ .Æž‘º`‡àrì{‚§®ï¥Ø÷$Ö;î|¬ig™. ¾‰ ä$"é_4CàÝQSCª\ÏFß’¸‹ îC4÷‡“‘S9ʸK8¼˜»*/ö­ê^4á¨w×7xÂ(›õ¿ˆE<ù°8FÝÂé}#YûfF‚Ôêt{®­‰4LâŒÚšÈŽ“wô Ùë‹FaŸ>mz,‰Â^hß¼ Îì V÷MS¦=L‚l,zY_™sU,à<SkRµçÊèÐrÊH =…Åd(ãìÖP˜g<7©Ñ  ÷z;ç‡6¼/†÷GðW ãÅI ¥Y˜.åi q™` ¥4;1Ì’Þ}ª!yZCx4&Š¢Lg‰ª!uÕ€[ÓjàYFhiÍV‡ÿyæÂlQö^×ý0‰çñ–ŽÝ@«¹¤üߪæAõs†iûwßMÎj?PTðLàEd·Ÿ!Ü€’m§íÑäÐjÛ9\ô40À»btn µëÛuf0Š“Œ%*×èKd¬ MÒ Ì.úQç1ªç|»ÃÊq”ñwìÏý–ˆÂͪn /Ñ qš ­.œ(Ô(p-\_öd¥òÖ'ß‘C‡òBlj”O®G ßüîò&¯*UåG\úæì©©Ñ…W†èñ»v/®Zxk‡Ð¸7w«q ˆ$ƒôÐYÀàbúúLrâNÕªA'bð¾àã_PlÇcŒ8XD?€`²¯’èú,ÒþÎzø4Á/ØÿÖùãÜ”Ý endstream endobj 693 0 obj << /Length 913 /Filter /FlateDecode >> stream xÚí˜MoÓ@†ïù>ÚR½xg¿¹*¨ q@&q+«®¥~=c{Ý8ö®³‚ mQµ“w÷ÝÌ<ž52ü£‘É"Å1\G«›EÖ~º»Šº‹oÔêR¦åËåâÙk!"š“-/‡S-×ÑçøÕ¦^Û}’2Æâ‹z]Üá%¥±¦É×åÛÅùò~z¸ŽF9Yˆ’U¨àýB2M2.Æ QÂ.í»Qœ0.¡•f„K4àÉL7ðE§ƒH#e;·Qô—¬SåÛmU®ò}¹©ÓÛm’‚Ž‹Uù%£|…–œÅ«ÍͶ*šï›{ˆ/¿×«æî¶›^¦§R`j;õó$¥ŠvÿàèŽN¾E´"š²H \ªQíÕé@ÞFvøÛÇS¶KrâlÉÀ„:[õÄù8;ÚÁpNà„3jó”ŒþM^¯»Ðër_ÖWÓÀ+ÉùŸÄ=ìÃfÀ$Y@8ÐHÒ&túd²:u:O1MÙF¼”÷”ŒŒ”ÝT%Õ9ŸQÒƒÑR2@†ÅUYŽ'Õ0âáãÁ@`ý1øb0{1è5ó„[ ÆÆn ˜"LÛ_Ìb -,eäUù+?”릒WÅYGîÈ× ŽÒ "@?"|ÉF˜‘ÁÉ?ÈýÉ·š6$Ü›ü@ã>ù3Ƹ÷ Ä0Ñ'4ï‹]Þn¹'³¨P*×>àK·Shºrº‡¡§Þt÷é;Ÿu®‘ eßÍ?ëvKº.«Êâàl Ú úZ‚¿àÁ‹KƒÕW…â5{ñê5mB˜¯Pc‹×œ1V.ðÔÛ%0,*wû)5\&ôjfN&}6mdC9Èý€ “å$иdd|\^ ŠÝ®TX.lzï.@XÑv7¬7ûühKJhìÛ•6› 3Tã÷xœgx”ð4~j«èÕé@>ad<¥»m^/š‚ÃÐÃFÆv¬å‡6úþIJѾ0@<š–tÊÉ'(€(-ðx§ˆÊäI(:u:; 8ž²ƒB»¨tm¨;º©À¶…Pe=?Pñ#*Îweþ­*nϺÉ¿“ÅšaÄ,íé€ÊÐ’1{KF¯é^x9á3‡¡®8‚iw²OpüL@ÇyUâß¿Ëpw)¢Ážx—â(¬=¸h®/OéîK,fM!=à- endstream endobj 785 0 obj << /Length 4143 /Filter /FlateDecode >> stream xÚí[ã¶Çß÷Søq¨‘”D©( äÚ6h 4]ô% ­5Öc;²f/ùô%)ÞDñÈ'm·YyØÉÎYý­ÿïÞDÑt•ËÿèªÉW‚sÒõjýð"×Û߯ƾÿÓ jâ2˜‘_¼|ñÙ7e¹¢9iò†®^¾Z•”õ£z¹YýpS³Û_~ûâë—îJ%cHI9ÓÕŠ ÂhY(Mù©ªº ”£Ü7·Mqó¸_ÛÃþ6㢼i÷›ñ‡ª_µý¶½Ûuãßüe¿éÞÛ÷³ÓmrRUͪ└”)á~ÌWù»oWòW¼^½Ó‘«‚Ô“?íVÿxñ÷ñãqºªISUîÓÑJÑñÓýÔï~Úlï·ÃOG%ûÙ7u\r’ õtèïo3*èø›ü=ÿ» üQ’°Zšrgßr¢Øè,×4Xào|Ims!fÊ 9k°Ê&z¦<˃¼"Œ×q¼mwÝ<#‚•O2 ÐÆ,hƒ-_Sv #åtÙ”²¨<èÝá]ׯÛS—*úëmýA‚ÂAÐËaÐHe :Vž®K’Û~G#ëDÓ.H!øÕ5íPã°àÃá Y,dNÙe@¤<ËQ‚ÓI<Ïp6ŒqØ ðáp„,2§ì2 Rže@%§Â'€¦ÿÜÖ;(£=XÌ.¦ø½%ëOeÕü¢ ¼¨˜®RryE9S­ûùHv’ 9)*yMõK6†µw‡~óŒ‚ßü+/ó/³{ùM´ Œ09—yöOGNñ8~4„écb´Í¬s§ì’'Rž5r´(ìФ]¯»ãí¶ûÎ'Æßº[zóÎÿÝ¡ÿü¾û}:gh!›’â#' „ÆÜ‡Ñ„&ÑDƒSvh”%™¢©åÜ’¶ooYsÓe}w¿=ì³n¿ÉÖ‡Ý!Ñ—7œ”¹¸ØŠ¹ËHÁ¨ó㜻ct„ϹF—Ô>‡6X—„V9f«ƒ°ž†¶@°2› ¤ADX¢>&º E [¢‘p².JN*»jó® ¾k×oÞµ½,ä×­nU™éŠïÒͪ’¢Å“)lÓº¼!¬n° v6Ø6fl°k0pÊ."å¸/-XMªZDl7Ý®ºñ÷w‡Çè<¹ ûÿ`†˜;Á"ñá0’ÐFA$8e‡$Rž!¡5Éë"Bòf»Û¹QŽ­¹÷fX³D¦=kÅ~“a½,# Ía D‚SvH"å’\¢f)$ïýÆ#ù.ûêë¿ #\°ß¼%„X™[IJòá0«ÐµV8eÇ*RŽYq9–©E±Š1]Uoe-A² ÂA¶—áÞ ©lÙÆÊ3¶uE˜°½•}î÷Ûý}vx•½Þž†Cÿ!Dü‡‹¬C{‹XV>fºO‘ÊŽU¤òV‹«ízèúìÔµýúuXw?B3"F­/(„Ò8€EéÃa”¡© ì)‘Êe¤·ôâY—„Ò'7i´DŒ7XÈ>†Ú½§ì /(+ÆŒZÚŽOmèÔN‡ã®S/•dÇ^1iñ>ÝåÕå—«™ÎY3Ä œ!NL…[_¤°¹ ¬@RFÊRLAž†v8%7áÕ¿òå@(ŒØtðáp:„hàt@ ÛtXVé §œMiûâÃÃlµYs3dfÉX-Ìò¢ºÎÍ™P& ±™àÃáL©À™€¶™ ÇÝ8mh°¬06íÁŽÌ—Ÿ‘î¿å8»(ë+È ‹·¾!»ø ìâ'(X%RÙ&À’²â_çDÍ„¿êÚDZùø àÝv3¼¦µ¬¸üNÞz€¬å ¬å‰­`-c…-Êa…Rä„b†r{¿—ý}¦^ÅHoà½à‡Qc–¨‡‰†îÂD‘–肰"Z6¤,Êчöà”Óªš?í‡6Ö,[³ }†Ù"…-ÛaŶÿ[°[;§š´À»nŸl‚9•büÓYÊ·†š›Ã2òá0£Ð/˜RØ2ZVŒxMx1Côóc×ȶC÷˜>5%É/x`ÀòtÑ0ÎÀZ˜&NÕ„UK&ˆà®wÔž·jOL×ÙC7´ÉS(ªºyž 'ÂØ‰Í§DH|¡+l“"žÍ¨ ”».öø!öž>íeikv:ãÃáéLè,ã Oœ²ã)Ïxæ)9 x¾:ôxœœ4´¼ü·ž,c–ª‡©†þ.PÅ);ª‘rLµ©ü¶8 Õ¼ÂÖžônþ³»[.þ¬1 ÒGƒCGaŒ8YK1’îváòç’ÒUÅ(ijóîñWÀv½Û¥ ¦/ˆ^k²/‘o€'Kr’LéÓœ•T&r]®ª\Rœ;ºÁFgAø,!âK; Ô"RUT+N«Thä/K™0îp´rvè³Ýöœ°TÖÍ–µ5Ý:€ä„ƒ'¦Î·<):HUÅ1VLs¬+ÂY9áøúÐo9ì‡v—Žíº;ÛDš¯w8WÍ-bAùpTèÚ¼ Ö pªT¤˜%J"rÓêëCײ¶¿|èöA­lªð# 5rl¾ËòD³-%¨_Hü]ê*DˆÆ_„".¢?!$q5¦n)øLÙÙË2çìcíâq¬ñØôñápú„,ôÁ©êôYPtÙ£ß#°Íõö¤ v$ù‘Cu&®á}ôIÜEç8ÑYžà<½dzV¬1ãDYB0ÝJ¨× JÛœ2wh_ö¶ëOãa¢nÃÖç¦H¿Ë¾p?%ªUm–£…«³÷‰b-dŠyé§«–ÕòróAT~掰åçÃáò MºYœªæ)¦¹¨·ìÔksx·×Lì´– »kxCÖQ0–`Áúplè2KžØ‹TÕ`#Å4XÎ ËÍÃÂÍãÃ1{eŽí=_ÃdÇÚƒ…ìÃaÈ¡ãó-°2NUCŽÓåWÒÈúµ³„õF‹æú6Z8TÆ7,}ÓQôqªš~¤˜¦/¥©›")úoÍñÛÏ%®ˆ{°}8 9t€ŒSÕ#ÅôÚV!RØfåë%K/m™ìëÆ÷0™~"Uß ýÁ¿k«ßMH=b”Óšš>¾|è•,•†cÇÎA88v¶1ðØ)ÊÎÚ2/JµiÞ$@·ÙêÛ‡Ãm&ÑnºôFñü„1ÆKl>øp8B<é|À‰²„`²Ý/äøO¶ØeÊ|Zlºp9û–‚/l^Â˹¶ÝµwŒlʃp°)Ÿ˜˜nÊ‘ªšÛ‚¢Ã&Gt”ñ›«âì4ô’_r¹ƒ5ôš–;¬MØõáp‰†Î§K'ÊÎ:Ôjøf@ïõ’Öì¤Ì±J_¾îR ()xu¹œïÚ,H cô®¦!b䨢”H)©í1I¡:A|£7ø¸³’ü«²xrC)c §‡†.×I¤8QvFÐa••ÅJ>ÁúFWå‡c»I ¥j’sþ|vø4Œ‰ØDðáp"„\Ò‰€egm"põTÓ•×¾œŸææ°ˆ|8Œ(ô+½ö‡TÕˆ!*çUm UI Û]rù^5šçåûôôÃØˆøpx’I7•8Q–LWk^’ÚÍAÞú s쎷³n/ýí W„Æl]ûp¸®Cgç‡h˜8U 3RL?že‚ë/å6ߎ½øêyÚðªÖ¯ç£Ú4nQž?±æÈ&G“•@?°ÂÁŒ°1 3¤ªÊˆ%E[ÝLŽ–$HCúЯÍÊ|¬•œ‰œ^ãfœ±¶Ž!õ lÔ'’:R”%“:“ã´‚Õ»~;pù;” ïè©ô…>N:@•g>=¶ò|8\y¡!@åáT5ƒH1Í@ ÄòrÊ ~ÁëÕèXc°x}8Œ7ô:=ÅDªj¼‘b¯\QûB¯9duö•/_f'èÛÉ(¡â·X#‚à˜ÛÂÂñá0œÐ©ô"RUÉÓpä`I0:…o#¿ÊÚ3Æ`ñúpoè5P{8U7RLs©(³=êŸw!šñ·)I5ð9u½Ùû0~ûÇa; ˜|£ .Å“K…qT¢ï©yèáà@ÇÆÀ¤(K&  a”NƒG]_ä{™ö‘%„ƒ%;qåIP8U *RLƒâ5)í;ñ(Ó@Ÿÿ¡/õi?ø²7ŠÅåÃa\¡w.œªÆµ èh1iuUF´¶¿$Õr|^¯ž¿Zk¡¥5nb[Z·´! ä )Ê‚éVÊEÜÒ>Þ[Eu›+dý+ñƒ Î|0lÁùp¸àÂ{ §ªíÓöª¯¯§õ{±-eUœÿ7O ¯Í§ÄzíÃa¯Ã¼Æ©j¯­ÕM%ÇŽvX8žá Çê‡uØíÆÐMòu†& ‡ •qÙNùh°™ ­N¶RKŠÿ=4` endstream endobj 675 0 obj << /Type /ObjStm /N 100 /First 902 /Length 2222 /Filter /FlateDecode >> stream xÚµZË®·ÝÏWp™lxY/ ìÊ& K‹$‚Ž}1t=çïsª»îÌÀ˜‰«¹ØÓ·û²ÞEvw*­t÷ÒÃ,dc/4­ôÉ…ÆÑŠâ_TlvŒ\œ£”Áñ[ËT:ukqðõ_/nÒ§-n¦¾|ûö Po¶s‰·œ£ä¨9ZŽ=GÏqä¸/0Â[Œ¿ZÂÆwzxõñŸ¶ßùéí¿O_=½ûññÝ>×ö],èH‚‡×ð†n\^ƒ(W[8zo•iâ¹/7i¿*~zýT £?Xÿcˆó÷sN® OîmÔYy‘#&ÿÿñ)ÏüV‚§æ5  iŸ“E|è×YćüÞ,23ÌÌsÏQŒì#åÈ9JŽš£åØsôGމG‰G‰G‰G‰G‰G‰G‰G‰G‰—é8T°‰Ç‰Ç‰Ç‰Ç‰Ç‰Ç‰Ç‰Ç‰'‰—>ŠÐ}Lˆ³õÙöÌIRQU,å”Ù+É•>:º¶VŸ‚PËãÞQÌVøëß|æD§ûgÎ8ØhÍ:Ó=¥ ZœK¬§Ê‹Üó™ÒÐúð%ÔJo%ðRJåJ|¥M4ymÞÖf?H™²ÕJ™µËÚ€À£ƒë5J»c@G%1vÔ$~ |hgÁAç¢LBPš¾T™ÔGÕv‰µä~£K) ¾Úe¦nÕ–Rª#â\)Ó Ýà\J)½ÆIí™R]ÑZ]¢ö«¢–îïõ~„Þ®úBï'ýNÚ”ƒ8ÑûÙ•ÅÆv°Í¥”èüÚU¢&´~|/QË1»Û݈èØLNá´›ŽN!Î~6¾è|MÙ½GÇ%Ï»÷‘Qh©<ã,+ön7¾èx•þò´ ºt{Š,i¶ÂÏË3©¼kÏ¢)¼V{ŠRgäê¢#¸ç€Gõ %`”9Ê*[R>žù8ÊÅ糞qw¯ð0>j[Ÿ¾ñ¡žB£·ˆ/—ÐÌ\ŸFßzg›Ù:ËâÚ¹çYVˆ¶¯tU45¶ÇNUá.k¥ ëßc‹JÔK… ÛŒÓã#¾”n3Í4˜&µÛÂ<è”Uæ¬y†¬Í«Ž¥d®=|c‹­²a¾†n·KØHM/@VYti–«Üe)ÛK+±^ãm£‹ø2|Ië{æÓXÞNg(&º.Ùî;Ó‰Õ=€éÏ•Öj{Ïí6>TòDciBY§0:Š;›|G‰5æ ¤‹CÇ{ΠÇð1¬3vˆƒ/6Áîí¾7ìâdE#ÝvoØ6À|¬'K,o÷u†uv³¥ÎÎ°Îø vã‹}¯;ßå} 뤱{;‡uÞ9H=*¸0šÌé»y2¡]¸“ˆè LD6jËXM²½¬glˆ0íê‹Í•;Á¥Ä·í†ìýB섌;ÇýŸÏ—â„yröC$0;[¿Y mGà»uÒvü½Xœqü•DìLµ¥âŒ½ÛˤØûС¿-ͯËÏ/vo~fö?’Ù¼Û endstream endobj 872 0 obj << /Length 4064 /Filter /FlateDecode >> stream xÚíYoãÈÇßçSÈË8;ì‹læ%@»Á&˜›A^’@àH´-Œ®¥ä9¾}º[Mv³U%Wcmɘ{ì²þâÿW]}’â7¥ýÇošò¦–’5ÊÜÌ×oJÿÓþþæøÍ¿{ÃC\a‹$ò·Þüê{­oxÉš²á7îÒ—ú°¸ùûÛïo|û¸™–ÛÍm!¥|ÛnÇoþæ~ÕöËöãª;þä‡Í¢ûz[ˆª´¿1òöŸ~ÿ滣¼‚ø>]äÉ­«®˜T•poÔ4LËæ¦2ŠÕZßìNñWߋڪR.¬dª²/hÿPÕúµÜìź;´Çp“„+Í*®ì›ð‘¿¾-xÍ_Ääüéß]ÊdE#˜ü¦ªK&êú Ct‘„{˜)£ü%½÷Í©pÍJÑ…Ñ'Â’'Ê6Û+ݰJª!5ö](æÛõºÛlR+ñö¥.ß¿°_øi¾46E¹~yù’{kjf¸ÍxÂÛ]$á§P³—ô‰ ¥JS©fÊ'T•ýo#rª»Uç Ù>%ûK˜,ç’éªyfh1nár©Üb8Î-uP(”MyävFÙa“ÆVu°í»¶ŸßŠæíCqèúõrÓ¶ýþUm˜”ÕEm¬øŸ¨Å7†ãÅ7µ/¾Dáw& wáeÅjÓ•ÿ@êÂ?¹¬è¾­ÛÝi6HÁ*S¿váÿn) y íWÉ5µ’p4µ†˜ó©E©• ç=€6œUuÈçOËÕªX-7nœª¤/üïŠOpá¯fªKN¤ #ö!I8Ú‡L’§)ä3åò5÷‘|ßݧ/=^3¥Í,‚oÔˆáx¤(„D€¦<&@¦|’Uɤ©“øò°]ucg’ÀhƹxéI€ÆP Çpœpêõ™&NS gÊ'„UÃQ¥„·ý"6ð÷Å⵸OÈèäc8N>ep†aû!å…d –¥ÞÖôbÃñ„1Þ5^¢ AS⌲­ÊY'÷ßÖ–ëq†°(˾›ÛiãÍyÉDùLç ¸á‚‰à’pÜÄCQywNÙ3‚‰Fàa¢ÿ°\,ºMáè BVW¶mò˪àéà•t ÇI§¦Ÿ!MSIgÊyo­ìx­Öè×ÝæqXŠ{r4fi˲¹ÚÁ$*íŽÓN}Ç—ðˆÊ#íLù„veGç€]|l矾´ÇqÚ9êœ×¬y6Uãu¼L*®1§•øvIvd…Ë:RÚŽ²+3¢r8ÁµXîw«öÖ˜¾»¾s%ù+ËØ!uõÜi…K¥âŠá8¯Ô½3µ”¦<;£ìI;<.‡áNwh]O©Û{`Ôñº út«”ƒµÄ…Ï$]øœÐB>©ÂC†dÂà I•6Z†±øÙ1)ÔÀ¢ú¦ûz°ã¯½-‹Sé[þö]±¹ÂÅi!ꊼš„£%cˆ9– 4!ˆÊCBäÊy‡,í|¶<¼Ÿ÷d“ÖÃl>½àÛ` •m ÇÙ¦.sƒ²¥)l3å¶µØn7ÅrcÙºÃ íª¸Ûön¸U¸÷rÓ0ÁµmðdžïãýþêÃi“µ÷F2U¾ˆ…Œ{%äAvŽs1OµišòÈ=S>᮫Ž9÷¾ûÜõûî”ûSØw—Š]Ù *}°ž„ãØCÌSØiÊ#öLìÛeiltè´ÿDëÛ·»®o혾Ý,ŠûîP¸n –þwÅ™‰ Ádýó÷ðWa3S“Hb4J5„ç`èž&;0=#k²0"·üh¢mñ¢j®u@e@°š1Ï”>¯#*Y)ç]ÔvÊ †<°õûK¿´íu½]<=D+YÍùeoW öP9Çpœsê8¾ET9gÊ`ªdz(Í&xÚµ÷Ýä#´µÙèæ ÷6…¨¹oƒñ¼ðOµ~Šæ˜Í“–Ïݹ“‡»í~¿ü¸ê°Ãª¿y™ýt¸D*£ŽSJ]×K‰Ê#©Lù„U©¬úÐ$ûînùõØ[ƒèïþêL®¸P‡¨¨c8Ž:5]h5MyD)ç¨y£¯åˆúórû¸O'MÃЙ4ñRXÚæÏšˆ(“påÄT|ÖDTPæÊ'(ŒG›G”ÿÆ"/Æ«—uN`¸h*½ŽÓK}Ä—¸ˆÊ#½Lù„^-Ù0ßõËÍ¡XµûCñéã¢X·ó~{‘ðŽ×Le7FãèñJ“ÁMeÁ‘.w›:4ø¿œ]«MXÿéq{èÅñ®´Òþtìf·ýñë»â3¶lXešg¾%É…f•&ŸÀJÂqÊ!戙£˜iÊ#çLy ZÚïµÕLnÄü!m_L²Æ„…Ⱦ+ú®u¤—‡ân¹šœÎÿz$ÿ®è±!¯¶™õ3î;ç7·rÛßíoO¬«§Î;ÑE~‚5I¤õº›e‰ªî¶Ú\qÉÑljK³*™0bàÔ.|7 m2›êõ^JZC©iÃñ´H ¦MÕ§E¦§…jXÝÔCZ,úöK1ìûÎõÊ“ÛkÎ Š›8(MP9Æpœcjêé Øs¤©zŽ™"ÌÑ6\ÉåÀñ¸]tº/4t¼X –ÜŽ»Ž»Ÿ18Შpb8'u CSõpÎ(Žl„aF˜‘;€ÕÝò·ý¡hW«¢u›7_àrì6‹›Ë\_yw¨ˆc8Ž85ütÉÏ#¦©zÄ™"ÜþìU*•´¿¼~¾ÇÝ%/"D‚=TÈ1‡œ:ŽŒ¡hªr¦C.k6uW³v~X~nÝÌÝ¥u®õEuY¡Ò£q¸‰Ó ‘$=Ú©HVÛ©‘vfÚÅb¶èî7À®mÍT-¯n„ŒŒ#¢OÂQö²†àUý\Æo*f>Áoá¯ÛÝÌ„íÐéôMɤ—rŠn´>ø@¥Ãqš©µŠƒ4iªžf¦Ó¬+¦ÊjBóq³ØmÙ­w‰×Ó$öQ“ †ãIQLšªO‚LN‚J³f8Åç’`µ{h?v‡åØh—6T^ßsF<Á+*ñŽOíWHœ¦ê‰gŠ0q­™’f$þ±»_n|ßÝ÷ÛÇÝÕñà•f Çi¦Ö"í—¦êifŠ0M¥â>ƒ£¹Ü,fŸºo¯EœVă}Ô$ˆáx¤D$¸pBTõI)ÂI SUs’³åmØ·¶qCK’šió¼ïpÀ¨…ë¥R‹á8µÔB„MÕSËajÂm ©sÔf¶2ƒÏúâÒ0¥þ?}1!¼}*„ŽCHA ÐT=„L†àžv @|7¶ƒ•vß×è¾·‚ŠsÆaFg”=r¢c,mïÆOA€q¬aR¨+:0:" .QÇpœrj<™¦êIgŠ k÷|ñ4Δõùÿ¸Åçy:b0t¸:"£$e41LëüDUÇ(W„ÁÊáŒ9ÊïÞ4g•ú¯/ c–‡7Kµ<†ã–§×XNSõ–gаå5gº°å˜Ï%gÜȼ-=\5•] ÇÙ¥FÂ%¨êÙeŠ0;÷¸Š:ÎÉçíjå2{h7‹U×[€ûƒýt¨±-åùìDWBåÃq©9 æASõ<2E˜‡.™n$ΣïÖÛÏ„C²gp̃.‹ '†ãpR§84U'S„ᨒñ²9…ãŽkÍæm‘….\5•] ÇÙ¥F"ìhªž]¦³såJèSvûåý|Õµ›ÇÝE­T ×K¥Ãqj©…5šª§–)ÂÔxÃx\¨˜?tGb›vµ¿ê ý` •îÃMœÖàa š¤G;•ƒÉ–†U:î†68kï¶—;"†ï,hžëãd1TáJ©¬b8+5¡ESõ¸2E—l ã5ŸðêgÃÉÅknŠƒ3D¾I8Êwb6|¼†¨êøæŠ0_Sûq˜ò]wû}{ß]7ßà •o Çù¦f+ðS»ˆªžo¦óµÄD)2¾»n³Xnîgþº.jü3\/•Z Ç©¥*°êU=µL¦VUþ–Ö)µ×¡òá8ßÔl ‰ ªz¾™"ÌW»‡+«Œïç¥"Á >rþòg”ÃUSÙÅpœ]j$RQiªž]¦³SšÕ*Y ž°üz‚2,ì£&A Ç“ %¢Áƒ©DUŸ™"œR3Qé“$°=ªÇ€s˜Æ}öÖKº. 0†ãS7€4U0S„ ÅÒõïñ!03÷„üð3 ^~>^4•܃K\Ôð|…$é±Må`jþîõ ÄæžßuUÇ'3¨8c8Î3õJSõD3Ei)™áÉe»ûævÁíë=H1¸DeÃqÖ©ñðíDUÏ:SY»4JQOYÜ2_ïæ9ÛÔãˆø“pÿ„…R~¢ªÃŸ+Âø`F%›œýêxÒfªª^Ÿt@ž¶R“#†ãÉ‘’‚§UDUŸ™"œµ`RÇÙ¢{â6ÎKîÚ3¨Hc8Ž4õ^[&ªz¤™"Œ´âÌÔ*Aê§HpÁ¿Ú®}p‰Ê:†ã¬Sã‘ÚNSõ¬3E˜µæL6 ê]ßífáÃÄWWÖz^PŽÑ8ÏÄ\xš&éiNå`˜ªdMW7Ü^ÁkGýŸwÔÁVjbÄp<3RRðí|DUŸ™"œ²ô¹“c?oû:g3œiqáÏJ<¡’á8ÙÔf ÷×4UO6S„ÉòÆå*%»[µßŽ+b³Õr¸ÄE±áª©ìb8Î.5RSk¢ªg—)Âìʆ)—Q[äÖzeØÕ?GË„à!5b8ž )ø]¢ªÏ„LÌÞ¸ŸÅE–nþ° [ÇÈYÕ˼ÝzðH3 GiN¬…Ï_UÍ\¦i S&®™tëÝ_µ³²Z\æ £ü¡RŽá8åÔr¸ç%ªzÊ™"L¹®YÓÄéS·Yœ}@Â5Œ©O¨dc8N6µ®ÆDUO6S„ÉVµÿX¿‘ì×nþxèfpä Ûoð‡J9†ã”SËáé2QÕSÎaÊÚ}hy×ڼ뷶Z_õq­` •îÃMœ†¦i’íT&«*¦•NÐ\qvG´fï¼÷g¸j*·ŽƒK„W*ˆª]¦³“+«¸Rá|¾i×]zlàîq3wßUÍ„ú_cÌøð–©ÆÇpÜøÔxOŸ¨êÏaã…fºŽS»m?ïìˆf·pÛ9aYº_^1iž[aÄH…k¤’Šá8©Ô6dxBSõ¤2E˜׬lâ²Á]ßu¯+½ÿñJï`+59b8ž))¤~ÒT}rdŠpr”ŠU¥™$ÇëÑœÖÁ%*ë޳NGf çTÿo@šâ endstream endobj 971 0 obj << /Length 4311 /Filter /FlateDecode >> stream xÚíËnÜȆ÷~ e'ÃÖ…·¬23È MâÌ&4¨nJfÔb÷ݾd‘gÉ.VVÕ¡O€Ll5/lIGþ›ÿW—SWò›¸ÿÃoŠø&“’*¿Ù>¿‰Çï¶7—üåo¸Ž‹úÀD~ÿöÍ·?&É Yüæíü¯Þînþ~ûã].oÏÍöTš»HJy[6»Ë?~~T¶uy¿¯.ßùc³«>ÞE"ûŸäêîoÿôæ÷o|"ñs‘Þ•ü&gEš*ý9ÓÕÃÃæ©úÔU¿ø`yÌÏÅK@‹áÓOMÅgÃq|ÐH£øhÊŸ£ìáS)“} Žo³¯šBž³,ÿjš^ “~:*&Žc‚†-`¢)L޲‡I&,‹3ˆé¹GÙÅ—’ ^„ð…Ù]óf2ƒH„£TgþâT‰ÊUWÙ£š –ÙŒj·m«ªÙtõ¿ÖFU›A¥jÃqªÐß$E©Ò” UGÙ£šqVdÉŒê©jŸ·Á6ï³ouÍ,†[»DÅmÃqÜÐx…Wbš²Áí({¸SÎd2K§¶>ç>ùVi²‚Dê•yM¶Rˇ ÇË$¥Ð™e¢²)޲W>’˜eÒf^uSŸêrlßמnO^Q¡Ûp:´_á}MÙ@w”=è*f<.ô®jO›íáù¸¯†Y®îÓíé©©øl8Ž™d(>š²Áç({øDÁTž¹øNÕÇÓknÙh—¨¸m8ޝЛ¦lp;Ênž³6çZàCS6|e—êSas¢§ª:ö@Ú§M¹=Õ﫵T¸É"PŽY‹‚ˆÊPWÙš§¬(l¾óTï÷Hw™dLeru#!¬hã¨%À†ã%²ÀûP¢²)޲W²”É̦Lö™Ï,)Ëò—T§1†úÑ© m8κ‰7ËDeÃÐQö¦ Ë›=—Ûö€,®}¨:yE…nÃqèÐ~…ŽuˆÊº£ìAOÆ¥t c;£Ö·î;ùCmÃqÐÐòÐ4eÚQö@+ÅÎè§js_¶ºú{¥I—ö Ô†ã@¡µJS6@e¨”,Ï‹9Pt%­³“KTÜ6Ç ÇW ‰Ê·£ìáîǦ"Ín3^Ú€gã"».àbí ± ÇC³†Q4eƒØQösÁR°ªëÊÇÀpXå,ÍV¾š„í!µ0Øp¼0@,J¢…¦l ƒ£ì†Xô 1;ìê‡Ouóø:¦þL ÐÆQK€ ÇKdŸ[ *›à(»%@œ©ØflÃ8zg6J¯óPÊä .GáÎlÆ·a•'¸®²7Y–ÙìíÐlšêÃx’ì5{³l´KTÜ6Ç Ç[s¢²Áí({¸³˜ñ$ áÞ|¨Oï6Çöð|<½´%‰é±¨|l8Î:µÀ‡¦lø8ÊŸ¤`‰´©×±l»jS6;dþkm­ö„ ׆ãp¡Í m-MÙÀu”=¸}¾\p›J«f7,võcSîW W{B…kÃq¸Ðfüè.QÙÀu”=¸2g¢°YÒñÐuõý¾úÜn›‚ùW:“‰!ÓOJEfÃqdÐ<| QÙ s”=d"cijsŸc[Ç=²u°:®h*cr†ŠØ†ãˆ¡Ùø¶G¢²Aì({ˆy¨2€¸nÆ3 CwÄ^çlóä¨ ÇBkñÅA¢²ê({@ã”)¤s÷N/ÕÍñ|Z Pí¨ ÇBkñ{¢²ê(»@E‘°<¶IQ[•»qwòæ¡ÞWëLŠ&OˆpA8 wf3žñ•'¸®²7OÏùnßúæ%‹3¾Ö¹d¬hû¨åÀ†ãåÁ+9QÙ”GÙ+™bIR€r°«»ã¾üô:‰¼ÜÌOÆQK€ ÇKdO"•M p”½0ìÔ‘9(—©íah»•6óÚ*\ŽÃ…6ã †De×Qöàö­·ä)„»/·2‹¼¾Í;“?TÐ6 -_hÇiÊ´£ìV‚¥… »ê´)úA3:‹õòMOMÅgÃq|ÐH|ŽŠ¨lð9Ê>)ú,K8ø–n ¼ÎÁÓä¨ ÇBkñ墲ê({@g`£Æ…çâÙýkÙí¬ŸœJÐDã•ø!}š¬Á7—õèñ˜å"wðá«È‰´'T°6' mÆÏÞ• [GÙƒÇLÄ0'*äÝ+¾Uc2ƒJÕ†ãT¡¿ =(MÙPu”]ªÒ÷åþŒ]¯Q\ç… Ãä ‘,GÉÎl“%ªd]Å,½ojØ.A;\ȮҌÓ{eÿzA ?[Ìú^.êƒÍ Ò]U¶Û;Qܾ‹êÇæÐVѶìB'dÿ«j '´ ¿D²Œ\×m4^ .!£<8ýI“‹Ã\.\Ï•d|zkGWí¢ËÛï"©äíÏq—ß ÿ·÷ß\¾÷þšë¯£¿fŒõá<”8]nŠþU‹ÆG? Ç AÇDMudä(†!IÑ×k>A:EÃåù–ÐÑïÂΧ SI±Þqç䕾 ÇéC"¸žDTé/(øB°x:°Ø½; íð‡¨Üï£ú!*ŸïD~{_?žçÐm(}OŸÈk9†ohG¨Xm8ŽšŒ´»4Õë‚¢ÁÊ9SÓ›}]¬çæùpõßÙÕ?Ç\U»à ׈V»BEkÃq´Ðh-MuD» hÐÆ1Ë·ÆND«¾‡Ðs¿ýh++®Žª6„JÕ†ãT¡ÇUšêHuAq¢*û'L'üT#=mTí¢ð»"û1‘¸š ‹´“+D´ E;3:Œ–¨: uƒ –Ì –™>vdÛÕQWýr®šme3­pšUHVðÈCªÍ "µá8R诮vUG¤ŽbiZ01]ÌÒÊö=Ýï¢ñÊW˜:¼Œ^pº`àúO΋xõµñüb•¢‰Æ!G‘úG’Îå‚y¡7­æqØï0B„©,’Ì ¯Òäüº§}'{ˆ€A8Jxæx¸šUÆ®b8×å©`*ÓYìO”­0ïëhû¼3‹9}Û[EÝ© ŸKê ‚¸òr ò~°@/6/:faúŸ¨:–G1\ÙeÆÒé¢Éžpµ«O=Ñžò®‚þ‡èŸWÕÙNÏM¥gÃqzÐÊðL?Qu¤· hà‰ŒÅÓ{izxuÓÙµÖZ=³~Ð)Wµ[m²ŠÊۆ㼡û<ÜjÓTGÞ Š†7OYRäïñe©ÑpCk¼¯3/øë…Á }¤Žˆ) KªÿMöJG endstream endobj 786 0 obj << /Type /ObjStm /N 100 /First 909 /Length 2516 /Filter /FlateDecode >> stream xÚµ[K«\ÇÞϯèe²9·ëÕ]Â`Ç(›ŒäE¡…b_‚‰Ñ ² οÏWsJw&a†€tz!ºçÜÓõõ£ž}> sëmº4Í'52üœ£…L´³Q7FÇÑpt¢{Žè$ óüɹÑ`=MǨ©ùF¹å;>£7îøû jÌ]ÐáÆBŽ4VQt´±å, ÇèŒÆÀ9͘=ò‰7鄉E4Á„š÷Þ„•Ñ¡&bù„›èTt°8ó|¢MfÏ'ÖĹ£3š„Œ“÷Ù´kà‰7¥aèDSÆâœzS²55`ljàþÞ×ïß?AÔ›³Ïɹ¤ÏÙ[¯v_H:œ½¥j¹Úzßë}¯÷£Þz?ê}ø™½Õj­ÚÂ’%/vyé`ö–ªåj¥Z­ÖªÕÎj½Ú’G%J•<*yTò¨äQÉ£’G%¯:ÉÞ–<.y\ò¸äqÉã’Ç%K—<)y¥#é@ö¶äIÉ“’'%OJž”<)yZò´äiÉÓ’§%OKž–<-yZò´äYɳ’g%ÏJž•<+yVò¬äYɳ’7JÞ(y£ä’7vyÿcgý==¼þõïÏ¿ÿôÓûž¾yúðãã‡]÷ûÛ4`Y¼¥ÏÃ7¸¬Æ1·tcŽçÀ{_Ÿ­úu{øãÓ÷O ¾àwñû´Îχô¹¥F óÍa)ÏÃ6¬ô&$ƒ0õ ÏlcŠÛxú…xŸ¶Ur[é‚©ºMó%ÛZ}³Ë*-0]yŽæ} Xò3b>Ûkd>sÄÖåj•snl·Õ•å L‹m\-sŒm®]¦Æ†~Á´±‘ÉZÌ.П+ÌÇMLêÇ`jÐFqñ>X÷е˜Îg:ÿ Óa(Lk1¡¶ÈÏž!¡µ>y OÐÚNKÑK‘¹S}WA¡¶‹Ž³ÜžÂÓÒ¸R!…©ÈRÇ'gO{qîW{ç4é(H‡¡ÌËÎ ”–ô¶¯%?sô­_/sbÙÂk×)pÛøÁ;™ÁQˆ dWq“á‚æˆrœ§yR§9|­«åIÛÕ*'çڀ¬›ØÅë±ð&¼x•$›Ž‹1vV—z=”Õ[V6ϘDJ÷Û˜v &Áû¡èz†ì}Ó¥fBPÙ¼„ø„H3±¹ÔT¶Ï‹Ò"#Bäk7–eW¡š„P¬ÜÁ¤/Ã4âmº¡æ‚£Í‹8”ÉYEÈ’5>ãÁ±³óއlöN’Ç~œx· Aç5šú 'nf‡SƒÒÆZ8F5˾ã‰a¥¶ÄÃ=ãÑDN5wB”¥E&!ˆY¦Ðu,M[È‚ëŽB7¾óä¨Ó£9¶Þ÷@KŽ 8çÚíÌ軲ÐD ¼sÛy”ñÒˆ¤ œñGx÷¥Ž“P(ŒŠëdùÉC—;‰n}ìÆ@È#\ÖÆõ¼!7¯óA[{E(˜j}È#|í uÞíÆNÔ7¹sùÿßÖ÷m{“„å/bJ^"¯‰’W ÊÏ$GÆ>µkrd¦ŸGŽLÊéNB+Û(Û(Û(Û,ÒÛ¬÷‹TéEªô"Uz‘*½H•^¤J/R¥{‘ÞŠ‰ê^ò¼äéÒ‹téEºô"]z‘.½H—^¤K¯ÍöÚh/Ò¥éÒ‹téEºŒ"]F‘.£H—Q¤Ë(Òeé2ŠtEºŒ"]F‘.£H—Q¤Ë(Òeé2ŠtEºŒ"]F‘.£H—QºEºŒ"]F‘.£H—Q¤Ë(Òeé2ŠtEºŒ"]F‘.£H—Q¤Ë(Òeé2ŠtEºŒ"]F‘.£H—Q¤Ë(Òeé2ŠtEºŒ"]F‘.£H—Q¤Ë(Òeé2ŠtEºŒ"]F‘.£H—Q¤Ë(Òeé2ŠtEºŒ"]F‘.£H—Q¤Ë(ýÒÿ·°=ó§+&¢¾Ý¹¬°ƒ>t޼ä+†""Ì5‰Ô3æ0„Ž+®© zÐ’Ï-²©nq‰ `òšKß ÙTQŽ+Â)£<œk1‰éáô\¾­Ý[d=ÿÏÌ'LAt¾óâ°uR~€¹R[Î0käg̼YÐ 3rôd%ý¿’ê?B†n endstream endobj 978 0 obj << /Length 435 /Filter /FlateDecode >> stream xÚå”MOÂ0Çïû=n‡–¾¿xԈф‹YLŒ3‘ˆƒLLäÛÛ­“•ÍÎ%†C·õÿ¼ðüþ-Øþ0(ÆáLß"\}-À=\_D¤ÖA+„žò4Fc!ÁÈ`C@úì§Jgà.'šÅùt»\ç dŒÅY>s7åVV,³§ÕÜ}¹ÌgóÏR‰íŽÉCz§ûò‚Ò}–ÊN£JÂã’–jƒ3@jŽ” ®ÙÛ²âhÌÐÈHÉKF\ÚŒÄæ"ÌÉvYþjæ,¾ÇŸÁ]ˆ Õ^$WHÛÌØ$(âzðF~ß;Þ€BªíPì¥ÂHÛñ÷cüVCO^¡¤Þ˜Û)«iSÖ©lÂÔ ­\«;•¼aÍ.%FL™Æp•½oaV,J‡ÐÊ!ˆœ]Ö…['ðñgË¢‘Ôæ¯x&¯þÏCá5ò0<Œá «¼‡×ªÜÇ=ÕÚƒ—o_¾Ù¹Ó=IH ƒGÜ”·‚8¾#[Ïc(ØFë¸ì°Ê{°­Ê°Ì .”v³ÞxPC<¥°aú\Ù!Ôsj€F6€¢çZî«ü­ïÄï endstream endobj 973 0 obj << /Type /ObjStm /N 100 /First 901 /Length 2170 /Filter /FlateDecode >> stream xÚµZKܸ¾÷¯à1¹°YV±cÝÎ% {I ï Xd1Øc`óïó•¤iµ‘é`‹ÀŒÄ–ÈúXÖƒâðQZ…ÈÊ­°0îTDî\Ôw)ïÆÐb‘ýz”ý¬g?/ÔTOc êùÙ14Z!Áeê ƒƒ ctH!GC .hôBa†n‰^˜F L-çQX1Éh˜lÇ,£QaÃ4£qaÇ<£Iá$M‹4"4zL +‚ñhxéãm€YÏ'Qð JP+â)ƒ1ÌJ`ªAR´u “%:õ¢ Á&§ŠIyÑNv Ÿäð(êŠáÜŠˆj@ìAô–SeȘ¬¥ §d{éªÀÂÞ; À@7ë§zwO‚Í@ê!­XKtà%ËÄ ,‘b’¨Ot¤E4¬˜è€7ÁSÈ(–Ú ‰â AmÅ ¥âÌÙàâb9º*耨÷Ž9ã‡[ŠE­€è€m‡òO‘Õ ™P(VR¢Ã,8•Ò© `@²²CÖÐSP`{˜ggXƒìœÙ9ÕI ÜS ÉiO‚¹°D Ü(ç„ÇÆ9¿’¨¼€OÉþÓ fÜ ¬pØh#mX#Z)"O#çäÍs_FÀÞa [§fÉ&KÍSº¹¬ÚHPOÊ Ì“*Xd”¤O/^œÎ?þû_wåüýýýÃãéüöËß—ßúùþŸ§óŸ~ºûTÞ5,Õöþt~s÷ñ±¼ãáuÀ{PM!rxmi1j„£ß÷åÅ‹r~[Î|øñ¡œ_–ßÉø}ùî»þ¾s´jX Ì1ªx³ÛA˜5 · ¦{õ.ÏbêQ|ö¨º`šWXÅó˜ý L:ú•>»Uxˆç1’­ŒJt…©½Â©?¯O?“G5ºÒ§ôÊö¼ ©„IV‡_a²VÓ6Da6«Ü¯lˆwžŠ©Ñ«ë‚Ù¤êÔ•‚¨V‰w ÁÕ}LÕ&Bj•q…9¸R·¹’5­™]0j—²=h¥h—Jz…i­"ÞÍÅT®v ÒÞ*?ï„ä(H¡ºä{O©ÄÔ@¦ŒàéW&ÄQ›ÚÜ¥Bž}wBJ£*ß0!9³µÚäÊ„ž·&ÄÇ`"ë¯pòLÁnx„v¤#G@†„Wê}L­b§í&„<¨"¯ž‹Ù½vÝMH¬W!+[µše˳#vÆó&ÔÊ…D;c÷B¢ˆsÓa„Nß½B§Ž©)ŸP¯­_™s<7IÓªreBÄ•›N ØŠ¥±C6ÄÎÁS­–bçØ-ˆá”Âæré¶[£XS}-Õ¬½/˜(–œæÆ1$µUxW'£Xj1Ù‚´Uo»bEìô¹Nˆ‘—PìqŒÏûTÿÎŒÐé{C}L­¯¹!vvÝ1Q+Y³©u'êká³!vªN½ÇnB„ZIŒ§ê“|Ô6v¢¡Õu®hÍjî€] Q,ÍM…P|Õ¡» ‘!vÆdÒ^©í^ˆ:b§ÏM…H;¯Š@B±Ä§æÄ¯³2‚W2™ZI…³Û!Q,µ6· £ÆÕhd„b Yü”@Ö‘òøèÅP%ŒÜug.†¥Çœ]¨ ž;<ÎXñFîMqx8ËŒvcÏ3›³Q{Áƒ`ÚØ³\SÆÀTV8,~Ž9±ù‚'HÖŸ´§T粇u’r…ËLä†öÃÃ}cnIB¦!0¬væ¹Ì?&‹'¼üVb+\Gê¡Lsá榻üD2t2{­hH8ØŸçNâ 4äû±)/?ŒØ 冧H7¸î•x2{2ª?)O­vÌCe+x[ýXoZen¡(…cø§¹,nøM:Èo*âJ˜.WÅM> .wæe ±Še1nìÁñA1HyØÖÅ ¹,„犓¨‚ÇàÉ&«O{òDÅ‚— cÌåO{º¬æ‰…^{›Ì_~š§Õ^dävø û<(î弯ºÚsûýÖŽÐQö)ÈÉÜ7þ¤Á‘úÔõ'°Ï<³àamÐlþ!çÜ䉴¬Ç\þ–MYZí“smÜp×Ìá!œ7³/?®šM•' "¯ëóÃj<ýø )umºá ×vc'ø0> stream xÚŒ÷PZÚŠâîî4îîÜÝÝwwwÁ‚»{p Ü=ÁÝ î\Μ™É™ÿ½ª{‹*èõùÚ{}» %Ua3 „ƒ½+ #3/@T^D‹…ÀÌÌÆÈÌÌ GA¡fåj üŽBèìbå`ÏûQg ±ë‡MÌØõ#PÞÁ ãf `a°pò²pñ23X™™yþèàÌ 3v·2È3dì.p¢Ž^ÎV–®}þó@mJ`ááá¢ÿW:@Øèlejl7vµÚ}t45¶¨:˜Z]½þ§5¿¥««#/“‡‡£± £ƒ³… =ÀÃÊÕ t:»ÍQ(ÛÿMŽ fiåò·CÕÁÜÕÃØø0ØZ™í]>RÜì̀΀îUi9€¢#Ðþï`¹¿èÿ> #ËËý;û¯BVöÿJ665u°s4¶÷²²·˜[ÙŠrŒ®ž®ôc{³¿m]>òÝ­lM>þ5º1@BX`üÁðßü\L­]]]¬lÿâÈôW™c·7u°³Ú»ºÀý5Ÿ˜•3Ðôãܽ˜þ}¹6öö>ÿAæVöfæÑ0ssdR··rrJ‹ý;æÃ÷Çftp033sqò€N §©%Ó_ Ô¼ÿr²üeþààçãèà0ÿ ô³2~üóq1v\Ý€~>ÿtü/‚ca˜Y™ºL€Vöpª˜æãûw¶òè2ÈÀü×Ï?é(ÌÌÁÞÖëOø¿®˜IZJBYC“îß”ÿëqðø0p°X9X,,l<.f€ßÿÖQ2¶ú÷Ìr¥íÍ<ûqNÿÙýß þ÷‚Ðþ·–‚Çrê?B×cæ`6ýøÅòÿYîÿJùÿ§ò¿ªü¿ ýÿN$áfkû/?õßÿ?~c;+[¯G|(×Íõc ä>vÁþÿ†jÿ^][³ÿë“v5þØa{ Ûÿ£•‹„•'ÐLÉÊÕÔòo¹ümWÿkÑl­ìJ.V=-fæÿãûØ.S›çÃåC“ÿr?–ç[ŠÛ›:˜ýµe¬œcggc/8æ)±rp|X>ÖÑ èù/˜í\?RäüæÎpÝ('€Iø/Ó߈À$òq˜Dÿ n“ØÄ`ÿ/âb0IüA,&É?ˆÀ$õ±}õúè.û}t—ûƒ>ºËÿAÝþ îŠÿEÜÝ•þ îÊÐGw•?裻êÄ`Rûƒ>fQÿƒ>fÑøƒ>fÑüƒ>ºkÿñ|øŒÿ 9Mþ HÓÿ"ŽŸ©ƒíÇUÿÇÂÎþ—ÅÎîOþ_`2ûü`üSácª¿å÷'àƒ ùŸ€‚æVîÿÈøËíàæü„‹À,ÿ?NÁêðƒœÍ?àÛÀzv ËÇè¸q|¤Úhøþ.¸$;üûcTÇ?ïƒÃ?ƒåcÖ0aù˜ÕåO¿¿Ðø >Â]>žÑ? 5ÿÝÇcÄäjé üÇa}põpøG·Àúîÿ€ <þ@Öì4cý(ïõ‡ÎGª7ÐùïÚÿ³Á¦nÎÎßcÿzc?Öû?ø__š@ 'ÐneÑÁ”/Ôº!´ó¡N߃aoR`ŽbO3†ÁgŹËí :•¦6;xÃùN8uä;ʯqê[¡UâWŸ“¶&èˆödåŽgßÃD•™½¸åi¬¡©¢áÆABX5¡}ßW'_ ð6Њ<'7n$¥ôIÏÆÁŠŸãá‹{Êûµœ²ð/³ ŸÕcõ‚Jç)òM¾.àB¹2ÂТ]z"ÏßÞÍ¡åN½Ë$ÒÁù~f+öÑÙd{\ð^«RcuéÅ%ÇÕÁ!¿EŸ¡ô9L“Á^ò)+‰— )1'4Xü&Ø…lìÄ^OÒ³Â_16µ5†sd$Z¼3oª¼M!2rd«šÛƒ–×ÈU:ûÊbXç¢Ü}ðŠåS=ŸíòiÈÆõL‰5"£?É–(ô–úT÷aÄaÚç2nÁÐ ÿ,USÒ{€Pâ2«I¾«nŸ±'âY7×Ão¿©)I{˜Ý5í3Aµi‚2ãQK’\>(£³Íá¡´wAPüòÏ3`²Öãõ2=ÞHïý 9'¦!ŸV ø÷…À6—œÔöÜB—Í*t3q™Ö¼2}öc²ÏÑd¬ªuº)'ƒ_ELÐ>WɃ;„6pÕ–¥EPáµFXÜ”Þ+òN6Í”ÏF™Պ˜%ùÎHWLŸ‡IxDÊ#×TNÉÄÄ.X¾V²i&öF1ŽO_÷È0bq.ÕÌò§«áÊœ’6 †:ãPãV)ÿÀÌICØ!Ëü¦cÝwgY0ÒL—®þæQûþ{ñ…©ØTóKˆXúWÜ2nÐÑ'•!j=ä²ÐöIôˆ•ÙžÌrÇKôd’iRÂ_×<±*.+¿òì_ út'ÞÀ0 hÝŒQX<(»f†nÚÞMö ò• 1†Ú´¾šŒyÍUÙ4ÇæZ„ó‚Ö–|5·ûâËEÅ“FÌÄ*’Ç ã,J.ö¢ÈØ£_³=ƒÐôítcئûlƒluc¸?¸má-O !Ï l;0„ía6Œ3÷šƒ¿Ý)ôþ@œïá½Ì/ÕÍ ŸÈ5ã¶2Å\̰~}–gÝ5çp®‘‹¿æ-ÄÙm,~Ú¬îžðß|3ÍC[’7‚-ÛŒB'1ç1T:®õƒ‘(*¿«„\ÞOGOmI‡ÞƒaOî$äö‚©ÃÐÉàœA>âÚ â"ð ÒKù×Tƒª Öú£¢­ûÓ@ð`§Iæ2`†ÒMÍG@}a}èL°Ë´ÚœüÊâ\ŸZ~z3(¨Sy>¾þi*n‚{[IÔî0ŠÌ(¦t3“YÉÙŽŸ˜òÈSâ.`)Þk¨E=ä•®ðM̓Wz€mƱÈ_°®Å^ÙÁN‰ %šU'N$sWÙý Eoy^_+§=¨©&ëeÅ–¶u~ŸW› ™AÀq„ë.µU®ý¹éDzNÎQÿƶ··UÑhf,E¼LAO zŒp]¿ü>ç#)OÒ]Bó°iøºS•?Û.žHÖ4·l#rðƒz9ÑmíWþFœ•iJ >„‚Ýw¿·frž^XÍÑ!TB¡a¯3_¤StÔ2Œtõp¤éÆ«èó[扮{¤wÿ~fWFOñ°4é zd³÷ nÖE.¶;õ¾OUÁ| 'œ{×Ïc÷ApôVaÒ|¢Ò†ëæ4ëY]’`>ÊLXe:¥ÛÉdæ]y‘^´ª H~wQV’œÆß@±·ÈíÂÝùQ¼u”ñ 䘎Uœ2ïH~Òr¸É)vN ˜LøŸ¿®ÉÀ¾ŠKâçø] ¯†àíRÚtæç&g”&¿XÑMÊ•#Û=~~Ðqµ¾Æí¥ˆñ¹ºJ(òÍs7¢!úÎ(N@À–¿²Ÿ*KžŠ‹Qx›Ñ  g hÈL›]séÿ*†Ý±9§ò•\ü] ±%pÜ´º’õ41„"èÅKLO¾ U•GjùRùsçÂWgóÉRƒ=ŽˆT²wLÝ0í©&Ì,Ù]Õb‚&û¶Œjy<­gznÊB.cÄ!3ò·/k©ð®LšhAË^S==8¥0×Uì­Ê²>4+ ašbf‚xÀãU,Ç•T<«P ²R’Ü»I¼oÕ™#$)gìg$9b%­± o¤’\pÓÙ{¿÷ 3 l¹eYsEV䵚 íMµÂ|“zB-Cð½Ë9 7öÊ A¥²Í+VÍÆK°j³Aêlag&˜!…æ±çÙ­®×öÉìv—½ù¨Õ»ÜTÎ%"ëAMJ—²Ê}ï%l?ö“f”ÂCŒ<&m;b¤ÕŹœùµ¹Äu©­w»a­ÑÀM¬QpÙ˜{¾Bè¦ YµŒ½úIN°D¿u-˜»wíp$ûe•TêëT-Ò6w ¾­<¸ AÉ_¼™§ôvŠ\¡#t•¿àµì=’ÔZ ²CËüUÞoùX¼¶éôë‚Ü é!É)­9] ¨ºpTâÔ(ý'6´ÞO®´ßœdø=ïÆ$×Ñ‘;dÃèϯð#©#nÅØ1&­LÉ’=¿ÈRJ÷zåzF&[; äwÎÝ4Ÿ˜Jðîyâø³ÐEÔQŽOV¸jó8ÊwpDZvT¤Å<Ƥ8$è;”„ž¨,û¥'UNé6©iá§± –ÎðϵkRº5™»ÆàíªîB³…VG-³^d¯f™ï`ßÇ.ÂQ(\F7ü³ôÀQsúÔq«p¼{WƬíEŸfÐýò ËÛÛ‘Ì]ÌjàÊ·­zt1Þç>\é–lŸÕˆ6︑AíÌÿÕ}R<. ÊoÔvÇðéüVŸáú JÒO•œÈØá~Ëa©ÅÆêÂ# åµö‹WˆÄqzèºc+F[ò€Ÿ4íz¶ˆè” ×§LEÃPÈNö/h/¼Û©õ&âyú¡,-³—&ô!¤²Ìf& Æxí§¸ïã¹ëæì’ãU6IÔ>ý¼¿à`2šßÖõ€2ß–MðRÇLƒ>aÖ羌[ŽÜ»Ð¡MD? 6»då ©6`=$¤7v-ó²­ÿ=3îüÖFÑt%Á†ûbRœ[¼CY ï·ü³l˜-WÌfØÒè³^®³›™àÆo¾{«6a|Ãîó(L8 Ù S›[…¬ù˜b{£‚'÷%ÌÖÌÔŸI»ädgˆœ3>o0/•Û5-zî·ê§š„ð=¶çpžºMó(gaÖœþÅh¢ðó˜¿H“’ llE.¼ÛQ¼ÓLSØ·h.Hd+2`È£dxUŒ`Ìø_ë8u•¯[I„‘—䊎©eÑz†T ê?W¤ÑÜ[å‚‚º²ëd¥i€ÌëÛíEiÌ$®*>'ÖÜvÒX€X½µÁ]Q0€É¨åéš×©iqÍ31â…™F`ÅÁ¨CDÒß[r]p˰OÀzòðîŒ7nY¿Ù9»ßf)ÝÄ‘! &åÁ˜z^uìÞw”ŒÉõ·äÂ{U†W$‡ÔÝLq Ϩ1ù˜Ÿ(‹þö«4í…^ºó_Þqn<"©gïxÍI¸íˆ5W*tøvØ#?Gg@EŸŽtÎiÈôSÓÇrybäb„)j&óxÜú QÕoöíL&Â~Æ%ƒºæK\y]í7îÝþ¦¼ð¹öPÖ¥Ó‰–I*pj…£kÛ‚¿Ø±³§ß°–·7—F°ƒ/S‘$¬U‡¨nÒFªåþžù †]VøþU%š_ H„¤b[áS  fôÅÕ’0ãM¯¿Òð÷/ŸöÈ™L v(LUš‚·ì;I hCv®2óy00¸£‰) »ª}=ÎdiA ¦<§…)P–ºIûÞ>†Ò½/2—7“Âóƒ&˜a«B_VW~ç¬Q÷¸U$_z œ¾¼:ˆïç"ÎCžÑ% ódÆAÝy…ϸÕññ þܳNÌŠƒpÆ=öƒªE¶©oÂИ ѿ# ÁdçPVs¾òD=Ï;ü ô® fTákxÁ½4`xn{f+ØòrP½eºSÞ IÇd+’7ãîvϰŸß­™­‰‰®iÚá?~…û)໽Y ¨9_I•+šJ/†û,,l¨‰Öax˜kk«\ŽÎù eåP”$Áߘ€Ç6Ÿñ¢þ¶¶­@µ® eà1‰³Óï“E)^Ë[`#@Ž:ÂÿI RVÿMÚ·8.×a5«Ö\¶ÜÊÆ³îÝg×Ü €Ÿc{Ziô·;³S)d(ø¶ãÜ!Uâ’¶µú¢SºWUÁ¡ÿÖ§]ÀOÒ‚iI3è÷Í2ו¬°ýÎö3hTw#Â{i Uz¢ýZÚ‘Fh6¡wÝÃéð9ý¬v~¹÷° Oü;7ˆä‚.Ê,:’yS©—P —–nJ (ô‘š&g‡ŒpÙ³ä­ Ó<¹¿(aIÓ¶_âN „¼l#¼ð7Þ»<Üî>ÄÄD?Œñ åüuÞÕX¬äoJ–ªÐX“û«îm¯™ê…V Ü•8«Mœú÷)—ÒãýUÉ!nÈa´™*ü}WÛ-¤¼Œà'þ“0”ÕÏá+Íj°) rø <’þtÆ“]ÆùLOKáÔMpïp=à£sïÎ<–­SÃû„Û…ö]³ð²þü¿Æ<ӷݼŒÈ~+›bsOÛ?’§é–¯nóR×í“7;8;QîÎx[7oŠ‚žnöà][#C¢Ô?”oçË¢ýÆ™xû²m ÿ}ÖëYÒ¬íVŽ ”“¤‚HvÝq3‘>sÇÞ±‹HÎ_SŒÎ×eÔLS’³¦Á‹Ú¤Z‹RV²¸làœkæ€mÁ %‘ÔqR8Mæz *u‹“Ñ4^Lvtì—C°NÉ4_¡‡‰çuç VÉKèwM&»Ôï£=Cø_Ä7;Y\/°0D±ÝõáØbä.é 8ï—§î-s»IšT¤7åÔZK°ƒŸX½‚,aС+æk!"õMjÜùº¶8¢nê·Û½ãðÛw³›ÛìP:§OØr¨é YáËnbC3–nhN²ô1ž£\Ób8Ò!@‘iäLlƒ2å tm1['’Âúw±º!ˆ¡ ü˜öjaCx<Úî0‘ŠDÕøAÂS§´¨º»î§^ hÛUïQÔ\è×¶10è+„ c,^´$ jò8ZôëÛÉåQ¾V5Ïär©S}rŒ ò¿´ `c9Ûš»¤TñE"çë{ß÷!þ]êF<à„ ­SM.¬T:ëë,†™pBq³ò®£¦ÿ+¦88Ÿ˜\+"M>Æ<\)'©š¶Q%. ŒÀͼ=KÇ2: Tûì"ÞO-‡¤ˆ¥…FvI‰qDPÃîd&ÝÙ¢ç÷výýc_¨Åå©›!n8ŠcÄ.! \s'&G¡¿Û ‹ ãÆ™ñIµõ³™ƒÚäã ÊeýÍÝá·º5ÝÃ@¡=”dÜV;°™|Æéí?'`IF?§üŽB¹5,ovµæxP©:S­u·Þç¯ÝšIè8Ý-«•_ýô3f×»dˆÌáèP},ò{ºÖR ZÙÌûœSfM:ìlå1q¡ZN‰Q§žðÛ’ÛZNx•Žu sÊœäð:È„kÛÌyºÎï<¤ï’ lfʤ,'/yüÆÖÆïenƒ“§~”C_î®Ð/ õ=üÓÜá;=^,r¦W~PÀÅÏ~;!ælï( îù‚ä‡|¢i}ЀÚ<ÈR„~f¼âö¹ú6öõ®õ×ÄZXX3mî`ŠOÝææNèeb“Lg­R樬.ÂÃù|¤Ï§µÓ´e§•›|ôãO-Ï@'Ì ±‹ùÁKÀb UHASTN¹~Eß§ÂÀk$ÚÀÒ°xqªcR©´óGMeCí¾lwDߥËh›B8ë~Ž ërƒïbçgôˆ¶j… ðŒwtÖF¢Õ×sžõ“×ÚKµÚElmnT?Ÿ|Y ÒÝYrÐì´;µÈGœÌX È)%U ÷yM;5šÐ5Ïʤ&Ëç¹ÆãôÜÿ3§€‘öëê÷u4'BQ'½ñÝ4øn-ѾYZqw’#ŽËsDtϵá¡X;0¥óÕMÓ35Ü—%ækÛ'¦¯\c=4•{‘ ,Lªy­þ¾øîóf¸¦±¼%ÊBΈ뱨Óf) ´·F“A#q oÌók]r|Ï3,î‰Ò(ßZ‹ìnÑÎ…¸¾™Â.áÚÃ5ÞÈ£’{EÒi ÒCÉY®ºiÔ36“%†ÌÙä³…Õ²,sqEiÖêˆlV%õ;ŒÕZì=w}cÍ]qÏ•SNÚÔŽì Ç—Ýû–=*›ãÏW½×g?«aÅÝWÙ™n™°–²­öÞ êÉ£}­º! ‰Ià¶áÒÊJPáé+&ZíûÒ#«TJµ³[H£Våkjqgáž i))ÀíËHàE¨ùår×Ågiã k…½­Užý25ÌðF{¢Qœ±ƒ!‹¾n‘ÒHäº<ê9å6Q»~˸˜4épbøÅe¥3•¹àÁE¤Qù‹\)ñ¤DßI°\‡\UÞ8vÙK†¹ðÉC§•‡Úo†y™mòŽ´¾Ì݉½ Òȶ }Vzæ0„öÞÉDPþ¶37=’©í#_RÊŽÆ×[ŒOí!èîQAŽqL¶×vèFÑ®L‡RNZÀÏ×fQ¬j©áR@‡d\Sö3$~ ”b:®ËÕF˜ d>êÎó&mÜwÑGô@rÂǹu‚¾2 9¤Â’r’×Úje«ÿ‹›Ù¡Î0hƒàÑŒ¶†UÆ…Öü]Öw/íé„þˆx£ÒOWƒª,"(¼µ=S¢ðï+Íû¢Ô›pìΗÇÛ¯1®×ÊܼϷ4¢n7>É©Ùà sœPñq¸d«’aÕ¬QâÙVkŒŸôdå.ÜcëêùMÉ .œN´—°GtÇ!×ï)ÎÄPÓ6¯}Q‡ËôeÅ.gõø$ù ót¯DêF…o™BGö€Î¨éR 6©N­v¼51Y'NÊ®^sz¯M"z:¦‡6W*`ÓÅ6›|Oߪñ%jPSÖ·CÔ0ñ|S‚H²XP-'ï)¸Ðä¾üÑ…ÛôưÁhŽ2üiþè‡N°¢J1ØÚüÏ2Œ«‘ÁŽÜK\8(¡¹iäÈ‚BL”_èBmÛõ¢i»¨!¤3˜+(yëÆ…r²j…ÏA5ú|¦þËf“€Nü5 óZVR]ëÖŽ]¸®ü¼²yuåe°À )9Ly¢áð+5´öå“ìíp†S6P¬5Øû)½»·™Îš¸!½pŸU¸¬ Kß¿Ûýru0.5ë­w¬¦tBÈ›E*1Ó8p~ ¤–Yæi’SÙvò¼-9rÓm‚O | ŒÞúl×Í8®C¤³â§TŸ%ÏÕ3â›Cã‚ûXu¹Æ–×mÇ;~v™èIÎi1~x˜ÊÀ;Üø¤—‰€Ÿ\‹¬Õ,Šâ Ûà¨$ŸÑ(=½ñh‡~k‡ ¥0$‚~öÚÎ!'Höu'x`¤a N6P—Vxrß:ðå( ¶0>ݹiŠy³`òIfUŽ&ÿÂÄk倆$.b¼l¸Ä±;^fKºAà˨ïRë&Výªô**wÓ¿“hîF|cíf;Â5XRz•„¾&†w,sVÜ7ߢ—`o¬!|-Ø‹r î’¶|f\osª£}ã´¢ B‚V´òë!½g.‘VK´ut˜£‹U`9µN=ø)"JÉ`ÿðrpé}ie™¸©óá Ì{?ðÒaØaôêHý»ò«LhÀÂNôta@ÿìºK®;I|vCÇù¹p§’ͯ6Å¥÷ΓIú"Tõ¸`&Ô6âx_Í—xôåžnb=Ê&™ž“æ§0€’`"…Ò ÖØC¥È ¸$D(YÔMüûÒ‹Ž¡æ„Ž~÷ @vÓžh:É»!3¹SEJ f»!ÓYÆ…°ÿ&ÍaUŒ<ܱ§œ­M¤ jhqWi(Û;4þ]“Qo¡ØÅ ~û©G“¨ˆ0”gŠøÈÞàÓa?;Ét.‡íç{ãŠËšñ#?æÉõ§»âب^ñØýzükjï‚­ÈJ‡Œ2ãéa2Òш¬Ò=z0–LÑÛ­sˆSRð³}{ æAtÐL–Æž»%3á swJgpLõ¢q–Ÿ3g2¦Äïg#÷îö¶EAu‚ÃÖMÒ%tlˆÿ*R†¾uù»°Á[LA7ÙºGJ_ S"›FϱÄUŸ½b+ô‹Qô‹!ƤQþ§üFç´UÕ¢ÿéãÉ{2¥Ð!»9ˆæ´Š`~'‰N¼ïªÒ·i?8m)quо†ÈCý áB®Y³ ûcQÓdª© ¬Ú#WŠºÃ@z-GTÑ ­/£žTYBî×¶=芸nôä7Ûu-r‡Z­Þ—sÕáB'vž!\fŸ2ЬÓÄuå½i¹öžÈsÐ’å·7T­~½yDÍ ¨)ûÖ+ËþÎçV·۽¡ÂAr+6¢‹^;²`ŠæN¦ÙîÑÝr™™úª;rœj;vŒzqƒÕcËgÈé/[ÖeBŒZÛž3Í(|>bQü–øXÿûÎ~‚î•j“·1 ®_#«ùëÎŒ9PDO¡ºšªwýÛX0qúÑi÷ú©²64‚œ;¸{¶–ý¥)u8v’ â á‚•"Þ–K¥Õ¨¿Ò}~UF5• X,3¦TÖaÚ¨g¹‹2(BÆh¥_ždïº2Ò¨+(ÚÞÚhÑ÷Ë“Ôèìü.Ôè2¤ç¡ñ¬øú)²I0ókø T>‘™•ªP\X>Ý®¿V¸žüǘ<`-‰âEƒ ‡dÔ^¼Ãƒú»ÅÑΉ”n<¦@–XÚï>eT5«+ûoF_WQii(ˮ튷ŽðÕÛt>IóQåÿ”].!3tñý^üQêÖh©eV¨ì:-ÚmI8`Œ\òù˜¢ó™(.4×m)³ñìx“òܶ™Ó̹tèºA`ðÇð;¨»Ì+Ý6™ËÇ=o I ­s>¸V}ò²¬ãƒ"®õß|#¯ÀF©®þ¨hàu¢c«|lAŠIž“ D|™*+«g+ªl9³õZŠ>²æW_Gœ_Ÿab©ÙÞfÕ· h6Q¿üNåÂÒU÷×6`ʎĨeï#…j` R(/›áõ…<3† ßïúb}k½T¦TDÊ¥Rµ†ÉEÛo0\}Wa¸ÆÌã⺞ë2Mߙ’jz!zõeë§bV(Ve[ +8VÌËó‰<Ôší•Òc °#ÿaC×øÈ™SVE±R>c´â*ŸI ¨'ëoܲ«Òeþr-¤Y/LªY&#Xù%(Åq™ûÔ…–M†Ó m-{ T…ZúqF“ÕªŒVí7THñ­M£Ø»ÓtÖ¯¿ÂÈS¼ ½8cøâT³IÙξç§*Mz<Ù¥ZäÂÝMµÀ+gbÑr}zuÝKœ&K»G—?@S}ª½Š[Q« aØa{H+>°½"iO|ŠÚå{ Ô C¶b0mÚ€˜o®ìnBªykÉÿÑÀ˜9Cè“”‡ðizâ®ËDý1ýAœ÷Ø€¬ÿ¾s‹€¿Wiä¼<€“QGê ô…¯iOŽ”’Ë^ÇÔ·Ç•ˆÝ¶»€øŸ.Ëòk ýÍcÖ®hx™ÖŒÓ/Å[. ‚¬ÆZçÄ †¬ ‰s¿ÁZwRªm,d] gö›nçNb×1tWÉd^SƯ°Ð„’Fò)I«êƒöæ|À…\@ð=lPñŠbùÃZ! Šu–¾¾8A–ªÎ—§¿…¦ÑJL1 Þj–Uay3(9ã(måÕJíÝ2Y| =Ѷ¡;‰½¨'}6x0Qö׸x|ßá¬*æ+ƒ(ŽÁZ@2ù›ÚÉÞƒºÞßjÛ¼)8¥{ã >fÂŒî_´ß½õ"GÅ«†-ÄW’êž>³Á51Ú¬ë©=0N…¤v>œc9ãM!cä,ãÞôÙè¹ü›Ò—6§¯Îô~3ùœ-²·ðª0J¬¢Ñ$Qš©wß”˜hb­¹˜¶Åæ ~àµsê!αeªWÚ—cÀŒd7é?jLôQ¯\BÄZl爔ˆ+ú9£>-áf…¬Ñ5à»F™c©ÇG1ÑC¢ÏO GÐ/&¯ˆ(æa9šÝÊV26Lt¥l-ÁÎò[Fúf\–Š3Ô»ø‚µ/…Ó›¯Í]žü\NÚ$E°?‘E{¯Õ*$YÆØóÛ$¨¯Ÿâ9݈tL *ųvºƒ·±fLÆ =¿Ï°¹4ÛV»€ó‰Í\Ìu‘k‚ÚÒIæªÉúãÆâxߨŽxMÝϤFs0å€ G3”+×$s@¨£zÖû#HÃ-VlçIœ1ãe[Ï/ˆ?f1<Ï&tu©%u‰%{Pk³²Œ•€-“#Õo¶xU}UòB2"· ߊ•ÍEc†ÄŸVš¯_…´±!æ1ÊupIJ†è¶Ì¯pM ‹ Ÿž|"bØ´Èâ„mîlÓòâв@ŀ͓ÕßQjÂãwÞÀdpó‹ò5íÛ½œêw.»ÙDãºTI3ÐÎFö}h¾ˆÏâDƒeÁj›ðÞå1,¯Õжh®[ç¿§9†ßjÍ瀙àN.-žA1¿› ³ßv·7¬÷ÿ¸˜b6HµC„QY5*–Ÿö·÷ <üºÏ‡zT[# œá‡4úãÔ†~X9m3>õ=ëëjlSxp’ö8 7Á`k?¢õlPùÎj… ;‡,Ùb·3*~=¾Z; õ†«ÉÙ¾VÓKéêCܦ:" µá°ºJ*dJÂR%§æ0gÒ¸>±›¸Á°S¯Í/P ¼E¹AÈ(õËJJäwFØ»×K˘u˜eä%nì¯ÄÂØ]÷Êí"^’£oúÚò4‡©H§`¡¿}NcZa‘¬éd,3¬¬àm­|{ü ˆW¢D¸W×pùçîfÊl=±¶o˜~ÁA|æ?Å?V3ðåæ/­ÕIµ]2õM1ÄÕ4÷U§âÝz‘Ñ’¸ O·Sà=ëõU²æ®è2Òµ]ººÊáaÒdŽ#eñåÃa܉³`n”Zeޝ=xèŠÀ{©ü=…q ê9wt½âåxbœém`Rr]Ý© ô=„L’ÇBËKÅézbÒyNH <”Ï嬊u°ùåkðh0«~¤×3&NÀç'žLv>˜¥w€%Ÿ¯ßcŽâ|è®8*°TÈÃþCÉFÑ ÿ»'åÉ\Rá]ÇÊ£9­A¹ ÑÎCT¶î¢®ÊYÆäij‘^Î8=£žÀ;Bц¹Ù4i8“ÕíiBg™ö Ú—*«‹Í˜J¥TSˆD0t5Ÿ h•ü‚ Ïû]ÚIâŸÊJÝ ùáÇ£œl} SÐË%5©=“>$Ÿø $Vèâv¦ •©˜â%es70ÍxÌY—ÆKÉI’I 0án»ì@Ë®Å!@6Lr´ŸèA\\°Ñ;OæµXƒ†Grü6Ž”†}7„÷Açô)¿ñ­aW%’¶ô€ù~<²ä1¤àÐGŠ{P‰®u‘I)>\²#/š’…ÌSæ\AnQjÜvɰþaæŸâÅÆœÁG¦µ4ÃßÈ|2,2Ã,±ýäÙ*èÏ[hEû¨Lv̆cãÕ‡ZQÁòüVIx[©}[Åp/³uœk"#Ôž"ÆMûnˆ-¦YÝ0_±gY§í«'‰¹‚riÖ ÿ^ÆZÇHRÈ2=‡ö·QÔ/#ãîNzØO]¯Üªýx 3 T ê{~À½V¦T>?ÂÛjQš%gKoäCëB DZ;[ò%nEG•(ëÕÞM樰ìÅ \oäÑSõ—1/g0 >Ó©y¥¯.ÖMK’^¡É¼S]™x…u9KÞf¹b¶·eSá?[Éf©…<޽5DÞ=ƶé۠Ј&r-¹?‡n €PtªŽ^/7ð_V„öùù¸Ö¤’5æL ×8¶’:}cãÛo7qFÛé€ä%!w¶¿¡@"l¾×;“¤49?uí»ÙÝQ«ïɳÑçÔ·S8½R.vÐ诚_ã·<ᮆÁˆ³jÇ ªÚìÉ´(KY#PN’äeLm¦µ]4^sÌ^kG©ö".¿J¸3õ5j¨*$’·KÒã8­«ÙÝ^0 6DÉ%ýhçµ)-ŽåÄ^®“ªeÃÝ_ê`üZÖ¸ŒscÌ'ÆÙY‡«3¸1ãõê–êõz¢u855c‹I=&&îd¸dÊŦ­æ_<ïûÙj©,çÒ²üÈXRŠUh¬SM²‹=o µÁÃ>]ÓÂi¬¥ŸÔ‰)Œ8¿¤²šXé «73 JŽel¹½éòjSuRvÚz;ÂAi 9'>€‚<ldãEpgIu«;k‘ðs\´ú»ýð¿º4K¤Ó ´-»þ’”´û&èïöSgÇjÆS”%ˆˆÕŸ÷²µû¦blL渱%,ÆS×ÏóÛ€oÒ·'°èž8ï$’5b-¥¿>ç9kU¦[WrA¬Kf€!ˆãm­t½‰ˆ7¥xX™ L®öJp¡Oí øü9´ŠHÿQûÚšR‘58ËÓiëCsòvµšü¤øˆF™vlAA ž‡m»«gU’xID»úûšü„Á¹ùl,ȺLº¼´»?­ð+gÂRöîoaá€Öi#*§ðµ¥R,B‹âÈü o™¦È1¤7ô‚ÿ}µ_ïãV†vÃ"æâ±%!1íYRB“[“ôÖâLv‚è)þÑ?•¯‹'&H-ˉž®³!Œ/0@_;˜Úêá0[  tö’ù™ˆa–¡W°íÈyáh[öJt«¹«a~®ìžƒ¨™¡€L¯¦Þ¢´•ä*Δ̽YÚ@éiÃÖ‚6/f®HÙ~!BEƒ¯@§ÙÙ(õYãSËÜc¬“óÛç9+RXbóäѶè=<Ÿ—¬fJm’\‘ xòlóÎ^îŠ`ŽRÀûZ²H»£9¥BhµSz1¡ÀK0ÞÕèÔÒºxóm°ëYû·zö˜rÖn,úìï4Áý”`–D¾Å•­…_¹&Ìè’ëYÃüÁHn´(­:ê½'üPUöEÁéIQù½Æ<,P´ÆbÖU6 !¬.=™IKU¤/'¢èxWŸã~VÕ_]uç%M¶h©[è0Χ"šj‹½ù{ëKÙ§m•¡‡Ó© sæw­2Á viWkVi„¯OºÖ¬ÈOþö"®Gõû ¾TÙ×¼_ßÔnIDa‹ÎVoýÅcõÅŽÈ—ŠnE‰\AÐQì»ýÊAö|Éšïx}eΗ"–#ƒ3ÒºÂ?õCÞÄ2½t™a €ÚWóùIÔaœ?p“ðKc*`ƒy:ÉÓ” –íŽéþæ4ù™ï/â_…꙱ι«Ž"÷ƒð8wRU}•X1}¡Q$µ¡y¯ß\±M ˜ª/‰d÷#Œfö¶‘ 8i‘›+ýš~€?C8fÿåÚ=¯—3ŒŽbyÝ?ˆ»qj<ˆå±ÛŒUZVvh2B Î¥–Ùûb6ì '蟡v„ªý-#ÀìÆ]—¬–,¨ÀïsAH’È‹¶7ݺÙ<í9=‰zÊ­ ØÃÆ$DÙ/›…6pu+œ&IÕüšÖ¾ô]oùuüð1‰€ý§v*ä\¡JU¦J]kï¤ä†KjOJ†ÀŽàgï'Ä>#Ó†WxA&Û.X#Šö®gÿ´ÝÈ‹¹"&‡÷‚ËêM4•¹’–ÎÐÏ7GÂoÅð- rVßUZÚ.L¼µQú›žó‡Ÿ9ótTo¶DîÕ›õß`„8Àô#os,9=Ѝlƒ–’Ë÷MËs,ö—ÕÜõ²o¨¶³ù²I£9ˆY k±"UÂ1ªE& 3Hˆ5” ÍóåŽT³9HÐ¥3ý—4ÖÜóEXvæ°ï5-L›{%5沺…ÖU~.äC+€â6²Ré_(›ÛJá¹QohUî;˜: -^EÔºqúñ²ü>®ÆA/h0P‘öØ´Žísíííóû’6âµÅc‘è\ïkð{^êŠöQc0Ú°WFOÈ Cðýfo7„tÜ}RnÞ¢,;/ñ°`}ÓÍăõi¶à4›¿3‘Œh¢ƒá ³Úñx¿1Ù©ŠM,Åw d¬%f©ãˆˆ,qç±õµ¢”³Ž÷„Äy!¼îa Õ§6õèš½õi]{°³Ë˜N:”±_©~âônE”ÓR.®†l@ Ø=vÉÅ[aª–Øe^•y¿°Ûƒµ¤Ã¨ºŸZÅ´KµRO,VŤMÉË[%<ãý|VÐzP=¥yĦز{y¼†<Š¢—l+Õ)9¿,‰¿vûfjfi4}Í wÿÖ¯àæÜëmõþÖo’HØN¨Û~•&!ßÉ­:©¿S妞ùI`ÄO! Ì:€RW¬L!¹‹³Œý¸ðµêü‹åW¸¨C>¹‚iH Cƒ2ídÊ8Ú±IPÔëŽAå^™IÛa·×”w´b¥OtCÞÝÀø­F˜Å+nËZûm/šœYœÁ‰†d,ˆã"Yþ­¬Å4(:ë§mØ8ω FjlU ƒ|%mû {0ý L–9 ½õmÝäî~äüP‡)”uã=÷T¯6DŒ.–¸V®?=Q>‹‹ FšÒZŽÅ“û$„ñÆŠhƨyÚ;`j*Dã½NQǦ¼½-Ïø«–„xVÖg±v¶ÐsìJo˜ië0&Ì_„×Hõ_Éœ:Ù2"eä1‰óÓó;q_9ø Îñ|A”•îd„gçÉw[ȹ羬¼Be12·žÃ…h­¸o~OU&½ø”lXS(ÕwtÒÇ&*ù¡:9¥ÎC[À‡'Ñæcì7Ç^œ`©2Èdåò¦¿ë[B?Ì¢Ët./Yq—IAÑyÇßÝÜ·ƒmwæWÙho×_¬á•%^w1ÃãѸo>К°=€v][͋ʺӟñŸ €«pýb´ý¤vv¨ç]IfúÊõè&w€hiSZÒi5:tÝðMï26ŠZ½ëÀÛ*ûPޝuÕo²ö1D ÝÃq¹ž¦Æ¹SºÑ£†­œÓÃŽ|c¡Ï¬e>~ùja…Š¡ÌBaœK^„hNŒ‘Sr+{4ÿ0—q¨Et¬LªòCigÝÓ‰#fÍøGHžô³w=CüþÍbSë17{¹ï#IŽÙ¦hŸÅÖ‡¿ÖvÀPå,².Jµ v^\&u§'åÇ5GƒÐìWý @r†àP)Hd8#çEöرŽâ|™ÁÛ€Ú+ƒíYоýoûq\Ø<«§GI$·3òsÈEïTÿù8¿x |¬ÛíÌðù‡2e^ç?*^S L¿;uô,ì1ÙÎùñ8ssB‚WvPz_°œÖ­iR¾Tè'˃í€=ct{¹¹<¿)c¾·º?ĸD,=#—³Á€Ð~íõk'|s“ַ혥d±Cœwó˜Ô2MŽñiÄ“¡½Tøë©iq=›Šd‰ÁŒK@ó<ÅVë?P•>Ù[®Ýø½͇€Ò,Ñü—ÿŒvºõ£IéCð'Eà~jX¥Šg—.ß:kÔT^Ó»è S‰"‹P´±ˆ§’ë}/iõ“Q2ts€¡–Á4U-6ïdjVx®*â‘ô®BÅÜ#EC›ë9ÌcVרLÁññéD>rY%±/á1ˆìqÈQ?ÝÑ uüßX¶Ñ¹‚Œ<[éÕ9Ç—yÙÿÆ‚Æ4ùP†Ð3h”Øü1Ϋ,—äà]Iwâ1œÚ¨˜úK­ç9;×PCzjJK€«1ÉC1¬ÉT쇦B·\.Ë™\&+·Ïvjz¿@Ñ¢òi¿Ü-2<vÕ~·+Ú¸©Ó' øÔHÒ0êÕÆ?BýjŽ)DzuVÐfîwZc€ƒêÃÅKâ©ò"ñÂß⃘ÂëÖüqS")…™’ì'˜{‚­]¸ªRÂO<¾¿‰Ê€?s­z"Xþø£ :{$oä1°o ×e]7Àïëv¥b&çCƒç¯0üEàûN`xTÓº®3äÜu†WùoˆÑén½å­*oÙFÆ£‹TŒO±‡Èüs,‹ë™ï’XèË/»9ïÄPSŠ6ÁR§8Qàé·ðužh†Ÿ]Ev1éçv0µ :Æ¤Ê ñ-Ú•M–¼Ór»çgÛqAgC yhé wà_ȬÕà¡h{‰•V\‡üV»ƒýne¯·°.WY•˜¹P+Š€&ò?ˆ›É/¯Eäí!°,ž»ýÀ hr› Í0/CÝÕM‚»‹þ¦€‹¤tÖ…k•¹Á¹4û–Ä+*´Þlª‰UH¶q~k%c¤|%Ü·,ŒlX÷g§Ÿ¸¾‚±x¢¾4ª n,5ìóó˜þĈT‡veJ–VßMo;QI«†ªGNx³×(CÐ…vP”Z_ÕÍ,)iâ8 ùk©^«~:›†¤¨eDøØ4¿¸é0{‹ÇbÙss“ÕGFÒ/ÑÇ*ñöJ\´ÕOÌËJÑ4Žhȳê`C»ò_I\½J­ãÀÓáqšJrómlèh’B1Ÿ ¨`X¶åZ6oMtåkAÏÏ2Cº%eánÏ÷Il¬ßjNçN€œê„Ÿ` Wß(+/Ú*å±Jø:> stream xÚ´T”}6N7Ò R ÒÒÒ!ËîKì",ÒH‰H*%ÝÝÝÒÝ]RÒå‡O½Ïûþÿç|ßÙs™kæ73¿kn&ú—:œ2`¸DCpòrñˆäÔåtäxy<<ü\<<|8LLºP„ä“>ÄÑ ‡‰þ‹"ç"lò@ÄS¨:Ûxù¼B¢¼Â¢<<>‘¿‰pGQ€<Ð ¨sTá0ˆ“ÜÁÝjex8èïW ˆÀ+""ÌñG8@Æâau Âbÿp"hЃ „û¥`·F D¹¹]]]¹€öN\pG+IV€+a І8A] `Àï¦@{Èß½qá0t­¡Nztà–W #ð`°ƒ‚ 0§‡gâx8 £¢Ðt€Àþ$«ýIàü5/ï?éþŠþ û#Áí€0w(Ì ` µƒ4Õ¸nþMÚ9Áâ.@¨ÐâðGí@€¢ŒøÐâ_ :¡'.'¨Ýï&¹§y˜³ ,··‡ÀN8¿ë“‡:B@ƒwçþû~mapW˜ç?Ð [þnììÀ­ƒ¾q†¨ÈÿEz0áüÇfAyž ðð o75÷ï#tÝ 8y›ºðöt€;,xC-!8žN@áè ñöü·ã¿// !+( ç?ÙÌË?ñƒ¡n€W< äðüþýófú 20fçþú·Ì­¬­­«ô’ýïžÿñÊÊÂÝž¼N>A/°0@øáÅû¿ó¼Bÿªã_¡*0K8àw®ßõ> êïš]þ’Ë_K øïdðõB,ÿ» èáÁûÿ,ù?Bþÿ”þ;Ëÿ]ìÿ[’¢³Ý–¿ÿÐjçþåA¾Îˆ‡UP‡?,ì©?X†:Ûÿ¯W|X ˜•Ý?³„:)BÝ à—PÈúOÍüi×û½ovPä%Ü úûàäåáùßÃ’l>#NÂüÓtzØ8Ä·øCvê¿KP€ààßËÇ'(::Ýqnþ >áaKÁ·?¤ àæ‚Á!€‡v½–pGœß·," àþ6ý‰DÜ ïƒ ¹!ÿ‚|nËA~·Õ¿  €úø %nØ¿àC*ø¿àC*‡Á‡X§Á‡¢œÿùR¹ýÿ«u³£ãÃlþìÃ\þÆ|„ 7gn ´©lº,“¡råÜG?L¼4äãÎz…èV7[û¨“’<ÿ¢@q®‹WñµM«†ì›ËÔ噟žß*éªÜÎ9éw¬è,>Lÿ:GžŒñ¼ f˜&¨CJ7ˆ—¥ÍuìFzIN؆-¶êÖa"ðzVÑ9ãÊLš§(¬Ô¤ÑÒV–—¬FN-¢¿¿®¨·èÕÝ<}ü,mÝ>*`#Â$4Aã3à ñ–+œ®¥„«=ý½‹D]4íá~ª.þ›GŒÁ"±^jyÌRýÅŒG·i¹.{Ÿ‰=-”H¤÷ÀÝ$›^›þŠ~ï¨I—k§ƒ¬SÈJbZ4pœ )؃¬ÍB«îã2S<±ªêQÿ¶u¢±ïö¶ûgŽ:’³´¹¢p°ëó¼MWQ%•U¼tŠ@QCä~òÚ9´pXÌa¥ª˜2µLÜo7ãQ ” HÅzÑùü»:°—fe[€ºKš3{%ççÏ]Övr, Ë]ìheVÞ“Å–µZE×srSÑ_j f„±}[b=é[CùªS@â,diú‹‚MRýןÄ=utÁ‡C—Og"XE£ù¶ç©km„· ÒÒ}ã’CÕ¢Iñ§ðª¾ÎŸ'â Æà@OÍ)îóãÌ0{—p±\°Lb¢5‘‚YÔ=±_T‘R)3“eæç€'‘\òŽ(¤¶„»vveUQÈ¢1½HІX/‡Ôç Zw™x?«z¡·÷ø0D³æ70‹Ð+cqŒí|ùd˜ò¤oT1Ñ£B«Pá­Tö¦þq:Ç ™T¿çe­x¿õ½ ùÑ'®Siö?•j"õÌ×»ô«++Ë'ʉC„q®¡ÇÐÛζ–f$x#—ºÀÂÆprëü(þÅUßÍR¶û*üÉKÒ‹çŸS=(ÜÕc÷RbOËâ= ‚­£ŒLz¿Yú\Å=Þ08ÛÔ²ÒaP²Q:üZÈr´HxôÃKÓÚáNÍJhд´—¸–F “çÃØÊ‡ÔAdBŸ EŸÚlVÒ<¿: Wz~ìsŸ¤t\×ØÑ i³Å[_S,°®Ã 2BD$-ò¦%ƒ3.,8x°mÎÚr'çãÆ¶fƒ—åÜû8C˜f 3 4*ø0]µ´ïÝå4-Ô]ÌÂA¯ÀŸÜŇxOƒ±Ä’[I›°ƒ ŸôJ„g%Îô* î6‡C<t«L†fì›¶ß^|ô‹NhÝaÏ uJ[ø¸dÐ?²¤Rª~üÌÀ°^»~'·)•MLôGÏšØ50°X½þ¶òxìÖì~²•ôeã%2·yu¯×þÉ)íE‰KÂ-Ò/:,ˆ€µ>-­uúsíg^Ó]«F…'Ä­¾¬ó$½ø øDMéï'EœîàªN9#RµP:õî»?4XaD¶'ÁY€€”žNt{+ ½+.qéG Y‚ öµ^KðžÆÅÒu Õ¼—%¸œ|ÇVùÛ”KNsþ[·c>;¼ËðQ(ŒvQx>öòë¶®šn®ªr‰;µò«ªÖu›! µ° ?Ç쀩ºxB=¦nJ¦Ìóèp± Å.€}ÊÝÇ«¥ÏüsýÑùøáJ¦çùfŽ‘5f´ª^¹àãF=;ûU<u_Ç×ó¢¼—¥—>%–…RD sxášÄŸÄÈüzù{&mˆ½—ï¢vrtHõQÈwB͆>l 8ýb´;¸11ÓðG.fÝ%ÀO ‹*fƒ¾îŽ|¨üDÙs”åRLJ}ùI¦çãY>«â±À¤_j0p]8ãcèyqK}ï÷òþ#%!Go ýá:æk½õŒnGÓ’éHbô,õ¹þsó*³Î8q,”ñlõƒáO´mÚ…­Þܪ£é+!½êñŠ —U™µâgsRäôÔ¾NåÆFnO+l—p'‰¬h2nRœd!ß´?¼Ÿÿ(ddwlVΜ÷ÑÒö€`Ó6ȼ$´4(ésåÐÈh_£”¹×DÌ$·ŸèjÜú¾h#± &ç†êc)îRµ‰|µ1“®*Çé5³×1‚8 Uuiõ‹‰ØRž#ï6­ŽÐŸgÅð§ùO Ì›šàr`íôÕ^~ž!ÑÖ (ô=vØÉgrYà1œ;vrAœè0n„¹Ð§)e‡Ddãܾ)Ðd/6Ï¢á¹í=$Æ%€Ö²Øh£±qŒœESHÐU!#¤Ÿ ¥b26•<Êr¢µÎƒºàN1&ȼÅxiÔpw¡¹tcyÿj¤ [÷ûbÙ¾!kJ¦§Ä aÒ±¶RÌxQãLQ»NM3”ƈS¥ÓLe9&YB¼ϊAÇ„¯Ì7zz­aºã 4Ýð³¬ÖÞ›öðiÇÅè×ÓYÏwˆtÆh¼êG¿½Bõ:]kG¦Î’nsʯ'óÏáë{Ü,7mPïÌ¿ QÀ"žmö¡]¾|»•Å’¤önŠE4Ë–A™âe¦k ‹!e%½ÊŒÐ¡ŠBWî“q;r+ ð{r žè£4³òs¹ý_mÑbú½z²®À 6²SñÓà¯Z%,ñ³²Ÿ9ç.Œs˜ ©aâe¾}VPfƒ†¬ÞFbzW*eEâ±:a—›6Þx•úP‰:ájZç·†VÏ:+˜R’Ö ¡§3ª8»#¾zi¡ùÕ®DÞH™Ñ+3Ûj; Ú°HkLjX!ø}Ó^‰ÕߺH©VÀ'*H$+ËÆ"™úWuïî÷NIèûÂ-w(Ão+óùÞ¼r¾éuýÚuYÚDSéŒNÕ®†É6±!ú dNvƆwõ®G#Ð K¶¢Ðݲ؅ë§3û9†›Lr/€—áCºÝ³ïT©S>¦ß(¹ý&/ƒSLM¹°ñÍG«nˆÍTÙ¼Ïâ.ªÙ¦¨ir·”ß 0áÞàé[¬­¦2.¹^5Åç`ŽNhSLáœÉUÕÄ;RèYꉟ>^ëxEQMíÙVá‘^&übÆö¼( uÀÌò–û8’_ts ‡N­¤$”ØÕ\â ›ª`Ô¡‰óPˆÖ;:1ˆg6' fßx¼ŽÖc6…†DŒ†ô‹–~4*iÔPæ #ÔS|–œ²êG.ò†îù¿mp á©Âùu„ì0Ç#Õ^zÑ’^`A¨ÁI.»°X¡ ]…*£Œ{¬ÙâÊh–F-ÇùXéÓäj2Ù›ô ì>7Ãk”ÞºñJÉ/\É:Úgþ"œwÖ†Ãïæ…g†S³Öb߆š¥ñH<“>†¼Þ^†Í€S—_¼ ÛÿY®®‘(¾sOÅeÒúRªÓÕ:¥ÎVôµ^&²b<ÏË'§ÉN)Ö¼½ÝV½+3?k÷ÉLšÜ"Ð[·×‹túYîÝÈmˆFˆä>‡ÖéNÙŽ«YÿØ`¿ÝZ¾«)©äI:mAaµTã¸-wÿÎ;1¢°¹*çØW“xÜ™çŠá…Ùȳ†ªi½ËŽì·ç(¶ØžýGÈLËxÅfßåîÞÎÒ»Â.f Þ3¼¾g.·§vSâÓ‚Ç,áˆÒ‡•êXž©Z–¹4ùo|ʲ¼cÊ27é8¬ ®TáãœÑ™ý9£•ÕÑ饻9ŒÕú6£ßvG§ÝhÏÆÂ$ UI©µøºË`‚‚âj·oà¹Þ=,˜Â*´•¹Î¸P>pù=ª×ʇ:¤Iו§„¹Œ·J¤üf‘Ø%Žw5ó½ï æ[Óάc§‰¡÷¤VÑ»õê¨Y éÃwðÍ鵎oÏWd MåËï¿ñY ¾-œÈ¿Þ½’iÚ¸el*R{Õþ✻ôåK){-Qâ˜+Î[”©‘‰™Èn”\TúArÚI’‚|ôY(ݵi*á0 ÒëˆszÖ¹ÄG³eE|Å N𘥪²!Ç«ô¡IF3Ô¡*¾‡ÑJ“e›–ä¬Ib°¶ãýì¬Þ¡ñLXÀuî:´&ו+$”•U†x ¹¡ô£óæDÁ-f/i’Õx÷Ã>žjJFBÙY;»Íš Ò®äïoXT½«\”úz÷.Wo Ãp¶×Å#ݧ›º¡þQÛµ9žˆú‘S zÄz¦®¬ÎV²Aå*iAù×§Œôµo¯U.ٔ˭tF°ü§¼»,Íöº?2Š ß@C'c/Þ{å¢Ðå>:<'ÏÊd׌Gºñ-:‹.최ÊûVÒ¯ºcp3·çxËò²~¨©Að¯ÖÈËd¹/Û—ÄÈ ˜ÛZƒ‚y°îŸ]3Ucjöeæ™ÌÀ­Ù쾤“íÜͤ;ï¬Ûšª”mè[€Ó5r½†˜…nqE8žÆåV´à\|TÈ){¾gŒ¤º’/æOГ3Åãã|vÙb¯íö”D4:5LoçÁt?¯ám»¸‚ûtl Óf\ê‹ì4 ‚Ôopìá–GRl\â«"¯ü—1xat©`Ðà~Aý¿½*L\ḣ҅²ZÓ©­û1jWÿ@!*JŒéBêM8ÕÙÄ&Î.:8v³jmUê´]ûí éû-Y_»8$¹ñx!dX-Œ§ï:˜¨WW5Ѝ½»+O‘ÃÛ·hSWæÍh×ÜÀÌÉzér¥Ö7ÁP%!©,ÉìŇO9²5©"et‚ÇqŽÕ&é’Ü7 jC/o’°*®dï˜jÆu ‡ôî­S¼>ì¾f_«fp‹¢.ÐH_A‡®4&_ )q‹µñ¡nÌLñ è+ ìY͆-:$Yœç´!iÄ1!ßD?·øÞœóÐ|ð«yââM’|ÃÎ}îàß4bK2–åXvÚL$þ¥+h°w‹ÁV­¨ÓipýÕuÍ­J&iÍ‚tp©;d/ô¶*Kìc}q·ì#Ùñ€«b¢ýq—_ùIœ`j'¡Ê£StÙíûMS.µ‚\àANá€`þvùÛ¡D¹„ïÑǯ³S@ö.ÇSOgŒlf’W3§ù­⸧þB¯æ¦ž ŠÂÕ Ðƒ0cÏù$LŽ× ‡È,–|…Mö–÷ýOJ÷\Ÿët#d´Íð³~æóái½ñ¿Î­T-©ž)®zŽ,˘d^.ãÕ+®mόʟ×:{<Îа®øî„ ©®—t¦¶àÕ½îb¤Ž Î6«;¥å:xõ—hódŠíçð6¶fkf‚ÿ¶aÙž§ÕKz|Î]¤l×aa&½ÙÜ„#F[Q‚²µ½ŽKaýàÙòödêÂíTèŠG·½uL"ÚÛ,Eº!ΚŽ×£$ª;`ªã¤xYŽ3í†QNû]H:7Øý;ê×ô'`Ïêü†½Ú"¶[ýF`ÆgûESágÝ.fZ£ZÞ.=í´à«;òïÏt A~Ƥ.ÉØÛ€EqƒN”Üî_•@’Ðê»k]DÏŸ?× «_iŽéHl’çžTZXu7ÍZuF†¶îtÞIÅö#k}(Åá}–sú1cN“œ"+Mu¶À¨$AÒ-ãSÇ3 ø4‘l\–ヲÚågI!a½¨v¾§bb&¡ß%Ö룱FQª ê¸-r|›˜ÄI½ }QpO¸–ˆžÉÇk‘¿æq¹x½ÙrÀÊC4S¡B¶b·>_μÖ‘&˰NÚà¶3ÕJLUjÑ÷ÄXk¸idÉè½°IýͧÇýÅAŠ7é…­Ÿã_öîy:‡´5zZE¸â¥põ‘Â̓-¯’|7%QÜbæR02âmÎ'ôéêµL%tûÃíA”æËU oÆ2ïR({{Ä[Y¯¾òÒH^PÙ­|I5‰ kÞ³0T™??5´ÆGݾ¶sñ–[«ð,ŠnºÄoN} ¼1Þ +`õ‰oçîT¹/ó}r “0i»go3>2#§¥-Jot„‘à/ñºç ©6k[ÝÊ¿0oŸðÝ¿™Âýéf~À<1 ‹þy)‘ù‡šîIà…½ó ‘Gp1;°Ñ—ÔmòîÚùçÕµ_ì=žê» H€4æÜ¯žúFïër+[Ǧª¿¥éfôÞSÖòr·öqrŒœ Ùb¥.ØÈî;sªsœ?üYOû¡•• tè•Ëtþý²˜Øõ ¯]‡“ø…g¾å÷»÷| Ñ3‘½™Õ(†Ið¨ûã+$C©6x[qp“ZïÆOÉŒAŸÁ‹b˜+Ö‹É7y/ 1BÛ5k Õvìİ%P‚`‰®*ãà„sÿ䛼õ¢Ì%,éÎØŽ×‹cZç•6YJ_úLb½¬ÈMrMŸžÔj}µ¢ŠQ5­A?5Ý<~®”r,”S­¹qÍ%‘v¶½Î4Vr¸2þYhHp&YÅ¡gvûŒQ”h™Ëž.¯½££y"tÿ{H¾+Á¨®(MNüך™ðÓŸ>v¨o¡âÝä«Ý“‰ÞÝc®®õfÅÐ86ëÀ˯± Öã|¶žöOJŸîoyŽ¥ÍPè¢Æ|L>TvðŽˆÙòL‹Y²€Ù¾Äa'9¦¹,5ÀdAñ?Áø:|9UÙ°ÖØ–:ÎÏyQQLŒYEø8ð맺@×,d–&Œ¢Ì^=FX7Xƒð6ŠR#™÷'\ýJH2"e¶ì“F¤ÙŠIpÉÚ†M,Ó,;Îdêœ ܬ)³õç´[ •r~·H¤XͧãÂù= /6õä{s/©ö'3"å]J„Ð ôqj :°«;\RÏHÜ'®‚D®‰¨}"ÎfëµaÁ2ã’¿Ü^Gm Á·7Nº`MDaù0uèR?ÛÇ[ÆjåSûô¶°­õ5“k³MŽÈY›£üØþºVò3©œéNùg³rÛÇ›€Õ£3<–_?E4ÈODìhû¥Ñ“ÇËÆŒ˜FYÂ$u‚Ó ‚ Ùìµzãf ËÓò•åÙ_^Ö2¼è›fÀ£hMIVš¡ùèó8éó­2Ý™ü#0ÂÊë”vÞ³²•u_‡†1’–×ýcILI™‰Ð EJÆú ÷Ùþ­h‹£Á*mÃùŒáZ9Ù·Ö ² ?œÁ¹*½×ÍÉÑÖ]ÉäB¹gÑ݃öÁÜ`8,Ö×éËV³¶/r÷> m~"vÀæ&›ï8¶›QÁW~¢¯ Òô¶ÐÕéY=nO!3^Q!òÃã°Í!©Åœ®x×;”£ùŒ¶½Ù Ö~èRØšOp"~ÓuBºW+„ö™íï8—…bI«U¬ƒîë~´lx ;®8X‚»F‚:‡R1³Øy³úf ¤Ü wéç׆\¢Aâ$‰ÂŒì÷+-F¾gýþ=ŸÌ̼áý•¼Ü¿eZçðº^1x£‘j¶œ¹ Š$(§S—”ÈU¯W_/ù®:AK¡›‘œP¿ævz+%€}$žŠ@¶ýþ›i °CBuœ\Yk8ÂâÀ}Ñ`ù®õe§{¿"ä7¯Àø¤®æ~õkOô R‡Þ–Ï­k::{Ôw!øùˆüu[›µë2yëe\v$Un!#>vƒE#û«†/¥Ë#?ntäðÖHO>Sg×y“ýбs\o»xBPKdˆ# ]Ö.ŸØ~Gwz”œýKDFyS¤™=!¯\ƒŸ=íÛemSf㜹Õ6öí#RçXQù’àPK–&j­yŽ$f8måÊÈA¿Ä²€¦ ð ©‘‚ø‹©‘ô’‰\åÀ‡“Š´]Émd}¿IëPG:·¢G±^ NÃï.¤r.ßN);R‚4…å¯9Ÿöª¯zs@’2Í›UÒ„ 'q—x|4xUæ6þ7ºLæ8§Ñ[?<¿ʾ3ôunÑ„2š]DÎCЂoAg¡Jqà´JÛþï§%ãóAâŠÞjgÈ[\êu#zª«Ò% å†<ÑrlºMmXL¯Îܵ'Yÿ˜8©OÕ¡ Hf $°Èò|£eE7㺦­U`4ñ,û­–‰,"ñQÿŠ3oŽ’å±TùÞÁV0–Û§>§ª™-å7‚gøI@Ñ<Ú¾9 «¯g’¿ªy¿È°¦gµY‰ßˆx¼u:úÁŽ7Ð4>hùcõ[Ç &¬æÞåoZÚ{)+Bâî¿ÏÔŒÝUË 9ÝßÐI¿ÃS>¶x™×ÓØÃàB¼+7È»¾4¹„weoÆsd§b_ñw*†(f–ÄöKDkžëÆ·yŽŠ£‡,•lx,0š`6À×Q‰‡l¢&XuY†¹šÿ´û®…l&œ† ¼¸FuJ‚TÉä€Òäí¤‘‰Ó! ¯GŠM0L‡kM¢àŠ¥Õ&Ó„Ͻïd_c‘Gú:¦MfuãüìsÕ›6oÑG 1Ä24ϳÉm‡Qÿ vpÆ–ÎoD¾‹Oç•2˜¥[»&xÚïÍf‹4˜qñãÞ4ݵr;µÖxX¶ó¦áÓÅ´-c/oQ ù ËþÄŽ›_Q‚¼Ïó¬ íOÍ×´¯7ØÊùâ¤|sévÝc"+ˆCäbÛΟ>‘*ÿâkïä8®Ë§‘Ô›0¹%™œ¯C›Ÿ^žáw×€¿aX=[lfaI~÷Ë Î'ÍöyºGr9³ Kqù$W*ì¬ü™ZðЊVIC ¾ÆQ‰úU¨±ñäù›õ—Qä,eS+È7þì&Ë3›"ØÒÅŠæD;„1¥`Qâ°6šâXÏfˆKèÓ—.lѬ¶§Œ)ÑÓÜ¢ÚWë¨GÕT5ƒG³oRŽ'¯¹Kc]GÔÊHn¯ƒÉ¦`Ó“1Jq#)Jª‰_ ÚùZ[ÃèùŸ+‚zU8ÂV£­$ºÈ\š£õ÷¬‰è´?}_¯Ü+“ Öॣ:ãºx–a$ÙøÝö¯E¢»Áѵ´}Ì5%I 1:Y²ð}„koFŸU›Pч‘½:]Dç(3a>75‹âMÐiiCÐþA„HPy¹‹L¥'8àú…d?¹UÜZ×Ìv¡à fó®½õ©»K†ÁϼÛ{fàÝ©˜§ì>EW“û|ÔI-ô€[‘G¯¤vš•øÄ×Pû¥†jœ®È—óaË''þEUQO K‰øMbh#›õïp˜¿Ê^>%rpµ–±ÄzìaÄ«ZÍZ{´7Y!LAqëý†„¹hX®’¡xA8ˆ¹ª]ÌüÄá1ºG\«œ¼£äùx)ÒBÌ\Áºd–3¾ÌÈ>Ÿ-2XÀâDmÐS¿˜QƯ´­“pf.2œÖ ¤Gß\©WBfš®͵‹/è£Åv *̧$­‹Žû?¬W@Ž endstream endobj 999 0 obj << /Length1 1398 /Length2 5888 /Length3 0 /Length 6843 /Filter /FlateDecode >> stream xÚwT“ë²6‚´ RD¤JD`ÓIh"½÷^U@I€P’„Š ½)½7é*½ƒ(U@”ªt"EEéEàuŸsöùÿµî]Y+ygæ™öÎ3ßúÂ}ÃÐDH †²ƒ«£8!°0H¨¢§§A 1aHÀÍmŠÀ¹ÀÿÖ¸Íá,…”þ„ Átª¨‡BµÝ]€`1 XR|KŠ‚@·ÿ¢0Ò@UˆÔj£p,€[…öÆ q„<¼P> øöí[‚¿ÜJ®p  Aõ 8G¸+!#â4AApœ÷?BðÊ:âphiOOOaˆ+V…qçz"pŽ@c8Žñ€Ã€ç-õ!®ð?­ ¸¦Žìoƒ Êç ÁÀ…  Gb .îH$dšhé Ðpäo°îo€ ðÏåÁÂà…ûã}üå BQ®hÒtÚ#\à@u]aœNAÂÎ,Šàñ€ \ vÀ¯Ò!@u%# „ÐáŸþ°P à c.ç=Šœ‡!\³¦‚ru…#qXÀy}ª J¸wo‘?ÃuF¢<‘>Kö$Ìþ¼ ˜;ZÄ ‰ps‡k©þÁT€ëà8 Hê–˜”î„{AEΘz£á¿Œàs5¡?4 ´'´÷CØÃ ?,ÄÄaÜá~>ÿiø§ƒ0´ƒ; €G'¨áö¿eÂü1/ %ˆ@?0tþù×ÉšÀ0 éâýoø¯‹¨˜ikê« üiù_Fee”ÐGHL($*‚AâRÀ[„ƒß?ãBêø_-¤= xì¼^ÂEý]³ÇðþÙ>à?ƒé£Ô…yÿÍt+JøÿŸùþËåÿGóó(ÿ+Óÿ»"uw—_vÞ߀ÿÇqE¸xÿA¨ëŽ#¬а Èÿ†ZÀﮆpwýo«BX%¤ÒB`qaøo=«Žð‚à 8¨ãoÚüÖ›/œ  7Daç‚ô_6–A ,›¿M,aåp¿y.à KõÏ:ÔPì|ûD%$ â Ÿ I}À„5…Á½~±("ŒDá.@BÏ~@{p>h ) š0ì\øGl¨;CHþ‹„ÄË¿Ö÷‚Cã(¨L°SupËA¥«§Ðò ,éfêÁQ¡Á‚û¸.µa›…x“¬ÌIgê`õûNmúÊnÙ³¶}–j8j½Å÷„8ÔW8ìbÇÏö.Œ&øì³qŽÓ4=±HV¾.]Œé"2d¢m§T€9t™pÓøþUÝñ1Á“‡¡Dý–vH‹~k{eI¦.#Ûmó/ŸŒqMv½¦Ë;Lå|r}´m‘¢ŸÎ©#Ûzˆ÷¬ ïéë¦ëd¨íñpù;W(ŽNM¦—MUœ¼Â|:ïòÏœbtz;+а®çs|ÉÕú[ŽK[Ö7xÛo9Ú&ÚGƒ¿àÙéÐÓ Ê©˜Üü•HØTvIC|Â>Ö¼# ¡ùz¶ì»³vXˆŽ÷ähÇÐüOw-ËwÝÁ¼‚zñr§¥K_üê¸_Æx؇7ÿU™L·¤&À˜É·îg”×Íå’5½Ç2j!j)•êØb*_4};¸9à˜µ"µÜì²HÝçò»{>xñÓ¼íÖVežI·Š(d }4~¾fÚ7½àÉÑ&XäM-4­*Zï麰ç[áµ`­ÛãŠ*ô+÷¸J|ÿ@÷(% äÈ~ºÞÃ$ÜÁY6µØ¾{½”8FT¢Ÿûüh'ñm7ª…H àQ}´?Ù NêеxÒg†WėÛ${òº¨ˆå'Ï~È7§h‹»*NŒÅêÇ›øz}Zò›—èoÓ-„ Ü—ßé%.(Ò8ú ]™â}DýÁ¨7h-þqt‹ÒüNSNßHëè×K-%r·Ÿ~ÎÜØs`eÙΔ»ÌaÙjÃqfw†²¹ú]™Í¼`î¨ûa?yý–'ÇWfâ¥ú¬Œ×ó­5Ô=u¬A_pb÷&Lt«É3ZÿEÙˆ¦ü®ªßîwŠ©¬¸®»I—[¾ÖVî•9”\&kÛµ6ej?ƒøÚ¶:ÆÛ=à{åy7hjÉrJü^}‡è–÷àJª#³ICHé?zô©Ððºýø} äxÜÐÅê"Ž7_Û^EoÏ·±ÛÄÀ+jø‰ñ¾ÉqIá†Û|zÒ2”CMÍaÅÞ=~ìœ+x?Ú.>ý;¾¿‰BÕ"n£L¶¸~…”~ú¸{ð¼)04I7ræ‹E]µh•©zœù<‚¤ÕK¾ÏþƒfÍ‘%‡µ©ÚÞ+§tãÞHcª¥%Æu`z*팋ÔþÎt<ºz''#Kó†ùþt ¬þF}€ Lécgúr Åž,ôÓ×Ü2ŸÝá žðöv@߬ۋ}EóGûßêæä¯L.Õšæ~ìE}3öLY„]Ï€7mD¶(#šWÙÙ^11zm¼ìœ†[™¼“ÔÌy+`Ë 8ƒšk1W’HòÚ`ô8"p!°€€ ™gú¡¢ÖPdaO|ûLn“ý-&í…‡÷T…ã}þWš:U¾V;ïFx^©cÑÛÈä¯ëŒôð~Vx»èZe§$¤¥–î2üîZº_,‰äSQ? Ð7óJÆÁÑäS"Å’íþý -gåøðîS—oòžñ³wÖe?iÞ©ì¾èåAÿòŠ_À’ºWg†à Þ:¼³ª‘±N¦¦çòšSAcg–3Õ’>óžxÙ™øaÚÎ\Íô™“†­Ãp˜Ñ³ªjJÞ¢Ï2ý•FÔfÁ*h»Õ·Š2*D·ák<ê–¼Q€¼Ÿ!‡±‡E ƒL1¢È¯©-Í6;å!ätÃö³ï‰KrJÜA3ûq1Î"ñå<»—Þ —Ö}¤ ¬šÓ½k~ï™Ýñ;Ù– ÷'FyµQçê€êwºÚuc[ëžôÄ™¥Tîe,õÂ\ŽL5Ùz‘çÞp³îØ¥‹Ó™‘¨1ŽA_k`…uÚÒ +¾)pF¿œ'‰%QcÌ ¬X*,r›X¦gHëÂú;u|"WQk€ÙGb—ö’^nó¹ì”Þ€jO¿ª‡šš"5üÜGSvIÎ ?ïVy£¼Þ×;•Kñʯ6y™Jbå]LJ¼¦Ðœm¾úP»žùú!™G/«3$$×’?=`ŸZ@ŸòÁ^‹ÆÒžYŽXžQl„»åÇÓrÚ·gåõ¼¤mVB÷nD3_ÏÞÐîhò±aŒöbëØ$öò˜2Ùéú‰ÈJ8ÓaÚ—3òÌ38½Å(ñ3ü&«tÒÁ<3F]C…¸ºž¾kú*å+&z{cˆÍ1êIù¤ËtÝïö×/-ÿãÿàtÓ¢#Ku]j5ŠkkÄw+ûFƒzä\ß@dã)ËÚ¤n‚ŒÍÌ(Y[‹«¾9¹ãn/ïG&FWc·Õ+ûùÚ–Lñþöã´$·“ŸKÖ|ºf>Êñ÷R½ØxÊf"Hª~¬DAµ=®4Ú5çíÂûpQ÷BÓ;Ü‹\’M³Xúo_V)Û™Ÿ»*ó3Çš2ÜŽRk".´0pšLMS©¹†^aº Ñ$»ÎIa…/8yM+2Z¹@Á¨*•a+s^©­‡ÙmF ª”»mwð„žÜ¹²¡•ŸÑ=šzóÒjªþõÃ7gŸŽá([ø…f ìZáË»ÑòŠLû1•Á«dUOÇ›,H÷С£ÛÎdyAƒ½J¹´¼ÖzKÌèh(iö¦cï– $U¹Ì¼{ï-ǶSr/¡ÈŒç:}Øý: êw6‰D?~©ôرƒ¥ ynKªý6áÔ9ª¥i@CÍq”gUájP0ÿÊ|9«mRÖ¢âí¨©(+E݈iе1Žê ¾­â/þWûf2¡BjC,Ë! ¨¦vŸfÚ$–*Ú~¾Ml•þEÇËM¬£pþ ®˜½,c-ö½ïÅîpPþ€ÜŠZœbEs¢ð¦èýyLM¡t/»¦|)|uÒp`¦fT¦bÿcχ'Á~®™kB?êô”ñX[¬_lvôÄI¶Q‘Á&Û"Bœ’½¨ÞLc¯öúyŠË·¨YG+ [» {ëRé \¼³[½÷ÍÄ®T¸¥×Žîn.n«r>?óh‹jÜu:¥#ŠQHÍ9šîWbiX‘.ÁJ·Z÷°ÊhŠ–‡¼¬Vpi«­†2Ð/îïÜ€SäO­ áÀ>аˆôÄÙɆ&%LŸ8‹,ûÌ‘­ %¢2s¯?~ÛM²ø¥PJƒ›.=Øòf£»Aï‡ôHÒòä5Ô$`ƒUâÆ³øìfPRä§IÅÉõþKª”#7¥d.=x²U{¶½Èžs½RÎAå{^\màŒÂáêÆ<¹LŒuB ÆŸðO3¡"B÷“ªc{URåé- ‡GM©‡oX¥i•ånsí’ÿèÙ`âÊàoŒÛ=êuÄÐìޢ䀗ʬö_¶è.ùïkœ‚ÔR)‰ fÁKõ…1^ˆÊHógn—â+ž'–ÑŽ£?;è_ðô¶ž·ÊœÆŠº¹~;UÈþX¨S´'ã³»kÚ$þ6´=çõãbý¼ÍQÚy²VçùNؼ×+-G5¹ž âðBëxk Ð4¾Ýºù›ÖÃ㯢3Ìå7© Ã.¦®wYRV¦Æâ¡î'ÞMfÆÎó$±„7’º¾ÖçoÛBƒ}[îŽæš¿ìâ]ÃÏ­»úx¼|Ô¡ãÏø‘¥%RM«`‰§²‘Á9Î ed­‹³sדª—n¦1_:˜ùZÍrDÉ ‡·<ûÆ¾Š›wú=¨:¥É)ÊCš*„ޤÒÙô¯Œ°[Ü»!ç®¶m´–˜BÁ»¡*+SãTÙÙ×p47¡µ|(Še`Ï«Ÿ;VªuÕHx«oÒ íýÙüC/:³xkLåÑ}åÜ…¨ÕJ¹LìmòC¦‹[¯¨õL[š>œ5Kg5TÃþE¡x NÞÿAu?&uë2ÃU:[C“39™3µÃÖŒ žíˆ|Œ—(%—å‡h¯q´X+ÑÆ§»fOJÝ‚Hëø‰ms1À§ûJTe fRÝ=]¨X~4öÛ!µZáž‹s±"ÒH`{@Æ8.™!êý.´‚1x¢Þïú‹Uµ:æ¦A7ŸK±,Dg'¡Õ¤[=û²²‡Õ ôT 9¥rZ»kÅÚ=¶ßß$Þá3öÚœ_‹%éô¢”žt,¹IѬªÉ¼ž3ê%†Öù¿jbÔ.¼´Ú¸X(ív‘±»×Ñ[g¦öT]FöîYÎûŸþ¾[Ïæ(Gé®ì˜Š`ÚNŠ8*6•:íÖ[zòk—\J¹]ð; tˆ?ös‚ª¡Š¾¸ŽUýÌÖŠ‚ÚÍÆÈáý$Îõç›39;ñŠ&¹G¾ÚT|g;šVYÉü‡=ÌTeùú“7­ 2N ¾%½ø_úivMã}Ý«R¢†tS®U-½½ï(¢t)Fq=vßʆ¶›9r¶’,ݤĤq8ê+ƒRÎ}×y«d²v‡I™9M‹9Lá×eä¨3.jL=x€—¢½e‚Aó„VsE8ï.½U\¤¨+J‚è„¿N¾Æp³¯î{œºcWñézÕ%œn˜ÔP(¥/Ü÷ÝÈz«Áu¾9·÷Ë´êI8Êdƒâ|9¯êÂæ.Ò¨IêE6+]rg ´')÷—C•ü˜žXQ-xß§”ó²‰~õÜŒôÅãö¹'’aNÊ“‹R ! ÁŸ—UI_ÄűY>ÚñVMœh#wµ(²¹o9Köõä£Ó²§)ë@@ ¾nìK!aí,S4§X¯’"ÏŠ·â˯ŒŸFŠ‘…·'£Döã†X¨¼¨’¶wùoÕoj¾³90’Ýa{` š‚L/ÔL9I¤Àî`’5UÁœ-з–ݼ‡e{®/xQÉíez„_ü©ñŽÁ¯ònÓ7<4mt§â‚ø‡«ùøo©nzò¢…CÔÓ §˜A9‘*š6°º©Ÿšõ±'sÅ&ÜlxE•ê+T Õ¥½¼Skz‘.çÞ¿—ŽŽ8óŒU÷ˆ%ôÖha™†À½öþå誹ȶu¹F ~ž@Ó[Ï¥ü„ÅÞLžïnsIz-Åqµž£ºëe££öqCÑ«\¶<^§˜3»e~F9_\4« t8Dßriج¬}‹•5oö$*í'î?áàçx¬Î´•"TÒ1UsH÷’ê-œ~^+%¡U{pÜÇÓÁðð#YwqÁÁÝ&aPíŒÐØâ¤‰­Ê%¢‡·Üà¦éŒÅ²v…Th4®ºav¸gja`Ê6ü]\ØÀ‹Ë+Þë3ÝGw™sKû¤t4l¾jnŽ£vðEAßúÒ=d-[StjZÚ~Ž›^ôüüëfZÚêøP3¹¾¥›À#mq7²³%-¸èð¬ N&F¬CžA­x,6fõÍD_ZêI>ã_׊æ(Ìfù–Fí¸‡Ž'QÑ ©«ò‘’Ô‹=þ|©”ñ€çO{îxJ¼áì_ðuN+á…3s‰0Íj?oÕ jœO¸Þ³û*› ¤·‹ºéˆ2]ãîÜZ¾ dœË+_È?xD9\ò¥WT"ܱeu³ÙWKXÂý•­‘aþþøC>ÛOSŒŒzê×x’ï‹'H0%ÕÜ/š ~È 7W g§Ðà·Uxk¬®WB=ßp:6à°øhÝn?9GŒ$9%j•èÓÀJ šâ¾êtnÐ[ê¼Ý(k•Ûë¹:ÿbï“\»a±1Œ=R»Zß­Õ´)y x¬eúŠ+,ætÐ;c"ì[ÂÍd4¢iåÌê˜mÍäÂ35÷D½cFºé5­AÁ×ÍÞHŠªÒ%DQtD!Ü|Ää ¦Å =¯„“ÞNÝ”#¶×0zþ#é°qЦ¨õ-/Þ/ÍâhªrC©~6á‹ìÙØ~;ÙÝG5ÖºF¡ Mþƒz¯IåáÂB“¨g#WOU˜Ë™i.&?épé£Ýì²òg6¸ÊåÑJV-L›t£8õ<\Ï]…p„_ú¬ªÄ¬òoì•ãsË‚&,yŠºxÂÚÏVFº —Gõ°·Í¼/ »Ö9X¸Ñã’hî%¶kšõìÒ·®ž…ÌÎ?R+‹’Ž3y‰ô¾†ðô5Ö;ŽºªÂ)Ëày‹¨û0\æA®ïã³Á=)d½˜-”*ÓD/ŒRd›L×}T1è¯Î6‚þŠãSÊIÞ"w¯¯ËÉV$Aí²–v–¬3ô/äQQ‹…§¼‹âº |æ½ • §åšŸ\£û8ÒŠ¢AöÁ+}÷h³¤Å®ôPnÕ¹ç[²|2}u^c(hÅà>¡Hý\ÄI-u¯fïf[`¸9–Ç£x«úãUCαwÅ6z5tz0#KÞÅiÖ²¹–Ñ÷x̯õ0¸×H’“ä3·ú…æÑ8M¤xmL}³ù±Gv endstream endobj 1001 0 obj << /Length1 1398 /Length2 5888 /Length3 0 /Length 6843 /Filter /FlateDecode >> stream xÚuTÓýû6("LAB¥a”Ò0º¤$¤[’±ml£AºD@º;%¤„$DAB:Dº‘þ3žßó~ï{Îûž³}?÷}Ýõ¹¯ë;NV=C~E(Ú¦ŠFáøABÒÀûÚÚê a ˆ€0€“Ó‰³‡ýmp>„a°H4Jú!îc``Þ¦ ÆáÚhPÃÙ‚Ä¥AÒBB@a!!©¿hŒ4Pì‚„µ€h à¼vtÇ á¾Îß@.7$%%Á÷+¨èà !`PŒCÀð!`{ !‚„áÜÿ•‚KÃ9J ººº €°h \Ž›èŠÄ!€0, ノ Ô;ÀþŒ&à!ØßC´-ÎŒñ{$†ÂâCœQPˆ¯4T×ê:ÂP¿ÁZ¿|À?— €þ“îOôÏDHÔ¯`0‚vp£Ü‘(8Ðiêªj àÜp|@0 ú¶Ç¢ññ`0Òlƒüj TUÔ‚ñþ™ Á qX,Òþ猂?Óà¯Y½vp€¡pXÀÏþ”‘ïî‚–û…vEyþ}²E¢ ¶?Ç€:; £NÎ0uå?¼ ð ÃÅ„$%D$Å0' Ì ‚üYÀÈÝöË úiÆÏàíéˆvÚâÇ€y#maø€'ìâ0Î0oÏÿíø÷ ¡Hhƒ#Q€²ãÍ0Ûßgüþ1H7 ¹ž~  ÐÏÏž,ñ ƒ¢QöîÿÀ­XPMOQÇÈ”÷ÏÈÿq*)¡Ý€žü" ¿°˜$$,”À?xÿ;ù§¡bÕQ¶h|Äï~ñõwÏ.HÀõG!ÜÀ'ÓAã© rýÃt !1!þ ôÿÍ÷_!ÿ7šÿÌòÿdúw¤êloÿËÏõðøÁH{÷?í›x,"Ö ™˜ù™-þÌ*;­jàÛ\?Ò3Hs4~e¶gÁþZkÿ®4v/DiÑžÏÓІávI¯ fü&Y°êìwT<®¡kGõj DY·ŒŽ¼½¤æ icäàx¬ Gë_í + €Æ¦êmý1ð–Çg‹êjà 0•ý“®DÜxQÁé™t_‰Ä¬TÜÕ¸ø8š¹­(/A«ZùØ(iFÚ5’,]è÷¥µ= 'Åu%÷å/ Ë&5 ƒýd¶³ ·®UyôãŸ6÷·÷Fš¯O–l 2:T µ-_ò£®ÏÈë¤ë¡ÍÜ›Ô 7¿Ç"ªBªÕPpgítž<¼xGBüÖ¹½óše®RïI¦GЕn¾l“³x%lÎ_lò¨q© Õ‡_ëYoõ›Öz.±ZÁ½Ê\f@žþn"1”åïb+;²4I—jæ!#Ó] .¥te& Ú<°Ž°…€Ù2š?Ä‹B¬\éI¤Tj°À#•Æëý$ã>å—š 7 4U[¿Ü\ݦRO”iƒÍŒ%ÈæZžz‰¿ZT9uŽçª+è^®Br«4)ŠO†=•_ôñ?Ÿ¤•LfÔ¢æ›]ôªc¿#U˜F ˜ÝÙfˆ™è}ž‹d€ó?ãì÷–ôñfµ|ª/s/Žs¬ÕU{@RØcsË+aÆU:¹•hû;®’¼®‰\•,iX ŒÐRìR’l%ªux1dûä"í%q‘Mê’†ý|á“KYfØfÊ$£eí“7ºQÉk.a+;zËÊ ñêTLù‰ý;„ÆÓã’ß®Q±ðV·z<ŽàìDô,2¶NÙ|¸ÉNóÕèŠs=¼:l4ö`Pxo-W™©übÂ.—;œhøæi÷+»>ú ?ɅŶÕÎSp.—‚wn•CÒe`aßP³èÀJÉ^!M$´ŽS£Í|{º¿Ø1‡§K‘ ‡‘šügã ÝÇwY2³\ Ð=ù¦ïÌ€|…Ç0³Be›¬éý˜µ©€= £~BFǤY œ0GF·¤¾BÌÑŸÇÞÖÅ–LUTÁ}N^4š\aAT|ÕÈìå~ÌüÊ“4¥0í¨l©3ôЗñN©eì‘ Íníï¦]/a& ,Åå^/+“z`[,ï;©®ˆ–Þ_`Dyé²…]søôp¥'µJùú„⻌“žUf²ÝÜÃÔ‚)©Æ±¿‰ü'»oíP•ñ^&!®–Ã`#ÞqÙNOMUyI‘+PNqÅÉúÇa­hNî23µAšÔÙg÷cß­Û]ë£'õ>)ÁÒ§:¬MúñžsÍ£c`ØD%³LuŒˆ%KàÚ:ƒZŽ$nþ‰þDð ‰N³Ø=ó¡^Ç$céUßEƒ× ^q›ºí6ÆŽŠ]ŸÞ÷½æ¥üï9k-ï!ú ›>i²V´@‹ÂÛ’ ¿˜ôUŸ9](Wõ‰„ÄRÓ(o’|@"Δ¿‘ïèùíŠ9KË̼kî7×¾ìLƒË8Õ>×ða<“Pb9^{ÞÔT³s®çé^Å  VWs[í1ÍM£‹MöÝÜØ½|‡¨:ìšÇä`Î @n]êz”(¤Î8¯"u¡ÝɃî:˜L7HkÛÐ1WÎ^V¡¥÷™aó’X ¼BÖ¼eÙØ3ňè¿Ð’Sº(âT:U‡§O™>y“²ŠÈçi0Bê†Ú OEg½K×ÉTÍSÑ$ù<î« .Žá~‘ºuséè©%UcíñƒœÀÝ…1UѵÎú½âï_ˆ® tâ JŽ,j‹ Û]Íðä⃒µ·ópÿ»ƒ7–j]¨@ªöb©pTÖEÍFN_çtà$ß`Ð øÞgëa‚•ýI¹´òÖ ÷ã7r×0—oˆÜ¸eÁaÑA›5ÒÓYyP£±Aä}) ~ÃiîªÂÃw6ésÏÔÑÜ|_+Ôç3„<’||/Zý.Ïô ‰!3ÆÉÁºt‡d#Ìd=Î?ÜpKTXXã-¿¶ìG5ªLº7vÊp©*rPéÙ©™˜èNž«¶Yñ² ┪ůªjvONF)ž÷Ò_çpù!*&|UÓûÍïa\à¢[QV oÏ„âEú\ñØÁxAœ‘ÎGrUvƒöúšB=t+bÅ­ƒ…·ÁHÜv¢ÄDýfýhc_,!B©ï¢«ÍÿÕíß=»eê>Ðd«j?ó…ñ¹žnW˜É»\¢–ZéýñKk¨’"žˆ¬°gÊ%±w õf[0Ûõ^ň®|µSu_? (Â51ÿzkEƒÏôW×÷ùêa|f ´m-‹8Rè JÚ´¥„ÍÆR3áüÃàìDØö€òÉøb¥[.êÓØÊ–£E?h‹ŠkoA€Xc\²òfVÅò¢Ë^ð,ÆæîZtm^q¥MY´‘{¬ç±¨|#—òÜÞ $ëÇø ƒâ*ˆœß­½SR3èa¹Ý20šOûšÆh£ã{n7°}ØñéѨç†ÙD$ÁŠq$‹ŸôÝ)âÔ‚£²ñ;G/òï9 ŒÆìRÚ»^Êóèì ½ÿ*öá„}<¿9Þë[f¿sL«Â^`-iw§mf—Ù,'<@ÞàÑ{ŠÔ ñô+ì‘»ßVùvåòÔFÉ,(Å*Cd¬gÝ),¨¥V¤cŠWÛö¶ 8>öòSö) ïGÆp`V¶O*ç>&%Oímotí g_ra:#¶2µÏ"Æ—òê 9æžß7øòc¼¸K‚µT¿“Ü£Á»qaé÷ ^à<­kè%ˆu“mߤ5ÃzëŒCvè ÕMNŸ êa€úèá¿À ny@‘ŠçÂêØ ±í>—=³{¸ð†râžÃ›Á ¡­ i¸P·½èJ«6F[ëüÂZöºÕ«b&ÛWU=ÑÔ“§BÍ}k--_»=ä .úHÖF´ÉüŒ,`ZzWM<€Y¿wöܵuØDxè†Ù=@5Ì3’6S”Sèqvd S“K…°¾éOèÅ3#|íè’VH^ñ–«.­kk]PêwG“ÁÌ@ëjêàˆ@I Ùï«Öü:Åörg½áù /®,ßOx˜ˆÖÊ×éÓM«ìøx™ó1A@лó8Õœ§3GvcÑ‹V;:4{‹ÀfÛ×yÄHœpúQ=ÈVÅ©ºÛ\ñmÄY„ peMÑÐ2Ø48#ò¸¢d6­°c-6RÌõ˜*þ¾Çû‘RŸ%i§sÕ‰G«<,ÏLÁ/ìjƒòQšê ñ–&Õ°.šÃÌB?vFÖ5‰¼l± ¾ö>‰WKÁä'ÛbV[¬ù„Ó÷ëIK_ic‹aÃ9 ºÚ,Jh¥~±û$Æã×ëÚ3^Õë¡ÈÜßhÖ§’}ÐáÖ¦¿»À¬¼·R§Y(ª÷3qüâ]LaÕ¢Ø0:äw²“‘R]@g —Dº‰Å­37AZ‡hx*ëlÝ?¿TÊÏ ì"Q\]”|!¢hΖ·‹kAøÒÃßM$æÍ÷ºå€C$Qä>”ùÓAâ%ö~¯bv®sñ#¿>¦„bR_ººçùÅ7TÌ¿xùEǾ§6 tk@Ôˆ½1:cèm$i¤9M”ýªU}íÖ-„ëù@Ù3·§ò?ØôÔnꦨx¹{¼ÐìWÊ8M ÒßäHŒ4›õ,ØØë ¾CY<V('®^—uÄ}±ªgw2™±¾Ml¦TÏí¯Ä>Æ8Ñÿ–=zÏêǦô]0ˆlûFÚ’ZR)…þÝ-òég”ÈB(V½6‰nóŠþe›-ã1¥ÜNþ›¸LØ{c#‚°lcþñ^®Ëö ŸoÓg„e¼Õ®~ÄЙ;Ødº<Ü©þfép/#°œy=Î܇Krþɤe¾#âc¤MZ€_Ò)Gb‰NrZâxÅYÒr@zNMÆ_“„LØõ€Ò*»o\¾/i‘Pa T+L,¯ióªN—Uuz6‘~ ‚ì,×›X_·*ÛYU÷-\&,ÚøX9u{Ջ䘌½YtÍað)¶­L|“‰@!ÚÖv3Ã~¿4¦Y];Ó-²=×TLÖÚ¿ È­~)×&{%Äm}Ü„4d³¢Tsµ Œ®¼„´ð*ò®Ë¶‘A·’§ç[‚B=ǯ$£Ú AOÚÉNŒ›wew\r¾m_v?ÙÂ=ÌØðyyUà?3oÒ$çÏjâHî¬ÍIö 6°#Úd°4d–]+Ö$˜„Ù?R}O°¼óе`;åÍë  ñÔ“NïÐp)},ƒì¸…šÊÁóÓUãŽG—ö߃N£i£¤ßN3õêT–—­WŒ$è]5˜Yjçc¥¶ÃiójØ|ahZ—蟅«Â9 l핯ô¿ÞH&n&Hó }ó âMx“ÀõHzÿòRk•Ú^i>çp?³Œ¨þšqÿu ÒÆy*~=‹£ó/íýUØåÑ»ÃÊ2_‡öRÁ•ÎÅ˘a‚üGì쬶MûijßF‹6/OnKÌ?}" Q ô·§|NÇeiG4í”OÙ¾AòS¡UxtI^¶5fhÙ"ªs7ž’à‚“—*=«|öfJ AȸJ(ì/BOrg h ³©5ñžàÊ5ÉŒ®jÞ„áá‰ÙÂÚîµI>Óí…ëeõÍ,¾ôåÞ<¼60å)_¡¯aUì›.ŸK/èÅv=ßPÉŒ›Xõ1,4§Â¸2zß3>o«…¥Š©$@‡*~°ÖKù7}2¡SxœPé8êý‘´Ä5÷”Émh1Œ>mÇ«ÛÜ–›_ÌgòºyÁ$îŠYÄ_ªóo(öhJ/ÂÚöȼÀ=«Ê¢€ð S ^¥»Y(×N6oY~ßqZ¤ßZñâ+"·à׊ ;"]PnÅ)µÜÖlÈÆP“÷Ö’I‹6ÿd‹ÆjŠg¹¥âǼ`×ÌœYß’Ä9ÈeÊñг!¥å­1‘˜«‹¥7  ªÙ “xóõA?öPÅüU¥+øÙ‰§ùD˜vì/Gù¬¼ˆ?ß°?ƒ_¤jƒ_šìœ¨µ×u++<§3¹ Ï•-'æ›2ᡟE/µÊŒªTDõ‰‘3mc* Ÿ&|T²-Hyt(uý³1½‘ ”6ö×븽Ñ~L©nY!Oí$ÁqÄ×¹ÁZñÉöû}nãôgyá˜dùÕôjÓÍDLK~â«dâKô$ߘ¬œÝÝ™P×Ì +˜sX¾ÌIÓ·LÉæ®|þØöó9¯û*Óëº_øµ‘¡t’¸tV5æ<êIç™l vÚ­‹ç „^3Ç}<5ï˲ïÂ¦Ï  m! +*Ú|i#y4Ì´Ü~›RP×y'щË$ðìÙ1 ƒ€”-O÷À„‹·Ô.:5ßÛº%lMá’'Ä¥ŽÇ9E' —ÏúBJW%ej¾ä;™Í C/‚(__‚‘xÕìîŸÈtEÐo­¦«i´õm’j¿z(ЉÊR·½°r‰}2×ò“éêùÀ&md›‚Eè/½dÃÿÃQ <Öê/=ä&|ˆÂ¾kï xpímTëýX²ORcÑòÕ"Ô|°è$“øÜ§kåÚë{‹´/¹:âÍuÖÖŠ›»n]^{¦›Â ¥=ÃTd~@Ý $1Ë™jRÅ)\u›.·8¶Qëk —kÉóÆÎÜË'¥*ESÛÝ#È\®W› Á”Ï{îôb™ê¸ ‡‡.Ž4+ &±›ï6wójóë> stream xÚtT”ïö.‚€ C "0”„twHˆ„0  13C HKJ*¢€t§t#©tç )¥Òñãœóÿ{׺wÍZß|{ïgïwïw?ÏÇÁ¢«Ï+g ·‚(Ãa(^> @AKKM ñ‚$P”#䯛„Â@Bá0‰ÿP@@@(ŒO„Âà´à0€º«#@@ ðPB@TâÿÂEÔ ÅP‡Ã H¸³'jk‡Âó¯W˜ ..úàw:@Î ‚€‚A0€eqœ9ôá`(åù\’v(”³?¿»»;È ÉGØJs?¸CQv€Ç$á±ü  r‚ü™Œ„``EþñëÃmPî €q8BÁ“á ³† ˜ÃújšgìXóààïÝøþ]îoö¯BPØïd wrÁ<¡0[€ ÔÐQÖäCy @0ë_@#ŽÉ¹ Ž + àwç €²œ„ðïxH0êŒBò!¡Ž¿FäÿUsËJ0k¸“†B’üêOŠ€€1×îÉÿg³0¸;Ìë¯a…YÛüÂÚÕ™ßuq…¨)þ…`\$ÿñÙBP ˜¨˜0â€x€íø•7ðt†ü ürc&ðñr†;l0C@| 6̉䠮¯ÿø§E" °†‚Q+ˆ-FòŸê7ÄæY>ê0b¸'þúýûÍC/k8ÌÑó?ðßûå×ÕSÓ4Påù3ñ¿còòp€¯ 8€WPŠŠD1/>ÿ,£ ‚þmøŸ\5˜ “ñ§]Ì=ý«e·¿ àú«nÀ?‹iÃ1´…¸þÃr3 ŒyüsýwÊÿ⿪ü¿Xþß )»::þsýŽÿaÔÑó/ÃZWFZpŒ`ÿ }ù£Z-ˆ5ÔÕé¿£j(F r0[ ›y„ù€ÂüP¤2Ôb­ Eíþpæßð—Ö¡0ˆ. ýõqÁdÿà ì€ù€ 1Äü!1jCý^ã/‚ÑÓ?ûP‚áÖ¿„'(òB @ž$˜Õc,€—F¡ÖßÔðóÁà(L 3³ÀŽ ùµf1¿3f7pë_~’Ô»"˜ÃSsð¿ìß ‡@< `’é 8øQ}EPãI™ƒ;ïÚ$þ^Ò‰± ïPö3"T—ÒˆÅrœ~zÚŒFòt§€ò3ûmy—“Œ…Éï^èJæ*Oá#^få [f«˜‰ë#ì±x¯cFÖ Š:¬¬' òL]Xºw#n¶ËXÛvésPx߫蘊wç¤ÎSUnÔnn-ËKÓ¤e7ÚYyŒª·ê5XùAw/sÅ):p5Ò,,Q;…UC²ù”$νôæRO_ïeçݶu·€µ}ö—(J¥G½ŒŠÂ„¥FsïÈ/2?¸m§PyY©Ü’ݶî*\äN8©Ð>´Cn›³Üwę́¥ë$ÚÉÑT‰{‘’Õ';[ö=Öl¢(¶@í!0Ô"ãåçQJ?`uú2§/X^HC  ÝÕ¢…#fý"½ú¿.oþ ÆywU\ •–Ô@¼¼4äeÚŸvAµSe|µ[)\ç°ý™„ÛÀäÈÊ'F3wbžqd¤N¨F}õÖ ‰5,ð‹(É#¥N­Ul¤û`vk,mÂÑŒúH¶0Z¼€Ý»Š_0+>«Ê¬üNŠ÷Ñù–@P¯ÖÙ'ooü­RWHÒͲhŠ˜EÈ'B³ yߘÐkÈÈ’œë¶²jçéýºr±©’§¯Ðñ‘ÆÕ³žù¡¥8Láo–äŠ6e7:ö¨Š=)îÖh“ÉÈrh™Ô§'§Ó0, ˜ó7’Í”øaõqúªÝ¶Q.å:¦›2*ÎíH°—º®%³Aï yÚoïEþVd+xÜÇEåG Ѝ¸žØI£veÞ ò„ŽlyEªšØiû±s蒥Ƴ¹8D'änLv>ø9¨»«QPFF}îåB×òÚIÐ =­ó°®`‡ÞbÑ[‚ÇÏ×UÔ|“ˆÔ(?LJ”²P=T¾êÆÜtM À)õÓ0£y ‘y7{­°Küjéën¶¾¢ÀyzC•‰På™ÃfEÓg NC ·)úøÖvFÏ•‡Q‹Í¾Ý…ï±[¥¹å è¨=M°—¦Ýë Ô›N­ýè9ÚvyÖ®"ÞV´Î`Ì–ý#Ä,Z&¹§¤8E‹±èà…á}Ó冷QOž› -çóV¢E\ۊǯê½È®X÷’{®•¾8ͪû7›ÞMƒ©¥S·gíõžtÍÇ¡d ›ä(å±5†Ôðûë&twmáxÍ ²°ÎXß'+ðJÉ£C ëdîÔßÜYç;±Æ¹m@Fò¸Í!7 w÷ÊyõÄ)Fy~£‰‚½ ïd!ø½$gdÜ–NZäÁXPéWÜØžB•ªºLÆ·œSãy»:¹ŽDvjøü‚ûq†Õcœ/I/}”D›÷`wÖ±c±ç’™$ôà;=¬X7ãŒâ·Ï\]›8“È%A±t|ã á—>;Ñ5m Qûçéã??-z’Òã+}äRê*¼^pzmxÖ̳œÓÒÆ!âìxEÄVÝmÊ2ÓŠR§ÒÖ5hÜòãZªØÏ`Éæ—]Óêï0×îæåC8àBïXK“¿œw§­„äSP=ÑÍ£’6ÊBÍR–çOƒLV’Y°EnkD ê¨ØëízÀù>ºã¹rLIsðT–KXêë±ù i|O¾XI•z€&lC¸òÚ·¡gêXìœOÊ‚ìÌgÆ'[CíêC¦s& w›Š?a¯µI“ܧ üÖï WßEMå:û§þ&‹›ð4½‘ª9R#;Æ~ÃWºI8aFéæï öüJ×*Öíסsån§–cijË?UKûC¾Jn®ë¸;Ç.§½âÊÑ­û ×Þñwã‰ga·Ë•Yº„w.¬$¨†{enj‰û+„–É£gnMÈ– ·7Æ6\*=*¸A˜Íkç•yâ_×cƒKÓŸG|öÂú#pú*GpiKÚ/pûIB6˾&õž‡±…­gÆ7q1Ÿœ ¾•‘Ì—Ç~¸z\Á”| ;âœ$.™Äµ2TÄÓX›¶él¦+Tkû6K ʉËÀظI…#üPŠ7m\âÛô<«x.|~I "Šyèù` Ûϼ8…ã éè¶+G9Þ,KN)ç1’‚…&DŒf }þÂ~p1†ýî.Ń缒1ˆöñÅBíÎ =e¾lÛ÷lm±»–oÏŽ®^N¼xnõÝž <:.‘àëˆz”/¡– ô§ÛòV Rž±âµôö)îŒY0•çüøåÓýº„Z‘*•»Ë¯”íªy%ý̈»ëÀÂïMüšý3ƒ§lW+*)F Þë…c=†V™f=¨[0ö¨µuo)c|qe,X5.¸ÏÏžL+ÏKAú˜WÏ–öxw¶Ãm—8 Ä5ôÁþ s7.Ñq,àZûÕ¸È 4¬@OUl»úã„!c²©ô'aIð±ìÇÛ‚â8POe’D*3%­A;Á¶Öù·g¾œiMÞºGI5''xÒŒxô#Ïý£àÄŽÈ}Ç-ó^ç?dQ#ëâ%x,x:îÄdJ,{¡4¤ ®ÆV#Jˆû9-uÍg$h7·ËÛ,l°Y«÷—±ˆ’<Ún$gñ@óøWd|¢æå–ùW-\³P–:; b:8Wú­~ñœycOßLÞm›‘­šAúƒ™Éߢ­=>*“Ë'![0@OSº@yê¢ñêŒL¿g“J^u˜B¿tŽç|P_=BõM6Æ¡è:FO{%sýQ†…1Ôäýé±Ý‹1ÙU‰3׃¯ÔC]†¢%øñyTãR~SàµË©‹|¸Ø¨jÒÓEwßœxÐAú"©™ÝFå¡ÁN˜ÖXÜJUÂÈ,)1•s¦9 ÷ñâö¬K( c™dBí‘ʺMo[»U÷ &6,?ÛPqákhpÙnãuÆWo¦6ø®’ï2¯m0‹z°‹¸0ˆE’t—(8ÚM‰fîÃK7ì¦5ós­ˆY㨠|{Ãᵑ¬„P+®ÃÚÚ´ýÃÆ‚N¥uø š&Õ—·vÑ U²¶ííi–2ãÓÇ7¯×ßqd{sˆ/¤^å”W—ã ä¾²OÜ,jgaLX~)œ2e$`yLì‹;oÅX/*ŦnZñT,°òöŠ£¡_˜"F[íªŽ|8W&4D¤IòžÕaê3€SÚz¯±¡.4Ínr2Çc‚x'òÌoÙ¿Ür<ô:qµÉë+ã.h$»à8*†ÄT7©Øœ|+ÑR<_ ²00¸o±Ä®Ï?*-ÎzÄvSmҽȃ¥1^àtS²tw"ßV?ôHíõÎÍ_Ï”à˜s _ &?£YðÒS¨µL¯ô Öë9Ú‡Í;µR™P)39Ÿ JH&Ž¥íÕùãÄl7_y_Ó=tµÈK -RÌ‘,•u~k¼ìp‹S×ó¡hÿêƒRWk5ÃáÉÜçê!)÷F»¬ÂmìÐç_p—Ê©ä†m’‰TýµHãX]˜—¼o¢Q(`áÅíl?éèIì~“ H/°ÇL©Y°Ôñ— á0ö¼Í“OÌöC«<ÃÕv•ªÐëx”R©ïðä"AF´RSÉé#Š€Zâò`íªýœ8ÔH”¹HíŸíÀ=~¡tQûÕï§bãëš!9““üÜBëå]­çþâÖäí ï EÌ5É'm`õêd|Ã[&Gè”×﬽òôn4lãÅÊ|¤Þ ¸ ¡DGŠšÒ•ï ”æS}¥å}öÎ kI¢Æ­W ß­ê¦ì~$È"!õðòNWÆ…1ë[5½¯Ûã Q^Sj¥›_kdóŸÑXò¯Ê¡5ÔÕ²_ôÊÀ}à¸dÉ Dý4ÚÉM/jÖ²vì”®”bÞìbl¿ðÇsy`/ËÁ©hWTüóà~W_~°0o"Ëè¥Kèã³®qxÀ‰ì3©C—h5¯_k_ÕðÓëü+¡îÉæÁèÅsjöWЂ×È|~^FkdÓžnBËÜx\Û|mö çä½gßoåWíLH®f(Qáô!XÛÞÝÍ2ørÖqjZØùAß§réŸMÕß~91"žžXZ)"»³'즶’(Ir.ò¡P9 òî „’©†.‰6M?%•àG"[!ÏVÉ•¡²Ò’“HNæow oR_@‘7|xÅj(AÙ”yZbEã ùÏ._:tϯc/œöëñr+/ªm÷òœä»í6’ﬕ)Ä[rSþhwXWKôÙr鞘Ù*’¡wÍrµa˜ÒÆ›ý(ÏÑ©„U‘S£YÊŸ‰Rág0«ƒÆPÁƒ¯e~ê¿€J¾GŸtb×7²êªóÄ ËžXÅž1áäy÷ô¦æ&pMOÔŒµ6¨txãÉ„×tô·Í¶\ýŽ¯È¥ý$’ÂóÚi48”N‰ ój»a7gUR‹§Õ‡Þ˜¢7ûqÇOÞÞïƒ<ËŽü×Ú,ÓíÄfÞÂ(Þ÷’rôc¸`ï”\£¡þ›6|iÂ8­6`šÛ>Õr%XœU0$r|ù º]JÕe¡Íq–;òMÉú6%ïŽëåÚ“ ¯äÊe¯´$ 5ïø'à“R~%ägùxiÇØÅTæ¨4ðbñÞ´?ÏaGùƒÓ\á‰Dâ€GÊpV’¸È‰@Ð÷ðݧ—ÖÞx°ÂÚÍ¥ç´ï^O"¨øH$—éžg@©K3²aO}DùãØLÆÄëï=„»|OAÌÇû/5ÑÃ*wv×?JT…o›Dç~2Y"¥–žòÕ N{Ps7˜ì>šÌ¹ÚÓñJPÖ·7Ó‰t-BÃ`3‡/NA­¥Èývâ§9Õ=Œ?{þùÀKPºe|sL…À¼3ÙÄrwz(Š”ú\ ïÀ>¿'äË–ïƒá®ü’O+JÜ Ò6 ÷„.û¥'vä°*ëԪ͓Koݸ=¢éürevy—ÛÕÒßðÉ>.$|N2ˆËr!"¾b×~J¶²ªG‚ŸÌñJútÈcD]0È@³zþ°´ <7¹+†SŸÿ¾OúXã¼-³Û´Ó©ùëÃbuzåé¡[ªŸM•å]ÆIá&$O.NÑGQem㸻b>ÍLé7JV¯%kò¯‹qÕÚËTÑ.¨p|óÈ×¹J4¹ótfIÖìý-‰i|®ùúЛô…Ì úJØ?Ó'ƒ€’`Uœì˜+Š5¸Ü¥2(ö¡ï#O’±q»e—Í¥¼9iê7ÑÈ‘äøœ…®&CÞNÓÀÃ}ŸQÈ;c•j.g"¶V»£Îjöô¼-eÿUN¹µoùk@ê] o<È›‘ÁæÀ¹Yã¼ì-x’ɾ‘zBh0[¤»¤XA€Ö7®ND_§½©£üBv5> ý|¹“‚{1ËH÷Ö$Ý)¦³”·QþøKœ– ßÍkõZ2Øâuõõëí6ƒ0ÜŠÒ½§¨#Â?SÌÆh-ëÎÂ`±KŸY¼‚öÂÖÑTQòæ@…݃–zþŒ>/·šÁTÉe¬´ù J6JùÇæu¹U¥êëR_Ò])Ò®b;ùC×»µ[ÜGšb†²Ëã…ÜŠ”Ó«3ý]nGo9 T<«xrzç.Ø=o0º?ŒëÖ‹ -q¦nߦ€.>Ÿ¤w4hÊUñ¢ÇAÅF¬ê¹ž;¹Ç†Ââòá KŸY§jòYóf5o¯±®"öAÈ÷ú¹™VΟ²%°–öÀ/FU%W$\7F¾s/W{œÝsܨ˜¿/ýi<¡BFk›øÝëú†ùÉÚ)q»bà£H¼øæº,Ÿt)ûGFÕc…P¢ûŽRˆË¨lN6J&ÐÓ¤;4@áë\ÈJìsŸ;ŽV¢(û&jµkIz“YÙÑ©*<\Qsx §ë«œ+¬þ$FãV~ ™²feDÜ=ì¸a½„ î§Œ<úÒ9ÍÅÐëÆŽÙDæÆÆV¶{«?îœѧ29ðuæñ÷¤ñµ€j©j½'̓]¹QuûéäjLõ(:=|îÍ(rjE£ øEéT){Qrøè~QTøCÝ·Vá ŠšÝ?î Ï91˜&Èîè¬ß9wŸ£v/Yliz¿WÄØ‡&‰«ªn½µÂCxå†î€º‰‰ˆz¥si5H´¸Â.ïè-|è£üü.&Z|ÀÌÌȺ?õ<µàêVõp>¯$p›ÌË–çÑ&N~ßøÐee«âð/»­Ö‡­5_Ϙ›(®Ñß6Št¼%Óœþôµï »WUzûÛM¿qê:w¬¥4q¾¯òFõfÝ_p"9—ƒÒ±ïRV‡h¿5–/霃–´žI¹‰9UMu1ë°}ÌêËJOTó^ˆ“#LO¹i KiPÓÐÜeÄÖxëñá‘ äÄŠ'ùÂ3:Óž§føõØj¡Ë­›^šL!Å'÷×kwˆØ½‚6ÛßdÞ-‘óe&ß­DjÛÁ´iäU¯³Ž¨Rù¼­ð$R}.®CÙÏâ¦*V™±&Î#»¾à´'á²Ï»<¹zÄÀðé4—-`­Q¯5™OÊ‘ú$ªm};“YíV„côöíCö©–*+rd]F%©5).Ü€jwØ{¡Ê3ÒÑ+ß´§ï°úPì®MëÒùdòÖÿ¬ììí4Ôq)xyóâÓ~o ïlÇûÏ}»{í‹)Ó”Û‘?-¦ñ>jîê?Nbû”õZ2 &(3Œ¬ç‚Ÿðz€+G²)Q•²Df󺈓Ù§PM?û=âépYñ£vËGW~ãÎòDblñoÉe«(QâgÐÁ"CVVÉ– ìK0]¤¬k+¶íMò”|*_i)Úf4þl¹á¢jP³F6ä–Zñ² Od9«bB]ŸÈb[õfxާü2ž3JëtI3&c†ükIq.‹é=Úo·ôÇÓÈÁ‘t3z\–7«~0ø‡-£¶s¬ü§Þ˜ŠiBí†üõÝfêñp.»¿ÉLM½À·Äaß+i}4<ô½HY¿u/LŽaŒùud`3U׎%ùpÿý!*Ÿ‚Ì­g5_ù[Œf»9äx„+rßÊ™®îp+èɦ*êN:Ý2…î÷OÝ¿014ÿ¹:Aì endstream endobj 1005 0 obj << /Length1 2709 /Length2 23818 /Length3 0 /Length 25329 /Filter /FlateDecode >> stream xÚŒ¶PœiÐ-Œ»;$ÀàîîîîÁ!0¸»»·@à®ÁÝ ÁÁÝ!Èìî·É~ÿ_uoQ5Ìi9Ïé~ºßw(H”ÕDLíß%íí\X™yb ª,Ìff6FffV uKà?f M “³¥½ïbN@cMÜØ§`ouµ°°X8yY¸x™™¬ÌÌ<ÿhïÄ 7v³4(0díí€ÎböžN–æ. cþç+€Ú„ÀÂÃÃEÿW:@ÄèdiblP0v±Ú‚N41¶¨Ù›X]<ÿCAÍoáââÀËÄäîîÎhlëÌhïd.HCp·t±¨Nn@SÀ¯‚ŠÆ¶À¿+cD ¨[X:ÿmW³7sq7v@K 3(ÃÕÎèP“‘(9íþ–ÿ;€ðOo,Œ,ÿÒý“ý‹ÈÒî¯dc{[c;OK;s€™¥  $)ÏèâáB0¶3ýhlãlÊ7v3¶´1~ øK¹1@RD` *ðŸòœMœ,\œ-m~•Èô‹Ôe ;S1{[[ ‹3Â/}â–N@PÛ=™þ¾Yk;{w;¥©Ù¯"L]˜4ì,]2âÿ„€L¿mæ@333èz˜X0ý¢W÷tþådùeUàëí`ï0ôµ4‚þ!x;».N®@_ï?ÿE,,SKÀ{ ¹¥Âovhö7]¾“¥@—4{,æ_ÿ~Ó—©½çïð¿î—I]UNKI…îïŠÿõ‰ŠÚ{¼Ø™ ¬Ì–_CÆúâû_ecËdü‘+cgfàù[-¨Mÿ£ØíŸ þg9hÿåR´M-@ý{Èõ˜9˜M@,ÿÏ£þWÊÿß„ÿbù¿ ùÿ$éjcó—›ú/ÿÿÇmlkiãùOhh]]@  `Z»ÿªü{i€¦–®¶ÿÛ+ãb Z;s›Ûhé,ié4U¶t1±ø{Zþ¶küÚ2K; ²½³å¯Ç €t5ÿËZ-kУÃ4’¹€ Íùï‘v&ö¦¿VŒ•ƒ`ìäd쉺dâx³€vÑèñטíì]@)Py¾3{'„_7ÊÉ`ùeúq˜D#.“ØoÄ `ÿxLÿ".f“äoÄ`’úXLÒ¿€Iæ7b0ÉþF -r¿H‹üoÒ¢ð´(þF -Jÿ"nåߤEå7iQý@ZÔ~#õߤEã7iÑü@Z´~#–w¿H‹ö¿ˆ¤Eç7åÿî èÿ×´1™þ Ù@%šÚÛØ;ýRüM ŠþçPV+ÐÖÔØÙâH"hLÿccõÝì7ÑšýÙAË?@ø7ä`ûÝ~ë`ùe°ùíÿnïú§lP€ùÄÿ[ ;èb-<,€vD€lœÏ *Ôêº6ë? ¨·6@Pãmÿ( ÔÔßÌ T;ÐÿáÕnÿ[ (Ùþ?nP1¿Ý 2ÐëÙî?3ÀÎòõ¿ÀRíz Ú›þAê„ãï‘;ºÚ»MßÛü‡‘ý·ãç?žÿÆóücýo0˯›üãX@muþÝ P’3ÐÖò¿sÉñ+èöÇmp€HœAï¾ëõÐÙæ?ãÄRõûXÐK…ÉÅ øÇ¤‚úæânÿGˆÃõºB·? H™ûãÊöø‚è=ÿ€ &zýbò:ý}ÔÌ&®N +rùëÕ Z‡ÿÁý=€&Kóö&|!Vµ!í÷_DÞ¸3ü˜˜¡ø¡õ‰†Á{É©Ãõö#MufІӭÈÇ‘^´Õm êáeâgzØðÖ$•¶Ÿ>O† ªÓ?Ú§p' ŽDêáß2¨ ïú<;úhZC¶€wÉRä8ºr£(çaÞ»÷KyÔ ”­Œ…ÍÿPÙ­æ”C|*ûÆ£­X9¾!ä ÆØ4¥·è~Š,î‚wIáêà¢G !q62}ê*ã>kFµ¥j”]S_ÛØR'ËNÎG@Õ›A̤šÒ&,C'R%ìê6Ã(L—6k á~§™èZû­f™UêÛežou¯€Ydm‹£€æïŸõŽk#£ƒ wa©­÷#M£Û=¾ZÅBBoÍÝYh%,t#WWx3S¡Ë\Æ!ºµ€2XhôËn¹Ÿ Cù½ƒ.D X¶ ˜™u¸¡ûÀÇÞžräø\ÄúV6œ+vn΢/ظcè¿s*¾¾ïJ=?/À·`“0Ê £ÎÍèù»G¥ÂW l˜ .c:߬Äa/õ$–OÜâX¼"/d—‘êû±P5©äiõÀ“ÏxªY©ÑÏ‘¯B²sÅ0¾ß8,ÚÏskº¿u[^.j€}`¯ùp^é!:û]+$÷C§j@v·³Rš”HDÑÝö\ü{²uQ7Û¦8T-uÇíñî¢'wú2q ªÂ%…¹þpŸ%ýEñÂ>ü/Â8nšXk;”î©Á2ÑÖb)2wW É ;Fš4/^Dߨ©ßç‘ym‚õ-|ß&ù:½MîmS©WÌÞß àãˆNƒ´I $YØH¿Ú ŽŽ|1‹l^×p©_~[“1;Ü8ƒ%ƒí`cÆœ8–”Re®ËÒa½Î'eYmy}~$Žk¨rÖ«]Ǻá-ÐëÖ'ߊÐ8„ŸÚ}âü˜ýÍC*WÅn¨üMz$þŽe5Å|rÉÂ4‚<+nnV:úõv¡? I´Yè» 8“}ô(8°mþ9*¬áÚ¸” ULe6‰\’Þt*ôÍ—)YÔjFè¥þZ1Ù 0Y—20Ê>o.˜xβ@Í©¾©î£¹yé¹7IWQL¥£(’ æî¤’Éqîjä>Õ¯ö*ü{©ˆˆÓF~üŸ‰X˜K}àÒ^ùÛlÏê›3×G,Î×sB6*à¾|ÉÁ7ºâJ9ÂA4ËÖýØyÅí¡ÌÏÎ2Gx%à2y/ ¶ŒŠÌÇ™ÖÒìë$çÊrÀö3]C Ú2§^Ú¥²vzÆ÷ÖhþÅÏ„ˆBoÃñ,@¯µu—]‰ÝD7ÃðN¦5ïËY]õöà®Ióaù¥‚ìƒB¶6sÅXœ›7ç^ò¼Þ}Â)Ûq$” _à2ù³ú7m9ÆU9¼Ãšz\©Q9oã1Q©¬"BÏj”H9ª°>V%æÍÔ*Nerr›ŸÍ I¸›ºÝxG³Àñ‘¨û!8|¹±JV óä÷Õ^áw²cøiô®ö~ ¬ýx^뮉i9᳜´ém´EȽÈåÓ¯<]%BýùrÉ8&4x_'ï¾ë›g»TR •nÇNö_ÿ´ƒQ?rïHÚm'Ï1UÔkÎ(˜XVºŸ.Ôbõ Þçv$‘7ýVµýÆþÈo‡E“)zXT@¸æúñ„„9±G;×Þëüäaên(€¢¿²kzÛýûúwV}û²¾ @•᳌ÅWT×ý\QÛSI\Þ¸ÅS¸ÒaOλ îåu¡$rIž¼‡Ú¥;e)ÃÑÌ—ê,)¯ûžCÛtP(K°æòiŠÐ¨‰Ê3íò—áœr`–‰e‰äoÜ}¶á«òþÚHMÖºøÚN&‘. ìX··ê¢}"zO¿:.õŽ¡Ö9Ä{‘9{DCÌù™T-ô—· Èž; û¯œå95wÆ.YÄpÂJ,G¹LŸÁ$/ˆ“Ù<‰ÈÒ¶MP¦¤tž×t!m+^[½&£%ýaà1lÊÊI{e«€P‹š¢qZ¢o}÷4iâ¡VÕ†W,ñésÏ׋ÏT1pšq ;Ú$c† Ë:”?3îwÈCMxÜCáêN¼ÓŒ@ǺºVÉ©FVW~½q Îy@ŽÒ':¼,;ù[$=6'¹â\ćDÑÙxÀÝUîæã …Íp9Ù¤7”ݦ½ð5Ʊ ¿dc ꔳÑ–í Å`TÇ)Ð ½wãó^+ƒ¬TaÃÙ×Ôä[Ìm˜AAƨRbTÊÚ´¤oçæ.Ÿ' >î 5ÏÐØ&•Ü|”“¼WÏ}ÿóSB§f`¬ µyUÏçå÷ß*cÖHš÷ËæRæ¾ê}~0fWaÁý2æ(çÙrÔ,l.+$:XŸä9›ÆfØ¡x%ôÀÁVæïðο•ÏòÂ×E?/sBŒ,Ì+ vSïŒRââ!—‘·|¡LY4óÝΆÓ<\>NR©á’_þÇ‘òxR¬ˆÞ¨[X’ÿú7›<ʽ†{í õTK`ZËS?‚)»ó˜å/øØéL–ð–Kß\áßgôŠ!põ{‰HÎe³#x2^êæx´l­¹°ˆ¸V–}Fr™dÔeÏW[d}ïžLgp)-8UàY¼«]C M#!òÛ)ç£ãrÐ+p÷ÀÇÐÞ’B0Xã¨_ÝOÂÆx›m¸Ú’"Õp÷ýü €šHɦ sú”Åh•Û•ñÊ•ît{‰ôñJïœÞßk¤~šÁ¾­z#Çr˜ù“súü0>†‹¤Çäéì~êÀüÅ6!¦ÁCÓó¦a}ú3©>™—^j±ƒÛeòg°„´ÛÅF'QžäØvÍÚb•b,ý.e¦Âdw%Ü`SÖŠá³Qr_Àsføò»g“l%©a£¯"‹Àù6¿š¾Tôþ<O¬D{Ú mä,Êý¸=€‚YéÜ]ÄÃß ‡,&aªyg±Ù1ÒO­’4!Yh¯ÜÑ¿5ìO^ßA:ÍÆÖ~§Ì³Às¬ãÌNe´]I„|ì´¬õÀ«˜\x<ì˪u†Yë¾:x¬Äóþ5ÿ©RQ6æè¸V­$†þS‘‘gY´J |ÄH²žÊÇÞ7’´e«–ê81ûŠ€[SÃ|£à‚05 õ:ÅV9®¸j8:Õ´ùc]§ÂŒ§aí›ÌmG o{Íâ[¤Â¨»EípåÇk„ Ip ‰¼ã«—èó¹àî9TéhªÚApá T™¥MŠü×”ÌnÝ®~ÊΧ‹ »ÏH5øÚT³+ƽê}Tïœüg7Ò˜ì í>BÊÊçâ ÂQ§#Ôîå|JG¨lP$ô–“lØX97°Îx¿Þkwè‡sb$_¯·b\ ‘ Þ2àýá¶u&¿±Úº›ÇžtÍò‰ÜÓÉVäõÔù#VïàÕ¥Î$mZ›@éݨó͹}Ö{aïÏyD811â(o\8F-Æã3¢]f\;ÄÍ÷¡æÎÊŸLɦõn«'f3(åùº 0šQm0‘|Zü2ê¹÷GúSéÌ&†¼'eÄ£­ge~¤ÛÈUï­VI”|¿ª¨¡ª¨±MבGa΂ögÞZ…âj¨ÝÓ¬³HXÌØ¶JÔ†7þ%?™¬ B7–rI|×’OÄ)µÞ —íÌ«¼k!‡‘Þ(ÞCs‘)¨l‡÷žc\Ò~{!¼h‡]fx}l·Ø ‡Ü©ô´í"¢Í l—•*m¸Žc`ºbŽ•Øà—…3ÇcDôeê¤DN4|ýœØßسJ\ÐŒ ˜¼oÓ¥âFPžç?CÓÖøù¡¡ð’)†V Ÿ É å†wÇJ¶ÆJøË£¼.X‚šYj”o¢{EÅ"¶t(ÙZªå< /‹?ÞñÝâŽk ‹¼KÒ»~Ç8A*‚cÂB¿ã·Â@¡¨)/15ºî·ùÊ,}~DÀ5ÖqD¶rÙ…åÑ6Ô3 äpD­À•L¶Šr\àZÏÀHš¾•ÅuãHé”ÊM–™jv× ß®þ½¾ë, À4É×íLJ`$³à2p³Ú?Jf²ñå(öM %ª›‰~fˆ.Éè¿ Pƒa¹]Í´¢[ Œéª„É[”i3üòSszñ4æ((kK•ÎMññ@żՇ*ÆÕÉ æH\Û˜¦&@¸ÏLDüÜÜ4".mž‡¶íŒí„䱚‚°ËØ+¸<5_];iZµlÓÏG™RMÆ¿·œþåOc6½#é•aÔ4Ô$”·-c&¬&M™Âÿ Ýžx t³ãÆ ü,ôVo[³¦ŒmàʸR„ÄÓ³}›÷b†+Ë„$ßã:%èý¤ÂËü‡ïLf¾l)G_‹†¶I¥JSÐ+÷¨Ìœ§ag‰ßii<û>Ý645k÷7Ä Ì.PX‘HwžE)I¿ÂŒÇ>4Fñí‡×N\ú'lÉ6»å¢Ôꯒ!/Á–¡®P‰Yr¤ñ‡¨á=¶|ýÒs!œT‰÷>ݸ¢>€+MÄß$2ìÀÆ^ ¼^ú2Æ ¬©˜lÅhaÊNÛÛjňÍǰʨ•JÆ&çÙ³†äGýSîÍŒrïè±wrŒDõ§3 ã}ÄÀE‹#%kH£ÏM§Û÷H•Ü®ž«äN—)kW]Ì|Mûè8z<ýHž×ôç>?¾¹ï>FÑ ¯ïtɡٵ䕾ÌéT í_¡®2*Jjv¾8NÁàV¸îoö3HñF|¿è÷ Î ÍÖÑ£ˆÓ8q[ì#BžòÚ6ÀÛü*ãI ¨¾ÕÜÈ&€WõîhS¨ÝK6ñ‡a†-äŽÐr{AZx5>Ðl2øÙºY•ñ(ãæÙ*`È–ƒj\m»W¼mlÉÆó‰+ 'Iûf^¬®rÀö Á ±ZÊ•ÃP*ö¾a‰¥è'ª Sô,âËfÌØÖ9Â&û‡–J»ß₾0t»feæ<ä„%àúÂg F‹ßZ¤änù8Êa ܇ŽÚ vdœÏDJØÌD‚6´Ñ-]+z×vú.;¦ÏŽ¿ah;¡ŠßÜòÆÅ,›ÁªB®’D\БŽÊâé±h¶ZË FZ-¶&ytg‹]_áÔöðxäñCÐûÕåJߑ︛$5*ënAxD½q Î÷„’¡Nym·Bã/.“é6iðõ± ê&OðßÂÔ˜ìwoÓŽ¡ëx®Ðá8ÛëŸ,Èdéºl°ñ_v¿7r½† ðª8&Æž_دO4Xæ|sÊ”å9ýÓÈø<£h9R·z"Íè[ç˜DV~¯;Aô±1Ѥ\¯]ËKyã\ _«Ñ/{#Â?ó#øø{ îži5Bæý° wŽýÄlG‹âRm#¤Sêuõq#J°yû„ØA~šr8ÿ'䙜‘ À¨¾„¢×(%ït­kĹL¨ÕíkÛ ÞÓÚDìùg•Ñï%ŠïÍBéVÚ;×C²ìIác–Š5àÛ½¦¯ÌÍÇwbã]ë%s¦Óøû0ß=z®5—ULA<Ò¶C ›ß¾² ½cÕïg/‘NÏËX¸L7è™r”Ú×f~Ò8¹òCº+LLœâ<¦,¸J“¶‹Ï‚h-©á"=ðSågbuyVº~pþQðÓšGæÝu¢Y~iæ4äÖëäóO:Ì¥¢wÇÅ)hÃŒ‡ßIº§úHieWÔ¸Pº—µ‰ªáÞîCŸY­ R~[Ù—E¢+ßèjiƒÃXƸIQÌýAÎéV«F ®þl¯J>õ•}¢øtO(l’êöø®ïÁ_×TSJ~žžnÇ»Bê¥`Ó€©¹Ô±¾jäÜ"zµâáA‡¨Â+D¼ÔE‰íˆ‘ž‘½¯°(,hEïea´£Ð!øº7òê÷¸y¢).;ç“ÚÚúÕwºXÌ)rwP}XdxÑ ïâS~b²²/t$éL»Üí ÙD‚zNŠäÝ£ÞÁóÁl$!$"_|·Ï¡*@\¯?YÚu–óUeàyêÕg¶á÷|dͱÄlWÄjc¼eVïÑOV(š]d`™Gs•^O3 4×{ñ=ô¿´À´ Òle÷4èØ|~€ä°ïDÓÝË’äC£W¤,¡Â´,Ô«QT鑹”ž¿ž"îRç=^”<ÃÝS|E„U{׳Æ\Ã_AÓf±©5ØÁnÖ")Þd·Â¸X§Ac =Í@jçîûL¡£Ø,=%~]}‡¨£ lðê½=gkÿ¦‡Ð¸èròò¢ýÃ(WÒÏ0ã'&R#Ë'Šê]bÃPxˆ”0ªÆ<§ ¢qZÈÞê­àáOˆÁ¹"Zf_œ™=RïEl¸36e¯Á‹×ÉL3ȱ¥‚Ðå’Q‰ønÔ 'ÂÌGwšªssÌȯ؎³¼›¦Vd…-իذŽCˆ…™íÎöÈ -‰rR\qÛ¤•>*Sá»e?:—^Î>¡A¾ùýòsõj˜‘…¼fes¶íŽ"lgqóçjˆ¬ýø óºu¦M‹IO²™z«u8D•o/qLŽ—ñžP}`¾ºtZ±Lfˆì9½DbWuOW½àɺõÒËû€Ã_Ö‡N~Ô\ÏDøô”¡R¯»ºÎ¯ÑóŽ÷-TÐòŠ Ý-Åf ü‰bÛª¨OØ}pOxLYiß|fù¾úAûÚŽÁûR­8˜êZZr@´;LÅý> vdtÒv¨–"‰SeŸ¶W!a%®S*Ÿˆ©ŒØ#¦ˆ@_+8§—ÞW›KÔ±çÈL9vÚñ@9ü…5­BµÊQãU"eRTÁý8ý«¸uS߯$ÎX§¤•¹zp«‰N´w´Fj%G0$ôÓ‡E?le“c€é_°Rð«´ìnùíBZ|'Ú>;þâŸ?D¶<ämZäà>BfùhyHlÇã”4®ámçõÕ—SMÿJ@Ùpû'ðCƒ: ]EÝA¥PQU·8òNɾàYK‰³ŒÑtð{%0ÉÞB꾈AîžbÕªX…ËêØ|hô®]³V²n3f.ùÉzBZ”ìý 3±ŸÔ¢_lÑp”bê7ÉvìîëSûû‹ñEOp±&i6»­c;ôc(º8b”ÈðÙ`–Ù>//WÀƒz—àdì QdU߉ª#¶ÊæEc O3eÛ’Åö S¢ÉßJ[åŸ6ÌMߢÎ,÷Á¤¼‰Rß¶j.`0²Q‰VæÖê"„r‹nú¡SG;ÖÑÑPÄšúå³jpOLÈ5}øæ³NÛË5ù’V¥;:uPS ptBû ŠlÓg§°\ž}×çÊU¯Y€ÜXk6òÝíCLéøÎš¨¨Ã¹sŒàQ‹Òäꓟ»ÆR°õ\?Í/ cMgí£¦ÁÑî;ä’2]Œ†œž OwèÅÊ^jrw;$ÏN~Áº"YS~äοh´U²ÉEƒRQnØ·„Äœƒ%3uu¶¨ÜfcÖò©z£ólSoÿÄåÔOSy´rõM\þ ÖV-›fÆ+ö¼6DÔ¶›Ä.É—ÇÆOÐ/Û³=ÏD´ ¤zA߬þ&`GtGååüªÝùc°ƒÝ»uïä!4Ÿ@{z&ýêèn±8ªÃ2Ÿ“v>×\¬KóÕŠ›ÅxµWªrD÷KÞ† º øÝã–Õ¿:.!®U9¥6@Àñf“ˆ–„-¶VÙ%3ßCÿól© V÷[»^zá9QŽ/`TÞ˜®\|­štªÏ8´W…õ(ŽrÚ}›L³Vs Øj°¤<’{ìòá"/SÚNýøôϲ_# ¯V'š0zÃ,Ooô£ cyŒ|bu&eg<ë/O$ä»qîVäíã”ÐÏk>—¹z- S×C§™")<@º÷ÆïAA­o4›s÷9ΦÒË °ÈP&Ö[ú¼çßp¾‹»3‚~÷¤ië4IL2÷ ú™ó×ͪô¹.®7“¶›—Æ_‚eÏ:ùa ¥þƒ’n*C÷P"(å –¯êUó)ç‡ûÚ4r27[Ž*¶i¡«p¹4Çe.“•ÃiñØ;©*/vwº† e¯ÜÝÔPš‰`‰$D¡£üø§­•DWrr‘Πt+ûŠS%ºN?3úwÐ`ÝZzY ·QŒbûŽ@JR¤O/#êIœ¸c’)!éyöõ·Ÿ ÞêŒT‰2§Í:Íà Fs;._Ò43„»–flÂ1)抔IÖ†'ø>Œ~¿æV cÍçFâˆò”gÜÅ ¸ŠJYV¢ð¸¿w/Y³¿øî¥p•Fc™7ê`{Š!çqª—µ9B®Â£Õµ•ւؽUׄÍ-ô⤬íÂÙÖÇífCS6é?ÊŠê2‚1`º—˜ŠÑ§ó±‘Y3çD Þ}/díöYÌòUZ6þ˜ÞMB¤{I½R ÍEöäÅ;JrØbþÛc¢³Ämpèö-Ÿ?BÔån°R»O?ò®íÀ1ar¼ç%‘v”s‡C¤þSXkêÛE„W{, mFhŽMòøNÃGŒÌÌÒoÃ$D¼Ì`{±B ž?eoÚ!¿ÆÊ¼ ª‹Vtúƒíñ7(ðSš•w¼É0áyUh€X[)y°äÙÒ{!"‰ˆÕh#‚5|Jw©Ý!FÅ}Ó9È—Yàõƒ ¡4ûä¢êêÇ ¬c|¨fBô•[.l%ÇŒ·!¬‚^Œ›,èÙÓ''{OÒ¶Ú–þˆô_O2 fç¢1ðæ‘_1¯k»Î{gcœó- ò΂29³Y*¦8¾7:E”>G#½êa}јfjõwuÒ.œ¡¯äµ:d$IªkBØA~¶ÚþÉš,æ¨2M†Í y˹èPÿı.3íôèš.§ó[CaÕÅW4üƒŸ7\c´Dpdnr\]àü©»0~ºÉ¹ŸŠQ1X‘–Iàó °bÛL®ð¯ hd•ø ¶Iô+ t õ-·Çï*”¹Ã–_' WÕ›E×̨fLÄMìÔÞ¼a9¤Ã•˜#”%H‰Îè27›'d×íÛ$näi`çyÛõç´9v¡—Æ ïÏJͽúåŒ{ìÒRaÔålTY7‰¶’£Ÿ4ÚÓ²«ù*ãgEs¥Ð¸ §ë/e¤‰…U»º×#QšYï‡Õ±¨”ìXàB,¬Kšï¯6‹¼Ö¸C¯Â¼zÊ.|0u®O¢–zÞÖXáçÁfó¿ rxJŸ4µwz œ}²À¯¸U¾_Ÿ;ö®™7‡…ÐYK¶Ž2ÉçîëëU/áw'&A æu]@׿æ CÒ¯¶“d/ gß.‡’®Š¹'0R€Ã5åàá¨ïj°ƒ{T«j.¸žµ †oCdzµL˜¾ñ­Ø$þEs»ØZb")B·ÊÈÆÁí¹øBk¸å")vî9¢%“Óþ>…XZ- /ãýVx¬%sfH½oqb þ'òëÓã˜j½º·æÕ–0È¿ÕBçÎ)ÒBå]®{ r×äI)[µ÷ ÊœNSõØPx‹žaIp톮YÈó4jBPYî¹yêΕñ›Gi;àüТŒ"wQ‡dAYØû·|ûƒ·íÇ ”ÜÃjÉs¼®I‡—îï$X?IaH—ùiÛyˆ{Õ„ ‡KÜTHá‡èOûƒ»«ÕtB}iŠóv¼œ:±¥ck¦„/‹ ð_‚ÐCžšgR?"€ã‹Ý¯u¸[§ÕÍ d€Ig ›d3t?¦8p‘à¥Ny(>dL¥sMjx*yÑP;iüìKå\CÒ„ì?Nüsï±Ü4 ßÜtî“Ȱåªr7¿Ë˜ÆõÜ(š®¯Ú`¶™¤¢UÃ,pÐŒâ+›šžoèZOÑóˆ´kôº‹x~åªX/rD›€§gI‰ú|ÐáfÒ‰!–6•*N™ìtX ñTRnG,^¦å±É!™"6^fð1¾µ¾‡ÿa`lÁv›Óï$ÐÞí œ»m|ÞtQ” óùút#²U6¨h÷ô¬]¹±D¿þè6/oBÇýWR'£Ó‘—×wìo96¨±NsløvIÉyIÃÉÑÕë¶Í(N¿Â(ÔïÐ0©ä$h _äx?WšâètDs°o@Ž8æ0Øg‡%>2*¬)•%¶Ÿz½+#6{¿ç€œj ÒN¦8½û¸fçM[KBdÛº°`"'33ƒ§©^ #ŸÎtc IÝsEù!ëB†ðÛ̽+¾ׄ«ïÂT[ ‰ßssïKÉñÞ\*Ÿ ¿×5Þ(_Ó¸Bòaæ«myà>îF âÛÃt™û­¬7vA©5•S+õÉF’óyÁã‰Yt)/þ¨WÄûÈrEÑõ7ä÷sç©8‰M¤îú5³‚øê“ëϳ2$AËtMRC7zÖØ•2tžšÉŽlRŽôÏæ›…jm‡»üMÕܦ›L“{F¹qgˆ/ìTÊ!xý°D¼> (§oê]:iÀx“À¤\ž57»ê_ yùAÂXר±°@2ŠŽBîö:uNŠK:Å£õ˜;­••Jç °rÖbìÎùÊûEáKEžõ:GÄÆ•–øwk< öwÓÍ…ÆÍƒJ%èƒÞó|tmo­rävEu¨Æ®8­k1.‹š~RRf2!ZGÎßqQŽeL:}Ï}K2-¿+¾z=ôÚqAÆ[lì=¹_gS²{€ŽÐ¯TpÆvÃw‰ÓOÚÓÇO®i`EB‰%“ô( ”#Âû˜çT¨ M>AüC«Z<ãóaJ–rê’^µ4?¶Cù˜¬µ§X>WŒÁá¸×"˜HÌ­øéón8ÖîÑX“é‘¢FÕ7AMðTd6fÉGÝÀd›æÏ²r„‰ûVÕÛo'¢6!N‡˜ ®4½ÈÎK°ñ]„ œA? =,M©8†¼Y†Ç'° i¬ÈAÔÍ{ûÂíUãßù8·d•99ÑFF}…gšJZvH…È8‹MzŠ“ruUÍäepÓÛÖo…ÍêÞÇØbƒ])Œ£iHq@2ÙR®¤<(A›-=ÍXƒ8úþ)Uñ²oÕFx› ŸÆ›IVÛ×™ÙBçê=Æì«”Þ­˜‰ì9¡`u&íuª-œ zð¶‹Í¯HÌþ£ñ³ËO`£÷;4aŠu5柮¾´ƒUvû0¿ÌÓ¶P)ÑÑGošHUdÄ}}s#U¤“0tnðá­¢½V):VüÅ7),‚5† ClŸ­ÄùÀHÖŸ¶¾êô%¶ïËb<ZÒÁtgªHªìf£€­âò®7ã7a“޵î¬÷§PÆ Ï:–ZŽ.£ÁÌF2÷ª·`è}°a1¢»¬ÖБ–ºÉŸø4 C™ûy¡‰õ¾þ$Ú0jŒ Ðéò6Cb½öÐa£ç˜®tÓvƪŽÒ4X†<€Ec› tJ>p.@ú˜Ê·]¿AB¢m½ÒžÞOЪõ±-åçÏÒxíõÁÄ«97 “7‡“ÉÐ,æüÜE–vlniUuk=Bn1Ðdé¶A(ƒÏŽ&èóM#¸·ýËv–þû=Þ;.°a0ò[›æ]Ê- "ŽkØüß¾|5zhÉ?êAcGÁPjì—^ÅÙÅ‘kÑÔ/Íeì=S£¹ÍR«L<öî×"_Èì¦ w&™IÎ;å ^òŒ8êãšgñ»95S´‘oò¯¼lñ>ª| Q­Øí5üŽL݇#Bè2†‹MÖ+Éc¦µ¤Û#ÿœªW›½á@@%¹Rb“¢hù™q­’§B"kY °¯¼/]m¹`탯8Í|"‹8(óñõáQá<0VÔÚ×&Œ ™²È:Áá«æ³-µZCesß<;mÊ2´ÎÀÑ|¯2Añý®PfÉ£vW¯|ò5=53°I¯kP§fO>Yù#ûÅú“<—2²qÛ¢°TÀá÷­-Àb˜Œe”»ŠÁi…Æ«^Ó]©Y×% öY>?»ÞuLºY!Å3]ʵ‚‹®xAõ˜Â¥ þÙ´N`¤ ¼øÉ—™ÛV!b·áA'ÞŸ¨½Ù±)yüX°ÇCzžVC*Zë·±-ÒHΗòô $IL!ôŒZ¸YÆ-¢âI<dG¾ìú4ìè´³cDvY·a0ükkß°ðÏl³/󊀈NÙBù?w§úl˜ŸýË2/ÔLËãÐÜ9òq,G¤Þéú3±RÂy¢:盈åsxØŸ×ò¸æNÂí'‹jŸ‹½ÞΡŽ¤¨IÊ”ÊÒ$T"„(¢!€¸Ú<±cö‰vˆ“ä 2žÌÖü,Þ)=½l‚¨‚h+C"ù~f»Ðý¢#O±~÷SÁV¸¼z¶< Hh‡|à~UaFæ·dÌvxAdºÿÐ,ÄT¼gW¾·o4JŽ#Ëè ŽÀG¸x6–bW]\C¤£'sÄ ?sXâq=Žj÷ð†½*”Oë«€ñf^Àk o´4±ˆ¼—q$t:ý¢ ~Ò›;  ­ SöµM&Pe³-`i)‹×0àèúÖîô!L ®&í Í7~Bð¼èî¡yÉ8 ðå€aã¡<Ä pgÛzÌÐm£±9 ÖIÿÀCgÅ"Ìðá/~ÑÚÆ9Céü&)43=eÒXÞãúF=ÂöjÆÆ¸§ ÊNºÛÉŠ¯=ðè+Òwah·¾‘:ÏöÙMüÑS 9 ?…Ìën›áWn2³ï,­8­¹ë"éßgÔXNA/ö ´í…9Oâô„úw’ÕÉQGe¬²ã@0±R“ÉÀ ®³\WÙ{Í4~~€%a¿‹˜}Xxþ¦«íDÞgš¹Uîîü7c•U¡ÊIîáÅœ³€(=ËqN•!©öЙÖüØX%A«“ÇÓEàUNqòq§˜*pæÝÂSŠJî¶íèBOHm>^–WÈ©pb¼Ælo%h¾íìÿiÄÛêÈUðÝzJPõãsöäæÞý9¦?øHÿ¿Ä€Cܶù“ÐÕ U¶´ä .‰Èæ+S©Mé™ 7“ì¢Ü7åasZDá‰Ð7ftIî½±çWí2ï¥î¯uú²é2ºüÖJ}S«,Þ¹kɦÈ5 ñ¾ë&JáùøÎ‰{²‚0o<ýeŒˆmÀLk>¢Á‰½Ásܪ©ý³p©žŠÏð­ö—¾U­-(C•]‚bSž$rÜ*:w9!aÃU˜¸¦øOÈ•ôžãSw–÷ßÄYQ…ü¾ Ÿ™gtå6\›|!N7?Ì75‰Å|wQC2U0‘~C빑ˆ÷’Ëv³H¿8Ú÷ÍñadAÏš>¯  bS+gä§*}š6¢g¬vÏÔuZ|Ɉr`õÆ|fó8Ûjåܹ^0šáMõ[¾J‘sd§M*&>ÖnúR œÏƒÆ.ÆA༠(&vÔ;{Žž’réR—ˆx29³ шŸb¥X|`ô †®0º:ëÞ"FBnñÍ—‘ ~}¿2žòG‡AiÁ¤ZòÍë¸^B»gÚwHŠ#à¯dҋέ{`ëáAV°“ÐN:ƨ­×›–KÐòӇƣ V!†òJà×ß϶êFY6Ô³ž’Y§üƒ1 bQFaÉñ¯N•øøÛÁÓíõ"òµv?cĹ:²W}’tà{THRÏ×6*‘³RÊÆ!Àf 2ÁÂG€ÔðiÙô@mv:r¾é¼§p+Êy7TÉg*ÁúÑÀ²è[TîQ/-M”œmî÷ó ?Œ[&êTÝvÔÉ/抣E¾ßf’r´GnPÑ··Ž ã ½›¨Û"AË}|²kV„9ºÕKÖeŒôûNë.TÑ/§˜æŠßŸLÕó ²øV(ªü"á–Žµ å·—øOÚä¹ËrôúbG´}Pö…rfx…û¡ž0 ¬ÎjöÐKT>ýPSusQ·2Áü1b˜üt&qÔA˼ÎÄ=³˜®£ú:¾iH§þ]Ò‘¢éˆ?K ëcÆð^ÐG=ð‡J}L?1áCÔ›uåÒìÓöá+oö`¨pÁ‡#•ØSsÔ?\-ò—”")ÛÐm¤Ò5p?pGÕJ zÏ®/|á­k¬AG¾†ËèpðnSÄ/e¹ë¨k/ú8è µ7­§Û6Šx%İRLuö¡­>{+1šÄŒMò xÛ—øm1aöæ.Úè˜q»ÇÃé`@œjIµöØóž{œ^ú¹O~zþ_Ü]Îõ/ñDDÔ' %¾ŒÂH Þbän^mõÁ XMÃt¬xÕG&0OéÃ=˜^Ç­¹Ý®»å‘§b?À: |´Û&öCÇjq_„r_ÛQ­MŸŸƒOâù¨ö¥¿:Y¾‚sá“KS@Ù$ÍpÕÕàWx2¥¸A]€ñÌʾD°š€/Ä)‰^¿¹pc‘SAŽZ£å:©]#ÅVø ÅZ9-ìdLR%š|Ñ®c¸e‹O/ÚU™Ø£"3ZPãqHص׬⹮‘ü#³®±>#„Å÷ÁAò á ÜE§¸N?¤û6ÑZÝÈ› Z`&œŸw„üx="Þí’®&¥ü õ=ÜúYT{ .6ÂmÌpœ™gÕöø·Š¨ÕöC€TÌ*Äg1™€hµš5VA2nv­eô±có¼7hS&y5ÜŽ£RÖû H Ö;FôPÝaºD€ô†Ä“[Ã’½”LE;TÐ1_#G¿N­&$´““ ëw»#¨àŸñn¡-‘ûOæPDð}c ÒXv†©Ôt/ÓùÎtz»ØÇ4 œñ5Hkù"¢®ód½ ÎÅ=Χ:w0gàËÊåÛák³wŒ5EkdæGQôãÞñðã¹ã”²=óħ^Ž~S>9Ιz¡ †£˜±ðK¤LíCŠš`Ý(ÝC0ªî _*e‹¯€ì3eåê—s óàžpAù³c¥„Ô-ƒ¬½b:K í@s?GÊŽÖEÿ°kã„÷»¨(^i9¥[›û*Ù”GcR¸`=Î!Ø’”È#ÉêSOŽU,ѼV=z霱¾­ã¬aT­_ÒÊ:s*tî3 `Ù¸4 Ã;^ÐîÃ$+ÓfS”>gñ0ð™ò¨˜Û¾…ß[TfÂׂ¬ÑšK.áÀ¨ŒwßÌxŒOwÞ _f>4®O>ª(jîNJg¹´ Ö:¨Þgp#Ü~Dº™¿PĽ~¯Yk=“d&Ó×çj5 žÍýIÔ«¦ þ¥.:§þƒ>”·“$Å]/êñ鸾 Mš§ØèyÈr|¦‘Úñ…0ø!£v³Š…ñF˜}ç9‡k[®b“HGg• Ó÷§L•–c¯IŠ(üóÏø6n†¹‘B¨·ÛÂãR ×å“ëhˆ†ä¦{÷5’eR+©Ô(ìÖ6Ã$ޔȤZŽwÕËõºˆÓG¶¡!¼nóh…h±÷uƒo¬CéÙp]âÆRKˆN‚,‚¯Z:n''ŠpU] •¹1íxzùÐx«Ðø* 'ò½Î¤3÷7´EcJ OÎ[mg¼*4eô2ðVu5r¦mq‘ mƒÕÀ‘ƒÁµ—ãùñI2ÜYÕûZ᩟iÖ­fH´ ÜRì:“Á` [ìGõÇ{n¹BÜ×ü‘t¤4À„µ(‚¼¯”~Iz±9Ž5Ô5k YÏŽ¡’FÄèZÆbíƒÿíÇ`ا^æE©šÆVÀv¶_ÄÇ5Œïàu<öoK§¬—nÑt®Ó‘´ŽU>§zxðcUÁ\}MDwÒÛpÝã’`颌ð¯Ãü¾FÜQßÌT.}%`zÜG»i‘ &Øw³¨ßp÷Vøã•Œˆf}Ú6¿5gl¡Èæ×½6êBnéê"ŸÖºÉKd?T“ѸkÁÅ.¿w°ü*k“ËæÊàë'Õ–'µ!FÔ¬J7Bïiô…3fW—8d#„ìGw†jIÈÊÌsÜÀ '(¾4ñ2›5oˆJìë.“HLb2,ç¹ ÜOsQà9JÑ–€¹•ˆÏL(âZ^aoÛà¨Áïߟ¸èÎa„]~Œ_ž+!5è}élÈ‹äRfƒ¼ˆj{½ëc|–ô!|DY÷|~ÂW,ßî’<Åóo‘•¾1ÑUÇ,»u.¤v1Žÿ r±Q¨\ô¨ ©©'Ý3ƒ¡¿©8F'"âCÖþ)úvÅžXv(ï«Q'‚ÇŒýøå’÷g7¤¾kjRL·‰\æÝ耀ù½uÖí.c¢6»ó˜¥×Øg€Ñš¸[ŠL»%„9+ËJÞ8ÃèðÀÙJå² ­)óÁmÙ¬v½þwä"©ñ]€Äç4Öê3JÑ:âòëdŸ¾÷O¥uêgwÅ—r6ûfOõ3ÔÉ™þz=no]cˆ¤9~$$ܺyÜ5X1c|>GR yWËA;—û¦r!†]Î^¨Ö=§ˆ`&»³»x©W]æmx}Kž°wÄÙmHšQc&mÈn‘Íö Ã[`—ƒo¦ö&÷ʸí€}p‘3Rb…&|Žö1…ãøn¶?Âé¶ÞѤHù2†ôö79=Q{q…°˜iÒÇ/ 6gX-•ò–Ý,ËÛ-bØL©¾TGÖcänÛI7õÙZ´¼!Dê‡pCݰ“!šÑdèèÂP*±4àqI`acÇ€ä`?Þâh^ƒ_ .œÛ)ͺÊ»ÐæIõ~ ])¥'¥ÔÒß$õ>o9„¡ŒÛŸÌÅfžB‡~º¤blÖ<]æèP¾ë¹ÊŠ‹aª}SÉp1ç›÷<™”.Ú†jìÈAp<òÛášd•塬ÿÉ­åWÂE?ÆÛÓgVGꤧ2'óShbÉiÖ¢AEXiY¤yO6£ãᥖB ;ÄÖ$Ç¢àç&”óQµÜ׿+vHÜü»0ç^ô‘zÔ2ÛÖøa.ÃAtÒN1›Ø0ä™pÜS#pòíY€=ÏÐ;ªå¢ÂÎGßL¾©D†¼2áz-ýH{'ÒÍM¸¤È÷©ÞÙáÑ“ý¾ÜX_Ѫxg_"iÑn˜üæë^æ“æ %Æ€{G¶šÃª­{èW5¦"tÒs úØÂ™fØâÙ8®NP<ͦãÔW[Xº9+™+ßvv–Õ4HÇ3Hx+úoЧáèßC£_æšÃ—W'¹+ÈѶ'%„„,Y’žÝç€iÄÁuLF'à@}6)ïrí¬?A:“£þŽ5›éFEÄ u2^oÃIeü-wVÇ½Š‘ñÖõ‡/Ì¥mäë.<XY¿³"/´…ãËÁÖ%T´@Œºˆ¶%£ÆvY`ÿÁécÖêÅ绫º‡oƧ~Ézmˆ•$wÉÂDÿ'!äÞj(^ "æv[=D̹«n&¶¿Ls>¶&áøùŸ@¾ôoÂ-íGþ·L;{/pÃû;| ¸éÛ7Ð4åÞË–€êžðKÍöER¥œoèi÷4t"PÚd·"Í1dŒSíÐâûdƒM”IAxM½Šá%âH±&%FÃOrnˆ^Eìü£B#]Æ'Ò~-êÒÅfd˜—FcÀ²ù›Š2ZÀYoÇX²\à›…5ñËÚ®ÔøÎ¸dä¯Rcºo‹%ØÐËJƒ†#6‹-Êüò¤XAâßE,ä›ûÓé”Mæ'mcG r0QÔÊÙÛääMbY zg9R˜ªÒ° V·†ºâ’°n8FY mß~“Û_r2åHò´VV¥Õ)Ç=ÎRûo 8s¡¤ö×tÍ|W[At(n§ì/8Ù­—]ØIÀH¦c¯`%£Ø ÿ´?€_Žr页IxHs* ­JJwÌùªTK)ÇdÃÍ9 D/ÅH~5s™š&.qéüª„uã¨$¤Ú ¶0¯Cá<Ž]š_ÖØ†]NUV>X2ÆXýwÚ TX ¼³eZí°™·cʉ¬ºæNŠA¿f%ŸnÏ@En ˆÊ5‘J±|ßB/ÊmhW}É`ëôðŒ‹eögY‡pWÕ}ªf–öç“õ{¨Ýœ‡D»¤ã/ë%{C|Œ$E@vTæ@ã]ÝXˆ [Îgma2»m“-ã>eŸ·× ÉÝë„aÈ…eVÐàC»(–Ê’ÕÌB±i^áÇ€}ù㢹5D¨Ë7Aˆ`wÊ&ŒûŽ¡ÈÒ8R&«f«‡”´1z´o¶ì7"©*~ æ“^¥)–*¹½h™¿‰ÒâS¶Ê`n#‹6?õÆ7û„iÀ1T)49åÕƒ¯1'WŸNUðçýJØÕð{Ùœœˆ‘hJYÑú}ÉɆ’mmüàwfµòÔJl.Ç·õáE…,‚l‹…QA®ö“P=Q{äªêS OîW–E-ƒB¯X;ŽMVˆ!§öÔ1Ãè÷§àüÎ%Z· M X”%¾ j*UõR^ú+ ÇB˜'Ý ö¦’ÕüÛ# ó,Ãá‰_˲VÝô16 :ðï_di"‹u_öáшÔôu€ “”o«‹=þÛ®ÕÄ÷#ÝÌ3‹¶±©í7[óuTÓbQ«ÁF¹Ö’Whp”p ŸUvŽŠX»tΚ§âF]0ŽÖ¥‘VÈí·®bÓÚ¤þ‚ˆ zÉO·!q%Ù¯”Eø¡·#Ëe*’`7?z#!úÆÔvÿè=~ÇÂó,¥åó%f‚ùãFf¡ø¨ö²ÉÛWïS&ŸLÆ6^‹µTͽ“× Ã! ™Ï#?Áö.wÃJå;ÓÌCP¡¨^ƒ¬¢,…¦©jmW±J`EžÃ¯® NŦî™>V¾eÑJÑô“ =gÃ'wÌ9 î®@B;q‘AËß?d 8LO¬ñ(4Ê“nr1Ë&üuJ[zF‰|OE˜ìPϬ¬vŸÜ‘•8“fk6vŠÛÍ$O zÏz ûûÓGO`š¡ŽFCˆú¸Z¸•»ôÙžk½¸ñð)¦çÍ]¸·7Øç]DïlW¸W ©ë0€GJØ$VrVýbRÌcŒ­ÁqlS%`+RôøwÛÀ99Ïa°Èšb ‹¥·:±7Cö^Rk žýõt…"˜ ±`ž…oUd.Zm µ¼ò=¢Äßoª_=[ÍÏÔÙæÅ»®¢”ÁÁc3ÙFfZ¿ŠVÈ›`°õHˆ{.îÆ&¿ò¹©”8 Í vÈ(+îØRQ&½˜)…kΡÛêd£_&®˜nt?pyøäšKhŠÚÖ%;«ÿ­ŸèZZ¿úvüëç“‘vú{ËziÅ·…Ù¥ˆÖö‰´©ˆÅwÜxËåsæ« ¡ Y䄿 §@²rn1½yæº:QÂ×r‹WÝVüõ³¦²>¬@:D¶D–ö §F†…Ä?Uãìëß?^8~*9Ìÿ›‡샺Îî\ëÙöááì™3fâ§ ¶Ó¶±"£d$`oÕÒó?PãuKEëÔ ô‚SåäÙw;?È:×”ÿÜ:<•|<ŒÌFe/Š“ šÐF_@z¯f¶µ…x¿YÀ^éØ_ïUÂÆÑ½L»ú’Ô¾…V¸0œ¿òê¢6‡Äpw–ìð ƒâtò ñfl‹p$ÄNAIŒIæåÒζPmÇÔzk>ÉOëì|säàFÇ™ÒKTæêY¦p€ÿWd ¥ìêNÉyªìxÜçrpÔ+Äj]ˆ+êùÝ:}AOD£ö)éQ;œÃ1/NÆÅBóî¦D=唵›á5¨1Rê`£ze=?ŠWa·Ó¤ž&híC½o݇âш ë±O²Ük\c—‡âòÝ”îÜ»0£ò&þØDÒ@¤><½ü- ,űwg¥¬±»PF_sØþ‚eÕðÜq{Ûš®\%H[â#³îcÙ¤ñ`£zå,£ùE¬ÝF[Õ>ÂË»7 êÙÐÍCnyIE.¸}¹Q‹9mâahÅÜÒžà+ñ‡’”¶~~ ÉÛ±â¸K:ÄnѾŸ4µ¸û/¤¤õ J˜ïëØËµ¸ƒ=bCˆÍà›<j.yx$Àg&@”Hf )ÉÒ´ÿvD]¾ –†dý?/UÈ‹ìü¢—¨æËñ ² þK›‹š:g1pÀM5¥@1ÈtõÉ)õdïûžòˆWyI~í[eÉ_jЬ •µˆ-‹ßH‘Ì!UK°ÌͤZ¤3Jˆ~\(ÛCHùußáá¬Q¤÷à½Áô¿ú²¬ZvÏF÷ŠÞD,\ÎÎ ÉLQ€VŸ‹›PÙº§Õ¶Á ˜èÃe9®m_ªƒ ¥}†$Hÿ»üð;%fjó qH $Ç0®ýŒ]CRF ‚?$¸ ¤0 æ½þŠåœ‘ÓÃàš]TâÃb8ÿ#¡wŠÌù*úÐâè+7gJªé5B¿É2ø¸c0Z1ÑäÉ}óMÝÉ/ÑGëøýû´Ñ´ ͪ¨çíæB×þÒÕÕ­B»ËÎÏ…H*qïB ZÀ…'®9Ë«‰Ëö4ö Rš•“D2]‘;zÝtë^—Oó§‹ýp!È ðŽrgÞ8d[‚hãKmFÖé½—sýPEvå`R«@Ñgó^c^5ÒÛâ<6ŸHŸÀœ¡ölƒ';"²9g F ÷C‘ ÇFt×U=}c —<ÛÑ‚AÆ;vLÔç‘W…ñ=Z¥.”˜©£ô”rÂÏ…ØNÅH)eòšÅÑW4\ÄSÒ—9ýyZxÂZ‰&è"ïÌÂw¼ï/K;e—Ž8¸8‚šêIy‰õ:éÉ12ø×/‚,‚}:‚>¶ý®Dlo3GñºÛ%&ëŸÛθÚIÑPÜ’cGó›]”eAÈZŽ{ÚW·K¾€“u‚kCnÈæíh [u&Þ8"tå·í #ÛÅæ`ïÑø™êÓ‡$}ÔíIÅúŒŠD²ÚÏðäémTOÕv›1$”kG¢)Ÿ“?¨B‘.0±öfòbuÚƒ¶ëÜhàmKYâ­³úºìuÆTPCÊö=0-á\éQF<âØÕ.Ì©"X“éá]‡gÜt¿£¾ìÓ1@­?zæ·¥Vsúz£V_ˆË)QçË=&[­ëØZ!°s‹U™äsðïšxñøñ¬ÂLD-|CÁ’1™é0P_|9¶wÂY›ª&j :Xkh,#­ð°%¿;÷ÿ4Û³ÚQåÿr6fÏAa¢tg>1FQb ˆË£̨Œ,ÕÖE´· €ÇÞï-Û{)=–_Þ 0t%Ì_,ýwâõ„9õ™í¹=ˆ¨zÉ]G':£|_Æ·â¹)²rgÝ·‡ÿKqà5¤îRÿÖNƒ_­xú|zE¼Y™äƒôB½cÇÓÏ<ƒ+xêY t“°] Ÿ;†‹¾àæ0hrÛ?`Ûñð×rQš4©%»`"HH¤>çÔß“»vÈõÚ­¾u?cœu&v³¥y ÜÀþCþéŸ6~¾±ôDXyorvå°šƒnæåÂûÒIQF’0Šøü’Á‰¿ìpT\0&ËÏ¢Y4È!üM€ûžª>İìã‚9íÜi‘JУnδ‹mݵVÒ-;_à1=ØÐЊ7„EQEíVª]?€Ø‹ÿ¸8^MŽj±sˆ¤0†u—å+0#{–òiq§¼ò޹6(/ìÔø†Ê˜Cñ,®„Êc(_Ä~öb·À]©áìâL¦4Ù7Ì’sáöM¹3A«‡‰ÏÁ›¬ø¬|,‚žÎ›Ò 0=gîÇ™$pɄФ€–S±‹ªÙ²>&}š°H¨ç´†ÌNkus}Ê¡ÔAã°w l‹€(¶ÐªÜ7ì“ëMºV>"#Ø|ëj¶ ΋³\óIÅh'Þ¥HÉHl|òÇ6ÿ÷3…r„=ôJ†„+=FààUþj¹C¯e„(i*pÚ*êæÅ4FÂãþ+ ŠU BÂfÞ6ÔûýNÅ,Îú‰;¶‡5òDéÄÒUlÑAÜyUY¬b}ËŰ;ï¡4ûA°5X®ÿ3MñŠV±|‚¹¿˜Œ Ö«#£€H6ÅïûcÛ[ÈÍ»¿¹†`שRIxKÑÂ;5²»6“öeçï‚Å÷óЬˆôWÕ+„ËTˆÒý‹;/`eïÎ/ˆ‚L÷_Ñå“‘n¹“†Å#Ä·Jˆ0…=óÖHŸ1ù„f“¨ÛFV7^§?µÔ5ÿÙ5âJQkI¶+ „ ƒh‚h‰W‘RM÷µ€ÖJP?"ò:¡Ÿq´²2# mb]­ë,¼TÞ£PB U¿#£¶öPl²»LGm Ñ*’Í.<¿„¤ýcŒçc²c© %z F…ö0äHz¯~¹?R²œ’÷¥‹r¶×Lì¯-r©©Íë(²“€ ~WôëTå8é¼D1î¦îÖ VÆÖ×j‡ŒóÍ0•ùí¨1@Ã!üïGŒ$ˆt‡^Óñ”Œ’ búÕ\W‘g¼ ;ר¶Ÿ#^æEW÷לݯM²úýzÙ‘¶°2òž ôw\½q)âˆÒ]t ÀTvl¤®ýAæðz>û‹tìõõ5lÔ9DpªðÏBwp$d; sšwÔ5 ó¥êE`ÙˆÂvC¬‹(²˜JÔ¼öÖzuߧ̓ߕ=àDÜ*¥³|‘‚¥àžïÖ0£‹–ÈÌ¿ü¬WܨÛCÉA6‰ìc…¬U_d¿‰ÈWª¯•Æ ó`ƒ£}kvŸAç,Vò ¢h‚ûÀ6°{DÎ+eÔqNÿ®šÐ&Š Âñ’"é(3+5æXÑÔŽü9±ë­34˜U嘮=<äžgß¿·rGø@¡cÑ’²clfqæšyÉžª´IB~oñi~>Ök®¼×Ÿè„+;DÁ=»]t¿ˆdÌ(תxûÂÕx‘TöõŒÚ±Õ_WÞ¼ji“™/”¬vl츚¼Nž¯}ÌÈËη饑ã6‹d¤(»‹×n«³˜ê˜â¡m\e -´K+pZòtáµFùþ²D1T˜Úm³ ;„)svèãÜÝ“©'iƒu<Óî¦8Œ½½‚ƒ‹`ÂëŠkñ‚FÝY&^àMnLr¼o®t–Åc­Mw R»±dpîa™Ÿ9«ô%¦%ȸ¬KÅ(jz*ÃB&˜Ÿ|Ž Œ Ÿ÷R”¬N-4…ÌGغF¥pè<†Тúhék](¡;veQñ·{k’MÿBÖ]E(Þ&—'¢%w ·\(÷·ŽêÔ5{(‡£6Ù[]ûQ¡§­N‚N»º |“7Üõ ÑrìÄç>q#*·°ãþ%'k Ø•ÃÆJ[¯/k²u„°/½.ÿ‹Žþ,Á]Îðçêv™ßª¤CbùqQ„²ÿ¬vÞ„¢í¯§®ƒYC5м!QïzI¼ÀÉ ÀU>óµ…ͪ’ÄÚSInîµÉ ìùqÒ³%ðh/C&ŠöÔ2­î#ú)¥ªJNC¡ùÜÉ%V÷ç`¸¥m›b^­»j”ùþÅFr˜3ìMZf‡p•þìynYß 4ÌÕÛ§o[~5¾m'‘JÿÚåÒ ^žÚw¨ýê1C®+g³?ÝâÏ´S¿Z‰ôÙQã+¿õJ0£S…·;Šla9zš"+%úÌ > Ó|}MÜ Çd&Úñ¹è—„ýj[ð´.áwσen8¿"VÁ["cà&f •Y nêͳ!R=‹ó6ùË–LT':†Ù€ÃØòþ):¯Òú£ +­Ô;©séû³.Ýî3®d±ô2ô&F) ïH™s¡¡`Ä‘.ØÁÖ¶°Æò¼.3^¨wÐOO—^|Ċųgò°~Ô†hÈJ!AR©]Ü_òê#©QD|q]7¾Ò¦Å8ŽGcí+€érh}zfÖˆæiË·ÿF¼×Ï|N¬” ÁUÝ¡H¿¦ö” P,W­E}<‡‰Ÿ,¾š[ãt"S«XtFvVå Àh€ÐA°œ‡KáÌñƒ 5»¤).Jœr¯Å=ü)ŸÒ`ÞFèÞ+EK’JÜž>›Xg7Ô÷s‰?2)Í9Ó5î÷•Š®2_f¯ÂwìA’V\ÉRÞsÖBV ê þg÷9ëÒ^ A[yé#A³ê•Ã’U«Ðd†ã7šn›¶W{m„kÞd®"²‹†ög£ARî¾ÃòÈœÞÈYÛ˜Ìݹ•)©}Iˆ¦U5«ò*IjcT¯àÈ®¢õ1¬ÆØeXpÜ0N—¤móH?†l]C›ù øï®ÿW9y&ÞŽ)Ôpn’4"wQÿ÷9fvä¦Ýt-2g_‡ë×ø‹Cg'µö ·>š³À÷ÈWK„O‰•Q›Æº¤Òp3þT§ØÓgUlòž¤åB½Îõ+àŸøõyµ“ U'J•-.[ÝÅÎD5ÇË¥bX׾וÙÂj öûÔ{°ø$£!Ú.n‚`óš(‹JVÇÐ@ݨÉ9¶ø‘)ø_ÂL¹^eàPI…¯÷æÉ~¥Oè˜ Ú:Ú£{”¬êõd›ÎŽAY"qN‹ªóV£DꦲËÿ*ENîç[©Pdú3×GŸÖ­‘Ï1£¸ ö™K$ìú' ZÞ×à(ž<@1ódA×'râs˜J5­:WˆÃµH÷Ìžm{hÔêÃa½µ}‹™mÁ7üi"5grNzß=1Y®uv%é t³,DUÜQë¥ë‹·UJ€9 çúÇ‹gÓ²Ý숇Ü×3)“6°ÌZÁ¯rñ;u9…\õ›±M…ÍC¡^ö&ô/dI•H;¤õ)ÐI™üÄ@:ƒá •±ÔÂvß~6"IŠúÙÛÆ—ªðy¹–Hè`6Õý¹"c7Ð~÷Dî%÷íœ!Hú#ì)Mf*Ë$Só_´Œ†à8ƒ<¶8—ÆîºdDÛeçx›í/Û¸ßj¼dø}Ã^¬®ª£íü´»9×ÈëT! 3p'H«DDÚ„:]–/Õ‘/œÂ}qè{Iö%nã  ú0…ùÍQÈ Û"ÄÖôÝq-3?ë¡I}:ºE®INy˜ZíŽ{ŠÄÎ¥ëÇl”qh¨ ó»ÌuR§ýƒ»MÙ?Ówæ¡?í„]UÆ ÜÑTèo"È6å|ìoJTϹ侪)‚+ 62 ©¦ü g‘Ô[Áäò.%àI§#¦8ç‚i$ÀÛz;mñ@ŽG}+!ÆO·|ºH P8«¹†ŠG]5 ß¹V4üÖ‹eåRy ‚}©ûª¥ÐR ¯„í®ÔŽø¬Ú±ìË ÁºÒ-_n¯sÜ6ZUCÀ÷BS¯‡éêÄ<­ÎìbXÜô¸–(m;’æcÎPbÌ Im(Ø·«ÔeËO÷kåæ{E“Gw ¤Å,åÓ‰–ÇSQ´f¾Õi¬{ˆé >ÓÔÙMÆjÑÚ‚Ñð_îç îã·µã`·žb†ŭ˓þÒ©ÃiJt6ÐB† £/oޱÛ>V%»Mâ [x>–7E¬l5H©¬t‘­ÐUšzB;á7êQ„è8ê,{T6¦íä`ú·”™'¿nÿ˜Ë´ÿV¬M¼ vÂX+E&+ÛJ{¦O‘ï¿áO{¬‰äѨ2csÉžbZH—zÌäìñw¥¶Ø7YT$ltá‹Íôbè&n¤ËÝK°mfN†5þœ¢%€s®ÇæüxH\^rbס“HbWÓ[!V/jcL„óŠ¿<0¹´ÍÀM;–±sŸ vË!øbëz—¬KI+'º »((2JGÀh²ùÞGµaJÉŽ™74”ê–°ƒªØ LjfmõÈ"€¡UÒ–×õ[Àé݆Ûp­}ÜJñâ>™È”[*F©¹Œ ¶SkiVhF;jq[kwL>0a:1ÊiSC!GÆ\¼ ‡úÒð,eè 'DTÚSâýŽÕÓ+’Œ}M{¸é?Ç¿ŒмP?¾.L vK–¢…*Êr#é 6#™7Õ.ëŽÐ\^] òt: Ä ÎeÄ?6™Òba¿®ySGÂjà¾M)42G"èFúÇS, ÇW|- aœÓãÆ‡¹z¢ê€ÜÁ¦‡ªNbâm¨½Í–'3qç÷’hÝjZŽÉ¢ÈáZkß½c¯.PW-8>aö“ŽuÚAiú”¬ôŽÓPïÔœÁ&ŠCöíþéHÜp2± iR´¦Tn(-g({©q¡tèÜFC1í%->,ëy”ÓPלs7*ΦŒ€><Ù´ø´Ò¨v‚dµÍöîšCÓȕٺ6?˜°˜"Ï÷9yØ-ó®·ö;ròlô„À =GrÈ"¹ B.Ôä¹ò%îö‹.7²ôÓ'ÒîNdä÷‹sUb¨$b {pú¾W…x– '#E'D‹ã!>·Ô?ã°ží žºaá4Ù,’½lð-íðÖ½8…H£,ZSåÂj¿ÇØÒ@Ô]n£ì’‰©¦ B÷/^‚Vu&LøˆÝƃÕÛ\ÇÀŠÎüù…M*Æ„§}í¢¼ðÑ H´i’¨³®¶­zk˜¯ÌFÈB„¦q)o´FnS/Ž ^ÿI~„üµn$rÁòâiló”sËkt£Ì&bNö?D‚µ(Зj@,”vq=Ü:G@` ˜zý´l4ýôö’õ%ð[(}ƹ\ƒÖ²r®½,­4Ù³ÙÿŽ[w¨\ïÁ~‰-y+”ò8=è™E%í’\E‡< äÞž endstream endobj 1007 0 obj << /Length1 1964 /Length2 14370 /Length3 0 /Length 15578 /Filter /FlateDecode >> stream xÚöPJ· ww4¸»»»»ƒ»Kp Á-¸»wÜ=¸»Ã#ç|÷žóÝÿ¯z¯¦Šéµ­×êÞ»JRe5s)PäàÊÀÂÈÌ SPå03³123³ÂSRª[»Úÿ¶ÂSj]¬A¼ÿò‹9M\ßmâ&®ïa €¬›€… ÀÂÉËÂÅËÌ `efæùŸ@3/@ÜÄÝÚ À9]à)Å@Ž^ÎÖ–V®ï»üÏ@mF`ááá¢ÿ+ bt¶63q(˜¸Zíßw43±¨Ì¬®^ÿU‚šßÊÕÕ‘—‰ÉÃÃÑÄÞ…äl)HCð°vµ¨]€Îî@sÀ¹E{à_Âá)êVÖ.›Õ@®&Î@À»ÁÎÚ èàòžàæ`t¼ï P“‘(9þ–ÿ;€ðŸ£°0²üo¹ÿdÿ)díðW²‰™ÈÞÑÄÁËÚÁ`am(IÊ3ºzºÒLÌÿ𨹀ÞóMÜM¬íLLßþ"nQ˜¼ëû:3gkGWFk»? ™þ”y?d s1½=ÐÁÕþ?qkg Ùû©{1ýu­¶ Ÿ¿×Öæ$˜»92i8X;¹eÄÿñn‚ÿÇf tp033sñ°€N §™ÓŸâê^ŽÀ¿œ,Ìïüý|AŽ‹w @?k àû¼‹‰;àêìôóù·ã¿< ÀÜÚÌ` ´´v€ÿ§ú»hñ7~¿ygkO€ó{㱘ÿ|þweðÞ[æ ;¯Âÿº\&5muQº¿ÿ¯KTä ða`ã0°r0X˜Ù8\ï ¿ÿ®¢lbýÌÿäÊ8X€<“}?¥ÿ!ìþŸÛ§þÏ`Ðþ»–"è½cê\Ÿ™ƒÙìýËÿç6ÿ+åÿ_wÿ©òÿÒàÿ—¤›Ý_^ê?îÿ¯‰½µ×üïýêæúÞû  ÷ pø¿¡ZÀ¿ÇUhnífÿ½2®&ï3 â`i÷¿‡hí"ií 4W¶v5³ú»Uþ¶kü0;k 2ÈÅúσ``afþ?¾÷©2³}4\Þûñ/ð}hþ{K 3ùŸébåà˜8;›xÁ¿_ñ;âø°¼¡9Ðó¯01:€\ßSïòü gø?÷ÉÍ`Rÿcú ñp˜LþAÜ&Ó€Éìû{ÞûhÛÿý‡=“ù¿ € ø¿ðÓßG÷O+€ÉâøYÿÏöºÿS€åÁîÿŸp›ó¿Ê½Xþ ¾´ú‡.Ç;òr´zÆþ‰x·Yÿ ¾k·ý|o÷/ø®ÞþÈò®õŸRï©ï×õ/ÿ»xÐ?»¿'ƒþËýÎÞñ_ðºÓ¿à;õ cyçéòÏ^Ðý_B8ÞÃ]Þ_ŠÞÏúŸs~Ÿ8&W+gà¿î⼫è_ ïüÝþߥ»ÿ ¾³÷ø×=½gÿk3Ö÷ò^ÿ‚ïʼÿþ^Éèü÷VÿÕ·fnÎÎï¯ö_ïÊ{Sÿþë'ôšÁ/ÎÌøBljCÚî«E<vƦ)w´Rh|ÛÝ‘a’hª2‚ÖoE’†{PW¶%¨o„—H^|ŽZêa¾üHTi}ò}6ŠWÜi…_ø…=0‘$R×OGÈ .¼ëûâä«h ÑÖ)K™ã䯬üãÞ£Oʳ®¿tyôóÜŽÊn§ÂséC´F”~`Ñ e®iæ,.´+,-ú¹'ÊÌÍí4zöĉl<¼ßq4[îkÌì÷j¹:«Kž..Ä úè$•èþ7YœyŸâ‚•Ïþ’l$úäTÆ}Öô*kÕH‡¦Þ÷ÑÅ–ß9I€¿kJš0œÉ”°ªZ"1\kØlDû¢«m·šÝ6É„KÐ9Yļ%nyrù…6Nâæ¿2ÉÆ­$c¥ó‰ŸóÄE¡ ­?ö-xZùlK“ÙT-þx<8ŒÈ&6ñ5Bã[;!´¸ÇÈÃùA"S\oÒdDBy„ÛW5Ö·k÷ÖÕñÀcDÿ°]/×Û9s²Ÿ;¤º™¡BŒ‡ƒƒ§£7êö ßE_ìv¥¯3rF$4ôBt%ƒjKŒU®½hŒ×&qVî-Íx’2ÉÎ ²þo‘ž7–'ìŸå´O+b}ºÊëîÓ’Bv¹(^ëw.R”„žJó„ôÓG © ä1Ã!·JbÒ`½)³!gñåeŸûÊò§üæ´8›¿÷åàŠÀF+ r*D¥“Ep·¶­$ºÍ*Âç©j _ÒZO÷Ñ¿zÊ,gÐ*1‘}ëBh‚weᣰ }£DêÄäÎ=9’çŠÒ}÷›_úÔútõq ¦¶PUÍ0§{Zy¤!Õä‹äÍA5 u‡f-ný-29rKWIHÈ*fùrgHé‚(õ¤ !ŒpZöîöØo¿p†Í^Ÿ/‘Íö¼÷AáúNaØê¾õýÜvyÙ~²ìßô†"¥_iXeúêvÞDÈÆÓèæ—PŒoñ‚špœnt¡ Š1ß#šWTaú5ÍSÎO˜§~mÀ÷C°àª,Bè+‹§õÔom9ÝöÃ8ªú²îpªŽ·Õ;ÔþŸÏ¶¼¹aÑ(‡¦€¦êÚ-Þµ±Í„ÜdSÇ ‰EºLf´ 03síW°Ì²ty #¹k¹Æ“Ó…—YF0»èh¿Ó/²%ûÊ.R#ò¥"OÓ©;GE½WZU/—ä¯G¼¦L'uÂT‘Ÿr>Å‹ëþ)\•Ó$wp°›‚4Ý%Ô `£ˆ¸˜*ýpá]†œD-R¢4b¸vá]–Í¿ò>D½Ôõ”ü€t$ÇÈ =Šiüû DimýšÔ®ÎMÛãNOIåù@&C¦ì&¨a‡8Uèîw–u½5¸]šw3ïv»o•»â•…"mh”•'ô‰,š[¤¦÷3XLTÇšÜ+º•Q}µÖÌŠÓîXÏ µVÉ¡uX3>{6”K¬ÑZGfY9Óá°)ýöä v)ôö¾wZÖÑÎn‡fPež]Ã=Þ2·Q ”T±Í„§˜¤zy_žY‹;a&Ur¢&ްŸ(÷W­¢¢ï?†]s x,`--Ÿ¡ïÖ¶a\æáVåˆì‰bü<õnIuÅ,WE²–ËIFo ®ùyÜ'ˆÅ©'Í­x&è‰#Ar“ì¿> uj 1gb±‰û$κÿ6BÛ[«LãŽfÉ¿g¤?ŸÀ‡_CúR@$³ nÒF|Ä ÜÈU DÄAžã"Ÿùî(ˆ†t©åŒÑÉÓ>üAÑG~‘—®Z°÷¥àŠ¢wìÛ·›f^˜‘[š#«Ëþ¢U×¥ðD•¬J6¿Ô¤<’uxL57\HÚstcú†jÍÆ_­{9$ë…ôKîõ½!$¤t3sº…×Ô'dÚ_¬{(«‚¿é ^) ˆ{µ°Ëã¸AG°áÏ·ŒG>ômbTMÁÏón»PñA¡ôfzÔ¤¼ýi^no <ðr½ðJEx¢ñMèÝ]™Y_:p­ÍÛ?÷”ù&Û¿–ýãîÔj—Ts—ü‡\ökž²rm+PY{þ»òt­÷Œ.˯EíÓíñs@(ó§ÚaêÁ^Åh¡26Fð‘ÓnéŠ~:pzÅ]#ä£P_ôžˆP—Úš efFõáµÁM.k,åöëËØ°o¶{ίyÖ#»éÓɯ8ó|e‹Æb†ècÖCæ7¶]H J^Q†lxÙŠA† ‰¦n”§TÃ%O®¶ v!Ö‘_mé¼0¦?ó*ù³^ì>_övº’h†}‰øûR_¼‰„•¸7vÆa…9= ™C¡ƒºtt¢¶(5 pQ{òÇÇ(¨d &—mZ‰Rè÷Ì ë§Ú$,5WÿĘo•9c›ï¸êÑ×B—?žÌãÏ‘êØº%褨ÖB¥YòöÂßB,vÌXXü8í°¼--0à¸Q3öiµ°ÒÞcªH*˜«›[U'ñ@šŠÇ2<æ»àÃ"˨5ñ°VUr¯ŒÐ@rHÝP!+Á瞤s>¯é KöÃbÑš§Vp›pLë½fƒ‚ ­'•Ê/£NN<¹–#a,icÏÀ=ÔXÏ«jx#ËZKý~™&×ðS’ôš˜È0û>Êl á/óI!$S›ºµ·Ç1dðï('¿Ÿß ovŠ^7ê^Á²eD€RwHc´ÅÀ¡&‘ǹ‹£Ž@QB³Ï¥QÀäTj{ZA½¾{)žýúêÓn3FS. ¨ÅPp¿ŠŽ LµKj‰üÙ1Yÿ_âȪ¦¡žpƦ ´çaÕIupMRhGDÉ QšÚlÌ0d.,ÒµàÙÂñ×uc¢ ÏCex‘•Ïžd´-(¼É%T‰n®éþµcõ˜ÄC‹ÅÕïómÈ(¿<_*ì Z{;>/Í¥~†*ÏW59"œ¿_wÀ맸ߪr_OZg}I8Ü߸)œw=$ÛÂìF¶­kûƺÙÆ8ÆSh›|“/\=›†PL±æº§ìÀ©4ç ¤ý*…QÞµWØ‚¤4©žzyk«TÛ]¯DúäÂÈ&E–qÏèãV0Á|s$öŸ4´×±¯oE2¶Äàø\:3228½ðv©žù/ߨÇ77³êªpoØÁÍùµÚ!­ë ¡>s<­œž=qZ<ËG«VL®Ï¯¡—>¿a”.“˜¤_Ò†!cªbÒ™ïwÑ{$å niÙçÔÇú·]‰L¾ÎМÜûÊüöÊ(hJ#Æÿ÷&BÆì`„ýÒÈÃ&N`€RŠL)@$w>SªëG#j½Cîug)Kud»é6wèðj¹ µŠ/¡G¢J„ãÎ7C“ó¨.©³8ÜÍìF€#£ž¼6ssGÔKjÇé1A}§*KÅ>U´3þÅ[œúލuw$Ѭø}ÒBm*­Èsr˜.óaü:šÕiX!6‹,LÛñŽ`½½Íz4¶G~ޓ爅Á&ÄÇÓPYöfþlfJ{ÕR–ðDZûÛi*¢ ²àÊJ×H©x'_S…<ëP–¯¯¯tŒ Õ‰sAN;PÅ¢äç(Üóˆj1ÍcÊóŠr³ù¯>«]TÙÏ„íA±ëÙ¡%a,Á—bÞÎ"tö¤EïR°ˆ×„›¦5ùÄÕ!÷;U•8o“¹X—$¿ ‹‘ãÛþº~Ñ/TbKñ Ưe ÁÌ;;U±x–|Æ÷Ñö ÀÑ8ßmAQ:æXdˆ ýè((Sq;½5­fÔÖ ›AÙ· êXÕ•â_Éý_zžN3ø‚5$«¬7”,´rš¹öQ_uwÕA«ØøÑØ[ÁµbÔ`üh·ndqÞXsH'¡ÉPÉ: G[¨ïìªï8ò`úêsØz•ÿ¼Qƒ&ÃÆ7Ác¹yíB_ókw'7³;µ{ùÄ\Åq·Í6Œè8ÔH.Ø+,¡º0ôBÐgàœD¼SŽ ¢ŸÐã£XhÜI}¼))a ²´…Ž¼È¤ÿ‹SðÞóÉ2£EZ «Ãˆ>²Òr•£Êy˜üsó­ïAˆ}3ÇÌÈÎHöÚ±O:êB¬¾ äæƒpB„žÿªÌâ‡=gK¥ŽdÛýôÜVØ6úÓÁ:‚ùáÓw¨‰½Sò‚]Z i$ ëFýùk­«¨$N@´Ý³Gb…‹•çK‚~.·'È1ÉÈA-·ùˆ5-Hó9˜Ž½ÕkV¸k *3æ—è쩞IsÛ׸r"ãg´¨¤ð¯ñcñ¤E ¾%7ªš Μpæh6Ñwe•@üìÑ'Ô”ŒÆŒ·—H®]‰ðƸCaYû·õ±,;VïÉe jæÆ'r‡ûߘkJÕோŸq=z<”Ühï‘m?xšEd¦¾iæÍtó”K÷8qW³çO ±]|¿¼œ˜M¿þ̨–M7„#L…Ò¯ß7iЕiªµžKú]q­Àqˤ÷”9Á"¶Í.vÕ¡u^B<±Þf_Ì™÷¢úŠmgæXR ï÷‡ø}Ì­ÑL­lnâx{1…&¾&×W‚íL½ÊÝõRt4›´z_v’¡]1~,]àÄÂ)è÷Σx ~†,»Z›Ò*D.ü\ p±2h„´NyhªcÜ”®ÝXÀ ¶žyO×ã)Ô®@š¶(êÀÚP¾‡v »÷œññvyðƒÖo Vá¾lª3l¼ªŽK˜¬ÿ /]B¶]ïhò³zs*ØŠP|–•Y±½Ôݚ𠌿·©›Ctùcý@m5r/)Uk^g𬝙qn~ŽaÇÑ@FÙØªyáYriXn•‡š×tóîוÚ!!ðCF‹= ˆ¨ó¡©ï3Ö@郂¢âŸ0>c}7™Œ¬ùî Oó°¨é݆§R{óZÏ’4)«q%U›Ëï×å$¿K˜"«ÞòM¹¢uf£ÄnÎ6.&LøC©Ý¡½tH³ÞË}á^ÍN±Û rñ<]ÒHU¯¯òI¹‹—s‡«n¼ûT€rEš/¿£žiMo.2Û3± A¯M«}âmReÔD‹‹ 5Eœ2‡ºìšlmîïïóuRR؆l¹¤Øá>Œ—ð±*{­HHÒ¬lK§€;W”FÝ£ÒW?ƒ2½(2ÍUùÐaÂê\f¹b”u!`Ω->íðJ÷¾vxÙM,…¡AÌnC`Ù 8D©æ­Ç~ú!™gE)exnlPƒ½¬4¶ÐvÝp$†~¾‰6#Ðx T/Ùoæ’Á–V'ÂÛaqèÞTUSò$Û"oßg‡  áÇaƒöÓ5cÀƒ\äzãU²©j ‰¶ðú®vœS§VyèêvÔÄ¢ö¨J3sbä >ÙÏ1ÇÇìu@=Ò5Ã›ÛøGÅ"j]’q™Î-p†IøÐ9± u)æã Hx]M„ “KÃw÷ËA©Xq1û5—"WTÊ!NwÀ\v/‹vY‡óÚ±œçK£A|2N{èdv»þÑ…áóšÍ›=“ìXèi7[-…ø9}²˜2Îý©ô…n?^•⃙ÀîóßçÞpã†ܼ™Jµ1 lM ¢ãŸhê%ltd°¿®QÀžXá—ƒw®~·u£'ØpöŸêC±ð%ãyÙ2ñÝÝâs5gûø»7Â)Þdñ—®°)®ŽÐÉ;ç˜t«Ó1:ÛyØ•¡Ö° ¦12ß*AQ™Pt6n¬ö]HGÒ’-€æ˜.q‹ê”@æ’fˆ›˜ ¥öÇ›nc:ÀÑ$èÚ‡m~ñ7»ÙŠ|ˆ]ËîtË4õ©cB!”÷Ì¥Ò,R!¨hût?w=àÖLžc­lêÌ(ñÆçvÓ 1mŒ„ 'MSÇ‘[×êO…x@…Çá<±s*}(¾cUU ñ"X°ãã„ÿ~(·BâeÄÿz‘’®¶B¦Àš-µlÙ„h‚ç€FûôÕX㷌ښ9¢bvp| 7@ÑYÜñº ›>¬2Ý„í!ÿ*ˆÐ|ý£¦!p?¯5ó¦ŽWgæ³e'ÊŽlŒeGäE<ƒR>Œ|{¨ºš°©ùì×gïÈ“3h©œ\ê–a$¾ì¿e ¥ù£ðµ<ªéu¸ó.°Eú0¥±JáSˆŒHYè^´Ÿg¼/Á2¤}P[‘’ž )U¹¯ŸÎ$µÙñ–³€{è™ðq‚¹ÛÆðx«p(åўljúÅ |sù^ªÙQ›ÄXRm©õÆV’Ï¿Mª-÷Àäs'ÌׄCaÄLU$¨€ÕH~Êk"Ù(LW–—±7ô ØÝâ’þÆ_]CC+– .©Ô=‹ ÃÎÛ½x£»l¦7fw¼ê-¼ù\4g+¡d? Iì8Œ\ù=t0¥sŠ‘²žÄÊ®Z÷Dýëæ3³åÏtg @¹‚͇ˆ¦èëƒ wÁD<¡:3u32¤ç5J×\‘ÅöŽiDÑ.ÐÂ9,³{¶ºÊuoQS^"(í높ó«ñqDÕhUÉjK>‡;R¹òÚlkn2¸þÎWFžXm[¿¹v¦‹E&ô39׈‘÷¤øÀ£M']ftíqês'±±UC^U #H’º#”{…Mì‚‘[3Zy«¬¥Œ×°Þ,_²CS*”œæ, f˜JT™Ì‹S æ#8‘átLÉZ®Q~•gÍebÝco÷3ãólF?Q®±Ôéa˜72”K-˜ð˜ï ÞþülÁ00& Bú¤”˜ÏÙA)Ùéò›Éõ‹[túç*ìÊ+œ± ûzèP¦[,Ê+5¤ƒÛ 4£â¢pJËŽ|¬O¥êµÈ+äË-ÞäÅüÞÇûE911‘ˆê"1>¢Öº1üdw^Ùz\ —¥h6íS[ÑeàŠüö”4 i¢äéPVHÀ¾™ª¯4R¦ ëK ¯`±É;÷¼·›Ä§³ò!d6Å‹\è±ï"Q®Eaì*E ´õäM\g‡@ŸCZB¡So0‰§ÐÚ3¾}à ðĤ#µê™Ÿh1mi ¸Êc*¬Ñ…}ÿ¬Ìö#…ùlw\° sŠÐÖkFؽ¾‰þ© ±‹‘g†z­ËpîÕ¼åúbÏ%ÍšÕMQFèοU#8€Tû /³SÑ ºŠœTЏö+ª¦z þ¦º$éa„ús˜ô@ªáiîC¬XE³R£qHØuCv½ßò›jŽ8=ž7U±õ„úª—êWcŒ¡ˆ*v!v-ò½½üAäÊÅIß?CÒ¸× Û5¨YÉ£;NhÈ»esÀ¥fîpTÃí7f›±ëfì%+}Ÿc‘ÊNDzv {ÑH`¼ã¾0QŒn—æ{K•vœ2oøbðÖdß%Î-ù4as}ö¦Ú¯Žeœüf€£=•ýÁÆLÁRù¾|&†“• æÑÖí¾7©VƬ€í²=O+ìØ¥ÖRžíiˆ×Tîœ-Xè' ·–©~ÊúŽpí“W3KjÃ÷f(WÛÈiFò‚ÔÝ%Ÿ–[©™’·ò±²vž@û©–ÁEå àŒ6#J¥(z©©~t l‘³­L¿=xØÿPjlt姃ø—å¬"tæ‡ìвÀÅ%D‘§8»„Ê|"_͛ϡò50BnW ×oôÍöÈû¸™0èåÛv³ÁÃú<Œ`<%wôeãºðRµ=Eãäì¾°’d•2°)½EUË«dÁU™¨¡£èˆ›¶:i P$qD—ŽèCÆßäü8ßãŠVõ¢»^_¹ÚNuÒ€ÖI4‚§j†AÒ'ÿZjQL+´™æ¬é¯ŽqæÚZVn‰QÏÑ^t9Iâi\ì‡nX··"]‚+]|`«MLŽ«æ;’ó†Z;ÈzÕ§ÁçJ: Ýåñž`·xÁŽ›†*–œ˜Ø¶šýz¤›>mîŽ?ÈÓ4Êï’=W0ùÑÎ*°œÏ^¶VXÄ;»Þù[ºüq[¶æè-ºÌ€]¼·œ¶X½ó©šT£Eó€ [arݪ è+8Ø—þñ•“sO’7ý5ò ®îu…¹~ –²3m=¼õÅ~ íoª,[Ëj `·Ê`×C ib]b(õÙ¡gÉÐ0;Ž™Hx˜’Äß ½ŽpÑ-ÅNÒaFÈG:ž_Íœy·E”yq”û_’jí*9E÷)mœ„!n@©Ë‹‡#×ëkº4:ŠÚváI±•6³Ò­K%ÎZÇ…»Ø§N®¡ ª›z)Þ©ÒYÐ@#û"fÕþJÕi^ÀWk¸bcظ㣛zájžJñæ£b3hG®A1˜ ê “’a;"ág² ”‘MÝ3iôFØH:|–J¢Ÿ˜?RY Šdz[D{ý─ê|ì" Õ÷"·:¤`,ëTY¥çaC²ÿˆM/‡¯ëÙºyx)¬o‰“˜,D¾FÐÕÌþHD°±»ªš ¾«¶)›õ¹µ‰*üüX &e ûSÏe×.™šà»|ÚJ¢_f.R¯µ·ÝüØ9–‹;ì}¡~¸ÁeõgnŸì˜‡±ª*Ý>5’1Žpth¨Òp]n\¥Ô€vìQOø Eà2ùÉú'ÃIÛ—r;³Å=wÐ8šå0® Ô/§+:€åçÂt»ºÅW«vñnd.3U÷‘4IJĺüªø§rÔ@fi¸uUA*XW”ܤªäï÷²B6š=FxÉ w¥á½õz°m¨Õü©¯ØŒ\Ñs9)­¸!Ÿ õ›/Ç„SŽ‘8ñ°i~X Ñè´hªqjð£R²Ñ¸¥ž Åî’ܘ# zu­œÎê®pcÎO½3§QÑ•Ót®Ä½)€¿ìú91±T8÷é¨Þ2àül#)µ¹5\¹%¸4œjo¨<JŽÍâ(àÆk§Kó°ãB"›Ë9: ¡ÛzkêÌ(ÖÛI9ÃPõŽlb*X û;Š‘=ö1S%Å_Á.ëŠ=·Žn”KRMÑö;4g.Õ_Ñû`«°æ}‹#”¤”†ùð‡ͪ—³Ž ÝÕËÜÔŒ[)ðâÞÒÇr¼SŸyÔÀ´j‘©LR†¯6ëj¶¬N®Tæ/Ž=–RÜt¼t J‰¦o­çîÏ‹S¾:Œôû¤+‘¸­F(ea†IÄ3ÅY@Yœ +#zùbK~ñà’:§6¸Î€¥ð”=ƒ)È L£A+?§ˆ} ²¥s 瘩­ÞzÉC·©ãgìM¡ë]ouò›è… 'S€ù©ûYz±Õ?YÎqŽjìÈSø†ÕÞW`¬o‰Y›] K›ÂBNfÇTíLÄ$Õ¬‰gô¼%ZãÖýIÒ cï(‚û6Ÿ-îÉ¿ýÆ9ê-â´¯j£OÅÞèZ@Âì°a"X-Æ@eÕÞéØŠ}¼™¹}2¹0§ÊÒscÉÇņ®*Àžþõê@ë03û›½»ñð¶t­ü£æð*ka"±È–SP™‰¹dCQ-öüxI¼ Uq}bÖk5¦+­‚ âYFqÂ[{åÈÀ+cGáËP¥«äÊ— ù2h°¼I6oòÕQtHý‘¸9Õ]Ê –fa,ábcu¤áµÇ‹‹„¯[åJ±9"M¶•Ù o:ùå§gú<ñ€n‹¯àÏéƒövíT2uû#X›£Å«èUX©¸!>×Ç#…›ŸŒx ·üë§‹©ÞÄ0ÉeI;›”Ôó•~Äóò†°™šÚ‹å]œÄli`¡m£Oq s¸6ÀKsRgå1Š=ÊÜ|æÚ.?uãleÒÐ (yì§ÂG‘¸O'Ø1mÇjC•œ*>8SÅ£[&¦…ð}n+6ô›AÏéÅÑ:éT*OÓø0Ê_ž–²ˆ£$W*ÉÈ•O×…â —LɨI»T8З¼?Ô`*B|†9³Êdø]´®w'1”ˆ[‰7.FííçH̪µÅ©»ÐÕoÖˆÁg›D¾,³`òFžØ¼†DÓÊ~½_<"V¡®Vã×›ë¯{Y&W7¬QDd ÇÊÖ¨-ÊûZ‡K{dÜLœvob[4+•QƒxÄ©GvKjߎ7‰0aLJkþ–Æ,a–€ìÈòµ°Eh` òWB°|¹Úò£C%íkó6ê,_<Â6M8Š”ü,ëžÍÚo#!èu”œ4` öá¸öÁ9A™2/jPý±ŸŒ8ìßLEÍëçbšž…d×g^Wm10݉e²?”+ž‰Ë¡S=½£èsÓÝ'óÏ³Š¦¶F } ŒfÐS•v~/1 t³Ìšfë¾Ò©ÒÒyª>¥¸bƒ]‘Ê 1…7ÀÏÌ Ó<‹¨"wdÊWëoö‹ÜrÈÕ̬Œ"ò‰ÿô@ç'­]Nk,t\7?Ô€~ý¡pï­gÛï+Ђ9B%v%ƒ}†ÜÙÆ]æ9éÅ…˜²Â(‰z>ˆV>:Nr…O}Úw„ýÐúææ”éË}ÎéìkGJú}§ ºµd¿(€Ò’ÃD±ø†*ýL3߬Þ2Cð@¹!#0ØO„üŠë’U[â÷»ùT*´ª­ý³¤-z5lÂUïNì’éÁô®9Ÿ›9”›gþ·ÐŽc‘ÙÔ§Û$AJ©^+ Hÿñh3`ªŸh\Ú$uÙ9@£®£® >Mš­(-ŸRböTB!Ad¾™‘§)œ³~û&º[†DóìpÓ䨷CüRØŸ:™\¦²KBÛ™‹Ey¤ã,BÏ­Ú[ÌÕ8Š¡´ÖñÜG_ÀS"BžýÑÊÜ—52\ÖZo§š¨GgL¥›%Ñ~üô‹Ð:ó0¿krŽÑöf¸­YÅ×UŒ)hÚíöSÈDü„Òô“AXÍu×ò™vH ³Xè%B–e,.;n—Á6YH¼Âv³Þ>V“-Ä‹¿ÿæ±øãTíXÍq}ñqê÷0¿\ÙR•è#JξEj]ý¸Ž$Ñãüá‡K9Ž0åÅדÁ½­’Zã³3f®l'm¸J¹¤S{¥ú`KŽe›ªP †©¨‹õØý;„CEˆ0*¼DdHæ•¡¦Á 9i½š“] eåN2:#FÕùܺ‹×÷«ƒ¼ZŒ™5?‚q+ÔÊHÒÃt–¯‚^Î>ƒeQ 6ºRØÌx€³Ð«ƬN*¤x&øñè©j€ðåæ×C9 )yá_6‘n›ùÞ©8$mÅ»… ([ÊO—²dª>ßÜw5¼\U/|*çaÉ ¡NÛ+˱o×™œYaRôŸ R[{~i†f+³eΔTÁN›S½Æ=1ÎÊÇW'«úHk°VN?°TsÇh¼ÃäOßëf;Îʆ\k2ýž?8 KOuê¤[D74iÞ1EDItžx‰‡K¯ »¡F:ÐlâZäRŸ–-¸s”ŠXŽ)WåwTÖ÷»ÛÚè,±·¶élÎß  ð)ëæ®9¬d†¼g7 ýiߊnë~‡˜Ò¶‡{gÔð\@;­ÑÜ—×t¹ðÜÏ^‡\^ÿm¾X‰ŸTŸfDÛV*²ÚZÌ"’!é¥ ð"i®GC•¹þ0$ˆ/°ó†õ ûE~(H:qŠŽ!¥ÐÓ¤¿‡4‹7Q º¥šÊцúígAQ­PeªãøïBsùÑiDXÓñ%ÅŸõ4?þ â¿uLQݵ\‘p'ªÔ£ÔçU„¯vQjOòo¹8ÛfÔÏçÑ„õ÷iÔ\æÆ“zSUàz½)„““…y´ô(±Y0[âw¨íÇ6M¯&­Gö«ü;êD™pëïå‘*Râ#áÈâêݾ yEɈ|–šä—i¹\”G¹±Êi#}ûš½ïå*dÏ­ò22Ó–QàÕÄÕyGæ@‰ÙD_vµ­.Â’w| þš…àmÛX¬R7eͲGbf®¨‰ÿÓC~±§òWè+ÜP¬KôFó,`ƒÃv=zT<…ײš¶I)KšWÑEûŒ¦œfð—6íT+)ž‡KÉ1ƒ–­EnÌ'Ù¡€o¶M:ñ]éÉ“4+yÌ—5n¸fSžFM¶Þ.v~× æ|0”Í%\wzÁZ“ÒÅìãRGSÊ‘ŸË+Ê)eö<ÂÊGÃ¥¹-dNг£†ˆÜU=Œ¦¶9å0<ÒŠpǵ0vý:\1c‰&3ähóôxø^޽¢¶¥t8-Pj|ɱ°sÎ4âÝ—Í,q»3¿iH&¯ gé«|nˆe bëç ô¶PøöÑcu»êz‹¶=SŽÛSzVX „ øs$û5ç &ǽ^2tŸö ”Õya¦}&Ü™ÝÛÖwÝë°!ôèÄÖdã%Ål<§M¿.ø#=9™ 1ǤWÌÓt©¾€8+Óã>D²˜öDNçmIr†D&ÕÅTò µ62 Ò†Ù÷¯Èfrä&©Ýn bZTð¬in'QFj‚IÛh)öaøŒ€l¥å󈬭é/XJΰQ8ãIüÌK_ßy^ÜÖüþ,WFžó )#N˜Ft©jIfú³×¼~¡*]}0M&lµ©Ï_Ý‚½?!òÚ+B{êc8£Ï¾3y†þ1R6/G^lH}«L‰óuæ'°gÕÄp_îæCç(Nùß‘™bZC5uæJ¿Â`gtÈ#ÑÀëôdá9­ZÑÒ§·ëŽyb|èE‡BÓtüžU¯,B`©èD²ÕÛ€„à„wž@º'Ò¶†ÿøÝÇAšR Œºû‚RœjZ¶(À|Ú!…úÑUÁ;Jʱ4ßvuvŽÖÝ3¶³{Ûƒ3oàÞÔž˜€Ï 5*”µîÌ˪ͷM)ês›#Íqøz ThѺ¥MâVˆ7'_,{“ÝLdûR%°g¥&ÜC­†ËC =P¡n`5™–2;KIµæ Caà„N”þhÉœ’‚ó£T‹hg}ñìü éu¨Ëij0†ñž*÷)õx SêÝ5¬ +í³TŸ=îDGc÷9&yáµ>ä•U¥;¼/SIµ`„¬ljYðö¯d 5g%ÛƒýÊ›(ÒB‹fÚ±Ç8Ð¥øèó ¨Ûm³GTðBK]Uá5Ôkd¼Æ_±{¥jAº?Øl:ÄûÄ6™˜uûâÈ"À4S¿¸ÿ䯼æ²SS1ÑN$DÁTFcÀö@âC=öÏæ…Òí§†}[œ-ŠíßÛÙR=Úâu¹S‹ßÜœ=8#ib˜³1‚†<#ЂZz=Uª¼4»*&WôZ(c£«L×iÄà‘­0 â;¦ZRD·QZƒ¦ 7J4 ny ‘%Ðæëd™HÈÆ‚.v‡2n!^ÎLÚÍ •Å4ƒÈ¤IÅærãÙ?æŒ(/ü6RУ%,2Šá³¤Æ×JÈ•ym®¨ÌuwW—£‡ùL°Lýó»óiMèÌrånñÖGBæÜ(Ž Êr ÕÙõއð®¡dW~%_4Ö“Ï>Ænb‰"N{t%\‹_”²n–?yÀZ(óΓd&"䫺TÂ`K7±_‹ñ¼‰ÈàÃjgögZûÑ—âü¿qz@T]Ôj2Ž\JÕg )Àˆî3WKTǵ‰èU­P*-öꤺØ]Üêk…6~Jͽ<ínzàz“ú¸!†Ùüµõ[^Ám©^/9¹HPETÔxѧ ¹Œ§&"k{ʨ:íÉ3Bý5áG &‘?·åM㩇7qZ°3ü#w‘çbI£Ncr)Ø )½Æ×n‡_™y}`OŒK·•á¼a :LKÓùåö)!sç"V´ìw†Ý ùFFL¦Pi¸XÆXùê,´2MRKÍg„׊ÖýÃõ;çœ0-q±†QgæjH„b‚a·—²­x©çÞ®ø¶[5G÷–Hq×¾¿+qïs“8síÎË'%׫1& 'ø…x"àƒ½È0uP¤…ôiûežÁ÷îèüŽ0ö‚ŸCzÒÙoÃ6šõ:ÉÍò~¯CÕˆ²5Js*å˜FÌÚ¢†-¸UmÎý€+劳BMÁs'£öo’5‰š-`ºZʨé6A¶ŸA¢7$¦¦–­Zîd8—÷}8›zùIô=ü¡ø«n…‡˜Âlû)tÓ Ì ;“‘¿}hL”ŤüÊ탸ñsõ‡®¥@Ðçé4=Ay„Ä,vW®[b#´t–ŠÏÏ=?мÁò&à ^9Ùl&uÃLÓöŽèÍz¤Iª-HÌßPØè?#î®ïæH‹7ÞÂrš(XՀ͙æDäµT}ðˆTÓÂÊÚªK¦/$^œ$pËé‹U\Ûz#í÷ÂÆw©ê,³Å×C Œox!/†‰,àUSP_{Ò)=^ØŠúÖ¤’Uá„Qd¾ÀÀŽ®ð|>ÁYþ…U ÝÁOq]~¡€ßiѰk‘ÔXYôV…ñÉ%$h[ÆhtN›ñôή Ôˆ©ª½}¿LnÂjË5ØÐÝÊMŠØŸ5 wQÉ…ÍI±Ë%³©SÄ«ŽÓµkÔÝ“/fÖ”w`tƒðk,PÒx#uÔ±|Á³nbÞß¡ááñ@× wC‘•¡Ì €壩5°™jßøe/u[­kèý»§:ëÀ*âj}7nÏèõÙôíp£aæ›WΞó§ÛDö¨†··VÄñmlMÌU)M'öKj|Úþ҄Ψ§êRy]ÙO­Ú”ôÇñ¸¼™Ñ0=£íkVÐ|Ö xÒ×¹¾&,Œ]˜ÍR~ŠÔ¬QKÉ6¼gÀn0ÊõA;¯@íq5ãAëi å–uÕµ&gD‰Ä±i âï³¾„wV±lé.Ü ,eá°ê¦eú8=ýYO¹Uÿ.(~ endstream endobj 1009 0 obj << /Length1 2154 /Length2 17482 /Length3 0 /Length 18763 /Filter /FlateDecode >> stream xÚŒ÷PœÛÒ€ ãNp 2¸»Kpwwwwwwwwww÷‚»'\ö>’}¾ÿ¯º·¦ŠyŸî^-ku¯w #RP¦4²1ŠÙX;Ò1Ñ3r„e•e˜ŒŒ,ôŒŒÌpdd*fŽ–ÀÿÈáÈÔ€öf6ÖÜÿ°¶ê;~ÈDô? em¬RN–&;77##€™‘‘ë?†6öÜ}g3#€,=@ÊÆèG&lcëfofbêøç?JC*íßË‚V@{3C}k€¬¾£)Ðê#¢¡¾%@ÙÆÐ èèö?.(yMm¹\\\èõ­èmìMø¨h.fަ% ÐÞhø«d€œ¾ðߥÑÑTLÍþ¥P¶1vtÑ·>–f†@k‡%NÖF@{ÀGt€²¤ @Þhý/c™Ðþ½9&z¦ÿºû÷ê¿™Yÿ½XßÐÐÆÊVßÚÍÌÚ`lf È‹ÉÐ;º:Òô­þ2Ô·t°ùX¯ï¬of©oðaðwêú1AE€þG…ÿ®ÏÁÐÞÌÖÑÞÁÌò¯þró±Í¢ÖFÂ6VV@kG¸¿ò1³~ì»ÿ×ÂÚÆÅÚã?dlfmdüWFN¶ ªÖfvN@I‘Û|ˆàþÈL€Ž6FFF.NÐt54eø+€Š›-ðo%Ó_â¼ý'eç÷å¿„ ð¿¾äl>: üÓèZŒlŒ†˜þ?·ûßKþÿuù_^þ_ýÿf$ædiù·žò_ÿ?z}+3K·[|t®“ãÇÈÚ|Ì‚õÿ5ý ü×èÊÌœ¬þ¯VÒQÿc­M>:šŽ‹ž•ý_b313W ‘‚™£¡é¿šæ_rÕ¿ÆÍǪ̀`ã`ö× cbdü?º3´ø¸D>:óoðc„þ7¬¨µ¡Ñ_³ÆÌÆз·×wƒû8êbx0} ¥Ðõï^0Ð[Û8~,|”è0¶±‡ûë\ÙÙ ‚‰þEì¡?Ä`þCœ‘?Ä`ý/q0Äþ3€Aâ±$ÿÐG<é?ôOæ}Ä“ýCñäþÐG<ùÿçG<…?ôOé}ÄSþC¬•?ô]õ}Äûú_âú ýÿë‡O}‡^0s°øcò‘’ÁúHÉðÏ‚@7ŸÕ'ƒÑ? Àü~D0þƒJãà_J³?øQ“±å?Ö~°É?ð#¶éŸL>Š4u³5ý¸ÀÿX|ÈþáŽñ£V‹àG]ÿôþQ˜Õ?2û(ã®þÊÔæO°Û×Ü?Ô™ÛþQ°íÇ&Úücþ*Æîø‘¼ý?ð#S‡à‡ÇàGâNÿÀÄÿɸüc?wý~$îöüHÔýO¢žÜöÿ*ì&ÌÐÉÞþãmó÷Mø1~ÿá¿_m@ +ÐnmÙÆ'м>°ó±Vð³ Ýþ43+âðMøÌ×=QçCEaÞ§[–‚ˆUÁÞŃˆ§ÔSæÒ÷ uLF ïžiܘkÆ?i=gQ¿<Ÿ:È81H÷ôhê±X™`^¶*ºÜ ,PaÑÚ]ï/e‹ó’·V?T™^BS4ŸÑ#€MGE@csr² €v fvU Õ .,vK’:ÜLŸ'à‹?¥ M0³í¯—Ó‚šýHû|r‚h+}—y—zÔÏŽ+­7 X ÛëÅ~‰¥ô¿ë ô£4p˜Tæ'áÉ’Ü›½‘¸¹ÈRoD~Ÿ‹ y’¡E†oä¢Ð±^îP——FïeÙ“Š“µˆ¸|À‘`m³RÒ[‚€‘¿WÕhØâ6?½uÔn÷dƒ¿läÇÒT ¨a¢øêß<¿Q©0=?-([Uj–ΰ̀ ŽT´š©Á[5V¦uÚf=b[}ïèª#å¼Â×ÕÆï³ “GñA4kÆ-ÄGL+‘kN FDa#5Œ¾3¦’"ê›°Wù\ZqknÐîA ûžc‚ œÓ*kl'„"uEDöîð×m™³_Nt²±³d4«7¨mÍßÙ0WzïG:)ý9 üJ£ÅÝè¢áäÝ£Ôbâíôx±I5QòsâVmÑä(˜g¼€$ÔŸ™'ÿPÞÍ){(Þ®¤€í×nÉr¡XaàÃ*0ßn‹ÈæÇa[däÇͪlaÙä0ŸíåÃÍûf/8‰K%I4ñS.PeQŸžŽ7’ÿb;˜¨%»ë•lóí³¸Q$–>Œ¨±¸—Ê/¾ý†#"è#–Ð¥ñÍm„C©&Gç ªÃ!jè[~ü(î÷­óªw‚7£·!̱ÈW-{þŒÌ_ÀÝ5×Û8¤¼OSšß¶¨úikÈ2bà3RޢߔLO»Ëäš”aA®‰Ñ.‘!±gµÂGêze£ É1‡°?£™!¯Þ7ƒùÚ·>s½Ä”ºPRšÉ)F8ÆÂ‰X‚¿w¢BIuãîùeï+½[ycg¹‹¡»À 4¼ë¬¥ë&®t–IáF„Èa ÒýûÂüʪƒÝ¥áÆn-'5,§ªÃþ¦œË™ë…£Q1 Äç` ûµœ.át6–ó6;ùÒ3ü~…+rPT;ÆEîÍ|Ø¡…á›pÄÒ{üÜ^‘u ¸°Q¼«qCõ„±Hqq å‚ ÙøÓåxhgXJÿè–fÚœMšý’JÖªÑRÒHšXÖ…xáih©ØÆ…us6¶¶HübTŸ¾¢Äqçî$ Â6ÛoJQâ“Ð4Âþ–žŸ‹‘MF¬EÀõÀâ5›>É‹°ôƒ8øÜ‚r0‚yÖCþøíêù•™B_czî¯;þÒÝO¿„ Ó.3xÊàËç¶®qÚ¢Ù9wçw=¿.Z­œ=¢Y6z!uí¾DZÈ©h<`…Òà_[^®ˆ™_»/ù@\åÏ(fmnÍqàIvU¤(ÀäG@;.Á÷*Ë,i¿‹~[È(ZÀmc¬ óÓF¢;yÖ;êyžÀ‚±+´ÐHÆ12‰NZNÚÝlù ËFä{ö5}¬w7Á£xû6x=Cñíû§Âp›Æ˜J>}%hâË/4G‹Ç°¹ÝEâS¤Ì¿áýÜÕV;QZ/zø¥Û…X [z1Þ)~ÃSÜ<Ä~W¾b²úåt+À ö©ÐG –å rFbŽa0|í0'³ÁªÌ½}™\çê é:-›g"Aƒ"kAªÉ•Z´;Y¸O’97¶꺠‰;Å/èÀ[h@»6¬Fë{­pàR²ø+…–b£I×!ö6QW®Nˆû˜Sb/îŠÍA:´«xJi7v6|]`CMhrähÒüéÚYÌõ¹ÌKqÅ]Ú¥!.åÅA?RçöþJVÁkÖ‚5ýeNëe‡E#ÿ¼žhQ üË×Ooއ6°ö8ánÛÔ±:ÄO¦X|WMäWàšç[‚szJóÜIû¬.k™¦×Õtz™+tsî_Ïu«¿i£+XLÌ´lò¾ƒ{×a‚UDê× 'šOEù…»Tâ ´ÓÙ\2}Z¯4¨£0|xJ\¹pvU¿º§]¸òà…Z)Ÿ›7ŠöÚâeö (LøWÒ(•¡TœÊ'òSÇ«û€k” þˆŒø•û ªc&H½$8ãùÛ°(Óñ³XW׃Ó9ºMâCé(äÎÖÊ/B¼)|ÐÏ$Õ’OÛÔ8v¼'ÀB9{ìu —ßh´t/Ñ? 0Z‘ÍN NèÑáÚÌ…4±¥54G¥›~YÚ‘b€¥‚¢^åm—o´‰UB\J3øYòtì°Bõ{##™ šÇNòÊRe„þ“H¬Uì¦vâ”ÇHŽMT(‹bfáðUd†%LÇþ(Ut* zXI7„g?£ë)áê$¼ÍV5õTÛwÊ! jdµtŽL=g¦ôÂJkÖ>uý(£BáÚRñgì}†xmD\¼¨`Wä] ¿ÝådÛ=”iëûCW…U€«‡ qßwŸµårav‹*ÔÓˆÖǪ_ Q@ôH¹."²º±-À;nùND-þóNrfÓ}Ò×Bkü(‚`Örx'·€¡·›‚}}®A9­À¯öf ¬ 0¸ôV-¦O­:ÐLT³C"&’Ÿà•´O Ž Ó”±Í‡uœéE–+¹I5_ÅÏ;:Ä•ÊÑ7Ê9¹ßÓ×{§—¯Ó [š/û›÷† Ð€³ÙÁÈ+mjÇO¼”íž\‰sßSCɶáì{‘€RÇêݲ8ã"Ö#\†óËèÕû8m°ƒÔzgÛ3=­)¤£³\5k¦ Kmdmx$Îu=Ã"˜çg÷Ùgòì4æõ«D+"eãoÉS×Þõ‚s?ð¢5†}ö òÖ”“Å„äuÙ7j¥½›W£ éÌ;ž ַÀ¨ƒ‘Äo›™á̶ç4¬\Ìy{¼ÝÏy£Fˆ »?Ðý*ŒtLS“ú18ùÙ)6ÜóÀSŸn>þÙÀzÖ1.Y à®™?¯ :Nïµûn0nøˆÓ\²ˆÅü¹ Ç­\÷èspÚkƒÂšÏ¸ómáŽNNç 7?°?zGá‹Ëíq|Å„k¸bça°c©p Šë^‹S|ù û!ÛM), kˆnÉ}æÙµ~áiwE¯ÐÛ xp•t¾q©á)å„ Ž`熱çäÑ©}f ¸iv“Á½¢²0q09®ƒËB<š"Ã7yaþ}šOu}+ÊEËA+#[°o©+·†w•¯¹/ï¹¢­Ut÷-wÙÞÿáþ€K"ˆò%&·˜8Ñ"µàšÏή9´¿÷I¡ÕhvЈѠŽo›5ñ×öƒJ·•ÏÅÅ!¬šúFsÐd W [˜õ+×LÉá"-t~^7ã³é!y•iVÈÀ.ÄnÈãîäMÜ åV¹×žO¦ ìú¼YîØ®`=üµŸÏ` UÅüÓLuÄEóØpŠèD ³UvÒ¾“×÷úWgÀN½¯jÙÜXâ ‹r,¿‡”È&ùÑ3`ÓÃ鋾Ԕ ¶©Õ%™•É;.·7ïÑåÌ£µ5úƒ·ž‡mÞû†˜çšú~’µâñ¯x}•]~ÆXLÍ|R§¡s,75îF»í¤Á‹÷U_Äa€-#ÉÛ 0u~;ð,)‰IMÀ¥¯ÏÝ<Ž;ò°Ô0¯qÂŽÕ3sùÙðT§™î0õ¿JÈZSªòNÕ%í¹Õy1H2GcÝ  Ù^NTI=kH¹Ÿ&þ'î#àß@ç9d!p@g\sJåÓ5‰?aSLªñô\[ÄŽsj>ôgŽï¼¸I_*Ó÷Q_÷ƒ¢õ½è»ù{xm¥c’ê°ŸÌÌÊœLì'ÌÅ[],\äÕ„Ù¨Бªý|®[Xó@iE Ål`ÛíSG3$},9ÝW8w„¤õ8ËóÐ[C¤’%2¿,LašÍ—d\|>Z¥D£Ö$ñX²—÷€¬DŸ¯Öýi+­,¾¸0Š@ç1Ä$ç^c¨ÐbLç 6©þ.4U:%”/;û)‹ò`¤{Z?½;rËïpyMl¯ۯ¼‹ ¹?§M¨WNOM˜w=\”D—<•M†(Aùî>i¬Ÿ–ït;°˜51åz7Œ[ÞExåmOFñlw@eܹ+*3r6w—Œú<ú%`z Aœ°Íq@ØÂg®ÝHESL7SÕ+‹}Â`CÞ^`¤Ø2k&…$®#íáÝóŒÆÃ­œ^^ß ¥¦Çõr¶ gÅZgv­ iU>Tþýuûý4õb\@æ{ÀÕx=M—¼“kQA°9ý!¦×mµ‡ÅzöÛ3ç‘kç>dh^œ´ kÿ*¬Ø·ŒñLÇÆ"æ£ùbßÚmÛú‚é©¢eû Q¶û½ïh$D·dÃ,ßä×üÑIb¡I§%Üx(¹ª»fÀ1ˆ¦P`•ÿônb@°fž }ÊàÿZS´cnPoGh!4bÌì²׿Øø˜þvå?‘ˆu25ÁóÅG{îòóÀ¦•€¤ÆëT&“R®g_6ÑiX›` Q`–ÌÅ]æ³öÍ2D ucìÏósI¬c¨/ów‘›_n¢jÖ€ÒÇÏFÊ‚š0ÐòÔÂëÖÅñõ¸Ü\Kå7î°ïö§+L³ã©%¬ž×qM’Ð?fR²,Í }&ði4çxò!Ë-éÂl¼’­ÞSîYümê | Sì+0Ø-¶]ßk6ºvÜÜ d¯VÜ0~"ÌL dÞY³}Ê’Ô }CTK)ÅtE×Jª\§š7Š7¥6¡Ý°ê·E'ÌÂØÕ¦q5Óî }¢L$>€*jÖæË!°ê´ ©fÎCð–$ª^£sè¦B®›ÂNïŸì&¢UÑ_S^;;®Jxk+½oñâaO­‡5k<¬ŒÛšÔƒ‹Í¤T]þ;ÔBSÎÅZO(ÝàÎð£`XD¬ó¬» Ÿ*{³ôy° 1ëA×.Ú±¡k%ß ÿ²Ã©x¥Dÿ\ÿ¤Ò7ÁjÁCåékÔž%ÒñI£¨cžQòŒš×(#j4–{³‰¼·ºGù<>Z­Á¯©y^m"ßá€ùG“‡ß² ¹Þ ¾ùÏ,o£($q1Æ=ÂÕ£²Iq_º^Öå ÖìÉÆwT®ß~ŸÞ!•²R„0‰LêCk.\ÃÙ­Êgó¨|ãÈ®$Ôå÷®º\­›eO¿n®ímÔM2+½c‰yB ¾-'fx׉ڡ;$ lIa%Hù òpW8¦´ag;ÌÆyÎñõw2¤µó:æMµ4Tlpå›×'JrÌ<"¢ì{¬ºðtËZ M¾‡pïÓVïÊVyŒ¯Ïb£ž·P‘ݼõËáüà(ŠjèTÅ|O½ F¬mN³íuCx/@`šÕc%c¯3] üÊ‚Od;´‹ï“½›U?•qyŒ.µA­·=‡µžŒ*?·¯Z·ª¦¦í¾ŸÆw…-k•V¥‡î~Ë݃­r«Žo’«³g­ÄÂ!Ð>3õ´ïF„‚Ÿ¿blyˆ_ ’ ‰lï ‹K‰‹TôÒ3Íq±³8Ç¡ŽL w«ŒÇ=bä åèÊʱ®ˆ%~‰|¦+D¨=›“IBÇ“ÖÒ«dºO²67í@ÒHqtož!ÊfpÊ웥=î ñŠí”?¼½ÿkhÐ*óš©´Ö¬íyJlê{õüaɾڢR‘viÁѬà,.c±Uá4_E¦òãàY¶O5a÷—ûÝÔ–I.æY>îçì.á¾}tÕˆ/h¸•,ŽÙ-ˆ8†sÖm=aåSP ºã@Ã/Ÿ6Î'µš-(–hAñ.&(1ñ`¥Ò-7s#«爮Îû®É¯¦¯y3C˜PwxqÈô³QfÃÔarœuj·§ ÝI¹CßÈ)YzèÐàÔg×1ÛíÐøVù ¶;i°`/È&t"ˆlè b›;ÆÐÑæ¼†ãÎ7ËpÑj$¥_"Þ"n&àM¸î¦Ø±¬üТ<øio]ïû%sžåC_¿Šù¬XÝ2¢¨‘|Új· þkRâg‹>ÞsD–õ>)(ª§´ܳ—|[F,~A¡íC݇r;kq"C¶ßž6ãX/ÃNIç> ¶*&«NT"R[ò~iH+ºíe[“мœŸW-cç Ú±X³â"1 š#$w@ÅÕTéÈIÖ”ÓdUí"nºçúÇÍUø&ªârlxb·WÉÏãÇòY!ÛçÝâ’^ö׫’es^ºÂ¯•]P‚K†`7U~ÂJO€öÖÿ i+–å¹  ¿¤lpyAn`3<ùâß~D·Ë¶5›þš¸9з, b§ËSt|”Ò®)ÍÓe9Ñïþ.– ^q´­ÆÞÏmd2e¯ìœéľ£Íµ…ep®Í¬zçÕ_¼Ùè uÄ€¢MI|º¸ñN'©S•×åúEÑÅò~5rÛö½D6xÜã’ ô‚ Âb;8Š™Œ Odo–”Éëé~¢¢¾%qˉbüíëÕ—Ÿ3N²æfóXIÚ`ÙP«FÀG,MµjSùFÄÐÒõ—§€ &Þ7Åz°½&‰NyKNòÁÐ^L¹ZaI-RÌÖf6r¸9¡ÐEΧot1¯gb±ê‚)?f¢s`óõ:Ô¸wü'G’Ûlaäs20øëgÛ‰âW!Óˆ=æ³`Ügèxf9Ò ò—Ëk»g—³äÛQåkçù±Íü™•(ö» F÷2>CàÐÚùqýH|+†€rPI²p— ,teÚ7´Û§Ã?Õcêv›oF˜c•¨L=©—¥Ê¶f‘÷x+‚_YnµUˆQR-Á©ìeÄððx(0Öï(§kÞŒb}jz<ã[Ÿ¾·š¹õµšú,gfS0žªÝYØ}ßùÝ£VDlÛ×ÐŒöÛ^Gq¬+spÙ|ûóžžO@•±,B© –âký±“ào¨`‘Àõ»TíŠ4µ~©æ†+á"ˆ¬‰>Òp²%_ôWT&mD ØþL¾ö¾x‹{­¶Kõ’]6ô°sÌD¹ü¥ÅÈÃÊ#ßyN¢z†å3ï@ôi4#ú‘ÏŒ\ R ȼ±9OËÙoîÉÖh¥­Ý5”p,ñ8oórô0elWÐI­¹˜‘ÀÛÃ÷£›¤üõ}­Ãv¶¹Vé%½ê¨wˆE}3 \u‘oôØ1ˆÊ Aü¼ø8S[úÂsg¶_„û dWŽí†âò¬W­¡W÷¦Ãö¾ÐÆ£kGÅ–U8ÎB_DœÞ]_©\·{„ÏkCÄ×áåy Ùãìì¾ËÌ—Üó]~%ŸœF|³ŸÍ ³³£³gŸÂÇÉÔ'SÅŒ˜ù©qÄjIÞÃ/¬cn'ÞùÙôM‰ ëST^xœ¬‘úâÐ,¯É꬀ڄ)¸†9 =&cJŠÃxj2% ½Á.’…ô¤-4C£:¢?>Ï­¼`Ʊ:"õ]ÃþÎ×(ÈÛ+2ÄBWªðfÒW«â¤‘ðñ ³øFMCÞCú&  (G2 É\I—†«Í·YÛ¾›Y8&ü^-½‰ž¹ÇÃw±´ ¾8A“'÷ÒŽàiËo‚4¡Ö ¬|$é>z÷ÀŸô=`üº‹[C¯W%ßÅÈÑ6wÃZØÙÜ•L¬kÝk³1i,á>gæ±M)ÉÄ Üm"­#Xty£Ï\ˆ“!z¯®¡o†øöj²îC{s9í °ëv:ï ˆ†¾’6¢'µEíi^_Œ4MN.ܼD“x*ã›3««@¾Ê þŒû‰§ÔÄÂ×ì˜ökU¬þætŠþ 5…×'(† ñ¸T4‹$Óí…ï›&4MR›ZZ§½D“Ž •2gÃExƒ €À¬ìÒÊØ >¸>gqÝ¢…RÕ®t´¯•´Ÿ‰Ã6w­ (+¿%Ý뉸¶?·g¼îEZ‘Ÿh«´ Œ"2oÁ}z{,m"QåcÎA[Mq$,ñE?C$aNUO·S`wîHëú(<§½Mo” ™3/—­â:»â!«Ø˜HçæBSʦèY8¹%2@~«·$l Õçoö:³ç2ÕÂ#„ýà­(騮@ã¨íé•ÿWã*ØŸ¶oæŠùð á Q꣊>GŒJÆè×–dZ«±x>ŒCïHÕàùò>°w}”ú7¡íFä[Ê(’ÔZüŸ…I¬€Ïgãñ8ÔQö|Øúµ…BdäÞÎÜ;Íî¹ä\²›¿ç謡½Í†$ƒ~6¨å8—hÎFrÛ¡Ñ1¶íg´ôÙAõÃÎ…• ôƒ?ˆ¨Þ‰¦ä΃Òa?xî»”'‹ÓÅ‹ºç—{´ÃdŽèOŸfmÖcf«,—¿ÛÉR‡,»óÛ(•ÑÙSÞte8LI;Ê;ž¸æ~¶@J©w-¨¯"šâ·øMeþÌÆÙ– s`çÓITAP@Ο·|ÈFVF6u œ“&»Óe‚äø8_/m?¹|ÿ^ÈÔjüó—@}Ø ÷wÕ¬Ç×a25òûº>líg“«¥é凞`H˜LOïÈÝÚ\Oµ:,ÐG7PŠÙ겓ÎRøa'ÊÀbf°þx£ ®0[1Vy_÷ Á1Ý_&ßx„sŸ[–$S÷4È–Ùê—ITó;Ë ib¦fù+üçå!«ý:aµôˆÔG|õÌ2yXtӌ⠃Á6йn¥’øl®·-¤ˆeû‡Í»óå¶±¢97V檆Èlè"Þ@=^¿]4…=D“ÚY uHûO` .¿Ý¸²m˜Ï-ÞE"èÓ ¡à'c’ùµ­¢—ñ*ÝñÅy~9!¼01Ý\«†Éך³ù3•\\š¶:×úzËU<3n¿å‚¡>G3B‚©]+T© ’Jjþ ˆîš1“ö…éÅvˆ«žIíøÖù(êÁŠœúbP¿ bm©šòQkoù¤]K—­_]¡[¹ ¬íÓ”Fï! {~ øú]¢ÜL( b–Ö¨j|þОî®\—À`˜ iÂùÆr@Ö¶A§ùåX-S3GôäwhyÌÙÊU“‡ž¹… ÿ tÎ ’‰˜©lºÒHKµ<ï\ˆOó§ö©Âiì¥6]àg~¯t«Ö‘îlðddKgmVÄ`´%cS¾ãuTˆ')/À)Ã\/¬E‹'­oíšÙDÙ.:Paà1yñ ÀAÛP•ZMyé\|R‘Cj«ú‹]ÆÄSsW’Ç&¾§ÃïÐr?åßtÎÄýßeYÔœ¯ÈR$šrVÔ¿Ÿèˆ8'DýZôàâ»Ñ›A ùL:fç?•г} ¦1¬ßƒñdÒ ý==ñpRªÃ:£Å…ï@Lß'|2y»å3³Ï|"z²…TiQÂä!÷O1<°)»µ÷ºù.‘ qÓÙ±yt£Pÿ~65»Êx3…Cv3] „y±½&a^yf×Ú£þò¢+h3"é_R›œ©T:+F¤íÕ΄—œÄÚ‡ï›\aè·ˆG¦7Pày¯B‚%‰ª)ÝO‡x±÷ò&ÆÒ¡‘Ò[ÍÞ_ª-–`ä?{„ër´NWÖ#eÈݱËäwr}Û3µ MióD­<ü^Õ÷MÄÑŠ;»ãÍŠf):Óå ‡¬µ!ÿ8½QM~TU½¦ÜÌ0Σ‘ù€ú9Z±~ÃM¹ªézɲÔäI¿¾1à¤2<’"ÒD!\Ÿ"ÈŒXx?҆݊î¥Ï+I{“ꮄŒYD; {S;ÅÃ!ý[\ìzˆüå=.³ý¼¦À¦†â c¥®€Š‡~¯Œñl7'tEöH½n¼l/uuÝ^ªÉ¡ l„Å:ù#ý,?  O…H`ç™Ý°W)Z_“<ÃÂ=’ Øð06ÛV·Ê똖n®« šñbt®iÙ…Æ.žÖUÞ'Eæ I·kæäI"ÛŸ¶Šª Ŷºžlž=d'A©„Õ[Ê‘cÑŠ\ûž_€§;ø¿ã”3}I¢U´åôz"Ç"-²ìß!µBP„øí5*iÅjOJˆ  ô¡ú’×çÌ‘Ñß‹)ÑöYWÈZWód‚ÿi^×»!P«ƒ¶¥5€` -«4,´ ´f˜mÐY*X{©.`)fJï žê‘U~IHî2ïŠ>Õ(vFt-]î!”¸nëÂÇ':Rfl‚¦›_ ¹€˜·K¾ˆ #® l@uuUÏä¶YÕž7ìr߸áëi¹žLäõ«é¸qsI€ä€Çw<´nÉ&©ƒŸŠf›¡~§i@ÈÀ”öšÒƒ™ÔN‰È&Ó7LÍ/ÿÌg0mÿ‡<’,ñç_l2^Ìuèi÷lÌR•U7td~â¶J…Vg–ŠSLJ‹Z?3ô;çÔ&óðö~ϧæ¢òCÌí "k«\\H4éLdñ%»î4ˆZse€` bˆ¼ƒ_ +´A®¼ÎÈ0¢éb*î¾ óàAù^иëÞ3}BŸS.\ú)tòÍÇn»ÊÁGL"»hÀdxãø)e+¶ø[êúݾŒxˆ0ä±’xw1÷'JQÒ zB¯§ÚãÔ®˜÷IÔ4,š÷ÐCÚÆ_Âô¶ì‹ê‰U#ô§°ÙÆi‡“,ÙÖŸ‡gfÏY.Î(~®d˜àfs˜â|ºßy§ºSNŸV¡x±\v%•Ò³ÜeûJÙÆ”$?q™ÔîÁ¼‹6>›(§½&‹µ]v*Íxo?[%£‰–îcêÜ–«Ú˜z&çePèe âS*ú„Ëðm×i–LÄ y=_w,ú¥Îì^Ad:”N“ ÑPÖ±/ž™2…"•/Q-C\ÝÀ}ߤf¤ä¨'a•] ¬ó„Ú”-t:KïgÓNb²ã€¸©4çX`ûà-c™Ø)“ƒב;„¨Õo Z8Ç3ß“8nÃ&ð Áû%WZäÇô§Ëîg óNeå®9ÏÏx’u”öb {ñHÛ2Ñ; ãgð"EGÜ pøNeƒPó-ýB˜º¨=ÕdäDD‚5z ­ÙO ¬>d>ŽÑŸâ5EbëôViÀÒuуÊJbL<¦"çP–ã;gkA=[Û¶ÜQ”LÈÇÊŒKy?ïáÚ/C÷VŸC4X”«»MBc@äD’Û¸î‰{ kçéMQ(ÀÚÑ"iùa0mfá'ƒ^ lC· )t)‡œã<œùâÙÛj$ ÓQGÛ—w,ûÒ«Ç®…èŵ¼Ì™<ªsl­‹wNW§h¢£ïÈño@Mþ&¥ýy«ñ´*½~ª6qã”ÞÀ€ŸêÝAUœ8yCäÕRÍ £ßȤµÿ„bØ|×— —ðÞA<Ò°ÿ4»ýPªgÐR·ú;—߇%ær8ªX¼º\ йaÄr$Äi†,÷å›u pœzqÉiiÜ}ƒ½FþdåÜÖ:#¿It 6H°""yß•{æUžã‡‚:öÂqê±Ço8&Nb†u¡]ÈêfD‡°õp_U~H†`emÌÝ}Ð@ÂÌJ]gÌ'~7ðK klkž‰àhÃÑ÷5„âVÖÛé–!1 -[ךïðþˆœ)ߨ±ÜP÷@&Ë7–M«Ol»¹(ÇqÇïÍJ¢i™˜¤ÇçŒí×, Qáé—N޾EÃÒüržeÂÂ纇¼H†§÷ðëŰ­y .Ò¼/å\¦NA?±Òû“ƒíx¦‹âË(ûµ»(£šÉœÔðx‰œ–ÄÏR"[°Ä?㔞¼ï2rBæàè©’§‚( @®éEgÆ÷¥‰½ªÈ²ljЍ  åÐz¤ í%„âJ"ÆõÁìVžIµ54 ™Òók®‚“£s,ŸgO¸“_.œ³V‹ôšp—ê)ÏqÍát¶4µŒÍ–„ÁýB+ÑÁÁ?¿Ñ4tÊU<åÙb1£Xeâ ÛŒuŠÞý-D4)7«_òê«{¶9!Ðö?•¸Ö\5Dæw5A¿ómó•/–#“Ìú"K-ù'ö0={/ÒN´~YO…«ez„W':öÙq›`“eîŒs½Oº{‰¤Ï¤‰ëÏ–fɞ̞ ©e³â8R'æõÞâ:Ù<½øDÀµlî8¶ÖÄÕ¦6¤Y쪴NËNo†`íîãTêWXSÎWÿrÂÖÀ=°)í@^¸Œùx¬Ø=ޏò1˜j«]zñ§°ÌV?ø¾e‘h…@Vð&¥ó_r˜ ½ZÏEoæ8Ù,výµúT6á†ÀØLç_!¢ñúÒ`í(‰qnè+ómòûç/ú”[¡"‘®ÍŠý<ó®­±Î@#âÚ–ñRæTGÃH:Ìwµh¸dœ×üýÃXgDAA¤ÂïþœD¬½Î*¹D%™8…;áQJ²,úbªÇ}qÅÙ1‹ Â>å¢ßž‹› ~‹QãkÊ«ÀýªÌ˜´Ìgðìt/³øížÕÄz}†ÕÈ‘’ÐÍò§¦Ã Þ÷ô# ´/+<9¥mÆjÌÀ#¸"Oàøâ˜<›cƈŠ ¹±£´û{n<\ƒîÍ~ÛGÀ'ÅŠåÐ0è¦4¨`¬”%Îþ²ÜŸÐßdÍÄ­ùFh*o©û—òõ½ºïîd¡ÛÅt³q5š±VpÇ¿jŒ¢  Qó(,¹®,£ño(&ï›1xKwœ4m(îò‡xeRvÎÁ÷è·ú QíHXï6b %¼Ô¹î?³÷V ~oHèUÝšZê“Iòo*J“²'#…(ÑE Pè¨Õ yöb¡k„õ¹Üû¯£ׇÌ^ûtà˜7Ão¸I§=,D°1çùN'ŠxÉ-ʧÕ;ºÏi'ws|&{bHuS:Ôß š»¬E¯]«Î],AÅR$‡:r`UË] y\‘¯MÕWDÆÉdR‰Õýh+ÝÆÚHv6P«âï`¾iÊ)«8ä³íú4£.ÚrgX;x ¢f/rÖWßû¨WòU·Ó41}*¡Ëš]ÄÓiŽÀQxÂÊ´5Yé@ìiùÎØHbc¤QûÄ®¬ªó7JþCK¹(…C¶°|µ­C&òÜ .¢ræ€Ù çSx?eå«+…4Ç'Fr–Ix8_Gb Ã~ô¶OŒ‘|*“£&ÇýSÖu¿UÑwÅs÷8…… ! ÁJv7Ç1ôLÝ«Šb-úQ.ìDToÜ)Î@ïÆ÷äˆ}Zý åõlb9¤^fM?Óéîä/4Y/‰Ä¿™í“Ü’AM4;ð/­³m¸lÍy.k†P² ëõ7Îð7™]Sœ¾Éõ÷K±-6 ¥HÚÿV"MÉë!ìhN^мÈôCøÆÂÚÿ««B€™õ(lÁÌÊ÷xiñH£®ë’yòš_ O ‹A5|!>…„¡‡‡E¶’óø œëÑHΕCñ•M(‹v¡iûõf%á$«¿…J!L«…nm•cœÐ ÿòN«áµÄ´Î1ÆpäT@2ç*ë«f¨Î”­Ñf#ù ¼D vXD.ÚafÊoT ´üVu}¹wXj~}àVxS›ˆÇAÃp`_©Rµh&ËT}þGuºiMp„™8oGk `„6Û"Nað¤¦!oJâÛÑ7ø¤Õl2£f§–Û¢ÎÁpíê±="jgÍ ^¸¬YGß//FÚaJfÄË&e¥ƒ·6>ÊVéa½[1#3Í€A_¬šÚs¾¯Ü)ï¨e8È:–Tˆ{¼Írj1Dèò3GG5øjúŽ`L&~rØøÂ{üj˜¬zH^¡×ZàøÇbjžfð5­Û¨ëÁX“Inú2Í­RW8IVËà‹ýD¨hÕ=%âx^º—XbB—Ž˜œ!ÜbóÓébÕíDgq8~Óѵwø§üù€ÍmKŠ-Ê7Ä[\‰|lcÐë%…œ'¸iÖí_Ú•EÐEtF|âë0FîæÄù”9²®ÀA)[íûÙt¹„F—uñ õVeºjÁÞÙgQïiÅ4½=ÏméÞ±°Ð&¨¹%(f"8`‹Ù £DsrÙ2cVå G±è´,îy&÷[וæÆ-?4äN1=#øCÄ4Σܧ [AÉl[……²¤Oç»ejh˜Hˆ8µ­e§µ~ìþÏÔÉÓ) ’( ý?(~%«=µjÙ½cœÏpZë§>qÝIü*2b_HçÛãHݪÿ…—›­>6{bìmH8²w ¬ð—áÿÎ&|³'1‹hfp©Ì½ŸPl) R„H4Ž&{×?Éý™Ö̪Ĭü'g!¥’«îAcgáè÷ž©•«ÕpýC­&Jò!*I\j~¥ Ÿ÷)ÊQcðÛU©¬° ˆÅÑÁ“¥ÑXb‹O+ð›õ”!X¦l¶†¯EÏâ6*&Ò?E´>^éXÆ#lFbiÞÍ¡&; ðvH ÷Ô6=ç Ø7ëýF8TŠæ¼a ¡Á ·ˆL(*ô£Bɬí“Ûã>ßIø?0Cy>}=Òéʳë1 áœD/ÕG-ƒt©ãm )?÷Þ^ ,ÂAƒ{"©‹/ØÐhò‚fºYuæsÿ‘Å¡† ð-ZÕ騯œ¥Rož=¸L÷…ç †î‡CžÞõ˜˜2¢ä7tKˆâUªÑhúhHPC”ß+{!*8̼_^æ1×P|g{¹˜}Œî´Ê³¹S™ˆ³u§isì¿N>áNÐöGóTñä£Äº®î–Ñ;Ûž«)°¼þµ£U<ØœZѦk䔳mSFF˜î3‘²{£ ˜¾t·8?þ&¶ú`Ç&à×õ»‡­S÷éKË}0f÷>zÜ$#é÷( ,  w$e&ãÃù¼ûw ‚Fèo•{ 3ÁûEÎÀ\¢"@+õóÁ,$Û« bÂÈ•Á[ü'ÈE­wÂ2•_4_«®1‚~Å’ÿz¹3POøö³GÑÖãuÄ׳­oÍŒ^”š­šÁÑ `•9»`÷rc¾,•)c×ʸçâ݇ŸvBI`WŽq€jas&™âC …ç¢ð€Ph\ß`D¶¢ËuæŽÆtö<Ù¸øMD¬“]†ÇLº£p‹š•›Ã…àâ¹ÖâãqÊkÀ8eLŠŽ„†€€×/5é©K_:HšxÔŸáXÆå’œJ™ahľãŠ~ñ †Ÿ¤¦½ ™ÞïÉÃïôk× XÃìþ&E¢­×½ÍÀ” ­Ë–“þ†g Qîìù‘½¸vê¨RŸçÄëýŒ2Gq‡¿J£à.­î8ç¹Úæ‰Ãã0]M1yYž¢GÂ.B“Èç6P n¡ª¢"\ɰeÐìâê3mð1œ T‚#(\áºÒýѸøèø¤Í;g‘ôûwÄÉ2)Wn"žÀŸáŸS7»oˆô5ÁÃ! 2)ÓoŽ®fPØJ¬§`¯_É;nB>9€@Òg¨ïĆt.r]NŠLWE\û’<‚ÚpÊÙHzµX„ìdZ]Ø.O:?Y„B~ƒx¼Qöõ ŸsJí»©¤þ™±Çq›Ò¥pލ÷“X«¿=õ`¶".Z õwf:Óäs)©Œµ>DÃ|wOÀ£p\nÍBºÂðQúÆa2)±›Îo]kæÒ¾c Æ0iJKe,Ú3N¦U:”èac¶ע׬L¯¹z¾¥Pƒäã9š#Ÿl"ÂUêÅšNÒW_&yyÈ> 4¾6ilß+¶8µk'fÆ1BêìWõB²uoÔñª©‡"šŸ±ÁMáU„çh"lÙÁ¯Ö3UãG}zSJ»úåq>§òB…Çs×_ |:VËâ2ibñ&p¤ÂEÙ)têÔá…„n¦WMb‡aädAvRî¨<ÿÜžˆCaŸXJP¼]¡>ÅálâLæ>1a'Îè}?„>Io´ ½Ÿª¥ü®Œ+Aí ×4 á_gH¹.áùÕ‰qöH3ëY ™gPnÐѤWÎù9k‘3b?ü/î9X5:ªakÁvL o{=y3ýûNžm/öw2€7zÎM£"–ilÉàeÆyša9#áà¼UË‘›ªÿ ÍYü:»3Ú9…ÐN™ mˆÏ7ìÇyë’.›õ:úd—Qoɼú Ú¿Xýóßå¥ÕÇ,m«ç'Æ=ž_:AŽÏÊôF oÑe“Éɦ³í2aÏvRÄ'WŒªŒu2 â.­î™‘Z ”CRdwñ‡› † ÏRŸu_^ž•±XÅx_`$¼•ÐpŠ—³#äíϘ†–ù:WÞŒ~ë^V„tÆ ï%Õ’ïÖc2ÁûÏp§€Õë:©ÎÌ©·T»½F&p¹Œ¾ð¾ /Š+Z‘‹j=õüäý‘13ÕHf”ˆ‚e3œ{m=–¼j¦;YGÈèÙ[¤ŸlMPzêq9ri²ìΞ»sUïÀ.í¨mSKŽJë3õ·Lö° J Ìhè±DnM?»³ê'•»!pTÙ?œ×ô8Ü]ÐÑË×Ýx‚/ÙµÎd®xøëHÆ¡¹>A † |ÕL§R÷D¤2 µ?‘‹¢¦ƒäñÙÝ Í„?"·å]X¨™ˆëü˜¤ã™ÈŽ_è]æNÆ*©2QþL&æa±—(µj8àò;ÆuT%z3 HÚTÑBs]ÑΕúêø!°D¹ÚºXhðâÌ’ÉMëù®â¿£ ¥ûó–܋GPþÙÚ™ê•TUR#ja@ÝÆ¼YøµµÔ}¦—¤ë'™^ïM ÑR¢îFØê²æ4`59„à†A:ƆÁÕñ­ê±¯óPÀZ8‹~Š1Y^ˆùÌKY9íÆ’vc’%ÊÙIPú<ÐÄðèè1my¼Â·ÍfÅ™›Ù’tj*L_ú”¶²ã8µø‰ÒKM“<‡€ÐÓ6Ž3×úQSŽo¹½‘t¼Lå¼ItÎ^a?L¹€‚1%˦Q±ÌÙªûóB]cÐuc4)oÜëô!݇V§ þÃ&Ò^&¤Êê×±s¨3K{¤6˜Bþ˜6«’«ÑÇê›!zÝÂR_-±%cx`Xèî:×~Ð:M€1ÃUhô ÂèÙ^„ËÞØßôÊs€xá1‡¾wxÍÏSá»$)Uìr­†õSKzÄm^,bvž’쪾„0nDÇ'ì2¥©¬äËTF‘ žèïØ¾î¿w{5°|‡Žn4#ߤ¼cÖ­M‘_œ?©ùÐÀWuÐõ¢,‡>ì‹okoÖ˜qȈÉ®Áý¯»~òœ»5éXìV7ÅÒ7"¥çg«ðfÃkKù!bJ·‡¶> µSщîÏ£¸5‰fÂÅ/3¢ó¾”c¥JdŸsNB±1º¯`ÒVqi‡ðã»_Ç8 ¨&ÙSÜ„ÿE-ÂuT0‘RB^ý^úY×`Ø Ç4a£-¿“ÞE†´^Þ r÷P1èO’ÿ™«r•ý€KOòôåô(ËË‹¾Eðbð›ò“§tÅ(ÚeKØöýçÂóp×m‡ªE -ûŽWX‘B€Õ5!çÐØ¸xToaðZqÀ€¨eí,é>"=¨AØ[ g ½¥2ø.ìl˜xdŸõF!oxÖ ¯G•¼çí±Aœ•FHºE[¬Š>²Öà1~¼®4`+üÖ-­ì>ÉHÂH¾¿ø[€pž›£’˜:Æ\œ1^[Ì!œËvKm‚lc/ºß#Àƒ}VÙ"or%Þ¦(ß•dCwÕЧ%û¡e+N³éè଄!oáéÞ!gqÇË›Èýí–ĆI"1—Òºl0¤JÜl$÷|x‚¨Kº¥fŽ*«z`Â`+VKtæ/•¡3EþÚèWZ³Ç–ÝÉ#P»  ¤5yó[û帺Ñx:ª XáÙ$3³N´÷úì1ž|¥¬ìâÛ9Àüoû&÷<í;‡vŒcÍ 0^n¯Dا¯¹±‹¥ñ¦ðíÖœñ bpçÛ‹mB°â¹fîÅ쇢Ӻ> ²Ì{Kè紑а1t~#¡ß‹ÎkèíÖ Lêûo͵"<05®% endstream endobj 1011 0 obj << /Length1 1989 /Length2 11794 /Length3 0 /Length 13012 /Filter /FlateDecode >> stream xÚveTœÛ²-înÁ»;—àîÞ@#Aww'8 àî ww× ÁåõÞûÜœûÞ7zŒîžU³jU­oÖú …ª‹¸Ø $vpeá`eH*i(jjr°ØÙ¹XÙÙ9Qhh4m\í@¿=(4Ú g°ƒàIgÐb“ºB¨J`€¼›€ƒ ÀÁ+ÈÁ'ÈÎàdgø"ØY t·±(±äÁ I°£—³•µ+d¥ÿù  7gpð1ÿ·9Û˜J@Wk=dEs @lnrõú¯ôo¬]]ÙØ<<)g9dç½Øþ}Ķ`ŸßØÒÆÁÂò¯V,ÜÙ´lœÜ@rRÿaAL(¿mV W;;;?äÁ‚œ Osk¶¿ÑôrýíäøË éÃÏÇì°„´ò³±A~P|\€î €«³ÈÏçOÇ#€…¹+À deã€ò;;Ä ²üCTàlã 0`‡ˆÀþ×çßFY€ì¼~Óÿ~Ðl²2²Šº2Lÿ6ý¯[Bì ðaád°prqx9ø¼¼¿ÿN¤ ´ùO!„Ê9X‚ÿÔ Ù¨ÿ©Ùý?B ÿÏœ0þ;—2"`€þ·Þ ÙyØÍ!_ÿߪÿ;äÿ%ö¿²üèý×$ãfg÷7ƒþ(ÿhocçõDÂn®qPC†ÂáSu@ÿL±ÈÂÆÍþ{å\±w°‚H›E€•›÷³‹Œ'ÈBÕÆÕÜúo™ücÖúkììl@ª`›¿Ž ;ûÿòAfÍÜrœ¸@Ôù· ¥ÿ^UÚÁlñ×Ìqòð€ÎÎ@/vˆ¨8yx>á´yþ­g«Ø€tè°;£üõhyùl’™þAü6©ßHÀ&ý/âㄈí7â°)þF,Jÿ"~.›Æ¿HâþFÌ~#HN3 ¹­‹ÐÅú·•bu†˜AƒÚÒõ·Rù¿è¯Ýb³øB¢@@HjË? ¤&«? 7€í÷‚Ü<äåh 9ú~3 6›? ¤ßw@HS¶@HWv@H¡ö¿!d*ÙþÈ 9 ØÀ¿×†p!oŒ?ÜÂÿ€Âþ…\¶“"Ñ¿•ø›éÇù)Þå)þO2¤x·ß» áþýp1;ÿY¤'÷? deßr¬°yþ!=yýî ê rþ§Éÿ’«¹›³3äÿûdhùðßï Èd޲0 6 }WÚq[#NâÁ²3ÊõWëúÅœ%Îz‹æ«2¡m) ÷Ç_ü©9RªCÖ"U°J°ÐáïI¤ãøÍš÷NºéŸõTìVy…×)Mp0%–êzO4¹q‹W=·S 'a‰ÏCïMÝŸOÉ3€*»)0°ðmö#7¿irœ¢õMÉBûµê÷@½”‰Ó{uÀ‰T¡š§W 0‰îÞMÂY,ÑÑšÏà[¬Kd&ªBȳ¦¹€sºµ+÷±nqJÂÃO Æpes(Ožþ{s×ò8¼öU¶*Æ]•œÑ!X8Ëü‹Ö/6£©éV"B V‹i;—ïŠÔ]]¸1ØŸOù(Èʇ"}gÁÙY÷¶Âuãâ9í ´â&vJÒJ"qþh~]w°“^…PìËCˆ\Õ|üÅö¶/UP_ŸNó^ÍHR‰#ß!;½N%+›ÏÑæãû2—!$ú6 Ûqb2%V £Ûžzu=ã)ÚwkžU87FiÓÊ’7øî[ßÄ $\Š{ƒç¾5°·ŒÝ V^˜P\Óñ34Sy¿ÛÜS÷&x½YÅCfeK,j¡ã¢t;Ýë^…ƒ$MŽÍU@Úå×?e5ØÜ†ïËû•c1?ËXôêžà’!x?Vƒ8–>ÃKJt…FNÆÖ«}ïJaµI(FÍÔ:ÝmzwR\úr©ÜÙÚAš-Úô\ÖÃô92Ö…*ÃY˜í#´¡e§ý°u †³ÁÈ”ÅÊœÃ#æp$îe]}ƒ&{\¨3ãI9‰¼*Ðñ4P8}±‰Æ…F—Áò 9ðèZ-ôbâú31¸9¸›õ|ÏvC8Ñ;¡‡3óÃÿDbDïj».ºAY 3…»â1þrßBŽ3~?ÖÊCÖdAU\­ÕU®kІsòC;JWû…£,Ñ,˜5÷àI6AöüиãÍðt# $QàdŒ#òæÂúÈ·dÚÓ“Ñ57OŽ'¿ÝIõ×òÕ뀸Zv´Ë¯?}í»H#“½”ƒ—Òü{>xc§vºKa<™¿“!gdª»[ÎD’y40¦3 Úw2nzOÏCcöùiÄD*­öP’Ò]L çׯ“Ï×Ëtƒrì`SÁ]ÄsÚFDul5/É ÙÔ5J¶WË4 Ì¡:°,5Íc-ƒã#Èò¼YËs äÄäàŒ'êºLÚK\‰¹kßvrºwKbV$q³žWþÜ7/ÈSOtN\‘îì±@PÅ é ÈûÔÜa=Åûæõ ?p“ÝiäIQ£ÈÝ#LŸ/£8g4 ±¡C¦Z¸ Ýž÷{žvUs:|Â+¨<²{âlŨ‘]üÖ¥jA¨Ê½â‹H‚02”îó¥^¾àï§ÁÔì¯çŸƒªO”%£è§ì §î†¡ ¾~¨e÷¾:-œ°O‹žè1°©}DÑ,d­kiÄ7)ÝóȺ“í"?VÊæ‹m¹Ì¥i8é—°ÛeMï™ajæî‚¡Å={étoãü2ó¥‘t‰ÊlèQx6k«Ù2vÐŒ®øCù•Ÿ‘tºoÊaá°oÆéÇVMÕ!cÎYÆÌñc“Ý)¬ÉGü³Â1à3a?5]½»ç“úz53<¿‰Vó¶ƒX-{@äÌ£›ƒ4EøEׄãºg%Ëg3£E¯áÆBG£e³øyØElo%3C{\n ÓÈÚeE6vW d«Æô 3õdu–uć*–TØŸNyñšz"c}7k‡`®0(ŸD¸§ÏÄù÷¿èOjz3‘žèª Æ êµ¢.z,‹‚D4[Â.sÓKÑfµ‹¨ÁËQ*Ÿ9‘¬ )îš°i}™b</‡Æz*£Q¾à×Ëüªˆb/œYlìu>W3ÚÕmôžðÎþ=¯2N˜AÞǘ;Ò•)B™²&+%\ÅÙ½o& ÅÑúÌŠM¡™e6×Özôš•c0Ë÷}¢¥m# Wf‹®ù÷Ëî[’ï³(Üå­¬¯Ö¬×ýru¶äs^ iŒqÝ}k2¤Gl´HŠð›ª0”ØÆ>KØóÁ2uàߣ±ð¼âôe†%{{ÜðÙF »(âYº§…ú…›µÑWŸ‡ÚÀÔFà‰\ÔŽu ~ÒçnŽìLwª:ÆêéCܱÿ8KÎ/ûû¶íC ¦$Yî‘òNØïuÌÖó„$CžÒ@‚—kcC':³òÂî´V™”«’÷Û?ƸßcË#¾¥@_t.Ý.WÍ4+Uçü,t”SÞӒÄÌMž»ð1zfÅ›#œðÝM¹ª&Ó§ÍûÉy5]s%WÔô|XÑD+N>.>®D˜ v«Á½âcôÛ‹(‹)ai“òL ©QÞ ý>”3‰ž5TêÓ¥ÒøNi~ß[T©&"[³9VžÕ·äÁízS¼ Z,k°7ã]liÍúÝØÊŒŸTŽåí4q ÃyÆ4¢e 2ÿñlv]ìúº5­·.¦°Êô^°Œ@æðx™4 z[à]˜jìó p¼kŸÃ'R²Sµ{ˆMr½` É¸Rõ±¾‚~½¸É‰ ´ŒÆR¶H[¬†C‘Ú1"™›NÖ ÆßÃÔ¢S,Wg¦øMË~—j/—%‹H>"ŽÁKÝb*ñsýζ¶ìý3ÎEÖYÍñ#½£žOˆù‚p•q×¢ƒï|«ž €Ž¬óÂñù+Ö¶T„?4•çÞ§P¸ñ`³¤éÌ'¯ëmœ8Q_²èÄErAJ÷º= ;ÍôרֺUg:•ŸÏjäÀ×ÏÊcÙû>ëSÝm$ˆ“ ¤8ŸÔ̤™åÐàXù|³™¹·D5+îÃë‡~p½üˆ‡õYÑzý«ÊYá+@kÀúcª¿çSòÈ ö©H²Æ±—|Š=ºzfPvÖ8ap°G<_£j Nk&É"Å6ïÉ´A4Ág×Ä%×G“ÌÏN¹ÔþäÀω¨¯.C<2áø:ܶkEÂòiå¶–·åÖò}Ži¦˜–ÌÏPr`ù“žed\y⢟~¸ÀD£‚³?ÂJØŒ”qøÐË –ôÞrlò°»È&·‡Ÿ¡š&`¿’Û<œÝ ¹<6Î?÷w_$+Zßêê6Ãçzû ƒ¶Ž>WjÀe ŽœÄj[½œ‹ ·U£ ë÷w ºa¡þâ(ŠÐÉÕš9Öÿõà€ yD•«ìψígð™´åÜqu¼÷VÜú•h¾9ù3(GT1aï~£Šú]-´ˆ^K)ö!õØ9"š0ôCá‹-1¼htoýâ|²ÜØ\ïÞJÆê©TJš]ò4Õó” ’Œ‘'ý èy1ïOv]­–Cé祜Úë~?U¼æã4œwÌK׋Ee_.ñ"Xp§áH"㡹pßm¥ŸàôÞ%žì|*H˜’åk»ÉÌ[ÎV¥±EaYŒ Ön0_÷X…srIqõKö}é ÌÀŸõ#×^’© »iZÙDÇÙ ·;ŸãŒ¬\6Jº¤m·ÝºÙ,ŽíW7ãñqe­u–ÏðFëýl‚ÞIââ‘Â÷v†“•'‘®[à#ãä]iYMUœ=‡Ñ3¿‹e½*g1ä´Ø8ŸÚ,öÈXgàFApK\ ay$2P7ynâÃ÷œÍ½¬Û3hK¼|ÈÝ!pÌÌ.ÿ ” ðšbIZSŽgÕ92 üÔq–ʧ>~ŽL1G§ÀpŸ|£ùœÿjºÁîyT²t_2ì ;c€Ê½rèà ÷E»·Hxž>kb¥^]ÇÔAg‡hÑí S2ÚíåÑùâÊúõ2éK´¹5¡jëµT=ÐAQü·õõø´1èVµãó0ßœýeÇLܬ ø}ÒZ7lÐ2­÷§9¨]¬­|CFÝs§ËU¦>|C*'ñ¹×†Ùó^#øöÕ/Œ³”Fz´Ù$à™@m"$<@oF©z~j$"><¨"ç—úú–N3*{8øÒï á½xUð\º’Ž×} ΦG“œ%YôkÝsù÷1Γ™H”®aÜâníE/ÅíÜ2ËÖ’ÊÉjãœè•Ôº Û¹‚p›®“sÈŒ,rñÊz%(I™¶p¦p;T+&ß¿µ¾T3’ÎÌ…d°HÍO¬M©¼ÎÔ¢‚›…‹<Á±h©OxóÍTÌU#=º¹[/ö€¨n÷™/í®j «™«ó$l‚\":®þŽêv«P`èø7UGžÜqŠ×ß\ÍibîCûÕ‹kâ ŽP¬|k Óê½f‹Ý«V65#Öðm¨|˜o#4àº)æ‘à*rD<|$ñ›ˆN?À—ì:X¸ý5 ¢õ+™Œ§ë¯š.3RßiI ¢ßFwþ:¾q¥ÂÿÁÁA:UAûmÔðŠ$óÇšîýEÎQ„£×šùlëlZYôi€ãñƒ£ø7yjeåâÀÎ+Tß'â=õeǹÅ`YýŒý/>vbe"J”Í¢ ¤´‚ý‡·¢ºdzõ#žá¯BgÝù„j=m±2}â’Ö­Çj Û$`XjÌ„dˈô>ïñ6gÅŒ¢ò/³–lr?ù?ógÌL½îéýÊ´*ßÜŽX|1ʱ]`±P&Ècéõ±—®*R’=£1`±;—í>%Û˜WS$*¾ÆFµ §ú]gÆ€Ñ7ˆóÔTƒÁÏéK}Þ\$“¨þÑAOÍBY„§‡ãêÀ‹YêÂ;¤HWÿ”×aì¯gWc‚ò\>о8¼âzÜd®jíâi:Qný(79OÑRv”¼vHìP31y&½3{ P'ÞyD"C ’J8oIK^]vIBZFª–v^(ëM…n€Bí1¾7€¹>Ê„…?¢ä’\¾Ô’lürª|!yà¦T\(‡a¨øPñõ`qß;RP³e åDé:žãà#:_ZM¤Öœ58Ë=懃ÍC!Ï d‘Nfz'A!wMÌS6,öåuÿÁh!è°AàpCâæ3³P¾‡ ÈúNCLͮ岃’énºý^Nš4ÝWúí#\È0 ït|Ÿ¢?vÏSPHªF:-)Ê’bÅpÔdoùÔ8Au¼E 6¹`ŠgÝ) ¤xBA¼°D*ÄãáAFù.îý£è ò#¦ÈÌ ú¥Æ6 RÌ)W½Z÷‘•Y­LB¹Æì9³8ŠKÿø½62ÚC©äMÅâÅ8,¬òÝ’Ô®àPëûÌ2©òbÕ£ã¡=oUJÖˆÖý©ÑϨ–êŽØ¬÷ÜG^)‹‚öãBÔñþnÐÛ!h…àñºÑ£.¡u1›Ž·lZnµ¼ÇV_CÇuäÔÂemžÍMËh½Ýü*Û ŸCäúL¼R͘ï3‡‚*V­mtÉ cg³dL‘òΚ@YbÝ •,Y£îž$Î{ù­ p¨L­î”}}óõ»ü:±¤L°€ÑÜÈ#¤»váʘ՟‘«£ßÓÇl }A‘Ũ}Ð⥒"Òì¶ ßo?îL¹äó"d·Ì…\s“‡7{Z³ngÎAdŽ—FÈÝXY¼ïðÇ£>¬ °’“"PCô,òÖ»£Æ%6•ÝÖG¯¸›JmìÁh¶Øa9Ò—Æ€>­¹šº OEÐýyÕîÜü#ÛÎR Eu2ìWÿº é+z¬o7Yîµï_ïGC[Û PJmúZA½!bûÊ8`ž¬§™ ÷«6‚gé²jÎoÇitM&QÉú½Ig‡AZ•™ðÎMÇS‘–ªcLÒÕ”kÿF©Åƒ;ú jDÉ=ó¢Vßœz…G+*ÏÛ¸´hîºøÓw àŠ.œ^ÖT§P&×{l¹ªÇèª>ÛÄ%ËëÂ,›äâa¤y7;¹ùÚ¥%¿4Ö|ó ”wНq‰·*ZJ·Ê &cÕ £=‰&õÎ2Cj—-o…£>·1«ò(rô1Ýåä.Wx€A @xîLÍRËÖÞÅSÝmaÜáÅ}àX‡³‚GeÔ,6MÌÀ£5%Û«IëØí|$Hÿ`£ juš Üã¸;hVlë)xŸšÆš²¸Ñ9¾þô&§ûKZ•væ;¸EJrrgïAÉ%çéXïj“,ôÇÓýWhÒ{Þ†KGõ9V[‡3ß=e‡~¶ßœ¶”¹¾¢ªä–.×'Nn×íÓªêËÆ‡ô|wŒ¾PP.!A³zƒüöñ¬³ óƒé‡¬¥{MËH- ˜®߸d,Õ^LëÛ8ÁeFZ\Â\†éí{µ(jí±†ó€Šò^½®S‡±Q¼¤üeú!~êÓ®ÃIMGÑí †¹ùÇ¢ŽYx8³+dÓOÁ×½÷=sfz@Ъâ.‡MK’KõNPÖÆV¹•Ûh‰Æ®ñá‡\ÃØ êJ׬y/ŠŒ—×îX£Aå‹ûÕÕ¯Dư_¾P¢}F ŸÏÉS0À.…Z)– Õ÷ ´šõâ Å/ߦ+¸\3„Œ@‘5F#•¢nTQ°I°¦Tù¤ˆÈ¢™üÕ¸¼G™’O_œí¹|´{~ ®TÏë; Á3DÞî_›º B®=üùð4Nx³Pø„i/I®¶/ÿ67zo™v~b’T¢Ý³Ÿ7Å”ö8V­Ÿ1zUrxlód3È#ÛV¸È xXÕ ¤¹ïÙ6%’}ýÀpñÑŸFv׸aÙJLÏ¥œÙÙ~ä–"éN`û0ùu¢MJ%BvÀN‰üÈwüû1)3É_'¾mñn… ™ds?púõ ªà÷г(øÚkT]ýý~Ñg|}s,o×ósïZûmƒ'<|…_‰ÆŒæ†²Çr0>õ³|½¬\jÀ(,Œb—!ˆ4ŽOô†rFèÚÕeÂ/ÖêÖæE*¤/~þÇ›šý¶†"Ä`2E«ä!ò•öR x½/vΙբ}xl)Ú˜Z‹j»3eûÝHIl0'Ú"Þ3F׃çÛžÜó#¿4æµ/.Nt£Ãè&‡ŠÉyýpÞò–›é®3¾>g››»¬|`z”¶§ê!y‹­½¨ïL¦ø³Ð+¤¢üéø5óx—ÔXÓ)½Ýd,ËNÏÆwóï•Ó{ô* DØÂ§™ž0xViÇ)53Ú•Â>5°+Ûð¨®A.Ú F¨kè Hé-yëjÂf…‰€«êªütË@ æyií*߬õr1Q‹²‡r¢…L?¹MàYfà•jfgâÿÀÑܹ‰Ö‘°ÓŸwô¥A\Qêeˆåyñya£ÿuë?3öÜpe¿ý-Š´q¯y¿[ó³öz) »íùS8ÏåÔ²¼®ÆY£½³éúý:Æ)7Ç—*œ¢)ã+ƒËs$¸1½a­¨®Ö×SïÐ_ŒY¹ô7 Vz¿ŸIZW*zË%«­*_|Ãð«Ë¿õ¡oÙ–¬Ì-§ûæjqª !äôXé¿eÆhà{àü:áäŸBæ‹ýC•[q*úÜDÓP2nA-ë âðYÑi­è*ô|¼ŽùðÁ\¸ñq§c9 #”cLÇ ÙL!nŠk˜xœoœÈ—¦²¡ ­”%ŒS@›\Ê?Û\^Ó¾‰Á+ÆÓ:c Êo=¤ZO6 ¡à‹0r71;‚FÔ7ËQ-Š1Ux=ÆÐ š'ç­z³òÑŠAl' ”‰›Öúiò©¡ßíëö(|7ù§­cüÖæ\i9m5ÏŽÓW_’¬z©b-+a¾[ä¯# ¾OØåæÇÜd6ÌaÔžÕи}–Øt5쌶ˆqßAW[«ð×3œð-al;SU‰1qÐµÂøPòz3²ÿK@‚”èÂìÑ•ÁŒ_­ÍOš7ÓàôŠ f~ êvî†P‹XA–ï!ý˜ojëâ`½U™ÁJ‹’ Âí÷Þòš+~sŸ/ƒ¸åùŠpº ÜÚÃI$qM©}ÎsLÞ¾9Q@"¹ ™^’á2#5ÅwÚÕ×”_áõá×2.ë¶m´ôfÔ¿ùUèw¾ëdæfhZþ™¾³“m¡Btl¾¥#;>x$P¶pB7* ‚sì«uv®ñê'FÁ`ñ£XQ9'{fü£B‰‹š³ÁÈÞt}Ç«X_±âÞºÅO¾¢²M"èŽR“ØØŸFX] +ßM0sæD®C³)‚ô$Þ'hÕêø,¨»Ó9séa Ý.õEÏ™8{ç@s¬¸Ò1“C‰åa‡V-’Ù'"<™KbŠ ~Ýœ'ˆeØ'í¥æVjÛ“¤2÷¥ãÆÄeSºõ+4žÌŸ},iòˆ #^‰Zߢ²ýeöª†ð4t É8V¾ÃZµ“Ë=ÐTæ=wª±&åË6¿ë$žhºq¿œX²Üí :rO2š7 tœD7áÇŒoŸžõÞC…Õ͵t¼a‰4éú’ìø %z îUÂè-€®ïvÓÀ²ðØ[ãû|ï£M]a:!ÙÇÕso9Ž+³ºÓj쨷"=Ç/J$lrlÂü–Ïè¯ÜÀ‚[‚µ»7zÙ Äå§Éåê¶\{ÖŸ#›\*{®4‰BÛI ?¾ä‰ Îvlgî¸ÍôÈ®ˆ±VLh€fO¶£[‚¥âs¶)86¾êuƒ£žýJ°»FRm_ÚZ¦ ‹õ0½Ïˆ´:ü"ˆæpwgÏMnšFºO1ˆÁ´H†‰AšŸ·Tý:öJâöÅçšG+Ó™½|Œ<'¾»fŸ#dd/õÃ…!oJ‹‚£ØrÖG^(+ ŽC2®ñž¢¹û¿¤ãÜе~o ö] |zª&H²ªê°Ê䣤whN d?ƒÅG4¥cCQÏlë’lpÍ•äj[ŒŠäO\Sú¹ÝÇnB¥µ©2dw´XH–©>•ÀO‘€a=þòcx2€ûöRAe”.¡Þñ†ë‚Ÿž_eqÑòQ¼:8Ò‰ÛÞ½ßë]lJþŽió³Ðº• ”PáØ3ŠCšûƒ¿7 1 EÅuüÁý'QÄy š™C¡ŸçÁ8R£ujߦIÃdéâZ´:-ü¨hÑ”–=íxº¡šµU3»†:t4qG ÁÍ3+.ï¶È Ô+N“;¬|~~Œ;ª)EÆ{_dûSQÖ1­K¹¢ÁMД†t€N;TB>¶±wh;|›OØQ:ÿcj»–ÖAÝv´Ž<& ,ŽÜŽÒa={vî­íL½c>žBi­#)QȯèçUºüºSÙ¾±c ¨ÐP€³¦úòúðÍ´«x•GP/Å›åþÛ ú㠹¡8½›°gÕ}geõæÆ3x¼E ¤qÂ9¤@žH÷Wú·Þæ™]*~&ª4ZK˜ä {tÑ!iEß¼šW9{fɆƒ”æhH‡>jÚµ’ØA§ú¬~iïDF.|†’¤¯òBÓG…‹¡B°+¨Y9"$‹R À ÊÈW§áL§9yʉ0ôí½jK2 ã]euJ½iï R«†¯âzB;5N+y'ï —â'ᾃ ¤• ÈˆÓX·ˆH•0'°«xYjIW9á¬DÓyÔÓ–ÊÅ¡0‘%¨vï>~Ûì;”n°øÖRQU‘ÁMÃJvŒS?Eœ¹]ÃCÅèër8뻘™¹Ç«j×l÷tª«xe´ík‹6{®r2Üì8“œö–ŠÜË2¬âJå8¦ó&Ü)·)Ì›M ÖñMö7…WŠoœŒ Ð‹SÜßG4%-é[Ó]½‰o½[ 8 ¯KÛžôE¯W¿æ0‹sÚgúI3îJóùY[ÁWþEà±Ø¦—Š–P‚žB'L#o¦ö|!vÁºL¦²£Ï ry;G›;Á¬‰ùþ\é4<\|n»ô(ÉrÙ§Î`(xjJéqõäÒí©­¦ð\¤íe~"~ùe3ßü¡¾ç£Å…¦‘òGd©ÐLw¾½waDc"É;¬ºÕW±(­ñ™ÛÀÏóPÏØ{8l?dr¥{ñ-…VueÔ¸Q­Á/ýÒ¯T©-ýIðfŠúäŠÐýôšó…FWÞ×O°{™/¥E ¯åKw–Ðb¼M}™Åz¥‘u~$†}¬ÑNÄ!cS Ï#E³#œJ{)¸ÿÖÌyãt›7¼I/|ZŒ -'#U-Ÿ0ËU¨9$“úīپ¨ÂpQ®3ԋ榫 Ífâ1 ¸ÙsbäVŒù%\/D`ùž¦žXùÓ°ÿdIklzÄæ$|%ÜïÖn Ö>¯&józEglðÆ…8Á~ŒôöD»+NXDÙú€÷s/AÈç¾É 6$1w“Í0zü){Oc”䇡åñ¢{Ì9ºw¨·kcnép¤¶g†GOb°·u(-ý‹o©CÏ­jJ‹Hʃ°Î¹í`Öà›Ð T'¾å4µ†BI#7Ëýj‘ßg%L¾.¥ÏSÃÔ1ˆ e+ ´ë¡¸ð#óÚ½”ì¤}¤kë%xEfeWë ¼ß¢ÔÁÎ „¿Öm¬ª»ªJt“°Ý²W6çæ…W™Rï\ƒBCkðk»Üv8R†3&NÔüê×™Hg!€ [)bÁ׃5÷¶†^qÎÛÅO0cˆºwä¼.W~'H¼M- Ѱ.“°©u´¯¾@;œõ¼7tWÍSý&N*q ÝÂwt_¡{$8Öš‘Û^#m<(¸÷8ýl{éZ>½Ý1ØjÌwʇñhð¹5£‘+a8ó€*†L mßèk­ÙÓÈi³UÃÈØûÅGNkÉऻ& °È•=Ç3Ÿ¡ÎG:`²Kú4Œ"ä^1ŸBX)ržwH^«w¬1-oU<3}© JçqR•~Ô©æà¸wp<@F°ÏîJ†h A‹w` K¯ >8#Ùñpa~übläN2¢ÆïüwµïIBä¡“rZ‰tbû)^~Fó)ÓñÝí)KøéFïe=øDo»jÔ’~Ö›šIxÿqKñY×.ð é úIÈ}v>­^6Èî$”­I(wqsßÒö’ÍÌ îi^»Û_´5Ã`Ô4¡pð§e´—òá/ùôrö›jF‚uðS!ÄrIœ<÷!Þ_E.©¿s®ïo¼r!6†aÕ2û0²ûÅâ0r½_7£Ôï\eâ¬3øÆ?,§jfºª]²ÞI1`8l'•m¯Dd§§M³ÏE°*¼2tµkÀö"W&£Ìvv «¡}ƒÎKˆ8ÝQzñ‹ª³ëPS@îu¤Ó$æhqKÂ#´÷LËÕ5î’·q¢žbâmßÍùp>þÊR2}Çé5Z%¼éÊ‘¿-#/w$ÕŒ4Ògq÷åû›.8î$ê/c<}žÑû\d÷¯1Oݾ¤;«3­~Òs Õq>õåðKÆ÷•[u¾AhIMàL|1¬a+«J/r9nXE†M}k:o®h¦±A;¬ÉŽÜH×~4Ì™õãQEè¡5 ­ª˜g;éÊ‚Oz½˜»Éx]\^fÀ½rä@x„Œ¥´^]‡…é÷½l§ãmá§Ac@ S†v†ÙØpA´ +ÌaŸKJÞZ‚ã‰# “{t¡ì­+;›Áû¯›nMÕùÚ+¢¢4Q«LÕðª26=ü-PЍÝä Eúiu²-Æd>•¡}'Ñ"È8!a÷؇Q,yi{7¤DCk—T?.fÑÅ̺;eSÅ¡¡¼u  ¬Ö½]à‘vjÉTïÓëxù¸Xjs5MÓ¢NغÅü[(žßâÁw>š꼚&¤ØzÉñáù=/z%Ü,m£â×k䛵"œýÅO[ãµa<é² Z«½u7^³¦÷çt^!wÌDö_쥟èÑ„Lõ,_²|y›û»Xk½·ójåá' .NGÖäèN䦊Yà[(žÛÙ}ük}Yï”å™ ÈE2&m´¬…Ã?©Ëƒèå9&P­CÏÅÑ.GÌ]Üãçê‘è?Õ0 F×yʹ¿1nSH½TÓؑÎÃV2\}ï~Åúí­cO©Õ¯žÓ– Ofâ c©t‡"t0Úî%H0”kÀ¿°ôfت.]®!×µˆ»BÊ?ôt½T¤ñÃö‘U¿CL¬¬?bš²PœYfjçOó£Cyb+6nëvJ!s{p{:»Érf:O¹ì’ÂÃ<,Åj¡1Ö,# "¾e 4ºXXÓ¦Us™¶‹WóÃæB¾ù,^Y˜ô…x*ŸOô7Â(Æ,؃òcß½~÷„ lZ¾ -?‰ƒÑôã ¢"5Àî”80¡¾»ÌÄ=¤ìX7¬¡Ì|È{lÆWèÆÒ^µÈí²þDôtÇTOóDtVXæXXåÁ@äIËWÞŠ‘[¶ $’™Š]Gî‹€ýeº¬MW{Ò²Âìg¾@·¦×)²Ÿ±Y6§¡ôÁYñ 0T°¡Ñ-§@Û“†LÛRÊ4<4‹È¥¹D? °×ܳzlgÕöPUùÖ6ù0#xqúú´;ÑìÙºþÎ> stream xÚwT”[Û6R"ÀC7 ‚¤tw0À3À ]Ò ¡Ò©H(%]Ò " %!ÒÝ)~cœsÞóþÿZß·f­gž}ß×]{_×^ëaaÐÖ㑵ƒÛ@”à0$?/H×ÐÓã /$€Ç¢Eº@þ²ã±B<P8Lâ?ò0eS#Q@ 8 Põtø~ ~Q ÄÿÂ=$°ÔÐàTá0EîæëupD¢êüõ °Ûrüââ¢Ü¿ÂYWˆÔ 4ÀHGˆ+ª¢-ØЃÛB!Hߥ`—rD"Ý$øø¼½½yÁ®^¸‡ƒ47à E:ºÄà büлBþŒÆ‹Çè;B¿zp{¤7Ø  .P[ ñ„ÙA<Tu@OEÐrƒÀ~ƒÕ¸?›ðóòÿîOôÏDPد`°­-ÜÕ ó…Â{¨ ÐRRçEú ¹0Ìî'ì‚€£âÁ^`¨ ØøÕ:P’ÕÀ¨ ÿ̇°õ€º!¼¨ËÏù~¦Am³"ÌNîê !x?ûS€z@lQûîË÷çpapo˜ÿ_+{(ÌÎþçvžn|0¨»'DEáeÂûÇæA H $@܈­#ßÏú¾n_NþŸfÔ þnp7À5$jAýáù#À^éá ôÿOÇ¿Wxüü€Ô Ø@ 0¼²£ÌûßkÔù{@}3Š~üèçïï7 Ãìà0ß࿎˜OIÉDÍXëÏÈ;åäà>€??À# ÄÅÅQaq ðßi´ÁÐ?müG¨ ̈ÿîµMuìõ‡ìôÁü;—&E\ÀþÏÍA [ÔƒÿÿÌö_!ÿ?’ÿÌò¿òü¿;Ròtqùågÿ øü`W¨‹ïЏžH”4à()Àþjù­\ ˆÔÓõ¿½*H0J ²0—¿7ŠP‚ú@ì´¡H[Çß|ùm7ø©4( ¢ G@Þ-?ô_>”¼lQ÷EÊ_.J=ÿ.©³…Ûý”™€°öðûâP\üùQz´ƒøü¢1ÀÇ ƒ#Q!j¼@Àî÷óL…@Ÿê€¹@ì‘?]¿­ü¬¿Ïï§ù_Um==PNä/f ZúkýKéˆÄojn+îTÞrV)Kãͳü{~±5æ‰IO´0’õsž¿£úÍŒ£îrÖve”©Ú“%‘#4œ;gC>æY!s)ʹH4Åž%¹=žüþóÜÚá£hjÌÒíÝDZ"k3L3¶$£‰«ÑNÁÕò•‚ï­ˆUSñMÀ(:e1wˆbå¾5bsc¶E·|–1Xx n î9½0cäjkçX/®¬b9YX£ÅšïàFÍi±}xñªˆp2ú ZíHTE-Ç͵8ó×Ìoù1õ!Ï G¹0g¯§ûº¶<-NxåÏç}:„lIÖ ŽEcºíÈ&s°Xs…ôA$ù½‰ŒqV]6í“ß6ÛΪ3ô‹«okb.„YÑãØnCZÝS÷hÍåÕßõ9iMýèæXùàè{Ó#”+»Å=ÿ O£"”p¥RªñMêÀú„ÓG¥Ù4®s·AÃIÎÝêë·zÒ ¶[&ä›^Ð-ñpµzš^ó¬&ë±3c\ÑiìŸ'%m=ño‘D+¬Ek{Uí¤Z\³æ¼ýŠó¥]ˆ„ž³K-b4'0X·°ý—zÿ#”ÆëýŒëºá¬‰­S:Q¯Ÿ·ÌqË‹ Pàngðì ’"eS?)<äš%C2ÕM@GÖH-Ü]ôD„´Æ)מjZF!ë&g¥ˆßãNHÝ‘kÆN¸4ŽdRydÚ2Mº“Êæ‰…}YçíkËâ ¢1štÖmbé#M½pš ôGÕ£æ9L Ó¸^ä‰Ã˜iº€fñÔ‡G¾¿ðÇÈz%æ`læ¼G³L{?Ñïu·ÊŒ~ëdúÙ·–Ü›Z*£ C½ù}¯C˜åe0±#¡Ážü–OÌ\é¶²–LGùnKRÛMáz~9ei#åæ¶¡hÏŸ|sa£ë>Æ9Ý¡ƒýÕ¦š°ºFÇ–«Ö´ûêËõ` ×r6el:&có³Ð’ùeÇS …Õ×öóˆù‡@Ù%µý…†Ó±ÉÐiGÉæH­C bÒÀø†Ø/×V½¹ÇD»~"‘ÆJ]“ƒVMªÁ¡ë¥$Q& ¤Xs»Wc ?J#íO¹õŠYj1šÛ¯ÅûŽžÁM©:¾¨éÕ'½Œ©u+¼EÆw"&¦¥õLB¦°–sÓÜ š0ݰ>$–Ï+jÀôDkÖ¡·)Ù)O*É®ð©øZ¯‡Žb19Èä+C‘ôôº¬¢îÕëoDXïÜîF̽žGsVíß°¥  Ú}¦G¶ôüùÐù«jÙd«"ÒL^÷äWÎÚW¸í/.ZiØð¬!M£9ÞÛÎ…îŸäMd[Ö®@©»Ë&sb}AäpP9ÛŠßM,šIΕÌSs§KJ;wØù!\Ž#-Óý)%tiépüFTÀ'݃@f & %Ì^¿nõ×›Wµ.ï›rŸÒÎv>K]7µ›$e%: :”…fàÓSnÚô“ÌT§¥¿¬ƒQ}´˜i—ÖŽ L˱k«¥z]#7 êœñ™û{AÓ"º¬ éÙlû‚ôì8û1`î÷Ú—Ûä†ÞÓ >&ðØ~ôæÊ„Û¡ÔÛei*Pƒ’ƒZÌqÕ *E€y” úF(ÖÖÔAš>ï+¡„ufÈjÝ\µôi¡{[—¼ï ,—ÑŒk¿œêÍ;GS'»AGçÁ‘)] ¾ê'Ò¶W2Ôªìš'(žlºã- {w“f4Ë Çž$1_N ÷aèŒå*å®`ÂÆßXwíMaÔ4!†d8Šd“GZÎò 'Åmuž&ÈâG‘% 9N‹pµ6~jõR§Ñ•\žÎå‰Â˜J›h^å£S›ŽˆpäÓÞé&Sˆ•*ã>_#ñ¼Ò%Ӽタ¼ŠÐJM¼­é[ñþ@(“ÒÈL¤3ŠîÎMhæÖÞÆcăÓ;?’#ž&¾$óèO3üyäjí!ýòXŒÆPoðᡘ¿èÝ×C†[<ƒy¸–§g^!ùiŸlå3‹%ìPšù>Fèiß7Üì ~®bæÊ©»³°–>ogNwãëv§Œq<Öîj|ô©‚É+‚šO²•ëÌ=Uï v&c'ÚçêÅ€{œ]Kg<‘¯9’¬4×Þõ-h±9)>i³'ÒÌÚÀN/4þ5)Pp°üeßXQ—~Gb¹wØ”µÝì1•g•?Z©G…Qê'K~.YNöab>Ž#|XñˆÍ¤ºô᲎o7ñ9W……ª©bq× ØGÃV¸Év$uW?¶s‡qYþö›|uR™È‘ŸOõqø!‰›ïˆÒ»kÑ܈x‡~Ç?<ÖÙO+ê¯^„3íß¾ì¾ÁÉ-¢FÜãæðDæ“æ DB6I}±dNé«oÒ‰§ñáfm[62Êõ—D°˜¡¹fÿ2K—T‡zBLe/<Ɔc{òå Ù)Š!EaèÖaÿ:ÕÛ7Í[xVÏaXƒ{™ Õ[U,¯'Ð ý"´Ÿ’MÒ*¼hI^v7ež2uPgÛd!ì¾Uî•#«y×)ó¼ƒQz¹U6Ú7÷¤’â9¥‹/ñ¼^ÞÇ(K88ýÔç-¨sûÕAÉYav‚¾Þ^5õ`QnW†ƒ-eA·Úh»?ñG%.È]š¡—SÈÕ _â‹À9s½nß' À?=s(˜o¼@Ó⡲ôG¯e›¬iˆcK4“ª8H«!eg3‰ Æ»n.‹¨¾ÄÓiês»°ñÉ5Aì2¹¸×{Ö±õó¾]æ­Á—µS_•6«³ûSõÌâÕ¹ צ—\ÊøEùÏåÍÌ«X„g#|_s¬-ïÜ2¥1g Qºf^äë&O•¡Ž»—>Oí¬6ÍBß2ß×µüîê÷úȺÌí¢¦ŸXpÖÆ<Æ»Q»jØ$]’ÚšøY$k'?âßÉtWtymшÀPšî4=±=v|8ìZgq1~¿Îy¢.5ñžËÝm/ p´š”îUõÛxl³á: Y•¸E²êè»d ›´äª†¶1ã÷ŽÉΑkr0Føð ÀmýUÏ¢JÞðÙ»ä>Å•8œ0AC¨Ía,ˆ*›à}lÿUŠ0ý¾€SX&\Žš•”ÃTss#œò-=µ{ûª,^cR2ÒËÁ‚â©àÇè2í…yø;} 7t¿¬o¤Q¥„%æÙ€]Ú¶š0†TÅœ‹ U†™­ûx1)êvCF ÆMǘNñ2H'È»d«¥È™·K2‹N™NºS‚ŒªóM¥ÊI-gˆqˆ ®·óù"8hwàÁTgeù ¥”äO–¯Zí 7 Ò!•ªy¨·ÑB¨C´&‡¬æ™̸,l°Ç—†¥ÛwW"ã•mJ7éáuY*_„2 ×V#ïHò›%–#Ô- ’®¿µu~¥Ù1Ó_érb*s roûFæ@cËU\Ê?‘ ÷„§*ÇËÅ0<¥N#à­»#¾zŸ+úË„ƒ&žÅ1ê‚?PI‰ñó‰×Ì”Do³;ïMƒ7z°ñažþOÝ(Ã= Ÿ¼×iërwÙ°Ÿ²wz ÒÀ1Ax÷‹Ï·øÛ ÷Þ¾˜Q™äN½¼=h{ÆkSx‘ã·ííFڌ޸ÜÀŸC;ßõØ“J±H_¹µ§¸†§µ“‡a 4 äôŒå&ï»qºöÄùð*ÞéÊ;µÐºÌöÖ‘åü†£j³Õt“#ùcŠÎ­ÐYYsg©Íâ£2I/¨ˆZýeDñY„ˆ3/—Þ¼¼­¿QôíAók‰§d4ØäuK’|{•údp¤:4­º&–ç¸h.[²§”×áMÞ²@FâîQ´4Ùø=®3PK¿Š–ß0z/Ò$‡ús’ò8&¯Ež 5ýbAC—J³gŠZÈÉ9Óáœt«h³Á¤~‹ó³Ïµ¡¡…¤G¦.Vþì”F•ûaÐ|£Á[2‹ wMM–Óú¥åÆ-dú7Å3CæÔªS­Hî,ºD²÷‹QÆoKÓǪçÇ»Êì˜Ji¯u®¾K÷'Ff…niÒÞSðï‚ÕJÊß1%OI×<‘-/âkzbåk{ý¾û®2œë g›ï=¬«·ÅéPLAÊ–ÁNA ¢ÀÑc!ß7Üà;Hsê3t^9-'!±ªÀë Ø9)¨èX÷:³;×;,ÝúI}\òÕ¦ù¤ÓÔ¶Et‰öáÔiß v*µÍ•ô>7¦NÒ¶C,fß[Å•„Ç ½!Ü+E]”Ä׿èŦ³@mX¡Fu¤­±vOG˜>ć§bÄÛ«á\æ[Ä-aê#ÉݶG.¹gÌæx;Ç›¥7SK³²U¸ŸÅ)Õóq†|†\ÓK:™¢Í/Ëcñ‘:Q‘˜$õºÆÑHI®Ú{œËîwêžÙ?„d«zjµÚl™toîc~=pt>p)UDç,ç~óãÅQg4&H'÷žxPnkù1ï~þõƒŽäµDÂ!t:j8ç²tśΪ¹‰J;Ãt徯Aœ¦cP Æ´=}<‡6ÏO ³¿ßÜŒ~wÊÇÍ%Ëd1¦wªŠ{„oÌÆ®ÿÆM÷f̤´¥F¸îyÊÄÒûUXÈ+ƒZyánüÜ|³È2ù¨Î·Ä±Þ4ç<«¹V9"®ÃV^ÙéYÏ Õ^©ë½­'‰räz>©ÔδÔö¢Aº%¬–Þ‘óÓ1óÓÍ‚!QŠ_ÊDH½Ž^äKëŽ$]—ÀÙ’œ]Þ÷> ZWöÀWÍŽ żè^ Óú,!°”c–å(<êþ`‰¼÷“ 5 ©¼“¦¢ûÀGñnEÎŒ:×ö˜S7CíS™ŠéR%<¥äܵÓü«••ÉK.{˲0÷ z¾ÍÌxÞ» "ià"h{˜ë¾ýfÞ£-h©TŒ Áí£ ¥I>–o²ƒÈÞ9jͤ€úÓSÇŧ—dcX~­Uk²?of¬-½Ávˆ»Â£Ã1~9³0?YÂ.žyÖ$­àQÌŸ¸B⪥ÁtˆzÇ~1¢ÐóÆ?Lj£ÛÚ¬Ö;Y¿ùòݸ2›ºª¤ž y†@6ãg‘Ûã`»¡6¹BóoÃß `geØbÓl¾ÊõÑõþK Õ·jvL [̤8Årܼ˜eáÙ œO V¥‰3‘꺣‹˜bóÁs5Jwú²ñdóùvc2B7*ð6ψ HjÍ{ã—Þ€)¬ÜÆÜ;zÈÝByt…Þ^_ôƒ^N°A9H¤ˆ~šÙõøCȳòQXe.¡øKΕº!÷¾oÓñgíaAf+¬ï^œû²³‡»¯*hÑ(>Ñ;í º˜ú›XÊ2 i?»ã9ÂRϺc;`¬v™0Aç¹|{§{¨PŒà ±òÕޣב‰š–}ß@Š,Té_‡Œ« R¥õZÅ ÍZ•±[ó—fŒrr®*RG {¦˜‹5ª; ”‚&_Ðô&È;Û?.`³âÆà‚OÐ^„jêã »Yàâ3|0ÂVø‚]Md[¥SŒ>‘]ÛÝk$ÖàiíQ4/.ì[Ôµ[Ÿrkù¢¶bßW¾¢eÔ=©·¨¶%ÒÙî-‘YÕf×PŒ…0õ”Ôó`?êš¼ÇÚÊ̜ީc—å~YÕÊDH]5™·ó ÞTYœÈ‘¤Êª3ÉB©o#ô¡ŸN—QyÂä–ÙH]ô„^‰È÷iËøçûÖò[[\ñdÙ”>q…]òPÈ>¤¼ûãÍ÷>U—tDñ‹0%þFM™4€¢KÍ' Ça幃Þ`ø¡t«´û|ÁóýIÍ3_wåó^ãx:|»,°=¨s°ô²Çêîæ^³ÞµE…è]ÓŽ±Éµ ËVÂ3¢Ù'âõhgç¡ÃG‹Ì6LtÈvbõigo¢Uãn¤ œ*ôÞ¤;†ÃȾF¯zâGùç=h­"I×c2±©’…QØ–ÍÂôÈœÇ ŒÙð÷úŠã5îÇàÍçã6£NÛ[L–ÅŽ—:‰—ÞÛÇGoö çkarj.Ÿt"·Ô´MÞœc·qéTZ7†u»|ç³bï2KëêЗ;mËC^’ñúI|Ç>HãU•xÆÒŒ}ÃQÏ%ò󈔗ӾÇʨ-zc%•ßþæËÛ\+”KÍÛKa5í†Å2ý&É·¸Nå#ÌŸ­E<U®B}·­1T÷*/û©—5 >6#†pvŠ›wªÃ5ÃLŸËsúo˜}‹PŸ˜Æêp¶±;Wà5T?ox|ÿýÇâ8…‡» _ºâ#`£³#‡ãï§,õŒÄÂC¶'«GlGüa®Ô]%ô£Ð·²aûñä^ÝøÍ…òä—:Là#& fþé—ûúRcR[– c¾ÝÝÜGLÏ\üu+¬'êÅaø§¦þN„z¦oEk#Ìøz-ên„Ö;ØX ¢€H‰¸µDmú@¾ƒKºÍ¿cŒðÙó3‘¹ú‰(‘Rýç˜"ÒγqööÅKéÕXW$E˯öˈqœÌ‚¡>vÉqr¿ŸöçTX5zSò†FZ}²®ýÚÕ™ø endstream endobj 1015 0 obj << /Length1 1406 /Length2 6162 /Length3 0 /Length 7128 /Filter /FlateDecode >> stream xÚx4\íÚ¶è½F¢×Aôè½÷AÆ c3:ÑkDÑ{DoQDI$z'B|“ä}Ï9ïùÿµ¾oÍZ{ösß×ÝžçºöÌÚì,úFü v[ˆ*ŽâJ”tŒ,„€ PD&`g7†¢`¿íì¦w$—ú„’;„BÛ”A(4PhzÀB"!1)!q)  Jþ D¸K”AžP;€Ž@‡ Ø•®>îPGºÎß·.07@HRRœïw8@ÁâƒàÊâ‚®ÁF0‚òùG ®Ž(”«”  ———È)€pwåæxAQŽCâî ±ü  rü5š;ÀØŠüã0BØ£¼@îÚƒ‚!p$:Änq «Œ4´z®ø°öà¯Í ý+Ý_Ñ¿AῃA`0ÂÅ÷ÂöP §ª-€òFñ@p»_@ ‰@ǃ$ØêŠB ¡°_3 þJƒÞf¸ÂÅG! ~õ§ u‡€Ñûî#ø×á:Ã^p¿¿WöP¸ý¯1ì<\MàP7ˆ†ò_´‰àß6 ”@Üo°£à¯Æ>®ßÎßfô ~®W€=z HÔ‚þ"ðC‚þ#VnHþi½O·ìù¸þ7àŸ¹thæB\ÿ&ú# (Œ¾ýŸéþ;äÿÇò_YþW¢ÿwGª0Øo?×Àÿã¹@a>!ÐÌõ@¡U ƒ@kþßP3Èéê@ì .ÿíÕ@ÐjP€; Í/t_xÿŠT…zCìô¡(°ãÖü±›üÒ ‡è#Ð_Otø_>´ÈÀÎè§MÍß.ZCÿ¬«#ì~‰MXT rwù Ï½ø ¡UiñþMf€ B‡Ð3ìî¿VH h‹Þ#4ÁÑö?&€ ê†AÀ¿ŽñãEÁîîhþfº£¿×¿åxCÀ ³°t˜Óë°ö‹z/þÏ£¸+«Ñ }Q¢(޹~ŽÚxYjSnŠíªî§ëÏ—ELÎúÓóì]Œy?êÎ ^NSÏCa¨ô­+ðç~?îv€0Ù!èÆÅÓ£×Éö I[b[r&›Í^…‹÷ˆl¾úRx݉Ü|(¹ pŸ‘²¤Ñ£ž)ävnc>µ`a[E Y<"#w·Ìð0Ö0¿Æ| ;Wl¥ýî³n—9´´ô.§¿/]ä¨@«·Z¬*‚‚–ÒW“%w8i€–*1G³ ‰Á¡(z¦T–šÀJ[äÁ±ŒõX|ùÇtA[ Gƒƒ®Rð½'#uÑY™Üžå#›lãï‚Dw›“¢ùjÒÙÙ«í0Ά2ö«E`y½ØÔLܺÎ7:Óˆ’Òs mÌÅÆX¼'¡"Ö_&î^<~–•($l•*“øôRQLÆä:lo¶xõ @AÇN¡¯¥Ëâ´ê1|Oàôe´Âœ9~òµù]ûPOä‚m‘j*8Á¼#kûíVb“†èÙ{2S1T­Ö¢Ë†;>7~:Ð0/[¿­SMú¡¼äük¼©I¾1Ùœ±ö&F†îm ©p… iRb ç½2ÆW‹•b#/dBšeR%‚€O>LÜR6؉'­]¿cÐóÇ:ÁÖý@PßZ+¯ó¡ãã]NMÔýhãvÂÕWE‹©àñÙå<ÅŸ&6¥OåÙ?ûwºyÒ°Ÿg®PõÒ5¸nór„±ãaCÆ›‰ÞÎÔMoõ†Ë3ì Û!5©Ö°"XEc¼h«ÒR?U´‰e?H»ý¤ß½gľñä;¡å¹ôý`Wë¯ ºû®?ÊÝ•ä$œóá’"ëU:A’~Ø„Q¦ÊD§äD ‰†áY¸†£}#ÁLNk‘º`Û’íis YÝ¥šëÁY/ÃEk-ƒ æ€/ø«(DU⇧¾ÈÇO‚æzbï|]µ{O¶7­ÌÜè•CtZp£,G4“XÄÏŒ˜ë«h_ ¯Û·Ü©j)C¨§úÑxOÑRnqvµ{Ðú·!ˆ.Î.Ít™ ³TRŽŠw3[â§1O~p¤¬gÀ˜Uo¨j“a: ½bR͵=,®à„)]XŠ‹>ôpá‡1xÚÏ ByíÇïæèlï2לÃäÀ<ËQ¬{UÖ†•_¬Ê]"6HßCK´Êõ§âX4îľž~ýcóî©!ÙOÔ´™tf×ÈaÆ€‡<×½rÏH Åô“9~þë§§ ‘Ϫ¥0¬ÔÎc oìJz¼Â)T’º™BiOÕštË¢éòÄO"¥Ö!ÊPSD]úÏÖÜ$¹žºf锜Z™á²|aýë%X+¾7¦fÑLîâx*¥Îaç(;ÐOËÛðåPçt8“S?³µ‡m*h\è[c–×ez-dQÛi ªû:sÏEB½$0Å ï ™èkÔÙûi•"é ÷F-ªÛóww<»ãÇ-ó[~Ì35k³ëåËogª‡F$“?XÖçŒÓ|9ü!Ð3q†¯Ÿ­žÕѤDGî¤n[n5Ù•g6LÜ“xŽF惾2`]$Y¾P7IÔú@$5Úøs„}k€ÎÇ 82´E;¬ž¨(>ýeŠ8üv˜aáe’¡ïKŠãcûo~‘ÖdÊŽOløef®)¦oÍ\¾é_ÈE Ûs*û,¯ÕØ ¼š~%of’H®…Ó‰»q†Ò~¹¥uußYO†f÷g…ü¬ ©ô#ŒoI¡òt™æ‹3æûLbq|7,ËEÜó˦±ù¯Óm!ÖslM±Ÿ¬È$`©ñMÈް°nÁ„µ5kî,ãÏoƒ@Dǘ«•{ u«ÔÁF¬ùÒñ_S¯<¬1Œ¢ D2ÅeÈ>xÂ?d¯ãWeÆ×Ž·³†Ož—QX âŽòøEMöÊçM§ñ>eÈ‚ߺ.ƒÆ\áƒÖë§?Íø•é–…`ì;²#¿—;È`´Ì­êR‡l|®4]Üí•eY|•›á#ÄÜ=²EåÃ’3IÅoô¢<{lJp ¿ÔI&¬±ôwY \Ïow'П·¸‹·wKÕ=LûÚÕ¿á9Ï$éLèCGÝ žäã*M§<8·Hv¢ÝÊ™:0 ³ª\ʶõUS’ceñ‡,y±|­M{6\d¨ÿ•íKS‹ÔMÇ{îÁŽ8•{ó_‹ì8+{?wÑó·4¾Æ¤ï°ÆD.tÑÇΤ!t¯~xE÷¶@›XbüÍÉÂ3ððqÃ8‚r³2&[[½è}«ÖÇ“ãÆ\îŒS<·\Þ¹` ŸÔ¾Ñ¶¢¼ì[6:#±×ùåëð€ä¦¸×ôœ'9ãµge(£ÒÁB;¹¥Zs*l ®P‹Ðð·çκf ovUç|U ¨Kûæ\÷¡oÅp—kqfÜZxžˆ©pu½ãÖ†;Fò æïŠ˜~·SvŸÖàs+UUX¾Ïs ÿäøEOfò}Þ' …yLoSTÀqï_/`%éôoÏ V1Ro£æÃ±®Ô!Y úJõßG)- ¾E=iMìˈÀ)A0òì¦KÆö»Ïh<ÍG8U›ìjQx;å· ÜæÃ½àµª™}}HØ«‘ SÖÞ7xˆ%|Þ¨ÏGœ´up>˜°èXÁ…ðï ^Çæ‰Çò¨ˆÞK·‹<,DÄ¥ùY)•˲ýÄR½íëÀ2ÅóÑŠ1ãóž_÷GðîhÑhâH"¾OËËÀaé™k5qˆÀlLÔó±žíZBmÓè''ïn®.\ˆ(a 1"+vÊÖâÇ me6¯ š  t®oÎú☆ððI˜¢>æ¡ñX S£¯¸¿0çïbŸÙ iå8WTŒÄ8-VàÓþ4åj¯W™Ý¢›â·Aefߨ}æïj¾n™7/¤+èAiøßv¾Àž¾Ýg™|¯1TùžÊû$W×jUžŠÒÓÚå Ï}w½i»1¸8üN!Ù–½d(O5ý޹Ôiç¦ì@{–Ïè²6£=æè3ª^É$P’“4/£U0ò6÷Ä¢B’CoÏV°¹VæÓFNß…‡Ç# Œ‹Ü·á{gãwêfŒÛSÈz3>h­knï}³V†–^[H!<ÿØ,ÜÃrH¹ly韑v÷»¨iضý¤IÌ–›~pÀùÕ”¿ÌMlúÿL¨ž¿~/îWd–äa S\ÀÆçdF^W… ¾¾n§ aQ2¥ÁñìÓ¤ý´ê†ôyÒ@o‚ª¥ôôƒ-ÃÀ‚4”aÎjk ¦+ƒ„Ð‘Ž¶‹X?èdcÖÅõhO3Q/_S»–|cs°¥0(R²f@õ­K‘Éôä Û¤JA+u‚“ ÁS+9@Å×ç~^8Õ6$¢"çEª{Ó]u÷Ÿ+f~ÝÈÞQ(­ _íp{=~0L¼òfyò~^ SdaÂÄžÐ+}û»ïoWóÍõ剬·ã0¼p/,±L\êö|ü‰°½¡öÇ3š“®@ïs5¶›<ú°¢­q€ü–±;#)M¥4Ç;UG3SÀ5µY‰!2w«ºíYhn1ó w” à nzá¾6”hå’_XxšåKnîïÕåÐpIÏ]z)kÎòÎ%r8$?£&6»a2URÿzñ\â½3ÍL"Ο‹]"P ÞVQiGŸ@qÿ>&J·¾èmLø5i³³‚†U$7ÎI`£QÁ—‹´x]È3\ÜÌøŽRë8ÆDÎ+°<ÉÚÝ+ަAÿ+c}…éçL“t»5ä7[ å¼)`⪠ÆùO|8]v2M¾Kº²Øtb–´/žnpëf«Õï¯âdÈcö•޾q²ª'‡‹˜ËjæûÊ-(ïÉè^„ßê°…1>ós£±µà’e]àùú´spÔ¹ÔGä±sñt­¾ÞC¯ìµÖraUDØAŸ@µm÷ÂO%‰j¨¨÷©Wðíj&™•éê¦#*çÌ×™ÍÙ™Íêþv5öؾ9ÿ²š´M Û,Mþhøø‡Èó³tWf˜Aõ‹dƒ/™Ñض«¥T‚®Ç·Ž_0'»uªNJ`ÛüœQ Kê‚oS¼Ç»)pÑŠóãð•~0Ó•‹ìr´n §®ßÎyyÈÉC}ífd| ~„z@?ë|$ˆ/W&ìBË;‹èb4j?DÖyë{ø%R#Û[Çk.ôsŸòò?¯*Ë7yš^«zjr¡ÏÚ¦5Á[Ñ>eÑ §Vp¥žáCíè鳴륜ñ$»É¹,4øba_îI?ž¡Úü¢0¯.UÿêŪ…:£­PrÃZ›ú€_³W耡µÅd-1Á 6ÕÒ÷iêÊ G¦tr®Gx>“é-”úËìª2m!=ýŠ‘¸g gùjZóúŽuOtë-›±5†l¶¢‚”ðŒ©}—§ìooÞ~0–{|ëñ}ô¯²ŠÐ¬&gûõêÛãÃÛ¸$!x‹JƒÈÖt…í @ÇMq‘ç¤[õGž«[]'ZÌürt¦—EäæâŸ•éY}—2£•¦$ódN'ÍÀ1_“Æ SdNº]bN/ ¿ª!-—Çb\¸Ó„¤ÞÁ:3±Úxš$3ióóÎu’hý›˜ ÷ ”¬LuÏz°­Vçk¢T½‚{m>Œ³ñ¢¯8õêøÖ£“óù¼Aí`ÌíÐ|ýdqŠóÌCÍWZËáþâñä3&é&nÖouÒ—RÓz<;†®N•žÔÉui†¶ &©²Š™Ôe7q1Ox?jL‡iY‡¦+&e¶ƒ‘ß–wC½šV«så,#^WbzKOsƒPÛâd¦kÃeu¼•dEM•Uo®ÅcêL!Y¯fËú}6?½MÆ3΋U½RswX3Á}K*:™Ëá_ßЃÿ$uI­|c^"7}‹(¿WÇóó — ª$t}@t8^?ÜͶ³ê3À1»®7ŸHåB,û2®êà¶¡e'ÍDB÷Ó½/ø?9C6ß¶ UQÌ¿‘`&9¤ø<Ë%5‰¯•; X§x˜yŸI+Ê!»¬ïkaOÙ& …|lŽqe `†tÆÊÞ¯åÿØ@+àSÁ»õ#刜ähâ€cŽ ë·’׳%m›¶tžŠ`Þ@•.^9ÂAÑâ(˜ä‰y‹¾ìÜá䶆ꦔ\*e>×ÈDo ÜOì$¬äbYô©BO\6ØÙìÒ¹¨ ¬sؼš3ôõc1u UÏ“’×sº$´vNsÄ"¤‘²„™÷èéÓ&Qœæ©vT’¼*⵺¸ø™v±~}VG±.-Ï#iïô’æ¶ÍÅQÙÑyÒ>µÀŒÀµH;ûÉì…p¥8ù–É’©òVÿ¹¸ªâîø['}ɵ£*Öìn‡dŘç±c} ú{q'ÒŠÖñzeÉ"ß»xïˆÔ…zÀÛ°ØšV4ú‰·nòlôp!?¿'`Î`{³ò8$€_’Ê@ðmÑg:HP®Ü|÷ÀàÖTMÃ-&ÒÇ ,«˜bÛƒ®Û×ßÚ¶*l¶„L^Œ¦õób“î zÊk,Çsj£h5ó–éɲë$j„,#B7Ì{â†FÌ<¢k´]Ÿì=Ò1U¥ŠÞŒñ:k|6“”µO (kN\¼m<AE6VÜ´æ;•G÷ú³–Ô9ÙK˜%È´¤šÖŽqÌÃŒ³ §ªãžGˆŠ;S­üL¾Çˆ§žôƒ¯Ò{ÌÿYôÞ-RÏ} ªE¶¾93ºëXr§å¡ØÄÝp ¾åIG#~³‡äñÄXcšw9›j·dJ7>zé~~^‚•KE³]艮èo„yõÚLD«cX´–E¢'†Y­?O~wpû) ¬µWéç’ve•ù9džÈvVCîÎ( o¯ÇÜÖû~¸ý˜|¿Ä5)ïy¥TCŒF)MëZ KÐ«æ¹ %^ÅÇ!£÷l¯ ~0M*iŸ'6S{gxÝþÔY̮ڼœÃAô„5lC%Yv4¿Qú16I¡çö æÅjcË]ð,®Õ~3†U-Ý„ÎéÙJn˜OÌÊÓ{FÊÃÎ ‘Úã¡ åkc;Öäò—¶¼›ÝzVó°jïOœb^Gëb毕H»”µ˜ôðh»#í³¹佬ì‹M3‡{,·ŸlÇ ©~ÿÆdM¢ âYy{`M/Ûsªš¡Qø–'!ïågãæåËaàÂ¥í½³ì[–Ù¾>ãI3lØ¡ÊÎ3¢év† ;¹úÂåýdp|Ìd»¢6d/«7}ä¿ôÝ´˜¬^âÿ~¥Ð«.=öK;xà£h+^cáðŽo=À‘/‹|¿ŸŠÏo—ý¡ÃccëFÏ(æÖŒÀsN½!*Ù"?€õÏhzÛ_ZϼJ¹Ë=“ÉïפßR£7{)LjXÚSOâýîë6>s”Aþ‰—¢ÃDâZûµÑu[n6ë\9,ÛöàÌWº¥6CÃgæ‘ÊN÷ðV´«{©³a“<®|„ãÍ ‘Ô XïP4ÊèüË[vÆà]®†Ë oÊYï 7xd¨@’D/xß.Ô KqÒáSÖ¶”œf|Ú´2xMwrPc#Ïsê;$ÐÒùâyÒb.­=a Ðò}¤K™¶yµ~N­²…Ç·1ž"“Ñ¡APpSòk‚L?JMÑ™,O6Ë EͽKf%é20k}ªw}:™xŸGÏ÷G«¸ùØ œRaÁqµòq~~œ"~gKf[œ<ÅânfýÙÅ»ƒ->QøÆŠjLª`ŽÜÕHLæ*‘)P¯+xC–“ê/>ŸÓ½¬tØö_WÕ—`J[P{b Äo¿Íq똱³ÝË =ÎòNΤËaÍ4ö÷/ed=ɼ†ˆÅFéKæ{yל¾sÔ*ûã~ì÷£ñîØ¨]åÈ"?~yþPÛS¶'ßCüîô›×ÓO‰±´ˆ_‚æI{i©0b}ÈC°;D«IÇá 7nAk^nmï4x)Å{ÃVùóã3ÖÍ„á/¢9r—ENÖä(ñÁ3«Úž’E?|³™s‡…Acg3¾þõ+U­ÓˆGKB!MS´Ž`™9~_¯@‘‰gKKVXƒÕ$ðD‡®Ý8ÓXžÑ0ûHîG1%R¦¯G Ì º)Yç€û3Ì/)ÈbL#ºmÅ(¿ÇÇ]Klš±tïVå‡áx†WŸ»Ó‡‰…„J†ï9fZ¬ž"/!8 —äk¼™DöKþeÒC×.UñÖ ýÌ…i‹év˜ q†ÎЋæm ‡Â”Ùï¯æÒ¦žc\½¼¤^éYˆ¸í+4ĤÆéŸòÖ>ÔtRYx9i" '6‰õ)ŠK¹üvø¢³Ík3»­gVÓ¥&+õiI®Fi+^˜¥¥Ã›õÒe‘…È'Óz[ Ù€¹W7Ô't(ÍÎmHXXþóØ‘Á¢Ï?£´âJ‹^4Ušn8j:Ò/Ý¥UçJóç)Îû±L˜%g7ȧƒyòŸH¿b8œ»õÎØØ$Ü:J“)Èr¬òÊéûÏÚO=g. ?ÆyîÕŽ ŽÒgfæÄJ‹ÆÄ-ÿhùÓÌ endstream endobj 1017 0 obj << /Length1 1645 /Length2 10655 /Length3 0 /Length 11715 /Filter /FlateDecode >> stream xÚ´T”í6L·tH(Cƒt—t—4R 0Ä 0C§tJ‰t·€4Hww—€€”Ò¾ï{Îñœÿ_ëûÖ¬õÌ}íÞ÷¾öÍ@£¡Í.e 5ÉC!pvn.€ŒšŽ7€‹‹—ƒ‹‹‹A ·ýKŽÅ r†¡‘?,dœA@ø£L4TƒBÊ.ön^·€· €‡‹Kø_†Pg€,Ðl Pã(C! ƒ ÔÑÃlmÌó¯#€Ù‚À-,,Èö—;@Êä ¶Bj@¸ Èá1£Ð  µƒàÿ‚ù¥ î(ÂÉéææÆt€q@­ÅYØn`¸ @ 9»‚,¿[¼:€þi‹ c†ý­Ð†ZÁ݀ΠÀ£Àl‚À]\ – gÀcv€¶’*@ÝùÛXõo6À?—àæàþw¸¼CþrZX@0Ä`¶ÔåU9àîp6bùÛhƒ>ú]`{ ù£Á_¥òRšàc‡ÿô³p;Âa0°ýï9‡y¼f9ˆ¥ ÔÁð~×' vY<Þ»ç?õƒ@Ý ^ÿBV`ˆ¥Õï6,]9u!`'’ì?6"¬ÿȬAp?—ä¹[ØpþN ãáúKÉý[ü؃—#Ô`õØÈlzüÃò‚]A¸³ ÈÇëOÅ#,nn€%Ø0Yƒ!Xÿ‰þ(Yýçï v¼áz¤7€ë÷ïß'ãG†YB!öÿ1ÿkÄœÚÚJrÚ¬ÿ´üo¥´4ÔàÅÎË`çáçpsóð>ÿGþ§Ž?|• VP€ðßå>ÞÓ¿Jvý‡Ìÿ, à¿c½‚>2`þѸø¹,?ÜÿÏtÿËåÿå¿£ü_‰þ¿É»ØÛÿ¥gþÛàÿ£:€í=þ±xd® üq Ô »ù_S}Ðß««²»8ü¯V |Ü)ˆõ#£Ù¹ù8¸øþ–ƒaò`w¥naó7kþ–ëþÞ7{0¤…¿0^\\ÿ£{\2 »ÇWöHÍ¿T Çúï¼r ¨åïeãáX³~Dü/îÇ­´¹ÿEf' t<öè°‚:cý¬° €ø[ô7pZüý®‡ÓòÈ àýò8­ÀhyœÖ@~çŸZ!§ýð1‘Ãà#m9!ÀÇDÐ?àc&Ç? €Óùø˜öpÂÿ€ý¹üËpý>–áöGGy=þ‚ÿuÇ.ÎÎÎ_Ëð8€á¿^7Èd5?µ ²­ jºü"E鯾9ÂÃ÷¤ç8âCCŽÜuK3@æåÕ oNäœTÛÔÈ«UÂ=žÂ‡:»×¤\v&+ÞI‘"¤óÕM¨VæëlÞc„b×{0Už*­­†f¼KkÒƒz­>·SÉI26§£ÍéÔ…—Œõe¥6èLµ?9pF¢"ÑŸ ñâ 5K¥6—IWHMNµ(ÑÃŽ%G~Å=“ß¹JêäáÿÞ³P̆^K¢ÜÝ}â¨ršº+þi»C€BÅl 0ɰÑ!÷ôæsÀiSÐ[fsضhšÒÆØ±âñF”’–u½bï*rw"²ÌêÚÃUL© ws¦ï&¢/Ze ¿FÌ'èäyòò3w””(‰ÉcbwÍaÊÿ ªäÈ PñV­è5Ñ%¤M&å± ¦ÕjhŸxÍr[`F:GƒÙ¤›Ÿ­ûi"¤G¡ÛÎÚ›.ŒÂ+ts›:ñ±hð"ŽnžïÑèåRy Œî)ƒ³H‡n8›˜8úc9÷*öÉ{;-¯3¡3Ü'=]úƒ‘¦ a]3Xáé@WUZG ²öõGö‚§ÙÖ[µ¡>ðãÆ5I/rÆ„¢1ƒÉ³4³p%¬@ïÅlÁ8Øjò®aj0Ôø!¨ê%RØSÏÛŠŸà‡”öi‡ú‰ÁÏt+†¬b"°K|F³œ¢L,Ø‚%?'x…U tø¬HD(k·VwU¹žÑÇW‚«hé*Õßae'SgèÍkÆHì!,ocð —|æ(vÉE,1ó!¬tñÍ©lBøþ¼t=ç£ðYëfgݰšX!º‡9áñd_É:…_ã…ç“8u{E?7ÞfMѪPçP.\g'€JIF¯ª^´ljf.þzL,Ú¥ÀG†OLHÎeÈL?²3ýÚ•â…þ;XÔžÊý<¤ Óæõ½®(EG7Zðuï?’—/ºZ’ç–bv«Î^™m~‚„?Y×ͳµd4¬iU›Ò²ü%8©þ3Ð8ú:1cË›”Fí%žÖÙáÏW/þÂjkëc[Û2Vøšî´/ßÅ-¬ø¾²)`à:0[•-Ý\e vÚ?Z€àˆÆp¿®É,LUCøŠ€ãfhùÌ{С™ôƒ–•ž™×›#^ëb?ÚlNáM ‰û蕚0Œ±¶Wð©Æ ±ÙÚS†¸» < ÏØe^y)†=Év™ÑÔ«'–œþH%ÆéÖ']oxÏ{ó_Ý„3¬ÄAFõ™‰ù]”HW'¾Yæ(aæZéi‚—'^£¶ìòòPŸ!™ï¥£êá"ÕŒkûú«Ÿ•Õ<ÙfŒ7»Û±Y} S¢­ZgØÂ‹éN¤·Ùo|ùP­'(HXfC—™@G™„®3:‘ÇAQ•A|n6õUKëŽ7{ÑGÍÂǬãøcLîÝÛ$…¢r#N›qˆ³ñŒ{•0b˜ÌÖ'f¬›þ*c£ ûIoë¹eјޚqYmQŽA¡øá‹‚w±|#)Hƒ6f"Ö”šÖɹ[@tø«Õ}´ tyˆ²/Žè{‹›R ¿{xe …Õråð½óøÍœjóÆV¿Ñ^ÏÛ[ç°_ËxÏ: ØRÜÇOC4{ð¾pòÜ ´Iv’7‹v9M'-õ¤q0Þû r•=«êã¹Þ»¤møWŒi×-Bßq˜¡3Y³ðïˆ} °ÁË0ˆwVh¦IhðWL;wÚ Z¤mWk¬=‹ËV ä£Ÿè%ÃŒ…°³?ghmÕÊjœVéÛTw!Ì 7{Ëã“(Íeµz.VmÿPñ¦•‘ûâæ#ý#µ»9o§Œ«Œ—ÑñÄ5˜OSÄ¥Wå“[ó)+DfÊ×µõ|EH¯ IV±=ñ 6B'7x*´ß¬ €mV¶ŽŽ–“ú’Y¶6Åt8æ‹A$Ðd™pb6ÄÄÛüvÆÂýç=³^ñ߆aRäâàNœ° ÒópÒþBÀ#>±ò+ÈÈ¢f`Ñb0_š·-Ê @¥v8 I©q”Ód—¡~2 û¨R7õ û¶ô¸Æès€˜/Y?ɵ¥8ÁâHôžp£Z˜f%ÚH§Þ´eÕZ"Ærë½ôÖIù•>9c ÒÑAÀ•Ò™cšÔY‘Í‹†"@'›>ê—ÎmÊãsS¼Ü/ºv…ú<3 Œ›Qp»|V½—ôE¦:Öª{sµ.w(§žÂ&Õ“·Ì¢Ÿ³x*–~íž±Ï]ú –’u㟽Þu.-`ÔL˜åzÓ’2.¥fœn5ýú‡D­»ñóHpÃeÒCˆ®øõÁÛì%†ú;æñ6‰òÀ¤aâ'@nUŽj·Ú!00$ø›biÉýÎL»™µz™Õ2 –N\¥œBˆßM((EÉEŽ8*!Oi=ÉŸÔ.Žy_Kã:¦`àÜ@?“õpq¢ºÑÖ}IÜ,g#²gû Œ™*»iA*dGÅq¹oÿ«¼ÏÛÞ›€ §¨Š³är)Y”)‰™GÃø%æäb²bêËÞ¨KævÎU$'aí]*“7û$,À#˜d†´>([O "¸‘ ®ä]HÄÍËϦJ¸ìâÊæO€P-òw-ÿ‚Æð ñÖ±–•iÈwõ`´Õ¹ŸETY´!yƒòf¡È3­¥\[ul­¥À6¥ó0Çj°¶Ä'¿(®JÛÒéøt Žxx¢™¦¬'½–›$…ßò3òíe“6ÕêÒß·ªiŠhŒ6 µí·¸åŸ7rž¸JÚÖ‹<¬šª&H†ä]»u¾š¨G ò‘_²|-ŠÑ3±ïÙûã`„á+P­Ð¢3Óo3{ŸêÈÜü¹Ÿ +IJ Ó·++Í€è üv3TZ,È6±*Þ,”3"„É-j ã³É }¢ìx`ea^jX8´öè&bínB<žý>9K5#ˆèš$u®:ø¢Åú>'% ûî!h·…¦Òºú‰?“U§„S•[c8|6U%Ûpú~qƈ:Ž”Éö’áŽå»Á'6ÏOWÝž‘c­Q¨è?ò˸irz3k¿T…èÓ:ºŒÞâNZÎÜ…+ëη·_ˆ$eB™±MÒêžÀk×´L¸òC"‡Uà„^Ó­xÖÒU7´Ó+²V—4«+bÞ‘±Eš³XÈë"·GqÌ­˜o":} ¢`®Ïmý’âìJ4°­©Ö9ŸV‰¡Íàœ05ÖExžYÛžà¹K‡£sÀF¯W4.L`;¼¿h¸RsúþÿÙƒÿ÷–•ºxÐô ¦ÓPÙ¯ù¤ ;‹‘óµ}¯Ü4Lï­¯WHwªˆøØÛd=ÆÄ®2R6Ûô=xÌüYÂâB{RBBÐ]<îÁË\Ü/Å}ááYÚê}8R®‘‰ñ™+ÓHë 1zv01{Wóo£9ˆHBýÞ•}Fͦ ^‡…U⌌žTJè$©g_põ¯õšµ¯ÁºRQz9¬Ë“±ô}²>±8Mg g·Ûi 1+Uo¼ë/–U(~dš‰œÙy]qÝÎ’’k,áå¾à¿JS+¬1KÖ3“vÔZx_»ËÇÚ¾ã×Ò¾)".ñs¼Ö᜙¯g|ý=ÕŸ·œµ¨Í&©,êV‚}Q4Ež±ÿ¥Ø³¯i²`•tt×4}¼lk!æÙ{xܸR4›6£'ûxÎ×Ep‡5¹J¨8¯`’ÊÉÇÐп¸Ýq¡âaÞŒþTøöÕ÷~ä¨jÆ©rŸ…:º´KX3‚×!b[¡œÞ×52y¯yRý§õIÛhܤRÚõõ3騽”ÔŠ*k¶Ó²"/i—(Ù>) lê ðø«pÖ¬mµª´=_yEŸ85ß1;÷«BUûÕþy±o,á=4t³Bˆ ïþ¹á¸)ëŠ4ÓWe3šHõDgK"Y…i¨©q‹FºR·­Ñ¨–/%Mɪ—˱Öô‚DÕ2¿ð{Âï‘Ô>Ö€{Ãfç*Œ÷ÜÀíÛªƒYçkùjuã™vⱊJ¥ä•iy…éÍ®Á!g.ñ’â!ƒâ(†Uxœ±Ÿ)!mðâ ÿVa¹± B.ô¡ú¾2Õ‡Ñê oBª¦‰Ê&/ŸO X_‰…¾<”\­âQåë1iEn™.€ ™D ­ó·–|ú~žÿÒ£Î}ÏróV§.4‹Ùýæ xe[¿c¹}É´l6ë:÷:}¶)ix¤Þ>ð±ELB~}•&eNKë>ÁÄwõú}¿é¤©©*¸w@4ßx, p\DÈ2Ëˉi¹Tìüyã'Űó³žþŽÏ‚ ]âµ\ÀÚWèϤNû“™#=Q{ZÐíðçBWQå·Jøà+žêŽ…£•ÊàÉp_y`¬ÎM6šT»“r?JùÂä‚2º)'ëy±÷ÖFÏw’3ýN%Ò×ø“‚£º¾Í¥g¦í¨ZL}fÇHKrŸ]{²T{F-P:ͱPP'ôëþ±ó‰ßW3Ö¨!´ã)‚‚¯'}çèBLdE²œÎõ·WžO“L†û$P ¬éÅ—œÑñ¤ö.¥ƒ=µëÁ»K‰Ág¨ºê˜†]™ iÈãŸU{÷¶fÐì5ÊßÔ¢,;JBØ<ü:¨øfH‡aˆ"Ýî¯RjÒÈvU^yè®±0¢‘]àn̵·s€$ÁÐn¢Êêõ¡¼íÙï¸â= !D—lòß 'ÆVЦw&¢¯p=ucQ9—éhYžO?ÀëÑ8Šý‹ÚhFSÀnáîéñäϼüvqf¥K¦úá½>æE®$^ˆî»@hqg¾á+«iUOüFߊܭg¿ÎAêÕP“¿êÚézòá´Á¸ê¢úQ~î…‡ògÍ8ª6 Ddú—¯{›l˜d0ÕŸA#ÇMݧ~¨"•‚¼Ai‹y/8ȵK°&‚ü€8=ßKD +Á²‘8¨2±mØY r7)n.P©ô9V=˜Šóíô»ºrááEîyÕýV”sâÔ¤,r¸HH¯Ðs»†{‰Ð§:I(ûlךù[˜J 7;AUÒr;¨Ê-ŒÎM†æ˜¤_Ôµ{D§|ä…-úè.óK,,É¿Î$µXªöæšsõ|l%ˆLþfÓm8{X©H¬\Ð 1¥PŒ-ÿ~ž|ÝKT† d¯dñÚ@À–:*=“Äø=[Î!ñBŽÅ¡¥°þ0,ª,BèíÎÝáIÒæ¥"šX^4({"Žìþ¡ú†æŠ$;ºç ¶Ú°ÔYÒ”hùÅ\o„®ùÃ:ï“–lNžÅ÷a0¢Â%”sðyÑÇo‘©Ü$ZÝsgæÑ§Ý{Êz©ÞÇÔoS[óQWòÙs¶w¿ÖBfóV²2òʲÁ‘Ë 0æ|aKñ2~^.“ÉFÖ$=¨×OûâU@žáT]o¢u|ù·fÕ·‹ÐÓò4B"d°e‚ÓOXT§ådð;–&(´µG puópÌb£dt1Îù›ÓXßx÷Ywuäy-¼DB&¿JÃJž¬àneqØÁ%[29„ýø¯Ü^vj°Ù-´‘ý¼ï“|xpÊ]tMßYvu–’Ó1° +¶Ÿˆ~Ù=qPL"¯­á•müœMÙá÷€;Ê|ƒ:%ëÕµPAþö©É8ÂFº8®âä®|‹E×Â+Y™Ão3H`êXÜøázPmÂÓÊ0¤ÑrCB!)øxC5Êr ޝӧ2Ï×3ME)6\ž‘qÂM[±›*ËŒÖ3ÓÄSZž¦ÄÝ[»Qš‹{›=ÜR%õËö.je¦Ò¼6<Ç2I›^:¾Ÿ¦9ôã'‡Z˜P8¾k¦^Š<ÿ^Cbû çÌÌü»ã³”ÛˆÀ#^ýmZd(7â§÷r™¸æÁV¸ýF,^f5:V$ˆÝË~ço™íQÒуÓGÃáÒ$ûU»½Ò­/³òÐoí¯¯?Ы%<_| HÀ’F¾ÃyÞ‰×'(q›öù®‘âå³#U— K| ßÌâ‹ê­ÿìÚ¿®G¹r# 4˜tRbw‘—Tõ&¡,oJù$žk¾Ø‘vSˆ+”’yP³£ôv/Öøž;“ùÁn›£~AÔ­ØÈAãg¨g„äîÝ…×Õ“¹ç_ëæÙhj?ü'D“Øý\d=†ÉY\I¥’eʱìP!W'k!®LËžw#Ñd€½ðŽs—“g%·G´EP™ÛˆrZ#4µ}¯Ù£±Oà ¬F^5؈ˆÎAÊy£Ÿ7Óâ'¨SÈ˜×Øh AÄÁ/³Z©t*ßóÇ´1“O`UzŸ+Ì`‘r ‚B1ëÌHZí6t¯®Üs=pB0qGJÇSçf[h·Ï´*QÊùöÍ 5ãULš?{Ï)›j§öªœï6ˆSq)ö­Ðë\K"Üü’Š:jPa£G ¶»ú<]ú“PEP¸Œí Ž]³š­ y” æ¢T}ÈÕÄÚY­:#3ôÊVO°n“pMÓ¹7ÐK<€"¥ƒ¢ÄçŽc#*]¼¹‚µj^tñÚûS%‰‡#NRëÖc—iäóÑs€#ËÖ»:–«x™ð’÷b ?XØ@oc2³M{ÞÈ(–®x¯à×¶ýªÈƒ7z0ÌI!ªàëk~“CAT¼"h¼™'¥ÙÐ é¯5Ó|§”ÓvØ!Bõ´6ÆC%¯©;+â_¤>ÑÆÆÅ 2‰Cab¸×óB/)9^0ˆŒ3Ô3ÂË?ItÐå™¶1*M,{Þ”w¯PÐÍ_/^˜+Eí)T­ˆCƒž¢å¤ŒTd}¼’¤ÀQ0~†CSñmwéÌi$ì\úz4›Ê‰&6M˜Ü®LÝÍ{pÆÍn éJôë¥ìiØË÷º9Ññ§¼’ù¸v¼§\TS´=¨p¬ðÊI…7ÙýÌÁBjn9E®YÊ7ÂU îZ ¨Üè(é^àè k4¢ÜbÔR:7U³¿+Œ™ÞnÇÈ« iWð™3‘ÐkgZ·r¸¬£by‡h¨c×\Š6ûF£o1ç¨'Z+”N³ó®;.ÿ&gï{ óêýq@nC˜×X¥®ß=Íf†­öÞ·S—fϨäàvŸ ·F¨fµºÒÖ¿®86›Æ§Íma'æ¾$K'w–Æ6Ý~¼¢µãÃbz˹ñ›•´ŠÖ*)6UÅÑk±ó<¸nþ¶ä0œÄ35’¢©Mµ%«ž?ìÙí@¡Š2a›‰sëÜ샊çʬåݤ >÷Š­†–ÚŠQo>`ǬòBšNïcЇ礤¹£Xc^¯ô~ÍÁZûy­ý4[AÖÜt aƒ°*™Ru ' >üüЂõ¡öÐ'X^ºv¨¥ò"¾ 9.¬[ì Rö O¥?^\$ÕÅ;ó‰LÊøT§$ÙU£¨1A¥v¾§ŸT/¬BÖ)­æÚg·òý•ˌׄ¶sˆûÔÎF[(¼Ð'É‘ìGY•ÑÐ ó)%0~%À¿Ùð:½ó ¾ƒÉhñCc;_–x5½]°æ@egÝAh…ÚH¢Óñ%·i<¨\ôoÙë¦úÚ_ÓÌ#­fÜ"N²'ó#lã&%C 8Ož#Ч†Zµ+½½CϼDMl¯¿c;è~¾º†%ƒH9g¹ÚÒèõxâ)ÒXaHì§¡ò4ˆ8*« íÒõ‰ÜÍ”¶Á4?ƒ;á ¹ï_`áèÎù^ßH‡ÿÔ÷Úh~¶(!¾dšÅ¯ÑM`[²¤Â®~µ…¤p-jõ“Ðô§ n9VŸ¾rO=†Ž®ØƒËI&J‚“"BZó }_b:ëúÊÞ¸®ÎS–ŸLmß`+c¥JZŒNº;ÚLvðͳ+- )«˜‹Tm–û )k,å_Õ~²Çn°˜¹‚‡–õ¸óXEæŠ÷E®Û…tKŸÌ¨ç>QHè·—O®&’æÆÚÆ[Ðè—ç1d¡âðIhõÉNoÛTWk¼K»éžwÊa ݸ#ΑL @亮Ý%êí!*,VBÛiý– TѰbsµ”}SE6¢0:kÔþÊ:a;5R9ÊÊ^ª zÅNÿìû1bÙË‹—}§“èb7 dßùSOÕR6œ=ã Íøzrd„'tLX¹QÄBgÂc üËL’ Vp}ȰEDúg&ض~Ü‘ž½½!”kd`yu[W.÷³2vÑe}y³j§Yí£ZiÚŽì­vÒû;éÁþóÅñ(5Ä¢&üüy5ÉÖbôÅéŠx"¢BØÓ}Ãd%{²&ÙžvU]S+ïìT:Ô·"móµJ+Ç$§tÜÑ*%xÅEƒŸ6Üíšœ?H·1 ¢«"ï6½BW·¯·»&IÙïŸrÀÄú)^< -ê £=òÆšÔÉ!´jÚ¬‘ýNÂ#ôZ©~(ˆñyÍù@z&™?+¥‡wLg–ÕHÇtç95â=çJ{%§È›Ì”¾ÿZŸ“ýÍ/Þ@%æÜá¯Úøþçän9tz$ú!†R–Éç¡ù*Â~Z‚©»×V{Œ÷ÕZ³²,2øOD˜­×r&c¯ôûï2.orPlsëvC9èÜvGÃ…!¯¤‡áoì0ÓH{¢>X$ ºn{ùݲÒ4X:áÍþÂÌS¢ÊÔuo²Æœ‘†×n ‚}°Q‚Å|ú†„qÖqè·LAµÜ;oºd°¼òùBó9 •ž‚«®â³dIŽ®ú¾¸²jâ‡\£Â²B,÷+Ño´M*5ŸÉ”LÌaoTÎ5Aœœ=¥¨ø‚Kæ´€î~Îè;aƒDvÃ?»3’aa®¥ ’¿|ÊG·²^ƒ¶‘z¼•?ß!Ã"Ô‚…h‚9–ˆ™Í\ô÷,MS­ :BÒìì_ £†Ë|ZÖ×^2YÊɨšßBY9áSƒK. „ï›fu /Üãáoëm晢zäJ²Æ{èoCVFÎlŠQF$¼-Ð%äáU Ë w‰E2ï{§6zdÌFr³ íç¬ô\8˜”?Våyúµ¼=÷êßÀx—³Gú‚ÊèñµUÃ,YPž|ÝSúªco%t…ÖAr-·Ä–×Ózþ…ØD!4‡#VjtË.ðÙ铉ìô‘jŒ(Ë?ëO…ýçž)çÅT¢äDé| #·²ÄT$³ xVq4žßsÒck¦™"ÊBý9aÈQ»?ëW *Ã+v‹].‘EÈÿ’èæÊER¬¾éÝÀس)¤›°sî]I³éþ{Ý' -^O™0z¶ŽêPS#[º[Ì“'›4›Û•L׎áG§"qÅ~êŽ!ˆgý* ùC…ÔACµ ª‘Ž;º4lü3äwŠqÏÝ3œeWA õ¦ `àÄŒ»á•u¥rèn`IìωÜÇ-ìèê ®^°e^½É‰Ú.Ž»ÿ`Ýd¯îþÈ¢Fê8`áS-*‚ZFÙ0' œ)aÔ£w‡¼NØ žx†°”§!Ê|^q<„âmJdA–6— .bZ*<õþØkGˆ0þª©»_ Îö¼V‰î²JhŸý€ÃY+]Æsüæ³|ò\YaŸp2QÂô¶ù=sÙzà=5!ï?É»–ƒ÷¿=XiðIÀº\˜r¯z‚ÙœÓvC¥žOPã—^PCŠDN{-Ÿ¢Oè~înkÍÈä)œ¤Å¸íèà—‘ñ —gÛãŒ7¬ûªðæÔ°›ŠëoÙŸ3¢$è]™1Å8¡ïžÍËs¼³êòӢʦ~á_î|8 Á5~ò¿«à(XX·h›p¤Ý[( ÈÖôÙU•Ô+Ï]32Á{Ôd- m·ÑÇ1y‡¥½ïêA_êÞ8„F¤ðè¸ æüŠlx#‡¯Ž…¾©Þ'×*ú«[f-½K7õìzÄÓ!ëŒÎP[EÃOP7u.˜e†…GxÀ› ~Aæûž£Q«©0|ã{Ø÷L:îyǘWžú¼²LŽ£ÝëP¯øqËÍ”›~3‚1hØÞ:õã(DÏé ÒN“4t:iè“íš¿¥K¾—ÁrÀZɬ’“äkñüY÷âç^F‡"~€rt½iS.·ÇÕQR^©ŠåÕ1øæ;´}ù þuVÎD[%êJOèÝS1åþ”àT‚À4ú =>amïIÁ!úheµQ¬Fü$ç§>é]O[Ï¥òó—³ÎyÎõX=TíÇãõ tLS>i[x¼¦ÁI™·hÞqÅð` F } ·¼ƒ°œ¶u®DNèÀgVü¹b7>¾u}!xLÉì¶O{ïém!J~ÚÓMõ#êgKCíMF("üt¼ ÷ùÆŽ†gœ¢Û|Ê>zÄó/©Â“~?Îí“gì%_äVMà FÛiùò0F’›?8!×µ¹ƒÅϳˆ“i[º ø›®c4è¤|…ܼ­et²Ÿ¾@&FÍ}§©kÌb±:üE[ŘÀÏhÙ'ë“'· ý¬—ì†1 0»Îv— ´Ê:3^\7¾ÍU4sSlKÕÝF5oÏ.Ï4Neü[NÇy #íÊJò`H¸ÖœÆs-%h-(ÃÛGzh}w+ȽŸd/šC³.N²©ÿYR@ؾŠã»îÕk׌ïã`YÛq‡åÀé%ÙŒŽñKÑZ%¼,ñV¡{ßÜRµ:’Ù½m ´RˆAqê7_’l*ÄѨœ=ªÛ/AF¿~NKâÁíVðãB6eRìÜÊRjT‘}3B½±9 Q¾=‘œrú6–‚‚¹ÿ 9üï|û´Fê— †Ìéùþ€ßµ?òÇ iŽ&ó§ êÖ"ÙSí•êzlîùÎ+ÃKgžšu=Õv”–S­wâC¾¼D ÙT‡¡OøÒwÅ)1€Ž,Ÿƒš,¬ô œìoÐiÞ}¢ô”î`ü4+SànhvûuÆ©û‡›¤Í[áÅSoÏ©žÍ5¢Õ9¾°“W*ÔÕ€þ²“϶Y¤,>ò©¢¥ø™2•¤uÑwÇ~±õäüBc3½uò³“V Øå'í"x›Y3<:fy>cn"ªÐ˜c½¾)xèò‰‰zj=¹48çé7½g;Ê{ø,ðåÆ"÷¤}âÆÆæ!brá”NÆO?Az#7—.»éç¡Æ.Û1µ¬fÁÖï1|l½–Fûû¿r‘j—§>ù`­ D„Û¶Ü3Þ'FŽ/Ÿe4_ìY:;Û+zPühˆUeØÙ½ØÄ=à©ïÓÃÃj °±àP°Ôž—ëœ 3Oú2É$û©˜+@¶WœÙ£éM+šÖUÉŽ.R¹úe|9µås¤ÞŽÀÀ~òi £C™¡R„ZÇkߢêæH‚°Ø’É8IÍêc,î%UâÊúþ¦{¾y­‚¹?ŠÏÓÏ5‡‹5WÆABõØ:ýÚç®û&Áå׸lI©ž¸"ÝFðÕœÕ]ÜXYòØ*¤ñ˜9){UAPÇþgYÅv^qÓ^ر¯sÆŽSûâÏßb'™ë÷ú<ÉÅ%#£$aã× 3kVª™L>¹q.»‹õ€Ñ,”=_9 Ê„±5Ÿ,Ë©“Åë-s_ö‚{nˆÿšµ`‚£õWµV€óê~Ù\-´ö˜¡CÕ>þþ„„ôSuBŒ’êóŒï&×}“ŸŽ\pØÞðEÔ‚ZÕº™H3Èl¼eJã¬å8>jãά Z¶†íK^Žk’2Ÿ˜æðÀ#!‹{;O@[øB¹DÁ¶é“<ÏêXŽP>¾‹Œ—«ÿÇeÖyŸèKÄÔiC"‹`³T×j†ƒ@Èæ¢|àôC¨5٦׃~Š.7‡-GlWµøçN±_¢›\–¥¯™±a47ÝŸ¢ö5—FÛ#…Ó›Md:z”âõ¯륓H ®¦7ú·U)JÑJÕ–îݵÙxc“Ž–-êßöHô;y9õl“¢râ„°v”÷w¼KE¿£;ó;ßs°L ÿ*Œk^Á_óA2é4Óøº¬n)lg~£4ìSGÎ ËËä…ÍP$ejÑF>Œ JÕøèÖTÁ‰‰ ¤§?Jr¡^cŠ'-]O¯[à’ÇÍõ©¹ƒ!¡ß5†ZÐ.'Ç©3טìËØì½ið±¶(%îw¡ÿ,sáqõZ¿G endstream endobj 1019 0 obj << /Length1 2907 /Length2 20879 /Length3 0 /Length 22515 /Filter /FlateDecode >> stream xÚŒ÷PHÛŠ"Á Áwwww î0¸»»»×àwîÁ-Xp„àz&»ûm²ÿ½UçUÃ<¯kw9±’*½°©½1PÂÞÎ…ž™‰ *¯¦ÆÌ`bbe`bb''W³t±þO®tr¶´·ãùCBÔ h䢉¹€åíí2®6fV33'€…‰‰û‚öN<1#7KS€<@ÆÞè O.jïàédináòó¿¯*j377'Ý_êa[ “¥‰‘@ÞÈÅh òhbdPµ7±ºxþÇŸ…‹‹#£»»;ƒ‘­3ƒ½“¹5ÀÝÒÅ t:¹M¿R(ÙÿIž faéü7CÕÞÌÅÝÈ l,M€vÎ W;S ä *-PtÚý-,÷·àŸâ˜˜ÿ5÷ö/C–v)™˜ØÛ:ÙyZÚ™Ì,m€E 9:€‘é/A#g{¾‘›‘¥‘1Hà¯ÐÂÊ#P†ÿäçlâdéàâÌàlió+GÆ_f@e·3µ·µÚ¹8ÃÿŠOÌÒ hª»'ã?͵¶³w·óþ2³´35û•†©«ã{;KGW ´Ø?2 üoš9ÐÀÎÄÄÄÅÊ:€&Œ¿¨y:ÿb2ÿ"ƒrðõv°w˜ÒúZšAÿà½Ü€'W ¯÷ŸŒÿ"xff€©¥‰ ÀhniÿÛ:ˆ 4ûƒúïdéÐa3€é×ß¿ßô@fjogãù[ü¯3Škj*ˆ‰Òþ“ò¿L{€7=€ž…•ÀÎÊ ààæøþ׊’‘å?Qü¡)mgfàþ;XP•þ°Û?@õÏzPþkKÁ4·@Õï1×ebg2}0ÿö¿TþÿÍø/+ÿ¯cþ#’pµ±ù‹Oõ·ÀÿßÈÖÒÆó Ðܺº€v@Þ´ vÿWTø÷âÊM-]mÿ/WÚÅ´ Âvæ6ÿÒÒYÂÒhªdébbñ×lüM~ÿkÏl,í€JöΖ¿N=3Óÿá–ËÄtz8ƒFò/´;ÿõ(ngboúkÉXØ9FNNFžðL Ibagx3ƒ¶Ñèñ×ìì]@*Pv¾3{'ø_-å`0 ÿ"ý8Œ"¿'€Qô7â0ŠýFÜ yûq2%~#f£äoÄ`”úXŒÒ¿È»ìoò.÷¼ËÿF ï ¿Ȼ⿈ ä]é7yWþ@ÞU~#wÕ߈ À¨öbyÿbQÿ@±hüF X4#P,Zÿ"nP,Ú¿HÏè_Ä Ò3²umϯ#ð_PFÎ&––&–N&®¶ÿÒ™Y8þa¸XÚ˜ÿ¥³±ü"ƒÔÒÙúw;~qùmäÉø7i™X;Û9[üaŸíÙé¨:ÆNF&@ ™ËdöÈïò¿V™ÿ&[]þ#ÏÍú/ýÿ(€ eò/b…hbošûcûE±µý]°_ Áø»R¬ ‚˜ÚÛØü3èLdü]Ð 0ÿã”ãßÑt°ükh!lŒþ(5¨Bf¿­€$Ì,Ýþ0û‹mïú§[ˆùo' ¾ù¯{ø§(ßÕfÑÂÓÁh÷‡ˆfùoõÍŽõT¯ßIp€ cóë\øÍU÷Œ@ãoW¬ Ov®¶Æ¿nó?"ÝDŒö¿c™½Uþ`ƒòrøÍ™t=ìþÓn6æ¨ÿm6è–aM:èYð‡(Ç_4Kûß-eÕÑÁÆõ<@O*FÇßyþB®@ç¿Èm³ý"Ú»MWt¥ýMüOt¬ÜÿPÿ33ÈĽbÕçw ì %g ­åÇ“ý— Ðí²ƒŒ8ƒné“åüvŒÕo· ûÑÅ øÇdjêânÿ‡Ȇëï¤@>ÿz9›Ø;ýÙÐ0¸ýA»ÿ±° £@WÏ? ¨©^¿cYò:ýÁnW'PW]þºüA×Îÿð_o9 Ðh¿²hoÂbUòù®VÏ~oŠŽ|O#šÞ{Å©Óõ&•º&;hÓéF8u´u}WœêZh•èÙû¤­&¼=Y¹ãÑçÉ Qev¯~ykhºèD¸aŸ^MhßçÙÑG=в ¼[†<ßÑ• Y©ðíû€¤GÃ`ÅÚDØâžò~ ‡,ÂSÅúØ÷1º¥óäÆ9 ïH ]è `iÐ/©±8÷àáh¿#€¼FŸ˜¥ð9ü ƒ½ä]V³É¿”ËDͶ91Hä3ÞM|Æ£#'ŽÍdã´Â-9AæÛÑÀ¨Ù—½§jè@Sïp‚¼ôŽÖÌÝ]B²P±µd@$î6‰ÖTÞ-FÁÓ{{å͵ÖɵìÉYý´Ž×˜ŽÙüæz‹È†Øs¸£/†<4þÕ>WO‘UV9Yw¿Õô©ÃœÇ¾‡jçP¥øwWdx˜¢Ô Ô·E™Íœä£‰×uoÙtáj¸;ŒÁàt{©uFqV%Þ¯18þØa;+˜ÐNç’}ôrwÇoò´I™.‘f7Fo!²2I<ÓÆüœE—Ì™W´8Z![ÇsG*$³fZ-4Û!q >)~pÛkPQðhŠFjN[ÿpÂßr(põf^;'ÜÈ¿µ%M?Já#JŠ]‹qu—O»~¨è°¨ |0 O|²Xg|Š"?V¡ípáö)æô”wÖf- :UÙäX"O£c—5}‚æ*²å z‘“ |ªsJA­=¯(ñŸŠù¯+vt&ðû“WôjIýÒ'´çzµ—=Çé.cßjPKóZ|ɵ’èóGöᇵéÏ%ÛQª¬§ò|NåÎX6&p©Œù¶ WS$w­Îþ™¹{9,Ÿu\f¾ŒŽ}XýÓ˜-hq•Õjœ½ýB³BAo:TlEP E ÍŠä D% ÊÿQNWîó~ö|¨ü$Æ ú¾ò­XS‘Ëê¼iZ_i>ÿ§¬löÉŸŸýiñš‹¾[qö’ŸX ½¦aí¼A£ÆŸWc›qŒÀ}¿>#qTw›ÐÆœâ">ô¥e£Pi¶0›§ÿc½„¾ŠàúœÔœË¾G¬ýlâÇfs÷Û–ž6Æ’ü¼VÖn¡ÊÝZN¯5#¯ãYfü#êȆ­Œ‹ŸÑâAZ”í#·Çì&þüvV],; Ћ&‡ î̈±Ow‡¬ÆyÒzáÙQ½ž­õ±¢PýÞa²Ô°ªêj'Sž»ú›†Œùcwâ4ĉÏÎcj_RÀªÄz ƒFy4‰õü-‡ Ü;’ _‹ÊßÀÄPîõnYèC÷!ª©ÅKWÚIEm¾5¢uN&]ÆÝöç¢oÜ,î¦Ü,m(Ë"6‘©øßTj1·íßTFæ¿ïžýTÆxªø¥OnHqŠïBõNv‡AôÔrR–»°ÛCjþ­ÛŽøÓ<›‡;aÄ^|þJûSTæÝUn©éŽ ;¥ñ¸ñ†#Ý©€brí!×à6œ‚‚Ý­ö€ä%Œ£ë$aËpÝ¢| D×U¯ùãѼ)#$Œý™Í@çôíö.”±n †ÃÝx<ó÷z_{”Y°SªçÞ¸3Îò»†‚4Äܦq_TôËlt0ô2ý/«¥T«ÌÝnyòàšOËÂV Äêo~[³óQdiœZ®¸ÿ ÷Á.{—æ&Z­ôÚ•xS÷5öÈP"xGF‘¸§òÅk¨`¸ÿ£85×GálCÚ´)ûã•ãØê*¤€`/ Ã}bŸÿ*#šêIÓƒ÷ o`¨\¤ñ-—^"i˜ ó¿´×Ô„(`¿‡d"‰ßâDàVtiÖaõ‰½`wb‚üÙæ0´üò¸Ì³™ª‘Žï(&7Øù9Î{ý̰#yÄÔ=Ïg)IRæÕ‹±%ûPвK›,$r,cY~ªˆ+¶h+.~Hu""¼–sÓ»FÎá+Zÿ­:5ù[ôíCë±uÖàÓ 5û¢'Q;_6íW§‘Zï'ìÞ÷Ú¯Üây‹ó’ÕÛ®‰lÜ«[†ö8Ž]“ŒAEÛ~GÈ;âUC}²Í¸‰–> öhþ`pñ0“4bp×à} Ͱ§ëÃ.‘³¶–mò†á6ƒ57¢·9ò©¤øŒðå²üˆÍÇy²›H‚n7ÒõfSÎ÷§&Gþ“ýÍ0•`”-áv­ (3SÌ1™%_‡*_`ÊV^Õ×ËÓ\¡i¹_WQØ8Ñ¢=%Q¨fû^67‘Ê‘úz¢Hª¼Ævíû R|>™h¿à{‰í µhmtÝo }z|ØÃ3L8 ™ÂL…Ñê =ÿž½ˆy¤Vb.ÒhóæíJ,÷ûg‰c™At½>„U¨1‡)‹˜åÞü©ž¤²aï!¸¦’½ ¾vÉ… 6<@$c?ñÊFóV_?h¼’Oh¦„\¿![çÁ6åvØm”Ð7Í™"\”Q¡çСW£9c#ÎŽõÔ3¤”oz¦‚D¨‚­9“[©$L:d– Fb†CòFx›ö¢YJ‘¤Ò5 >|‚ WÆ"p6Æññ‡ 5Å&£ˆªYð͇dbìv¦ˆ¦ Ôy¾ÁhHM&p¯NæM22ÌßÇ@ ¾Mf«=ËNŽƒg².¶: xmcà \nÎmª@ÍUùоgã’ÿ‡/A“xãxÕ®êØø$CrwMóWjÓG¬è`ÒŸcÒГ¼JzØè£M?Ú°TÀ»_RŸSÛ¥!éRHF³r’ovEò¦§Fž–¸|Ö×$§s¿nœëò¶K!ÂÛ mC›°DlÖxiNAcä3 òlan£µ}ØCÅr!%ìßÂ$o›½M5‰Ríêxeæ'ÁB}c›Ôib§ˆVô¡°!§Š!n×^®E BÆÁpуp–&C†NkèN=øHÈÒ§ÇÐèñ8ñ«mh°H̪Ǫ¦PW`ïö´È¾‡RõU]ϼ[âŠÂúÞŠ¦‡p§‚®7#!]­fíq‘eenœ+•l Ë@Åß»s^™Ï3‘F^äàØ]q%€åÿI@ÿÈ˃nÕ[?iÒDÏ)k‡Ã¾º%¬©íº`äë'©dµuÑçé%@ª"ïŒãN ×=†gk‹H„½œR€7¿YOó'2J€ÄÝ /Íu0ù=M42úCŃ‹©s!V–(¸‚—IsGféc»¤ß¤ÿr_k.pÌM0oZ‰µ«gììEÙ=³7m¤!ÜX‘!ÀöŽþ¢„Ýu“_†Píò¡*Y*œ«Lk»Ë®õíÌ´÷S} Êç»Ø\—×/¾JO§).˜…¥2 ©\K#s*økÛ ØºÞc†®¯:˜xDM¥WäGm¬½ñO¡œ}º NvAa 2DMÇ/ÑÓ—ÏùUÖŸê .»­ºÓ:q«7W÷ia4€¸ 3Îåò êiÑÔwé~önÁTÈüÐRÿ1žÅÕxÚÃÜû mJ*#ÇŒ%øV¾qDð-É`–qé„r/2þyW›™IËÌ\žScg Ÿ¹_ìyZ"»Vì4 êÞ½Sx¡ˆ¢ö)ç­ ÇëuÌ¡cÆËöè kuü ×}óoþ)ÏÑ‹ßQ})ÙlRgRö„îkº ¥7Û8q²¦½ôßxyÒ›:M¾ó@2Ã+èœ z@ç”Ùœ]üq²4×sÛ¨šS¾K™‡‹çåÓvbÜTÚT÷!Ç3Rrp£BûáSœ¦Šý÷ÇB5¢ÃŒ/qjÖ«°syœ±ÉaÜiHäù&  Ó=–v¬¸¤u¡Ò‡Øc-6Pèu“£î¿ÉÏcöÒÕ˜+ÚQraŽ>TTUcãŠÏ‡Qò¼„2cÂwòÇü)q~ilðËæ>ÝpÞ“L¨}ú@¢Œ—âî0e•…™¼`¡É|ÛÀKy]6Õ¨_âˆÂ7MuþÓÿ¡—]²!È…j`4¥€GdgšFkS©FâMhÉQkàæ¤®¸†U ž`ýá /¨Â"xÓœ1㣠Vaölhî=‹à¥¹èw åÀJ Rx_-iY ûÁº®¹[áôs¥ "%kK¾[ 5ð½ä¢¤­Ã—)ň$¥¡L›‰ø5o]&5„IBò‘Õ½|…|ÄzA(¦”4œ×³¹‹ÆÍÆ:¤Õ¯÷b)F Ð{FèNŸÙ–’„pîM»*ÒzSÜjØ1 ŽÛ³Ù˜bf*´-&üJ–¯Î•kš‰\/™ó3¶¶Ñ™k¼âU5rÇzÙR>UªÉ}µuá-Òë‘n˜îÒ‹»q‚ÆÒ½ƒÚžŽ!” ›äëz¼ûŒ]ÀÈmÙeˆ*2Ö}Ôþ°è{o71+x¬ˆ–š9júèUè:_,µ5£ô©ˆ ˆ¼Êi3̬yó¼’Žù— ÍZ—æjáEdïͲ»ó]“à¥ÚüÄÊ2/%åñò4Õ%•=S¢…3ìåxã·V£áå¥ïð™6ß±tÛöóC2nú+ÿ¸jp5»Ú)„ÿA) §ð¦°cGpô­£UÅ jø±¸“̹zÚÜæaôáY‚§ÂŽr ©™QîE['(Ÿ~N§zôŸ’÷ä<á—2N/Í|_©*Í%õûüj<”Ž õdw¾Îã`÷ni=h…Š'“ܵ¦ašµp¦­fnú¢µ%i޳?Œ8`}ʦܡU úp^ûåyÜqKt%-B%R1\á'ÎÓS,wa-Àà¹\Ðp’B¹ƒ:\-Mö'¿É¸Ã›hû4÷b@‘‰ŽèÌZF-/‚¾Ü‚=Öou ñâ²ú'zIlk±ÝhÀ,«âK¥Ël—æQû½bg—ët£) öÿäÅÌSqßl¯bÿ(H’«±çÀ»P-Íñ="E‚R×4êPöþÊÙ—%Ç[Y˜ÚWæØFs+Ó’Õ5FB-Ë‘=ÑØ‡Ðïä!‰ïˆå±‡ÇXØ740/·XNs^‘ãà‘•‡hzþG'Dcwcba;8æ.óip²kIºÔ× yCO_Éã’lì1Aj“¤u¨¯??d¾rnË"s‰ŒuÆÙ€2¬#BØ_Nc5-¸F¸Á˶„¨ N2ióU|¾”×ϵ‡Ø^I7#ª:£ŠH«µÄ,Ì»]¢¯› ˆàT:¬ÝlÈ|ª,oO™.:á•=Àfìw¥”#2ܼ~d _#V~°Å– OËoÓÛ+Õ)kŒ<.0 ûh¶'±à† À;ü¢å÷DE¯ #«S®™¾8eâ9gM©ŠVïCð÷}ñC|Ô™œ×ç#¦/a&«e—Kù*†&M/ð‚µ"ýŒ9Ü”4]†û;E†tù§å¦“ɺ<ÔüO黿֣zâ\o[!Óó– "  KQ¦vŽXX,!Ë\Æá¨u„v}xEK6ÁôŒœ8v4¯‘B4Zé >‹FG)bÝD*ŸFj–ʈÔlZ”Î;þ8zË…HÌ;Êp9=Œ×M3Ð-'ûiøü ˸;¥D^'ÍÈÛØ^6Kzßnö}ˆ}+žû‚9Á%kRïB¬O¢J—# ÚE%åC9Ê>¸êâ½ô¢ºîÌšžå¢šùHt¬ŽÁ¦v“Á©U~õÇ—ö¢š2J.wùrZq·ø¨1’ÈÖ¹Šórÿíd£,Þi-Ä8Ã[ÄÛº©!`ìåùy9‰±ó–¥£Ý®¶ÝAYë~_ pf‚ª¸Î|hÙþ±ó3€ŸìTå¾å5¯éeýÓTM%äŽ ‰UkI ¼BR«¨h¯"ê˜ Ÿ?ÖHƒ° 7÷|¸QÒÜ»oŒ‡ùñލæ _¹};לÿwÅlkyê:[´ …¡ÆÇed.7• ÌÇ Í¾£‹Ãs½&³O5Þß*ùø²ÜNo×[7±&¼¯Âù&Á~|™ù¸Æ=áýõ]S I¶qKsÆX:™çÑLÅbú)@Oãû¾Å/ó7v™ sÑ®ý‰”ŠD’Z4h´EG‡²¢sUàN˜ŽŒâ±Ûƒ¦{Ú¡÷TCêØ§Roé}9#ƒ`燰Vè{³h°[¥E«ã½™GÚ„£Ò7µ¾ÁTã8)&RIÂ"àÚ¥£sìa|Ž/ä¶Üeß4F{V¸­'"¤t—ëCBߣC¯·"I=Ópkð”Ÿ26sËj+ºÇ§ [“‚© Fmþ,©dz6€I‘\®ÔãÑÚH!þ.3ãõ¤(Þ’Ÿ e<-ÿЋ'HÇIvü °øfV¯±à@ÚÆ­ÚSéjåÉ4fN‡2È­ÝkÖý﬘I1÷‡š#MDU®StïœDä…­O2lÖ˜Îm”dN´Y.™ÏáûœÔ!Ô›¶ÑrÊóH»rœÉÔU æ7-aK?'›I"z>¿š"PųživàQj±åÇn‚x8ñk®­pm³Ò!+ˆ›(KÞtc°¶y` àñé8¾«|ó=2çÄ.aC?ù}”'O?MÞ»Ÿ[ƒ(%zxJIk$ñÏì9ú2*~xK,¨O#!of±,ÙÒl8|óKO·¡Ï©â4âLÊÛï° N“ŒH‡n%Ûð¤çŽg7òo1IE¢•ÓŽ¸+†±Ú-~¤½mÿŒá’˜] !ã1”›ú%V*7 ÿÓë ’]n”aÿä‡î>0ò-N¿9˜±cÏÁôïiSºÎ äl&ôjµ¢üç+ŸrÖ¼È/„Ì=e© l5ö¶Šµ‘࡚Þ6)Bnpgz«O/eÑgEòÝ¢ŸÉ( ·n 7Ò× ›°úÊ% 2Í„.|òÆøŒ$ ϰãœýó[ñ»5‹á}ŽÇlá{‚o±)ý?߇?pÆ£õãÝÄЬÑS.\¨*°¦gW jŒ§yŠRKÖ1 óŒä}` ñÿŒºå¸r{¯Å¡æÛ=²mn:Ëøã3Dâ¼Ê§³Á™3XÁË‹î:©m¯>ûש¸ð<„hÝG¤3¼7°m:Õú7¼ÜGønôwûË?vé(á²Ä žÕÙIÓåLCdW4…<è«Õ½ X;xŒÜžv¾AO7 —1%úïß n#tä5*}ÏñæÛ¤öë¤îß ˆ==~’ä²ß;µ×~«ËP_ÏÁàU,ë5âYm+Á»uÊMÛŒ‚!Ç”oŽÐW:^ÌÃ’Üò©a2Hî«RkŒ•îâ>G¶IœÍî^­r;"÷YÊú˜F’x¤4E‚l@_Xå¤ÿŠ×²5}GN8LRC°œÎ˜¼ ‚¥YAsÀ¾±PP%ìÊ)±T),=¥+ƒj^÷,Ùew?Õ”n›Ól®9·Ì©)§Ë }—ÿÈ'e‚Él-^ýÒ Ü\´p¿ ‹S>MÖˆtµT*‚ئ}ôä îUʦÖ8›/pK)© ä¸dLÿ÷DCêj6ÙŸtÅíXì¦+Õ 3mF‰䘵‘²|hghŠƒ8áÖû¡…½«2Ša®™(˜K«í_ôU¯¿ˆÜ d-ÐÞ¦%ívªÕÊåëËŒÚ.»y\RYþH*Œ˜¼N_¯²£ÝA>&§…‚å˜ÄzŸ{°4-ì7N¤Žÿħ܅[JÏ¢n©ÞøNQD=£CsÛö)Ô¿>_±#îs ÷”ý"íÍ“ƒšEý–ŸéTI¿D~l°ŽiZ®BÂ,ñ ð”Y]ÞOâñÐmyðMè7*³õšÒ˜Š™¦`ÂõRªX¶øY=; t0ÄÇ@%Ì7Uø³¦âè”ðȸ½P&3?PÇëÀU¦ÇÑ’ŠyÑ [ëWƒ¡“r¥ÞhCé$M‹û-}ã[¾Òr‡$õl@Ü,ó{ØF£äUÀ©9BáÿI?\•ÄôAÒ΃–~¼%åVO£ =ïý>åû¤ú¸('¬~ÿB_.MüÈõ£!Õìå-OÌ;ÒÎ(o¿cEåZ‹ÕÀI 9Áž)Ò Ø`ø ocÔW›äÀrM&è*cÆnyÐ슳0 ¼Z+£NÞO=jÃH ;´†}³•Ôø¸:+jÒ|¹_Ä­pÀ:°iÚƒFðNñPÊŠÐ÷r3‰¨2ŠGæ{Yþó=&út™¡+ü§›ËÚd^Y½m* âG>UÒ5ù’eÇ€,CË™¬ñ}u‡ÌNˆÓ3®«o æ$ñðã¢õ&Ž8J9â<<+ñ+L÷áÄŽÆl‘wøÅKÛÏ)C²>6Zj³ò•Ô£*i >¡)ò%‚yçŠ:žw|Û9mM<ÊPãš•~®v}úú*óU=ò-kàG€ßQŠå±òNx_ˆ2µÕ—ÓÙ{‰²¥f7â•é„‘iô+s¿Þ;·8oᵉ£oñpÕ¬ÈÔ­Aú³›Zuƒœn½ ã4šÑ (q˜‡D#:¦ÞÈ ŒfQOœóš)KŸ¯1OD"§À¨Mœ.e:w¡((*œS·†F|qÉélÂ/£dU¯Ë'}'ŠÏÒø`WÏyw–‚,øN£à“³n-˜>_aûc£³›-®Fð9Û³¹„üía+ZÕ»èBQîξú|[¨²/^¦G¤[¾”!ÆLÒ¢BÌRê9\ç­õ²„uÚ…ñ2à¤õ5µÙÁÑ^:"[[§æ7M>U]\Αf<>μà-ˆЗd•ª¹ð‹é€uQë­3æScRjî3¾¹Óâv½Y'ªMgáÅKù¨í,ejVr‰Jâ|¡1°¤œÐ€Ûük…ðbj[}øÙ#‹ÈöŠ ­–uD Eçû׈ýºÐçÚU±b#…½¤.ü»÷`7L(þÃØìÍB1E¸îò):’ø?Äü<9Rºoc&X…öŠ™xoÝúα{B¹Ñt!ŽëBi#k`Ý•‹&Lvð>¸øK0h1Àf艒²údƒÍ{’RX‹ï…~Ë’+0¶üTɱœbA£'¨…²cp:mJ*–]’”ùp$/öi¾ýÞ»LºÛ×u¢×¼›mˆ“ð(0KR¦½TÃUx¨;6‡û|¦:©æ»NT»V5¹õV®Mù§,œƒ¢I„CÔzrÜñžç³ðD›/·… dâ‘ùé.†DF'£06ÖÈe äDNñ é^¬Owå:å{í×ùþªbû;¬9…ÒL¼o ª¤¡§…¯IzuŽ)¦-šÌe3 ÁùDƒšÛ™-ÝT¯ÚÔ¾¶“žoûé=v›´òöjPw•ùëv0â;6(ÀÒ-„ щb¹œÔ ¾‰Ž«(nc)UõèzH %µ,5AqT ¡dßT Š› Ìh¯hçZÑ–‹2eUu€q‹®ÖAïÓr“ÏÉEý4ÂÆS„8Ù…~õwØ®óË¡®:›ž+•¯xÛÿí> ŸÐ]œJÀÏ Zú Œú¥nï]èØX­îji÷Í úÏ5Ç ÷£i[TäEzny¥¨‘q¯1bzbH¿Òìµ£28£r¥)@,‘!yjy1WkJû|íñç¼ß:)»ÓÚ0T{([§^6¼~˜þfï~ÍYüõ#ƒÍ¹™“Swm¼{ÞI ÷ž£né9‘ÉÆM#}:\z mÓ¸äèÈfl)tWÕ¥ÛAãm½™VXÖ=WõÑý³D¨Oyº‰SBÌh5°æ‘-ùÅŽàýlsÚÙÎWÅwá$Ê{Éšö­`н¾s\ÔÑ5¨x[ÖÖΤE|ü¥Ú÷:ËwZºíòÙõQ½?ýº—›¹ns$w¦¥s}?“~žôñÿÐ|«׃ *C¬Rí§:ÜÔ!ýS³¡XMŽ»U¶ÚÆödõ½Ú¢Œ‡ÛY‹Hm¢*©Æ—« G Hß(uT1z¬ŽUv¥ ¦^¿b꟫ößI„Šî)O‡gL©fáSgûeÓºqmk”Ì^QÔåƒ(Ä'Ç4OÎ2ÜmåÙ=‹2clÅ=r®húFÉÀ‹úIÙ\ž _±ùÓ±ÄËw&…P©â†´O…J=ޱÐW\Ëq¾ã±Ù†bëõLrî‘R¥¥ÕbHSÁß!è³$“žs¸ÜT.†Bà‰@Ù’y‚CœªÎ)iÞ¤Sæ)ZŒ”9ƒÀ;É«,õ3vf8½ª@{æíO·þ‘¥omxÊÿ5“žë1ò3TbØ•ô›÷û¶õ4€ùl`fŒ’Ôâè£òV+—Áto6—BƒmFr´îaМ&©Å&ø£Ši5 ޾ûÈçd3¥•»˜Ça„Ÿ‹Ã"“xÝ—"‚ÚmO õÀ€ïºÖs›Å…&´ÕÌÄïHœsàŽ#l|”"‡_b0˜±èR<ˆ—ÆÊ(ñoaàdÚ]áê³a½åÅBŸ/ªÞšž¯Íó‹bsßÄFn£¹[ιǂz["úb\¹o$…j^çÂÏèq©|vÞÁßx)·S ´ &™{b"vØ@Ü?$Òg2”ߎ Ñ'‡÷£Î|>ÔÞ×.´[Iñ,kÄšVãr4†ÀÀíÚŠ7¯ü„ï¸D̬š1Wxà*Í Ï ž¶nNšñ@2v6íÇÏ“ñÖ‹óý7®¡e³«Xª×:‡œ;öåÅéP>9|™s]<>”¼s+âTÎuŠèc´‰NVpø/¹r¦±vÍB«tËU;ãigE"–¥€ò®/&-(Ò}Iö¨-Ã?úìð8Õ ñÝùLkqnîÔB\$ýìò$u¾)¿2­°{9»û®´`2 ^àÑÈw0ÑÏJÿ ÎÜ.¯€CÍæžÞÔÕ°ã„§óìªéTõ}.wsËï2ë_Ï &™ŽÒi„²³È%IuMÞjè#úÐ;zÊ-žs… ø(IEIÝg( ýÑd%0…ðÝû!%J¥em®«Û`Ó Dó "6•:¿Ï~ý ’ÌÞÈÍç¼]n¥ò«µÏÅ–…{¡ÖëÁÕyV‹HcZðŠ«hñÓÖ¢Äpñ†ÀŸnQÐrÕZU~r|ØÃš·åe6w¸tpÛbû•ÿÓn§ϰ°†Ù.¸@ÚêËÄÓ…¾üYïnv}§å¯¼Êë8ýÄKÜqç}Ï`¡ÒiÔ—41@´‡¢H35 Wéc›lö¾Ž°—2sþyµ¤ûõÏP#þmÓu]9ÔHíy-÷íu\×sÿxØïTµÀ¶Gè¡Rô»¨aÇÆêá P»h¡ ÍQÀx # ìšåëw©ûÚ/ýAa7N.2ö^ôç)mŒ§³Tšà1«ñ¢˜!uymrq…{gþ""‹…‰`ÌlŸNõÜa ¿l/‰Š"ÖZÊñ$‹?17·°’²â5Bx'â4*½,õÐ[€Ïp¬xצ²€è»Ú•^ÿöxK´š ß2LuY…lqNÞ6¼:xHòÌ…b«ùÉ‘ƒxD+Zk.¾pH¤Ë·î3‚°šx¢Ã†‚Æ ’2x<ÓdOÑÏAKí§Š°¯i·(#Tn+pÔN?ÛÀËYhXËwd»%"–¬i÷m…Ó/†]dÁÜŽXqR4°æ(ݤ-‡ ”9Kµçk…q¦KêFËð~†•5Ažf›~†¸ÖW¶Mn` W¨bÔÄËŽi=ÝãØñö ÔHˆ?Éò*ÁDƇÎùo× k›ŒÅÑLùrñÁâJ)µZíû”¾æ/ Ó’ò gz6ˆVêN ¾yŠëÛ_eÇ}Ș{˜s8‹«Ø_ëØCnñJ>‡½&M#ì¼f_(OÄü¾;fó=¡Éyë½ç—×#Zâ6SG”<Û¡¬°cZÇZÝ3QEÍG4½0›(ú›NZ“Q!u½%®¬ºåf¼'›+Æ£Ž«ÓÔ(¾p_9ʦŸÔûmÍ•e‚ «3Èêpšè-¯¶‹zÂ!€Ð@‡ëê(nÆúTú§ÆŠ”NŠz¤/K1"CÖ*"ºPx@4¦´º½°äè¸>™ÈHR¹í$Lxè"N:$¥ôömõØþ5'ƒ½: e0Iš°=1ޮ̫Xl—IBˆ#Ãÿ¡Î<Òq‘Ã`l¿vüõ*ìåÛ5öÔ=÷„¹Âhûw»U>ce¬ùÔó}°p ã#qq.õJº4 ¬#Àüó–û`åúFsN(ÂCãLÄEÀq:Q–=%`ÑÅ¢X CŸ·­ÿŠíT„ÎÃkÚB§;+.,Øç¦Ñ•, pè_ˆÒž•2]ªÕ®B¥©&A§"ß·0H0}HE¹§ý±óýÕIñ†ø•Y^AÀ@ûq-ÆX‘sc±–!ùD «ïž^€Ã 5¸#T-©cz_þc!_rßsr‹ Ì8œÑa¯ÄI6JpœJŒü¥Òn 9j‡R‚dŸ`=ivU·N=¸’Ý;E¸˜£à9ô‚!¼©I¥À\º4‚´Ó½QL`…ÏÀj› TT”1]WÁ¢·ÄG˜¢çULÛ¸hi´è·äܤ">ÙÕoÈ…F¤.½ýe‹L7R•nDiäKíšþßsm®Ýêj˜Î´ÔÖˆ¦ƒS@?dÅÛ¶TÊŠîCÔ ‡!¡a­Q>Q=x›•Q®»1ÔùÏ¡¨Áb{ÛƒƒavË–<ðÎái(øl{æ¤ð`²¶Nu`Ùv—l=·ô¢8z8¦e‰¢Œ}œþy¢O{ï×åt¬¯ct¦¸© ’IÝ`öV}ÀìÄÁˆb¨9KÖ¹¡Á¯úíkƾͻ;¯»°ç ø‡Ñè±?QÚÊ…à8Ä•M°Ž(Þ¼¤Ã-È ¤Ó·ñDâ¿·ý0lG¨6àT–ʉãàk37(åõÀˆ}b@fT¡ê?¼ú©ð5yNÛµ¤BoΉòåâyØM}ÖØ:Ä„جžf}RјbbÞòê¥i4°Ñ¢r—0ç½8>ûÙ¸û¤}1ŒÂ÷¡T5ù{~NÌœ³.ñ ¯±†Ño§ª‰>îH¹¢… …õ'¾—ávµú)A …~Q‘ýçJ¨…ðšý:¹sŽ!Ùètxz‹Z­IÙ(Þ†I‰îKh¶…3m¸àÅt·«k_^Gh¾2–ÆV=ô”·¯WCöù§å¥YÁŠ9¶¶Ú‰ð;퓽8_¹EQ,Ë3Í ›…tf½Úìoø‚‡Ô›&r¥™>ªk(×´Q˜ ÝÚSn ØëÝ=Öв'õØq‹{†ì`Xg¹,ꛉê>hgÉÐÅžämã=IÇ‘]åïx ÖÖÚøm~?›ÔªÒœö%d”,¾4™Ñ×QŨ† Y +µ}aS}G¥5zç[eþ%\½BÁ†G!5n¶Cê.:ù›x¨ø.pœÏP¾„<†öÃÖÑ.¯ûy9A –bçå–Jç:3T"¢VЈ™Ð(4]'K?å‚PÄNkÅ2vÝU*s"c?qHŸË;¿íì¢gP…0HÆÂIªX_I+…Χt\x œJéò‹tЬR3ˆ9vÞwHªÖeråàÈ„$pé|Î|/˾†@à‰vÒ*®.9ÍË î©óÊ%„üI˜q6™¼«ºÜe—ÊGï:O2úMgžÄfïðŠ[?JƒÇÈPÌIRéý”ÙIz¶Hªu}9ÙjÖà©{>@%äÖ„TMÆ ‚Âü²k±ã™¨2Ë¥òLÚ"OµÄdX…µ)XtH;ªz2YWi°Ìƒ®å3¼hÛNŨ€÷E{¤B9ðý½3› tC2ïj¶e¥†Wˆ2‡Ü×í§…Lu.p†­½çk«ëb{¹ÜtTÆ©ð !~P¾Þ¥–°:´9×^ÑäÂtùŠ®e7Q2Ø^äÝPßó›˜ï.>™Ìô›žýл y.ˆ>] ‘Ü饆?ôhû좲®}]ã~_Y,žyżV) è㎡4αaÿ-eM.œpØò!è3F­•TsùÖ‡‹ævauÎÅ‘=Ë‚ï §™ Ž6Ôf60¬“O›jÊ:|-AzN#5اçu¥8Ja(®–ÜägÖÆyX"¶Ÿ;[è…0e¢}K²Cz¿Ž¾;P8µÀÃé&äãºL÷Õ‹ÙÏÌpOµ!ôx„Þ±ícší“k.È¢‘ÁfÀz2¨P†|{–ú~”<>úÅ„VÞ+.¢bÝ*oú¨F.csCH¦2˜~ª'|óèŽcú&ý.": RÝ¥f(X;¾³´°:pÁ±f Á?tµêõkq°T÷Ä„†aÌ.['7‡–ÙãÁ¬j¼j޳$¦ºú÷ôCê°hÜ}j9š:[ë•+1i7Ÿ……ïé›\{;¦ßNÙ$œL‹Ä Qí[ëiÈìÍë:%ºàÙp(%*áU‚óÿiŒ19ëêçZh6z~8±ðÝ}¿r!¿—à×µºú®Û8-È©j¦áˆk³Šƒ— n;åÕK„Ñ£mÌ#Š€j„èæŒ×ªÚ …¢Œàíã˜>¼eŽš^§T*ª5ÎÝE¤0ÓH—¨Üßà"õ)$FÎÿÁŒ(Íy‹Å˜O¸Ï9}гêݪOoãp&sä2úïmÝ& PßsÔ7ÛôÌæüv: 9>¾{—Nñá¶Ö†ÇHʹ5eLtÛ8,Ñú£ê Ùøó­H U™³ªn|¨­ÌùỘ½‘6÷õÛázïjê°]F(À]Ÿ2cuü›g½†@ BaE²¾O2MîmY†VX|Ûë+ak€ñ·ß=¹úü¨¸çÙDíI™æïuÓ$Û;⵿Œ7‘îV2tVrôÚ/#Ò.wŸ™‚14w¼ì‘r¯—ÇáçÊá#×B’ûDÙò6øÈBêíq„&ß"¬|ÏjPäÙAï*Ǿï]{+¡:[ÊI¨õžñNCNH¬Ôƒƒl1–j!Z¿éîFé\0²ºâ-çyßÍ‹Áò›ø^´0¤Íüç¼Ò•\#´~¾VsCL~×°à…ÁO}òÎ7FG{¡ü3P¡oØdŸ ²QC`Ó|™—¿cªDÕO-O¯UWçM3ñÊ<00cݺ£0³×Îh“xDùÓ>ÐE½CbL¹¼Ëõp>–ì±Ç.>— ¿+‹Gh;†^hvîxXM»u 0 !Öáƒ_cmâ9™¹!. º6ÔLª4ù¨I<Žyþ%(7Ù¯‹ª÷šÀm’ZÝȃ-SÌ×å¡¥ºûÐëRTËæA <ž@çt—%˜ªŸKzÝ»0ÿÌ{rì‹ Úö3†ãM¯•ÓùÛ·Ë”hi {‡·ºˆzâu@†ˆCè¨&íJÕ"u™ì%ΨÛêì‰XÕ_=霽ón(NC°‰šòk‘<Ê,úƾ?¾¿²ÁÓùO’oý$5Á´{Uæ$ß„!?Ït Ýíkv\Z”­jäï ‘”goDNa…M“‹ŒŸ1cÖc¾1')$Ú 2Ší"”6–òH1Úu—š‚-3Õ•âvØyû~S7¾¼ÈE±«žÄ–)mŽa81‡pz?Žj¾ÿSQ5!Ó¦—Xÿ\ùè} ö¦¥ÿ·ê.O³ŽÉSžèë*{¡ ßk”†id¥Ío~oÕ—0 M¥ —õ€yôÜMˆôÐÉ0Àôô+âô«ýªÜ}¤¼†÷]* eŒCè„^d²çþõŠ Š‹8‘ N]Ÿ$kcVÀq­ârĪø¼M²xS$j“.l±#ŠEÝ5j%@¬'ôÝ}ÔãÉç¦Q‰†(·3Ù6­õBx”‡P®Éö^ŠVÌkp&ðÔá3ÌžÐÓ%°ÎíÍÉБ\ßùL2Li]s›šöwì°Z÷ÂÐîða!âdÄ€·+Ùò]å\µ^HßP¡W¤…~†”£@˜“Ýó*³¶¢d_kV ~jŠu0$ˆ*ÑýµÖ<'Œ¶ÓkÐÌAÎ$e &¡p¦«° zí+[Ç¡’ ¿wyÔ.Zñ j· î"ÕYéºL™€ƒU<Ü,Ib[š$²e uÙ>U8s´¢|Ñ¥v€SÍûºLõu¯RËý9•Åÿ(ª÷C÷Vâù¬÷¸%“‰ü§Ð‘…ûaEö¹}·o7ëFøXƒv>Yãl\òy l]ÀÍÔµä]C†|‰èCŽÖ#»Å2^½:PùŒ9<# f78k¯£Œ¼Á{eÕ׿º×·<ŸÞ¤PÛì†)øvžý#“ÉòžOZ§!¹}µh:f¢<>Ó·.xRÜéÀ–~ /0¹^'èÁ ¡$.÷UîRØÝH†4pÀ?@ÚJ×·Ïì©ñu‹þ`QÙ_ÍžŽ) Û¢†„‹•¥ÂLgRNÑU¥ûãPàùÓ;廳×ä9]Sp/_ ýyÁ0×2“ºçË£s‡U¿ƒgâpÔF<»’U8µ€XTc¸liláŠÞ‹v£äœwÌA3Yd½ä£“€&gµï«]f|Ïàü…Ó<¯Öþ1Ž9i’BÆ“e6uüM*žá/9Ç 7dX9ñfwÏa©Í·| F>É”Ï[P¡\÷kOíÛõ]=ãK&©órÍv€cŸ„ˆ©ÃTŸ¡l†ÅC{4 ÔÔië=rÝÂQŒï¾;$‹p£.eжùý7àßÃÓ3ýðCJÍ%5(=%¶ Ä 9 ‚Ä=˜¢ucUiéÏpdõ2":ÉwcQOQJà{ÚÛˆÔ»VÓï© F`*‹ý¹µfì[Ø÷ne™%ÖÖ"½çm÷Rž—ìãî—ë&߆<ÎI3å÷† :>gDoÿÿ èêœQ'IÒé éðòhùæ ú™îãè ¥ÚΈæœ<›²%Ç''`tá* ® #‹où0ÑàUo5›`‰H`Ð{uÞîkBr´{ùÀ“ƒ;åàvéñÝiysú”|à³ÛËfÏT}ø˜2ë§ôÞ–G"t†ôI*P^½#ö]ð‚Sb‰:[Ñ'”­sîÛçˆC0—´ ÞYiߨԳ—ãÀ"Žœwã{Œñöê®/špjZ³©@…÷4¥ËÈm_Ê)žõZ+›°ÍX"[½ 'ÌÜac0Ú¼f@»º¬ºš™@ŽùLF"٥ɬü¨5]7Yz¯¢ª§ô’wO¥ƒsl†¾ÿ¡ÇÊ>¹œ}8ö ðZ£’8–)ÆöJùÞpÝ=ÿ÷NVri*‹¦_ “Ägã}Ô‰øM 6ë"¯—éfPe»ÌÉ…8ß‹`^p2W€©nö?<GAíé2xº´hT@ÓÝ™è¹~0”éú#¿E,“"ó’SH#„Ñs`Î?Z^BŽlÆS‹ z×fM~Utæ¿ìU0—l7x-¬xlî_¥~«‘¦\1o©3€¨ÆNˆúÄ^øáyÔÎO³–œ‚ïm˜ð@%EéW܃أŸ°lÉó*xð}í©²Ý…×êq[¶éͤÕÑæ½åüó˜ÞMÞb_‚ë®-|˜Íõißæ¶ê‚É­×NQKt¦ž¬"ðhÍö=o.áB[K釃xÄ71hɻɷ„‰”7lŸ /Á¹õÌ;V'7ÖØ“²N_r1"Û!Öd§M#þ‰ºR½šÀS JÁ°êÚú°^58uŠfÕIp:À ÌYI9ƒÉ²^A›?àê>á噯¢ÂIß»B–b‘b!ÑïžW¢ñdv“`¥þ ž–e zOÐg™X{L.ÐäMw˜Œ©îÄ´À 1S›ŸÔ°ôö-èMù,†ahq¥³`ø›eHWô¶kåÿnÓeGÀóÈî›;êèL}ca" Èö7“¸*¸–q>áz¼ÙŽÔÇè;%½¿ÁÕßT6ù¢phþ}Rá‘`K4ŽEp+ñ&–ÞRY–g]I£î’ð‘ëú©ÚI•A™àê‹Äolæ@ä̃„}€,: ã=·( ó`ØaÁþîfšædä­/&P\CXgJQ樂&²”̯´àpyþáE¹Ï4J(ÌCû° EÉÿ§òÁxÀYFCßÚ­ÉØÙ¤?wõ ­‚b` ëÞ½‘ŒFÖqñœú›p¡b‘SÞ×L›ï=nQÐhíýNŽí4¿lbõ®ùß(w7õÈ^Ió"8yiÎf\ú^PC 5Oø¾ !¥iÞü‰„üN?ÍcýãšSÊ?+wÜ'¥0ã~ç€0ÕÒÆcq0]χ—ÖÁ:Üû†¸wJ}N¨À!Ÿ[zœ9ŠoRç3{qElé÷‰Å@_G+ž[Ë·qÊÃ}é!…Þ†×=m$‡l~öciü“á(ƒ’z‰úç‰OSÞÇåº.-‹†IÚeõHÆíþퟘým•JýKoŠÏÜ'ÏïÒÄõt‰\&Ú„—õ1ä7y %®W’–qE–"Ê¡–‡ÙCá@·³9a4xËfMQ)‹Ç¸˜YkçËjåÿ›…æ;ì†+8bÅ8/9Ozu·nµ?Hy¬Pr«d0—ç=vµÈ*°;“Ujh·÷ yýŶÕô[³Y&£tÛœ–°ŽvÜS†÷5½Ó[·ÐƒF8ÚƒJþ]abéÝ,ÆÎ±])9x¾ÂØ ¾¨"„a¬Ϻºˆf †ÐÙ ê›=E—ª=õ.Ô߈ùE·h˜(Íéµ}\á à`Ĩ¦ ½Sg`gaÁÒÌ'p¹6 nÕ8úë«F(3Å—5;Ë‘0ýÌ¿L½N·åd軋éx*Tcíú÷ßcÞ"#"ŠÀ)Uv„ìJ+¿TªÒÊPÔ¹¤SòÖ­9­býæÂÆ4¥ìýÔèstûHM¢dËžã„þ󬘋0UæÐ”u“û0†*åÿýbšªî›Ù´3ù0‹þüÂA‡k/¾X¿!›26eð ø,Ýùµl6þ¢ç¥ß›fžSé «Y2† jTÑñЇ™YÍV[Héðqˆâ·éÚ€Ín8³Çôp!Û«]âP™;OÃéɪäÄ÷ùf:ü}(·$A4VÌò0ÿÉ$M@Â)K_}B¼kÅ轊ÖÓnÞ ±é5³uÆYõÿK&v…òYîBulˆËƒàµ ávš»YûgTÄu@%Z Tí„hµZL$3œöUMͯìJCÁ2§ðñNNQ@¡yÏ«EUÄh7¨pоסàçÈ‚acyêÓ:÷w¸n —‰Ð ˆ •0sãÜ¢d½”Œ5-䆿æ@̶} D£é<"ÞÌE/F”½m© ®ÝÌîÛÖ&Že6„&‘"¶äÜ09g=‹¤°pw(}ðàÅ:œ 5ø¡ˆý°ñ¨Ÿóó>þ_/€rZý Ãbèšüú:Š¥š1]á1² 6%@Ù5,¡Õ¥âöTƆF×r$À=[;gi£Ú! ƒõû»avƒé¯“Öyu±xÎþôÔ„xµ„7KcQ@_ñ ³3aØÖ-*0°yKè¡q𠉔aÉ3 £Lý7ƒ>ãT…*«4G­Š—áY>þêfshŠð¸¨¶…|v_«È zÉ>ºkP9'‘¥Æ8Çå¶¹ª#ÂLߺ% uùczz+^ÞÃ"ª;ÚÄq7< ›W8-WÂ’Ûئ“Ð^™ÝÍ‹,´ºó’a„œ³—ÝψÊîETÐײ´ÑÖR˳°r0aÍtìºyÜaV'j÷>ÿb¸äU,4¸è¯ƒáWšó¾Yw4 úÅ~5ó㪠vC¤@ö±Ö;50uv—øs|¾¯ñîsõ¥Çr|F&Nî°«nÕ§îë(jãdø„s€kÇêîûž‘Ý+(*³Šl/ú×Ϙ™½ â¤C=:é8 Ÿ½œGÿe²÷D˜CK³2¸dJ¿ÇÅ—i³Ê ï‘)§[œ6‰ã*Ûw «W~ÐæôcJ›«ê»B"Ú©kÀ ËVž7A‹–&WVÌR Ñ;ެîf*)\ŠVŠÂõk8û”iäÌÏ$í¬­€ôIÐ@·½îü[‡ŽùzãyãC®‡ËÃ8À×QB¼þµªwæß­Ëùf“eÐ-·À}ðÿcÎ2þÄÝßözò‡¹®½8Ï3iH³wàQ”œ‹Ë2‘•’¸Ç&–Þ…ÔKO¼ÛX‡yØ’€b»ˆÅ‚&ŠÍÂU wSûørµÔF¤‡Q×›rËàØvŸ]nºYWDÌ‘æ3ll´?gÁÚe UÜçÕ«}†¼o¾”›ßýMƒAï sG)pE×H¬XË LÔ&d¸Õª†ÙÞŸ–q"=ž6"äF™ÀÁØN¼û´0›bÑV_×4>¸½ ñÆô²¬—‚ÿuPè<‹d ùSÉ=Úh.êe·\¹$¹XÈ£$Ö!É ŒÔL u©&‹8ªØ¡µf"ÞÀ­}í!€q€AF&»)—†²'Íâ:RCZÙuÔ?›dWVtîÐ|",Ý@¤ä·ÁigcoŸý,ñMvæÏ¹’ àÏ ŽU#†–hÕÇë­^'¸+ØPæÔ/K MK«°{¶C2ºŽ ÎÛQª { qå œê(ŽƒAè_ŸÆæÒ× ä³ÿb&”ÔÏT  Döïéžæ¹Ãîn€ ¾A÷6ôŸÌñ=·Íé­³û;gú¦Ü}Äo±l“[–**<Ï] }€^¾^Èf×%ßÒAÀ¼ÝƒM@eÝ‹TwE 3U䡇â9áÅe„“6ß|”I!mBqå#ø=,»8?Æw€—[^Æá9?°ŽAg»¹Æ%Rþ5XwŒœÁ•ä”ìÅÊÄÅy£oç‚a0ôJò!θ´ùÎîL?õ­tzé9èå{ä6%›Š!ŒÙ6Sy‚H©*W•ó7?fRûj "€aíTÅãî@·Ì {{ ˆØU©”K3A+µÂòŽüÁĽ[7ê.Ý^25™À]+Ø?d‹d4ÀÍ5\ð*®ÜÉ U[Ö½B¨ÚG3ãÑòw”:†Q»=ŠÜ>~ÌXe8d¯@PSîjs¯'wúz ›´meà¢ßë½]Ü‚(ü¾Às1å£yùfŠrf†Õ}dT2+Uï5Û£ƒ^Èk§º#5“˜JÝmÝþºëËŸRBŠü¸¡[Ä–¿£¾°›sãnAlñ'‹DPùñäK¥ ‘û©'e˜¬Àc‰z x›t¨7$ËKýDd&Páþ0¬z8ù°ÊT¡•ٔũ¼Ô'ëâÍö^º¦îš8å__ËÄrBu‚¦ƒž@€SqÜ%Ç/ØÏZÌ\!×ßAéÓ׿̼³í?¶œœvûÍ*´–&@”0ÖÈ‘x*¶DÿÏõš?i&&OK2 sÑ\øjx¡"ZrÈÜg‚’„µ‚Á]çL\E_M´nZûªÑwœŠÎQÝáR@*BQøÞ:] Ôä|Ì^`HÙ»oRQ’3 r˜ß• }.’Üz¼ù“ñèë:v{Nó‹Y¬Þ€—÷y|§S#7H{Ê‘)@…ÔàÎák¸mõJ"Ê'./¿ý‘žkE¸nª"gæh™Ëö9üÕ*}ôñNLuIÙ6‡A9ª —!«ãĨB–LŸ[©|;‘v‚ÓÏïçú W@Á×å”–½·•K?9ЂH-AäŠpuòçÖŒQÚäÓÐæxaϺóàŽ½ýÕõݧ‘·™J&g#@OØëèA ÍlsšïLW­µGÎU`Lª0­KŠ+“«3å¶k8e×ÚšvVŠ×a¹™”ê&°HJggç«9¢ 7ØìûE¬¡&³ Ü…0CSÂ96uP@Øñ¦Dì÷]Z¬${ͺ{¤´°“Óv?ªÇœ^Ӵ׈L¹ QFðTÉQ=~d2c´öqÜF^Žm@³fnmirQì¾ o“5¤úõ‚®Í^^2Më~ýÜ>==Îpþ CÏ¢LW(¡ý›5<™n“éô!-ö#¤ŠÊ­Êö6È4’åéØE+yÿ–Ú¾¥| ï¦UTÉymh…´ØB¬`ד&_ß!Ÿg‘G-y³¯¯†ûê31ƒ£a+=RñX¥¤¯e+ ‘zŽ1!”¤ ïRyÍâáÀ,»;± bnÎ>¹Í$[8¶fͯ|Jšoð–ó;þ¯î8~°ë¢ó O÷5Ä€X÷TSâ wSÓ’/ü^æ"´¨#í…Mþø™Ã×Ô\^†H#¶ëâ†ÈïM/šÁJÅ3ïõu/”嘩5œ™d?¾x0l¸Þ{Ïo Gö˜Ìe«ÇÀ ƒoSû-ºþ¶d Exê9IýŽ¥–°zPbË|%͙酊êO¶ £ü ,¶6xæns ha òB~»-•ëÝnótCÍœ Ïjïñ*XžÑ3«úeÅ¡ƒ»Ž {Wñ¦$!Ø«QÕkTD’$Ò˜š”qõÇ¿2[f ™©êU§äOŒ1ÓgŒmuIê0vùREæÐ2üî“-sÂÞì㉟eD<Žöð.Á SœîÕJmÛ¶øWXgª÷2ó]„çJY¥A'4·pðp®€*©ØeO¨_M”øpⳓ}Æxõoœum¬ uþ[2‡ í|Xv|V¶IëðøSZËï Ä?wó"é[Ý X7B Ö±ÙQð¶"“­eÿÓ•U ²–j£ÎÔð²§ÌÌÿªè&`ɇw“¹Q =}±ô®-.;%SºÃB*Q÷S ß¨°Ì+Å{°Ú)5»3,A=j?êƒ)X]HÍì"¿–H\0 †*ÆÝà rü³«µYº"áÖüu¾•Üøµûf€2nXH†—=5›5©/ènÍš‹’² ÿ Ý0A´v‘”W"UèܼšK§4£ßƒ!P;§‹ƒvõhLr§uN¿K^i^­‚)pß/î¤j=o¡~¸—'Nå £‹†/_ýsËÚÇð‰¥+î{Äx©Òõqõ9™åôe´“™z.‰L&ªiç4Ã\BÎîfhZ>ÈT¾Å™á‡ø‹ßŸ%¯wÙGÇþ­qé%jÍY)G´„f·Ïr†jÐZ¦¼¼1z¿=ÍÒÄûù´aŽx…zêÆpÂöaÓ…”žÝh3û<üìh¿’Î’%ýšaéâ? õ…Äó®ùPåÎ8$妺MëüCšåXEmßݹ…Ihmúh:3Ÿwæt^Nï¶Cm endstream endobj 1021 0 obj << /Length1 2789 /Length2 17933 /Length3 0 /Length 19517 /Filter /FlateDecode >> stream xÚŒ÷TZÿ ‚tK )ÝÒÝÒCÃÐÝ‚tw—tw—t‡tƒ %’w<çüž÷ûÖºw±Ìóì_ÇÞ‰¢2½ È(²u¢gf`âˆÈ©¨p˜˜X˜˜X((T,œ¬ÿÐj@G -Ï"@C'0'jè–“Ù¤­̬ffN&& ÷ÿ ‚x¢†.&9€4Èèˆ@!²sw°03w»ù¿*cj377'Ý_ê! ƒ…±¡-@ÎÐÉhöhlh P[Üÿc‚ŠÏÜÉÉŽ‡‘ÑÕÕ•ÁÐÆ‘ä`öžšàjádøt:¸M¿ÈÚÿÎŒ bnáø7¯ 2ur5tÀ„µ…1ÐÖ¬álkt€”¥d v@Û¿…eÿ üS3ó¿æþÑþeÈÂö/eCcc¡­»…­ÀÔÂP—eprs¢Úšü4´võ ] -¬ ÀEnR‚ü'=Gc ;'GG ë_)2þ2®²˜­‰ÈÆhëäˆð+>Q  1¸ìîŒwÖÊäjëù0µ°51ý•„‰³£ª­…½3PJô0…ð›3:Ø™˜˜¸X™@{ÐÍØœñ—yw;à_‡Ñà ¼=í@vSp@o S ø‚§£¡ àäà ôöüóà¿™`baì0šYØ"ü¶¦¦cpó,ÜÚLàÙc0ýúù÷“.x¼L@¶Öî¿Åÿê/£”´–º¼2íßÿ{&, rxÒsèYXYìl,n.€÷(ZüÓoM)[S€ûïXÁEú¿x]þi?Õ?«A ø¯-yxfªß#®ÃÄÎd þÅüÿyÐÿRùÿ7ß¿¬ü¿øÿ$îlmý×1Õ_çÿ?dž6Öîÿ€GÖÙ <þr ðØþ¯¨:ðï••šX8Ûüï©”“!x „lͬÿ-£…£¸…ÐDÑÂÉØü¯Áø›VýµbÖ¶@E£Å¯;@ÏÌÄô?gà½2¶ßŽàyüë^›ÿz³5™üÚ/v€¡ƒƒ¡;xŒXØÙžÌàE4ºý5ÁF[XÎÎ` r@øÕPv£Ð/êoÄ`þ8Œ"¿€Qô7â0Šý‹8™Œâ¿3€Qâ7b0JþF¬à!ý،ҿØ»ìoö.÷½ËÿF`ï ÿ".°wÅßì]é7{ÿð½+ÿF`ï*¿¸ª¿8µß‹úoŽEã7Ç¢ù/âKþ‹XÁ’†6vàmùußýËÌ6nèhl ð_¼—`7ûõ*ÿö»nlàr˜»Û™mÿs@pç,ÿ€àn[ýÁ™ÿŽ™œ¢õ¯Ýý}®Ó 0ƒ~»b{²u¶1úuµšýø©`ýŽlüMâcp^v¿Á&íÀ¯¹íÇÆüûß¶±‚£Ï&øÕþC”ã/Îô»9là:ÚY;ÿ‘ø £ýï<!g ã_—Ø¿¶Ù~‘ ' ‰ÑïŠpsüCþ':VîØÿFÇÌ 6ñG¯˜Áõù;XÉhcñßAc«8‚ÍCgø?»Á Žá·ð{Äèdîü]PðEËèä úClÃùw à(þúväh rø³ àÖ»üÁá¹þ±h`£n@°W÷? ¸…¿c[ò:üÁîzcgpþzŒÁÁÿ῾Xn@c„å1oemPû]µ+ýÞÿ,Åžz 5½ç²C‡ó= l"õ猀 ‡[¡Ä‘^´µ1ªÁâ'Ï“–zØÐÖx¥¶¯GýO¦÷Ú–¦°' N„êáßÒ«î{=Ù{©ù[½j쒦ȱwæBQÌüsí—p«([YØSÚÿÌ!ƒøX6C­¥ã_Ý`š0T´©æÏrOÞÝ®’¥èîs‘ '+{3&·`—‘ßϰq‰©ñ!¿O•çÍÀoœ…ÍZÛ»íÐæ#ˆ')$-°Òœ !‡ø0=k„3Ÿ2m6p‡4âüÑ­dVMÎütN–œU*eõìÍ̲{ {Fź.éç»°ƒVš×gbA|Ð5Z/³GÅÆmß˾qE;ˆwïÂ}-f¬É¼w¸½>k^¿ëÕõ‹ç¾¹zµ'¥Cî“Ì?÷)¯þØo2,°)ïc öòØ›»áŒá.’Ýã¤Úž¥îzeh}Ù ÷]Q3š2a^q“7î÷ÜÈ.â ­n½”êk~8“3Æá2Ú3G•÷–וkß‘k7T2èÍ-›Sæ »ãàxjÇŒfóÜ~úL™YáB3ù¦éåk%éN”ÔSF±²šE}gÝ?vµaùÝýÑN8*CjÜ%œÇ'ƾBeó( Ü™o]âBJŒ’fZzŠ¡RË5dÆø4«?úÁ©fÍ3š¥Œc4oKáEÛÇôæÜ‰E”ØàÜÛÂ>~FÙCj¢ôÄs޹P2G˜Â+t±®UÌ=o.­ÎïéFôóK¸[»"¸éº´¢G¼Î§¼ïBq›6­X(µÛÕ÷|v‡µQšs°€Ã¶Œµªó¥[C¹ žÇñè€0´25hÈód7¶=&óû=•Øð¶à)¨)Oc‡ Æ £ÓSçq÷›æ¯ƒ°¸ôú2Oæ+>YGìÛOùͳ•ï ©’=“"M=HÈžŠ‚]ÖµœÛ7 ´öIÕúTÅF²ï]+ïžè¯!ßB¶ù¾ÞAa7.[v ¥hS?£wÕ(&½uòj´‹8€'„éÝ´ß,Ë£Ú Ýœßqnéõ,ã ó¶µÏ߬à!à›…¬æŽD g­DZê Ä-íÁûoLTÓ¼”ºêþYZ„¿Ôæ8á }FÛ à’šš0Zú>@m€µÄ&õ¥Š§'à"“_Ý®(ŒvÇz!¦Çv1”˜Õ,§„ŒsgTÉ·G°AÑg†þÔYp¶Fô\M‡ÀQ¹4Ž÷Ù!Pºªb¹ê]L2ä%B«»ÀøsŒžÈÈ ÆåO)äFòXI ͧY|ä 8Ô#UÙ KŠ'ÓŠŒ‰WnCG§Ê¯ÓaW¢N××:KÞ0=óògYóVïöùåÈMK½DŽHàm¿ÖÅ´]—I%êñŒb)xu93èmOË£8_ág¸œNs·²¿¯-¸û g"-ŒTÝÁtv}¥[t1Bhw› ­=átµ¾‰I3â|H¬G±Tti@øîIÅ7 ZÊž8˜Ã’?ïjÜ5b ~¤£°k%®ml€3ïn8å©óõäê)æÀÏÏû¢7¥¨7Ù­¡Ö’õí©Ô—É\1 U¦y6¶tuD)cÉÈŠiPÏK#º”(‰gÂnžø)ì„C¦oÅ:þVuŠ8mx,pÛŽ¹ç  ôÒwœháw٢ ŸG±PérìÉóÝ(Ÿ¼ˆÎûKØ$}Ø0¾EIs–l¦ñå¥Oõ–¿©QÜŸ‚Ìðïñvö8ìõÊüaÖ‡é@†ÎƒŸsè¼ y•‹w½©Ý'z¨Ã àÓ¸Y3pÅŸeŠ! ‘2×…ª–×uß!x±¬n5=¾ØamQâ "tÚ‘úF®‘ÍKHCÀ‹gÞif¢½áº„RŠ&0f·ŠaǨObžÌĆï0Œ?˜$›A´\ý̦ÓGKÏya:ïjWl¿¹S’¢7Æ"wüœ´ ýá<ú¡-~ì ÑËÉe‹._fÚ­Ô¤¯r)ª} ½H„¹Ê›8 Bâ['ò“€‚ÌÉÃo‰\¾Éeá/Â2±°î§ûµŽ®ÖË·ª’½ç)¯DE”%¦Z™#•í›Cz! àø‘¥ì`ù€–øñÉóÍ‹g6äòHQsË25 `ƒ…¥ÇnéWZ1Õ—Jö$Ñ Ø´¾¨Ç¦-—¤sÖì?^ ySöéÀ݈#  7vhgªÐ Æ|>q `ÉÝèa6Ì:Ü{ÉØºÍ&ŽC¼›V‘WP¸º’ Äù€­ìK…»xàÕÛìÚNé¦J¬s±i¨‡ô7‚m‰kJ¤–ã”… D~~Ú¨c&œš¬›õJ°ož#„ÎÀ}âa'þ>Ð!Ùàx}‡)£wqè;|ý5uœ@"˜dL85ÅN/“ï1eðƒhŽWÞ[J»Ú¨õ ‘d~;Ü ÔÃþõhÖ!Kѽ—£á¤Ê«5f„Áû×l‡E‹/Åü¸ðá˜'{^ºXÊ#¤„‰t}Z¬0ÇÄלë: ûsC0Í¥%!}òú‡¡KZÏâ‹¢wgò”r²Î¶`«ßÁOú®dLIä0ÔSÂ2‘tÐ_O=y$éÕýý˜knZq€_%šZ·"_ÍÁ”i-{õ†R‹qs“s”œßË ‚´ºe´Žó \nsk«WcNÇ«]¾9,~·²Mo6E—ÎÓ ì!›\ÂÊÔHæ^)gÙAþ¨|ÝÌG¾öÛ8fø2Ö–S†\wÇ<¿ÌZVÙãÿX[b‘ºõT„`º½•äÔìÕuªUKåEs¹ï¯GN.&Y·NàÆµk¡X ÇÓ±u¿ƒÈhþY•a µÅ¬¢%›Î¡tL3ný*¦ó3‹| `?ÙÒoE§Tûɼ—€èõ{ЧâLa]½šøÌ!sþÛã;<É×}âüÈ#ÝqžA2O«1F£äU†IHKeÜpÚ^˜|þotZ}@꺻)c9Þüv¼Š’ œ°ˆèj Ãí’äÊ…dOëÊ׿Ÿ[+ –ê?¤blcª‹¼û–a†"¬Ø^= ³@ÂÒ~-6q0åláîÒ!èf×ã–<6«Wø:•Ng”éåëÏ]Š yKï‹BÈ£Ž}½Jdº¢± 1†¡]úÕЫoMd&fž¥Í|ÃÐK^£µ+EÏ¿0£øÙ/Á"(>NêBsgÛ¸EA®†ý šÃK9I¨É«l³/[S~ntÞAt?V±ÏòÒÄ%mÅ:ˆšÒ4ˆDI΢èæC>Y“S"cl.ºt0h¾÷öÇÈ©1R}ÂUöLaá\áÿþªtæI\8Ý*èë;„¢?@è+Òþaßë]§ì3\zÖ¨ûËMZ_´““?ÅSÎ쌘‹>ÿðªRÚ‘ð輋h60ŒžÜai¹õä弇q†ž¢üÈôԲіÀ ©bbÖU›€`1.¹+ÈøXg–/Ò/ÍìÁ˜=-ûYý9EÓØj¤¶  | †þ¦ÏÛ¸˜kRVÄ«¤fÀ,¢]³œ˜›!êÓeƒ@únd0¼vŠÖ/`¥OqÆÿö\ŠÎ›,ÇBl)4õV—BeüýøSàÅ †7]2|‰/oÃU||ŠKŠÓÞgÈ+Bm<…¦ü^âšÐwåš¡˜!#¯Oo’”3”çÊØç³¬iߣ|ùØQÓlÊñyOµJ³õ¼ô]eÉOý<; hØsþêG]=+À®Q ëL­‹3”Îs`LL²IZHÕmæý Ëxd  ’ÿ'L—iï9vV›Í¥´KÆÁ›’ÏuÙxõú¨áW>]GS¦8§eŸâÙè +#ù‹Øî(rWZtwÅ2%#LmGVýÜ"?¼­¿¼Ï–e$~×à„cÈhÚù„ù1ÙQû94”ÀpFÂ{/÷°Õ¡6Áç5R¹.y"ÌÅg熾'¾ËEyEL¯<¡áG |«‚qDXEÍÊÁéY"Þ’¶áo©+KAGjÇÕ}ÊÏû|ý)¼†JDÌQÎLa2ý„F\ mÍx?yV¹ÜX•|›ÚõY ·Ó † ïæüÚV¦yÛ4ßLµ„_åv±œHå4DL©¡yIßVÉISNpÉtîO=.öÍI¤Ë•×Ì”™½_W۴Κ~óP+z¿`\Êè£vì¼£ë¦J4eyi‘Öxóµh°d%^ˆS©qœ#¯Ù§—ýÇb£@þRUNýäÌÃVO/ì†UØ.að[êÆDëúÛÜÄa7ýZ"0¥JõiV–`Ø4*ë’dˆýi/…E#zñ¤ƒi]†¤·U2E±øæjvD6EašÓuE{«zeaˆù¡÷R‡óºQnzd¾¡ ÝTV,lŽˆš)éJ!lcÁØ>Ø+~nkm*×§J1[’ ¡´éoujöè=z¬Ô‡,!.°{°ÐGsÂ1[› :&ƺ–è¸!keÇq½ªG>r×IMûÐE·1sz1i 1.8Gä·š|µ¶ßÛPO]òùâ YäA¯á»&Ϲ€X‹:LkËé=5áoß¿Å{¨Öû2j0#)çîÚó7?›Sr:_•CK\«• éÏõ°öË=þÜÞòéÕ NwÚ‡b ­…‚’ ä~˜[LôžÁ½¸3ÿÚй{Ï4R`¼¥âÒwUµà+_íG´ Àû_íÍ(s=@G”%ÓNb#•»LÊã¼­Õ~Õ0!†5Üëe_ î%ûˆgâÚ {¤N¡iÞéƒÃÃXð¾J«„8'Þã)O–ã9sæ=*Àé~g†€™bާÜœ‡´ià¤UDŠDƒ‡}¨$B)ãøÚÙztNº)Í cÊâ+¹C˜Ø‚¸†™ÙDç¥Ëè°¤¾TyuÝкìÜ-š5M0J½f#Ÿ!œÓÔè¦âHË(ôcK ce'‚ HÙ\ÖZ {—K]üúÚ´†nH`öæÇ¿=lh ÞÉF„¿ñôwÙhýDë9!O£‰?Fko¡{÷QO–z‡(¢>‚0ŽÀÆ}ƒŸÿ*,Tæ¸ó#rêgO‹'ÏÛw!¡,µ&øt »éèSaßœ>mÔüH¸¥o_ ®,ˆ(x&n‡( ïþÊtp_\@îÐO?/`ư=)Šˆ e ª¿Ÿ}¾uw¶#±7Ф­"<ߤ™%rg"Åâ¾Ä•‘t’×ÞTý’ôc²\Õ9º(èü³¡úU®Ë± Ãã—<áÕnFcÁ,Ož.R?¡û&\—É;]EoØ JX+·QÞë\+?޵·‘@(ŠÖyd= –iÙ(3Ýܸ;‚«àq5›ÏM•Eræn?v³)Ï©¦<³ ö/Ìò¦ôòq†Ÿàû æâƼÎjZ©NM¬†÷ð»Ns'ÖZ£%ýæ^ÙOJ¿s­þ–ïTÕAPì—ìï›e¦°n P“S¸aúJ9 ‘ž×W¿|{‚ünÒ~½ÉñEJk̯£Çc3‹—i%þFân ô£‡Yè=€6!Þ ¤ƒ,ÕlóUp¡FoFZŸ”uC90ânöÉÏu°{ú•€V•¼M€ˆªoHýýòã§…˜D^k¿nch^=þâ²íŒ£bþd'›ÁöäÊvóð*ݰ8$F{!±/ˆDûI1¨ß+‹ÆŽû ¾(‰âM–M¾[°- U(y’˜Ù!ß‚ýwM¬­ÔvÀåÈ'/Ê‘bÆóY>±Ä;†+æK‡s¼w¾!Ü®f³Æ‰ñ3Inñ¥÷Ï.ôç RžVg„0;.á]\éjÌ(Õ›{å6i¬—¶B©ó”Gt %6Àu5í¢P~Àꗣəv¶Í¾•xÛô†rÝí¾Ý¦§¹k¯5Ÿ=ÚzÝ$k¸Õ<§>¼åN"æ©]%F1O6dгBܤW€WµJ­¬sSuµõ¾Ý5ÖÍVvPìeÞÀ†.-c l;ý»î‰ôä!ó`ñDsQåLὬº¼ÚÔŒ$O‘$u×ÃÁ gö\[áuúîo¢my½žÐ€ÕŸ‚¹©øË¿.ܳ©@(søÒŸKæt½å¢4'x%^[<±‚½Œvciìiû4 ¹¯ºˆfo˽5[—®…F¿WòÚU‘W¦¼ £ì~Zj*Qýšø=ÀiG©'ÓÐ5µ†Q?ß(¡Fk0™—WŸì]OÔg¶ó˾JÅ·&ªpóá>µm9%N–g³%drŽYýo›ƒ ¢4òÑ“,쵌jŸ)Ô ˆÓ øu&ý"Ö/w8â½Ô ¹MGÆü$fb^6Yñ‹—1ÉX9ž%íâ y›íœFÇûCÔ§5çæ´{F¨{Ÿî¶/@Ø,2ôBVfxx7†÷ûXgºÐ¥AÌ#wÛ¾»;Sœ;D);ï5â¡~è~+,îÌçÊ›Ÿ¥l;øj¯S„­„×wVÓ‡|ƒËõ8•ˆtñÈcô¯79p?U IÐ]öÞ{ÚâÐmà†NÖl)—ïÖE"'.-yXæT Éí§)¥M±ï•B씌üaàCÜp¨*9Aàºý§U¡[¹q˜ëÇp§ˆhùFi¡ÊXK)ý¼ðz›Içˆm-ƒâ§&;té\ê3ÆúýšÄ¶È•O ܱÍ×ñ*0îf+ð˜¶Cܯ¾¡2”„€XY‰³†_ü@A¨D8‚ü2:<æ•åOù3]©l¦+˜f®ÄêçïQºž7¼æ;ÙÅ| !ø êqX•ÌÎFŠ9¤èÓPÙD„Y °úNc5)-G»ï_¹ÃŸ¯ÂB Võ{ß¿ïrGÇ7Ï“å_ Ci¿k=–øÚ¸ðZP¯e6[¸èâÍšïëTIs®;’Oé¶# £6ºt n“ѱ åUç¯æqL;ùiÊz6ÒÑ¥/×Óýˆs´{ª Y¢·^Ûaã)ýäpùb¯6.j e‡Lˆ† gbÀ¸c,³˜ÏYÊ› K’ë…By@©L'R´ÉNC—CXš¹í0ûlúqØP­Ù£pÁû³d)ÕÇOô]ußsìã\ýý±—r•¥>÷ž¨X+·k÷3)+>XઋìTà|Kìó|fD]ë1o!6™AûÜÈCôˆ)€03ÎÇñTÍÕ·?à }‡ë{%£w.)¡F¾¬ˆpûPbÔª ÷z¿BJbFÒvùô¦€ZñƒÌäÌY\ö'aÀýh3Ï{Ý“¼¯ÒÍy¯- ù"rtJ˜‘)hH(нگV޼FÓß}ð2oN¢®ƒùv­Ù€k]ð-|ÀG!»‘?ý6ÿö`åu”—XNÇኪ4¤YŽéœ»Û»Ö…é/A¼b5Ü5¶'úz-†——(D©8ç=7ÅPúððSßfk²ñsÓm7øš±r(l/n!?kŸù¤ rîÝÌ 6U8L™:Æ_×[ŸÞ'/°ÇÀ '¼E.âlzÀðUæËåÅN„f_ùÞ:}©ù|[à2ì¯ìx3‡têJãN¿ý=µ±yÕÒ,tù¡3It™Ya*hçtÑh|ó“vžÌK4±ª¿ôkøœPïå>5¨q µ CŒ‘ã<çºv_kß‹¾dëñ§RSà‚¸KmÔG‚’ÌŒìÖøÇL(¦cùT.eÛ7èÚÀÿãLQê \QÑ| ªÐöÉg.ðJAÆ—m ÙU|DA©ÀÁæe©ÆH9@Üc’…$ùf$bß"<ÑC›y)€b9É•¨½ÐJÎ}š÷YQ˜jë²²?„K{œ­C!4}•$xU*aì^«Á;éÀé½*Ú5£¢2H·¹Ì»‚ÛË*ôgøÅ[(,eÏ4êMØžŠ»‚¢°Ã þëƒùåZË€)Í6mÃòj²¯«?­È ¿Êkvr¡Ïé±ü©Ñ^õeº6~¢‡ã3‘gŽcÚ¿ üÂ\}¬ÌÉ­ti_šÁñeù!ïûÇ Öþˆ¦6múN èñ¬Î ¾Þ–½aˆ±<í<5b Z“²+‘«ó¬aÀèSÇ!s(ô3‹¼Î^÷Ì}f¥IÆÕÄ­©9”âê[|5¥åÕ×» ɯ k·_D¸%ZwÏQòWUó§k‡#)zÐÛ2>8î4Ô"L1Ð(S“ž5ÔМ£VË’ÂÄ)Ë+ŹmªØEøÏ¼ëùÀ‘”ñܤò´âøâ²Â(ÕV þ–«ªd·þèú<³_®+þKãʤQt_Êyraøëô’7oã-›ÊȤŸ›!'M:ë#Ȥ٠í-÷æÖCýBQ¡ ©’*œŒZd#Y±÷EŸÛB{ŽŽáôÍ5®Ÿß¹‘o ŸªÜ¡a°t_tÂkì|!ÙÆUõÑν¨–¢Oñ©»?Xp* ò -ÚTXá# kbk¢ u~J ˜7GÃlK2R|KB5£‘÷#1Z)SE‰œCØô2€R’$º¥uv‰ù®rÝÿZ¤NýTgæA^üüÆýGØwù³ÄÕižWÏ/EÕpu{Ù²SO·øXˆ 6éN¾<¦u Lj.¡éz@`ç1<¸'ðK¸Xh©mбË_S8S½,¼ÉÄ…¼­{7Zu_Åàì«Ldßóس*!Ý“ûÞ‹Üö϶½§¦$!“Êç ýÅuättôíÆ¢ÛÖ ü@˜ø+ŸÂÈ!ÄâÔÛkbŽ4hÙØTâ¸Z­Ó_8/s¸nB¨å\Ô’†„tO79/ãUdü&'$Ùõ-Bò=ËWž!¯ÂBå=t7ÇR/%q÷F„6p(+)+-U¯Ænƒûà×›1:í+õ 5"²°Óë\áŸyg™·¢«;9ܲêÎrdzôï5d<ξ#vv¤¿Y›/á9q†™uÛe­L—d„›“Òv…QÄ÷­\‘{ìé%¦) ¸"˜¶…ˆÁ)Ç ãŠ)¡ºMì3pRï‡kV[öåj–]»£NþÂ!.#—'?Åf*ë]IXÄë«{"„Ö%xp"´èr*fxF{"oOáäGZÊ´ü(?‘çr§¢a%Ë-tôÀ‹¾aÇÁ%í@^áË^L©‹û$,ƪkæ³{·Ö-›/4µy‘ÂBGèQÇÕ1Šr‘õŸ;aäDóÄ.VËi3:yT‡€Ì½²¤kèxk]»Ób´–dȵ†(µÂ O¾7ñ“f½Š˜ø†É mv|x1Õ}:XŸmå¨5mg·sÄdúç½p]±$³]¢0ø~f> IFë² #ý$) ò…²ÉI$ ·âÙßÊžáØN#ñ÷£Eh½žŽ %I•™°¾­kº)m4(ç.sÎŽžùÜø<r!+]”õ0äá¾Në›· ëÌ¢1·pŒôݯý‰a$Ÿa_€B·ª"ÇGüQàY¡d«Œêý]|‰ó—˜Ž3د&ªNÇ_QHíøÄ$Z«|77>×Ì")Äõ8Ò5Žì¯)§î#¢ÄKۤᷢ–úŒLÕHCž…kAŒM!ÔxϘÑoˆ']£?TÒO«‹VÅä‹7L]q¦’ç“¶µçL4äËzuè†'&³oš Í›y3Ñì4X ¾Ê©\ZxldJ>£êÄ,(Qdgÿá•·~]ö:e¼úL\ÍÜCþÆTÊû§TÅ׫ÐOJmó"›ÃÛxX”ž'Z·ÜµÜ»TfÛ‡•qº jk…kÍ£í]Fó·úrŸ®è[CÏbÂ4¼ì*}Ñ<©›Æ³/CIŽôà}7Z¤{¢ òŠZDM® G{“O¢´R½ºç¡'üÌññ_f°:bÓ¡Ey÷fã´ (+dID:¤0Ò½¯Ég&5ãkªÞk¾@ÏXÒ˜µèÞö6%/™‘ *&Ê寗(&=4•¤9Ùä~ƒÇ°äÉèñÚ®-ö(/÷}¹“¡z°Jo45ꃤÅhZ8éY‰éňu뉳£Ñ%Ϫ¡wû¶ívjbÌz \ѨêÞfbÛ~×·Ü8…׈&O눆ºhé&dÂ[¶DÆ[¬O%ë<ÃêqŽ+™öŽQÃ5Ò: ÉÃrJñÑRD Ö}xÈ6)|Á§þgr4az²ýtžGR´Qi-”ñŒ«øù0i…‰7\Xá§_Gtt£ £÷<1ów¯æ êÖµ¼Érâ4× +¿ÕpªN|iß+^ÿ²¼‡DßBeb+.j/p“or -¼ODO ²ÛW˸¬di °]×Â}Ÿ¥9Ì"V8`T’¸„ZënyêþÞ»‡Pò†#rÀØz‡^àì©‹H¶ˆÎɯ•02^;¡ªðð×’;Lm ³jùó2…a'`y!Bd¼Ý dñùÐÛF†²Æ _o•"¯v9«]!iÜAÐ`åÊ·¹#LµVh†'¥à˜øœÑÅ ›/Óv~=DŠ"ÁÍqA¡ÒÓì.#2îݾÌ4®ŒÇ Lð=ôØeÊn jÊ·„‡ƒ?ô+¡+Tò—)¬×Ž$; ®Ä 'bKÞâ”Âù‡Šn¢.’‡L~8Œ u+ZíjwºNWäð ”#K@æšè¼ƒCâÒʃM(d fÌãè%´Œ‚$(Æ-ÕÑócíXEŠâÉÛU R@š>â`ÿÃjöä®TþXñ4gÕ³.–}Q}/l®¿¬AÓ=tt´Œ "P„{ùƒ v´¢Â²-½ÿ¤ª1”•jÕËîh¦È(ežYŠšÚeV2î­,£˜äV£n„31K<'_]yðS&‘“wHšð¼ð"Ý —:,¾ðiRú';lV>É Õ=ÅÉH”Ž«ëØm €læó«º…xº §¥Ù™ƒ©²û:}ª›’½—øi½UX?%†&†”ëŒJòTÀà‹Ÿ×ÝHÕ‡í-ë#E¤TZÅí‚Ù`TLÖXR3*Qà*‰?e¢ui£Jý|5ç·ˆQÆ«³êw}î7³º÷ŠŠÇ C¼Ü̡؅¿mÛ…€ôÆZb³õœ¾\¬øŒdAºÄ-1”|ž¼ƒ%û.æüþ‡ù™ß½kÆ+zÅ£p[AÍðØoôM˜׳7õ䨥Z¸pû ¡¯It´Ñ¥…”¼Ì`´Â^÷ÔÚà!ÅICÇÂYYv/f ;˜¹låvliÁ ¹·ñ”k°¯¬Zp]=]ÆÎIÈ!зÑOw ãѱى<çczÊo¼ ×t*¸iÈgð䈣,o0” ȉ/Ù<é3y‘£ˆ÷ÒÙà‡^™QòñkÔ ›3›<ȉ$l(ÔunÙM(qé&ûš?ÿ@F»H–qÐpâ´²,«DÿhÍêæ!Ú÷9ý›3„,mÛX¦`øÔAqq˜ÿ2Û‹Æ}¬årg!ˆ÷xbñ¨÷[¿ß²fÎO…÷íÈÎÍW™ûþË/¶m•T'm±ÙÜ?*Ïöá=vT2êx˰ w<+v8ël±š1ˆ­#Ólœ•·ÒWÑH˜ßÖ;ÈPkõo=©È m'XìZNGÄñ«lÜŒ5·y`$dpFûU,K†ŠtÞ†H¬ -Jk’´~^‡ôõòï€Q^È"0Â.IºMhÍåÿ ¢z}•D‡ ÃY¥e‡·-ù±]CQÌ<²(±¡ê¶š‰Š§4ñ­”$iˆ7sB FçƒÙôTä¼Ï<:ÿÚ›ôÆÛæ%.:bÙ‡ÄËøöתï8j°p ·™Âeö=ÅÚ-f±nûýjR2Øv¤‚µCÔÁø™_"“·é¨V´ x³ã«Ä¦´ =×á¸]€ŒtÐoñåGùPçÞ|ÄPµÁEq¾lRƒ)Kæ16ëô#eh3ê =OD™y>#4²h^Q0¾ºEuwºÝ¢s1º¯mŽvPÞz¶i¯¯Ö¯¶aQq»ã.œ!ilϱQŒ › i#[9àÍ8À©Êî G¤<›–bªÆœ\F0“"±%!\ì‘¥|rÜ–Ä:}]ç÷ÌÏ\§VÅm Z.ƒŸ^¼°=ª+®¥lãG5ëÂþY?&‚k¾°¸tñÅ ]D/•ñ<ŽJ.cÌá…ö» ŸJ踷0ü³!6gÕ3|¡b¹F=lúœó6%|ëÛ:Òuç\j¬Wܰ-k¡|·ßwšåy×w†œ¯ØûßHžãd„w'd fœTíqª]öíQæ>ȧö¬Tk§>ôYipÖX7ÂÎSÍm½5ÞáÚBÛ”I5“ TÝÆ°u?ÃéÝ2ÐÁý€67ß‚{êy®obÿ,ÐY£‰Ýó´gÍR<|a=àÞÆ¹åÚÂÜË+Yü…ʰÓ;‹?(„ΠÎ/BÀ‘Oò¯ ƒFk¼ån²k~1oãf1:v¼Þ4"[Ónv«Bû®Ö„ý>”’Ü¿ sž‰W–NùÙh"/a£·¯3ÕëRÛoR/žÕ¤©#ËÙýxÒ‘¯*×Ù“˜FQ -ûNNFH>~œÆÇ γa@i$¥<ƒ¾ñ{ó€_où*㡦ƗΦ”'ÍþÓñ+.g+8ÖÙ§õþo³³¸Þ…þ5˜ ê$ÍÚQ BK bf ŽÜÆ@ï„î&U²‹<4WƒsshÃô8^_m9_ü½hµ;ð­°çµøeÍeG“¸@g*ŸŸI_ÕÝ.tc¿2îæ“X ÆõÙ²óîž^Kp¾(0õy¨ô³ÀãÕ5•"áv·@PvZ¯“>:¿A‚zÓ7 , ƒE*’R º÷”×ÝQÑ¡òxß0›wê”N²­Êôðb_yƒ™kD”_dü$ÏB³P`â …å…ó‘Ä6N¿Ò7¢@=D1£™m8<â“ÌË«k]õp ë"¯´]\ݵŸÓT†Òýû4&"í)p@Y¸Õ¾"Qhkï^Åñûo¸`)&ƒœ¬i?4Þž­±T†%¢ *’ç{è( ÑûòX´ᳺ?l("äû„ó¬6{Ïb\ú¦Ë®yƒ¦ÓqÃuᆔbÙ/ê…Ù¦i%ì¬N<ú¦åø^{ÛXæ;.E=SElÈd°6cYã÷ì&³-ìŠ{Ëíƒgˆð§9].ñÐ]ÓÇŒ–zJ¯ý÷ó††Rø¶\"[Ñ=w:Mç­«(²D‚-":Ù lزË\ZZdªCõõ¾ÌvÜ ;‘? ½µÙ¼¥†Ý–l¥Ñ(Ãø^<•j{«Èú Y—÷ãhê¸óØÓL“JI­ÕЄ÷Ðçi„fÎaáüØ+ªäWœÓ[Ù)'²cs ÈÎ ŽÉ½X,]Må“J®è á¡zËyÉ1Ù¾6;¸à“‡°¯4nDSHµôSAùÒ#ˆÈɪ/`_×Õ{ouÏ(Ù¹ÁúöD&o&NDxNç,Þ¬p¦˜¸ }ò2o5ÀÃÉÑÌã~êR¦:Þëó“E·]­u?9ùу4³‡µ7“u9‘?•Ý¥ÉoŸÊ²Ÿ,¡‚ë«éT³’8qKŸ;rNeê¸ðLmR÷€àCdÙ"ñÁÚ1vã±vK4 ¼’.¯[+T·XoÂ\u¶SÑÕZÙl£½jÂ5•X¡Ã(W'oðÌSïR‘iɲÃV¨T‹aΜócwŒÜ±¸™êLΆ}±ô-Zmp ÝÔ3P \HsÀ7œA½[éŠašôLjÿª¯±Ÿ‘ÿˆ96¡{Ëxa‡À„‹}Ú…º†¾©&_nq¬Jr I8Ö²‘kíƒåâ*Õ™ÑC4/þú•|~ï¶ý}Áº`‚$ŠÀ´ô¾fäÇÂczÍT âz3rÛœçò>)rœœh"¦UëÒÏ&{¦™JòAÐ?ýuW‰ê¢Šä7àŸUP;oøYX'k Ž«w°0+û_üŒœ Yª³1d¦MîKr¨5Dë¾BAGa\h.¯R°£:ã±téëµÖ°f#¿&FVÖ¦“²…îÎƯùèEVRð㑯§ßìÓãz8”f—&|›)‚@áëa¿AxGÝè~©±tkPùÇM›¼!þžFšë™R/I0¥äõÃ1ÜË™/7ö›wwÁ†dŽ^_Y=z’kAˆÊÜï5¤«ºo–Ì.éW«¸ƒzn#Ÿõ·rlÝÞmÑiü¸áOee[ØšfzZ“,?w 9pø³ÚÇâÓhs?Í^Ķٿ‘©Ìˆ±Ä_%ÖÞw²ûBM”,¼| •Pú°¸½Âó†Ü–¥5žT¯çö¢ó¾õ.òf™¿\¾Ú”M úýûUE•3H«d;Φ­Oj4ÒfJëj{Iÿ"|–û¨’&ýÔ¬E;PjiŠB•nÜ$ çø|zD^񴔢 žÛȤ(/ìp÷¯Lß9¡uT§a©e©¤EµGí‰Á/õö×ñ:Vdße‚/áíY¿Á8R¾“J.=¾Rj©•ùiª†˜1¬Æÿx:Ýíð,*Ä“Æ%,n¾1ê ƒŒf%ê-Müm¯5$™pŸ³ºèW!2«Élj:£§á!êåUŽï4Ù@£_H;»ý èÓ@óœ?;™ejã÷¸QÈ~—æG±éhSë9{c”æ<÷¦âžÅQ óZ7L,_ÏwOÖÌ“,¾•}*2áꨗRB;Œh¼ÿ4¬mDÕbVˆÂ’„¦îd©0$«ö€ˆCôá*4­#Tl("KªhÓ„¦ZÓ+´HÇÊõéÇè­³ÍWäâê¨'â‹nÝ {<¼i")~ÕÐeQÖUÌ£9›*¸ÆíU(æ5lòÀ¸ü7BßÛdLÇL¡ß‘¡šº‰ãcÄ¢^×oQ&´xÀHœ"$ÀÓ´ Åkoê\R ¢|ç©þÀ­!d*é%,fóÓÜãxeøå¤uO²³±áç¸Êü¸´+JŸ†äž9[ÒjõvïM¾¬k¶uäîìÕ6:G‘ÎZÀdÎë~Û¨A´gWSȧȟ“³„q °–Qów*2±È SC‚4³áâFö˜Êíû]i,s_¾vå'Sin´ÄøàHQwABX[ŸáŽlõ™q> Ìb/Xa–x pÀßµm1uób.µ¸+’=ò¨ ] °(}¬ Çïï*+GpÔó¤ :ž± ‚öàåö7tø׉o$ƒ‰cÂ’Wø…òѯX6-ù¬¥C¢<”Õ ã^y܉fm§¹vÀV´7ùYy”1£±Ëås^Ñ£ÍRïÎeÔÂB½û×sDÃ-Å·s_¥&h•¡ôJo—Ù0‹YHUPä"+I öͲåA‰í+£= ޤȸãH‡öçðíÇ¢YM„©óz8½Û ¥_ Ìžº >kvvÊéy¼I $Ù,ÔǨÎ7ŠÀçšxñ k¬+üf],#ZŠ!éP׫TÔmOA¨':gîíÔÇУFaôŠî4×é4×Ý>r ¬Ù¢Ùx_`å2œÛŽÌâC¡D0;¥Iô$qi#2O^œñ@Ô;ÔlxZ”7,JJùï¡BG|_„ȱßåšÛ™´8³ñîëÓ¥ßçf¬¹‡T\nKæQü€Üf?Œk=PÙ*ïùÅgïÏùxe\hv:ªâáÖr©÷g¨ÀZÎ28 Ñ”‘~ Ú83Mk.[!צÖÎ{г•I%ÆÇDŠg¼9´JÚŒ-«þ(ñ˜ÿÈ1‡Z _þ|y’öƒN°? ž1­¶¢ßƒöœÝtûðüÝ8¶wMKµ‡pm—7 ¨‚7|ÂÒ{]åå2W.KG£óIQ8,iQ :)[˜ï>Ä^$ `0¿÷ˆµšÎºÛN+â£mÝ_ˆt‘ƒ+ÇQ6©¨Òаjs<ì,½øtöã‹ÜI¦"^}\—ä+´´­þÐÚ­ëTÆT…©àn†àÿ'I ¶õ']$§\Ô²öLD¢¿˜vdµf+bíš4òÎYÁÁ#qkô6=É` ¹Š!ß/iöí±…òÖ¿ÀfÃôKû8E~uRm³¼ø³$ÍDcãž&øŠÇÁÕŠ©R°b¹ßªÉÛ9&RÁ<—¦_b„W*—2Öä^á{oöP±{/-2ä'ñ©• ž™Þµ\u‚Eí@Xß׃oçBx[ G™V­Aº1/Ä÷r ÝÙГ1¹Çz*Åлél 4r“” _ýK’tˆtTló(ËZÅÖu´+¿DKff-¹O£zw¹ËEïCÑ.²‹]Æ-蟴‚¯jÝDTŒ7Œèâ™*s=#–Î@èõŽÜ€^†¿ÓÆðÆÑYcåù”džKµ àÄ9©ÎÄ!/Ôhª:Œ1¸¸+OøVœJóäŒ2ýoÈؽZè‹X™$ÓHÌÂ;`äê«)tŸŽ9¬uëÂÃjˆÉlgžkC@G"óVÕµˆy‚Äqƒ¦s­F\AϼŒÖ€×åÅînÆú%C‚ÀcÁЂ͂WÑì\êí¤¢ŽMK `w{öúzâ *Õ$ŒÐ¦y´-)E¹oP=ØAd¹êm³,5ý:—ˆ÷÷9‰>ìí]Æ q@ž ¯£ ð÷œª3iÖ2ï‚q:‹D Ÿ+(¤‡½VÙØÍÜ!`Kà¥5jý 6AXÓkùw‡ªjjAΘ†}‘oÒ%áåº0 'Q¤;2Â"”°[ .¹>Wè…^Y'Šî&ox(öÜòëOí.'^ÞåÞ YCY±† »Ð ?žTqûI‹òŽóJM‹Îh碑UJ"º éþeèâ–sȲ´j‡¸"‹O°Æ£ÏT:=&NÉhU &:‘.ç¾kÏEŒ}YèÁYS)äð5ÉV¦Ã¦ú6xL'/ój²jB¾²DóÁ&ÂNüòÄ–›ÅDý:1õ+Ë´ÿøÐ2«Òˆð•j³¼zk]&¦*‹ |^0“¾‘‚?<p('¯. p/˜ˆµé‹ fŒK²Þ |VtÂ…¯šü!\tÈÁúæ°Íµ8éL™[XÝ$›0Ó‚V²¿õÚ<H…·é([a§ ŒGy³¬$nœ5\ǶBýƒØÐRŠ6¥À^ T·_È‹_÷l‹ø÷ÖhY~+3MOmŽÔñÅ.©8èn/Ž,¥"ñÌ÷;9¡v¸…¤¦Ñ E¾“0žc·PGÓV@æ*Ó-0@/‘-$¸yªx‘ŸÜšF¡V±ãÄ™¦<ûÌÓ½¢½y¤X \5†XA‹D‚w?·áRH¸eÌQ’%5SE¿¶ }B‡Â¼ß  ÀÌ_f`Žv+š¥N2ÍX§äËqÐx=kRµÄU©F’àtŠíG«]MnJ°]#H™çý~Þ¦eÇ$- R’¡fgÑ•Ôé–GŽ·ËþO¢Ýã%~Š+è§•y­ôäé‰å/ÐË•SA¬óEàâð©_| ÔyHˆ®+·uñ!K.8:ø°¿Í¸à9á3G—nµ ,Ûp—YÄF~qúm:ˆ‰ŸÃˆŸí¬(ñ@f þ<¯6Ž×_þ¹^³;E¯„z^LJBþüäKf=j¨¸ŽC¼äq‚òŽ FNf‹¥åçâ¬_ºÐB… r’­È|Iƒ”ýÍÞºk‘)t¬#g»_…ø™T•S²©i:ÚÑ—4ôG㪥˜I¡§™Wj窚ÄÈz*^ÿÕ»äO¥ñv’¸+g5šè\Ò¸%“mœÖ¦iD\>îw­0Ì&I8¸¢{Øð5L¥f°Ý±M¹q¾^ Q(Áž‘ .^'ZFyù©h¸³H­(pN¶ f‡ôHÑé £¹’Ì5Ñâg Í ]PSÝAq¸8ý‡- )ÚhÞtTš¦ëÁþS®x·ˆÝÆ2χõƒ£w-ÊdŒŠÏØúK?j•vw¨ÜËŠÐñ( ãMU@µK¾¾Ý``­þˆº[ºÑÁ yr¼jÍŽPÝHIÉ +tb ÛÙ³Dß]*BÅjsÚÎC€1\šÔ±« šðAfâhQA»Bì:¹æÂ Ñš*—iø—[úSˆxìë“>üù ¡ÖýØ\&¿¥¶Fé:õìhU ååô±Öz8ö§»Å´ÉuçìØkâ²~TX=믽ºÕ7ÕÈDz›VOb"âèK… ñ›+éçê›L+¯}‡ù ‹hl}é´ª¼"zÏM‹ÎŦÜÙ/ÿ¼çœÝ7ý°q14{È«¼âæ˜LcUÝUÆ3I´)Ü`UàîÌÝzc™>ªÖ ú%š†«`]ÍÈæ¿JÜ«Ñ?Nø 5ÉúÛ˜X_4t¶}+H¯¿Æ`¾<,Ì…±ÿ:ÕÐZ'ºÞ²µ¥6L¡…žK7ŽùÖª-Á–®‹çôîKÍ,¶ÄX¬í¢´uH§´Šjœö[\%—¹¯¡³ÿÎ%Q¾(÷€Ù±þ®úz‰ìðÝ'Äñëo›ÎânS7BrŸ¶È“*WBœ¸dý@ Þ:L Ø?Üý‡ÉìÖ}ÍVVzÑ|“šœŒÝZfâd æClgpˆÚ•îI® ŸQªfÿb}Œ4_ýTâDƒ]„LK:?kîSÉßøsÿÛÉ ç|â: Üï=¸x¼;é?óóþJƒˆÃ¯!<¡pµõÓZe°Ð†rRÐIbíêG€m\ôyú”`–´S9ƒ$”dm-Z@e<³É”Xš uΜãVìÍ¢n$Âïµ8V÷nyW/¿ñ=ʸÚ% à<æ!ûó2áÏcÎ o²ì…½ø®^nçäºêbÅà'L3J‹¦T2«¼À©‹–¼}V¾iæRxJ lÅtòз´Þ†Æ¤‡9D²ƒ×ø|ÞŨÙZÆ4±ƒÂClh׈ys}o¯s—æ©é0£¨Éf+êM.z•Ö™¬,©…Î3áv&o1ž£öU•ÉO‡ÓeGÿáÈý§0ðéÈ—{,´E‡gS½su*{¶±î9L4Ÿ­M8É‹d endstream endobj 983 0 obj << /Type /ObjStm /N 100 /First 963 /Length 3511 /Filter /FlateDecode >> stream xÚí[YsÛ8~ׯàãnmY n jjª'ŽÃ“ÄNâ™Td›±¹#KŽ$g’ýõÛ 4O‘´ey‡TY ¢¯¯%{'’4ñN%Ò:¸êDzW“ðTbÇ&Ü(œáî­‚ŽOç0×§Ð::8(Wvä½L„F€/Gro©Îq Ai`Ÿ¦‰âÆbO$JÚÐS‰Ò(*MM¢¬=—h)P!ž&Úè‰D£²ÐS‰‘\bÏ$FË0æcµ‡žH‹ì¡'k„JlâDj)ÓÄIÍ$q ´3*qFÈ‘ñ0`5–‰‚Ôi,×cC-Ípbó´58BžE š£4ÇQ¾5gS?Ès` €Æ±ëO¥Æù·!MïÓÏZeÕçÄ«$ØmS Z‘Ͱtu0j4Zl­ÄÑ0Oº€‡@ Ð#, ë|SàéI‚ð€MôIˆ3C »J®$Õp­£R·)Ž Ï‚ßÊ;»«Óàhô\ôEN —ÀOðÒc=² 6uRSˆÆŸCuà['q$¶ÂF߆§XÛr`ÏUÈï­X*¼‡MpŒÛ1N âÖAPիϪ-•Ⱦþ¬¦`—j}±¦Eäª,ªÛ8‚ºMC8D³pÆ¥cS˜S&0Ošè†ÊNƒ¥ 7ôœÆ-q·p‚œøã<¶ØR<|Lðmeh»Wƒ 0#oÔú5ÿ…цWEŃ\¡›³ã é1®dÌMÑ!µ§Ñ€Ømüùç>ó¸{GÌ0 í1* 8 ¾¸Kô‡Qaœ2Qé0ÇȸÄl2]èÓxàû&REž¾â[ç`ô q®ÚPžÓ:ûéúÿa˜l—Ô1éüLé?SzgJ\p¡c%ËÅŽlpÄŠ=¬H¶k‰cl•ÀÀî:T¸±Å{8{Ãsë=æÂ)}*(hÓPÙq¶GÈàà¥ÖÁé8œòÇáœl±Ø XæCa¨©ï¤éÄ@ñŒÇ|æ¡`8ý êÆÖ@õ^bàxºEò®LÄpyªGKóq´°?Œzl㈗–fTsãs¥Qߊ4žE„b?´ŸG¿ü2b'?n²„íÏg«§Ùò|‘߬æ‹Q¸?š\ÓÃý·>þcïõ“S.àÁtr¹LTœñäÉü{òiGËd'’á|‹qýyÄv—çÙl…/@Florså—Wpë̈¡|¶Ãñááj2ÍÏwg—Ó,IGìx•]À×#vJDnÀãj²8ÎVÉߨ.{ÂöØSöŒí³ç쀲—ì{ÍŽØoì {ËÞ±cvÂÞ³ì#ûMØ;gçóé|íõõ„]°ŒÆì û’ËØ—ùí‚]²+–³?Ù”]³›å³ŒÍÙÚv“-òù[°%[fß²[æßÙŠ­®YÆVÍÙ-ûÆþbßÙö¯l1ÿ{„f?ƒ<œÖÓäÝè×_ïõÁ»w'ÏßÔ{Ç{<íÄš+„:¼Ô±M¨á Ñ„ZVP§=8[QƒYò:Ì€ °`rd8,ÁÐïMëì&Öí½qpô¬{}ØcÜŽ…uÊÝHr(v‹;MŒŽmZä7±èù›Ý£“ÓhQÏÒ¼°H˜G²Èè ,Â7ˆ›˜ôæíá«“ƒ`’ï¶Hø2õcùHmf‘ÜÄ¢“w/?þö,z×u*-,Jý6•ËÊø^{ֳ׋üu ìXŠ“¤±³ÅäüÏl5;¬Šþ"ä±v~»˜O§“E™æ²ë‹ÉòŠe³p¤‡9 ˜þ¦U¼úqs .gÿìI…“E6 „^Oùñ+ûz;_egÓ0¡¸‰sÂ]5cF½Î£öUn]NQÑž »–cÁk%ÙãÓ·'¯Ÿ`<ô¸,\šG ‡ð>)7¨õ­iÀ=Îùz¿-ª ÀòøÑîî‡÷/ÀãW}+Êyœ ¹UŽð%†÷[Rír XLq-1ð–¶ "G ;1n•åÕ]ˆn´ì¼:݈žœôa*0KI<~[ü¦)ç Hñ¶„TÑé@–Šp CˆžA¾‰ë²ž†Î ÁžÜQEfkÕ#|·³‹l±<Ÿ/²Þò —m^ûû¿¿<Å ãø¸72i?ÆÞjߘx{Ÿµíz Õ®dÙ²n£l÷íÉþÞ{´î÷ÞÔåM¾Êƒ³¨®ÌƒEø°½Y¥½Qrv ©‚ _œO³óùÍEÛ¾Íóñá³c¬~OúëC]æõXÕ”,C|ç¡ .bú¦‘~´LÞ(•>;==zº‡&÷.{W½–[­ú‡•&÷(L®!-.'³ È®çyŽ¡p{û«|z‘UI7–0U3IV–3”\å|½LYöý|:¹nì.Ù´XÏQÓl¹ŒûèíõØ‘_Îî,uàb/¸™Þ.CrË–«T+jžíË®äØ•7Úf_üññè8D[Oéc(Ø”€@q[Û@áÓUÛZ¨ý§Ã+[‹¨ÿç`Ú.ŒDÏ. ~¼=[…[>™,3|²þZ¨uá';È’íç‹å ÝžàæøjB7\³ùÅêj~çæžÌßÏÀ  Pis}ÖÞ´rm…¼m(”V 9÷ µ_w4õ _‘´Ò®¦Þ”úøÍÅ·ßM¬‰÷ïÓÍÅ·Þ#¬IW÷7þÒ[gþ5ékÁ‰ ­ ªf¼|„Xhž9×ÔY MôXMQCƒ?‚:í\[!žÞO]!ó‹wí´¦ÒZ¸Jß—Oœm«$7W©}–XSh-‚±R.Ru}#¿µ«ÿ5}ÖcZÖÒµ~H·Šó5ñwÅpÝÆCl®P»tn+$ÖbX6ð¦ˆx„€iUWkúˆûëãî£Ï›Ée¶„’j~‹ÚîXŽ…ßeê—ùÅ2ù°NâI ·xÓo"…‹WVÌç *L”¦+1Õ‚®6^ÜBˆñ‘‰%Í- q$Ä‘èÊ ñdAü´¤kd®b^„ë–(NÌbÑ…¿Ê +K"·"‰™t5t%Ë4Y¦ÝFBTCˆ!¦–„‘/ùBy²0Âù0!:Ö)‰&ìuÌ»pB4Á¨…ÙBaŽ?דV$L‘0n!D3MÌãz€+1·toíBYâHùB“/4…¸ÞÆ'†Ò‡!Ÿ˜2»Da†|‚_=o"D7„ˆ“‘$LÆo(¤ ùÄl蓦ò‰!Ÿò‰1$Ì’°»}¢û…Äœ„¿( Wüq?^½Méz'sÙ0ÁÔ¹Ç7¤á_bb¤«/r­xé·¢HU+çð/1–éž–¾IïÌ'ÜöJ1ÄÕÐŽaükÚùJe´–~hÑÿv»šæ3d¶büo…¨îʼn,iáÕ‚6_ÁQY aºT‰WÆPÙùf‘} ÿÝPß²‰<-ɹ&§:ʾWJ5™2“CÌ}¿CÌ:5+êk`Fß]Ìý†k}W©‹ RëAjÙЄwñª Nù/AßÕ¯n½J¼…·Ý¼ˆº`áMEݸD”4áµÚ®R,Iµ£ÚBJà…óCB$¯),Z?,‰¼œ«xµÜPPG^®Ë\§*j>DmëÀ g»xUÀ[;ÈK7xuée+7X9È«õ]¼*´âelƒWÚ¦BÛ ¢mdƒïâUao±× ìMö¦Â^b¯Ø›.ìu…½Ä^7°×]Øë {5ˆ½j`¯»°Wöj{ÕÀ^wa¯*ìÕ ö²½êÂ^UØËAìe{Õ…½¬°—=ØGjÙ…¶¬ÐƒyE4Ðn¥²BÍÊŠ¥^¤2ÞÎe¢òŠÐC2»[aM‹Wå•ÖN[R¯.ë«V´6Ú–ì®UT;«àƒ‰Ÿ7üP IØñú6 šuÅŽh‹¬Ü•ö¸+ á]Ë¡ÚEkÿm•e±C°njÌë;$ilÚ2+µöéRH‰mêÒA¼µ3ó‰ºk£ãÕÎÌ‹ý³‡:­™Ë½ïâÅK^ÅþÙÍ«xÓI¼ºô*òRƒ¼DƒWÚÅKV¼Ò!^¶îÒBË&¯bÇ^ÅnÚÃK5x‰.^ºâ5ˆ½m`OZ¶xUØ›ì‰ZuP› m£†"P×5E Jå¡fú"DŠ w(òßå endstream endobj 1060 0 obj << /Producer (pdfTeX-1.40.26) /Creator (TeX) /CreationDate (D:20250331102844-04'00') /ModDate (D:20250331102844-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024/MacPorts 2024.70613_1) kpathsea version 6.4.0) >> endobj 1028 0 obj << /Type /ObjStm /N 43 /First 402 /Length 1849 /Filter /FlateDecode >> stream xÚXMsÛF ½ûWì1>dÌý^Îd2ã8uÓIìfb»9´90cs*‘’rì_` X”v­æD¬€}À° µÒ)QiƒAZ#¤ð,„*àgã„–žJhï£ÎX O#¬*áYW€^9áœ?’J G ``Tˆ,ÀR6Jô.J`©¼F 1ƒD v™P¢¸¶ô(±/ìH° 2î€(KQJˆ—…¨¥E#…Rí r¥=Ú-” ÑÎå¢c…*ËhLUÐàÃx¡­‹(Aèà0pS #‘p™1FGI ã£Ö*a LC¹±²À˜!“V–˜k!W˜¤ouàÃza­DxkˈW ë”Þ5íÌØmh÷»jhQWßUM×ƒŽ‰£yõ}Uï'¶D€‘\qBFíÇú):HFÏK¬“ÍI¾ÎZÀ†içýfŽŠIÑ êW|ÙŒ±JRú£˜Œó®ß-;Øñ´ÉØ}h†±ëŸÀˆßÒ£Íj5y òE£‹îa²Iß69† Ò ¥¦×ðÙ…Ao30ër.TÎ⯪o°øÑ±E»¨ïÇ)Æeýˆ‡$<«0é][­&uCg«Æ~³±Y,‡²Œ®g5¨{ì˜2u/²ÊC¤Yy¶šñU<‹öNÊt¬uFùµ§vRJ¥Zê=Î×<9lþûåM ¢¯£ú}·Ø¬á¹bˆOÍ¢n‡8sÈý‡îç¼G§Ãñµëÿ‰ I¢rD$©‚óØwËÍ>«ËnŠª§¨±áˆ~ïª>ª/ªEßaiù ”ëêƒÔÔͰ¨W«ª­»Í°7=Ê—læåâÌE·l~<‹© ”M2ñ¿<28I2.¡<ý4OûÛX+ —??÷Ým_­×„ñ³ïðIUæI áñ¹™Ï9 ‘©þü}Š3lÀª©Vh¨ÊÔŽÖCÝ6u;½æ)ÓEjÎ'ò¼Á·‡4ÉÊ“~#ÉÚK–ñeûíþˆ3@çBƒã[-¸ÏljAãu¯}´O-a@Öú¾iÆíUsKÓêXMã[•™Ô]?Ý×ËúGœIÃý ë<ÚÁÎÆ¯R™6zh&¶ËØgŠ –Íp¿ªžðhб¹Šß ™àOÀ«ºêwÓ‹ÉPî¯ëº{JÎEÕV·1§øÒu‡øÏ‚~ "!}36«f|JN}òy•7Ìÿüìåc³„½ñƉÅS$ ŠÍBþªÀ¤°ôŸ9^¦’àY,°k“ÿã7ÿ”g\ÃÁÎppÓ‚é–•—ýb?üŠ|öÄñŽ×p¼–Se9šôïdþÅók5±LÉ2%Ë”¬ËVà0îûzÓx <¿¨‚ã&NΪ±Zu·x;u[£_Æý¹±{‡ù}UìÌx‰LZ·54qr3ÔlðÿâX# endstream endobj 1061 0 obj << /Type /XRef /Index [0 1062] /Size 1062 /W [1 3 1] /Root 1059 0 R /Info 1060 0 R /ID [<1925447E0C3EC650E3806D417DC40E55> <1925447E0C3EC650E3806D417DC40E55>] /Length 2515 /Filter /FlateDecode >> stream xÚ%˜kh]Y†÷·O.mš6ÉÊ=½$mš4I›6½_ÒKÚ¦Mš¦×4mÚ´MÚ‚µˆ ­Ì±ˆˆ3Ì€à VF\0L¼ Œ kÙ ~^p  ŽŠEtP/`Õó¼þyXëÝûœ½Ï~ßõ­oŸ,˲ÿZ–5d–å*¨>›åYVg 2­}¥2--unÐoY×ûÒ8¥rË–VÚF¦Õ Ô‚e`9¨+@=X VК@Í ´‚6Ð:@'è«Á°¬Ý ¬@/Ðýõ~° èw ‚!°lÃ`+Øv‚PeYýô˜¶ñ£×î M€3à"¸šgV^ ºÁ Ø vƒýà8 N€3à"˜×Á­ Šu`Ø ö‚Q0N>[Ì®[ÜàþvÝ`Ø öýà‡ÀvËÚ'õ³æY>œZÐ:ÁZ°œ« 6‚;|â0¿w2Ϫªäï0†v MÆÇЦДˆã`í,š¢rœD;‡¦ ñ`ë&ÑfЮS` íšRwL£Í¢U1ź³h×ДØsà<ÚݱìÖ»ššÙÏi¤õQ J–}â˜4­j°¬Ë,{úÛ:ZÇ]amY¹¯·ì™?éÀJÐ,ûb“4-2^–½ø´´f@ÆË Õ²—æt€Œ—ÛÁZÐeÙ7ÿ£ëÁ:Ë^ÿƒÉf¦³¼Á²7îé”^À†Qî³,}G9-¸ò€e?|Sڶ̟Քݥ\ÙÞþ©¦;›My—eL«é Ø{Êû,{üQw´ì/û5=Æ,û i: ÆÍ²ešž§Ìj¦é8¦ÍŸÑ5†™^lhåóf­:ù PQ½lÖóÿ¯Wíœ7¼«)e³ÐhÁläÓ™åÕ{˜”ËŠÝc?—†ÝE ày¿¾˜\Ô˜Mý^çQú -?6ð§‹€¿… ™ª”ÊW½Ù¥^} k ô  ](TxÖšÝý›ž^*<}@åÏ :Š¢×ìS»õYÝÚÙg~«)±ØÂlc„ÓÅv@ûQl3{þ':“ º‘bÙÃJ£/)˜Å÷tê<ÆÀa³Wku žÇÀ8jöúS:€û&“fo]ÖèâZàtQqú;uò ÀÕ¢bò¯,M¸`×-æÁœÙã·u`\7ûë'5e3,Íž<Ðô¥J&ß©ÏoéºÛ-ÿûMu2Õ dyý{šVå Æò¦»ÒV€U Òÿv~IÚJPhv†h°¼o½Ž6vÐlùH´Õ ÃòÑ:ÝŠt7XcùÄ=²ôX>3¡ézÐz-_¸/m#ý–äóÒ6Í`Ðò{ÝÒ†À0бÅòm:° låv2Ò¾Py϶êè^°Ûòç¦5Õ¡ò¿Ïò/ì’¶£–¿ðŠ4ícà°å_~"í8ŽZþâW¥©CÑ%O‚qË¿þœ§À„åñº´I0 ¦,écÒNƒ³à8cù£Ç:p \´üµšÎ€+`Öòô®4íº»]s–û :pÜó–/½%í:¸ ÁMË7¤ lrݲüÏ4ºc¥66›<–€Yþ怄Å@×—ëáŠ)©HÌb R±ÊJö+åE½6fL‰ôÞ±´²;ýxì.®´çq p±®Hàb/ W‘¬Å~@¤"1‹ƒ€4E·réF"iŠ$,n„:’«ˆÉ‘‡u»ä*Ò[Dâ‰T$'’¦¨îÐD‚‚c€ Åq@J"ɉ€€DB§Ùˆä%ž¤$êuä< /ñ" ‘¼ÄYp•8C$ qƒH6âM ÷ID¤ªDšÙPU Ô€ZÀ¾–ãäf+Uÿ ³ÒØ÷04Є ¬«@hôR!€fÐèë\h ÐÈ:¨°ðöÈK “Ä'ÐUú«Ð 6‚>Ð6Zç0x‹ ¼¶öŠ0 ¨×–0¶ƒ€î0Ðb‡Ý€·˜°Ðb‡ý€·˜0 h±Ã!À[L8Ô'ÔˆpŒzï@³xc “à Ù§Á48h¶Ã9@k.€‹€·˜ÀkK˜”‚p̃뀗•@Çï3!·R÷¼Üš‹àñ¼¶8G¦Üs@œ08apÂà„Á ƒÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇxÇPÇxÇxçõ+\³Ò¶çeèU+M?шD8‰pŒ÷y+MýKƒ“×ëkf5?®J­74°D–ÃaX" K„aI#aXÒ[ +ÍþQŸ­·ÒמÒh¥•Ò}VYé74j°Ò?ÞѨѪš[4j²ªû4 VõÝ_jÔlUOjÔbÕ#5jµêé74j³ê7hÔnÕ_™Ö¨Ãªßÿ¾FDj —ôvŒƒKúbÔjN¿–ñwG=X VК@Í ´‚6Ð:@'è«þWY Ön ÿUÖƒ  l} l` YÍÔÊ 3 Ùÿ†5ø† endstream endobj startxref 414559 %%EOF readline-8.3/doc/texinfo.tex000644 000436 000024 00001303351 12631305505 016201 0ustar00chetstaff000000 000000 % texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2015-11-22.14} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 % 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 % published by the Free Software Foundation, either version 3 of the % License, or (at your option) any later version. % % This texinfo.tex file 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 this program. If not, see . % % 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 Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % http://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % 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. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % 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, 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]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \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 \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \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\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexsp=\sp \let\ptexstar=\* \let\ptexsup=\sup \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % 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 \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % 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 } % 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. 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}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % 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. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Output routine % % 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 } % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... % \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 % 0: top marks (\last...) \noexpand\or \the\toks4 \the\toks6 % 1: bottom marks (default, \prev...) \noexpand\else \the\toks8 % 2: color marks }% } % \gettopheadingmarks, \getbottomheadingmarks - extract needed part of mark. % % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\lastsection{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % Main output routine. % \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. % \shipout a vbox for a single page, adding an optional header, footer, % cropmarks, and footnote. This also causes index entries for this page % to be written to the auxiliary files. % \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Common context changes for both heading and footing. % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \def\commmonheadfootline{\let\hsize=\pagewidth \texinfochars} % % Retrieve the information for the headings from the marks in the page, % and call Plain TeX's \makeheadline and \makefootline, which use the % values in \headline and \footline. % % This is used to check if we are on the first page of a chapter. \ifcase0\topmark\fi \ifx\thischapter\empty % See comment for \gettopheadingmarks \ifcase0\firstmark\fi \let\curchaptername\thischaptername \ifcase1\firstmark\fi \let\prevchaptername\thischaptername \else \let\curchaptername\thischaptername \ifcase1\topmark\fi \let\prevchaptername\thischaptername \fi % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi % \ifx\curchaptername\prevchaptername \let\thischapterheading\thischapter \else % \thischapterheading is the same as \thischapter except it is blank % for the first page of a chapter. This is to prevent the chapter name % being shown twice. \def\thischapterheading{}% \fi % \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}% % {% % Set context for writing to auxiliary files like index files. % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \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. % We don't want .vr (or whatever) entries like this: % \entry{{\indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen % Main part of page, including any footnotes \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Argument parsing % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % For example, \def\foo{\parsearg\fooxxx}. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. Also remove a @texinfoc % comment (see \scanmacro for details). Pass the result on to \argcheckspaces. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argremovetexinfoc #1\texinfoc\ArgTerm} \def\argremovetexinfoc#1\texinfoc#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % 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. % (Similarly, 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 - define a command taking an argument on the line % % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} \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\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} % 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 environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, 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 } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % 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 % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \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 % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % 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 \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 % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \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. \addgroupbox \prevdepth = \dimen1 \checkinserts } \def\addgroupbox{ % \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 } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \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 % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| 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). This command % is not documented, not supported, and doesn't work. % \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 }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \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. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\active% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other\commentxxx}% {\catcode`\^^M=\active% \gdef\commentxxx#1^^M{\endgroup% \futurelet\nexttoken\commentxxxx}% \gdef\commentxxxx{\ifx\nexttoken\aftermacro\expandafter\comment\fi}% } \def\c{\begingroup \catcode`\^^M=\active% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \cxxx} {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} % See comment in \scanmacro about why the definitions of @c and @comment differ % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % 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} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % 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. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \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 = {}% } % @refill is a no-op. \let\refill=\relax % @setfilename INFO-FILENAME - ignored \let\setfilename=\comment % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newbox\boxB \newcount\countA \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 being undefined. \ifx\pdfoutput\thisisundefined \else \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. % % See 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. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros using ideas from pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. The dark red here is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. We use % black by default, though. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \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. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use black for everything. \def\urlcolor{\rgbBlack} \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #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. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \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. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % 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 % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#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|\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 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % 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}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defsl\slshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \let\tensl=\defsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defsl\slshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tensl=\defsl \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. We don't % bother to reset \scriptfont and \scriptscriptfont; awaiting user need. % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % 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, e.g., 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 \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{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #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 \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 \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{17pt}} \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 \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \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}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % 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 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqkbd \markupsetcodequoteleft \let\markupsetuprqkbd \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ifx\next\.% \else\ifx\next\comma% \else\ptexslash \fi\fi\fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \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. % \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. % \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 % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % (But see \codedashfinish below.) % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi % Given -foo (with a single dash), we do not want to allow a break % after the hyphen. \global\let\codedashprev=\codedash % \codex } % \gdef\codedash{\futurelet\next\codedashfinish} \gdef\codedashfinish{% \normaldash % always output the dash character itself. % % Now, output a discretionary to allow a line break, unless % (a) the next character is a -, or % (b) the preceding character is a -. % E.g., given --posix, we do not want to allow a break after either -. % Given --foo-bar, we do want to allow a break between the - and the b. \ifx\next\codedash \else \ifx\codedashprev\codedash \else \discretionary{}{}{}\fi \fi % we need the space after the = for the case when \next itself is a % space token; it would get swallowed otherwise. As in @code{- a}. \global\let\codedashprev= \next } } \def\normaldash{-} % \def\codex #1{\tclose{#1}\endgroup} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \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', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') aka @url takes an optional % (comma-separated) second argument specifying the text to display and % an optional third arg as text to display instead of (rather than in % addition to) the url itself. First (mandatory) arg is the url. % TeX-only option to allow changing PDF output to show only the second % arg (if given), and not the url (which is then just the link target). \newif\ifurefurlonlylink % The main macro is \urefbreak, which allows breaking at expected % places within the url. (There used to be another version, which % didn't support automatic breaking.) \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak % \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% look for second arg \ifdim\wd0 > 0pt \ifpdf \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \else \unhbox0\ (\urefcode{#1})% DVI, always show arg and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretchamount{.13em} \def\urefpoststretchamount{.1em} \def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax} \def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax} % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @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. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @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). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @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 \null % reset \spacefactor=1000 } % @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 \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ 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 math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot % have to provide another name for sup operator \let\mathopsup=\sup $\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 \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % for @sub and @sup, if in math mode, just do a normal sub/superscript. % If in text, use math to place as sub/superscript, but switch % into text mode, with smaller fonts. This is a different font than the % one used for real math sub/superscripts (8pt vs. 7pt), but let's not % fix it (significant additions to font machinery) until someone notices. % \def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} \def\finishsub#1{$\sb{\hbox{\selectfonts\lllsize #1}}$}% % \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} \def\finishsup#1{$\ptexsp{\hbox{\selectfonts\lllsize #1}}$}% % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if % FMTNAME is tex, else ELSE-TEXT. \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} \long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi } % % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } % @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. % \long\def\inlineifset#1{\doinlineifset #1,\finish} \long\def\doinlineifset#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \else\ignorespaces#2\fi } % @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. % \long\def\inlineifclear#1{\doinlineifclear #1,\finish} \long\def\doinlineifclear#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % 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`\\ = \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: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % 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} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \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{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. Define \ensuremath to switch into math mode % unless we are already there. Expansion tricks may not be needed here, % but safer, and can't hurt. \def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} \def\ensuredmath#1{$\relax#1$} % \def\bullet{\ensuremath\ptexbullet} \def\geq{\ensuremath\ge} \def\leq{\ensuremath\le} \def\minus{\ensuremath-} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @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 } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the European Computer Modern fonts (cm-super in outline format) % for non-CM glyphs. That is ec* for regular text and tc* for the text % companion symbols (LaTeX TS1 encoding). Both are part of the ec % package and follow the same conventions. % \def\ecfont{\etcfont{e}} \def\tcfont{\etcfont{t}} % \def\etcfont#1{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = #1ctt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @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}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % 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\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\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 \fi \let\page = \oldpage \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 } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. Because % it is always used for titles, nothing else, we call \rmisbold. \par % should be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rmisbold \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % 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 {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make \makeheadline and \makefootline in Plain TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @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\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\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 % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks % These define \getoddheadingmarks, \getevenheadingmarks, % \getoddfootingmarks, and \getevenfootingmarks, each to one of % \gettopheadingmarks, \getbottomheadingmarks. % \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % 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{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapterheading\hfil\folio}} \global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapterheading\hfil\folio}} \global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % 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). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \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. 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 % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \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 \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 % % Try typesetting the item mark so that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @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}% % \ifinner\else \vadjust{\penalty 1200}% not good to break after first line of item. \fi % We can be in inner vertical mode in a footnote, although an % @itemize looks awful there. }% \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % 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 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % 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 do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #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{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \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 \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % 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. \everycr below resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % default for tables with no headings. \let\headitemcrhook=\relax % % 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 again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \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 \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% Reset from possible headitem. \global\colcount=0 % Reset the column counter. % % Check for saved footnotes, etc.: \checkinserts % % Perhaps a \nobreak, then reset: \headitemcrhook \global\let\headitemcrhook=\relax }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % 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 \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 \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. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @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\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \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 % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \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 \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. % % 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. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \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. % \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 \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-\normaldash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % 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). % % Unfortunately, this has the consequence that when _ is in the *value* % of an @set, it does not print properly in the roman fonts (get the cmr % dot accent at position 126 instead). No fix comes to mind, and it's % been this way since 2003 or earlier, so just ignore it. % \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 } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get the special treatment we need for `@end ifset,' we call % \makecond and then 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 executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % 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}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @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 \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named IX. % It automatically defines \IXindex such that % \IXindex ...rest of line... puts an entry in the index IX. % It also defines \IXindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is IX. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % The default indices: \newindex{cp}% concepts, \newcodeindex{fn}% functions, \newcodeindex{vr}% variables, \newcodeindex{tp}% types, \newcodeindex{ky}% keys \newcodeindex{pg}% and programs. % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all index macros. % Argument #1 is generated by the calling \fooindex macro, % and it the two-letter name of the index. \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} \def\doindexxxx #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} \def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}} % Used when writing an index entry out to an index file, to prevent % expansion of Texinfo commands that can appear in an index entry. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should use @lbracechar and @rbracechar? \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % 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\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % 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\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\mathopsup \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\sub \definedummyword\sup \definedummyword\textdegree % % 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. % Define \definedumyletter, \definedummyaccent and \definedummyword before % using. % \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\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\abbr \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\image \definedummyword\indicateurl \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\U \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % For testing: output @{ and @} in index sort strings as \{ and \}. \newif\ifusebracesinindexes \let\indexlbrace\relax \let\indexrbrace\relax {\catcode`\@=0 \catcode`\\=13 @gdef@backslashdisappear{@def\{}} } { \catcode`\<=13 \catcode`\-=13 \catcode`\`=13 \gdef\indexnonalnumdisappear{% \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else % @set txiindexlquoteignore makes us ignore left quotes in the sort term. % (Introduced for FSFS 2nd ed.) \let`=\empty \fi % \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else \backslashdisappear \fi % \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else \def-{}% \fi \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else \def<{}% \fi \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else \def\@{}% \fi } \gdef\indexnonalnumreappear{% \useindexbackslash \let-\normaldash \let<\normalless \def\@{@}% } } % \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{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \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\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % \def\lbracechar{{\indexlbrace}}% \def\rbracechar{{\indexrbrace}}% \let\{=\lbracechar \let\}=\rbracechar % % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{TH}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{th}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % % 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\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. % TODO: Two-level index? Operation index? % Workhorse for all indexes. % #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 most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% \requireopenindexfile{#1}% % 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}% % \safewhatsit\dosubindwrite }% \fi } % Check if an index file has been opened, and if not, open it. \def\requireopenindexfile#1{% \ifnum\csname #1indfile\endcsname=0 \expandafter\newwrite \csname#1indfile\endcsname \edef\suffix{#1}% % A .fls suffix would conflict with the file extension for the output % of -recorder, so use .f1s instead. \ifx\suffix\indexisfl\def\suffix{f1}\fi % Open the file \immediate\openout\csname#1indfile\endcsname \jobname.\suffix % Using \immediate here prevents an object entering into the current box, % which could confound checks such as those in \safewhatsit for preceding % skips. \fi} \def\indexisfl{fl} % Output \ as {\indexbackslash}, because \ is an escape character in % the index files. \let\indexbackslash=\relax {\catcode`\@=0 \catcode`\\=\active @gdef@useindexbackslash{@def\{{@indexbackslash}}} } % Definition for writing index entry text. \def\sortas#1{\ignorespaces}% % Definition for writing index entry sort key. Should occur at the at % the beginning of the index entry, like % @cindex @sortas{september} \september % The \ignorespaces takes care of following space, but there's no way % to remove space before it. { \catcode`\-=13 \gdef\indexwritesortas{% \begingroup \indexnonalnumreappear \indexwritesortasxxx} \gdef\indexwritesortasxxx#1{% \xdef\indexsortkey{#1}\endgroup} } % 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 \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \useindexbackslash % \indexbackslash isn't defined now so it will be output % as is; and it will print as backslash. % Get the string to sort by, by processing the index entry with all % font commands turned off. {\indexnofonts \indexnonalnumdisappear \xdef\indexsortkey{}% \let\sortas=\indexwritesortas \edef\temp{\the\toks0}% \setbox\dummybox = \hbox{\temp}% Make sure to execute any \sortas \ifx\indexsortkey\empty \xdef\indexsortkey{\temp}% \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi \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\writeto{% \string\entry{\indexsortkey}{\noexpand\folio}{\the\toks0}}% }% \temp } \newbox\dummybox % used above % Take care of unwanted page breaks/skips around a whatsit: % % 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 or \pdfdest 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} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip 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-\whatsitskip \fi % #1% % \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\whatsitpenalty>9999 \penalty\whatsitpenalty \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\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \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 % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 % See comment in \requireopenindexfile. \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi \openin 1 \jobname.\indexname s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else \catcode`\\ = 0 \escapechar = `\\ % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \thisline \ifeof 1 \putwordIndexIsEmpty \else % 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{\ttbackslash}% \let\indexlbrace\{ % Likewise, set these sequences for braces \let\indexrbrace\} % used in the sort key. \begindoublecolumns \let\entryorphanpenalty=\indexorphanpenalty % % Read input from the index file line by line. \loopdo \ifeof1 \let\firsttoken\relax \else \read 1 to \nextline \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}% \act \fi \thisline % \ifeof1\else \let\thisline\nextline \repeat %% \enddoublecolumns \fi \fi \closein 1 \endgroup} \def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken} \long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1} \def\loopdo#1\repeat{\def\body{#1}\loopdoxxx} \def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. {\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 \catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 \catcode`\$=3 \gdef\initialglyphs{% % Some changes for non-alphabetic characters. Using the glyphs from the % math fonts looks more consistent than the typewriter font used elsewhere % for these characters. \def\indexbackslash{\math{\backslash}}% \let\\=\indexbackslash % % Can't get bold backslash so don't use bold forward slash \catcode`\/=13 \def/{{\secrmnotbold \normalslash}}% \def-{{\normaldash\normaldash}}% en dash `--' \def^{{\chapbf \normalcaret}}% \def~{{\chapbf \normaltilde}}% \def\_{% \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% \def|{$\vert$}% \def<{$\less$}% \def>{$\gtr$}% \def+{$\normalplus$}% }} \def\initial{% \bgroup \initialglyphs \initialx } \def\initialx#1{% % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. % The glue before the bonus allows a little bit of space at the % bottom of a column to reduce an increase in inter-line spacing. \nobreak \vskip 0pt plus 5\baselineskip \penalty -300 \vskip 0pt plus -5\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus 1\baselineskip \leftline{\secfonts \kern-0.05em \secbf #1}% % \secfonts is inside the argument of \leftline so that the change of % \baselineskip will not affect any glue inserted before the vbox that % \leftline creates. % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip \egroup % \initialglyphs } \newdimen\entryrightmargin \entryrightmargin=0pt % \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. % \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % No extra space above this paragraph. \parskip = 0in % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% An undocumented command % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus0.5pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% % Save the text of the entry \global\setbox\boxA=\hbox\bgroup \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. % Not absorbing as a macro argument reduces the chance of problems % with catcodes occurring. } {\catcode`\@=11 \gdef\finishentry#1{% \egroup % end box A \dimen@ = \wd\boxA % Length of text of entry \global\setbox\boxA=\hbox\bgroup\unhbox\boxA % #1 is the page number. % % Get the width of the page numbers, and only use % leaders if they are present. \global\setbox\boxB = \hbox{#1}% \ifdim\wd\boxB = 0pt \null\nobreak\hfill\ % \else % \null\nobreak\indexdotfill % Have leaders before the page number. % \ifpdf \pdfgettoks#1.% \hskip\skip\thinshrinkable\the\toksA \else \hskip\skip\thinshrinkable #1% \fi \fi \egroup % end \boxA \ifdim\wd\boxB = 0pt \global\setbox\entryindexbox=\box\boxA \else \global\setbox\entryindexbox=\vbox\bgroup\noindent % We want the text of the entries to be aligned to the left, and the % page numbers to be aligned to the right. % \advance\leftskip by 0pt plus 1fil \advance\leftskip by 0pt plus -1fill \rightskip = 0pt plus -1fil \advance\rightskip by 0pt plus 1fill % Cause last line, which could consist of page numbers on their own % if the list of page numbers is long, to be aligned to the right. \parfillskip=0pt plus -1fill % \hangindent=1em % \advance\rightskip by \entryrightmargin % Determine how far we can stretch into the margin. % This allows, e.g., "Appendix H GNU Free Documentation License" to % fit on one line in @letterpaper format. \ifdim\entryrightmargin>2.1em \dimen@i=2.1em \else \dimen@i=0em \fi \advance \parfillskip by 0pt minus 1\dimen@i % \dimen@ii = \hsize \advance\dimen@ii by -1\leftskip \advance\dimen@ii by -1\entryrightmargin \advance\dimen@ii by 1\dimen@i \let\maybestrut=\relax \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line \let\maybestrut=\strut \ifdim\dimen@ > 0.8\dimen@ii % due to long index text \dimen@ = 0.7\dimen@ % Try to split the text roughly evenly \dimen@ii = \hsize \advance \dimen@ii by -1em \ifnum\dimen@>\dimen@ii % If the entry is too long, use the whole line \dimen@ = \dimen@ii \fi \advance\leftskip by 0pt plus 1fill % ragged right \advance \dimen@ by 1\rightskip \parshape = 2 0pt \dimen@ 1em \dimen@ii % Ideally we'd add a finite glue at the end of the first line only, but % TeX doesn't seem to provide a way to do such a thing. \fi\fi \maybestrut % Add a strut on the first and last lines \unhbox\boxA \maybestrut % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % Word spacing - no stretch \spaceskip=\fontdimen2\font minus \fontdimen4\font % \linepenalty=1000 % Discourage line breaks. \hyphenpenalty=5000 % Discourage hyphenation. % \par % format the paragraph \egroup % The \vbox \fi \endgroup % delay text of entry until after penalty \bgroup\aftergroup\insertindexentrybox \entryorphanpenalty }} \newskip\thinshrinkable \skip\thinshrinkable=.15em minus .15em \newbox\entryindexbox \def\insertindexentrybox{% \lineskip=0pt % This comes into effect when the \vbox has a large % height due to the paragraph in it having several % lines. \box\entryindexbox} % Default is no penalty \let\entryorphanpenalty\egroup % Used from \printindex. \firsttoken should be the first token % after the \entry. If it's not another \entry, we are at the last % line of a group of index entries, so insert a penalty to discourage % orphaned index entries. \long\def\indexorphanpenalty{% \def\isentry{\entry}% \ifx\firsttoken\isentry \else \unskip\penalty 9000 % The \unskip here stops breaking before the glue. It relies on the % \vskip above being there, otherwise there is an error % "You can't use `\unskip' in vertical mode". There has to be glue % in the current vertical list that hasn't been added to the % "current page". See Chapter 24 of the TeXbook. This contradicts % Section 8.3.7 in "TeX by Topic," though. \fi \egroup % now comes the box added with \aftergroup } % Like plain.tex's \dotfill, except uses up at least 1 em. % The filll stretch here overpowers both the fil and fill stretch to push % the page number to the right. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \newdimen\doublecolumntopgap \doublecolumntopgap = 0pt \newtoks\savedtopmark % Used in \begindoublecolumns \newtoks\savedfirstmark \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% % Save \topmark and \firstmark \global\savedtopmark=\expandafter{\topmark}% \global\savedfirstmark=\expandafter{\firstmark}% }% \eject % run that output routine to set \partialpage % % We recover the two marks that the last output routine saved in order % to propagate the information in marks added around a chapter heading, % which could be otherwise be lost by the time the final page is output. % \mark{\the\savedtopmark}% Only mark in page passed to following \output. \output = {% \setbox0=\box\PAGE % clear box 255 }abc\eject % \mark{\the\savedfirstmark}% % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \global\doublecolumntopgap = \topskip \global\advance\doublecolumntopgap by -1\baselineskip \global\advance\vsize by -1\doublecolumntopgap \vsize = 2\vsize \topskip=0pt } % The double-column output routine for all double-column pages except % the last, which is done by \balancecolumns. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \vbox{% \vskip\doublecolumntopgap \hbox to\pagewidth{\box0\hfil\box2}}% } % Finished with with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Only called for the last of the double column material. \doublecolumnout % does the others. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \ifdim\dimen@<14\baselineskip % Don't split a short final column in two. \setbox2=\vbox{}% \else \divide\dimen@ by 2 % target to split to \dimen@ii = \dimen@ \splittopskip = \topskip % Loop until the second column is no higher than the first {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ % Remove glue from bottom of first column to % make sure it is higher than the second. \global\setbox1 = \vbox{\unvbox1\unpenalty\unskip}% \ifdim\ht3>\ht1 \global\advance\dimen@ by 1pt \repeat }% \multiply\dimen@ii by 4 \divide\dimen@ii by 5 \ifdim\ht3<\dimen@ii % Column heights are too different, so don't make their bottoms % flush with each other. The glue at the end of the second column % allows a second column to stretch, reducing the difference in % height between the two. \setbox0=\vbox to\dimen@{\unvbox1\vfill}% \setbox2=\vbox to\dimen@{\unvbox3\vskip 0pt plus 0.3\ht0}% \else \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% \fi \fi % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page % This outputs a mark at the end of the page that clears \thischapter % and \thissection, as is done in \startcontents. \let\pchapsepmacro\relax \chapmacro{}{Yomitfromtoc}{}% \chapoddpage \endgroup } % \unnumberedno is an oxymoron. 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 \newcount\subsubsecno \subsubsecno=0 % 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 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% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \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} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \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 \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % 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 > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 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 \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 % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \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 calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \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 to achieve this: TeX expands \the only once, % simply yielding the contents of . (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\parseargdef\centerchap{% \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \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}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \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. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \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), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} % Start a new page \def\chappager{\par\vfill\supereject} % \chapoddpage - start on an odd page for a new chapter % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % \chapmacro - Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % Not used for @heading series. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yappendixkeyword{Yappendix} \def\Yomitfromtockeyword{Yomitfromtoc} % \def\chapmacro#1#2#3{% \checkenv{}% chapters, etc., should not start inside an environment. % % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold \let\footnote=\errfootnoteheading % give better error message % % Have to define \lastsection 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\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \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. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \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 \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip\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 \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% \nobreak\bigskip \nobreak } \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}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text of the title, % #2 is the section level (sec/subsec/subsubsec), % #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), % #4 is the section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \def\sectionlevel{#2}% \def\temptype{#3}% % % It is ok for the @heading series commands to appear inside an % environment (it's been historically allowed, though the logic is % dubious), but not the others. \ifx\temptype\Yomitfromtockeyword\else \checkenv{}% non-@*heading should not be in an environment. \fi \let\footnote=\errfootnoteheading % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \global\let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#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 \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % 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.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % 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\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 % % 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 \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % 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 \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \entryrightmargin=\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \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\partentry = \shortpartentry \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 \tocreadfilename\space \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 % 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. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \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#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % 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}\hskip.7em#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \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\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\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. % 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. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup % Move the page numbers slightly to the right \advance\entryrightmargin by -0.05em \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \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} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode `\`=\other \catcode `\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % % Inverse of the list at the beginning of the file. \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\sp=\ptexsp \let\*=\ptexstar %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @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. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % 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. % \def\aboveenvbreak{{% % =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 \ifnum\lastpenalty<10000 % Penalize breaking before the environment, because preceding text % often leads into it. \penalty100 \fi \vskip\envskipamount \fi \fi }} \def\afterenvbreak{{% % =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 % 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 }} % \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 % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \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 % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \setbox\groupbox=\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{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \addgroupbox \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % 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 % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#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 environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. Don't stretch around special % characters in urls in this environment, since the stretch at the right % should be enough. \envdef\raggedright{% \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax \def\urefprestretchamount{0pt}% \def\urefpoststretchamount{0pt}% } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % 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. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % 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 } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [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\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % 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 '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \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 % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % 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 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. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \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 \printdefunline, 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. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \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 } \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 \else \defunpenalty=10002 \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 % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % 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 } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining 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 { (defn. of \deffnheader) } % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % 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}% \doingtypefntrue \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 {} } % Types: % @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{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category 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. We'll always have at % least two. \tempnum = 2 % % 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 % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at 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}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #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. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #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\ }} \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 } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % 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\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \let\aftermacroxxx\relax \def\aftermacro{\aftermacroxxx} % alias because \c means cedilla in @tex or @math \let\texinfoc=\c % Used at the time of macro expansion. % Argument is macro body with arguments substituted \def\scanmacro#1{% \newlinechar`\^^M \def\xprocessmacroarg{\eatspaces}% % % Process the macro body under the current catcode regime. \scantokens{#1\texinfoc}\aftermacro% % % The \c is to remove the \newlinechar added by \scantokens, and % can be noticed by \parsearg. % The \aftermacro allows a \comment at the end of the macro definition % to duplicate itself past the final \newlinechar added by \scantokens: % this is used in the definition of \group to comment out a newline. We % don't do the same for \c to support Texinfo files with macros that ended % with a @c, which should no longer be necessary. % We avoid surrounding the call to \scantokens with \bgroup and \egroup % to allow macros to open or close groups themselves. } \def\scanexp#1{% \bgroup % Undo catcode changes of \startcontents and \printindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. % FIXME: This may not be needed. %\catcode`\@=0 \catcode`\\=\active \escapechar=`\@ \edef\temp{\noexpand\scanmacro{#1}}% \temp \egroup } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % 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. % 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\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\@=\other \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\ =\other \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } % Used when scanning braced macro arguments. Note, however, that catcode % changes here are ineffectual if the macro invocation was nested inside % an argument to another Texinfo command. \def\macroargctxt{% \scanctxt \catcode`\ =\active \catcode`\^^M=\other \catcode`\\=\active } \def\macrolineargctxt{% used for whole-line arguments without braces \scanctxt \catcode`\{=\other \catcode`\}=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \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% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \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: \begingroup \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 } % \getargs -- Parse the arguments to a @macro line. Set \macname to % the name of the macro, and \argl to the braced argument list. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % This made use of the feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. % Parse the optional {params} list to @macro or @rmacro. % Set \paramno to the number of arguments, % and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a % three-param macro.) Define \macarg.BLAH for each BLAH in the params % list to some hook where the argument is to be expanded. If there are % less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % If there are 10 or more arguments, a different technique is used: see % \parsemmanyargdef. % \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax % \hash is redefined to `#' later to get it into definitions \let\processmacroarg\relax \parsemargdefxxx#1,;,% \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\processmacroarg{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % \parsemacbody, \parsermacbody % % Read recursive and nonrecursive macro bodies. (They're different since % rec and nonrec macros end differently.) % % We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro % body to be transformed. % Set \macrobody to the body of the macro, and call \defmacro. % {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% % Make @ a letter, so that we can make private-to-Texinfo macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax %%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%% % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime under which the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, no macro can have more than 256 arguments (else error). % % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments' values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa. % \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } % Define the named-macro outside of this group and then close this group. % \def\macargexpandinbody@{% \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Trailing missing arguments are set to empty. % \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } %%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% % Remove following spaces at the expansion stage. % This works because spaces are discarded before each argument when TeX is % getting the arguments for a macro. % This must not be immediately followed by a }. \long\def\gobblespaces#1{#1} % This defines a Texinfo @macro or @rmacro, called by \parsemacbody. % \macrobody has the body of the macro in it, with placeholders for % its parameters, looking like "\processmacroarg{\hash 1}". % \paramno is the number of parameters % \paramlist is a TeX parameter text, e.g. "#1,#2,#3," % There are eight cases: recursive and nonrecursive macros of zero, one, % up to nine, and many arguments. % \xdef is used so that macro definitions will survive the file % they're defined in: @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifnum\paramno=1 \def\processmacroarg{\gobblespaces}% % This removes the pair of braces around the argument. We don't % use \eatspaces, because this can cause ends of lines to be lost % when the argument to \eatspaces is read, leading to line-based % commands like "@itemize" not being read correctly. \else \def\processmacroarg{\xprocessmacroarg}% \let\xprocessmacroarg\relax \fi \ifrecursive %%%%%%%%%%%%%% Recursive %%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\braceorline \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname{% \noexpand\gobblespaces##1\empty}% % The \empty is for \gobblespaces in case #1 is empty }% \expandafter\xdef\csname\the\macname @@@@\endcsname##1{% \egroup\noexpand\scanmacro{\macrobody}}% \else \ifnum\paramno<10\relax % at most 9 % See non-recursive section below for comments \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\expandafter \noexpand\macroargctxt \noexpand\expandafter \expandafter\noexpand\csname\the\macname @@\endcsname}% \expandafter\xdef\csname\the\macname @@\endcsname##1{% \noexpand\passargtomacro \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname @@@@\endcsname\paramlist{% \egroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else %%%%%%%%%%%%%%%%%%%%%% Non-recursive %%%%%%%%%%%%%%%%%%%%%%%%%% \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\braceorline \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname{% \noexpand\gobblespaces##1\empty}% % The \empty is for \gobblespaces in case #1 is empty }% \expandafter\xdef\csname\the\macname @@@@\endcsname##1{% \egroup \noexpand\scanmacro{\macrobody}% }% \else % at most 9 \ifnum\paramno<10\relax % @MACNAME sets the context for reading the macro argument % @MACNAME@@ gets the argument, processes backslashes and appends a % comma. % @MACNAME@@@ removes braces surrounding the argument list. % @MACNAME@@@@ scans the macro body with arguments substituted. \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\expandafter % This \expandafter skip any spaces after the \noexpand\macroargctxt % macro before we change the catcode of space. \noexpand\expandafter \expandafter\noexpand\csname\the\macname @@\endcsname}% \expandafter\xdef\csname\the\macname @@\endcsname##1{% \noexpand\passargtomacro \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname @@@@\endcsname\paramlist{% \egroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % {\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape @catcode`@_=11 % private names @catcode`@!=11 % used as argument separator % \passargtomacro#1#2 - % Call #1 with a list of tokens #2, with any doubled backslashes in #2 % compressed to one. % % This implementation works by expansion, and not execution (so we cannot use % \def or similar). This reduces the risk of this failing in contexts where % complete expansion is done with no execution (for example, in writing out to % an auxiliary file for an index entry). % % State is kept in the input stream: the argument passed to % @look_ahead, @gobble_and_check_finish and @add_segment is % % THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input) % % where: % THE_MACRO - name of the macro we want to call % ARG_RESULT - argument list we build to pass to that macro % PENDING_BS - either a backslash or nothing % NEXT_TOKEN - used to look ahead in the input stream to see what's coming next @gdef@passargtomacro#1#2{% @add_segment #1!{}@relax#2\@_finish\% } @gdef@_finish{@_finishx} @global@let@_finishx@relax % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 used to look ahead % % If the next token is not a backslash, process the rest of the argument; % otherwise, remove the next token. @gdef@look_ahead#1!#2#3#4{% @ifx#4\% @expandafter@gobble_and_check_finish @else @expandafter@add_segment @fi#1!{#2}#4#4% } % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 should be a backslash, which is gobbled. % #5 looks ahead % % Double backslash found. Add a single backslash, and look ahead. @gdef@gobble_and_check_finish#1!#2#3#4#5{% @add_segment#1\!{}#5#5% } @gdef@is_fi{@fi} % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 is input stream until next backslash % % Input stream is either at the start of the argument, or just after a % backslash sequence, either a lone backslash, or a doubled backslash. % NEXT_TOKEN contains the first token in the input stream: if it is \finish, % finish; otherwise, append to ARG_RESULT the segment of the argument up until % the next backslash. PENDING_BACKSLASH contains a backslash to represent % a backslash just before the start of the input stream that has not been % added to ARG_RESULT. @gdef@add_segment#1!#2#3#4\{% @ifx#3@_finish @call_the_macro#1!% @else % append the pending backslash to the result, followed by the next segment @expandafter@is_fi@look_ahead#1#2#4!{\}@fi % this @fi is discarded by @look_ahead. % we can't get rid of it with \expandafter because we don't know how % long #4 is. } % #1 - THE_MACRO % #2 - ARG_RESULT % #3 discards the res of the conditional in @add_segment, and @is_fi ends the % conditional. @gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \braceorline MAC is used for a one-argument macro MAC. It checks % whether the next non-whitespace character is a {. It sets the context % for reading the argument (slightly different in the two cases). Then, % to read the argument, in the whole-line case, it then calls the regular % \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup \macroargctxt \expandafter\passargtomacro \else \macrolineargctxt\expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#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=\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 } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \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 \lastsection, % 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}% \iflinks {% \requireauxfile \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{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\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 % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref{\putwordsee{} \xrefXX} \def\xref{\putwordSee{} \xrefXX} \def\ref{\xrefXX} \def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} \def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % 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\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox 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 \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (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 the macro below 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}{}% \ifx,\tokenafterxref \else\ifx.\tokenafterxref \else\ifx;\tokenafterxref \else\ifx)\tokenafterxref \else,% add a , if xref not followed by punctuation \fi\fi\fi\fi \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % 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\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{% \requireauxfile {% \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 \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % 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{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\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 {\safexrefname}}% \fi } % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate at the beginning of the file. % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % Used when writing to the aux file, or when using data from it. \def\requireauxfile{% \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi \global\let\requireauxfile=\relax % Only do this once. } % Read the last existing aux file, if any. No error if none exists. % \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 \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % 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 ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \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 \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % 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. {\setnonasciicharscatcodenonglobal\other}% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \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}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \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) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % % Nested footnotes are not supported in TeX, that would take a lot % more work. (\startsavinginserts does not suffice.) \let\footnote=\errfootnotenest % % 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 \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 \def\errfootnotenest{% \errhelp=\EMsimple \errmessage{Nested footnotes not supported in texinfo.tex, even though they work in makeinfo; sorry} } \def\errfootnoteheading{% \errhelp=\EMsimple \errmessage{Footnotes in chapters, sections, etc., are not supported} } % 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. % Similarly, 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. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % 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 \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \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 \lastsection 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\lastsection{\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. {% \requireauxfile \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 % \lastsection 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,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \let_ = \normalunderscore % normal _ character for filename test \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore #1_\finish \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX } % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} \def\documentencodingzzz#1{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active % since we already invoked \utfeightchardefs at the top level % (below), do not re-invoke it, then our check for duplicated % definitions triggers. Making non-ascii chars active is enough. % \else \message{Ignoring unknown document encoding: #1.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % emacs-page % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing, sorry: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{{\tcfont \char162}} % cent \gdef^^a3{\pounds} \gdef^^a4{{\tcfont \char164}} % currency \gdef^^a5{{\tcfont \char165}} % yen \gdef^^a6{{\tcfont \char166}} % broken bar \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{\ensuremath\lnot} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} \gdef^^b7{\ensuremath\cdot} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \def\globallet{\global\let} % save some \expandafter's below % @U{xxxx} to produce U+xxxx, if we support it. \def\U#1{% \expandafter\ifx\csname uni:#1\endcsname \relax \errhelp = \EMsimple \errmessage{Unicode character U+#1 not supported, sorry}% \else \csname uni:#1\endcsname \fi } \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% % \expandafter\ifx\csname uni:#1\endcsname \relax \else \message{Internal error, already defined: #1}% \fi % % define an additional control sequence for this code point. \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup % https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M % U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) % U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) % U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A % U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B % % Many of our renditions are less than wonderful, and all the missing % characters are available somewhere. Loading the necessary fonts % awaits user request. We can't truly support Unicode without % reimplementing everything that's been done in LaTeX for many years, % plus probably using luatex or xetex, and who knows what else. % We won't be doing that here in this simple file. But we can try to at % least make most of the characters not bomb out. % \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar \DeclareUnicodeCharacter{00A7}{\S} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B1}{\ensuremath\pm} \DeclareUnicodeCharacter{00B2}{$^2$} \DeclareUnicodeCharacter{00B3}{$^3$} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B5}{$\mu$} \DeclareUnicodeCharacter{00B6}{\P} \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00B9}{$^1$} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BC}{$1\over4$} \DeclareUnicodeCharacter{00BD}{$1\over2$} \DeclareUnicodeCharacter{00BE}{$3\over4$} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D7}{\ensuremath\times} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F7}{\ensuremath\div} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{010F}{d'} \DeclareUnicodeCharacter{0110}{\DH} \DeclareUnicodeCharacter{0111}{\dh} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0122}{\cedilla{G}} \DeclareUnicodeCharacter{0123}{\cedilla{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}} \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{012E}{\ogonek{I}} \DeclareUnicodeCharacter{012F}{\ogonek{i}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0136}{\cedilla{K}} \DeclareUnicodeCharacter{0137}{\cedilla{k}} \DeclareUnicodeCharacter{0138}{\ensuremath\kappa} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{013B}{\cedilla{L}} \DeclareUnicodeCharacter{013C}{\cedilla{l}} \DeclareUnicodeCharacter{013D}{L'}% should kern \DeclareUnicodeCharacter{013E}{l'}% should kern \DeclareUnicodeCharacter{013F}{L\U{00B7}} \DeclareUnicodeCharacter{0140}{l\U{00B7}} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0145}{\cedilla{N}} \DeclareUnicodeCharacter{0146}{\cedilla{n}} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{0149}{'n} \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}} \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0156}{\cedilla{R}} \DeclareUnicodeCharacter{0157}{\cedilla{r}} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{T}} \DeclareUnicodeCharacter{0163}{\cedilla{t}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0165}{\v{t}} \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}} \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0172}{\ogonek{U}} \DeclareUnicodeCharacter{0173}{\ogonek{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} % Greek letters upper case \DeclareUnicodeCharacter{0391}{{\it A}} \DeclareUnicodeCharacter{0392}{{\it B}} \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}} \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}} \DeclareUnicodeCharacter{0395}{{\it E}} \DeclareUnicodeCharacter{0396}{{\it Z}} \DeclareUnicodeCharacter{0397}{{\it H}} \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}} \DeclareUnicodeCharacter{0399}{{\it I}} \DeclareUnicodeCharacter{039A}{{\it K}} \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}} \DeclareUnicodeCharacter{039C}{{\it M}} \DeclareUnicodeCharacter{039D}{{\it N}} \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}} \DeclareUnicodeCharacter{039F}{{\it O}} \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}} \DeclareUnicodeCharacter{03A1}{{\it P}} %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}} \DeclareUnicodeCharacter{03A4}{{\it T}} \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}} \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}} \DeclareUnicodeCharacter{03A7}{{\it X}} \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}} \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}} % Vowels with accents \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}} \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}} \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}} \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}} \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}} \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}} % Standalone accent \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}} % Greek letters lower case \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha} \DeclareUnicodeCharacter{03B2}{\ensuremath\beta} \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma} \DeclareUnicodeCharacter{03B4}{\ensuremath\delta} \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon} \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta} \DeclareUnicodeCharacter{03B7}{\ensuremath\eta} \DeclareUnicodeCharacter{03B8}{\ensuremath\theta} \DeclareUnicodeCharacter{03B9}{\ensuremath\iota} \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa} \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda} \DeclareUnicodeCharacter{03BC}{\ensuremath\mu} \DeclareUnicodeCharacter{03BD}{\ensuremath\nu} \DeclareUnicodeCharacter{03BE}{\ensuremath\xi} \DeclareUnicodeCharacter{03BF}{{\it o}} % omicron \DeclareUnicodeCharacter{03C0}{\ensuremath\pi} \DeclareUnicodeCharacter{03C1}{\ensuremath\rho} \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma} \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma} \DeclareUnicodeCharacter{03C4}{\ensuremath\tau} \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon} \DeclareUnicodeCharacter{03C6}{\ensuremath\phi} \DeclareUnicodeCharacter{03C7}{\ensuremath\chi} \DeclareUnicodeCharacter{03C8}{\ensuremath\psi} \DeclareUnicodeCharacter{03C9}{\ensuremath\omega} % More Greek vowels with accents \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}} \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}} \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}} \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}} \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}} % Variant Greek letters \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta} \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi} \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} % Punctuation \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2020}{\ensuremath\dagger} \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{202F}{\thinspace} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} % Mathematical symbols \DeclareUnicodeCharacter{2200}{\ensuremath\forall} \DeclareUnicodeCharacter{2203}{\ensuremath\exists} \DeclareUnicodeCharacter{2208}{\ensuremath\in} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\ast} \DeclareUnicodeCharacter{221E}{\ensuremath\infty} \DeclareUnicodeCharacter{2225}{\ensuremath\parallel} \DeclareUnicodeCharacter{2227}{\ensuremath\wedge} \DeclareUnicodeCharacter{2229}{\ensuremath\cap} \DeclareUnicodeCharacter{2261}{\equiv} \DeclareUnicodeCharacter{2264}{\ensuremath\leq} \DeclareUnicodeCharacter{2265}{\ensuremath\geq} \DeclareUnicodeCharacter{2282}{\ensuremath\subset} \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq} \DeclareUnicodeCharacter{2016}{\ensuremath\Vert} \DeclareUnicodeCharacter{2032}{\ensuremath\prime} \DeclareUnicodeCharacter{210F}{\ensuremath\hbar} \DeclareUnicodeCharacter{2111}{\ensuremath\Im} \DeclareUnicodeCharacter{2113}{\ensuremath\ell} \DeclareUnicodeCharacter{2118}{\ensuremath\wp} \DeclareUnicodeCharacter{211C}{\ensuremath\Re} \DeclareUnicodeCharacter{2127}{\ensuremath\mho} \DeclareUnicodeCharacter{2135}{\ensuremath\aleph} \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow} \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow} \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow} \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow} \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow} \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow} \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow} \DeclareUnicodeCharacter{2198}{\ensuremath\searrow} \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow} \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto} \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow} \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow} \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup} \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown} \DeclareUnicodeCharacter{21BE}{\ensuremath\upharpoonright} \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup} \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown} \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons} \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow} \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow} \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow} \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow} \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow} \DeclareUnicodeCharacter{21DD}{\ensuremath\leadsto} \DeclareUnicodeCharacter{2201}{\ensuremath\complement} \DeclareUnicodeCharacter{2202}{\ensuremath\partial} \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset} \DeclareUnicodeCharacter{2207}{\ensuremath\nabla} \DeclareUnicodeCharacter{2209}{\ensuremath\notin} \DeclareUnicodeCharacter{220B}{\ensuremath\owns} \DeclareUnicodeCharacter{220F}{\ensuremath\prod} \DeclareUnicodeCharacter{2210}{\ensuremath\coprod} \DeclareUnicodeCharacter{2211}{\ensuremath\sum} \DeclareUnicodeCharacter{2213}{\ensuremath\mp} \DeclareUnicodeCharacter{2218}{\ensuremath\circ} \DeclareUnicodeCharacter{221A}{\ensuremath\surd} \DeclareUnicodeCharacter{221D}{\ensuremath\propto} \DeclareUnicodeCharacter{2220}{\ensuremath\angle} \DeclareUnicodeCharacter{2223}{\ensuremath\mid} \DeclareUnicodeCharacter{2228}{\ensuremath\vee} \DeclareUnicodeCharacter{222A}{\ensuremath\cup} \DeclareUnicodeCharacter{222B}{\ensuremath\smallint} \DeclareUnicodeCharacter{222E}{\ensuremath\oint} \DeclareUnicodeCharacter{223C}{\ensuremath\sim} \DeclareUnicodeCharacter{2240}{\ensuremath\wr} \DeclareUnicodeCharacter{2243}{\ensuremath\simeq} \DeclareUnicodeCharacter{2245}{\ensuremath\cong} \DeclareUnicodeCharacter{2248}{\ensuremath\approx} \DeclareUnicodeCharacter{224D}{\ensuremath\asymp} \DeclareUnicodeCharacter{2250}{\ensuremath\doteq} \DeclareUnicodeCharacter{2260}{\ensuremath\neq} \DeclareUnicodeCharacter{226A}{\ensuremath\ll} \DeclareUnicodeCharacter{226B}{\ensuremath\gg} \DeclareUnicodeCharacter{227A}{\ensuremath\prec} \DeclareUnicodeCharacter{227B}{\ensuremath\succ} \DeclareUnicodeCharacter{2283}{\ensuremath\supset} \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq} \DeclareUnicodeCharacter{228E}{\ensuremath\uplus} \DeclareUnicodeCharacter{228F}{\ensuremath\sqsubset} \DeclareUnicodeCharacter{2290}{\ensuremath\sqsupset} \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq} \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq} \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap} \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup} \DeclareUnicodeCharacter{2295}{\ensuremath\oplus} \DeclareUnicodeCharacter{2296}{\ensuremath\ominus} \DeclareUnicodeCharacter{2297}{\ensuremath\otimes} \DeclareUnicodeCharacter{2298}{\ensuremath\oslash} \DeclareUnicodeCharacter{2299}{\ensuremath\odot} \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash} \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv} \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop} \DeclareUnicodeCharacter{22A5}{\ensuremath\bot} \DeclareUnicodeCharacter{22A8}{\ensuremath\models} \DeclareUnicodeCharacter{22B4}{\ensuremath\unlhd} \DeclareUnicodeCharacter{22B5}{\ensuremath\unrhd} \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge} \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee} \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap} \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup} \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond} \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot} \DeclareUnicodeCharacter{22C6}{\ensuremath\star} \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie} \DeclareUnicodeCharacter{2308}{\ensuremath\lceil} \DeclareUnicodeCharacter{2309}{\ensuremath\rceil} \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor} \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor} \DeclareUnicodeCharacter{2322}{\ensuremath\frown} \DeclareUnicodeCharacter{2323}{\ensuremath\smile} \DeclareUnicodeCharacter{25A1}{\ensuremath\Box} \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle} \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright} \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown} \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft} \DeclareUnicodeCharacter{25C7}{\ensuremath\Diamond} \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit} \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit} \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit} \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit} \DeclareUnicodeCharacter{266D}{\ensuremath\flat} \DeclareUnicodeCharacter{266E}{\ensuremath\natural} \DeclareUnicodeCharacter{266F}{\ensuremath\sharp} \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc} \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle} \DeclareUnicodeCharacter{27C2}{\ensuremath\perp} \DeclareUnicodeCharacter{27E8}{\ensuremath\langle} \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow} \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow} \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow} \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto} \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus} \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot} \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus} \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes} \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus} \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup} \DeclareUnicodeCharacter{2A1D}{\ensuremath\Join} \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg} \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq} \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq} \global\mathchardef\checkmark="1370 % actually the square root sign \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Latin1 (ISO-8859-1) character definitions. \def\nonasciistringdefs{% \setnonasciicharscatcode\active \def\defstringchar##1{\def##1{\string##1}}% % \defstringchar^^80\defstringchar^^81\defstringchar^^82\defstringchar^^83% \defstringchar^^84\defstringchar^^85\defstringchar^^86\defstringchar^^87% \defstringchar^^88\defstringchar^^89\defstringchar^^8a\defstringchar^^8b% \defstringchar^^8c\defstringchar^^8d\defstringchar^^8e\defstringchar^^8f% % \defstringchar^^90\defstringchar^^91\defstringchar^^92\defstringchar^^93% \defstringchar^^94\defstringchar^^95\defstringchar^^96\defstringchar^^97% \defstringchar^^98\defstringchar^^99\defstringchar^^9a\defstringchar^^9b% \defstringchar^^9c\defstringchar^^9d\defstringchar^^9e\defstringchar^^9f% % \defstringchar^^a0\defstringchar^^a1\defstringchar^^a2\defstringchar^^a3% \defstringchar^^a4\defstringchar^^a5\defstringchar^^a6\defstringchar^^a7% \defstringchar^^a8\defstringchar^^a9\defstringchar^^aa\defstringchar^^ab% \defstringchar^^ac\defstringchar^^ad\defstringchar^^ae\defstringchar^^af% % \defstringchar^^b0\defstringchar^^b1\defstringchar^^b2\defstringchar^^b3% \defstringchar^^b4\defstringchar^^b5\defstringchar^^b6\defstringchar^^b7% \defstringchar^^b8\defstringchar^^b9\defstringchar^^ba\defstringchar^^bb% \defstringchar^^bc\defstringchar^^bd\defstringchar^^be\defstringchar^^bf% % \defstringchar^^c0\defstringchar^^c1\defstringchar^^c2\defstringchar^^c3% \defstringchar^^c4\defstringchar^^c5\defstringchar^^c6\defstringchar^^c7% \defstringchar^^c8\defstringchar^^c9\defstringchar^^ca\defstringchar^^cb% \defstringchar^^cc\defstringchar^^cd\defstringchar^^ce\defstringchar^^cf% % \defstringchar^^d0\defstringchar^^d1\defstringchar^^d2\defstringchar^^d3% \defstringchar^^d4\defstringchar^^d5\defstringchar^^d6\defstringchar^^d7% \defstringchar^^d8\defstringchar^^d9\defstringchar^^da\defstringchar^^db% \defstringchar^^dc\defstringchar^^dd\defstringchar^^de\defstringchar^^df% % \defstringchar^^e0\defstringchar^^e1\defstringchar^^e2\defstringchar^^e3% \defstringchar^^e4\defstringchar^^e5\defstringchar^^e6\defstringchar^^e7% \defstringchar^^e8\defstringchar^^e9\defstringchar^^ea\defstringchar^^eb% \defstringchar^^ec\defstringchar^^ed\defstringchar^^ee\defstringchar^^ef% % \defstringchar^^f0\defstringchar^^f1\defstringchar^^f2\defstringchar^^f3% \defstringchar^^f4\defstringchar^^f5\defstringchar^^f6\defstringchar^^f7% \defstringchar^^f8\defstringchar^^f9\defstringchar^^fa\defstringchar^^fb% \defstringchar^^fc\defstringchar^^fd\defstringchar^^fe\defstringchar^^ff% } % define all the unicode characters we know about, for the sake of @U. \utfeightchardefs % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % 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 % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @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{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % 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 = 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{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \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 A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \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. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % 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 % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hatchar=`\^ \catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> \catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix \catcode`\-=\active \let-=\normaldash % used for headline/footline in the output routine, in case the page % breaks in the middle of an @tex block. \def\texinfochars{% \let< = \activeless \let> = \activegtr \let~ = \activetilde \let^ = \activehat \markupsetuplqdefault \markupsetuprqdefault \let\b = \strong \let\i = \smartitalic % in principle, all other definitions in \tex have to be undone too. } % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \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 % @ for escape char from now on. % Print a typewriter backslash. For math mode, we can't simply use % \backslashcurfont: the story here is that in math mode, the \char % of \backslashcurfont ends up printing the roman \ from the math symbol % font (because \char in math mode uses the \mathcode, and plain.tex % sets \mathcode`\\="026E). Hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @ttbackslash % @backslashchar{} is for user documents. % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % {@catcode`- = @active @gdef@normalturnoffactive{% @nonasciistringdefs @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @let\=@ttbackslash @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } } % 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. % So turn them off again, and have @fixbackslash turn them back on. @catcode`+=@other @catcode`@_=@other % \enablebackslashhack - allow file to begin `\input texinfo' % % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % If the file did not have a `\input texinfo', then it is turned off after % the first line; otherwise the first `\' in the file would cause an error. % This is used on the very last line of this file, texinfo.tex. % We also use @c to call @fixbackslash, in case ends of lines are hidden. { @catcode`@^=7 @catcode`@^^M=13@gdef@enablebackslashhack{% @global@let\ = @eatinput% @catcode`@^^M=13% @def@c{@fixbackslash@c}% @def ^^M{@let^^M@secondlinenl}% @gdef @secondlinenl{@let^^M@thirdlinenl}% @gdef @thirdlinenl{@fixbackslash}% }} {@catcode`@^=7 @catcode`@^^M=13% @gdef@eatinput input texinfo#1^^M{@fixbackslash}} @gdef@fixbackslash{% @ifx\@eatinput @let\ = @ttbackslash @fi @catcode13=5 % regular end of line @let@c=@texinfoc % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. @catcode`+=@active @catcode`@_=@active % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets % called at the beginning of every Texinfo file. Not opening texinfo.cnf % directly in this file, texinfo.tex, makes it possible to make a format % file for Texinfo. % @openin 1 texinfo.cnf @ifeof 1 @else @input texinfo.cnf @fi @closein 1 } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message\\|emacs-page" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore @enablebackslashhack readline-8.3/doc/readline.0000644 000436 000024 00000243567 14772523233 015672 0ustar00chetstaff000000 000000 _R_E_A_D_L_I_N_E(3) Library Functions Manual _R_E_A_D_L_I_N_E(3) NNAAMMEE readline - get a line from a user with editing SSYYNNOOPPSSIISS ##iinncclluuddee <> ##iinncclluuddee <> ##iinncclluuddee <> _c_h_a_r _* rreeaaddlliinnee (_c_o_n_s_t _c_h_a_r _*_p_r_o_m_p_t); CCOOPPYYRRIIGGHHTT Readline is Copyright (C) 1989-2025 Free Software Foundation, Inc. DDEESSCCRRIIPPTTIIOONN rreeaaddlliinnee reads a line from the terminal and return it, using pprroommpptt as a prompt. If pprroommpptt is NNUULLLL or the empty string, rreeaaddlliinnee does not is- sue a prompt. The line returned is allocated with _m_a_l_l_o_c(3); the caller must free it when finished. The line returned has the final newline removed, so only the text of the line remains. Since it's pos- sible to enter characters into the line while quoting them to disable any rreeaaddlliinnee editing function they might normally have, this line may include embedded newlines and other special characters. rreeaaddlliinnee offers editing capabilities while the user is entering the line. By default, the line editing commands are similar to those of emacs. A vi-style line editing interface is also available. This manual page describes only the most basic use of rreeaaddlliinnee. Much more functionality is available; see _T_h_e _G_N_U _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y and _T_h_e _G_N_U _H_i_s_t_o_r_y _L_i_b_r_a_r_y for additional information. RREETTUURRNN VVAALLUUEE rreeaaddlliinnee returns the text of the line read. A blank line returns the empty string. If EEOOFF is encountered while reading a line, and the line is empty, rreeaaddlliinnee returns NNUULLLL. If an EEOOFF is read with a non-empty line, it is treated as a newline. NNOOTTAATTIIOONN This section uses Emacs-style editing concepts and uses its notation for keystrokes. Control keys are denoted by C-_k_e_y, e.g., C-n means Control-N. Similarly, _m_e_t_a keys are denoted by M-_k_e_y, so M-x means Meta-X. The Meta key is often labeled "Alt" or "Option". On keyboards without a _M_e_t_a key, M-_x means ESC _x, i.e., press and re- lease the Escape key, then press and release the _x key, in sequence. This makes ESC the _m_e_t_a _p_r_e_f_i_x. The combination M-C-_x means ESC Con- trol-_x: press and release the Escape key, then press and hold the Con- trol key while pressing the _x key, then release both. On some keyboards, the Meta key modifier produces characters with the eighth bit (0200) set. You can use the eennaabbllee--mmeettaa--kkeeyy variable to control whether or not it does this, if the keyboard allows it. On many others, the terminal or terminal emulator converts the metafied key to a key sequence beginning with ESC as described in the preceding paragraph. If your _M_e_t_a key produces a key sequence with the ESC meta prefix, you can make M-_k_e_y key bindings you specify (see RReeaaddlliinnee KKeeyy BBiinnddiinnggss be- low) do the same thing by setting the ffoorrccee--mmeettaa--pprreeffiixx variable. RReeaaddlliinnee commands may be given numeric _a_r_g_u_m_e_n_t_s, which normally act as a repeat count. Sometimes, however, it is the sign of the argument that is significant. Passing a negative argument to a command that acts in the forward direction (e.g., kkiillll--lliinnee) makes that command act in a backward direction. Commands whose behavior with arguments devi- ates from this are noted below. The _p_o_i_n_t is the current cursor position, and _m_a_r_k refers to a saved cursor position. The text between the point and mark is referred to as the _r_e_g_i_o_n. When a command is described as _k_i_l_l_i_n_g text, the text deleted is saved for possible future retrieval (_y_a_n_k_i_n_g). The killed text is saved in a _k_i_l_l _r_i_n_g. Consecutive kills accumulate the deleted text into one unit, which can be yanked all at once. Commands which do not kill text separate the chunks of text on the kill ring. IINNIITTIIAALLIIZZAATTIIOONN FFIILLEE RReeaaddlliinnee is customized by putting commands in an initialization file (the _i_n_p_u_t_r_c file). The name of this file is taken from the value of the IINNPPUUTTRRCC environment variable. If that variable is unset, the de- fault is _~_/_._i_n_p_u_t_r_c. If that file does not exist or cannot be read, rreeaaddlliinnee looks for _/_e_t_c_/_i_n_p_u_t_r_c. When a program that uses the rreeaaddlliinnee library starts up, rreeaaddlliinnee reads the initialization file and sets the key bindings and variables found there, before reading any user input. There are only a few basic constructs allowed in the inputrc file. Blank lines are ignored. Lines beginning with a ## are comments. Lines beginning with a $$ indicate conditional constructs. Other lines denote key bindings and variable settings. The default key-bindings in this document may be changed using key binding commands in the _i_n_p_u_t_r_c file. Programs that use this library may add their own commands and bindings. For example, placing M-Control-u: universal-argument or C-Meta-u: universal-argument into the _i_n_p_u_t_r_c would make M-C-u execute the rreeaaddlliinnee command _u_n_i_v_e_r_- _s_a_l_-_a_r_g_u_m_e_n_t. Key bindings may contain the following symbolic character names: _D_E_L, _E_S_C, _E_S_C_A_P_E, _L_F_D, _N_E_W_L_I_N_E, _R_E_T, _R_E_T_U_R_N, _R_U_B_O_U_T (a destructive back- space), _S_P_A_C_E, _S_P_C, and _T_A_B. In addition to command names, rreeaaddlliinnee allows keys to be bound to a string that is inserted when the key is pressed (a _m_a_c_r_o). The differ- ence between a macro and a command is that a macro is enclosed in sin- gle or double quotes. KKeeyy BBiinnddiinnggss The syntax for controlling key bindings in the _i_n_p_u_t_r_c file is simple. All that is required is the name of the command or the text of a macro and a key sequence to which it should be bound. The key sequence may be specified in one of two ways: as a symbolic key name, possibly with _M_e_t_a_- or _C_o_n_t_r_o_l_- prefixes, or as a key sequence composed of one or more characters enclosed in double quotes. The key sequence and name are separated by a colon. There can be no whitespace between the name and the colon. When using the form kkeeyynnaammee:_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, _k_e_y_n_a_m_e is the name of a key spelled out in English. For example: Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output" In the above example, _C_-_u is bound to the function uunniivveerrssaall--aarrgguummeenntt, _M_-_D_E_L is bound to the function bbaacckkwwaarrdd--kkiillll--wwoorrdd, and _C_-_o is bound to run the macro expressed on the right hand side (that is, to insert the text "> output" into the line). In the second form, ""kkeeyysseeqq"":_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, kkeeyysseeqq differs from kkeeyynnaammee above in that strings denoting an entire key sequence may be specified by placing the sequence within double quotes. Some GNU Emacs style key escapes can be used, as in the following example, but none of the symbolic character names are recognized. "\C-u": universal-argument "\C-x\C-r": re-read-init-file "\e[11~": "Function Key 1" In this example, _C_-_u is again bound to the function uunniivveerrssaall--aarrgguummeenntt. _C_-_x _C_-_r is bound to the function rree--rreeaadd--iinniitt--ffiillee, and _E_S_C _[ _1 _1 _~ is bound to insert the text "Function Key 1". The full set of GNU Emacs style escape sequences available when speci- fying key sequences is \\CC-- A control prefix. \\MM-- Adding the meta prefix or converting the following char- acter to a meta character, as described below under ffoorrccee--mmeettaa--pprreeffiixx. \\ee An escape character. \\\\ Backslash. \\"" Literal ", a double quote. \\'' Literal ', a single quote. In addition to the GNU Emacs style escape sequences, a second set of backslash escapes is available: \\aa alert (bell) \\bb backspace \\dd delete \\ff form feed \\nn newline \\rr carriage return \\tt horizontal tab \\vv vertical tab \\_n_n_n The eight-bit character whose value is the octal value _n_n_n (one to three digits). \\xx_H_H The eight-bit character whose value is the hexadecimal value _H_H (one or two hex digits). When entering the text of a macro, single or double quotes must be used to indicate a macro definition. Unquoted text is assumed to be a func- tion name. The backslash escapes described above are expanded in the macro body. Backslash quotes any other character in the macro text, including " and '. BBaasshh will display or modify the current rreeaaddlliinnee key bindings with the bbiinndd builtin command. The --oo eemmaaccss or --oo vvii options to the sseett builtin change the editing mode during interactive use. Other programs using this library provide similar mechanisms. A user may always edit the _i_n_p_u_t_r_c file and have rreeaaddlliinnee re-read it if a program does not provide any other means to incorporate new bindings. VVaarriiaabblleess RReeaaddlliinnee has variables that can be used to further customize its behav- ior. A variable may be set in the _i_n_p_u_t_r_c file with a statement of the form sseett _v_a_r_i_a_b_l_e_-_n_a_m_e _v_a_l_u_e Except where noted, rreeaaddlliinnee variables can take the values OOnn or OOffff (without regard to case). Unrecognized variable names are ignored. When rreeaaddlliinnee reads a variable value, empty or null values, "on" (case- insensitive), and "1" are equivalent to OOnn. All other values are equivalent to OOffff. The variables and their default values are: aaccttiivvee--rreeggiioonn--ssttaarrtt--ccoolloorr A string variable that controls the text color and background when displaying the text in the active region (see the descrip- tion of eennaabbllee--aaccttiivvee--rreeggiioonn below). This string must not take up any physical character positions on the display, so it should consist only of terminal escape sequences. It is output to the terminal before displaying the text in the active region. This variable is reset to the default value whenever the terminal type changes. The default value is the string that puts the terminal in standout mode, as obtained from the terminal's ter- minfo description. A sample value might be "\e[01;33m". aaccttiivvee--rreeggiioonn--eenndd--ccoolloorr A string variable that "undoes" the effects of aaccttiivvee--rree-- ggiioonn--ssttaarrtt--ccoolloorr and restores "normal" terminal display appear- ance after displaying text in the active region. This string must not take up any physical character positions on the dis- play, so it should consist only of terminal escape sequences. It is output to the terminal after displaying the text in the active region. This variable is reset to the default value whenever the terminal type changes. The default value is the string that restores the terminal from standout mode, as ob- tained from the terminal's terminfo description. A sample value might be "\e[0m". bbeellll--ssttyyllee ((aauuddiibbllee)) Controls what happens when rreeaaddlliinnee wants to ring the terminal bell. If set to nnoonnee, rreeaaddlliinnee never rings the bell. If set to vviissiibbllee, rreeaaddlliinnee uses a visible bell if one is available. If set to aauuddiibbllee, rreeaaddlliinnee attempts to ring the terminal's bell. bbiinndd--ttttyy--ssppeecciiaall--cchhaarrss ((OOnn)) If set to OOnn, rreeaaddlliinnee attempts to bind the control characters that are treated specially by the kernel's terminal driver to their rreeaaddlliinnee equivalents. These override the default rreeaaddlliinnee bindings described here. Type "stty -a" at a bbaasshh prompt to see your current terminal settings, including the special control characters (usually cccchhaarrss). bblliinnkk--mmaattcchhiinngg--ppaarreenn ((OOffff)) If set to OOnn, rreeaaddlliinnee attempts to briefly move the cursor to an opening parenthesis when a closing parenthesis is inserted. ccoolloorreedd--ccoommpplleettiioonn--pprreeffiixx ((OOffff)) If set to OOnn, when listing completions, rreeaaddlliinnee displays the common prefix of the set of possible completions using a differ- ent color. The color definitions are taken from the value of the LLSS__CCOOLLOORRSS environment variable. If there is a color defini- tion in $$LLSS__CCOOLLOORRSS for the custom suffix "readline-colored-com- pletion-prefix", rreeaaddlliinnee uses this color for the common prefix instead of its default. ccoolloorreedd--ssttaattss ((OOffff)) If set to OOnn, rreeaaddlliinnee displays possible completions using dif- ferent colors to indicate their file type. The color defini- tions are taken from the value of the LLSS__CCOOLLOORRSS environment variable. ccoommmmeenntt--bbeeggiinn (("##")) The string that the rreeaaddlliinnee iinnsseerrtt--ccoommmmeenntt command inserts. This command is bound to MM--## in emacs mode and to ## in vi com- mand mode. ccoommpplleettiioonn--ddiissppllaayy--wwiiddtthh ((--11)) The number of screen columns used to display possible matches when performing completion. The value is ignored if it is less than 0 or greater than the terminal screen width. A value of 0 causes matches to be displayed one per line. The default value is -1. ccoommpplleettiioonn--iiggnnoorree--ccaassee ((OOffff)) If set to OOnn, rreeaaddlliinnee performs filename matching and completion in a case-insensitive fashion. ccoommpplleettiioonn--mmaapp--ccaassee ((OOffff)) If set to OOnn, and ccoommpplleettiioonn--iiggnnoorree--ccaassee is enabled, rreeaaddlliinnee treats hyphens (_-) and underscores (__) as equivalent when per- forming case-insensitive filename matching and completion. ccoommpplleettiioonn--pprreeffiixx--ddiissppllaayy--lleennggtthh ((00)) The maximum length in characters of the common prefix of a list of possible completions that is displayed without modification. When set to a value greater than zero, rreeaaddlliinnee replaces common prefixes longer than this value with an ellipsis when displaying possible completions. If a completion begins with a period, and eeaaddlliinnee is completing filenames, it uses three underscores in- stead of an ellipsis. ccoommpplleettiioonn--qquueerryy--iitteemmss ((110000)) This determines when the user is queried about viewing the num- ber of possible completions generated by the ppoossssiibbllee--ccoommppllee-- ttiioonnss command. It may be set to any integer value greater than or equal to zero. If the number of possible completions is greater than or equal to the value of this variable, rreeaaddlliinnee asks whether or not the user wishes to view them; otherwise rreeaaddlliinnee simply lists them on the terminal. A zero value means rreeaaddlliinnee should never ask; negative values are treated as zero. ccoonnvveerrtt--mmeettaa ((OOnn)) If set to OOnn, rreeaaddlliinnee converts characters it reads that have the eighth bit set to an ASCII key sequence by clearing the eighth bit and prefixing it with an escape character (converting the character to have the meta prefix). The default is _O_n, but rreeaaddlliinnee sets it to _O_f_f if the locale contains characters whose encodings may include bytes with the eighth bit set. This vari- able is dependent on the LLCC__CCTTYYPPEE locale category, and may change if the locale changes. This variable also affects key bindings; see the description of ffoorrccee--mmeettaa--pprreeffiixx below. ddiissaabbllee--ccoommpplleettiioonn ((OOffff)) If set to OOnn, rreeaaddlliinnee inhibits word completion. Completion characters are inserted into the line as if they had been mapped to sseellff--iinnsseerrtt. eecchhoo--ccoonnttrrooll--cchhaarraacctteerrss ((OOnn)) When set to OOnn, on operating systems that indicate they support it, rreeaaddlliinnee echoes a character corresponding to a signal gener- ated from the keyboard. eeddiittiinngg--mmooddee ((eemmaaccss)) Controls whether rreeaaddlliinnee uses a set of key bindings similar to _E_m_a_c_s or _v_i. eeddiittiinngg--mmooddee can be set to either eemmaaccss or vvii. eemmaaccss--mmooddee--ssttrriinngg ((@@)) If the _s_h_o_w_-_m_o_d_e_-_i_n_-_p_r_o_m_p_t variable is enabled, this string is displayed immediately before the last line of the primary prompt when emacs editing mode is active. The value is expanded like a key binding, so the standard set of meta- and control- prefixes and backslash escape sequences is available. The \1 and \2 es- capes begin and end sequences of non-printing characters, which can be used to embed a terminal control sequence into the mode string. eennaabbllee--aaccttiivvee--rreeggiioonn ((OOnn)) When this variable is set to _O_n, rreeaaddlliinnee allows certain com- mands to designate the region as _a_c_t_i_v_e. When the region is ac- tive, rreeaaddlliinnee highlights the text in the region using the value of the aaccttiivvee--rreeggiioonn--ssttaarrtt--ccoolloorr variable, which defaults to the string that enables the terminal's standout mode. The active region shows the text inserted by bracketed-paste and any match- ing text found by incremental and non-incremental history searches. eennaabbllee--bbrraacckkeetteedd--ppaassttee ((OOnn)) When set to OOnn, rreeaaddlliinnee configures the terminal to insert each paste into the editing buffer as a single string of characters, instead of treating each character as if it had been read from the keyboard. This is called _b_r_a_c_k_e_t_e_d_-_p_a_s_t_e _m_o_d_e; it prevents rreeaaddlliinnee from executing any editing commands bound to key se- quences appearing in the pasted text. eennaabbllee--kkeeyyppaadd ((OOffff)) When set to OOnn, rreeaaddlliinnee tries to enable the application keypad when it is called. Some systems need this to enable the arrow keys. eennaabbllee--mmeettaa--kkeeyy ((OOnn)) When set to OOnn, rreeaaddlliinnee tries to enable any meta modifier key the terminal claims to support. On many terminals, the Meta key is used to send eight-bit characters; this variable checks for the terminal capability that indicates the terminal can enable and disable a mode that sets the eighth bit of a character (0200) if the Meta key is held down when the character is typed (a meta character). eexxppaanndd--ttiillddee ((OOffff)) If set to OOnn, rreeaaddlliinnee performs tilde expansion when it attempts word completion. ffoorrccee--mmeettaa--pprreeffiixx ((OOffff)) If set to OOnn, rreeaaddlliinnee modifies its behavior when binding key sequences containing \M- or Meta- (see KKeeyy BBiinnddiinnggss above) by converting a key sequence of the form \M-_C or Meta-_C to the two- character sequence EESSCC _C (adding the meta prefix). If ffoorrccee--mmeettaa--pprreeffiixx is set to OOffff (the default), rreeaaddlliinnee uses the value of the ccoonnvveerrtt--mmeettaa variable to determine whether to per- form this conversion: if ccoonnvveerrtt--mmeettaa is OOnn, rreeaaddlliinnee performs the conversion described above; if it is OOffff, rreeaaddlliinnee converts _C to a meta character by setting the eighth bit (0200). hhiissttoorryy--pprreesseerrvvee--ppooiinntt ((OOffff)) If set to OOnn, the history code attempts to place point at the same location on each history line retrieved with pprreevviioouuss--hhiiss-- ttoorryy or nneexxtt--hhiissttoorryy. hhiissttoorryy--ssiizzee ((uunnsseett)) Set the maximum number of history entries saved in the history list. If set to zero, any existing history entries are deleted and no new entries are saved. If set to a value less than zero, the number of history entries is not limited. By default, the number of history entries is not limited. Setting _h_i_s_t_o_r_y_-_s_i_z_e to a non-numeric value will set the maximum number of history entries to 500. hhoorriizzoonnttaall--ssccrroollll--mmooddee ((OOffff)) Setting this variable to OOnn makes rreeaaddlliinnee use a single line for display, scrolling the input horizontally on a single screen line when it becomes longer than the screen width rather than wrapping to a new line. This setting is automatically enabled for terminals of height 1. iinnppuutt--mmeettaa ((OOffff)) If set to OOnn, rreeaaddlliinnee enables eight-bit input (that is, it does not clear the eighth bit in the characters it reads), regardless of what the terminal claims it can support. The default is _O_f_f, but rreeaaddlliinnee sets it to _O_n if the locale contains characters whose encodings may include bytes with the eighth bit set. This variable is dependent on the LLCC__CCTTYYPPEE locale category, and its value may change if the locale changes. The name mmeettaa--ffllaagg is a synonym for iinnppuutt--mmeettaa. iisseeaarrcchh--tteerrmmiinnaattoorrss (("CC--[[CC--jj")) The string of characters that should terminate an incremental search without subsequently executing the character as a com- mand. If this variable has not been given a value, the charac- ters _E_S_C and CC--jj terminate an incremental search. kkeeyymmaapp ((eemmaaccss)) Set the current rreeaaddlliinnee keymap. The set of valid keymap names is _e_m_a_c_s_, _e_m_a_c_s_-_s_t_a_n_d_a_r_d_, _e_m_a_c_s_-_m_e_t_a_, _e_m_a_c_s_-_c_t_l_x_, _v_i_, _v_i_-_c_o_m_- _m_a_n_d, and _v_i_-_i_n_s_e_r_t. _v_i is equivalent to _v_i_-_c_o_m_m_a_n_d; _e_m_a_c_s is equivalent to _e_m_a_c_s_-_s_t_a_n_d_a_r_d. The default value is _e_m_a_c_s; the value of eeddiittiinngg--mmooddee also affects the default keymap. kkeeyysseeqq--ttiimmeeoouutt ((550000)) Specifies the duration rreeaaddlliinnee will wait for a character when reading an ambiguous key sequence (one that can form a complete key sequence using the input read so far, or can take additional input to complete a longer key sequence). If rreeaaddlliinnee does not receive any input within the timeout, it uses the shorter but complete key sequence. The value is specified in milliseconds, so a value of 1000 means that rreeaaddlliinnee will wait one second for additional input. If this variable is set to a value less than or equal to zero, or to a non-numeric value, rreeaaddlliinnee waits un- til another key is pressed to decide which key sequence to com- plete. mmaarrkk--ddiirreeccttoorriieess ((OOnn)) If set to OOnn, completed directory names have a slash appended. mmaarrkk--mmooddiiffiieedd--lliinneess ((OOffff)) If set to OOnn, rreeaaddlliinnee displays history lines that have been modified with a preceding asterisk (**). mmaarrkk--ssyymmlliinnkkeedd--ddiirreeccttoorriieess ((OOffff)) If set to OOnn, completed names which are symbolic links to direc- tories have a slash appended, subject to the value of mmaarrkk--ddii-- rreeccttoorriieess. mmaattcchh--hhiiddddeenn--ffiilleess ((OOnn)) This variable, when set to OOnn, forces rreeaaddlliinnee to match files whose names begin with a "." (hidden files) when performing filename completion. If set to OOffff, the user must include the leading "." in the filename to be completed. mmeennuu--ccoommpplleettee--ddiissppllaayy--pprreeffiixx ((OOffff)) If set to OOnn, menu completion displays the common prefix of the list of possible completions (which may be empty) before cycling through the list. oouuttppuutt--mmeettaa ((OOffff)) If set to OOnn, rreeaaddlliinnee displays characters with the eighth bit set directly rather than as a meta-prefixed escape sequence. The default is _O_f_f, but rreeaaddlliinnee sets it to _O_n if the locale contains characters whose encodings may include bytes with the eighth bit set. This variable is dependent on the LLCC__CCTTYYPPEE lo- cale category, and its value may change if the locale changes. ppaaggee--ccoommpplleettiioonnss ((OOnn)) If set to OOnn, rreeaaddlliinnee uses an internal pager resembling _m_o_r_e(1) to display a screenful of possible completions at a time. pprreeffeerr--vviissiibbllee--bbeellll See bbeellll--ssttyyllee. pprriinntt--ccoommpplleettiioonnss--hhoorriizzoonnttaallllyy ((OOffff)) If set to OOnn, rreeaaddlliinnee displays completions with matches sorted horizontally in alphabetical order, rather than down the screen. rreevveerrtt--aallll--aatt--nneewwlliinnee ((OOffff)) If set to OOnn, rreeaaddlliinnee will undo all changes to history lines before returning when executing aacccceepptt--lliinnee. By default, his- tory lines may be modified and retain individual undo lists across calls to rreeaaddlliinnee(()). sseeaarrcchh--iiggnnoorree--ccaassee ((OOffff)) If set to OOnn, rreeaaddlliinnee performs incremental and non-incremental history list searches in a case-insensitive fashion. sshhooww--aallll--iiff--aammbbiigguuoouuss ((OOffff)) This alters the default behavior of the completion functions. If set to OOnn, words which have more than one possible completion cause the matches to be listed immediately instead of ringing the bell. sshhooww--aallll--iiff--uunnmmooddiiffiieedd ((OOffff)) This alters the default behavior of the completion functions in a fashion similar to sshhooww--aallll--iiff--aammbbiigguuoouuss. If set to OOnn, words which have more than one possible completion without any possi- ble partial completion (the possible completions don't share a common prefix) cause the matches to be listed immediately in- stead of ringing the bell. sshhooww--mmooddee--iinn--pprroommpptt ((OOffff)) If set to OOnn, add a string to the beginning of the prompt indi- cating the editing mode: emacs, vi command, or vi insertion. The mode strings are user-settable (e.g., _e_m_a_c_s_-_m_o_d_e_-_s_t_r_i_n_g). sskkiipp--ccoommpplleetteedd--tteexxtt ((OOffff)) If set to OOnn, this alters the default completion behavior when inserting a single match into the line. It's only active when performing completion in the middle of a word. If enabled, rreeaaddlliinnee does not insert characters from the completion that match characters after point in the word being completed, so portions of the word following the cursor are not duplicated. vvii--ccmmdd--mmooddee--ssttrriinngg ((((ccmmdd)))) If the _s_h_o_w_-_m_o_d_e_-_i_n_-_p_r_o_m_p_t variable is enabled, this string is displayed immediately before the last line of the primary prompt when vi editing mode is active and in command mode. The value is expanded like a key binding, so the standard set of meta- and control- prefixes and backslash escape sequences is available. The \1 and \2 escapes begin and end sequences of non-printing characters, which can be used to embed a terminal control se- quence into the mode string. vvii--iinnss--mmooddee--ssttrriinngg ((((iinnss)))) If the _s_h_o_w_-_m_o_d_e_-_i_n_-_p_r_o_m_p_t variable is enabled, this string is displayed immediately before the last line of the primary prompt when vi editing mode is active and in insertion mode. The value is expanded like a key binding, so the standard set of meta- and control- prefixes and backslash escape sequences is available. The \1 and \2 escapes begin and end sequences of non-printing characters, which can be used to embed a terminal control se- quence into the mode string. vviissiibbllee--ssttaattss ((OOffff)) If set to OOnn, a character denoting a file's type as reported by _s_t_a_t(2) is appended to the filename when listing possible com- pletions. CCoonnddiittiioonnaall CCoonnssttrruuccttss RReeaaddlliinnee implements a facility similar in spirit to the conditional compilation features of the C preprocessor which allows key bindings and variable settings to be performed as the result of tests. There are four parser directives available. $$iiff The $$iiff construct allows bindings to be made based on the edit- ing mode, the terminal being used, or the application using rreeaaddlliinnee. The text of the test, after any comparison operator, extends to the end of the line; unless otherwise noted, no char- acters are required to isolate it. mmooddee The mmooddee== form of the $$iiff directive is used to test whether rreeaaddlliinnee is in emacs or vi mode. This may be used in conjunction with the sseett kkeeyymmaapp command, for in- stance, to set bindings in the _e_m_a_c_s_-_s_t_a_n_d_a_r_d and _e_m_a_c_s_-_c_t_l_x keymaps only if rreeaaddlliinnee is starting out in emacs mode. tteerrmm The tteerrmm== form may be used to include terminal-specific key bindings, perhaps to bind the key sequences output by the terminal's function keys. The word on the right side of the == is tested against both the full name of the ter- minal and the portion of the terminal name before the first --. This allows _x_t_e_r_m to match both _x_t_e_r_m and _x_t_e_r_m_-_2_5_6_c_o_l_o_r, for instance. vveerrssiioonn The vveerrssiioonn test may be used to perform comparisons against specific rreeaaddlliinnee versions. The vveerrssiioonn expands to the current rreeaaddlliinnee version. The set of comparison operators includes ==, (and ====), !!==, <<==, >>==, <<, and >>. The version number supplied on the right side of the op- erator consists of a major version number, an optional decimal point, and an optional minor version (e.g., 77..11). If the minor version is omitted, it defaults to 00. The operator may be separated from the string vveerrssiioonn and from the version number argument by whitespace. _a_p_p_l_i_c_a_t_i_o_n The _a_p_p_l_i_c_a_t_i_o_n construct is used to include application- specific settings. Each program using the rreeaaddlliinnee li- brary sets the _a_p_p_l_i_c_a_t_i_o_n _n_a_m_e, and an initialization file can test for a particular value. This could be used to bind key sequences to functions useful for a specific program. For instance, the following command adds a key sequence that quotes the current or previous word in bbaasshh: $$iiff Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $$eennddiiff _v_a_r_i_a_b_l_e The _v_a_r_i_a_b_l_e construct provides simple equality tests for rreeaaddlliinnee variables and values. The permitted comparison operators are _=, _=_=, and _!_=. The variable name must be separated from the comparison operator by whitespace; the operator may be separated from the value on the right hand side by whitespace. String and boolean variables may be tested. Boolean variables must be tested against the values _o_n and _o_f_f. $$eellssee Commands in this branch of the $$iiff directive are executed if the test fails. $$eennddiiff This command, as seen in the previous example, terminates an $$iiff command. $$iinncclluuddee This directive takes a single filename as an argument and reads commands and key bindings from that file. For example, the fol- lowing directive would read _/_e_t_c_/_i_n_p_u_t_r_c: $$iinncclluuddee _/_e_t_c_/_i_n_p_u_t_r_c SSEEAARRCCHHIINNGG RReeaaddlliinnee provides commands for searching through the command history for lines containing a specified string. There are two search modes: _i_n_c_r_e_m_e_n_t_a_l and _n_o_n_-_i_n_c_r_e_m_e_n_t_a_l. Incremental searches begin before the user has finished typing the search string. As each character of the search string is typed, rreeaadd-- lliinnee displays the next entry from the history matching the string typed so far. An incremental search requires only as many characters as needed to find the desired history entry. When using emacs editing mode, type CC--rr to search backward in the history for a particular string. Typing CC--ss searches forward through the history. The charac- ters present in the value of the iisseeaarrcchh--tteerrmmiinnaattoorrss variable are used to terminate an incremental search. If that variable has not been as- signed a value, _E_S_C and CC--jj terminate an incremental search. CC--gg aborts an incremental search and restores the original line. When the search is terminated, the history entry containing the search string becomes the current line. To find other matching entries in the history list, type CC--rr or CC--ss as appropriate. This searches backward or forward in the history for the next entry matching the search string typed so far. Any other key se- quence bound to a rreeaaddlliinnee command terminates the search and executes that command. For instance, a newline terminates the search and ac- cepts the line, thereby executing the command from the history list. A movement command will terminate the search, make the last line found the current line, and begin editing. RReeaaddlliinnee remembers the last incremental search string. If two CC--rrs are typed without any intervening characters defining a new search string, rreeaaddlliinnee uses any remembered search string. Non-incremental searches read the entire search string before starting to search for matching history entries. The search string may be typed by the user or be part of the contents of the current line. EEDDIITTIINNGG CCOOMMMMAANNDDSS The following is a list of the names of the commands and the default key sequences to which they are bound. Command names without an accom- panying key sequence are unbound by default. In the following descriptions, _p_o_i_n_t refers to the current cursor posi- tion, and _m_a_r_k refers to a cursor position saved by the sseett--mmaarrkk com- mand. The text between the point and mark is referred to as the _r_e_- _g_i_o_n. RReeaaddlliinnee has the concept of an _a_c_t_i_v_e _r_e_g_i_o_n: when the region is active, rreeaaddlliinnee redisplay highlights the region using the value of the aaccttiivvee--rreeggiioonn--ssttaarrtt--ccoolloorr variable. The eennaabbllee--aaccttiivvee--rreeggiioonn variable turns this on and off. Several commands set the region to active; those are noted below. CCoommmmaannddss ffoorr MMoovviinngg bbeeggiinnnniinngg--ooff--lliinnee ((CC--aa)) Move to the start of the current line. This may also be bound to the Home key on some keyboards. eenndd--ooff--lliinnee ((CC--ee)) Move to the end of the line. This may also be bound to the End key on some keyboards. ffoorrwwaarrdd--cchhaarr ((CC--ff)) Move forward a character. This may also be bound to the right arrow key on some keyboards. bbaacckkwwaarrdd--cchhaarr ((CC--bb)) Move back a character. ffoorrwwaarrdd--wwoorrdd ((MM--ff)) Move forward to the end of the next word. Words are composed of alphanumeric characters (letters and digits). bbaacckkwwaarrdd--wwoorrdd ((MM--bb)) Move back to the start of the current or previous word. Words are composed of alphanumeric characters (letters and digits). pprreevviioouuss--ssccrreeeenn--lliinnee Attempt to move point to the same physical screen column on the previous physical screen line. This will not have the desired effect if the current rreeaaddlliinnee line does not take up more than one physical line or if point is not greater than the length of the prompt plus the screen width. nneexxtt--ssccrreeeenn--lliinnee Attempt to move point to the same physical screen column on the next physical screen line. This will not have the desired ef- fect if the current rreeaaddlliinnee line does not take up more than one physical line or if the length of the current rreeaaddlliinnee line is not greater than the length of the prompt plus the screen width. cclleeaarr--ddiissppllaayy ((MM--CC--ll)) Clear the screen and, if possible, the terminal's scrollback buffer, then redraw the current line, leaving the current line at the top of the screen. cclleeaarr--ssccrreeeenn ((CC--ll)) Clear the screen, then redraw the current line, leaving the cur- rent line at the top of the screen. With a numeric argument, refresh the current line without clearing the screen. rreeddrraaww--ccuurrrreenntt--lliinnee Refresh the current line. CCoommmmaannddss ffoorr MMaanniippuullaattiinngg tthhee HHiissttoorryy aacccceepptt--lliinnee ((NNeewwlliinnee,, RReettuurrnn)) Accept the line regardless of where the cursor is. If this line is non-empty, it may be added to the history list for future re- call with aadddd__hhiissttoorryy(()). If the line is a modified history line, restore the history line to its original state. pprreevviioouuss--hhiissttoorryy ((CC--pp)) Fetch the previous command from the history list, moving back in the list. This may also be bound to the up arrow key on some keyboards. nneexxtt--hhiissttoorryy ((CC--nn)) Fetch the next command from the history list, moving forward in the list. This may also be bound to the down arrow key on some keyboards. bbeeggiinnnniinngg--ooff--hhiissttoorryy ((MM--<<)) Move to the first line in the history. eenndd--ooff--hhiissttoorryy ((MM-->>)) Move to the end of the input history, i.e., the line currently being entered. ooppeerraattee--aanndd--ggeett--nneexxtt ((CC--oo)) Accept the current line for return to the calling application as if a newline had been entered, and fetch the next line relative to the current line from the history for editing. A numeric ar- gument, if supplied, specifies the history entry to use instead of the current line. ffeettcchh--hhiissttoorryy With a numeric argument, fetch that entry from the history list and make it the current line. Without an argument, move back to the first entry in the history list. rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((CC--rr)) Search backward starting at the current line and moving "up" through the history as necessary. This is an incremental search. This command sets the region to the matched text and activates the region. ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((CC--ss)) Search forward starting at the current line and moving "down" through the history as necessary. This is an incremental search. This command sets the region to the matched text and activates the region. nnoonn--iinnccrreemmeennttaall--rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((MM--pp)) Search backward through the history starting at the current line using a non-incremental search for a string supplied by the user. The search string may match anywhere in a history line. nnoonn--iinnccrreemmeennttaall--ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((MM--nn)) Search forward through the history using a non-incremental search for a string supplied by the user. The search string may match anywhere in a history line. hhiissttoorryy--sseeaarrcchh--bbaacckkwwaarrdd Search backward through the history for the string of characters between the start of the current line and the point. The search string must match at the beginning of a history line. This is a non-incremental search. This may be bound to the Page Up key on some keyboards. hhiissttoorryy--sseeaarrcchh--ffoorrwwaarrdd Search forward through the history for the string of characters between the start of the current line and the point. The search string must match at the beginning of a history line. This is a non-incremental search. This may be bound to the Page Down key on some keyboards. hhiissttoorryy--ssuubbssttrriinngg--sseeaarrcchh--bbaacckkwwaarrdd Search backward through the history for the string of characters between the start of the current line and the point. The search string may match anywhere in a history line. This is a non-in- cremental search. hhiissttoorryy--ssuubbssttrriinngg--sseeaarrcchh--ffoorrwwaarrdd Search forward through the history for the string of characters between the start of the current line and the point. The search string may match anywhere in a history line. This is a non-in- cremental search. yyaannkk--nntthh--aarrgg ((MM--CC--yy)) Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument _n, insert the _nth word from the previous command (the words in the previous command begin with word 0). A negative argument in- serts the _nth word from the end of the previous command. Once the argument _n is computed, this uses the history expansion fa- cilities to extract the _nth word, as if the "!_n" history expan- sion had been specified. yyaannkk--llaasstt--aarrgg ((MM--..,, MM--__)) Insert the last argument to the previous command (the last word of the previous history entry). With a numeric argument, behave exactly like yyaannkk--nntthh--aarrgg. Successive calls to yyaannkk--llaasstt--aarrgg move back through the history list, inserting the last word (or the word specified by the argument to the first call) of each line in turn. Any numeric argument supplied to these successive calls determines the direction to move through the history. A negative argument switches the direction through the history (back or forward). This uses the history expansion facilities to extract the last word, as if the "!$" history expansion had been specified. CCoommmmaannddss ffoorr CChhaannggiinngg TTeexxtt _e_n_d_-_o_f_-_f_i_l_e ((uussuuaallllyy CC--dd)) The character indicating end-of-file as set, for example, by _s_t_t_y(1). If this character is read when there are no characters on the line, and point is at the beginning of the line, rreeaaddlliinnee interprets it as the end of input and returns EEOOFF. ddeelleettee--cchhaarr ((CC--dd)) Delete the character at point. If this function is bound to the same character as the tty EEOOFF character, as CC--dd commonly is, see above for the effects. This may also be bound to the Delete key on some keyboards. bbaacckkwwaarrdd--ddeelleettee--cchhaarr ((RRuubboouutt)) Delete the character behind the cursor. When given a numeric argument, save the deleted text on the kill ring. ffoorrwwaarrdd--bbaacckkwwaarrdd--ddeelleettee--cchhaarr Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the cur- sor is deleted. qquuootteedd--iinnsseerrtt ((CC--qq,, CC--vv)) Add the next character typed to the line verbatim. This is how to insert characters like CC--qq, for example. ttaabb--iinnsseerrtt ((MM--TTAABB)) Insert a tab character. sseellff--iinnsseerrtt ((aa,, bb,, AA,, 11,, !!,, ...)) Insert the character typed. bbrraacckkeetteedd--ppaassttee--bbeeggiinn This function is intended to be bound to the "bracketed paste" escape sequence sent by some terminals, and such a binding is assigned by default. It allows rreeaaddlliinnee to insert the pasted text as a single unit without treating each character as if it had been read from the keyboard. The pasted characters are in- serted as if each one was bound to sseellff--iinnsseerrtt instead of exe- cuting any editing commands. Bracketed paste sets the region to the inserted text and acti- vates the region. ttrraannssppoossee--cchhaarrss ((CC--tt)) Drag the character before point forward over the character at point, moving point forward as well. If point is at the end of the line, then this transposes the two characters before point. Negative arguments have no effect. ttrraannssppoossee--wwoorrddss ((MM--tt)) Drag the word before point past the word after point, moving point past that word as well. If point is at the end of the line, this transposes the last two words on the line. uuppccaassee--wwoorrdd ((MM--uu)) Uppercase the current (or following) word. With a negative ar- gument, uppercase the previous word, but do not move point. ddoowwnnccaassee--wwoorrdd ((MM--ll)) Lowercase the current (or following) word. With a negative ar- gument, lowercase the previous word, but do not move point. ccaappiittaalliizzee--wwoorrdd ((MM--cc)) Capitalize the current (or following) word. With a negative ar- gument, capitalize the previous word, but do not move point. oovveerrwwrriittee--mmooddee Toggle overwrite mode. With an explicit positive numeric argu- ment, switches to overwrite mode. With an explicit non-positive numeric argument, switches to insert mode. This command affects only eemmaaccss mode; vvii mode does overwrite differently. Each call to _r_e_a_d_l_i_n_e_(_) starts in insert mode. In overwrite mode, characters bound to sseellff--iinnsseerrtt replace the text at point rather than pushing the text to the right. Char- acters bound to bbaacckkwwaarrdd--ddeelleettee--cchhaarr replace the character be- fore point with a space. By default, this command is unbound, but may be bound to the Insert key on some keyboards. KKiilllliinngg aanndd YYaannkkiinngg kkiillll--lliinnee ((CC--kk)) Kill the text from point to the end of the current line. With a negative numeric argument, kill backward from the cursor to the beginning of the line. bbaacckkwwaarrdd--kkiillll--lliinnee ((CC--xx RRuubboouutt)) Kill backward to the beginning of the current line. With a neg- ative numeric argument, kill forward from the cursor to the end of the line. uunniixx--lliinnee--ddiissccaarrdd ((CC--uu)) Kill backward from point to the beginning of the line, saving the killed text on the kill-ring. kkiillll--wwhhoollee--lliinnee Kill all characters on the current line, no matter where point is. kkiillll--wwoorrdd ((MM--dd)) Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as those used by ffoorrwwaarrdd--wwoorrdd. bbaacckkwwaarrdd--kkiillll--wwoorrdd ((MM--RRuubboouutt)) Kill the word behind point. Word boundaries are the same as those used by bbaacckkwwaarrdd--wwoorrdd. uunniixx--wwoorrdd--rruubboouutt ((CC--ww)) Kill the word behind point, using white space as a word bound- ary, saving the killed text on the kill-ring. uunniixx--ffiilleennaammee--rruubboouutt Kill the word behind point, using white space and the slash character as the word boundaries, saving the killed text on the kill-ring. ddeelleettee--hhoorriizzoonnttaall--ssppaaccee ((MM--\\)) Delete all spaces and tabs around point. kkiillll--rreeggiioonn Kill the text in the current region. ccooppyy--rreeggiioonn--aass--kkiillll Copy the text in the region to the kill buffer, so it can be yanked immediately. ccooppyy--bbaacckkwwaarrdd--wwoorrdd Copy the word before point to the kill buffer. The word bound- aries are the same as bbaacckkwwaarrdd--wwoorrdd. ccooppyy--ffoorrwwaarrdd--wwoorrdd Copy the word following point to the kill buffer. The word boundaries are the same as ffoorrwwaarrdd--wwoorrdd. yyaannkk ((CC--yy)) Yank the top of the kill ring into the buffer at point. yyaannkk--ppoopp ((MM--yy)) Rotate the kill ring, and yank the new top. Only works follow- ing yyaannkk or yyaannkk--ppoopp. NNuummeerriicc AArrgguummeennttss ddiiggiitt--aarrgguummeenntt ((MM--00,, MM--11,, ...,, MM----)) Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument. uunniivveerrssaall--aarrgguummeenntt This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. If the command is fol- lowed by digits, executing uunniivveerrssaall--aarrgguummeenntt again ends the nu- meric argument, but is otherwise ignored. As a special case, if this command is immediately followed by a character that is nei- ther a digit nor minus sign, the argument count for the next command is multiplied by four. The argument count is initially one, so executing this function the first time makes the argu- ment count four, a second time makes the argument count sixteen, and so on. CCoommpplleettiinngg ccoommpplleettee ((TTAABB)) Attempt to perform completion on the text before point. The ac- tual completion performed is application-specific. BBaasshh, for instance, attempts programmable completion first, otherwise treating the text as a variable (if the text begins with $$), username (if the text begins with ~~), hostname (if the text be- gins with @@), or command (including aliases, functions, and builtins) in turn. If none of these produces a match, it falls back to filename completion. GGddbb, on the other hand, allows completion of program functions and variables, and only attempts filename completion under certain circumstances. The default rreeaaddlliinnee completion is filename completion. ppoossssiibbllee--ccoommpplleettiioonnss ((MM--??)) List the possible completions of the text before point. When displaying completions, rreeaaddlliinnee sets the number of columns used for display to the value of ccoommpplleettiioonn--ddiissppllaayy--wwiiddtthh, the value of the environment variable CCOOLLUUMMNNSS, or the screen width, in that order. iinnsseerrtt--ccoommpplleettiioonnss ((MM--**)) Insert all completions of the text before point that would have been generated by ppoossssiibbllee--ccoommpplleettiioonnss, separated by a space. mmeennuu--ccoommpplleettee Similar to ccoommpplleettee, but replaces the word to be completed with a single match from the list of possible completions. Repeat- edly executing mmeennuu--ccoommpplleettee steps through the list of possible completions, inserting each match in turn. At the end of the list of completions, mmeennuu--ccoommpplleettee rings the bell (subject to the setting of bbeellll--ssttyyllee) and restores the original text. An argument of _n moves _n positions forward in the list of matches; a negative argument moves backward through the list. This com- mand is intended to be bound to TTAABB, but is unbound by default. mmeennuu--ccoommpplleettee--bbaacckkwwaarrdd Identical to mmeennuu--ccoommpplleettee, but moves backward through the list of possible completions, as if mmeennuu--ccoommpplleettee had been given a negative argument. This command is unbound by default. eexxppoorrtt--ccoommpplleettiioonnss Perform completion on the word before point as described above and write the list of possible completions to rreeaaddlliinnee's output stream using the following format, writing information on sepa- rate lines: +o the number of matches _N; +o the word being completed; +o _S:_E, where _S and _E are the start and end offsets of the word in the rreeaaddlliinnee line buffer; then +o each match, one per line If there are no matches, the first line will be "0", and this command does not print any output after the _S:_E. If there is only a single match, this prints a single line containing it. If there is more than one match, this prints the common prefix of the matches, which may be empty, on the first line after the _S:_E, then the matches on subsequent lines. In this case, _N will include the first line with the common prefix. The user or application should be able to accommodate the possi- bility of a blank line. The intent is that the user or applica- tion reads _N lines after the line containing _S:_E to obtain the match list. This command is unbound by default. ddeelleettee--cchhaarr--oorr--lliisstt Deletes the character under the cursor if not at the beginning or end of the line (like ddeelleettee--cchhaarr). At the end of the line, it behaves identically to ppoossssiibbllee--ccoommpplleettiioonnss. This command is unbound by default. KKeeyybbooaarrdd MMaaccrrooss ssttaarrtt--kkbbdd--mmaaccrroo ((CC--xx (()) Begin saving the characters typed into the current keyboard macro. eenndd--kkbbdd--mmaaccrroo ((CC--xx )))) Stop saving the characters typed into the current keyboard macro and store the definition. ccaallll--llaasstt--kkbbdd--mmaaccrroo ((CC--xx ee)) Re-execute the last keyboard macro defined, by making the char- acters in the macro appear as if typed at the keyboard. pprriinntt--llaasstt--kkbbdd--mmaaccrroo (()) Print the last keyboard macro defined in a format suitable for the _i_n_p_u_t_r_c file. MMiisscceellllaanneeoouuss rree--rreeaadd--iinniitt--ffiillee ((CC--xx CC--rr)) Read in the contents of the _i_n_p_u_t_r_c file, and incorporate any bindings or variable assignments found there. aabboorrtt ((CC--gg)) Abort the current editing command and ring the terminal's bell (subject to the setting of bbeellll--ssttyyllee). ddoo--lloowweerrccaassee--vveerrssiioonn ((MM--AA,, MM--BB,, MM--_x,, ...)) If the metafied character _x is uppercase, run the command that is bound to the corresponding metafied lowercase character. The behavior is undefined if _x is already lowercase. pprreeffiixx--mmeettaa ((EESSCC)) Metafy the next character typed. EESSCC ff is equivalent to MMeettaa--ff. uunnddoo ((CC--__,, CC--xx CC--uu)) Incremental undo, separately remembered for each line. rreevveerrtt--lliinnee ((MM--rr)) Undo all changes made to this line. This is like executing the uunnddoo command enough times to return the line to its initial state. ttiillddee--eexxppaanndd ((MM--~~)) Perform tilde expansion on the current word. sseett--mmaarrkk ((CC--@@,, MM--<>)) Set the mark to the point. If a numeric argument is supplied, set the mark to that position. eexxcchhaannggee--ppooiinntt--aanndd--mmaarrkk ((CC--xx CC--xx)) Swap the point with the mark. Set the current cursor position to the saved position, then set the mark to the old cursor posi- tion. cchhaarraacctteerr--sseeaarrcchh ((CC--]])) Read a character and move point to the next occurrence of that character. A negative argument searches for previous occur- rences. cchhaarraacctteerr--sseeaarrcchh--bbaacckkwwaarrdd ((MM--CC--]])) Read a character and move point to the previous occurrence of that character. A negative argument searches for subsequent oc- currences. sskkiipp--ccssii--sseeqquueennccee Read enough characters to consume a multi-key sequence such as those defined for keys like Home and End. CSI sequences begin with a Control Sequence Indicator (CSI), usually _E_S_C _[. If this sequence is bound to "\e[", keys producing CSI sequences have no effect unless explicitly bound to a rreeaaddlliinnee command, instead of inserting stray characters into the editing buffer. This is un- bound by default, but usually bound to _E_S_C _[. iinnsseerrtt--ccoommmmeenntt ((MM--##)) Without a numeric argument, insert the value of the rreeaaddlliinnee ccoommmmeenntt--bbeeggiinn variable at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if the characters at the beginning of the line do not match the value of ccoommmmeenntt--bbeeggiinn, insert the value; otherwise delete the characters in ccoommmmeenntt--bbeeggiinn from the beginning of the line. In either case, the line is accepted as if a newline had been typed. The default value of ccoommmmeenntt--bbeeggiinn causes this command to make the current line a shell comment. If a numeric argument causes the comment character to be removed, the line will be ex- ecuted by the shell. dduummpp--ffuunnccttiioonnss Print all of the functions and their key bindings to the rreeaadd-- lliinnee output stream. If a numeric argument is supplied, the out- put is formatted in such a way that it can be made part of an _i_n_p_u_t_r_c file. dduummpp--vvaarriiaabblleess Print all of the settable variables and their values to the rreeaaddlliinnee output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an _i_n_p_u_t_r_c file. dduummpp--mmaaccrrooss Print all of the rreeaaddlliinnee key sequences bound to macros and the strings they output to the rreeaaddlliinnee output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an _i_n_p_u_t_r_c file. eexxeeccuuttee--nnaammeedd--ccoommmmaanndd ((MM--xx)) Read a bindable rreeaaddlliinnee command name from the input and execute the function to which it's bound, as if the key sequence to which it was bound appeared in the input. If this function is supplied with a numeric argument, it passes that argument to the function it executes. eemmaaccss--eeddiittiinngg--mmooddee ((CC--ee)) When in vvii command mode, this switches rreeaaddlliinnee to eemmaaccss editing mode. vvii--eeddiittiinngg--mmooddee ((MM--CC--jj)) When in eemmaaccss editing mode, this switches to vvii editing mode. DDEEFFAAUULLTT KKEEYY BBIINNDDIINNGGSS The following is a list of the default emacs and vi bindings. Charac- ters with the eighth bit set are written as M-, and are re- ferred to as _m_e_t_a_f_i_e_d characters. The printable ASCII characters not mentioned in the list of emacs standard bindings are bound to the sseellff--iinnsseerrtt function, which just inserts the given character into the input line. In vi insertion mode, all characters not specifically men- tioned are bound to sseellff--iinnsseerrtt. Characters assigned to signal genera- tion by _s_t_t_y(1) or the terminal driver, such as C-Z or C-C, retain that function. Upper and lower case metafied characters are bound to the same function in the emacs mode meta keymap. The remaining characters are unbound, which causes rreeaaddlliinnee to ring the bell (subject to the setting of the bbeellll--ssttyyllee variable). EEmmaaccss MMooddee Emacs Standard bindings "C-@" set-mark "C-A" beginning-of-line "C-B" backward-char "C-D" delete-char "C-E" end-of-line "C-F" forward-char "C-G" abort "C-H" backward-delete-char "C-I" complete "C-J" accept-line "C-K" kill-line "C-L" clear-screen "C-M" accept-line "C-N" next-history "C-P" previous-history "C-Q" quoted-insert "C-R" reverse-search-history "C-S" forward-search-history "C-T" transpose-chars "C-U" unix-line-discard "C-V" quoted-insert "C-W" unix-word-rubout "C-Y" yank "C-]" character-search "C-_" undo " " to "/" self-insert "0" to "9" self-insert ":" to "~" self-insert "C-?" backward-delete-char Emacs Meta bindings "M-C-G" abort "M-C-H" backward-kill-word "M-C-I" tab-insert "M-C-J" vi-editing-mode "M-C-L" clear-display "M-C-M" vi-editing-mode "M-C-R" revert-line "M-C-Y" yank-nth-arg "M-C-[" complete "M-C-]" character-search-backward "M-space" set-mark "M-#" insert-comment "M-&" tilde-expand "M-*" insert-completions "M--" digit-argument "M-." yank-last-arg "M-0" digit-argument "M-1" digit-argument "M-2" digit-argument "M-3" digit-argument "M-4" digit-argument "M-5" digit-argument "M-6" digit-argument "M-7" digit-argument "M-8" digit-argument "M-9" digit-argument "M-<" beginning-of-history "M-=" possible-completions "M->" end-of-history "M-?" possible-completions "M-B" backward-word "M-C" capitalize-word "M-D" kill-word "M-F" forward-word "M-L" downcase-word "M-N" non-incremental-forward-search-history "M-P" non-incremental-reverse-search-history "M-R" revert-line "M-T" transpose-words "M-U" upcase-word "M-X" execute-named-command "M-Y" yank-pop "M-\" delete-horizontal-space "M-~" tilde-expand "M-C-?" backward-kill-word "M-_" yank-last-arg Emacs Control-X bindings "C-XC-G" abort "C-XC-R" re-read-init-file "C-XC-U" undo "C-XC-X" exchange-point-and-mark "C-X(" start-kbd-macro "C-X)" end-kbd-macro "C-XE" call-last-kbd-macro "C-XC-?" backward-kill-line VVII MMooddee bbiinnddiinnggss VI Insert Mode functions "C-D" vi-eof-maybe "C-H" backward-delete-char "C-I" complete "C-J" accept-line "C-M" accept-line "C-N" menu-complete "C-P" menu-complete-backward "C-R" reverse-search-history "C-S" forward-search-history "C-T" transpose-chars "C-U" unix-line-discard "C-V" quoted-insert "C-W" vi-unix-word-rubout "C-Y" yank "C-[" vi-movement-mode "C-_" vi-undo " " to "~" self-insert "C-?" backward-delete-char VI Command Mode functions "C-D" vi-eof-maybe "C-E" emacs-editing-mode "C-G" abort "C-H" backward-char "C-J" accept-line "C-K" kill-line "C-L" clear-screen "C-M" accept-line "C-N" next-history "C-P" previous-history "C-Q" quoted-insert "C-R" reverse-search-history "C-S" forward-search-history "C-T" transpose-chars "C-U" unix-line-discard "C-V" quoted-insert "C-W" vi-unix-word-rubout "C-Y" yank "C-_" vi-undo " " forward-char "#" insert-comment "$" end-of-line "%" vi-match "&" vi-tilde-expand "*" vi-complete "+" next-history "," vi-char-search "-" previous-history "." vi-redo "/" vi-search "0" beginning-of-line "1" to "9" vi-arg-digit ";" vi-char-search "=" vi-complete "?" vi-search "A" vi-append-eol "B" vi-prev-word "C" vi-change-to "D" vi-delete-to "E" vi-end-word "F" vi-char-search "G" vi-fetch-history "I" vi-insert-beg "N" vi-search-again "P" vi-put "R" vi-replace "S" vi-subst "T" vi-char-search "U" revert-line "W" vi-next-word "X" vi-rubout "Y" vi-yank-to "\" vi-complete "^" vi-first-print "_" vi-yank-arg "`" vi-goto-mark "a" vi-append-mode "b" vi-prev-word "c" vi-change-to "d" vi-delete-to "e" vi-end-word "f" vi-char-search "h" backward-char "i" vi-insertion-mode "j" next-history "k" previous-history "l" forward-char "m" vi-set-mark "n" vi-search-again "p" vi-put "r" vi-change-char "s" vi-subst "t" vi-char-search "u" vi-undo "w" vi-next-word "x" vi-delete "y" vi-yank-to "|" vi-column "~" vi-change-case SSEEEE AALLSSOO _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey _b_a_s_h(1) FFIILLEESS _~_/_._i_n_p_u_t_r_c Individual rreeaaddlliinnee initialization file AAUUTTHHOORRSS Brian Fox, Free Software Foundation bfox@gnu.org Chet Ramey, Case Western Reserve University chet.ramey@case.edu BBUUGG RREEPPOORRTTSS If you find a bug in rreeaaddlliinnee, you should report it. But first, you should make sure that it really is a bug, and that it appears in the latest version of the rreeaaddlliinnee library that you have. Once you have determined that a bug actually exists, mail a bug report to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g. If you have a fix, you are welcome to mail that as well! Suggestions and "philosophical" bug reports may be mailed to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g or posted to the Usenet newsgroup ggnnuu..bbaasshh..bbuugg. Comments and bug reports concerning this manual page should be directed to _c_h_e_t_._r_a_m_e_y_@_c_a_s_e_._e_d_u. BBUUGGSS It's too big and too slow. GNU Readline 8.3 2024 December 30 _R_E_A_D_L_I_N_E(3) readline-8.3/doc/rluser.texi000644 000436 000024 00000305547 14750156363 016234 0ustar00chetstaff000000 000000 @comment %**start of header (This is for running Texinfo on a region.) @ifclear BashFeatures @setfilename rluser.info @end ifclear @comment %**end of header (This is for running Texinfo on a region.) @ignore This file documents the end user interface to the GNU command line editing features. It is to be an appendix to manuals for programs which use these features. There is a document entitled "readline.texinfo" which contains both end-user and programmer documentation for the GNU Readline Library. Copyright (C) 1988--2025 Free Software Foundation, Inc. Authored by Brian Fox and Chet Ramey. Permission is granted to process this file through Tex and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the GNU Copyright statement is available to the distributee, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end ignore @comment If you are including this manual as an appendix, then set the @comment variable readline-appendix. @ifclear BashFeatures @defcodeindex bt @end ifclear @node Command Line Editing @chapter Command Line Editing This chapter describes the basic features of the @sc{gnu} command line editing interface. @ifset BashFeatures Command line editing is provided by the Readline library, which is used by several different programs, including Bash. Command line editing is enabled by default when using an interactive shell, unless the @option{--noediting} option is supplied at shell invocation. Line editing is also used when using the @option{-e} option to the @code{read} builtin command (@pxref{Bash Builtins}). By default, the line editing commands are similar to those of Emacs; a vi-style line editing interface is also available. Line editing can be enabled at any time using the @option{-o emacs} or @option{-o vi} options to the @code{set} builtin command (@pxref{The Set Builtin}), or disabled using the @option{+o emacs} or @option{+o vi} options to @code{set}. @end ifset @menu * Introduction and Notation:: Notation used in this text. * Readline Interaction:: The minimum set of commands for editing a line. * Readline Init File:: Customizing Readline from a user's view. * Bindable Readline Commands:: A description of most of the Readline commands available for binding * Readline vi Mode:: A short description of how to make Readline behave like the vi editor. @ifset BashFeatures * Programmable Completion:: How to specify the possible completions for a specific command. * Programmable Completion Builtins:: Builtin commands to specify how to complete arguments for a particular command. * A Programmable Completion Example:: An example shell function for generating possible completions. @end ifset @end menu @node Introduction and Notation @section Introduction to Line Editing The following paragraphs use Emacs style to describe the notation used to represent keystrokes. The text @kbd{C-k} is read as `Control-K' and describes the character produced when the @key{k} key is pressed while the Control key is depressed. The text @kbd{M-k} is read as `Meta-K' and describes the character produced when the Meta key (if you have one) is depressed, and the @key{k} key is pressed (a @dfn{meta character}), then both are released. The Meta key is labeled @key{ALT} or @key{Option} on many keyboards. On keyboards with two keys labeled @key{ALT} (usually to either side of the space bar), the @key{ALT} on the left side is generally set to work as a Meta key. One of the @key{ALT} keys may also be configured as some other modifier, such as a Compose key for typing accented characters. On some keyboards, the Meta key modifier produces characters with the eighth bit (0200) set. You can use the @code{enable-meta-key} variable to control whether or not it does this, if the keyboard allows it. On many others, the terminal or terminal emulator converts the metafied key to a key sequence beginning with @key{ESC} as described in the next paragraph. If you do not have a Meta or @key{ALT} key, or another key working as a Meta key, you can generally achieve the latter effect by typing @key{ESC} @emph{first}, and then typing @key{k}. The @key{ESC} character is known as the @dfn{meta prefix}). Either process is known as @dfn{metafying} the @key{k} key. If your Meta key produces a key sequence with the @key{ESC} meta prefix, you can make @kbd{M-key} key bindings you specify (see @code{Key Bindings} in @ref{Readline Init File Syntax}) do the same thing by setting the @code{force-meta-prefix} variable. The text @kbd{M-C-k} is read as `Meta-Control-k' and describes the character produced by metafying @kbd{C-k}. In addition, several keys have their own names. Specifically, @key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all stand for themselves when seen in this text, or in an init file (@pxref{Readline Init File}). If your keyboard lacks a @key{LFD} key, typing @key{C-j} will output the appropriate character. The @key{RET} key may be labeled @key{Return} or @key{Enter} on some keyboards. @node Readline Interaction @section Readline Interaction @cindex interaction, readline Often during an interactive session you type in a long line of text, only to notice that the first word on the line is misspelled. The Readline library gives you a set of commands for manipulating the text as you type it in, allowing you to just fix your typo, and not forcing you to retype the majority of the line. Using these editing commands, you move the cursor to the place that needs correction, and delete or insert the text of the corrections. Then, when you are satisfied with the line, you simply press @key{RET}. You do not have to be at the end of the line to press @key{RET}; the entire line is accepted regardless of the location of the cursor within the line. @menu * Readline Bare Essentials:: The least you need to know about Readline. * Readline Movement Commands:: Moving about the input line. * Readline Killing Commands:: How to delete text, and how to get it back! * Readline Arguments:: Giving numeric arguments to commands. * Searching:: Searching through previous lines. @end menu @node Readline Bare Essentials @subsection Readline Bare Essentials @cindex notation, readline @cindex command editing @cindex editing command lines In order to enter characters into the line, simply type them. The typed character appears where the cursor was, and then the cursor moves one space to the right. If you mistype a character, you can use your erase character to back up and delete the mistyped character. Sometimes you may mistype a character, and not notice the error until you have typed several other characters. In that case, you can type @kbd{C-b} to move the cursor to the left, and then correct your mistake. Afterwards, you can move the cursor to the right with @kbd{C-f}. When you add text in the middle of a line, you will notice that characters to the right of the cursor are `pushed over' to make room for the text that you have inserted. Likewise, when you delete text behind the cursor, characters to the right of the cursor are `pulled back' to fill in the blank space created by the removal of the text. These are the bare essentials for editing the text of an input line: @table @asis @item @kbd{C-b} Move back one character. @item @kbd{C-f} Move forward one character. @item @key{DEL} or @key{Backspace} Delete the character to the left of the cursor. @item @kbd{C-d} Delete the character underneath the cursor. @item @w{Printing characters} Insert the character into the line at the cursor. @item @kbd{C-_} or @kbd{C-x C-u} Undo the last editing command. You can undo all the way back to an empty line. @end table @noindent Depending on your configuration, the @key{Backspace} key might be set to delete the character to the left of the cursor and the @key{DEL} key set to delete the character underneath the cursor, like @kbd{C-d}, rather than the character to the left of the cursor. @node Readline Movement Commands @subsection Readline Movement Commands The above table describes the most basic keystrokes that you need in order to do editing of the input line. For your convenience, many other commands are available in addition to @kbd{C-b}, @kbd{C-f}, @kbd{C-d}, and @key{DEL}. Here are some commands for moving more rapidly within the line. @table @kbd @item C-a Move to the start of the line. @item C-e Move to the end of the line. @item M-f Move forward a word, where a word is composed of letters and digits. @item M-b Move backward a word. @item C-l Clear the screen, reprinting the current line at the top. @end table Notice how @kbd{C-f} moves forward a character, while @kbd{M-f} moves forward a word. It is a loose convention that control keystrokes operate on characters while meta keystrokes operate on words. @node Readline Killing Commands @subsection Readline Killing Commands @cindex killing text @cindex yanking text @dfn{Killing} text means to delete the text from the line, but to save it away for later use, usually by @dfn{yanking} (re-inserting) it back into the line. (`Cut' and `paste' are more recent jargon for `kill' and `yank'.) If the description for a command says that it `kills' text, then you can be sure that you can get the text back in a different (or the same) place later. When you use a kill command, the text is saved in a @dfn{kill-ring}. Any number of consecutive kills save all of the killed text together, so that when you yank it back, you get it all. The kill ring is not line specific; the text that you killed on a previously typed line is available to be yanked back later, when you are typing another line. @cindex kill ring Here is the list of commands for killing text. @table @kbd @item C-k Kill the text from the current cursor position to the end of the line. @item M-d Kill from the cursor to the end of the current word, or, if between words, to the end of the next word. Word boundaries are the same as those used by @kbd{M-f}. @item M-@key{DEL} Kill from the cursor to the start of the current word, or, if between words, to the start of the previous word. Word boundaries are the same as those used by @kbd{M-b}. @item C-w Kill from the cursor to the previous whitespace. This is different than @kbd{M-@key{DEL}} because the word boundaries differ. @end table Here is how to @dfn{yank} the text back into the line. Yanking means to copy the most-recently-killed text from the kill buffer into the line at the current cursor position. @table @kbd @item C-y Yank the most recently killed text back into the buffer at the cursor. @item M-y Rotate the kill-ring, and yank the new top. You can only do this if the prior command is @kbd{C-y} or @kbd{M-y}. @end table @node Readline Arguments @subsection Readline Arguments You can pass numeric arguments to Readline commands. Sometimes the argument acts as a repeat count, other times it is the @i{sign} of the argument that is significant. If you pass a negative argument to a command which normally acts in a forward direction, that command will act in a backward direction. For example, to kill text back to the start of the line, you might type @samp{M-- C-k}. The general way to pass numeric arguments to a command is to type meta digits before the command. If the first `digit' typed is a minus sign (@samp{-}), then the sign of the argument will be negative. Once you have typed one meta digit to get the argument started, you can type the remainder of the digits, and then the command. For example, to give the @kbd{C-d} command an argument of 10, you could type @samp{M-1 0 C-d}, which will delete the next ten characters on the input line. @node Searching @subsection Searching for Commands in the History Readline provides commands for searching through the command history @ifset BashFeatures (@pxref{Bash History Facilities}) @end ifset for lines containing a specified string. There are two search modes: @dfn{incremental} and @dfn{non-incremental}. Incremental searches begin before the user has finished typing the search string. As each character of the search string is typed, Readline displays the next entry from the history matching the string typed so far. An incremental search requires only as many characters as needed to find the desired history entry. When using emacs editing mode, type @kbd{C-r} to search backward in the history for a particular string. Typing @kbd{C-s} searches forward through the history. The characters present in the value of the @code{isearch-terminators} variable are used to terminate an incremental search. If that variable has not been assigned a value, the @key{ESC} and @kbd{C-j} characters terminate an incremental search. @kbd{C-g} aborts an incremental search and restores the original line. When the search is terminated, the history entry containing the search string becomes the current line. To find other matching entries in the history list, type @kbd{C-r} or @kbd{C-s} as appropriate. This searches backward or forward in the history for the next entry matching the search string typed so far. Any other key sequence bound to a Readline command terminates the search and executes that command. For instance, a @key{RET} terminates the search and accepts the line, thereby executing the command from the history list. A movement command will terminate the search, make the last line found the current line, and begin editing. Readline remembers the last incremental search string. If two @kbd{C-r}s are typed without any intervening characters defining a new search string, Readline uses any remembered search string. Non-incremental searches read the entire search string before starting to search for matching history entries. The search string may be typed by the user or be part of the contents of the current line. @node Readline Init File @section Readline Init File @cindex initialization file, readline Although the Readline library comes with a set of Emacs-like keybindings installed by default, it is possible to use a different set of keybindings. Any user can customize programs that use Readline by putting commands in an @dfn{inputrc} file, conventionally in their home directory. The name of this file is taken from the value of the @ifset BashFeatures shell variable @env{INPUTRC}. @end ifset @ifclear BashFeatures environment variable @env{INPUTRC}. @end ifclear If that variable is unset, the default is @file{~/.inputrc}. If that file does not exist or cannot be read, Readline looks for @file{/etc/inputrc}. @ifset BashFeatures The @w{@code{bind}} builtin command can also be used to set Readline keybindings and variables. @xref{Bash Builtins}. @end ifset When a program that uses the Readline library starts up, Readline reads the init file and sets any variables and key bindings it contains. In addition, the @code{C-x C-r} command re-reads this init file, thus incorporating any changes that you might have made to it. @menu * Readline Init File Syntax:: Syntax for the commands in the inputrc file. * Conditional Init Constructs:: Conditional key bindings in the inputrc file. * Sample Init File:: An example inputrc file. @end menu @node Readline Init File Syntax @subsection Readline Init File Syntax There are only a few basic constructs allowed in the Readline init file. Blank lines are ignored. Lines beginning with a @samp{#} are comments. Lines beginning with a @samp{$} indicate conditional constructs (@pxref{Conditional Init Constructs}). Other lines denote variable settings and key bindings. @table @asis @item Variable Settings You can modify the run-time behavior of Readline by altering the values of variables in Readline using the @code{set} command within the init file. The syntax is simple: @example set @var{variable} @var{value} @end example @noindent Here, for example, is how to change from the default Emacs-like key binding to use @code{vi} line editing commands: @example set editing-mode vi @end example Variable names and values, where appropriate, are recognized without regard to case. Unrecognized variable names are ignored. Boolean variables (those that can be set to on or off) are set to on if the value is null or empty, @var{on} (case-insensitive), or 1. Any other value results in the variable being set to off. @ifset BashFeatures The @w{@code{bind -V}} command lists the current Readline variable names and values. @xref{Bash Builtins}. @end ifset A great deal of run-time behavior is changeable with the following variables. @cindex variables, readline @table @code @item active-region-start-color @vindex active-region-start-color A string variable that controls the text color and background when displaying the text in the active region (see the description of @code{enable-active-region} below). This string must not take up any physical character positions on the display, so it should consist only of terminal escape sequences. It is output to the terminal before displaying the text in the active region. This variable is reset to the default value whenever the terminal type changes. The default value is the string that puts the terminal in standout mode, as obtained from the terminal's terminfo description. A sample value might be @samp{\e[01;33m}. @item active-region-end-color @vindex active-region-end-color A string variable that ``undoes'' the effects of @code{active-region-start-color} and restores ``normal'' terminal display appearance after displaying text in the active region. This string must not take up any physical character positions on the display, so it should consist only of terminal escape sequences. It is output to the terminal after displaying the text in the active region. This variable is reset to the default value whenever the terminal type changes. The default value is the string that restores the terminal from standout mode, as obtained from the terminal's terminfo description. A sample value might be @samp{\e[0m}. @item bell-style @vindex bell-style Controls what happens when Readline wants to ring the terminal bell. If set to @samp{none}, Readline never rings the bell. If set to @samp{visible}, Readline uses a visible bell if one is available. If set to @samp{audible} (the default), Readline attempts to ring the terminal's bell. @item bind-tty-special-chars @vindex bind-tty-special-chars If set to @samp{on} (the default), Readline attempts to bind the control characters that are treated specially by the kernel's terminal driver to their Readline equivalents. These override the default Readline bindings described here. Type @samp{stty -a} at a Bash prompt to see your current terminal settings, including the special control characters (usually @code{cchars}). @item blink-matching-paren @vindex blink-matching-paren If set to @samp{on}, Readline attempts to briefly move the cursor to an opening parenthesis when a closing parenthesis is inserted. The default is @samp{off}. @item colored-completion-prefix @vindex colored-completion-prefix If set to @samp{on}, when listing completions, Readline displays the common prefix of the set of possible completions using a different color. The color definitions are taken from the value of the @env{LS_COLORS} environment variable. If there is a color definition in @env{LS_COLORS} for the custom suffix @samp{readline-colored-completion-prefix}, Readline uses this color for the common prefix instead of its default. The default is @samp{off}. @item colored-stats @vindex colored-stats If set to @samp{on}, Readline displays possible completions using different colors to indicate their file type. The color definitions are taken from the value of the @env{LS_COLORS} environment variable. The default is @samp{off}. @item comment-begin @vindex comment-begin The string to insert at the beginning of the line by the @code{insert-comment} command. The default value is @code{"#"}. @item completion-display-width @vindex completion-display-width The number of screen columns used to display possible matches when performing completion. The value is ignored if it is less than 0 or greater than the terminal screen width. A value of 0 causes matches to be displayed one per line. The default value is -1. @item completion-ignore-case @vindex completion-ignore-case If set to @samp{on}, Readline performs filename matching and completion in a case-insensitive fashion. The default value is @samp{off}. @item completion-map-case @vindex completion-map-case If set to @samp{on}, and @var{completion-ignore-case} is enabled, Readline treats hyphens (@samp{-}) and underscores (@samp{_}) as equivalent when performing case-insensitive filename matching and completion. The default value is @samp{off}. @item completion-prefix-display-length @vindex completion-prefix-display-length The maximum length in characters of the common prefix of a list of possible completions that is displayed without modification. When set to a value greater than zero, Readline replaces common prefixes longer than this value with an ellipsis when displaying possible completions. If a completion begins with a period, and Readline is completing filenames, it uses three underscores instead of an ellipsis. @item completion-query-items @vindex completion-query-items The number of possible completions that determines when the user is asked whether the list of possibilities should be displayed. If the number of possible completions is greater than or equal to this value, Readline asks whether or not the user wishes to view them; otherwise, Readline simply lists the completions. This variable must be set to an integer value greater than or equal to zero. A zero value means Readline should never ask; negative values are treated as zero. The default limit is @code{100}. @item convert-meta @vindex convert-meta If set to @samp{on}, Readline converts characters it reads that have the eighth bit set to an @sc{ascii} key sequence by clearing the eighth bit and prefixing an @key{ESC} character, converting them to a meta-prefixed key sequence. The default value is @samp{on}, but Readline sets it to @samp{off} if the locale contains characters whose encodings may include bytes with the eighth bit set. This variable is dependent on the @code{LC_CTYPE} locale category, and may change if the locale changes. This variable also affects key bindings; see the description of @code{force-meta-prefix} below. @item disable-completion @vindex disable-completion If set to @samp{On}, Readline inhibits word completion. Completion characters are inserted into the line as if they had been mapped to @code{self-insert}. The default is @samp{off}. @item echo-control-characters @vindex echo-control-characters When set to @samp{on}, on operating systems that indicate they support it, Readline echoes a character corresponding to a signal generated from the keyboard. The default is @samp{on}. @item editing-mode @vindex editing-mode The @code{editing-mode} variable controls the default set of key bindings. By default, Readline starts up in emacs editing mode, where the keystrokes are most similar to Emacs. This variable can be set to either @samp{emacs} or @samp{vi}. @item emacs-mode-string @vindex emacs-mode-string If the @var{show-mode-in-prompt} variable is enabled, this string is displayed immediately before the last line of the primary prompt when emacs editing mode is active. The value is expanded like a key binding, so the standard set of meta- and control- prefixes and backslash escape sequences is available. The @samp{\1} and @samp{\2} escapes begin and end sequences of non-printing characters, which can be used to embed a terminal control sequence into the mode string. The default is @samp{@@}. @item enable-active-region @vindex enable-active-region The @dfn{point} is the current cursor position, and @dfn{mark} refers to a saved cursor position (@pxref{Commands For Moving}). The text between the point and mark is referred to as the @dfn{region}. When this variable is set to @samp{On}, Readline allows certain commands to designate the region as @dfn{active}. When the region is active, Readline highlights the text in the region using the value of the @code{active-region-start-color}, which defaults to the string that enables the terminal's standout mode. The active region shows the text inserted by bracketed-paste and any matching text found by incremental and non-incremental history searches. The default is @samp{On}. @item enable-bracketed-paste @vindex enable-bracketed-paste When set to @samp{On}, Readline configures the terminal to insert each paste into the editing buffer as a single string of characters, instead of treating each character as if it had been read from the keyboard. This is called putting the terminal into @dfn{bracketed paste mode}; it prevents Readline from executing any editing commands bound to key sequences appearing in the pasted text. The default is @samp{On}. @item enable-keypad @vindex enable-keypad When set to @samp{on}, Readline tries to enable the application keypad when it is called. Some systems need this to enable the arrow keys. The default is @samp{off}. @item enable-meta-key @vindex enable-meta-key When set to @samp{on}, Readline tries to enable any meta modifier key the terminal claims to support when it is called. On many terminals, the Meta key is used to send eight-bit characters; this variable checks for the terminal capability that indicates the terminal can enable and disable a mode that sets the eighth bit of a character (0200) if the Meta key is held down when the character is typed (a meta character). The default is @samp{on}. @item expand-tilde @vindex expand-tilde If set to @samp{on}, Readline attempts tilde expansion when it attempts word completion. The default is @samp{off}. @item force-meta-prefix @vindex force-meta-prefix If set to @samp{on}, Readline modifies its behavior when binding key sequences containing @kbd{\M-} or @code{Meta-} (see @code{Key Bindings} in @ref{Readline Init File Syntax}) by converting a key sequence of the form @kbd{\M-}@var{C} or @code{Meta-}@var{C} to the two-character sequence @kbd{ESC} @var{C} (adding the meta prefix). If @code{force-meta-prefix} is set to @samp{off} (the default), Readline uses the value of the @code{convert-meta} variable to determine whether to perform this conversion: if @code{convert-meta} is @samp{on}, Readline performs the conversion described above; if it is @samp{off}, Readline converts @var{C} to a meta character by setting the eighth bit (0200). The default is @samp{off}. @item history-preserve-point @vindex history-preserve-point If set to @samp{on}, the history code attempts to place the point (the current cursor position) at the same location on each history line retrieved with @code{previous-history} or @code{next-history}. The default is @samp{off}. @item history-size @vindex history-size Set the maximum number of history entries saved in the history list. If set to zero, any existing history entries are deleted and no new entries are saved. If set to a value less than zero, the number of history entries is not limited. @ifset BashFeatures By default, Bash sets the maximum number of history entries to the value of the @code{HISTSIZE} shell variable. @end ifset @ifclear BashFeatures By default, the number of history entries is not limited. @end ifclear If you try to set @var{history-size} to a non-numeric value, the maximum number of history entries will be set to 500. @item horizontal-scroll-mode @vindex horizontal-scroll-mode Setting this variable to @samp{on} means that the text of the lines being edited will scroll horizontally on a single screen line when the lines are longer than the width of the screen, instead of wrapping onto a new screen line. This variable is automatically set to @samp{on} for terminals of height 1. By default, this variable is set to @samp{off}. @item input-meta @vindex input-meta @vindex meta-flag If set to @samp{on}, Readline enables eight-bit input (that is, it does not clear the eighth bit in the characters it reads), regardless of what the terminal claims it can support. The default value is @samp{off}, but Readline sets it to @samp{on} if the locale contains characters whose encodings may include bytes with the eighth bit set. This variable is dependent on the @code{LC_CTYPE} locale category, and its value may change if the locale changes. The name @code{meta-flag} is a synonym for @code{input-meta}. @item isearch-terminators @vindex isearch-terminators The string of characters that should terminate an incremental search without subsequently executing the character as a command (@pxref{Searching}). If this variable has not been given a value, the characters @key{ESC} and @kbd{C-j} terminate an incremental search. @item keymap @vindex keymap Sets Readline's idea of the current keymap for key binding commands. Built-in @code{keymap} names are @code{emacs}, @code{emacs-standard}, @code{emacs-meta}, @code{emacs-ctlx}, @code{vi}, @code{vi-move}, @code{vi-command}, and @code{vi-insert}. @code{vi} is equivalent to @code{vi-command} (@code{vi-move} is also a synonym); @code{emacs} is equivalent to @code{emacs-standard}. Applications may add additional names. The default value is @code{emacs}; the value of the @code{editing-mode} variable also affects the default keymap. @item keyseq-timeout Specifies the duration Readline will wait for a character when reading an ambiguous key sequence (one that can form a complete key sequence using the input read so far, or can take additional input to complete a longer key sequence). If Readline doesn't receive any input within the timeout, it uses the shorter but complete key sequence. Readline uses this value to determine whether or not input is available on the current input source (@code{rl_instream} by default). The value is specified in milliseconds, so a value of 1000 means that Readline will wait one second for additional input. If this variable is set to a value less than or equal to zero, or to a non-numeric value, Readline waits until another key is pressed to decide which key sequence to complete. The default value is @code{500}. @item mark-directories If set to @samp{on}, completed directory names have a slash appended. The default is @samp{on}. @item mark-modified-lines @vindex mark-modified-lines When this variable is set to @samp{on}, Readline displays an asterisk (@samp{*}) at the start of history lines which have been modified. This variable is @samp{off} by default. @item mark-symlinked-directories @vindex mark-symlinked-directories If set to @samp{on}, completed names which are symbolic links to directories have a slash appended, subject to the value of @code{mark-directories}. The default is @samp{off}. @item match-hidden-files @vindex match-hidden-files This variable, when set to @samp{on}, forces Readline to match files whose names begin with a @samp{.} (hidden files) when performing filename completion. If set to @samp{off}, the user must include the leading @samp{.} in the filename to be completed. This variable is @samp{on} by default. @item menu-complete-display-prefix @vindex menu-complete-display-prefix If set to @samp{on}, menu completion displays the common prefix of the list of possible completions (which may be empty) before cycling through the list. The default is @samp{off}. @item output-meta @vindex output-meta If set to @samp{on}, Readline displays characters with the eighth bit set directly rather than as a meta-prefixed escape sequence. The default is @samp{off}, but Readline sets it to @samp{on} if the locale contains characters whose encodings may include bytes with the eighth bit set. This variable is dependent on the @code{LC_CTYPE} locale category, and its value may change if the locale changes. @item page-completions @vindex page-completions If set to @samp{on}, Readline uses an internal pager resembling @i{more}(1) to display a screenful of possible completions at a time. This variable is @samp{on} by default. @item prefer-visible-bell See @code{bell-style}. @item print-completions-horizontally If set to @samp{on}, Readline displays completions with matches sorted horizontally in alphabetical order, rather than down the screen. The default is @samp{off}. @item revert-all-at-newline @vindex revert-all-at-newline If set to @samp{on}, Readline will undo all changes to history lines before returning when executing @code{accept-line}. By default, history lines may be modified and retain individual undo lists across calls to @code{readline()}. The default is @samp{off}. @item search-ignore-case @vindex search-ignore-case If set to @samp{on}, Readline performs incremental and non-incremental history list searches in a case-insensitive fashion. The default value is @samp{off}. @item show-all-if-ambiguous @vindex show-all-if-ambiguous This alters the default behavior of the completion functions. If set to @samp{on}, words which have more than one possible completion cause the matches to be listed immediately instead of ringing the bell. The default value is @samp{off}. @item show-all-if-unmodified @vindex show-all-if-unmodified This alters the default behavior of the completion functions in a fashion similar to @var{show-all-if-ambiguous}. If set to @samp{on}, words which have more than one possible completion without any possible partial completion (the possible completions don't share a common prefix) cause the matches to be listed immediately instead of ringing the bell. The default value is @samp{off}. @item show-mode-in-prompt @vindex show-mode-in-prompt If set to @samp{on}, add a string to the beginning of the prompt indicating the editing mode: emacs, vi command, or vi insertion. The mode strings are user-settable (e.g., @var{emacs-mode-string}). The default value is @samp{off}. @item skip-completed-text @vindex skip-completed-text If set to @samp{on}, this alters the default completion behavior when inserting a single match into the line. It's only active when performing completion in the middle of a word. If enabled, Readline does not insert characters from the completion that match characters after point in the word being completed, so portions of the word following the cursor are not duplicated. For instance, if this is enabled, attempting completion when the cursor is after the first @samp{e} in @samp{Makefile} will result in @samp{Makefile} rather than @samp{Makefilefile}, assuming there is a single possible completion. The default value is @samp{off}. @item vi-cmd-mode-string @vindex vi-cmd-mode-string If the @var{show-mode-in-prompt} variable is enabled, this string is displayed immediately before the last line of the primary prompt when vi editing mode is active and in command mode. The value is expanded like a key binding, so the standard set of meta- and control- prefixes and backslash escape sequences is available. The @samp{\1} and @samp{\2} escapes begin and end sequences of non-printing characters, which can be used to embed a terminal control sequence into the mode string. The default is @samp{(cmd)}. @item vi-ins-mode-string @vindex vi-ins-mode-string If the @var{show-mode-in-prompt} variable is enabled, this string is displayed immediately before the last line of the primary prompt when vi editing mode is active and in insertion mode. The value is expanded like a key binding, so the standard set of meta- and control- prefixes and backslash escape sequences is available. The @samp{\1} and @samp{\2} escapes begin and end sequences of non-printing characters, which can be used to embed a terminal control sequence into the mode string. The default is @samp{(ins)}. @item visible-stats @vindex visible-stats If set to @samp{on}, a character denoting a file's type is appended to the filename when listing possible completions. The default is @samp{off}. @end table @item Key Bindings The syntax for controlling key bindings in the init file is simple. First you need to find the name of the command that you want to change. The following sections contain tables of the command name, the default keybinding, if any, and a short description of what the command does. Once you know the name of the command, simply place on a line in the init file the name of the key you wish to bind the command to, a colon, and then the name of the command. There can be no space between the key name and the colon -- that will be interpreted as part of the key name. The name of the key can be expressed in different ways, depending on what you find most comfortable. In addition to command names, Readline allows keys to be bound to a string that is inserted when the key is pressed (a @var{macro}). The difference between a macro and a command is that a macro is enclosed in single or double quotes. @ifset BashFeatures The @w{@code{bind -p}} command displays Readline function names and bindings in a format that can be put directly into an initialization file. @xref{Bash Builtins}. @end ifset @table @asis @item @w{@var{keyname}: @var{function-name} or @var{macro}} @var{keyname} is the name of a key spelled out in English. For example: @example Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output" @end example In the example above, @kbd{C-u} is bound to the function @code{universal-argument}, @kbd{M-DEL} is bound to the function @code{backward-kill-word}, and @kbd{C-o} is bound to run the macro expressed on the right hand side (that is, to insert the text @samp{> output} into the line). This key binding syntax recognizes a number of symbolic character names: @var{DEL}, @var{ESC}, @var{ESCAPE}, @var{LFD}, @var{NEWLINE}, @var{RET}, @var{RETURN}, @var{RUBOUT} (a destructive backspace), @var{SPACE}, @var{SPC}, and @var{TAB}. @item @w{"@var{keyseq}": @var{function-name} or @var{macro}} @var{keyseq} differs from @var{keyname} above in that strings denoting an entire key sequence can be specified, by placing the key sequence in double quotes. Some @sc{gnu} Emacs style key escapes can be used, as in the following example, but none of the special character names are recognized. @example "\C-u": universal-argument "\C-x\C-r": re-read-init-file "\e[11~": "Function Key 1" @end example In the above example, @kbd{C-u} is again bound to the function @code{universal-argument} (just as it was in the first example), @samp{@kbd{C-x} @kbd{C-r}} is bound to the function @code{re-read-init-file}, and @samp{@key{ESC} @key{[} @key{1} @key{1} @key{~}} is bound to insert the text @samp{Function Key 1}. @end table The following @sc{gnu} Emacs style escape sequences are available when specifying key sequences: @table @code @item @kbd{\C-} A control prefix. @item @kbd{\M-} Adding the meta prefix or converting the following character to a meta character, as described above under @code{force-meta-prefix} (see @code{Variable Settings} in @ref{Readline Init File Syntax}). @item @kbd{\e} An escape character. @item @kbd{\\} Backslash. @item @kbd{\"} @key{"}, a double quotation mark. @item @kbd{\'} @key{'}, a single quote or apostrophe. @end table In addition to the @sc{gnu} Emacs style escape sequences, a second set of backslash escapes is available: @table @code @item \a alert (bell) @item \b backspace @item \d delete @item \f form feed @item \n newline @item \r carriage return @item \t horizontal tab @item \v vertical tab @item \@var{nnn} The eight-bit character whose value is the octal value @var{nnn} (one to three digits). @item \x@var{HH} The eight-bit character whose value is the hexadecimal value @var{HH} (one or two hex digits). @end table When entering the text of a macro, single or double quotes must be used to indicate a macro definition. Unquoted text is assumed to be a function name. The backslash escapes described above are expanded in the macro body. Backslash will quote any other character in the macro text, including @samp{"} and @samp{'}. For example, the following binding will make @samp{@kbd{C-x} \} insert a single @samp{\} into the line: @example "\C-x\\": "\\" @end example @end table @node Conditional Init Constructs @subsection Conditional Init Constructs Readline implements a facility similar in spirit to the conditional compilation features of the C preprocessor which allows key bindings and variable settings to be performed as the result of tests. There are four parser directives available. @table @code @item $if The @code{$if} construct allows bindings to be made based on the editing mode, the terminal being used, or the application using Readline. The text of the test, after any comparison operator, extends to the end of the line; unless otherwise noted, no characters are required to isolate it. @table @code @item mode The @code{mode=} form of the @code{$if} directive is used to test whether Readline is in @code{emacs} or @code{vi} mode. This may be used in conjunction with the @samp{set keymap} command, for instance, to set bindings in the @code{emacs-standard} and @code{emacs-ctlx} keymaps only if Readline is starting out in @code{emacs} mode. @item term The @code{term=} form may be used to include terminal-specific key bindings, perhaps to bind the key sequences output by the terminal's function keys. The word on the right side of the @samp{=} is tested against both the full name of the terminal and the portion of the terminal name before the first @samp{-}. This allows @code{xterm} to match both @code{xterm} and @code{xterm-256color}, for instance. @item version The @code{version} test may be used to perform comparisons against specific Readline versions. The @code{version} expands to the current Readline version. The set of comparison operators includes @samp{=} (and @samp{==}), @samp{!=}, @samp{<=}, @samp{>=}, @samp{<}, and @samp{>}. The version number supplied on the right side of the operator consists of a major version number, an optional decimal point, and an optional minor version (e.g., @samp{7.1}). If the minor version is omitted, it defaults to @samp{0}. The operator may be separated from the string @code{version} and from the version number argument by whitespace. The following example sets a variable if the Readline version being used is 7.0 or newer: @example $if version >= 7.0 set show-mode-in-prompt on $endif @end example @item application The @var{application} construct is used to include application-specific settings. Each program using the Readline library sets the @var{application name}, and you can test for a particular value. This could be used to bind key sequences to functions useful for a specific program. For instance, the following command adds a key sequence that quotes the current or previous word in Bash: @example $if Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endif @end example @item variable The @var{variable} construct provides simple equality tests for Readline variables and values. The permitted comparison operators are @samp{=}, @samp{==}, and @samp{!=}. The variable name must be separated from the comparison operator by whitespace; the operator may be separated from the value on the right hand side by whitespace. String and boolean variables may be tested. Boolean variables must be tested against the values @var{on} and @var{off}. The following example is equivalent to the @code{mode=emacs} test described above: @example $if editing-mode == emacs set show-mode-in-prompt on $endif @end example @end table @item $else Commands in this branch of the @code{$if} directive are executed if the test fails. @item $endif This command, as seen in the previous example, terminates an @code{$if} command. @item $include This directive takes a single filename as an argument and reads commands and key bindings from that file. For example, the following directive reads from @file{/etc/inputrc}: @example $include /etc/inputrc @end example @end table @node Sample Init File @subsection Sample Init File Here is an example of an @var{inputrc} file. This illustrates key binding, variable assignment, and conditional syntax. @example @page # This file controls the behavior of line input editing for # programs that use the GNU Readline library. Existing # programs include FTP, Bash, and GDB. # # You can re-read the inputrc file with C-x C-r. # Lines beginning with '#' are comments. # # First, include any system-wide bindings and variable # assignments from /etc/Inputrc $include /etc/Inputrc # # Set various bindings for emacs mode. set editing-mode emacs $if mode=emacs Meta-Control-h: backward-kill-word Text after the function name is ignored # # Arrow keys in keypad mode # #"\M-OD": backward-char #"\M-OC": forward-char #"\M-OA": previous-history #"\M-OB": next-history # # Arrow keys in ANSI mode # "\M-[D": backward-char "\M-[C": forward-char "\M-[A": previous-history "\M-[B": next-history # # Arrow keys in 8 bit keypad mode # #"\M-\C-OD": backward-char #"\M-\C-OC": forward-char #"\M-\C-OA": previous-history #"\M-\C-OB": next-history # # Arrow keys in 8 bit ANSI mode # #"\M-\C-[D": backward-char #"\M-\C-[C": forward-char #"\M-\C-[A": previous-history #"\M-\C-[B": next-history C-q: quoted-insert $endif # An old-style binding. This happens to be the default. TAB: complete # Macros that are convenient for shell interaction $if Bash # edit the path "\C-xp": "PATH=$@{PATH@}\e\C-e\C-a\ef\C-f" # prepare to type a quoted word -- # insert open and close double quotes # and move to just after the open quote "\C-x\"": "\"\"\C-b" # insert a backslash (testing backslash escapes # in sequences and macros) "\C-x\\": "\\" # Quote the current or previous word "\C-xq": "\eb\"\ef\"" # Add a binding to refresh the line, which is unbound "\C-xr": redraw-current-line # Edit variable on current line. "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" $endif # use a visible bell if one is available set bell-style visible # don't strip characters to 7 bits when reading set input-meta on # allow iso-latin1 characters to be inserted rather # than converted to prefix-meta sequences set convert-meta off # display characters with the eighth bit set directly # rather than as meta-prefixed characters set output-meta on # if there are 150 or more possible completions for a word, # ask whether or not the user wants to see all of them set completion-query-items 150 # For FTP $if Ftp "\C-xg": "get \M-?" "\C-xt": "put \M-?" "\M-.": yank-last-arg $endif @end example @node Bindable Readline Commands @section Bindable Readline Commands @menu * Commands For Moving:: Moving about the line. * Commands For History:: Getting at previous lines. * Commands For Text:: Commands for changing text. * Commands For Killing:: Commands for killing and yanking. * Numeric Arguments:: Specifying numeric arguments, repeat counts. * Commands For Completion:: Getting Readline to do the typing for you. * Keyboard Macros:: Saving and re-executing typed characters * Miscellaneous Commands:: Other miscellaneous commands. @end menu This section describes Readline commands that may be bound to key sequences. @ifset BashFeatures You can list your key bindings by executing @w{@code{bind -P}} or, for a more terse format, suitable for an @var{inputrc} file, @w{@code{bind -p}}. (@xref{Bash Builtins}.) @end ifset Command names without an accompanying key sequence are unbound by default. In the following descriptions, @dfn{point} refers to the current cursor position, and @dfn{mark} refers to a cursor position saved by the @code{set-mark} command. The text between the point and mark is referred to as the @dfn{region}. Readline has the concept of an @emph{active region}: when the region is active, Readline redisplay highlights the region using the value of the @code{active-region-start-color} variable. The @code{enable-active-region} variable turns this on and off. Several commands set the region to active; those are noted below. @node Commands For Moving @subsection Commands For Moving @ftable @code @item beginning-of-line (C-a) Move to the start of the current line. This may also be bound to the Home key on some keyboards. @item end-of-line (C-e) Move to the end of the line. This may also be bound to the End key on some keyboards. @item forward-char (C-f) Move forward a character. This may also be bound to the right arrow key on some keyboards. @item backward-char (C-b) Move back a character. This may also be bound to the left arrow key on some keyboards. @item forward-word (M-f) Move forward to the end of the next word. Words are composed of letters and digits. @item backward-word (M-b) Move back to the start of the current or previous word. Words are composed of letters and digits. @ifset BashFeatures @item shell-forward-word (M-C-f) Move forward to the end of the next word. Words are delimited by non-quoted shell metacharacters. @item shell-backward-word (M-C-b) Move back to the start of the current or previous word. Words are delimited by non-quoted shell metacharacters. @end ifset @item previous-screen-line () Attempt to move point to the same physical screen column on the previous physical screen line. This will not have the desired effect if the current Readline line does not take up more than one physical line or if point is not greater than the length of the prompt plus the screen width. @item next-screen-line () Attempt to move point to the same physical screen column on the next physical screen line. This will not have the desired effect if the current Readline line does not take up more than one physical line or if the length of the current Readline line is not greater than the length of the prompt plus the screen width. @item clear-display (M-C-l) Clear the screen and, if possible, the terminal's scrollback buffer, then redraw the current line, leaving the current line at the top of the screen. @item clear-screen (C-l) Clear the screen, then redraw the current line, leaving the current line at the top of the screen. If given a numeric argument, this refreshes the current line without clearing the screen. @item redraw-current-line () Refresh the current line. By default, this is unbound. @end ftable @node Commands For History @subsection Commands For Manipulating The History @ftable @code @item accept-line (Newline or Return) @ifset BashFeatures Accept the line regardless of where the cursor is. If this line is non-empty, add it to the history list according to the setting of the @env{HISTCONTROL} and @env{HISTIGNORE} variables. @end ifset @ifclear BashFeatures Accept the line regardless of where the cursor is. If this line is non-empty, you can add it to the history list using @code{add_history()}. @end ifclear If this line is a modified history line, then restore the history line to its original state. @item previous-history (C-p) Move `back' through the history list, fetching the previous command. This may also be bound to the up arrow key on some keyboards. @item next-history (C-n) Move `forward' through the history list, fetching the next command. This may also be bound to the down arrow key on some keyboards. @item beginning-of-history (M-<) Move to the first line in the history. @item end-of-history (M->) Move to the end of the input history, i.e., the line currently being entered. @item reverse-search-history (C-r) Search backward starting at the current line and moving `up' through the history as necessary. This is an incremental search. This command sets the region to the matched text and activates the region. @item forward-search-history (C-s) Search forward starting at the current line and moving `down' through the history as necessary. This is an incremental search. This command sets the region to the matched text and activates the region. @item non-incremental-reverse-search-history (M-p) Search backward starting at the current line and moving `up' through the history as necessary using a non-incremental search for a string supplied by the user. The search string may match anywhere in a history line. @item non-incremental-forward-search-history (M-n) Search forward starting at the current line and moving `down' through the history as necessary using a non-incremental search for a string supplied by the user. The search string may match anywhere in a history line. @item history-search-backward () Search backward through the history for the string of characters between the start of the current line and the point. The search string must match at the beginning of a history line. This is a non-incremental search. By default, this command is unbound, but may be bound to the Page Down key on some keyboards. @item history-search-forward () Search forward through the history for the string of characters between the start of the current line and the point. The search string must match at the beginning of a history line. This is a non-incremental search. By default, this command is unbound, but may be bound to the Page Up key on some keyboards. @item history-substring-search-backward () Search backward through the history for the string of characters between the start of the current line and the point. The search string may match anywhere in a history line. This is a non-incremental search. By default, this command is unbound. @item history-substring-search-forward () Search forward through the history for the string of characters between the start of the current line and the point. The search string may match anywhere in a history line. This is a non-incremental search. By default, this command is unbound. @item yank-nth-arg (M-C-y) Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument @var{n}, insert the @var{n}th word from the previous command (the words in the previous command begin with word 0). A negative argument inserts the @var{n}th word from the end of the previous command. Once the argument @var{n} is computed, this uses the history expansion facilities to extract the @var{n}th word, as if the @samp{!@var{n}} history expansion had been specified. @item yank-last-arg (M-. or M-_) Insert last argument to the previous command (the last word of the previous history entry). With a numeric argument, behave exactly like @code{yank-nth-arg}. Successive calls to @code{yank-last-arg} move back through the history list, inserting the last word (or the word specified by the argument to the first call) of each line in turn. Any numeric argument supplied to these successive calls determines the direction to move through the history. A negative argument switches the direction through the history (back or forward). This uses the history expansion facilities to extract the last word, as if the @samp{!$} history expansion had been specified. @item operate-and-get-next (C-o) Accept the current line for return to the calling application as if a newline had been entered, and fetch the next line relative to the current line from the history for editing. A numeric argument, if supplied, specifies the history entry to use instead of the current line. @item fetch-history () With a numeric argument, fetch that entry from the history list and make it the current line. Without an argument, move back to the first entry in the history list. @end ftable @node Commands For Text @subsection Commands For Changing Text @ftable @code @item @i{end-of-file} (usually C-d) The character indicating end-of-file as set, for example, by @code{stty}. If this character is read when there are no characters on the line, and point is at the beginning of the line, Readline interprets it as the end of input and returns @sc{eof}. @item delete-char (C-d) Delete the character at point. If this function is bound to the same character as the tty @sc{eof} character, as @kbd{C-d} commonly is, see above for the effects. This may also be bound to the Delete key on some keyboards. @item backward-delete-char (Rubout) Delete the character behind the cursor. A numeric argument means to kill the characters, saving them on the kill ring, instead of deleting them. @item forward-backward-delete-char () Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the cursor is deleted. By default, this is not bound to a key. @item quoted-insert (C-q or C-v) Add the next character typed to the line verbatim. This is how to insert key sequences like @kbd{C-q}, for example. @ifclear BashFeatures @item tab-insert (M-@key{TAB}) Insert a tab character. @end ifclear @item self-insert (a, b, A, 1, !, @dots{}) Insert the character typed. @item bracketed-paste-begin () This function is intended to be bound to the "bracketed paste" escape sequence sent by some terminals, and such a binding is assigned by default. It allows Readline to insert the pasted text as a single unit without treating each character as if it had been read from the keyboard. The characters are inserted as if each one was bound to @code{self-insert} instead of executing any editing commands. Bracketed paste sets the region (the characters between point and the mark) to the inserted text. It sets the @emph{active region}. @item transpose-chars (C-t) Drag the character before the cursor forward over the character at the cursor, moving the cursor forward as well. If the insertion point is at the end of the line, then this transposes the last two characters of the line. Negative arguments have no effect. @item transpose-words (M-t) Drag the word before point past the word after point, moving point past that word as well. If the insertion point is at the end of the line, this transposes the last two words on the line. @ifset BashFeatures @item shell-transpose-words (M-C-t) Drag the word before point past the word after point, moving point past that word as well. If the insertion point is at the end of the line, this transposes the last two words on the line. Word boundaries are the same as @code{shell-forward-word} and @code{shell-backward-word}. @end ifset @item upcase-word (M-u) Uppercase the current (or following) word. With a negative argument, uppercase the previous word, but do not move the cursor. @item downcase-word (M-l) Lowercase the current (or following) word. With a negative argument, lowercase the previous word, but do not move the cursor. @item capitalize-word (M-c) Capitalize the current (or following) word. With a negative argument, capitalize the previous word, but do not move the cursor. @item overwrite-mode () Toggle overwrite mode. With an explicit positive numeric argument, switches to overwrite mode. With an explicit non-positive numeric argument, switches to insert mode. This command affects only @code{emacs} mode; @code{vi} mode does overwrite differently. Each call to @code{readline()} starts in insert mode. In overwrite mode, characters bound to @code{self-insert} replace the text at point rather than pushing the text to the right. Characters bound to @code{backward-delete-char} replace the character before point with a space. By default, this command is unbound, but may be bound to the Insert key on some keyboards. @end ftable @node Commands For Killing @subsection Killing And Yanking @ftable @code @item kill-line (C-k) Kill the text from point to the end of the current line. With a negative numeric argument, kill backward from the cursor to the beginning of the line. @item backward-kill-line (C-x Rubout) Kill backward from the cursor to the beginning of the current line. With a negative numeric argument, kill forward from the cursor to the end of the line. @item unix-line-discard (C-u) Kill backward from the cursor to the beginning of the current line. @item kill-whole-line () Kill all characters on the current line, no matter where point is. By default, this is unbound. @item kill-word (M-d) Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as @code{forward-word}. @item backward-kill-word (M-@key{DEL}) Kill the word behind point. Word boundaries are the same as @code{backward-word}. @ifset BashFeatures @item shell-kill-word (M-C-d) Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as @code{shell-forward-word}. @item shell-backward-kill-word () Kill the word behind point. Word boundaries are the same as @code{shell-backward-word}. @end ifset @item unix-word-rubout (C-w) Kill the word behind point, using white space as a word boundary, saving the killed text on the kill-ring. @item unix-filename-rubout () Kill the word behind point, using white space and the slash character as the word boundaries, saving the killed text on the kill-ring. @item delete-horizontal-space () Delete all spaces and tabs around point. By default, this is unbound. @item kill-region () Kill the text in the current region. By default, this command is unbound. @item copy-region-as-kill () Copy the text in the region to the kill buffer, so it can be yanked right away. By default, this command is unbound. @item copy-backward-word () Copy the word before point to the kill buffer. The word boundaries are the same as @code{backward-word}. By default, this command is unbound. @item copy-forward-word () Copy the word following point to the kill buffer. The word boundaries are the same as @code{forward-word}. By default, this command is unbound. @item yank (C-y) Yank the top of the kill ring into the buffer at point. @item yank-pop (M-y) Rotate the kill-ring, and yank the new top. You can only do this if the prior command is @code{yank} or @code{yank-pop}. @end ftable @node Numeric Arguments @subsection Specifying Numeric Arguments @ftable @code @item digit-argument (@kbd{M-0}, @kbd{M-1}, @dots{} @kbd{M--}) Add this digit to the argument already accumulating, or start a new argument. @kbd{M--} starts a negative argument. @item universal-argument () This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. If the command is followed by digits, executing @code{universal-argument} again ends the numeric argument, but is otherwise ignored. As a special case, if this command is immediately followed by a character that is neither a digit nor minus sign, the argument count for the next command is multiplied by four. The argument count is initially one, so executing this function the first time makes the argument count four, a second time makes the argument count sixteen, and so on. By default, this is not bound to a key. @end ftable @node Commands For Completion @subsection Letting Readline Type For You @ftable @code @item complete (@key{TAB}) Attempt to perform completion on the text before point. The actual completion performed is application-specific. @ifset BashFeatures Bash attempts completion by first checking for any programmable completions for the command word (@pxref{Programmable Completion}), otherwise treating the text as a variable (if the text begins with @samp{$}), username (if the text begins with @samp{~}), hostname (if the text begins with @samp{@@}), or command (including aliases, functions, and builtins) in turn. If none of these produces a match, it falls back to filename completion. @end ifset @ifclear BashFeatures The default is filename completion. @end ifclear @item possible-completions (M-?) List the possible completions of the text before point. When displaying completions, Readline sets the number of columns used for display to the value of @code{completion-display-width}, the value of the environment variable @env{COLUMNS}, or the screen width, in that order. @item insert-completions (M-*) Insert all completions of the text before point that would have been generated by @code{possible-completions}, separated by a space. @item menu-complete () Similar to @code{complete}, but replaces the word to be completed with a single match from the list of possible completions. Repeatedly executing @code{menu-complete} steps through the list of possible completions, inserting each match in turn. At the end of the list of completions, @code{menu-complete} rings the bell (subject to the setting of @code{bell-style}) and restores the original text. An argument of @var{n} moves @var{n} positions forward in the list of matches; a negative argument moves backward through the list. This command is intended to be bound to @key{TAB}, but is unbound by default. @item menu-complete-backward () Identical to @code{menu-complete}, but moves backward through the list of possible completions, as if @code{menu-complete} had been given a negative argument. This command is unbound by default. @item export-completions () Perform completion on the word before point as described above and write the list of possible completions to Readline's output stream using the following format, writing information on separate lines: @itemize @bullet @item the number of matches @var{N}; @item the word being completed; @item @var{S}:@var{E}, where @var{S} and @var{E} are the start and end offsets of the word in the Readline line buffer; then @item each match, one per line @end itemize If there are no matches, the first line will be ``0'', and this command does not print any output after the @var{S}:@var{E}. If there is only a single match, this prints a single line containing it. If there is more than one match, this prints the common prefix of the matches, which may be empty, on the first line after the @var{S}:@var{E}, then the matches on subsequent lines. In this case, @var{N} will include the first line with the common prefix. The user or application should be able to accommodate the possibility of a blank line. The intent is that the user or application reads @var{N} lines after the line containing @var{S}:@var{E} to obtain the match list. This command is unbound by default. @item delete-char-or-list () Deletes the character under the cursor if not at the beginning or end of the line (like @code{delete-char}). At the end of the line, it behaves identically to @code{possible-completions}. This command is unbound by default. @ifset BashFeatures @item complete-filename (M-/) Attempt filename completion on the text before point. @item possible-filename-completions (C-x /) List the possible completions of the text before point, treating it as a filename. @item complete-username (M-~) Attempt completion on the text before point, treating it as a username. @item possible-username-completions (C-x ~) List the possible completions of the text before point, treating it as a username. @item complete-variable (M-$) Attempt completion on the text before point, treating it as a shell variable. @item possible-variable-completions (C-x $) List the possible completions of the text before point, treating it as a shell variable. @item complete-hostname (M-@@) Attempt completion on the text before point, treating it as a hostname. @item possible-hostname-completions (C-x @@) List the possible completions of the text before point, treating it as a hostname. @item complete-command (M-!) Attempt completion on the text before point, treating it as a command name. Command completion attempts to match the text against aliases, reserved words, shell functions, shell builtins, and finally executable filenames, in that order. @item possible-command-completions (C-x !) List the possible completions of the text before point, treating it as a command name. @item dynamic-complete-history (M-@key{TAB}) Attempt completion on the text before point, comparing the text against history list entries for possible completion matches. @item dabbrev-expand () Attempt menu completion on the text before point, comparing the text against lines from the history list for possible completion matches. @item complete-into-braces (M-@{) Perform filename completion and insert the list of possible completions enclosed within braces so the list is available to the shell (@pxref{Brace Expansion}). @end ifset @end ftable @node Keyboard Macros @subsection Keyboard Macros @ftable @code @item start-kbd-macro (C-x () Begin saving the characters typed into the current keyboard macro. @item end-kbd-macro (C-x )) Stop saving the characters typed into the current keyboard macro and save the definition. @item call-last-kbd-macro (C-x e) Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard. @item print-last-kbd-macro () Print the last keyboard macro defined in a format suitable for the @var{inputrc} file. @end ftable @node Miscellaneous Commands @subsection Some Miscellaneous Commands @ftable @code @item re-read-init-file (C-x C-r) Read in the contents of the @var{inputrc} file, and incorporate any bindings or variable assignments found there. @item abort (C-g) Abort the current editing command and ring the terminal's bell (subject to the setting of @code{bell-style}). @item do-lowercase-version (M-A, M-B, M-@var{x}, @dots{}) If the metafied character @var{x} is upper case, run the command that is bound to the corresponding metafied lower case character. The behavior is undefined if @var{x} is already lower case. @item prefix-meta (@key{ESC}) Metafy the next character typed. Typing @samp{@key{ESC} f} is equivalent to typing @kbd{M-f}. @item undo (C-_ or C-x C-u) Incremental undo, separately remembered for each line. @item revert-line (M-r) Undo all changes made to this line. This is like executing the @code{undo} command enough times to get back to the initial state. @ifset BashFeatures @item tilde-expand (M-&) @end ifset @ifclear BashFeatures @item tilde-expand (M-~) @end ifclear Perform tilde expansion on the current word. @item set-mark (C-@@) Set the mark to the point. If a numeric argument is supplied, set the mark to that position. @item exchange-point-and-mark (C-x C-x) Swap the point with the mark. Set the current cursor position to the saved position, then set the mark to the old cursor position. @item character-search (C-]) Read a character and move point to the next occurrence of that character. A negative argument searches for previous occurrences. @item character-search-backward (M-C-]) Read a character and move point to the previous occurrence of that character. A negative argument searches for subsequent occurrences. @item skip-csi-sequence () Read enough characters to consume a multi-key sequence such as those defined for keys like Home and End. CSI sequences begin with a Control Sequence Indicator (CSI), usually @kbd{ESC [}. If this sequence is bound to "\e[", keys producing CSI sequences have no effect unless explicitly bound to a Readline command, instead of inserting stray characters into the editing buffer. This is unbound by default, but usually bound to @kbd{ESC [}. @item insert-comment (M-#) Without a numeric argument, insert the value of the @code{comment-begin} variable at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if the characters at the beginning of the line do not match the value of @code{comment-begin}, insert the value; otherwise delete the characters in @code{comment-begin} from the beginning of the line. In either case, the line is accepted as if a newline had been typed. @ifset BashFeatures The default value of @code{comment-begin} causes this command to make the current line a shell comment. If a numeric argument causes the comment character to be removed, the line will be executed by the shell. @end ifset @item dump-functions () Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an @var{inputrc} file. This command is unbound by default. @item dump-variables () Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an @var{inputrc} file. This command is unbound by default. @item dump-macros () Print all of the Readline key sequences bound to macros and the strings they output to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an @var{inputrc} file. This command is unbound by default. @item execute-named-command (M-x) Read a bindable Readline command name from the input and execute the function to which it's bound, as if the key sequence to which it was bound appeared in the input. If this function is supplied with a numeric argument, it passes that argument to the function it executes. @ifset BashFeatures @item spell-correct-word (C-x s) Perform spelling correction on the current word, treating it as a directory or filename, in the same way as the @code{cdspell} shell option. Word boundaries are the same as those used by @code{shell-forward-word}. @item glob-complete-word (M-g) Treat the word before point as a pattern for pathname expansion, with an asterisk implicitly appended, then use the pattern to generate a list of matching file names for possible completions. @item glob-expand-word (C-x *) Treat the word before point as a pattern for pathname expansion, and insert the list of matching file names, replacing the word. If a numeric argument is supplied, append a @samp{*} before pathname expansion. @item glob-list-expansions (C-x g) Display the list of expansions that would have been generated by @code{glob-expand-word}, and redisplay the line. If a numeric argument is supplied, append a @samp{*} before pathname expansion. @item shell-expand-line (M-C-e) Expand the line by performing shell word expansions. This performs alias and history expansion, $'@var{string}' and $"@var{string}" quoting, tilde expansion, parameter and variable expansion, arithmetic expansion, command and process substitution, word splitting, and quote removal. An explicit argument suppresses command and process substitution. @item history-expand-line (M-^) Perform history expansion on the current line. @item magic-space () Perform history expansion on the current line and insert a space (@pxref{History Interaction}). @item alias-expand-line () Perform alias expansion on the current line (@pxref{Aliases}). @item history-and-alias-expand-line () Perform history and alias expansion on the current line. @item insert-last-argument (M-. or M-_) A synonym for @code{yank-last-arg}. @item edit-and-execute-command (C-x C-e) Invoke an editor on the current command line, and execute the result as shell commands. Bash attempts to invoke @code{$VISUAL}, @code{$EDITOR}, and @code{emacs} as the editor, in that order. @item display-shell-version (C-x C-v) Display version information about the current instance of Bash. @end ifset @ifclear BashFeatures @item emacs-editing-mode (C-e) When in @code{vi} command mode, this causes a switch to @code{emacs} editing mode. @item vi-editing-mode (M-C-j) When in @code{emacs} editing mode, this causes a switch to @code{vi} editing mode. @end ifclear @end ftable @node Readline vi Mode @section Readline vi Mode While the Readline library does not have a full set of @code{vi} editing functions, it does contain enough to allow simple editing of the line. The Readline @code{vi} mode behaves as specified in the @code{sh} description in the @sc{posix} standard. @ifset BashFeatures You can use the @samp{set -o emacs} and @samp{set -o vi} commands (@pxref{The Set Builtin}) to switch interactively between @code{emacs} and @code{vi} editing modes, @end ifset @ifclear BashFeatures In order to switch interactively between @code{emacs} and @code{vi} editing modes, use the command @kbd{M-C-j} (bound to emacs-editing-mode when in @code{vi} mode and to vi-editing-mode in @code{emacs} mode). @end ifclear The Readline default is @code{emacs} mode. When you enter a line in @code{vi} mode, you are already placed in `insertion' mode, as if you had typed an @samp{i}. Pressing @key{ESC} switches you into `command' mode, where you can edit the text of the line with the standard @code{vi} movement keys, move to previous history lines with @samp{k} and subsequent lines with @samp{j}, and so forth. @ifset BashFeatures @node Programmable Completion @section Programmable Completion @cindex programmable completion When the user attempts word completion for a command or an argument to a command for which a completion specification (a @dfn{compspec}) has been defined using the @code{complete} builtin (@pxref{Programmable Completion Builtins}), Readline invokes the programmable completion facilities. First, Bash identifies the command name. If a compspec has been defined for that command, the compspec is used to generate the list of possible completions for the word. If the command word is the empty string (completion attempted at the beginning of an empty line), Bash uses any compspec defined with the @option{-E} option to @code{complete}. The @option{-I} option to @code{complete} indicates that the command word is the first non-assignment word on the line, or after a command delimiter such as @samp{;} or @samp{|}. This usually indicates command name completion. If the command word is a full pathname, Bash searches for a compspec for the full pathname first. If there is no compspec for the full pathname, Bash attempts to find a compspec for the portion following the final slash. If those searches do not result in a compspec, or if there is no compspec for the command word, Bash uses any compspec defined with the @option{-D} option to @code{complete} as the default. If there is no default compspec, Bash performs alias expansion on the command word as a final resort, and attempts to find a compspec for the command word resulting from any successful expansion. If a compspec is not found, Bash performs its default completion described above (@pxref{Commands For Completion}). Otherwise, once a compspec has been found, Bash uses it to generate the list of matching words. First, Bash performs the @var{actions} specified by the compspec. This only returns matches which are prefixes of the word being completed. When the @option{-f} or @option{-d} option is used for filename or directory name completion, Bash uses shell the variable @env{FIGNORE} to filter the matches. @xref{Bash Variables}, for a description of @env{FIGNORE}. Next, programmable completion generates matches specified by a pathname expansion pattern supplied as an argument to the @option{-G} option. The words generated by the pattern need not match the word being completed. Bash uses the @env{FIGNORE} variable to filter the matches, but does not use the @env{GLOBIGNORE} shell variable. Next, completion considers the string specified as the argument to the @option{-W} option. The string is first split using the characters in the @env{IFS} special variable as delimiters. This honors shell quoting within the string, in order to provide a mechanism for the words to contain shell metacharacters or characters in the value of @env{IFS}. Each word is then expanded using brace expansion, tilde expansion, parameter and variable expansion, command substitution, and arithmetic expansion, as described above (@pxref{Shell Expansions}). The results are split using the rules described above (@pxref{Word Splitting}). The results of the expansion are prefix-matched against the word being completed, and the matching words become possible completions. After these matches have been generated, Bash executes any shell function or command specified with the @option{-F} and @option{-C} options. When the command or function is invoked, Bash assigns values to the @env{COMP_LINE}, @env{COMP_POINT}, @env{COMP_KEY}, and @env{COMP_TYPE} variables as described above (@pxref{Bash Variables}). If a shell function is being invoked, Bash also sets the @env{COMP_WORDS} and @env{COMP_CWORD} variables. When the function or command is invoked, the first argument ($1) is the name of the command whose arguments are being completed, the second argument ($2) is the word being completed, and the third argument ($3) is the word preceding the word being completed on the current command line. There is no filtering of the generated completions against the word being completed; the function or command has complete freedom in generating the matches and they do not need to match a prefix of the word. Any function specified with @option{-F} is invoked first. The function may use any of the shell facilities, including the @code{compgen} and @code{compopt} builtins described below (@pxref{Programmable Completion Builtins}), to generate the matches. It must put the possible completions in the @env{COMPREPLY} array variable, one per array element. Next, any command specified with the @option{-C} option is invoked in an environment equivalent to command substitution. It should print a list of completions, one per line, to the standard output. Backslash will escape a newline, if necessary. These are added to the set of possible completions. After generating all of the possible completions, Bash applies any filter specified with the @option{-X} option to the completions in the list. The filter is a pattern as used for pathname expansion; a @samp{&} in the pattern is replaced with the text of the word being completed. A literal @samp{&} may be escaped with a backslash; the backslash is removed before attempting a match. Any completion that matches the pattern is removed from the list. A leading @samp{!} negates the pattern; in this case Bash removes any completion that does not match the pattern. If the @code{nocasematch} shell option is enabled (see the description of @code{shopt} in @ref{The Shopt Builtin}), Bash performs the match without regard to the case of alphabetic characters. Finally, programmable completion adds any prefix and suffix specified with the @option{-P} and @option{-S} options, respectively, to each completion, and returns the result to Readline as the list of possible completions. If the previously-applied actions do not generate any matches, and the @option{-o dirnames} option was supplied to @code{complete} when the compspec was defined, Bash attempts directory name completion. If the @option{-o plusdirs} option was supplied to @code{complete} when the compspec was defined, Bash attempts directory name completion and adds any matches to the set of possible completions. By default, if a compspec is found, whatever it generates is returned to the completion code as the full set of possible completions. The default Bash completions and the Readline default of filename completion are disabled. If the @option{-o bashdefault} option was supplied to @code{complete} when the compspec was defined, and the compspec generates no matches, Bash attempts its default completions. If the compspec and, if attempted, the default Bash completions generate no matches, and the @option{-o default} option was supplied to @code{complete} when the compspec was defined, programmable completion performs Readline's default completion. The options supplied to @code{complete} and @code{compopt} can control how Readline treats the completions. For instance, the @option{-o fullquote} option tells Readline to quote the matches as if they were filenames. See the description of @code{complete} (@pxref{Programmable Completion Builtins}) for details. When a compspec indicates that it wants directory name completion, the programmable completion functions force Readline to append a slash to completed names which are symbolic links to directories, subject to the value of the @var{mark-directories} Readline variable, regardless of the setting of the @var{mark-symlinked-directories} Readline variable. There is some support for dynamically modifying completions. This is most useful when used in combination with a default completion specified with @option{-D}. It's possible for shell functions executed as completion functions to indicate that completion should be retried by returning an exit status of 124. If a shell function returns 124, and changes the compspec associated with the command on which completion is being attempted (supplied as the first argument when the function is executed), programmable completion restarts from the beginning, with an attempt to find a new compspec for that command. This can be used to build a set of completions dynamically as completion is attempted, rather than loading them all at once. For instance, assuming that there is a library of compspecs, each kept in a file corresponding to the name of the command, the following default completion function would load completions dynamically: @example _completion_loader() @{ . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124 @} complete -D -F _completion_loader -o bashdefault -o default @end example @node Programmable Completion Builtins @section Programmable Completion Builtins @cindex completion builtins Three builtin commands are available to manipulate the programmable completion facilities: one to specify how the arguments to a particular command are to be completed, and two to modify the completion as it is happening. @table @code @item compgen @btindex compgen @example @code{compgen [-V @var{varname}] [@var{option}] [@var{word}]} @end example Generate possible completion matches for @var{word} according to the @var{option}s, which may be any option accepted by the @code{complete} builtin with the exceptions of @option{-p}, @option{-r}, @option{-D}, @option{-E}, and @option{-I}, and write the matches to the standard output. If the @option{-V} option is supplied, @code{compgen} stores the generated completions into the indexed array variable @var{varname} instead of writing them to the standard output. When using the @option{-F} or @option{-C} options, the various shell variables set by the programmable completion facilities, while available, will not have useful values. The matches will be generated in the same way as if the programmable completion code had generated them directly from a completion specification with the same flags. If @var{word} is specified, only those completions matching @var{word} will be displayed or stored. The return value is true unless an invalid option is supplied, or no matches were generated. @item complete @btindex complete @example @code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-DEI] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}] [-F @var{function}] [-C @var{command}] [-X @var{filterpat}] [-P @var{prefix}] [-S @var{suffix}] @var{name} [@var{name} @dots{}]} @code{complete -pr [-DEI] [@var{name} @dots{}]} @end example Specify how arguments to each @var{name} should be completed. If the @option{-p} option is supplied, or if no options or @var{name}s are supplied, print existing completion specifications in a way that allows them to be reused as input. The @option{-r} option removes a completion specification for each @var{name}, or, if no @var{name}s are supplied, all completion specifications. The @option{-D} option indicates that other supplied options and actions should apply to the ``default'' command completion; that is, completion attempted on a command for which no completion has previously been defined. The @option{-E} option indicates that other supplied options and actions should apply to ``empty'' command completion; that is, completion attempted on a blank line. The @option{-I} option indicates that other supplied options and actions should apply to completion on the initial non-assignment word on the line, or after a command delimiter such as @samp{;} or @samp{|}, which is usually command name completion. If multiple options are supplied, the @option{-D} option takes precedence over @option{-E}, and both take precedence over @option{-I}. If any of @option{-D}, @option{-E}, or @option{-I} are supplied, any other @var{name} arguments are ignored; these completions only apply to the case specified by the option. The process of applying these completion specifications when word completion is attempted is described above (@pxref{Programmable Completion}). Other options, if specified, have the following meanings. The arguments to the @option{-G}, @option{-W}, and @option{-X} options (and, if necessary, the @option{-P} and @option{-S} options) should be quoted to protect them from expansion before the @code{complete} builtin is invoked. @table @code @item -o @var{comp-option} The @var{comp-option} controls several aspects of the compspec's behavior beyond the simple generation of completions. @var{comp-option} may be one of: @table @code @item bashdefault Perform the rest of the default Bash completions if the compspec generates no matches. @item default Use Readline's default filename completion if the compspec generates no matches. @item dirnames Perform directory name completion if the compspec generates no matches. @item filenames Tell Readline that the compspec generates filenames, so it can perform any filename-specific processing (such as adding a slash to directory names, quoting special characters, or suppressing trailing spaces). This option is intended to be used with shell functions specified with @option{-F}. @item fullquote Tell Readline to quote all the completed words even if they are not filenames. @item noquote Tell Readline not to quote the completed words if they are filenames (quoting filenames is the default). @item nosort Tell Readline not to sort the list of possible completions alphabetically. @item nospace Tell Readline not to append a space (the default) to words completed at the end of the line. @item plusdirs After generating any matches defined by the compspec, attempt directory name completion and add any matches to the results of the other actions. @end table @item -A @var{action} The @var{action} may be one of the following to generate a list of possible completions: @table @code @item alias Alias names. May also be specified as @option{-a}. @item arrayvar Array variable names. @item binding Readline key binding names (@pxref{Bindable Readline Commands}). @item builtin Names of shell builtin commands. May also be specified as @option{-b}. @item command Command names. May also be specified as @option{-c}. @item directory Directory names. May also be specified as @option{-d}. @item disabled Names of disabled shell builtins. @item enabled Names of enabled shell builtins. @item export Names of exported shell variables. May also be specified as @option{-e}. @item file File and directory names, similar to Readline's filename completion. May also be specified as @option{-f}. @item function Names of shell functions. @item group Group names. May also be specified as @option{-g}. @item helptopic Help topics as accepted by the @code{help} builtin (@pxref{Bash Builtins}). @item hostname Hostnames, as taken from the file specified by the @env{HOSTFILE} shell variable (@pxref{Bash Variables}). @item job Job names, if job control is active. May also be specified as @option{-j}. @item keyword Shell reserved words. May also be specified as @option{-k}. @item running Names of running jobs, if job control is active. @item service Service names. May also be specified as @option{-s}. @item setopt Valid arguments for the @option{-o} option to the @code{set} builtin (@pxref{The Set Builtin}). @item shopt Shell option names as accepted by the @code{shopt} builtin (@pxref{Bash Builtins}). @item signal Signal names. @item stopped Names of stopped jobs, if job control is active. @item user User names. May also be specified as @option{-u}. @item variable Names of all shell variables. May also be specified as @option{-v}. @end table @item -C @var{command} @var{command} is executed in a subshell environment, and its output is used as the possible completions. Arguments are passed as with the @option{-F} option. @item -F @var{function} The shell function @var{function} is executed in the current shell environment. When it is executed, the first argument ($1) is the name of the command whose arguments are being completed, the second argument ($2) is the word being completed, and the third argument ($3) is the word preceding the word being completed, as described above (@pxref{Programmable Completion}). When @code{function} finishes, programmable completion retrieves the possible completions from the value of the @env{COMPREPLY} array variable. @item -G @var{globpat} Expand the filename expansion pattern @var{globpat} to generate the possible completions. @item -P @var{prefix} Add @var{prefix} to the beginning of each possible completion after all other options have been applied. @item -S @var{suffix} Append @var{suffix} to each possible completion after all other options have been applied. @item -W @var{wordlist} Split the @var{wordlist} using the characters in the @env{IFS} special variable as delimiters, and expand each resulting word. Shell quoting is honored within @var{wordlist} in order to provide a mechanism for the words to contain shell metacharacters or characters in the value of @env{IFS}. The possible completions are the members of the resultant list which match a prefix of the word being completed. @item -X @var{filterpat} @var{filterpat} is a pattern as used for filename expansion. It is applied to the list of possible completions generated by the preceding options and arguments, and each completion matching @var{filterpat} is removed from the list. A leading @samp{!} in @var{filterpat} negates the pattern; in this case, any completion not matching @var{filterpat} is removed. @end table The return value is true unless an invalid option is supplied, an option other than @option{-p}, @option{-r}, @option{-D}, @option{-E}, or @option{-I} is supplied without a @var{name} argument, an attempt is made to remove a completion specification for a @var{name} for which no specification exists, or an error occurs adding a completion specification. @item compopt @btindex compopt @example @code{compopt} [-o @var{option}] [-DEI] [+o @var{option}] [@var{name}] @end example Modify completion options for each @var{name} according to the @var{option}s, or for the currently-executing completion if no @var{name}s are supplied. If no @var{option}s are given, display the completion options for each @var{name} or the current completion. The possible values of @var{option} are those valid for the @code{complete} builtin described above. The @option{-D} option indicates that other supplied options should apply to the ``default'' command completion; the @option{-E} option indicates that other supplied options should apply to ``empty'' command completion; and the @option{-I} option indicates that other supplied options should apply to completion on the initial word on the line. These are determined in the same way as the @code{complete} builtin. If multiple options are supplied, the @option{-D} option takes precedence over @option{-E}, and both take precedence over @option{-I} The return value is true unless an invalid option is supplied, an attempt is made to modify the options for a @var{name} for which no completion specification exists, or an output error occurs. @end table @node A Programmable Completion Example @section A Programmable Completion Example The most common way to obtain additional completion functionality beyond the default actions @code{complete} and @code{compgen} provide is to use a shell function and bind it to a particular command using @code{complete -F}. The following function provides completions for the @code{cd} builtin. It is a reasonably good example of what shell functions must do when used for completion. This function uses the word passed as @code{$2} to determine the directory name to complete. You can also use the @code{COMP_WORDS} array variable; the current word is indexed by the @code{COMP_CWORD} variable. The function relies on the @code{complete} and @code{compgen} builtins to do much of the work, adding only the things that the Bash @code{cd} does beyond accepting basic directory names: tilde expansion (@pxref{Tilde Expansion}), searching directories in @var{$CDPATH}, which is described above (@pxref{Bourne Shell Builtins}), and basic support for the @code{cdable_vars} shell option (@pxref{The Shopt Builtin}). @code{_comp_cd} modifies the value of @var{IFS} so that it contains only a newline to accommodate file names containing spaces and tabs -- @code{compgen} prints the possible completions it generates one per line. Possible completions go into the @var{COMPREPLY} array variable, one completion per array element. The programmable completion system retrieves the completions from there when the function returns. @example # A completion function for the cd builtin # based on the cd completion function from the bash_completion package _comp_cd() @{ local IFS=$' \t\n' # normalize IFS local cur _skipdot _cdpath local i j k # Tilde expansion, which also expands tilde to full pathname case "$2" in \~*) eval cur="$2" ;; *) cur=$2 ;; esac # no cdpath or absolute pathname -- straight directory completion if [[ -z "$@{CDPATH:-@}" ]] || [[ "$cur" == @@(./*|../*|/*) ]]; then # compgen prints paths one per line; could also use while loop IFS=$'\n' COMPREPLY=( $(compgen -d -- "$cur") ) IFS=$' \t\n' # CDPATH+directories in the current directory if not in CDPATH else IFS=$'\n' _skipdot=false # preprocess CDPATH to convert null directory names to . _cdpath=$@{CDPATH/#:/.:@} _cdpath=$@{_cdpath//::/:.:@} _cdpath=$@{_cdpath/%:/:.@} for i in $@{_cdpath//:/$'\n'@}; do if [[ $i -ef . ]]; then _skipdot=true; fi k="$@{#COMPREPLY[@@]@}" for j in $( compgen -d -- "$i/$cur" ); do COMPREPLY[k++]=$@{j#$i/@} # cut off directory done done $_skipdot || COMPREPLY+=( $(compgen -d -- "$cur") ) IFS=$' \t\n' fi # variable names if appropriate shell option set and no completions if shopt -q cdable_vars && [[ $@{#COMPREPLY[@@]@} -eq 0 ]]; then COMPREPLY=( $(compgen -v -- "$cur") ) fi return 0 @} @end example We install the completion function using the @option{-F} option to @code{complete}: @example # Tell readline to quote appropriate and append slashes to directories; # use the bash default completion for other arguments complete -o filenames -o nospace -o bashdefault -F _comp_cd cd @end example @noindent Since we'd like Bash and Readline to take care of some of the other details for us, we use several other options to tell Bash and Readline what to do. The @option{-o filenames} option tells Readline that the possible completions should be treated as filenames, and quoted appropriately. That option will also cause Readline to append a slash to filenames it can determine are directories (which is why we might want to extend @code{_comp_cd} to append a slash if we're using directories found via @var{CDPATH}: Readline can't tell those completions are directories). The @option{-o nospace} option tells Readline to not append a space character to the directory name, in case we want to append to it. The @option{-o bashdefault} option brings in the rest of the ``Bash default'' completions -- possible completions that Bash adds to the default Readline set. These include things like command name completion, variable completion for words beginning with @samp{$} or @samp{$@{}, completions containing pathname expansion patterns (@pxref{Filename Expansion}), and so on. Once installed using @code{complete}, @code{_comp_cd} will be called every time we attempt word completion for a @code{cd} command. Many more examples -- an extensive collection of completions for most of the common GNU, Unix, and Linux commands -- are available as part of the bash_completion project. This is installed by default on many GNU/Linux distributions. Originally written by Ian Macdonald, the project now lives at @url{https://github.com/scop/bash-completion/}. There are ports for other systems such as Solaris and Mac OS X. An older version of the bash_completion package is distributed with bash in the @file{examples/complete} subdirectory. @end ifset readline-8.3/doc/readline.dvi000644 000436 000024 00001250070 14772523235 016303 0ustar00chetstaff000000 000000 ÷ƒ’À;è TeX output 2025.03.31:1028‹ÿÿÿÿŸòŽ ƒ33 þšà‘GóKÂÖN ¼j cmbx12ëKGNU–ÆqReadline“LibraryŽŽ‘GŸ 0‰±ž¸Ÿ šª’Ï€Úó6Kñ`y ó3 cmr10áEdition–¦f8.3,“for“ó7ßê  b> ó3 cmmi10é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘š7á1ŽŽ¤ 33‘!G1.2‘ ó5Readline‘¦fIn²!teraction‘Rd‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Ô«á1ŽŽ¡‘0G1.2.1‘ ó5Readline–¦fBare“Essen²!tials‘.¶‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘°ýá2ŽŽ¡‘0G1.2.2‘ ó5Readline›¦fMo•²!v“emen“t˜Commands‘B"‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Äiá2ŽŽ¡‘0G1.2.3‘ ó5Readline–¦fKilling“Commands1ž‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘³æá3ŽŽ¡‘0G1.2.4‘ ó5Readline‘¦fArgumen²!ts‘³‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘5cá3ŽŽ¡‘0G1.2.5‘ ó5Searc²!hing–¦ffor“Commands“in“the“History‘i‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ëKá3ŽŽ¡‘!G1.3‘ ó5Readline–¦fInit“File‘§‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘)aá4ŽŽ¡‘0G1.3.1‘ ó5Readline–¦fInit“File“Syn²!tax‘ ‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘¢]á4ŽŽ¡‘0G1.3.2‘ ó5Conditional–¦fInit“Constructs‘ü‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘~Xá14ŽŽ¡‘0G1.3.3‘ ó5Sample–¦fInit“File‘¾Î‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Aá15ŽŽ¡‘!G1.4‘ ó5Bindable–¦fReadline“Commands‘¯Â‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘2 á18ŽŽ¡‘0G1.4.1‘ ó5Commands–¦fF‘ÿeor“Mo²!ving‘>H‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Àá18ŽŽ¡‘0G1.4.2‘ ó5Commands–¦fF‘ÿeor“Manipulating“The“History‘iò‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ì9á19ŽŽ¡‘0G1.4.3‘ ó5Commands–¦fF›ÿeor“Changing“T˜ext{’‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ýÚá21ŽŽ¡‘0G1.4.4‘ ó5Killing–¦fAnd“Y‘ÿeanking‘šÇ‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘á22ŽŽ¡‘0G1.4.5‘ ó5SpMÞecifying–¦fNumeric“Argumen²!ts‘^V‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘àá23ŽŽ¡‘0G1.4.6‘ ó5Letting–¦fReadline“T²!ypMÞe“F›ÿeor“Y˜ou‘ºÒ‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘=á24ŽŽ¡‘0G1.4.7‘ ó5KeybMÞoard‘¦fMacrosdI‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘æ‘á25ŽŽ¡‘0G1.4.8‘ ó5Some–¦fMiscellaneous“Commands‘ø&‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘zná25ŽŽ¡‘!G1.5‘ ó5Readline–¦fvi“MoMÞdeE‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘È á27ŽŽŸ33‘Gë]2‘32Programming–ffwith“GNU“Readline‘ב32ëe:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ öOë]28ŽŽ¦‘!Gá2.1‘ ó5Basic‘¦fBeha²!vior‘Òä‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘U,á28ŽŽ¡‘!G2.2‘ ó5Custom‘¦fF‘ÿeunctions‘F·‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Èþá29ŽŽ¡‘0G2.2.1‘ ó5Readline‘¦fT²!ypMÞedefs‘F‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘á30ŽŽ¡‘0G2.2.2‘ ó5W›ÿeriting–¦fa“New“F˜unction‘áÌ‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘dá31ŽŽ¡‘!G2.3‘ ó5Readline‘¦fV‘ÿeariablesa‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ãJá31ŽŽ¡‘!G2.4‘ ó5Readline›¦fCon•²!v“enience˜F‘ÿeunctions‘¯À‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘2á37ŽŽ¡‘0G2.4.1‘ ó5Naming–¦fa“F‘ÿeunction‘—Ú‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘"á37ŽŽ¡‘0G2.4.2‘ ó5Selecting–¦fa“Keymap%û‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘¨Cá37ŽŽ¡‘0G2.4.3‘ ó5Binding‘¦fKeys‘Ín‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘O¶á38ŽŽ¡‘0G2.4.4‘ ó5AssoMÞciating–¦fF‘ÿeunction“Names“and“Bindings‘'Ñé˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ª á40ŽŽ¡‘0G2.4.5‘ ó5Allo²!wing‘¦fUndoing‘G‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ÉWá41ŽŽ¡‘0G2.4.6‘ ó5Redispla²!y1º‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘´á42ŽŽ¡‘0G2.4.7‘ ó5MoMÞdifying‘¦fT‘ÿeext‘謑é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘jôá44ŽŽ¡‘0G2.4.8‘ ó5Character‘¦fInput‘£‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘%Ôá44ŽŽ¡‘0G2.4.9‘ ó5T‘ÿeerminal‘¦fManagemen²!t‘ ­‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ôá45ŽŽ¡‘0G2.4.10‘ ó5Utilit²!y‘¦fF‘ÿeunctions‘Ýð‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘`7á46ŽŽ¡‘0G2.4.11‘ ó5Miscellaneous‘¦fF‘ÿeunctions‘ÎR‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Pšá47ŽŽ¡‘0G2.4.12‘ ó5Alternate‘¦fIn²!terface‘T‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘š›á48ŽŽ¡‘0G2.4.13‘ ó5A–¦fReadline“Examplesבé˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘öá49ŽŽŽŒ‹ÿÿÿþΟò’½š©áiiŽŽŽ ƒ33 ý†ÌÍ‘0G2.4.14‘ ó5Alternate–¦fIn²!terface“Example‘B#‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Äjá51ŽŽ¤ 33‘!G2.5‘ ó5Readline–¦fSignal“Handling‘/O‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘±—á53ŽŽ¡‘!G2.6‘ ó5Custom‘¦fCompleters‘?à‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Â'á56ŽŽ¡‘0G2.6.1‘ ó5Ho²!w–¦fCompleting“W‘ÿeorksh&‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘êná56ŽŽ¡‘0G2.6.2‘ ó5Completion‘¦fF‘ÿeunctions‘R¶‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Ôþá57ŽŽ¡‘0G2.6.3‘ ó5Completion‘¦fV‘ÿeariables‘*Ô‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘­á58ŽŽ¡‘0G2.6.4‘ ó5A–¦fShort“Completion“Example‘Ñ:‘é˜é:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘Sá64ŽŽŸ33‘Gë]Apps3endix‘ffAŽ‘wL‹GNU‘œÈF‘þ¦free–œûDos3cumenŒÌtation“License‘È“‘32ëe:Ž‘Q ‘32:Ž‘ @ë]73ŽŽ¤!ÿ‘GConcept‘ffIndex‘#C‘32ëe:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ »ë]81ŽŽ¡‘GF›þ¦function–ffand“V˜ariable“Index‘;¤‘32ëe:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ 1ë]82ŽŽŽŒ‹>—Ÿò’¾6eá1ŽŽŽ ƒ33 ý ÌÍ‘GëT1‘ ¸QCommand–z³Line“EditingŽŽŸ! ë‘GáThis–¦fcš²!hapter“describMÞes“the“basic“features“of“the“ó<Œ-ø ó3 cmcsc10çgnu“ácommand“line“editing“in˜terface.ŽŸvÝ‘Gë]1.1‘™InŒÌtros3duction–f@to“Line“EditingŽŽŸ33‘GáThe–(follo²!wing›'paragraphs“use“Emacs˜st²!yle“to“describMÞe˜the“notation“used˜to“represen²!tޤ 33‘Gk•²!eystrok“es.ŽŸ×Å‘!GThe–Yútext›Yùó=ßê­released.‘¦°The“Meta›>¬k²!ey“is˜labMÞeled“âALT˜áor“âOption˜áon“man•²!y˜k“eybMÞoards.‘¦±On˜k“eybMÞoardsŽ¡‘Gwith›”çt•²!w“o‘”æk“eys˜labMÞeled–”æâALT˜á(usually“to˜either“side˜of“the˜space“bar),‘˜fthe˜âALT“áon˜the“left˜sideŽ¡‘Gis–ZËgenerally›ZÌset“to˜w²!ork“as“a˜Meta“k²!ey‘ÿe.‘ĪOne“of˜the“âALT˜ákš²!eys“ma˜y“also›ZÌbMÞe“con gured˜as“someŽ¡‘Gother–¦fmošMÞdi er,“suc²!h“as“a“Comp˜ose“kš²!ey“for“t˜yping“accen˜ted“c˜haracters.ަ‘!GOn›Cwsome–Cvk²!eybMÞoards,‘ª»the“Meta˜k²!ey˜mošMÞdi er“pro˜duces–Cwcš²!haracters“with“the‘Cveigh˜th“bitŽ¡‘G(0200)–B¡set.‘²ŽY‘ÿeou“can“use“the“âenable-meta-key‘B áv‘ÿdDariable“to“con²!trol“whether“or“not“it“doMÞesŽ¡‘Gthis,‘cqif–R´the“kš²!eybMÞoard“allo˜ws“it.‘Á÷On“man˜y–R³others,‘crthe“terminal–R´or“terminal“em˜ulator“con˜v˜ertsŽ¡‘Gthe–r|meta ed›r{k²!ey“to“a˜k²!ey“sequence“bMÞeginning˜with“âESC“áas˜describMÞed“in“the˜next“paragraph.ަ‘!GIf–#y²!ou›$do“not˜ha•²!v“e–#a˜Meta“or˜âALT“ák²!ey‘ÿe,‘7or“another˜kš²!ey“w˜orking›$as“a“Meta˜k•²!ey‘ÿe,‘7y“ou‘#canŽ¡‘Ggenerally›<Ÿac•²!hiev“e˜the˜latter˜e ect˜b“y˜t“yping˜âESC˜ó9ý': ó3 cmti10ä rstá,‘QÇand˜then˜t“yping˜âká.‘º›The˜âESC˜ác“haracterŽ¡‘Gis–¦fkno²!wn“as“the“åmeta“pre x‘Á_á).ŽŸ×Å‘!GEither–¦fproMÞcess“is“knoš²!wn“as“åmetafying‘–~áthe“âk“ák˜ey‘ÿe.ަ‘!GIf– ˜yš²!our“Meta“k˜ey‘ —proMÞduces“a“k˜ey“sequence“with“the“âESC‘ —ámeta“pre x,‘)Áy˜ou“can“mak˜e“èM-keyŽ¡‘Gák•²!ey›¾bindings‘¾y“ou˜spMÞecify–¾(see˜âKey‘¦fBindings“áin˜Section˜1.3.1“[Readline˜Init“File˜Syn²!tax],Ž¡‘Gpage–¦f4)“do“the“same“thing“b²!y“setting“the“âforce-meta-prefix“áv‘ÿdDariable.ަ‘!GThe–Ùàtext›ÙßèM-C-k“áis˜read“as˜`Meta-Con²!trol-k'“and˜describMÞes“the˜c²!haracter“proMÞduced˜b²!yŽ¡‘Gmetafying‘¦fèC-ká.ަ‘!GIn›Tóaddition,‘€–sev•²!eral‘Tòk“eys˜ha“v“e˜their˜o“wn˜names.‘éƒSpMÞeci cally‘ÿe,–€–âDELá,“âESCá,‘€•âLFDá,“âSPCá,“âRETá,Ž¡‘Gand–$CâTAB“áall“stand›$Dfor“themselv²!es“when“seen“in“this˜text,‘Cºor“in“an“init˜ le“(see“Section“1.3Ž¡‘G[Readline–ä±Init“File],‘ôDpage“4).‘˜¾If“y•²!our‘ä²k“eybMÞoard›ä±lac“ks˜a˜âLFD˜ák“ey‘ÿe,‘ôDt“yping˜âC-j˜áwill˜output˜theŽ¡‘Gappropriate–¦fcš²!haracter.‘ÝÝThe“âRET“ák˜ey“ma˜y“bšMÞe“lab˜eled“âReturn“áor“âEnter“áon“some“k²!eyb˜oards.ŽŸvÜ‘Gë]1.2‘™Readline‘f@InŒÌteractionŽŽŸ33‘GáOften–é3during“an“in•²!teractiv“e›é3session‘é2y“ou˜t“ypMÞe˜in˜a˜long˜line˜of˜text,‘ùåonly˜to˜notice˜that˜theŽ¡‘G rst–ãÒw²!ord“on›ãÓthe“line“is“misspMÞelled.‘–"The“Readline“library˜givš²!es“y˜ou“a“set‘ãÓof“commands“forŽ¡‘Gmanipulating–“¡the›“ text“as“y•²!ou˜t“ypMÞe–“¡it“in,‘—ballo•²!wing˜y“ou–“¡to“just˜ x“yš²!our“t˜ypMÞo,‘—band‘“ not“forcingŽ¡‘Gyš²!ou–`ùto“ret˜ypMÞe“the‘`øma‘›»jorit˜y“of“the“line.‘ƹUsing‘`øthese“editing“commands,‘nÛy˜ou“mo˜v˜e“the“cursorŽ¡‘Gto–the“place›that“needs“correction,‘;Zand“delete“or“insert˜the“text“of“the“corrections.‘CZThen,Ž¡‘Gwhen–ý£yš²!ou“are“satis ed“with‘ý¤the“line,‘cy˜ou‘ý¤simply“press“âRETá.‘¥œY‘ÿeou“do“not“ha˜v˜e‘ý¤to“bMÞe“at“the“endŽ¡‘Gof–ÿÕthe“line“to›ÿÔpress“âRETá;‘,the˜en²!tire“line“is“accepted“regardless“of“the˜loMÞcation“of“the“cursorŽ¡‘Gwithin–¦fthe“line.ŽŽŒ‹JìŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’MH2ŽŽŽ ƒ33 ý ÌÍ‘GógÂÖN  #× cmbx12ëg1.2.1‘d(Readline–íMBare“Essen–átialsŽŽŸ³3‘GáIn–Üorder›Üto“en•²!ter˜c“haracters‘Üin“to˜the‘Üline,‘ézsimply˜t“ypšMÞe–Üthem.‘~ÚThe“t•²!yp˜ed‘Üc“haracter‘Üapp˜earsޤ 33‘Gwhere–æNthe“cursor›æOw²!as,‘öHand“then“the“cursor˜mo•²!v“es–æNone“space“to˜the“righ•²!t.‘•If˜y“ou›æNmist“ypMÞe˜aŽ¡‘Gc•²!haracter,›¦fy“ou˜can˜use˜y“our˜erase˜c“haracter˜to˜bac“k˜up˜and˜delete˜the˜mist“ypMÞed˜c“haracter.ŽŸÄD‘!GSometimes›³ly•²!ou‘³mma“y˜mist“ypMÞe‘³ma˜c“haracter,‘¶®and˜not–³mnotice˜the˜error“un•²!til˜y“ou‘³mha“v“e˜t“ypMÞedŽ¡‘Gsevš²!eral–wøother“c˜haracters.‘ÎcIn“that“case,‘By˜ou“can“t˜ypMÞe“èC-b“áto“mo˜v˜e“the“cursor‘wùto“the“left,‘AandŽ¡‘Gthen–¦fcorrect“yš²!our“mistak˜e.‘ÝÝAfterw˜ards,“y˜ou“can“mo˜v˜e“the“cursor“to“the“righ˜t“with“èC-fá.ŽŸÄE‘!GWhen–é"y²!ou›é!add“text“in“the˜middle“of“a˜line,‘ùÑy²!ou“will˜notice“that“c²!haracters“to˜the“righ²!tŽ¡‘Gof–q”the“cursor“are“`pushed‘q“o•²!v“er'–q”to“makš²!e“roMÞom“for“the“text“that“y˜ou‘q“ha˜v˜e“inserted.‘ÌBLik˜ewise,Ž¡‘Gwhen–‚ùy²!ou›‚ødelete“text“bMÞehind˜the“cursor,‘ºc²!haracters˜to“the“righ²!t˜of“the“cursor˜are“`pulledŽ¡‘Gbac²!k'–å=to›å< ll“in˜the“blank˜space“created“b²!y˜the“remo²!v‘ÿdDal˜of“the“text.‘š`These“are˜the“bareŽ¡‘Gessen²!tials–¦ffor“editing“the“text“of“an“input“line:ŽŸŒÍ‘GèC-b‘(‘õáMo•²!v“e›¦fbac“k˜one˜c“haracter.ŽŸÄE‘GèC-f‘(‘õáMo•²!v“e›¦fforw“ard˜one˜c“haracter.Ž©ÄD‘GâDEL–¦fáor“âBackspaceŽ¡‘Kâ:áDelete–¦fthe“c²!haracter“to“the“left“of“the“cursor.ަ‘GèC-d‘(‘õáDelete–¦fthe“c²!haracter“underneath“the“cursor.ŽŸÄE‘GPrin•²!ting‘¦fc“haractersŽŽ¡‘Kâ:Insert–¦fthe“cš²!haracter“in˜to“the“line“at“the“cursor.ަ‘GèC-_–¦fáor“èC-x“C-uŽ¡‘Kâ:áUndo–jthe“last“editing“command.‘÷éY‘ÿeou“can‘iundo“all“the“w•²!a“y›jbac“k˜to˜an˜empt“yŽ¡‘Kâ:line.Ž©ŒÍ‘GDepMÞending–ïFon“yš²!our“con guration,‘~the“âBackspace“ák˜ey“migh˜t“bMÞe“set“to“delete“the“c˜haracterŽ¡‘Gto–›gthe“left“of“the“cursor“and“the“âDEL‘›fákš²!ey“set“to“delete“the“c˜haracter“underneath“the“cursor,Ž¡‘Glikš²!e–¦fèC-dá,“rather“than“the“c˜haracter“to“the“left“of“the“cursor.ŽŸ‘‘Gëg1.2.2‘d(Readline›íMMo•–áv“emen“t˜CommandsŽŽŸ³3‘GáThe›"úabMÞo•²!v“e–"ûtable˜describMÞes“the˜most˜basic“k•²!eystrok“es˜that‘"ûy“ou˜need˜in–"ûorder˜to“do˜editingŽ¡‘Gof–‘¤the›‘£input“line.‘ÖñF‘ÿeor“y•²!our˜con“v“enience,‘•Ëman“y–‘¤other˜commands“are˜a²!v‘ÿdDailable“in˜addition“toŽ¡‘GèC-bá,–tèC-fá,“èC-dá,‘tand–gxâDELá.‘ÈãHere“are›gysome“commands“for˜mo²!ving“more“rapidly“within˜the“line.ަ‘GèC-a‘(‘õáMo•²!v“e–¦fto“the“start“of“the“line.Ž©ÄE‘GèC-e‘(‘õáMo•²!v“e–¦fto“the“end“of“the“line.ޤÄD‘GèM-f‘(‘õáMo•²!v“e›¦fforw“ard˜a˜w“ord,˜where˜a˜w“ord˜is˜compMÞosed˜of˜letters˜and˜digits.Ž¡‘GèM-b‘(‘õáMo•²!v“e›¦fbac“kw“ard˜a˜w“ord.ަ‘GèC-l‘(‘õáClear–¦fthe“screen,“reprinš²!ting“the“curren˜t“line“at“the“top.ŽŸŒÍ‘!GNotice–ôKhoš²!w‘ôLèC-f“ámo˜v˜es“forw˜ard“a‘ôLc˜haracter,‘êwhile“èM-f“ámo˜v˜es‘ôLforw˜ard“a“w˜ord.‘¢It“is‘ôLa“loMÞoseޤ 33‘Gcon•²!v“en“tion–—†that“conš²!trol“k˜eystrok˜es“opMÞerate“on‘—…c˜haracters“while“meta“k˜eystrok˜es“opMÞerate“onŽ¡‘Gw²!ords.ŽŽŒ‹[%Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’MH3ŽŽŽ ƒ33 ý ÌÍ‘Gëg1.2.3‘d(Readline–íMKilling“CommandsŽŽŸ³3‘GåKilling‘ àátext–0Èmeans›0Çto“delete“the“text˜from“the“line,‘HNbut“to˜sa•²!v“e–0Èit“a•²!w“a“y–0Èfor˜later“use,‘HNusuallyޤ 33‘Gb•²!y›<åy“anking‘,á(re-inserting)˜it˜bac“k‘<in“to˜the˜line.‘ºe(`Cut'˜and˜`paste'‘<are˜more˜recen“t‘<jargon˜forŽ¡‘G`kill'–¦fand“`y²!ank'.)Ž©£ž‘!GIf–¡°the“description›¡¯for“a“command“sa²!ys“that˜it“`kills'“text,‘¢¡then“y²!ou“can“bMÞe˜sure“that“y²!ouŽ¡‘Gcan–¦fget“the“text“bacš²!k“in“a“di eren˜t“(or“the“same)“place“later.ަ‘!GWhen–Ê›y²!ou›Êœuse“a“kill˜command,‘öthe˜text“is“sa•²!v“ed˜in–Ê›a“åkill-ringá.‘”šAnš²!y“n˜um˜bMÞer‘Êœof“consecutiv˜eŽ¡‘Gkills›¸$sa•²!v“e–¸#all˜of˜the˜killed“text˜together,‘¼“so˜that˜when“y•²!ou˜y“ank˜it˜bac“k,‘¼“y“ou‘¸#get˜it˜all.‘TheŽ¡‘Gkill–âèring›âçis“not˜line“spMÞeci c;‘(the“text“that˜y²!ou“killed˜on“a“previously˜t²!ypMÞed“line˜is“a²!v‘ÿdDailableŽ¡‘Gto–¦fbMÞe“y•²!ank“ed›¦fbac“k˜later,˜when˜y“ou˜are˜t“yping˜another˜line.ŽŸ£Ÿ‘!GHere–¦fis“the“list“of“commands“for“killing“text.ޤ ‘GèC-k‘(‘õáKill–¦fthe“text“from“the“curren²!t“cursor“pMÞosition“to“the“end“of“the“line.Ž¡‘GèM-d‘(‘õáKill–)šfrom“the›)™cursor“to“the“end“of“the˜currenš²!t“w˜ord,‘Bor,‘Bif“bMÞet˜w˜een“w˜ords,‘Bto“theޤ 33‘Kâ:end–¦fof“the“next“wš²!ord.‘ÝÝW‘ÿeord“bMÞoundaries“are“the“same“as“those“used“b˜y“èM-fá.ŽŸ ‘GèM-DEL‘¡áKill–lfrom›mthe“cursor˜to“the“start˜of“the“curren•²!t˜w“ord,‘îor,‘íif˜bMÞet“w“een‘lw“ords,‘îtoŽ¡‘Kâ:the–QÓstart“of“the›QÔprevious“w²!ord.‘Á¬W‘ÿeord“bMÞoundaries“are“the“same˜as“those“used“b²!yŽ¡‘Kâ:èM-bá.Ž© ‘GèC-w‘(‘õáKill–4Ufrom›4Vthe“cursor˜to“the˜previous“whitespace.‘‡«This˜is“di eren²!t˜than“èM-DELŽ¡‘Kâ:ábšMÞecause–¦fthe“w²!ord“b˜oundaries“di er.ަ‘!GHere–ýáis“hoš²!w“to“åy˜ank‘§äáthe“text“bac˜k“in˜to“the“line.‘äNY‘ÿeanking‘ýàmeans“to“cop˜y“the“most-Ž¡‘Grecenš²!tly-killed–¦ftext“from“the“kill“bu er“in˜to“the“line“at“the“curren˜t“cursor“pMÞosition.ŽŸ ‘GèC-y‘(‘õáY‘ÿeank–¦fthe“most“recenš²!tly“killed“text“bac˜k“in˜to“the“bu er“at“the“cursor.ަ‘GèM-y‘(‘õáRotate–'!the“kill-ring,‘GPand“y²!ank“the“new“top.‘`Y‘ÿeou“can‘'"only“do“this“if“the“priorŽ¡‘Kâ:command–¦fis“èC-y“áor“èM-yá.ŽŸàÖ‘Gëg1.2.4‘d(Readline‘íMArgumen–átsŽŽ©³3‘GáY‘ÿeou–±‰can›±ˆpass“n•²!umeric˜argumen“ts–±‰to“Readline˜commands.‘ÿESometimes“the˜argumen²!t“actsŽ¡‘Gas–Ѥa“repMÞeat›Ñ£coun²!t,‘sother“times“it“is˜the“äsign‘¨¯áof“the˜argumenš²!t“that“is“signi can˜t.‘_–If“y˜ouŽ¡‘Gpass–a‘negativš²!e“argumen˜t“to“a‘command“whic˜h“normally“acts‘in“a“forw˜ard“direction,‘ìthatŽ¡‘Gcommand–=Üwill“act“in“a›=Ûbac•²!kw“ard–=Üdirection.‘¤?F‘ÿeor“example,‘c¹to“kill“text˜bac²!k“to“the“start“ofŽ¡‘Gthe–¦fline,“yš²!ou“migh˜t“t˜ypMÞe“`âM--“C-ká'.ŽŸ£ž‘!GThe›bOgeneral‘bPw•²!a“y˜to‘bPpass˜n“umeric‘bPargumen“ts˜to–bPa˜command“is˜to“t²!ypMÞe˜meta“digits˜bMÞeforeŽ¡‘Gthe–´command.‘RIf‘´Žthe“ rst“`digit'“tš²!ypMÞed“is“a“min˜us“sign–´Ž(`â-á'),‘¸then“the–´sign“of“the“argumen˜tŽ¡‘Gwill––ŠbMÞe‘–‰negativš²!e.‘®HOnce“y˜ou“ha˜v˜e‘–‰t˜ypMÞed“one“meta›–‰digit“to“get˜the“argumenš²!t“started,‘Ò’y˜ouŽ¡‘Gcan–vòt²!ypMÞe›vñthe“remainder“of“the˜digits,‘€pand“then˜the“command.‘Î F‘ÿeor˜example,‘€pto“giv²!e˜the“èC-dŽ¡‘Gácommand–~Gan‘~Hargumenš²!t“of“10,‘´@y˜ou“could‘~Ht˜ypMÞe“`âM-1–¦f0“C-dá',‘´?whic˜h›~Hwill–~Gdelete“the˜next“tenŽ¡‘Gc²!haracters–¦fon“the“input“line.ŽŸàבGëg1.2.5‘d(Searc–áhing–íMfor“Commands“in“the“HistoryŽŽ¦‘GáReadline–ŽÆpro²!vides›ŽÇcommands“for˜searc²!hing“through˜the“command˜history“for˜lines“con²!tainingŽ¡‘Ga–¦fspMÞeci ed“string.‘ÝÝThere“are“t•²!w“o›¦fsearc“h˜moMÞdes:‘ÝÝåincremen“tal‘¸áand˜ånon-incremen“talá.ŽŸ£ž‘!GIncremen•²!tal›¸searc“hes‘·b•MÞegin˜b“efore–·the˜user“has˜ nished˜t²!yping“the˜searc²!h“string.‘­£As˜eac²!hŽ¡‘Gcš²!haracter–@|of“the“searc˜h“string“is“t˜ypMÞed,‘gReadline“displa˜ys“the“next“en˜try“from“the“historyŽŽŒ‹h'Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’MH4ŽŽŽ ƒ33 ý ÌÍ‘Gmatcš²!hing–Ýkthe“string“t˜ypMÞed“so“far.‘‚ìAn“incremen˜tal“searc˜h“requires“only“as“man˜y“c˜haractersޤ 33‘Gas–bneeded›cto“ nd“the“desired˜history“en²!try‘ÿe.‘ôÒWhen“using˜emacs“editing“mo•MÞde,‘¡t²!yp“e˜èC-r‘bátoŽ¡‘Gsearc•²!h›ûbac“kw“ard˜in˜the˜history˜for˜a˜particular˜string.‘¦¹T“yping˜èC-s˜ásearc“hes˜forw“ard˜throughŽ¡‘Gthe–Éthistory‘ÿe.‘G The“c•²!haracters›Éupresen“t–Étin“the˜v‘ÿdDalue“of˜the“âisearch-terminators˜áv‘ÿdDariable“areŽ¡‘Gused–3Ëto›3Ìterminate“an˜incremenš²!tal“searc˜h.‘·ªIf“that“v‘ÿdDariable›3Ìhas“not˜bMÞeen“assigned“a˜v‘ÿdDalue,‘J·theŽ¡‘GâESC–nÁáand›nÀèC-j“ác²!haracters“terminate˜an“incremenš²!tal“searc˜h.‘ËPèC-g“áabMÞorts“an‘nÀincremen˜tal“searc˜hŽ¡‘Gand–°restores›°the“original“line.‘úñWhen“the“searc²!h˜is“terminated,‘²„the“history˜enš²!try“con˜tainingŽ¡‘Gthe–¦fsearcš²!h“string“bMÞecomes“the“curren˜t“line.Ž©ó‘!GT‘ÿeo–¹¾ nd‘¹½other“matcš²!hing“en˜tries“in‘¹½the“history“list,‘¾“t˜ypMÞe“èC-r“áor‘¹½èC-s“áas“appropriate.‘äThisŽ¡‘Gsearc•²!hes›ìybac“kw“ard‘ìxor˜forw“ard˜in–ìxthe˜history“for˜the˜next“en•²!try˜matc“hing˜the‘ìxsearc“h˜stringŽ¡‘Gtš²!ypMÞed–q?so“far.‘Ì&An˜y“other“k˜ey“sequence“bMÞound“to“a‘q@Readline“command“terminates“the“searc˜hŽ¡‘Gand––ãexecutes›–äthat“command.‘¯UF‘ÿeor˜instance,‘Óa˜âRET“áterminates“the˜searc²!h“and˜accepts“theŽ¡‘Gline,‘+therebš²!y‘ÝVexecuting–ÝUthe“command“from“the“history“list.‘‚«A‘Ýmo˜v˜emen˜t“command“willŽ¡‘Gterminate–¦fthe“searcš²!h,“mak˜e“the“last“line“found“the“curren˜t“line,“and“bMÞegin“editing.ަ‘!GReadline–.”rememš²!bMÞers“the‘.•last“incremen˜tal“searc˜h“string.‘vhIf“t˜w˜o“èC-rás‘.•are“t˜ypMÞed“withoutŽ¡‘Gan•²!y›in“terv“ening‘c“haracters˜de ning–a˜new“searc²!h˜string,‘k¾Readline˜uses“an•²!y˜remem“bMÞeredŽ¡‘Gsearc²!h‘¦fstring.ަ‘!GNon-incremen•²!tal›–searc“hes˜read˜the˜en“tire˜searc“h‘—string˜bMÞefore˜starting˜to˜searc“h˜forŽ¡‘Gmatc•²!hing‘history›en“tries.‘™ZThe˜searc“h‘string˜ma“y‘bMÞe˜t“ypMÞed‘b“y˜the–user˜or“bMÞe˜part“of˜theŽ¡‘Gcon•²!ten“ts–¦fof“the“curren²!t“line.ŽŸÛ ‘Gë]1.3‘™Readline–f@Init“FileŽŽŸ33‘GáAlthough–AÉthe“Readline“library›AÈcomes“with“a“set“of“Emacs-lik•²!e˜k“eybindings–AÉinstalled“b²!yŽ¡‘Gdefault,‘it–øKis“pMÞossible“to“use“a“di erenš²!t‘øJset“of“k˜eybindings.‘£ÔAn˜y“user“can“customize“programsŽ¡‘Gthat–¤óuse“Readline“bš²!y“putting“commands‘¤ôin“an“åinputrc‘N÷á le,‘ä–con˜v˜en˜tionally“in“their“homeŽ¡‘Gdirectory‘ÿe.‘–(The–ÏEname“of“this“ le“is“takš²!en“from“the“v‘ÿdDalue“of“the“en˜vironmen˜t“v‘ÿdDariable“âINPUTRCá.Ž¡‘GIf–ž®that“v‘ÿdDariable“is“unset,‘ :the“default“is“â~/.inputrcá.‘ÛJIf“that“ le‘ž¯došMÞes“not“exist“or“cannot“b˜eŽ¡‘Gread,–¦fReadline“loMÞoks“for“â/etc/inputrcá.ŽŸô‘!GWhen–ica›ibprogram“that˜uses“the˜Readline“library˜starts“up,‘š!Readline˜reads“the˜init“ leŽ¡‘Gand–¦fsets“anš²!y“v‘ÿdDariables“and“k˜ey“bindings“it“con˜tains.ަ‘!GIn–8âaddition,‘NÉthe›8áâC-x‘¦fC-r“ácommand˜re-reads“this“init˜ le,‘NÉth²!us“incorpMÞorating˜anš²!y“c˜hangesŽ¡‘Gthat–¦fyš²!ou“migh˜t“ha˜v˜e“made“to“it.ŽŸçÀ‘Gëg1.3.1‘d(Readline–íMInit“File“Syn–átaxŽŽŸ³3‘GáThere–íoare“only›ína“few“basic“constructs“allo•²!w“ed–íoin˜the“Readline“init“ le.‘²÷Blank“lines“areŽ¡‘Gignored.‘­zLines–ëšbšMÞeginning“with“a“`â#á'“are‘ë›commen²!ts.‘­yLines“b˜eginning“with‘ë›a“`â$á'“indicateŽ¡‘Gconditional–ù0constructs“(see“Section“1.3.2“[Conditional‘ù1Init“Constructs],‘Mâpage“14).‘Ö;OtherŽ¡‘Glines–¦fdenote“v‘ÿdDariable“settings“and“k²!ey“bindings.ŽŸÓ‘GV‘ÿeariable‘¦fSettingsŽ¡‘Kâ:Y‘ÿeou–Ú½can“mošMÞdify“the“run-time“b˜ehaš²!vior“of‘Ú¼Readline“b˜y“altering“the“v‘ÿdDalues“ofŽ¡‘Kâ:v‘ÿdDariables–din›eReadline“using“the“âset˜ácommand“within“the˜init“ le.‘ØThe“syn²!taxŽ¡‘Kâ:is‘¦fsimple:ŽŸ'‘hÊâset–¿ªèvariable“valueŽŽŒ‹xiŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’MH5ŽŽŽ ƒ33 ý ÌÍ‘Kâ:Here,–XÞfor›E}example,“is˜ho•²!w‘E|to˜c“hange–E|from˜the“default˜Emacs-likš²!e“k˜ey‘E}binding“toޤ 33‘Kâ:use–¦fâvi“áline“editing“commands:Ž©€‘hÊâset–¿ªediting-mode“viŽŸ€‘Kâ:áV‘ÿeariable–4Ynames›4Xand“v‘ÿdDalues,–WÕwhere˜appropriate,“are–4Yrecognized˜without“regardŽ¡‘Kâ:to–¦fcase.‘ÝÝUnrecognized“v‘ÿdDariable“names“are“ignored.ަ‘Kâ:BoMÞolean–©v‘ÿdDariables›¨(those“that˜can“bMÞe“set˜to“on˜or“o ‘Ú)“are˜set“to“on˜if“the˜v‘ÿdDalue“isŽ¡‘Kâ:n•²!ull›éJor‘éIempt“y‘ÿe,‘åon˜á(case-insensitiv“e),‘or˜1.‘žÓAn“y˜other˜v‘ÿdDalue–éIresults˜in“the˜v‘ÿdDariableŽ¡‘Kâ:bMÞeing–¦fset“to“o .ŽŸ€‘Kâ:A–¦fgreat“deal“of“run-time“bMÞehaš²!vior“is“c˜hangeable“with“the“follo˜wing“v‘ÿdDariables.Ž©ÌΑKâ:âactive-region-start-colorŽ¡’…³-áA‘-ästring–.v‘ÿdDariable“that“conš²!trols“the“text‘.color“and“bac˜kground“whenŽ¡’…³-displa²!ying–ë”the›ë“text“in˜the“activ²!e˜region“(see˜the“description˜ofŽ¡’…³-âenable-active-region–³÷ábMÞeloš²!w).‘This“string“m˜ust“not‘³ötak˜e“up“an˜yŽ¡’…³-ph•²!ysical›ô·c“haracter–ô¸pMÞositions˜on˜the“displa²!y‘ÿe,‘Aso˜it˜should“consist˜onlyŽ¡’…³-of–kBterminal›kAescapMÞe“sequences.‘,pIt˜is“output˜to“the˜terminal“bMÞeforeŽ¡’…³-displaš²!ying–€ the“text“in“the“activ˜e“region.‘jÓThis“v‘ÿdDariable“is“reset“toŽ¡’…³-the–n¯default›n°v‘ÿdDalue“whenev²!er˜the“terminal“t•²!ypMÞe˜c“hanges.‘ËKThe‘n¯defaultŽ¡’…³-v‘ÿdDalue–€_is›€`the“string“that“puts˜the“terminal“in“standout˜moMÞde,‘‡úas“ob-Ž¡’…³-tained–Â'from“the‘Â(terminal's“terminfo“description.‘1!A‘ÁÞsample“v‘ÿdDalueŽ¡’…³-migh²!t–¦fbMÞe“`â\e[01;33má'.ަ‘Kâ:âactive-region-end-colorŽ¡’…³-áA‘Ñstring‘Ñ«v‘ÿdDariable–Ѫthat“\undoMÞes"“the“e ects“of“âactive-region-Ž¡’…³-start-color–¼¤áand›¼¥restores“\normal"“terminal˜displa²!y“appMÞearanceŽ¡’…³-after–Ädispla²!ying›Åtext“in˜the“activ²!e˜region.‘®üThis˜string“m²!ust˜not“tak²!eŽ¡’…³-up–Øanš²!y“ph˜ysical“c˜haracter‘×pMÞositions“on“the“displa˜y‘ÿe,‘!ôso“it“should“con-Ž¡’…³-sist–only“of“terminal“escapMÞe“sequences.‘ÑgIt“is“output“to“the“terminalŽ¡’…³-after–J¾displaš²!ying“the“text“in“the“activ˜e‘J¿region.‘ÊåThis“v‘ÿdDariable“is“re-Ž¡’…³-set–®to›­the“default˜v‘ÿdDalue“whenev²!er“the˜terminal“t•²!ypMÞe˜c“hanges.‘þ´TheŽ¡’…³-default–—Lv‘ÿdDalue›—Mis“the“string˜that“restores“the“terminal˜from“stand-Ž¡’…³-out–„KmoMÞde,‘‹as“obtained›„Jfrom“the˜terminal's“terminfo˜description.‘ÒAŽ¡’…³-sample–¦fv‘ÿdDalue“migh²!t“bMÞe“`â\e[0má'.ަ‘Kâ:âbell-styleŽ¡’…³-áCon²!trols–Fwhat›FhappMÞens“when˜Readline“w•²!an“ts˜to–Fring˜the“termi-Ž¡’…³-nal–xzbMÞell.‘TIf“set›xyto“`ânoneá',‘¬þReadline“nev²!er˜rings“the˜bMÞell.‘TIf˜set“toŽ¡’…³-`âvisibleá',‘ dReadline–öeuses›öda“visible˜bMÞell“if˜one“is˜a²!v‘ÿdDailable.‘ÍÙIf˜set“toŽ¡’…³-`âaudibleá'›Ù(the–Údefault),‘¶5Readline“attempts˜to˜ring“the˜terminal'sŽ¡’…³-bMÞell.ަ‘Kâ:âbind-tty-special-charsŽ¡’…³-áIf–5>set›5?to“`âoná'˜(the“default),‘XôReadline“attempts˜to“bind˜the“con²!trolŽ¡’…³-c²!haracters–6@that›6?are“treated“spMÞecially˜bš²!y“the“k˜ernel's‘6?terminal“driv˜erŽ¡’…³-to–ÚÝtheir“Readline‘ÚÜequiv‘ÿdDalenš²!ts.‘{BThese“o˜v˜erride‘ÚÜthe“default“ReadlineŽ¡’…³-bindings–describšMÞed“here.‘1XT²!yp˜e“`âstty‘¦f-aá'‘Žat“a“Bash“prompt“to“seeŽ¡’…³-y•²!our›?¨curren“t˜terminal˜settings,‘eøincluding‘?§the˜spMÞecial˜con“trol˜c“har-Ž¡’…³-acters–¦f(usually“âccharsá).ŽŽŒ‹ˆ,Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’MH6ŽŽŽ ƒ33 ý ÌÍ‘Kâ:âblink-matching-parenޤ 33’…³-áIf–Yåset›Yäto“`âoná',‘†ÄReadline˜attempts“to˜brie y“mo•²!v“e˜the–Yåcursor˜to“anŽ¡’…³-opMÞening–Âparenš²!thesis‘Áwhen“a“closing“paren˜thesis‘Áis“inserted.‘òðTheŽ¡’…³-default–¦fis“`âoffá'.Ž©ÌΑKâ:âcolored-completion-prefixŽ¡’…³-áIf–‡set“to“`âoná',›Wwhen‘‡listing“completions,˜Readline“displa²!ys“the“com-Ž¡’…³-mon– ¤pre x› £of“the˜set“of˜pMÞossible“completions˜using“a˜di eren²!t“color.Ž¡’…³-The– ˆcolor› ‡de nitions“are“tak²!en˜from“the˜v‘ÿdDalue“of“the˜âLS_COLORS“áen-Ž¡’…³-vironmen²!t–ev‘ÿdDariable.‘úÙIf›dthere“is“a˜color“de nition“in˜âLS_COLORS“áforŽ¡’…³-the–šãcustom‘šäsux“`âreadline-colored-completion-prefixá',‘ÐdRead-Ž¡’…³-line–Ë|uses“this“color“for“the“common“pre x“instead“of“its“default.‘”åTheŽ¡’…³-default–¦fis“`âoffá'.ŽŸÌÍ‘Kâ:âcolored-statsŽ¡’…³-áIf–0*set›0+to“`âoná',‘GÐReadline“displa²!ys˜pMÞossible“completions˜using“di eren²!tŽ¡’…³-colors–´•to›´”indicate“their˜ le“t²!ypMÞe.‘iThe˜color“de nitions˜are“tak²!enŽ¡’…³-from–õ;the›õKi“ák²!ey“sequence˜b²!y“clearing“the˜eigh²!th“bitŽ¡’…³-and–îpre xing“an“âESC›ïác•²!haracter,‘6Òcon“v“erting˜them–îto“a“meta-pre xedŽ¡’…³-k²!ey–à sequence.‘›¿The“default“v‘ÿdDalue“is“`âoná',‘¶but“Readline‘à sets“it“to“`âoffá'Ž¡’…³-if–the“loMÞcale“conš²!tains“c˜haracters‘whose“encoMÞdings“ma˜y“include“b˜ytesŽ¡’…³-with–îthe›îeigh²!th“bit˜set.‘ lThis˜v‘ÿdDariable“is˜depMÞenden²!t“on˜the“âLC_CTYPEŽ¡’…³-áloMÞcale–àícategory‘ÿe,‘land‘àîmaš²!y“c˜hange›àîif“the˜loMÞcale“c²!hanges.‘œ This“v‘ÿdDariableŽ¡’…³-also–³a ects“k²!ey“bindings;‘-see‘³the“description“of“âforce-meta-prefixŽ¡’…³-ábMÞelo²!w.ަ‘Kâ:âdisable-completionŽ¡’…³-áIf–KÐset“to“`âOná',‘]îReadline“inhibits“wš²!ord“completion.‘¿«Completion“c˜har-Ž¡’…³-acters–(»are›(¼inserted“in²!to“the˜line“as“if˜they“had“b•MÞeen˜mapp“ed‘(»toŽ¡’…³-âself-insertá.‘ÝÝThe–¦fdefault“is“`âoffá'.ަ‘Kâ:âecho-control-charactersŽ¡’…³-áWhen–¡îset›¡ïto“`âoná',‘¢Óon˜opMÞerating“systems˜that“indicate˜they“suppMÞortŽ¡’…³-it,‘lŸReadline‘^,ecš²!hoMÞes–^-a“c˜haracter›^,correspMÞonding“to“a˜signal“generatedŽ¡’…³-from–¦fthe“k²!eybMÞoard.‘ÝÝThe“default“is“`âoná'.ަ‘Kâ:âediting-modeŽ¡’…³-áThe–̸âediting-mode“áv‘ÿdDariable›̹con²!trols“the“default“set˜of“k²!ey“bindings.Ž¡’…³-By–s[default,‘¦˜Readline›sZstarts“up“in“emacs“editing˜moMÞde,‘¦˜where“theŽ¡’…³-k•²!eystrok“es–ïare›ïmost“similar˜to“Emacs.‘·÷This“v‘ÿdDariable˜can“bMÞe˜set“toŽ¡’…³-either–¦f`âemacsá'“or“`âviá'.ަ‘Kâ:âemacs-mode-stringŽ¡’…³-áIf– ·the› ¶åsho²!w-moMÞde-in-prompt‘I·áv‘ÿdDariable“is˜enabled,‘&Kthis“string˜is“dis-Ž¡’…³-pla•²!y“ed–ÃRimmediately›ÃQbMÞefore“the˜last“line“of˜the“primary˜prompt“whenŽ¡’…³-emacs–™Tediting›™UmoMÞde“is˜activ²!e.‘„,The˜v‘ÿdDalue“is“expanded˜lik²!e“a˜k²!ey“bind-Ž¡’…³-ing,‘ç³so›¸the–¸standard“set“of“meta-“and˜conš²!trol-“pre xes“and“bac˜kslashŽ¡’…³-escapšMÞe–Ä€sequences“is–Äa²!v‘ÿdDailable.‘8+The“`â\1á'–Ä€and“`â\2á'“escap˜es‘Äb˜egin“andŽ¡’…³-end–sequences“of“non-prinš²!ting“c˜haracters,‘6"whic˜h“can“bMÞe“used“to“em-Ž¡’…³-bMÞed–«/a›«0terminal“con²!trol˜sequence“in²!to˜the“moMÞde“string.‘ì:The“defaultŽ¡’…³-is‘¦f`â@á'.ަ‘Kâ:âenable-active-regionŽ¡’…³-åpMÞoin•²!t‘BÛáis›Úthe‘Ûcurren“t˜cursor–ÛpMÞosition,‘%öand“åmark‘¯ßárefers˜to“a˜sa•²!v“ed‘Ûcur-Ž¡’…³-sor–úpMÞosition›ú (see“Section˜1.4.1“[Commands˜F‘ÿeor“Mo²!ving],‘÷page“18).Ž¡’…³-The–— text“bšMÞet•²!w“een‘— the‘— p˜oin“t–— and“mark“is“referred‘— to“as“the“åre-Ž¡’…³-gioná.‘ ‘ßWhen–7¼this“v‘ÿdDariable“is“set‘7»to“`âOná',‘œReadline“allo²!ws“certainŽ¡’…³-commands–_to“designate‘`the“region“as“åactiv²!eá.‘hÉWhen“the“region“isŽŽŒ‹¢€Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’MH8ŽŽŽ ƒ33 ý ÌÍ’…³-activ•²!e,‘ÐíReadline›•9highligh“ts–•8the˜text˜in“the˜region˜using“the˜v‘ÿdDalueޤ 33’…³-of–6Èthe“âactive-region-start-colorá,‘Záwhic²!h“defaults“to“the“stringŽ¡’…³-that–¢üenables›¢ýthe“terminal's˜standout“moMÞde.‘‡eThe“activ²!e˜region“sho²!wsŽ¡’…³-the–Øçtext“inserted‘Øèbš²!y“brac˜k˜eted-paste“and“an˜y‘Øèmatc˜hing“text“foundŽ¡’…³-b•²!y›æ¿incremen“tal‘æÀand˜non-incremen“tal‘æÀhistory˜searc“hes.‘žêThe˜defaultŽ¡’…³-is‘¦f`âOná'.Ž©ÌΑKâ:âenable-bracketed-pasteŽ¡’…³-áWhen–^‡set›^ˆto“`âOná',‘ŒReadline˜con gures“the˜terminal“to˜insert“eac²!hŽ¡’…³-paste–#sin²!to“the›#tediting“bu er“as“a˜single“string“of“c²!haracters,‘=¤insteadŽ¡’…³-of–(Âtreating“eacš²!h“c˜haracter“as“if“it‘(Ãhad“bMÞeen“read“from“the“k˜eybMÞoard.Ž¡’…³-This–s;is›sthe“v‘ÿdDalue˜of“the˜âconvert-meta“áv‘ÿdDariableŽ¡’…³-to–z,determine›z-whether“to“pMÞerform“this˜con•²!v“ersion:‘ÇÀif‘z,âconvert-metaŽ¡’…³-áis–v`âoná',‘ªšReadline›vpMÞerforms“the“con•²!v“ersion˜describ•MÞed‘vab“o•²!v“e;‘Þ¥if˜it‘visŽ¡’…³-`âoffá',‘ê–Readline›»¢con•²!v“erts˜åC‘­áto˜a˜meta˜c“haracter˜b“y˜setting˜the˜eigh“thŽ¡’…³-bit–¦f(0200).‘ÝÝThe“default“is“`âoffá'.ަ‘Kâ:âhistory-preserve-pointŽ¡’…³-áIf–œset“to›`âoná',‘Zéthe“history“coMÞde“attempts“to“place˜the“pMÞoin²!t“(theŽ¡’…³-curren²!t–;kcursor›;jpMÞosition)“at˜the“same“loMÞcation˜on“eac²!h˜history“lineŽ¡’…³-retriev²!ed–^Éwith“âprevious-history“áor‘^Êânext-historyá.‘The“defaultŽ¡’…³-is‘¦f`âoffá'.ŽŽŒ‹ °JŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’MH9ŽŽŽ ƒ33 ý ÌÍ‘Kâ:âhistory-sizeޤ 33’…³-áSet–°ÿthe“maxim•²!um‘°þn“um“bMÞer–°ÿof“history“enš²!tries“sa˜v˜ed‘°þin“the“historyŽ¡’…³-list.‘óIf–mset“to“zero,‘(oanš²!y“existing“history“en˜tries“are‘ndeleted“and“noŽ¡’…³-new–Ïqenš²!tries“are–Ïpsa˜v˜ed.‘XþIf“set–Ïqto“a“v‘ÿdDalue‘Ïpless“than“zero,‘Ù³the“n˜um˜bMÞerŽ¡’…³-of–ª»history›ª¼en²!tries“is˜not“limited.‘êÝBy˜default,‘«Ñthe“n•²!um“bMÞer˜of‘ª»historyŽ¡’…³-enš²!tries–Ømis“not“limited.‘™4If“y˜ou“try“to“set‘Ølåhistory-size‘utáto“a“non-n˜umericŽ¡’…³-v‘ÿdDalue,–¦fthe“maximš²!um“n˜um˜bMÞer“of“history“en˜tries“will“bMÞe“set“to“500.Ž©zã‘Kâ:âhorizontal-scroll-modeŽ¡’…³-áSetting–Ókthis“v‘ÿdDariable“to›Ój`âoná'“means“that“the“text“of˜the“lines“bMÞeingŽ¡’…³-edited–~Qwill“scroll“horizon²!tally“on“a‘~Psingle“screen“line“when“the“linesŽ¡’…³-are–¢longer›£than“the“width“of˜the“screen,‘-±instead“of˜wrapping“on²!toŽ¡’…³-a–ÿ new›ÿ screen“line.‘çÈThis“v‘ÿdDariable˜is“automatically˜set“to˜`âoná'“forŽ¡’…³-terminals–¦fof“heigh²!t“1.‘ÝÝBy“default,“this“v‘ÿdDariable“is“set“to“`âoffá'.ަ‘Kâ:âinput-metaŽ¡’…³-áIf–Íáset›Íâto“`âoná',‘×ÀReadline˜enables“eigh²!t-bit“input˜(that“is,‘×Àit˜doMÞes“notŽ¡’…³-clear–Sthe“eighš²!th“bit“in“the‘Tc˜haracters“it“reads),‘9Îregardless“of“whatŽ¡’…³-the–e»terminal“claims›e¼it“can“suppMÞort.‘ ÜThe˜default“v‘ÿdDalue“is“`âoffá',Ž¡’…³-but–Þ—Readline›Þ˜sets“it“to˜`âoná'“if˜the“loMÞcale“con•²!tains˜c“haracters‘Þ—whoseŽ¡’…³-encoMÞdings–¢Šmaš²!y‘¢‹include“b˜ytes“with‘¢‹the“eigh˜th“bit‘¢‹set.‘Ü”This“v‘ÿdDariableŽ¡’…³-is–y!depšMÞenden²!t“on“the‘y âLC_CTYPE“álo˜cale“category‘ÿe,‘­Ïand“its“v‘ÿdDalue“ma²!yŽ¡’…³-cš²!hange–Mlif“the“loMÞcale“c˜hanges.‘ÒîThe“name“âmeta-flag“áis“a“synon˜ymŽ¡’…³-for‘¦fâinput-metaá.ŽŸzâ‘Kâ:âisearch-terminatorsŽ¡’…³-áThe–5Ñstring›5Òof“c²!haracters˜that“should“terminate˜an“incremen²!talŽ¡’…³-searc•²!h› ;without‘ Úthis“v‘ÿdDariable“is“set“to“`âoná',‘SReadline“displa²!ys“an“asterisk“(`â*á')Ž¡’…³-at–Îjthe“start›Îiof“history“lines“whic•²!h˜ha“v“e–ÎjbšMÞeen“mo˜di ed.‘•ÞThis“v‘ÿdDariableŽ¡’…³-is–¦f`âoffá'“b²!y“default.ަ‘Kâ:âmark-symlinked-directoriesŽ¡’…³-áIf–$Ôset›$Óto“`âoná',‘mcompleted“names“whic²!h˜are“sym²!bMÞolic˜links“toŽ¡’…³-directories›]Üha•²!v“e–]Ýa˜slash“appMÞended,‘ ‹¸sub‘›»ject“to˜the“v‘ÿdDalue˜ofŽ¡’…³-âmark-directoriesá.‘ÝÝThe–¦fdefault“is“`âoffá'.ަ‘Kâ:âmatch-hidden-filesŽ¡’…³-áThis–îLv‘ÿdDariable,›when‘îKset“to“`âoná',˜forces“Readline“to‘îKmatc²!h“ les“whoseŽ¡’…³-names–MÍbšMÞegin“with“a“`â.á'“(hidden“ les)“when“p˜erforming“ lenameŽ¡’…³-completion.‘Ð3If–}gset“to›}h`âoffá',‘…šthe“user˜m²!ust“include“the“leading˜`â.á'“inŽ¡’…³-the–¦f lename“to“bMÞe“completed.‘ÝÝThis“v‘ÿdDariable“is“`âoná'“b²!y“default.ŽŸzá‘Kâ:âmenu-complete-display-prefixŽ¡’…³-áIf–ßset“to‘Þ`âoná',‘ýmenš²!u“completion“displa˜ys“the“common‘Þpre x“of“theŽ¡’…³-list–ƒXof›ƒYpMÞossible“completions˜(whicš²!h“ma˜y‘ƒYbMÞe“empt˜y)‘ƒYbMÞefore“cyclingŽ¡’…³-through–¦fthe“list.‘ÝÝThe“default“is“`âoffá'.ަ‘Kâ:âoutput-metaŽ¡’…³-áIf–Å¡set“to“`âoná',‘ò•Readline“displaš²!ys“c˜haracters“with“the“eigh˜th“bit“set“di-Ž¡’…³-rectly–Vdrather“than“as‘Vea“meta-pre xed“escapMÞe“sequence.‘Ã2The“defaultŽ¡’…³-is–f`âoffá',‘8Ìbut“Readline“sets“it“to“`âoná'“if“the“loMÞcale“conš²!tains“c˜haractersŽ¡’…³-whose–^íencoMÞdings›^îma²!y“include˜b²!ytes“with˜the“eigh²!th“bit˜set.‘sThisŽ¡’…³-v‘ÿdDariable–½is›½depMÞenden²!t“on˜the“âLC_CTYPE˜áloMÞcale“category‘ÿe,‘ëÅand˜its“v‘ÿdDalueŽ¡’…³-ma•²!y›¦fc“hange˜if˜the˜loMÞcale˜c“hanges.ަ‘Kâ:âpage-completionsŽ¡’…³-áIf–èset›èto“`âoná',‘Readline“uses˜an“inš²!ternal“pager“resem˜bling‘èämor‘ÿp¹e‘Ò¡á(1)“toŽ¡’…³-displa²!y–t¨a›t§screenful“of“pMÞossible˜completions“at˜a“time.‘ÍHThis“v‘ÿdDariableŽ¡’…³-is–¦f`âoná'“b²!y“default.ަ‘Kâ:âprefer-visible-bellŽ¡’…³-áSee‘¦fâbell-styleá.ަ‘Kâ:âprint-completions-horizontallyŽ¡’…³-áIf–™)set›™(to“`âoná',‘ÕØReadline“displa²!ys˜completions“with˜matc²!hes“sortedŽ¡’…³-horizonš²!tally–8Ôin“alphabMÞetical“order,‘orather“than“do˜wn“the“screen.Ž¡’…³-The–¦fdefault“is“`âoffá'.ަ‘Kâ:ârevert-all-at-newlineŽ¡’…³-áIf–Œêset“to“`âoná',‘’Readline“will“undo“all‘Œëc²!hanges“to“history“lines“bMÞeforeŽ¡’…³-returning–I4when‘I3executing“âaccept-lineá.‘ÆEBy“default,‘qæhistory“linesŽŽŒ‹ ÌIŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®11ŽŽŽ ƒ33 ý ÌÍ’…³-ma²!y–¦bšMÞe“mo˜di ed“and“retain“individual‘¥undo“lists“across“calls“toޤ 33’…³-âreadline()á.‘ÝÝThe–¦fdefault“is“`âoffá'.Ž©‘Kâ:âsearch-ignore-caseŽ¡’…³-áIf–Úset›Ùto“`âoná',‘7öReadline“pMÞerforms“incremen²!tal˜and“non-incremen²!talŽ¡’…³-history–<:list›<;searc²!hes“in˜a“case-insensitiv²!e˜fashion.‘ºyThe˜default“v‘ÿdDalueŽ¡’…³-is‘¦f`âoffá'.ަ‘Kâ:âshow-all-if-ambiguousŽ¡’…³-áThis–™]alters“the“default“bMÞeha²!vior“of“the‘™\completion“functions.‘Ù…If“setŽ¡’…³-to–L`âoná',‘^.wš²!ords“whic˜h‘L ha˜v˜e“more“than›L one“pMÞossible˜completion“causeŽ¡’…³-the–­matc²!hes“to“bšMÞe“listed“immediately‘­instead“of“ringing“the“b˜ell.Ž¡’…³-The–¦fdefault“v‘ÿdDalue“is“`âoffá'.ŽŸ‘Kâ:âshow-all-if-unmodifiedŽ¡’…³-áThis–¤‰alters“the›¤Šdefault“bMÞeha²!vior“of“the“completion˜functions“in“aŽ¡’…³-fashion–€similar“to“åsho•²!w-all-if-am“biguousá.‘«If–€set“to“`âoná',‘-®wš²!ords“whic˜hŽ¡’…³-ha•²!v“e–²Ömore“than“one“pšMÞossible‘²×completion“without“an²!y“p˜ossible“par-Ž¡’…³-tial–Ãcompletion›Ä(the“pMÞossible˜completions“don't“share˜a“commonŽ¡’…³-pre x)–¢cause›¢the“matc²!hes“to˜bMÞe“listed“immediately“instead˜of“ring-Ž¡’…³-ing–¦fthe“bMÞell.‘ÝÝThe“default“v‘ÿdDalue“is“`âoffá'.ަ‘Kâ:âshow-mode-in-promptŽ¡’…³-áIf–ê set›ê to“`âoná',‘¸add˜a“string“to˜the“bMÞeginning“of“the˜prompt“indicatingŽ¡’…³-the–ûûediting“moMÞde:‘‰emacs,›`vi“command,˜or“vi“insertion.‘Þ›The“moMÞdeŽ¡’…³-strings–rare‘ruser-settable“(e.g.,‘å™åemacs-moMÞde-string‘ðá).‘ BYThe“defaultŽ¡’…³-v‘ÿdDalue–¦fis“`âoffá'.ަ‘Kâ:âskip-completed-textŽ¡’…³-áIf–ñjset“to“`âoná',‘+this‘ñialters“the“default“completion“bMÞeha²!vior“when“in-Ž¡’…³-serting–}=a‘}set“of“meta-“and“con˜trol-Ž¡’…³-pre xes–Øîand›Øíbac²!kslash“escapMÞe“sequences“is˜a²!v‘ÿdDailable.‘uuThe˜`â\1á'“andŽ¡’…³-`â\2á'›á(escap•MÞes‘á)b“egin˜and–á)end˜sequences˜of“non-prin•²!ting˜c“haracters,Ž¡’…³-whic²!h–2Ôcan›2ÓbMÞe“used“to˜em²!bMÞed“a˜terminal“con²!trol“sequence˜in²!to“theŽ¡’…³-moMÞde–¦fstring.‘ÝÝThe“default“is“`â(cmd)á'.ŽŽŒ‹ Ø5Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®12ŽŽŽ ƒ33 ý ÌÍ‘Kâ:âvi-ins-mode-stringޤ 33’…³-áIf– ·the› ¶åsho²!w-moMÞde-in-prompt‘I·áv‘ÿdDariable“is˜enabled,‘&Kthis“string˜is“dis-Ž¡’…³-pla•²!y“ed–ÃRimmediately›ÃQbMÞefore“the˜last“line“of˜the“primary˜prompt“whenŽ¡’…³-vi–5Œediting›5moMÞde“is˜activ²!e“and˜in“insertion“moMÞde.‘‹QThe“v‘ÿdDalue˜is“ex-Ž¡’…³-panded–ë=likš²!e“a“k˜ey“binding,‘¬so“the“standard‘ë>set“of“meta-“and“con˜trol-Ž¡’…³-pre xes–Øîand›Øíbac²!kslash“escapMÞe“sequences“is˜a²!v‘ÿdDailable.‘uuThe˜`â\1á'“andŽ¡’…³-`â\2á'›á(escap•MÞes‘á)b“egin˜and–á)end˜sequences˜of“non-prin•²!ting˜c“haracters,Ž¡’…³-whic²!h–2Ôcan›2ÓbMÞe“used“to˜em²!bMÞed“a˜terminal“con²!trol“sequence˜in²!to“theŽ¡’…³-moMÞde–¦fstring.‘ÝÝThe“default“is“`â(ins)á'.Ž©R¶‘Kâ:âvisible-statsŽ¡’…³-áIf–Ôvset“to“`âoná',‘ßúa“cš²!haracter“denoting‘Ôwa“ le's“t˜ypšMÞe“is“app˜ended“to“theŽ¡’…³- lename–¦fwhen“listing“pMÞossible“completions.‘ÝÝThe“default“is“`âoffá'.ަ‘GKey‘¦fBindingsŽ¡‘Kâ:The– synš²!tax“for“con˜trolling‘ k˜ey“bindings“in“the“init“ le“is“simple.‘ First“y˜ouŽ¡‘Kâ:need–QÓto“ nd›QÔthe“name“of“the˜command“that“yš²!ou“w˜an˜t“to‘QÔc˜hange.‘Á¬The“follo˜wingŽ¡‘Kâ:sections–Ocon²!tain›Otables“of˜the“command˜name,‘yLthe˜default“kš²!eybinding,‘yMif“an˜y‘ÿe,Ž¡‘Kâ:and–¦fa“short“description“of“what“the“command“doMÞes.Ž©Bõ‘Kâ:Once›P…y•²!ou‘P†kno“w˜the˜name–P†of˜the“command,‘{ simply“place˜on“a˜line˜in“the˜initŽ¡‘Kâ: le– the› name“of“the˜kš²!ey“y˜ou“wish› to“bind“the“command˜to,›$'a“colon,˜and“thenŽ¡‘Kâ:the–Üÿname›Üþof“the˜command.‘§There˜can“bMÞe˜no“space˜bMÞet•²!w“een‘Üÿthe˜k“ey‘Üÿname˜andŽ¡‘Kâ:the–çcolon“{“that“will“bMÞe“inš²!terpreted“as“part“of“the“k˜ey“name.‘ŸÿThe“name“ofŽ¡‘Kâ:the–$Ûkš²!ey“can“bMÞe‘$Úexpressed“in“di eren˜t“w˜a˜ys,‘DxdepMÞending“on‘$Úwhat“y˜ou“ nd“mostŽ¡‘Kâ:comfortable.ަ‘Kâ:In– ÿaddition“to› command“names,‘$%Readline“allo•²!ws˜k“eys– ÿto“bšMÞe“b˜ound‘ to“a“stringŽ¡‘Kâ:that–4+is“inserted›4*when“the“k²!ey“is“pressed˜(a“åmacro‘ŒÐá).‘‡,The˜di erence“bMÞet•²!w“een‘4+aŽ¡‘Kâ:macro–¦fand“a“command“is“that“a“macro“is“enclosed“in“single“or“double“quotes.ŽŸR¶‘Kâ:åk²!eyname‘á:‘ÝÝåfunction-name‘Cmáor‘¦fåmacroŽŽ¡’…³-kš²!eyname‘jáis–tcthe“name‘tdof“a“k˜ey“spMÞelled“out“in“English.‘Í2F‘ÿeor“example:ަ’¢›‚âControl-u:‘¿ªuniversal-argumentŽ¡’¢›‚Meta-Rubout:‘¿ªbackward-kill-wordŽ¡’¢›‚Control-o:–¿ª">“output"ŽŸBô’…³-áIn– \Àthe‘ \¿example“abšMÞo•²!v“e,‘ JSèC-u– \Àáis“b˜ound“to‘ \¿the“functionŽ¡’…³-âuniversal-argumentá,‘|èM-DEL› &áis– %bMÞound“to˜the“functionŽ¡’…³-âbackward-kill-wordá,‘ šand–iLèC-o›iKáis“bMÞound˜to“run˜the“macroŽ¡’…³-expressed–~Jon“the›~Irigh²!t“hand“side“(that“is,‘ôBto“insert˜the“text“`â>Ž¡’…³-outputá'–¦fin²!to“the“line).ަ’…³-This–/Tkš²!ey“binding“syn˜tax“recognizes‘/Ua“n˜um˜bMÞer“of“sym˜bMÞolic“c˜haracterŽ¡’…³-names:‘#UåDELá,–ÑÑåESCá,“åESCAPEá,“åLFDá,“åNEWLINEá,“åRETá,“åRETURNá,Ž¡’…³-åR•²!UBOUT‘pÜá(a›¦fdestructiv“e˜bac“kspace),˜åSP‘ÿeA“CEá,˜åSPCá,˜and˜åT‘ÿeABá.ŽŸR¶‘Kâ:â"åk²!eyseq@æâ"á:‘ÝÝåfunction-name‘Cmáor‘¦fåmacroŽŽ¡’…³-k•²!eyseq‘º¢ádi ers‘y½from›y¼åk“eyname‘ÃáabMÞo“v“e˜in–y½that˜strings˜denoting“an˜en²!tireŽ¡’…³-k²!ey–¨âsequence“can“bšMÞe“sp˜eci ed,‘Û–bš²!y“placing“the“k˜ey“sequence“in“doubleŽ¡’…³-quotes.‘eåSome‘Ó¿çgnu–Ó¾áEmacs“stš²!yle“k˜ey“escapšMÞes“can“b˜e‘Ó¿used,‘ßas“in“theŽŽŒ‹ å(Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®13ŽŽŽ ƒ33 ý ÌÍ’…³-follo²!wing–s/example,‘æ_but“none›s.of“the˜spMÞecial“c²!haracter˜names“areޤ 33’…³-recognized.Ž©+…’¢›‚â"\C-u":‘¿ªuniversal-argumentŽ¡’¢›‚"\C-x\C-r":‘¿ªre-read-init-fileŽ¡’¢›‚"\e[11~":–¿ª"Function“Key“1"ަ’…³-áIn–Â×the“abšMÞo•²!v“e–Â×example,‘ÉòèC-u“áis“again‘ÂØb˜ound“to“the“functionŽ¡’…³-âuniversal-argument–?ßá(just“as“it“w²!as“in“the“ rst‘?Þexample),‘¦=`èC-xŽ¡’…³-C-rá'–¤Öis“bMÞound“to“the“function“âre-read-init-fileá,‘¥&and“`âESC–¦f[“1“1Ž¡’…³-~á'–¦fis“bMÞound“to“insert“the“text“`âFunction“Key“1á'.Ž©#בKâ:The–’Äfolloš²!wing“çgnu“áEmacs“st˜yle“escapMÞe‘’Åsequences“are“a˜v‘ÿdDailable“when“spMÞecifyingŽ¡‘Kâ:k²!ey‘¦fsequences:ŽŸ#Ø‘Kâ:è\C-‘(‘õáA–¦fcon²!trol“pre x.ަ‘Kâ:è\M-‘(‘õáAdding– $the› #meta“pre x“or“con•²!v“erting˜the› $follo“wing˜c“haracter‘ #to˜aŽ¡’…³-meta–(c²!haracter,‘0›as“describšMÞed“ab˜o•²!v“e–(under“âforce-meta-prefix“á(seeŽ¡’…³-âVariable‘¦fSettings–Bpáin“Section“1.3.1‘Bo[Readline“Init“File“Syn²!tax],Ž¡’…³-page‘¦f4).ަ‘Kâ:è\e‘.QŸáAn–¦fescapMÞe“c²!haracter.ަ‘Kâ:è\\‘.QŸáBac²!kslash.ަ‘Kâ:è\â"‘.QŸ"á,–¦fa“double“quotation“mark.ŽŸ#Ø‘Kâ:è\'‘.QŸâ'á,–¦fa“single“quote“or“apMÞostrophe.ަ‘Kâ:In–Qaddition“to›Qthe“çgnu“áEmacs“st²!yle˜escapMÞe“sequences,‘b)a“second˜set“of“bac²!kslashŽ¡‘Kâ:escapMÞes–¦fis“a²!v‘ÿdDailable:ަ‘Kâ:â\a‘.QŸáalert‘¦f(bMÞell)ަ‘Kâ:â\b‘.QŸábac²!kspaceަ‘Kâ:â\d‘.QŸádeleteޤ#Ø‘Kâ:â\f‘.QŸáform‘¦ffeedަ‘Kâ:â\n‘.QŸánewlineަ‘Kâ:â\r‘.QŸácarriage‘¦freturnަ‘Kâ:â\t‘.QŸáhorizon²!tal‘¦ftabަ‘Kâ:â\v‘.QŸáv²!ertical‘¦ftabŽ¡‘Kâ:â\ènnn‘"ÒKáThe–Ϲeighš²!t-bit“c˜haracter‘ϸwhose“v›ÿdDalue“is“the“oMÞctal“v˜alue‘ϸånnn“á(one“toޤ 33’…³-three‘¦fdigits).ަ‘Kâ:â\xèHH‘"ÒKáThe–0Jeighš²!t-bit“c˜haracter“whose“v›ÿdDalue‘0Iis“the“hexadecimal“v˜alue“åHHŽ¡’…³-á(one–¦for“t•²!w“o–¦fhex“digits).ަ‘Kâ:When–}Ëenš²!tering“the“text“of“a“macro,‘³£single“or“double“quotes“m˜ust“bMÞe“used“toŽ¡‘Kâ:indicate–Ñâa›Ñámacro“de nition.‘`PUnquoted“text˜is“assumed˜to“bMÞe“a˜function“name.Ž¡‘Kâ:The–IÙbac²!kslash‘IÚescapšMÞes“describ˜ed‘IÚab˜o•²!v“e–IÙare›IÚexpanded“in˜the“macro“b•MÞo“dy‘ÿe.‘¿Bac²!k-Ž¡‘Kâ:slash–…=á',˜`â<á',“and–Ö´`â>á'.‘nÇThe“vš²!ersion“n˜um˜bMÞer“supplied“onŽ¡’…³-the–Ä÷righ²!t›Äøside“of“the˜opMÞerator“consists“of˜a“ma‘›»jor“v•²!ersion˜n“um“bMÞer,‘ò anŽ¡’…³-optional›adecimal–apMÞoin²!t,‘nçand“an˜optional“minor˜v²!ersion˜(e.g.,‘næ`â7.1á').Ž¡’…³-If–ûOthe“minor“vš²!ersion‘ûPis“omitted,‘‡it“defaults“to“`â0á'.‘¤ÖThe“opMÞerator“ma˜yŽ¡’…³-bMÞe–Äseparated“from›Ãthe“string“âversion“áand“from˜the“vš²!ersion“n˜um˜bMÞerŽ¡’…³-argumen•²!t›b“y˜whitespace.‘·The‘follo“wing˜example˜sets˜a˜v‘ÿdDariable˜ifŽ¡’…³-the–¦fReadline“vš²!ersion“bMÞeing“used“is“7.0“or“new˜er:ŽŸš’¢›‚â$if–¿ªversion“>=“7.0Ž¡’¢›‚set–¿ªshow-mode-in-prompt“onŽ¡’¢›‚$endifަ‘Kâ:applicationŽ¡’…³-áThe–¢âåapplication“áconstruct›¢ãis“used“to“include˜application-spMÞeci c“set-Ž¡’…³-tings.‘£mEac²!h–÷program“using“the‘÷Readline“library“sets“the“åapplicationŽ¡’…³-nameá,‘õwand–ɸ‘!GIn–%Xthe‘%Wfolloš²!wing“descriptions,‘?'åpMÞoin˜t‘bXárefers›%Wto“the˜curren²!t“cursor“pMÞosition,‘?'and˜åmark‘Ï\árefersŽ¡‘Gto–ÏÑa›ÏÐcursor“pMÞosition˜sa•²!v“ed‘ÏÑb“y˜the–ÏÑâset-mark“ácommand.‘–VThe˜text“bMÞet•²!w“een˜the‘ÏÑpMÞoin“t˜and‘ÏÑmarkŽ¡‘Gis–Ãreferred“to“as“the“åregioná.‘4Readline“has“the“concept“of“an“äactive‘Vr–ÿp¹e“gion‘× á:‘Owhen–Ãthe“regionŽ¡‘Gis–5nactivš²!e,‘Y0Readline“redispla˜y“highligh˜ts“the“region“using‘5othe“v‘ÿdDalue“of“the“âactive-region-Ž¡‘Gstart-color–œáv›ÿdDariable.‘ÑšThe‘âenable-active-region“áv˜ariable“turns›this“on˜and“o .‘ÑšSev²!eralŽ¡‘Gcommands–¦fset“the“region“to“activš²!e;“those“are“noted“bMÞelo˜w.ŽŸ ‘Gëg1.4.1‘d(Commands–íMF‘þÄ£or“Mo–ávingŽŽŸ¾¹‘Gâbeginning-of-line‘¦f(C-a)Ž¡‘Kâ:áMo•²!v“e–N!to“the“start“of“the“currenš²!t“line.‘ÀqThis“ma˜y“also“bšMÞe“b˜ound“to“the“Home“k²!eyŽ¡‘Kâ:on–¦fsome“k²!eybMÞoards.Ž©J>‘Gâend-of-line‘¦f(C-e)Ž¡‘Kâ:áMo•²!v“e–ÙKto›ÙJthe“end“of˜the“line.‘v‹This˜ma²!y“also“b•MÞe˜b“ound–ÙKto˜the“End“k²!ey˜on“someŽ¡‘Kâ:k²!eybMÞoards.ަ‘Gâforward-char‘¦f(C-f)Ž¡‘Kâ:áMo•²!v“e›öMforw“ard˜a˜c“haracter.‘Í“This˜ma“y˜also˜b•MÞe˜b“ound˜to‘öNthe˜righ•²!t˜arro“w˜k“ey˜onŽ¡‘Kâ:some‘¦fk²!eybMÞoards.ަ‘Gâbackward-char‘¦f(C-b)Ž¡‘Kâ:áMo•²!v“e›žYbac“k‘žZa˜c“haracter.‘Û.This‘žZma“y˜also‘žZb•MÞe˜b“ound˜to–žZthe˜left“arro•²!w˜k“ey‘žZon˜someŽ¡‘Kâ:k²!eybMÞoards.ަ‘Gâforward-word‘¦f(M-f)Ž¡‘Kâ:áMo•²!v“e›¢kforw“ard˜to‘¢jthe˜end˜of˜the˜next˜w“ord.‘܉W‘ÿeords˜are˜compMÞosed‘¢jof˜letters˜andŽ¡‘Kâ:digits.ަ‘Gâbackward-word‘¦f(M-b)Ž¡‘Kâ:áMo•²!v“e››bac“k˜to˜the˜start˜of˜the˜curren“t˜or˜previous˜w“ord.‘|W‘ÿeords˜are˜compMÞosedŽ¡‘Kâ:of–¦fletters“and“digits.ަ‘Gâprevious-screen-line‘¦f()Ž¡‘Kâ:áAš²!ttempt–Ô@to“mo˜v˜e“pMÞoin˜t“to“the“same‘Ô?ph˜ysical“screen“column“on“the“previousŽ¡‘Kâ:ph²!ysical›screen–line.‘¦ÄThis“will˜not“ha•²!v“e˜the–desired˜e ect“if˜the“curren²!t˜ReadlineŽ¡‘Kâ:line–G–doMÞes“not‘G—takš²!e“up“more“than“one“ph˜ysical‘G—line“or“if“pMÞoin˜t“is‘G—not“greater“thanŽ¡‘Kâ:the–¦flength“of“the“prompt“plus“the“screen“width.ަ‘Gânext-screen-line‘¦f()Ž¡‘Kâ:áA•²!ttempt›öito‘öhmo“v“e˜pMÞoin“t–öhto˜the“same˜ph²!ysical“screen˜column“on˜the“next˜ph²!ysicalŽ¡‘Kâ:screen–ÍBline.‘•|This“will›ÍAnot“ha•²!v“e–ÍBthe“desired“e ect“if“the˜curren²!t“Readline“line“doMÞesŽŽŒ‹ûŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®19ŽŽŽ ƒ33 ý ÌÍ‘Kâ:not–Eðtakš²!e“up“more“than“one“ph˜ysical“line‘Eñor“if“the“length“of“the“curren˜t“Readlineޤ 33‘Kâ:line–¦fis“not“greater“than“the“length“of“the“prompt“plus“the“screen“width.Ž©¼k‘Gâclear-display‘¦f(M-C-l)Ž¡‘Kâ:áClear–ô·the›ô¸screen“and,‘Lif˜pMÞossible,‘Kthe˜terminal's“scrollbac²!k˜bu er,‘Lthen“redra²!wŽ¡‘Kâ:the–¦fcurrenš²!t“line,“lea˜ving“the“curren˜t“line“at“the“top“of“the“screen.ަ‘Gâclear-screen‘¦f(C-l)Ž¡‘Kâ:áClear›"„the–"ƒscreen,‘A‹then“redra²!w˜the“curren•²!t˜line,‘AŠlea“ving˜the‘"ƒcurren“t˜line‘"ƒat˜theŽ¡‘Kâ:top–ýKof›ýLthe“screen.‘âIf“giv²!en˜a“nš²!umeric“argumen˜t,‘this“refreshes“the‘ýLcurren˜t“lineŽ¡‘Kâ:without–¦fclearing“the“screen.ަ‘Gâredraw-current-line‘¦f()Ž¡‘Kâ:áRefresh–¦fthe“currenš²!t“line.‘ÝÝBy“default,“this“is“un˜bMÞound.ŽŸ‰8‘Gëg1.4.2‘d(Commands–íMF‘þÄ£or“Manipulating“The“HistoryŽŽŸ÷Ï‘Gâaccept-line–¦f(Newline“or“Return)Ž¡‘Kâ:áAccept–Ÿdthe›Ÿeline“regardless˜of“where˜the“cursor˜is.‘Û‡If“this˜line“is˜non-empt•²!y‘ÿe,‘ Ëy“ouŽ¡‘Kâ:can–O`add“it›O_to“the“history“list“using“âadd_history()á.‘ØÊIf“this“line˜is“a“moMÞdi edŽ¡‘Kâ:history–¦fline,“then“restore“the“history“line“to“its“original“state.ަ‘Gâprevious-history‘¦f(C-p)Ž¡‘Kâ:áMo•²!v“e›`bac“k'–Žthrough˜the˜history“list,‘!ºfetc²!hing˜the“previous˜command.‘¦•This˜ma²!yŽ¡‘Kâ:also–¦fbšMÞe“b˜ound“to“the“up“arroš²!w“k˜ey“on“some“k˜eybMÞoards.ŽŸ¼j‘Gânext-history‘¦f(C-n)Ž¡‘Kâ:áMo•²!v“e›lè`forw“ard'–lçthrough˜the˜history“list,‘xhfetc²!hing“the˜next“command.‘ʳThis˜ma²!yŽ¡‘Kâ:also–¦fbšMÞe“b˜ound“to“the“doš²!wn“arro˜w“k˜ey“on“some“k˜eybMÞoards.ަ‘Gâbeginning-of-history‘¦f(M-<)Ž¡‘Kâ:áMo•²!v“e–¦fto“the“ rst“line“in“the“history‘ÿe.ަ‘Gâend-of-history‘¦f(M->)Ž¡‘Kâ:áMo•²!v“e–¦fto“the“end“of“the“input“history‘ÿe,“i.e.,“the“line“currenš²!tly“bMÞeing“en˜tered.ަ‘Gâreverse-search-history‘¦f(C-r)Ž¡‘Kâ:áSearc•²!h›½:bac“kw“ard˜starting‘½;at˜the˜curren“t˜line˜and˜mo“ving‘½;`up'˜through˜the˜his-Ž¡‘Kâ:tory–$˜as›$—necessary‘ÿe.‘²˜This“is˜an“incremenš²!tal“searc˜h.‘²˜This›$—command“sets˜the“regionŽ¡‘Kâ:to–¦fthe“matc²!hed“text“and“activ‘ÿdDates“the“region.ަ‘Gâforward-search-history‘¦f(C-s)Ž¡‘Kâ:áSearc•²!h›>Dforw“ard˜starting˜at˜the˜curren“t‘>Cline˜and˜mo“ving˜`do“wn'˜through˜theŽ¡‘Kâ:history–•Îas“necessary‘ÿe.‘¬This“is“an‘•Íincremenš²!tal“searc˜h.‘¬This‘•Ícommand“sets“theŽ¡‘Kâ:region–¦fto“the“matc²!hed“text“and“activ‘ÿdDates“the“region.ަ‘Gânon-incremental-reverse-search-history‘¦f(M-p)Ž¡‘Kâ:áSearc•²!h›½:bac“kw“ard˜starting‘½;at˜the˜curren“t˜line˜and˜mo“ving‘½;`up'˜through˜the˜his-Ž¡‘Kâ:tory–Ryas“necessary“using‘Rxa“non-incremenš²!tal“searc˜h“for“a“string‘Rxsupplied“b˜y“theŽ¡‘Kâ:user.‘ÝÝThe–¦fsearcš²!h“string“ma˜y“matc˜h“an˜ywhere“in“a“history“line.ަ‘Gânon-incremental-forward-search-history‘¦f(M-n)Ž¡‘Kâ:áSearc•²!h›>Dforw“ard˜starting˜at˜the˜curren“t‘>Cline˜and˜mo“ving˜`do“wn'˜through˜theŽ¡‘Kâ:history–3ªas›3©necessary“using“a˜non-incremenš²!tal“searc˜h“for›3©a“string“supplied˜b²!y“theŽ¡‘Kâ:user.‘ÝÝThe–¦fsearcš²!h“string“ma˜y“matc˜h“an˜ywhere“in“a“history“line.ŽŽŒ‹(iŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®20ŽŽŽ ƒ33 ý ÌÍ‘Gâhistory-search-backward‘¦f()ޤ 33‘Kâ:áSearc•²!h›-»bac“kw“ard–-¼through˜the“history˜for“the˜string“of˜cš²!haracters“bMÞet˜w˜een‘-»theŽ¡‘Kâ:start–QËof›QÌthe“curren²!t“line˜and“the“pMÞoinš²!t.‘à The“searc˜h‘QÌstring“m˜ust“matc˜h‘QÌat“theŽ¡‘Kâ:bMÞeginning–Zof“a“history“line.‘ øÀThis‘Zis“a“non-incremenš²!tal“searc˜h.‘ øÀBy“default,Ž¡‘Kâ:this–ç†command“is“unš²!bMÞound,‘÷Îbut“ma˜y“bšMÞe“b˜ound“to“the“Pš²!age“Do˜wn“k˜ey“on“someŽ¡‘Kâ:k²!eybMÞoards.Ž©‘Gâhistory-search-forward‘¦f()Ž¡‘Kâ:áSearc•²!h›­þforw“ard˜through–­ýthe˜history˜for˜the˜string˜of“c•²!haracters˜bMÞet“w“een˜the˜startŽ¡‘Kâ:of–¨wthe“currenš²!t“line“and“the“pMÞoin˜t.‘‰8The“searc˜h“string“m˜ust“matc˜h“at“the“bMÞeginningŽ¡‘Kâ:of–ìía›ììhistory“line.‘±qThis“is“a˜non-incremenš²!tal“searc˜h.‘±qBy“default,‘þŽthis“commandŽ¡‘Kâ:is–¦funš²!bMÞound,“but“ma˜y“bšMÞe“b˜ound“to“the“Pš²!age“Up“k˜ey“on“some“k˜eybMÞoards.ަ‘Gâhistory-substring-search-backward‘¦f()Ž¡‘Kâ:áSearc•²!h›-»bac“kw“ard–-¼through˜the“history˜for“the˜string“of˜cš²!haracters“bMÞet˜w˜een‘-»theŽ¡‘Kâ:start–uæof›uçthe“curren²!t“line“and˜the“pMÞoinš²!t.‘ͳThe“searc˜h“string“ma˜y‘uçmatc˜h“an˜ywhereŽ¡‘Kâ:in–è"a“history“line.‘£This“is“a“non-incremenš²!tal“searc˜h.‘£By“default,‘ø‘this“commandŽ¡‘Kâ:is‘¦fun²!bMÞound.ŽŸ‘Gâhistory-substring-search-forward‘¦f()Ž¡‘Kâ:áSearc•²!h›úOforw“ard˜through–úPthe˜history˜for˜the˜string˜of“c•²!haracters˜bMÞet“w“een˜theŽ¡‘Kâ:start–uæof›uçthe“curren²!t“line“and˜the“pMÞoinš²!t.‘ͳThe“searc˜h“string“ma˜y‘uçmatc˜h“an˜ywhereŽ¡‘Kâ:in–è"a“history“line.‘£This“is“a“non-incremenš²!tal“searc˜h.‘£By“default,‘ø‘this“commandŽ¡‘Kâ:is‘¦fun²!bMÞound.ަ‘Gâyank-nth-arg‘¦f(M-C-y)Ž¡‘Kâ:áInsert–@the›? rst“argumen²!t˜to“the˜previous“command“(usually˜the“second˜w²!ord“onŽ¡‘Kâ:the–˜Gprevious›˜Fline)“at˜pMÞoinš²!t.‘Ù(With“an“argumen˜t›˜Fåná,‘›insert“the˜ånáth“w²!ord˜from“theŽ¡‘Kâ:previous–<command“(the“w²!ords›<in“the“previous“command“bMÞegin“with˜w²!ord“0).‘ºhAŽ¡‘Kâ:negativ•²!e›Þargumen“t‘Ýinserts˜the˜ånáth˜w“ord–Ýfrom˜the˜end˜of“the˜previous˜command.Ž¡‘Kâ:Once–Ìthe“argumen²!t“ån“áis“computed,‘Õkthis“uses“the“history“expansion“facilities“toŽ¡‘Kâ:extract–¦fthe“ånáth“w²!ord,“as“if“the“`â!èná'“history“expansion“had“bšMÞeen“sp˜eci ed.ަ‘Gâyank-last-arg–¦f(M-.“or“M-_)Ž¡‘Kâ:áInsert–5Elast›5Fargumen²!t“to“the˜previous“command“(the˜last“w²!ord“of˜the“previousŽ¡‘Kâ:history–"enš²!try).‘With“a‘#n˜umeric“argumen˜t,‘ ’bMÞeha˜v˜e“exactly‘#lik˜e“âyank-nth-argá.Ž¡‘Kâ:Successivš²!e–ú%calls‘ú&to“âyank-last-arg“ámo˜v˜e‘ú&bac˜k“through‘ú&the“history“list,‘™insertingŽ¡‘Kâ:the–µlast‘µwš²!ord“(or“the“w˜ord‘µspMÞeci ed“b˜y“the“argumen˜t›µto“the“ rst“call)˜of“eac²!h“lineŽ¡‘Kâ:in–`¿turn.‘ êAnš²!y“n˜umeric‘`Àargumen˜t“supplied“to‘`Àthese“successiv˜e‘`Àcalls“determinesŽ¡‘Kâ:the–-Idirection›-Jto“mo•²!v“e˜through‘-Ithe˜history‘ÿe.‘r‡A‘-'negativ“e‘-Iargumen“t˜switc“hes‘-ItheŽ¡‘Kâ:direction–ªÙthrough“the“history“(bacš²!k“or“forw˜ard).‘ŠThis“uses“the“history“expansionŽ¡‘Kâ:facilities–÷Õto“extract“the›÷Ôlast“w²!ord,‘L0as“if“the“`â!$á'˜history“expansion“had“bMÞeenŽ¡‘Kâ:spMÞeci ed.ަ‘Gâoperate-and-get-next‘¦f(C-o)Ž¡‘Kâ:áAccept–~tthe“curren²!t“line“for“return“to“the‘~ucalling“application“as“if“a“newline“hadŽ¡‘Kâ:bMÞeen–ÈÀenš²!tered,‘õand“fetc˜h“the“next‘È¿line“relativ˜e“to“the“curren˜t“line‘È¿from“the“historyŽ¡‘Kâ:for–¶›editing.‘~A‘¶—nš²!umeric“argumen˜t,›º©if“supplied,˜spMÞeci es“the›¶œhistory“en²!try˜to“useŽ¡‘Kâ:instead–¦fof“the“curren²!t“line.ŽŽŒ‹5%Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®21ŽŽŽ ƒ33 ý ÌÍ‘Gâfetch-history‘¦f()ޤ 33‘Kâ:áWith–äfa‘äenš²!umeric“argumen˜t,‘ 3fetc˜h‘äethat“en˜try“from“the‘äehistory“list“and“mak˜e‘äeit“theŽ¡‘Kâ:currenš²!t––xline.‘ØŽWithout‘–yan“argumen˜t,‘™¨mo˜v˜e“bac˜k›–yto“the“ rst˜en²!try“in˜the“historyŽ¡‘Kâ:list.ŽŸýq‘Gëg1.4.3‘d(Commands–íMF›þÄ£or“Changing“T˜extŽŽŸ1ì‘Gèend-of-file–¦fâ(usually“C-d)Ž¡‘Kâ:áThe–%¡c²!haracter›% indicating“end-of- le“as“set,–?bfor˜example,“b²!y–%¡âsttyá.‘²ñIf˜this“c²!harac-Ž¡‘Kâ:ter–×is“read“when“there“are“no“cš²!haracters“on“the“line,‘ÒÁand“pMÞoin˜t“is“at“the“bMÞeginningŽ¡‘Kâ:of–¦fthe“line,“Readline“in²!terprets“it“as“the“end“of“input“and“returns“çeofá.ŽŸ0¥‘Gâdelete-char‘¦f(C-d)Ž¡‘Kâ:áDelete–þ¾the“cš²!haracter“at“pMÞoin˜t.‘æåIf‘þ½this“function“is“bMÞound“to“the“same“c˜haracterŽ¡‘Kâ:as–&1the“ttš²!y“çeof“ác˜haracter,›F#as“èC-d“ácommonly“is,˜see“abMÞo•²!v“e–&1for“the“e ects.‘]>ThisŽ¡‘Kâ:ma²!y–¦falso“bšMÞe“b˜ound“to“the“Delete“kš²!ey“on“some“k˜eybMÞoards.Ž©0¤‘Gâbackward-delete-char‘¦f(Rubout)Ž¡‘Kâ:áDelete–Ÿ§the“cš²!haracter‘Ÿ¨bMÞehind“the“cursor.‘ÛA‘Ÿ¦n˜umeric“argumen˜t“means‘Ÿ¨to“kill“theŽ¡‘Kâ:c•²!haracters,›¦fsa“ving˜them˜on˜the˜kill˜ring,˜instead˜of˜deleting˜them.ަ‘Gâforward-backward-delete-char‘¦f()Ž¡‘Kâ:áDelete–˜‘the›˜’c²!haracter“under˜the“cursor,‘Õunless“the˜cursor“is“at˜the“end˜of“theŽ¡‘Kâ:line,‘×~in–Í­whicš²!h‘ͬcase“the“c˜haracter›ͬbMÞehind“the˜cursor“is˜deleted.‘S±By“default,‘×~thisŽ¡‘Kâ:is–¦fnot“bMÞound“to“a“k²!ey‘ÿe.ŽŸ0¥‘Gâquoted-insert–¦f(C-q“or“C-v)Ž¡‘Kâ:áAdd–¸the‘¹next“cš²!haracter“t˜ypMÞed‘¹to“the“line“v˜erbatim.‘CÔThis‘¹is“ho˜w“to‘¹insert“k˜eyŽ¡‘Kâ:sequences–¦flik²!e“èC-qá,“for“example.ަ‘Gâtab-insert‘¦f(M-TAB)Ž¡‘Kâ:áInsert–¦fa“tab“c²!haracter.ŽŸ0¥‘Gâself-insert–¦f(a,“b,“A,“1,“!,“...Ž‘åe)Ž¡‘Kâ:áInsert–¦fthe“cš²!haracter“t˜ypMÞed.ަ‘Gâbracketed-paste-begin‘¦f()Ž¡‘Kâ:áThis–û6function›û7is“in²!tended˜to˜bšMÞe“b˜ound“to›û7the“â"ábrac•²!k“eted˜pasteâ"˜áescapMÞe‘û6sequenceŽ¡‘Kâ:sen•²!t›b“y‘some˜terminals,‘·¯and˜suc“h˜a–binding˜is“assigned˜b•²!y˜default.‘mÁIt˜allo“wsŽ¡‘Kâ:Readline–çÌto›çËinsert“the˜pasted“text˜as“a˜single“unit˜without“treating˜eacš²!h“c˜har-Ž¡‘Kâ:acter–ª‘as›ª’if“it“had˜bMÞeen“read“from˜the“kš²!eybMÞoard.‘ê_The“c˜haracters‘ª’are“insertedŽ¡‘Kâ:as–LPif›LOeac²!h“one˜w²!as“bMÞound“to˜âself-insert“áinstead˜of“executing˜an²!y“editingŽ¡‘Kâ:commands.ŽŸ±ì‘Kâ:Brac•²!k“eted–U`paste›U_sets“the˜region“(the˜cš²!haracters“b•MÞet˜w˜een‘U_p“oin˜t–U`and‘U_the“mark)Ž¡‘Kâ:to–¦fthe“inserted“text.‘ÝÝIt“sets“the“äactive‘êêr–ÿp¹e“gioná.ަ‘Gâtranspose-chars‘¦f(C-t)Ž¡‘Kâ:áDrag–Õãthe“cš²!haracter“bMÞefore‘Õâthe“cursor“forw˜ard“o˜v˜er“the“c˜haracter‘Õâat“the“cursor,Ž¡‘Kâ:moš²!ving–C"the“cursor‘C!forw˜ard“as“w˜ell.‘´If“the“insertion‘C!pMÞoin˜t“is“at“the‘C!end“of“theŽ¡‘Kâ:line,‘ÕÍthen–¡¦this“transpMÞoses“the“last“t•²!w“o‘¡§c“haracters–¡¦of“the“line.‘†óNegativš²!e“argumen˜tsŽ¡‘Kâ:ha•²!v“e–¦fno“e ect.ŽŽŒ‹CÄŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®22ŽŽŽ ƒ33 ý ÌÍ‘Gâtranspose-words‘¦f(M-t)ޤ 33‘Kâ:áDrag–áÜthe“w²!ord‘áÝbšMÞefore“p˜oinš²!t“past“the“w˜ord‘áÝafter“p•MÞoin˜t,‘ð¹mo˜ving‘áÝp“oin˜t–áÜpast“thatŽ¡‘Kâ:wš²!ord–g¸as“w˜ell.‘ÈùIf“the“insertion“pMÞoin˜t“is“at“the“end“of“the‘g¹line,‘tAthis“transpMÞoses“theŽ¡‘Kâ:last›¦ft•²!w“o˜w“ords˜on˜the˜line.Ž©m‘Gâupcase-word‘¦f(M-u)Ž¡‘Kâ:áUppMÞercase–ÖÓthe‘ÖÒcurrenš²!t“(or“follo˜wing)“w˜ord.‘o#With“a‘ÖÒnegativ˜e“argumen˜t,‘âîuppMÞer-Ž¡‘Kâ:case–¦fthe“previous“wš²!ord,“but“do“not“mo˜v˜e“the“cursor.ŽŸm‘Gâdowncase-word‘¦f(M-l)Ž¡‘Kâ:áLo•²!w“ercase›”ãthe‘”âcurren“t˜(or‘”âfollo“wing)˜w“ord.‘‚²With‘”âa˜negativ“e˜argumen“t,‘Ë–lo“w“ercaseŽ¡‘Kâ:the–¦fprevious“wš²!ord,“but“do“not“mo˜v˜e“the“cursor.ަ‘Gâcapitalize-word‘¦f(M-c)Ž¡‘Kâ:áCapitalize–6the›5curren²!t“(or˜folloš²!wing)“w˜ord.‘€#With‘5a“negativ˜e“argumen˜t,‘ÅrcapitalizeŽ¡‘Kâ:the–¦fprevious“wš²!ord,“but“do“not“mo˜v˜e“the“cursor.ŽŸm‘Gâoverwrite-mode‘¦f()Ž¡‘Kâ:áT‘ÿeoggle›öo•²!v“erwrite˜mo•MÞde.‘Í With˜an˜explicit˜p“ositiv•²!e‘ö n“umeric˜argumen“t,‘ switc“hesŽ¡‘Kâ:to›™ÿo•²!v“erwrite–šmoMÞde.‘„fWith˜an“explicit˜non-pMÞositivš²!e“n˜umeric–™ÿargumen˜t,‘Ï®switc˜hes“toŽ¡‘Kâ:insert–¬ÛmoMÞde.‘ñ=This›¬Ücommand“a ects“only˜âemacs“ámošMÞde;‘°âvi“ámo˜de‘¬Üdo˜es“o•²!v“erwriteŽ¡‘Kâ:di eren•²!tly‘ÿe.‘ÝÝEac“h–¦fcall“to“âreadline()“ástarts“in“insert“moMÞde.ŽŸÐ$‘Kâ:In›Ièo•²!v“erwrite˜moMÞde,‘òÈc“haracters˜bMÞound˜to˜âself-insert‘Iéáreplace˜the˜text˜atŽ¡‘Kâ:pMÞoinš²!t–rather“than“pushing“the“text“to“the“righ˜t.‘‚Characters“bMÞound“toŽ¡‘Kâ:âbackward-delete-char–¦fáreplace“the“c²!haracter“bšMÞefore“p˜oin²!t“with“a“space.ŽŸÐ#‘Kâ:By–­zdefault,›¯?this‘­ycommand“is“un•²!bMÞound,˜but‘­yma“y–­zbšMÞe“b˜ound“to“the‘­yInsert“k²!ey“onŽ¡‘Kâ:some‘¦fk²!eybMÞoards.ŽŸ9â‘Gëg1.4.4‘d(Killing–íMAnd“Y‘þÄ£ankingŽŽŸP$‘Gâkill-line‘¦f(C-k)Ž¡‘Kâ:áKill–:the“text›9from“pMÞoin²!t“to“the˜end“of“the“curren²!t˜line.‘°ÏWith˜a“negativš²!e“n˜umericŽ¡‘Kâ:argumenš²!t,–¦fkill“bac˜kw˜ard“from“the“cursor“to“the“bMÞeginning“of“the“line.ަ‘Gâbackward-kill-line–¦f(C-x“Rubout)Ž¡‘Kâ:áKill›ÌÔbac•²!kw“ard˜from˜the‘ÌÕcursor˜to˜the˜bMÞeginning˜of˜the˜curren“t˜line.‘Q(With˜aŽ¡‘Kâ:negativ•²!e›“n“umeric˜argumen“t,‘‡Wkill‘”forw“ard˜from˜the˜cursor–”to˜the˜end˜of“the˜line.ŽŸm‘Gâunix-line-discard‘¦f(C-u)Ž¡‘Kâ:áKill›¦fbac•²!kw“ard˜from˜the˜cursor˜to˜the˜bMÞeginning˜of˜the˜curren“t˜line.ަ‘Gâkill-whole-line‘¦f()Ž¡‘Kâ:áKill–cjall“cš²!haracters‘cion“the“curren˜t“line,‘’ªno“matter“where“pMÞoin˜t“is.‘èBy“default,Ž¡‘Kâ:this–¦fis“un²!bMÞound.ŽŸm‘Gâkill-word‘¦f(M-d)Ž¡‘Kâ:áKill–‡ from“pMÞoin²!t›‡ to“the“end“of“the˜currenš²!t“w˜ord,‘Por‘‡ if“bMÞet˜w˜een“w˜ords,‘Qto“the“endŽ¡‘Kâ:of–¦fthe“next“w²!ord.‘ÝÝW‘ÿeord“bMÞoundaries“are“the“same“as“âforward-wordá.ަ‘Gâbackward-kill-word‘¦f(M-DEL)Ž¡‘Kâ:áKill–wÖthe›w×w²!ord“b•MÞehind˜p“oin²!t.‘ÎXW‘ÿeord›wÖb“oundaries˜are–w×the˜same“as˜âbackward-wordá.ŽŽŒ‹P Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®23ŽŽŽ ƒ33 ý ÌÍ‘Gâunix-word-rubout‘¦f(C-w)ޤ 33‘Kâ:áKill–â}the‘â~w²!ord“bšMÞehind“p˜oin²!t,‘ñƒusing›â~white“space˜as“a“w•²!ord˜bMÞoundary‘ÿe,‘ñƒsa“ving‘â}theŽ¡‘Kâ:killed–¦ftext“on“the“kill-ring.Ž©m‘Gâunix-filename-rubout‘¦f()Ž¡‘Kâ:áKill–]Üthe“w²!ord“bšMÞehind“p˜oinš²!t,‘‹ºusing“white“space“and“the“slash“c˜haracter“as“theŽ¡‘Kâ:wš²!ord–¦fbMÞoundaries,“sa˜ving“the“killed“text“on“the“kill-ring.ŽŸm‘Gâdelete-horizontal-space‘¦f()Ž¡‘Kâ:áDelete–¦fall“spaces“and“tabs“around“pMÞoinš²!t.‘ÝÝBy“default,“this“is“un˜bMÞound.ަ‘Gâkill-region‘¦f()Ž¡‘Kâ:áKill–¦fthe“text“in“the“currenš²!t“region.‘ÝÝBy“default,“this“command“is“un˜bMÞound.ަ‘Gâcopy-region-as-kill‘¦f()Ž¡‘Kâ:áCop²!y–³the›²text“in˜the“region˜to“the˜kill“bu er,‘0Eso˜it“can˜bMÞe“y•²!ank“ed˜righ“t‘³a“w“a“y‘ÿe.Ž¡‘Kâ:By–¦fdefault,“this“command“is“un²!bMÞound.ަ‘Gâcopy-backward-word‘¦f()Ž¡‘Kâ:áCopš²!y–žthe“w˜ord“bšMÞefore“p˜oinš²!t“to“the“kill‘žbu er.‘ÄÿThe“w˜ord“bMÞoundaries“are“theŽ¡‘Kâ:same–¦fas“âbackward-wordá.‘ÝÝBy“default,“this“command“is“un²!bMÞound.ŽŸm‘Gâcopy-forward-word‘¦f()Ž¡‘Kâ:áCopš²!y–º8the“w˜ord“follo˜wing‘º9pMÞoin˜t“to“the“kill“bu er.‘SThe‘º9w˜ord“bMÞoundaries“are“theŽ¡‘Kâ:same–¦fas“âforward-wordá.‘ÝÝBy“default,“this“command“is“un²!bMÞound.ަ‘Gâyank‘¦f(C-y)Ž¡‘Kâ:áY‘ÿeank–¦fthe“top“of“the“kill“ring“inš²!to“the“bu er“at“pMÞoin˜t.ަ‘Gâyank-pop‘¦f(M-y)Ž¡‘Kâ:áRotate–'!the“kill-ring,‘GPand“y²!ank“the“new“top.‘`Y‘ÿeou“can‘'"only“do“this“if“the“priorŽ¡‘Kâ:command–¦fis“âyank“áor“âyank-popá.ŽŸ9Ï‘Gëg1.4.5‘d(Spiecifying–íMNumeric“Argumen–átsŽŽŸÐ‘Gâdigit-argument–¦f(èM-0â,“èM-1â,“...Ž‘‹ËèM--â)Ž¡‘Kâ:áAdd–:Lthis›:Kdigit“to“the˜argumenš²!t“already“accum˜ulating,‘Oêor“start“a‘:Knew“argumen˜t.Ž¡‘Kâ:èM--–¦fástarts“a“negativš²!e“argumen˜t.ަ‘Gâuniversal-argument‘¦f()Ž¡‘Kâ:áThis–kis“another“w•²!a“y›jto–kspMÞecify“an“argumen²!t.‘«ßIf“this“command˜is“follo•²!w“ed›kb“y˜oneŽ¡‘Kâ:or–more›digits,‘“´optionally“with˜a“leading“min²!us“sign,‘“³those“digits“de ne˜the“ar-Ž¡‘Kâ:gumenš²!t.‘ÐÚIf‘[the–\command“is“follo˜w˜ed“b˜y“digits,‘‡*executing“âuniversal-argumentŽ¡‘Kâ:áagain–Ñ«ends‘Ѫthe“nš²!umeric“argumen˜t,‘Ü{but“is“otherwise›Ѫignored.‘_«As“a˜spMÞecial“case,Ž¡‘Kâ:if–ñúthis›ñûcommand“is“immediately˜follo•²!w“ed›ñúb“y˜a˜c“haracter–ñûthat˜is˜neither“a˜digitŽ¡‘Kâ:nor–ôÝminš²!us“sign,‘H{the“argumen˜t“coun˜t“for“the“next‘ôÞcommand“is“m˜ultiplied“b˜yŽ¡‘Kâ:four.‘ŽïThe›6Áargumen•²!t‘6Âcoun“t˜is˜initially–6Âone,‘Z×so“executing˜this˜function“the˜ rstŽ¡‘Kâ:time–omakš²!es‘othe“argumen˜t‘ocoun˜t“four,‘z&a›osecond“time˜mak²!es“the˜argumenš²!t“coun˜tŽ¡‘Kâ:sixteen,–¦fand“so“on.‘ÝÝBy“default,“this“is“not“bMÞound“to“a“k²!ey‘ÿe.ŽŽŒ‹\FŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®24ŽŽŽ ƒ33 ý ÌÍ‘Gëg1.4.6‘d(Letting–íMReadline“T–áypie“F›þÄ£or“Y˜ouŽŽŸb"‘Gâcomplete‘¦f(TAB)ޤ 33‘Kâ:áA²!ttempt–¶èto›¶çpMÞerform“completion˜on“the˜text“b•MÞefore˜p“oin²!t.‘Ž The˜actual‘¶ècompletionŽ¡‘Kâ:pšMÞerformed–¦fis“application-sp˜eci c.‘ÝÝThe“default“is“ lename“completion.Ž©‘‘Gâpossible-completions‘¦f(M-?)Ž¡‘Kâ:áList–)¯the›)®pMÞossible“completions˜of“the˜text“b•MÞefore˜p“oin•²!t.‘g·When˜displa“ying‘)¯com-Ž¡‘Kâ:pletions,‘ôfReadline–äÌsets›äÍthe“n•²!um“bMÞer˜of–äÌcolumns“used˜for“displa²!y˜to“the˜v‘ÿdDalue“ofŽ¡‘Kâ:âcompletion-display-widthá,‘Uthe–aŒv›ÿdDalue“of“the“en•²!vironmen“t–aŒv˜ariable“âCOLUMNSá,Ž¡‘Kâ:or–¦fthe“screen“width,“in“that“order.ަ‘Gâinsert-completions‘¦f(M-*)Ž¡‘Kâ:áInsert–«µall“completions“of“the“text“bšMÞefore“p˜oinš²!t“that“w˜ould“ha˜v˜e“bMÞeen“generatedŽ¡‘Kâ:bš²!y–¦fâpossible-completionsá,“separated“b˜y“a“space.ަ‘Gâmenu-complete‘¦f()Ž¡‘Kâ:áSimilar–ÛVto“âcompleteá,‘óbut“replaces“the“wš²!ord“to‘ÛWbMÞe“completed“with“a“single“matc˜hŽ¡‘Kâ:from–Jthe“list“of“pšMÞossible“completions.‘ë‰Rep˜eatedly“executing“âmenu-completeŽ¡‘Kâ:ásteps–Q3through›Q2the“list“of“pMÞossible˜completions,‘b=inserting“eacš²!h“matc˜h“in‘Q2turn.‘ÁwA˜tŽ¡‘Kâ:the–Ãðend“of“the“list“of“completions,‘ Râmenu-complete“árings“the“bMÞell“(sub‘›»ject“toŽ¡‘Kâ:the–ffsetting›feof“âbell-styleá)“and˜restores“the“original˜text.‘ÜAn“argumen²!t˜of“ånŽ¡‘Kâ:ámo•²!v“es–aeån›adápMÞositions“forw²!ard˜in“the˜list“of“matcš²!hes;‘¾ãa“negativ˜e‘adargumen˜t“mo˜v˜esŽ¡‘Kâ:bac•²!kw“ard–s.through›s-the“list.‘ÌÊThis“command˜is“in²!tended˜to“bšMÞe“b˜ound‘s-to“âTABá,‘}lbutŽ¡‘Kâ:is–¦funš²!bMÞound“b˜y“default.ŽŸ‘‘Gâmenu-complete-backward‘¦f()Ž¡‘Kâ:áIdenš²!tical–5ato“âmenu-completeá,‘Ybut‘5`mo˜v˜es“bac˜kw˜ard“through“the‘5`list“of“pMÞossibleŽ¡‘Kâ:completions,‘uòas–Lpif›Loâmenu-complete“áhad“bMÞeen“giv²!en˜a“negativš²!e“argumen˜t.‘ÏúThisŽ¡‘Kâ:command–¦fis“unš²!bMÞound“b˜y“default.ަ‘Gâexport-completions‘¦f()Ž¡‘Kâ:áPš²!erform–$Ècompletion‘$Éon“the“w˜ord‘$ÉbšMÞefore“p˜oin²!t‘$Éas“describ˜ed“ab˜o•²!v“e‘$Éand‘$ÈwriteŽ¡‘Kâ:the–\3list“of›\2pMÞossible“completions“to“Readline's“output“stream˜using“the“follo²!wingŽ¡‘Kâ:format,–¦fwriting“information“on“separate“lines:Ž©â#‘TÜËꎑažáthe›¦fn•²!um“bMÞer˜of˜matc“hes˜åN‘/®á;ޤâ"‘TÜËꎑažáthe–¦fw²!ord“bMÞeing“completed;Ž¡‘TÜËꎑažåS‘£‡á:åEá,‘âþwhere–²$åS‘U«áand“åE‘Uªáare“the“start“and“end“o sets“of“the‘²#w²!ord“in“the“Readlineޤ 33‘ažline–¦fbu er;“thenަ‘TÜËꎑažáeac•²!h›¦fmatc“h,˜one˜pMÞer˜lineŽŸ‘‘Kâ:If–éÏthere›éÎare“no˜matc²!hes,‘ú©the“ rst˜line“will˜bMÞe“\0",‘ú©and˜this“command˜doMÞes“notŽ¡‘Kâ:prin•²!t›an“y˜output˜after–the˜åS‘£‡á:åEá.‘ ,·If˜there˜is˜only“a˜single˜matc•²!h,‘qëthis˜prin“tsŽ¡‘Kâ:a–ßßsingle›ßÞline“con²!taining“it.‘ŠGIf˜there“is˜more“than“one˜matc•²!h,‘.=this˜prin“ts‘ßßtheŽ¡‘Kâ:common–°*pre x›°)of“the˜matc•²!hes,‘²šwhic“h›°*ma“y˜bMÞe‘°)empt“y‘ÿe,‘²šon˜the–°) rst˜line“after˜theŽ¡‘Kâ:åS‘£‡á:åEá,‘R3then‘=%the–=&matcš²!hes“on“subsequen˜t›=%lines.‘ºÈIn“this˜case,‘R3åN‘lÔáwill“include˜the“ rstŽ¡‘Kâ:line–¦fwith“the“common“pre x.ŽŸâ"‘Kâ:The–û/user“or›û.application“should“bMÞe“able˜to“accommošMÞdate“the“p˜ossibilit²!y‘û.of“aŽ¡‘Kâ:blank› line.‘ªThe‘ !in•²!ten“t˜is˜that˜the˜user– !or˜application˜reads˜åN‘:Îálines“after˜the˜lineŽ¡‘Kâ:conš²!taining–N”åS‘£‡á:åE‘òáto“obtain“the“matc˜h‘N“list.‘À—This“command“is“un˜bMÞound“b˜y“default.ŽŽŒ‹gŸŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®25ŽŽŽ ƒ33 ý ÌÍ‘Gâdelete-char-or-list‘¦f()ޤ 33‘Kâ:áDeletes–«éthe›«èc²!haracter“under“the“cursor˜if“not“at˜the“bMÞeginning“or“end˜of“theŽ¡‘Kâ:line‘Ë!(lik•²!e›Ë"âdelete-chará).‘ LA“t˜the–Ë!end“of˜the“line,‘TPit“bMÞeha•²!v“es˜iden“tically‘Ë!toŽ¡‘Kâ:âpossible-completionsá.‘ÝÝThis–¦fcommand“is“unš²!bMÞound“b˜y“default.ŽŸT‘Gëg1.4.7‘d(Keybioard‘íMMacrosŽŽŸÝB‘Gâstart-kbd-macro–¦f(C-x“()Ž¡‘Kâ:áBegin–¦fsaš²!ving“the“c˜haracters“t˜ypMÞed“in˜to“the“curren˜t“k˜eybMÞoard“macro.ŽŸ‡P‘Gâend-kbd-macro–¦f(C-x“))Ž¡‘Kâ:áStop–G!saš²!ving“the“c˜haracters‘G"t˜ypMÞed“in˜to“the“curren˜t“k˜eybMÞoard“macro‘G"and“sa˜v˜e“theŽ¡‘Kâ:de nition.Ž©‡Q‘Gâcall-last-kbd-macro–¦f(C-x“e)Ž¡‘Kâ:áRe-execute–9Bthe“last‘9Ckš²!eybMÞoard“macro“de ned,‘]ùb˜y“making“the‘9Cc˜haracters“in“theŽ¡‘Kâ:macro–¦fappšMÞear“as“if“t²!yp˜ed“at“the“k²!eyb˜oard.ަ‘Gâprint-last-kbd-macro‘¦f()Ž¡‘Kâ:áPrinš²!t–Ÿkthe“last“k˜eybMÞoard“macro“de ned“in‘Ÿja“format“suitable“for“the“åinputrc‘Ioá le.ŽŸT‘Gëg1.4.8‘d(Some–íMMiscellaneous“CommandsŽŽŸÝB‘Gâre-read-init-file–¦f(C-x“C-r)Ž¡‘Kâ:áRead– kin“the› jcon•²!ten“ts– kof“the“åinputrc‘Joá le,‘ÔÐand“incorpMÞorate“an²!y˜bindings“or“v‘ÿdDariableŽ¡‘Kâ:assignmen²!ts–¦ffound“there.ŽŸ‡P‘Gâabort‘¦f(C-g)Ž¡‘Kâ:áAbMÞort–/the›/curren²!t“editing˜command“and˜ring“the˜terminal's“bMÞell˜(sub‘›»ject“to˜theŽ¡‘Kâ:setting–¦fof“âbell-styleá).ަ‘Gâdo-lowercase-version–¦f(M-A,“M-B,“M-èxâ,“...Ž‘åe)Ž¡‘Kâ:áIf–4©the“meta ed›4ªc²!haracter“åx‘öáis“uppMÞer“case,‘X:run“the“command“that˜is“bMÞound“toŽ¡‘Kâ:the–öUcorrespMÞonding›öTmeta ed“lo•²!w“er˜case‘öUc“haracter.‘Í©The˜bMÞeha“vior–öUis˜unde ned“ifŽ¡‘Kâ:åx‘gÅáis–¦falready“lo•²!w“er‘¦fcase.ަ‘Gâprefix-meta‘¦f(ESC)Ž¡‘Kâ:áMetafy–¦fthe“next“cš²!haracter“t˜ypMÞed.‘ÝÝT˜yping“`âESC“fá'“is“equiv‘ÿdDalen˜t“to“t˜yping“èM-fá.ަ‘Gâundo–¦f(C-_“or“C-x“C-u)Ž¡‘Kâ:áIncremenš²!tal–¦fundo,“separately“remem˜bMÞered“for“eac˜h“line.ަ‘Gârevert-line‘¦f(M-r)Ž¡‘Kâ:áUndo–úall“cš²!hanges“made“to“this“line.‘ØåThis“is“lik˜e“executing“the“âundo“ácommandŽ¡‘Kâ:enough–¦ftimes“to“get“bac²!k“to“the“initial“state.ŽŸ‡P‘Gâtilde-expand‘¦f(M-~)Ž¡‘Kâ:áPš²!erform–¦ftilde“expansion“on“the“curren˜t“w˜ord.ަ‘Gâset-mark‘¦f(C-@)Ž¡‘Kâ:áSet–ÌÙthe›ÌÚmark“to˜the“pMÞoin²!t.‘Q7If˜a“n•²!umeric˜argumen“t–ÌÙis˜supplied,‘Övset“the˜mark“toŽ¡‘Kâ:that‘¦fpMÞosition.ަ‘Gâexchange-point-and-mark–¦f(C-x“C-x)Ž¡‘Kâ:áSwš²!ap–œthe“pMÞoin˜t‘œŽwith“the“mark.‘ÀSSet“the“curren˜t“cursor“pMÞosition‘œŽto“the“sa˜v˜edŽ¡‘Kâ:pšMÞosition,–¦fthen“set“the“mark“to“the“old“cursor“p˜osition.ŽŽŒ‹uÓŸò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®26ŽŽŽ ƒ33 ý ÌÍ‘Gâcharacter-search‘¦f(C-])ޤ 33‘Kâ:áRead–öpa‘öocš²!haracter“and“mo˜v˜e“pMÞoin˜t›öoto“the“next“oMÞccurrence˜of“that“c²!haracter.‘ÍúAŽ¡‘Kâ:negativ•²!e›¦fargumen“t˜searc“hes˜for˜previous˜oMÞccurrences.Ž©Kù‘Gâcharacter-search-backward‘¦f(M-C-])Ž¡‘Kâ:áRead–6a‘5cš²!haracter“and“mo˜v˜e“pMÞoin˜t›5to“the“previous“oMÞccurrence“of˜that“c²!haracter.Ž¡‘Kâ:A–¦fnegativš²!e“argumen˜t“searc˜hes“for“subsequen˜t“oMÞccurrences.ަ‘Gâskip-csi-sequence‘¦f()Ž¡‘Kâ:áRead–G¬enough“cš²!haracters‘G­to“consume“a“m˜ulti-k˜ey“sequence“suc˜h‘G­as“those“de nedŽ¡‘Kâ:for›”×k•²!eys‘”Ölik“e˜Home˜and–”ÖEnd.‘ØCSI‘”Òsequences˜bMÞegin“with˜a˜Con²!trol“Sequence˜In-Ž¡‘Kâ:dicator–¨(CSI),“usually“èESC‘¦f[á.‘¯HIf“this“sequence“is“bšMÞound“to‘§â"\áe[â"á,‘6›k²!eys“pro˜ducingŽ¡‘Kâ:CSI‘sequences›"ha•²!v“e–#no˜e ect˜unless“explicitly˜bMÞound“to˜a“Readline˜command,Ž¡‘Kâ:instead–)zof›){inserting“stra•²!y˜c“haracters‘)zin“to˜the–)zediting“bu er.‘´:This“is˜unš²!bMÞound“b˜yŽ¡‘Kâ:default,–¦fbut“usually“bMÞound“to“èESC“[á.ަ‘Gâinsert-comment‘¦f(M-#)Ž¡‘Kâ:áWithout– Öa‘ Õnš²!umeric“argumen˜t,‘#ñinsert“the› Õv‘ÿdDalue“of“the˜âcomment-begin“áv‘ÿdDariableŽ¡‘Kâ:at–„šthe›„›bMÞeginning“of˜the“curren²!t˜line.‘xzIf“a˜nš²!umeric“argumen˜t“is‘„›supplied,‘¼'thisŽ¡‘Kâ:command–ÌÔacts›ÌÕas“a“toggle:‘*ºif“the“c²!haracters“at˜the“bMÞeginning“of“the˜line“doŽ¡‘Kâ:not–%Æmatc²!h›%Çthe“v‘ÿdDalue“of˜âcomment-beginá,‘Ežinsert“the˜v‘ÿdDalue;‘evotherwise˜delete“theŽ¡‘Kâ:c²!haracters–6¤in›6¥âcomment-begin“áfrom“the˜bMÞeginning“of“the˜line.‘¸œIn“either˜case,‘LþtheŽ¡‘Kâ:line–¦fis“accepted“as“if“a“newline“had“bšMÞeen“t²!yp˜ed.ަ‘Gâdump-functions‘¦f()Ž¡‘Kâ:áPrin²!t–,Qall›,Pof“the˜functions“and“their˜k²!ey“bindings“to˜the“Readline˜output“stream.Ž¡‘Kâ:If–Îïa“nš²!umeric“argumen˜t›Îðis“supplied,‘Ùthe“output“is“formatted“in˜sucš²!h“a“w˜a˜y“thatŽ¡‘Kâ:it–¦fcan“bšMÞe“made“part“of“an“åinputrc‘Pjá le.‘ÝÝThis“command“is“un²!b˜ound“b²!y“default.ŽŸKú‘Gâdump-variables‘¦f()Ž¡‘Kâ:áPrin²!t–ŽÉall“of“the‘ŽÈsettable“v›ÿdDariables“and“their“v˜alues“to‘ŽÈthe“Readline“output“stream.Ž¡‘Kâ:If–Îïa“nš²!umeric“argumen˜t›Îðis“supplied,‘Ùthe“output“is“formatted“in˜sucš²!h“a“w˜a˜y“thatŽ¡‘Kâ:it–¦fcan“bšMÞe“made“part“of“an“åinputrc‘Pjá le.‘ÝÝThis“command“is“un²!b˜ound“b²!y“default.ަ‘Gâdump-macros‘¦f()Ž¡‘Kâ:áPrinš²!t– ˆall“of“the‘ ‡Readline“k˜ey“sequences“bMÞound“to“macros‘ ‡and“the“strings“theyŽ¡‘Kâ:output–ݰto“the›ݯReadline“output“stream.‘ƒ»If˜a“nš²!umeric“argumen˜t“is“supplied,‘ë‚theŽ¡‘Kâ:output–ÕJis›ÕIformatted“in˜suc²!h“a˜w•²!a“y–ÕJthat“it˜can“bMÞe˜made“part˜of“an˜åinputrc‘Ná le.Ž¡‘Kâ:This–¦fcommand“is“unš²!bMÞound“b˜y“default.ަ‘Gâexecute-named-command‘¦f(M-x)Ž¡‘Kâ:áRead–ãa›äbindable“Readline˜command“name“from˜the“input˜and“execute˜the“func-Ž¡‘Kâ:tion–™to“whicš²!h“it's“bMÞound,‘7[as“if“the“k˜ey“sequence“to‘˜whic˜h“it“w˜as“bšMÞound“app˜earedŽ¡‘Kâ:in›‚the–‚input.‘rYIf“this˜function“is˜supplied“with˜a“n•²!umeric˜argumen“t,‘¹šit˜passesŽ¡‘Kâ:that–¦fargumen²!t“to“the“function“it“executes.ަ‘Gâemacs-editing-mode‘¦f(C-e)Ž¡‘Kâ:áWhen–¦fin“âvi“ácommand“mošMÞde,“this“causes“a“switc²!h“to“âemacs“áediting“mo˜de.ަ‘Gâvi-editing-mode‘¦f(M-C-j)Ž¡‘Kâ:áWhen–¦fin“âemacs“áediting“mošMÞde,“this“causes“a“switc²!h“to“âvi“áediting“mo˜de.ŽŽŒ‹€“Ÿò‘GáChapter–¦f1:‘ÝÝCommand“Line“Editing’ýÓ®27ŽŽŽ ƒ33 ý ÌÍ‘Gë]1.5‘™Readline–f@vi“Mos3deŽŽŸ33‘GáWhile–É`the“Readline›É_library“doMÞes“not“ha•²!v“e–É`a˜full“set“of“âvi˜áediting“functions,‘Òit“doMÞes“con²!tainޤ 33‘Genough–to›žallo²!w“simple˜editing“of“the˜line.‘.ƒThe˜Readline“âvi“ámo•MÞde˜b“eha•²!v“es–as˜spMÞeci ed“inŽ¡‘Gthe–¦fâsh“ádescription“in“the“çposix“ástandard.Ž©33‘!GIn–|Uorder›|Vto“switc•²!h˜in“teractiv“ely‘|UbMÞet“w“een˜âemacs–|Uáand˜âvi“áediting˜moMÞdes,‘„¿use˜the“commandŽ¡‘GèM-C-j–iá(bšMÞound‘jto“emacs-editing-mo˜de“when“in‘jâvi“ámo˜de“and“to‘jvi-editing-mo˜de“in“âemacsŽ¡‘GámošMÞde).‘ÝÝThe–¦fReadline“default“is“âemacs“ámo˜de.ަ‘!GWhen–›‰yš²!ou“en˜ter“a“line“in“âvi“ámoMÞde,‘µy˜ou‘›Šare“already“placed“in“`insertion'“moMÞde,‘µas“if“y˜ouŽ¡‘Ghad–ˆtš²!ypMÞed“an‘ˆ`âiá'.‘ÓÃPressing“âESC“áswitc˜hes‘ˆy˜ou“in˜to“`command'“moMÞde,‘Ž(where“y˜ou‘ˆcan“edit“theŽ¡‘Gtext–of“the“line“with“the“standard“âvi“ámo•²!v“emen“t›k“eys,‘);mo“v“e˜to˜previous˜history˜lines˜withŽ¡‘G`âká'–¦fand“subsequen²!t“lines“with“`âjá',“and“so“forth.ŽŽŒ‹Ž<Ÿò’¸¼Ëá28ŽŽŽ ƒ33 ý ÌÍ‘GëT2‘ ¸QProgramming–z³with“GNU“ReadlineŽŽŸ]‘GáThis–ü cš²!hapter‘üdescribMÞes“the“in˜terface‘übMÞet˜w˜een“the“çgnu›üáReadline“Library“and˜other“programs.ޤ 33‘GIf–}Éyš²!ou“are“a“programmer,‘…èand“y˜ou“wish“to“include“the“features“found“in“çgnu“áReadline“suc˜hŽ¡‘Gas–ý­completion,›lline“editing,˜and“in•²!teractiv“e–ý­history“manipulation“in“yš²!our“o˜wn“programs,‘lthisŽ¡‘Gsection–¦fis“for“y²!ou.ŽŸ”ó‘Gë]2.1‘™Basic‘f@BehaŒÌviorŽŽŸ33‘GáMan•²!y›’programs‘’pro“vide˜a˜command‘’line˜in“terface,‘Ísuc“h˜as˜âmailá,‘Íâftpá,‘Íand‘’âshá.‘ ôF‘ÿeor˜suc“hŽ¡‘Gprograms,‘í–MËáin›MÊan²!y“ le˜that“uses˜Readline's“features.‘ÀTSince˜some“of˜the“de ni-Ž¡‘Gtions–ÃÎin“âreadline.h›ÃÏáuse“the“âstdio“álibrary‘ÿe,‘Ë)the“program“should“include˜the“ le“⎡‘GábMÞefore‘¦fâreadline.há.ŽŽŒ‹ ÙŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—30ŽŽŽ ƒ33 ý ÌÍ‘!Gâreadline.h–¬2áde nes›¬3a“C‘¬1preproMÞcessor“v‘ÿdDariable˜that“should“bMÞe˜treated“as“an˜in²!teger,‘­¥âRL_ޤ 33‘GREADLINE_VERSIONá,‘Ûwhic•²!h›¨(ma“y˜b•MÞe˜used˜to˜conditionally˜compile˜application˜co“de˜dep“endingŽ¡‘Gon–4üthe“installed›4ýReadline“v²!ersion.‘‰ŸThe˜v‘ÿdDalue“is“a“hexadecimal“encoMÞding“of˜the“ma‘›»jor“andŽ¡‘Gminor–Pvš²!ersion“n˜um˜bMÞers›Oof“the“library‘ÿe,‘8Šof“the“form˜0xåMMmmá.‘<›åMM‘Jþáis˜the“t•²!w“o-digit‘Pma‘›»jorŽ¡‘Gv•²!ersion›z.n“um“bMÞer;‘ˆëåmm‘z-áis˜the˜t“w“o-digit‘z-minor˜v“ersion˜n“um“bMÞer.‘ÏF‘ÿeor˜Readline˜4.2,‘ƒfor˜example,Ž¡‘Gthe–¦fv‘ÿdDalue“of“âRL_READLINE_VERSION“áw²!ould“bMÞe“â0x0402á.ŽŸÕµ‘Gëg2.2.1‘d(Readline‘íMT–áypiedefsŽŽŸ³3‘GáF–ÿeor›¦freadabilit²!y“,˜w•²!e˜declare˜a˜n“um“bMÞer˜of˜new˜ob‘›»ject˜t“yp•MÞes,˜all˜p“oin²!ters˜to˜functions.Ž©è‘!GThe–IÖreason›IÕfor“declaring˜these“new˜t²!ypMÞes“is˜to“mak²!e˜it“easier˜to“write˜coMÞde“describingŽ¡‘GpMÞoinš²!ters–¦fto“C“functions“with“appropriately“protot˜ypMÞed“argumen˜ts“and“return“v‘ÿdDalues.ަ‘!GF‘ÿeor›m½instance,‘Ÿ“sa•²!y‘m¾w“e˜w“an“t–m¾to˜declare˜a“v‘ÿdDariable˜åfunc‘Âáas˜a˜pMÞoin²!ter“to˜a“function˜whic²!hŽ¡‘Gtak•²!es›©t“w“o‘¨âint˜áargumen“ts–¨and˜returns“an˜âint“á(this˜is“the˜t²!ypMÞe“of˜all“of˜the“Readline˜bindableŽ¡‘Gfunctions).‘ÝÝInstead–¦fof“the“classic“C“declarationަ‘!Gâint‘¦f(*func)();ަ‘Gáor–¦fthe“ANSI-C“st²!yle“declarationަ‘!Gâint–¦f(*func)(int,“int);ަ‘Gáw•²!e›¦fma“y˜writeަ‘!Gârl_command_func_t‘¦f*func;ަ‘!GáThe–¦ffull“list“of“function“pMÞoinš²!ter“t˜ypMÞes“a˜v‘ÿdDailable“isŽŸó‘Gâtypedef–¦fint“rl_command_func_t“(int,“int);Ž¡‘Gtypedef–¦fchar“*rl_compentry_func_t“(const“char“*,“int);Ž¡‘Gtypedef–¦fchar“**rl_completion_func_t“(const“char“*,“int,“int);Ž¡‘Gtypedef–¦fchar“*rl_quote_func_t“(char“*,“int,“char“*);Ž¡‘Gtypedef–¦fchar“*rl_dequote_func_t“(char“*,“int);Ž¡‘Gtypedef–¦fint“rl_compignore_func_t“(char“**);Ž¡‘Gtypedef–¦fvoid“rl_compdisp_func_t“(char“**,“int,“int);Ž¡‘Gtypedef–¦fvoid“rl_macro_print_func_t“(const“char“*,“const“char“*,“int,“const“charŽ¡‘G*);Ž¡‘Gtypedef–¦fint“rl_hook_func_t“(void);Ž¡‘Gtypedef–¦fint“rl_getc_func_t“(FILE“*);Ž¡‘Gtypedef–¦fint“rl_linebuf_func_t“(char“*,“int);Ž¡‘Gtypedef–¦fint“rl_intfunc_t“(int);Ž¡‘G#define–¦frl_ivoidfunc_t“rl_hook_func_tŽ¡‘Gtypedef–¦fint“rl_icpfunc_t“(char“*);Ž¡‘Gtypedef–¦fint“rl_icppfunc_t“(char“**);Ž¡‘Gtypedef–¦fvoid“rl_voidfunc_t“(void);Ž¡‘Gtypedef–¦fvoid“rl_vintfunc_t“(int);Ž¡‘Gtypedef–¦fvoid“rl_vcpfunc_t“(char“*);Ž¡‘Gtypedef–¦fvoid“rl_vcppfunc_t“(char“**);ަ‘GáThe–¦fârltypedefs.h“á le“has“more“doMÞcumenš²!tation“for“these“t˜ypMÞes.ŽŽŒ‹«·Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—31ŽŽŽ ƒ33 ý ÌÍ‘Gëg2.2.2‘d(W›þÄ£riting–íMa“New“F˜unctionŽŽŸ³3‘GáIn–»Öorder›»×to“write“new˜functions“for“Readline,‘Á3y²!ou“need“to˜kno²!w“the“calling˜con•²!v“en“tions‘»Öforޤ 33‘Gk•²!eybMÞoard-in“v“ok“ed–™Úfunctions,‘œ\and“the›™Ùnames“of“the˜v‘ÿdDariables“that“describMÞe“the˜curren²!t“stateŽ¡‘Gof–¦fthe“line“read“so“far.ޤ‘!GThe–¦fcalling“sequence“for“a“command“âfoo“áloMÞoks“lik²!eŽ¡‘.ùœâint–¿ªfoo“(int“count,“int“key)Ž¡‘Gáwhere–Pgåcounš²!t‘fáis“the‘Pfn˜umeric“argumen˜t›Pf(or“1˜if“defaulted)˜and“åk²!ey‘@~áis“the˜k²!ey“that˜in•²!v“ok“edŽ© 33‘Gthis‘¦ffunction.Ž¡‘!GIt–Äis›Äcompletely“up˜to“the“function˜as“to“what˜should“bMÞe˜done“with“the˜nš²!umeric“argumen˜t.ަ‘GSome–Ï;functions“use“it“as“a“repMÞeat“coun²!t,›psome‘Ï:as“a“ ag,˜and“others“to“c²!hoMÞose“alternateަ‘GbMÞehaš²!vior–4ñ(refreshing‘4ðthe“curren˜t›4ðline“as˜oppMÞosed“to“refreshing˜the“screen,‘˜’for“example).ަ‘GSome–ýc²!hoMÞose“to›ýignore“it.‘á±In˜general,‘©if“a˜function“uses“the“nš²!umeric“argumen˜t‘ýas“a“repMÞeatަ‘Gcoun²!t,‘itit–Z7should“bMÞe›Z8able“to“do˜something“useful“with˜bMÞoth“negativ²!e“and˜pMÞositivš²!e“argumen˜ts.ަ‘GAš²!t–¦fthe“v˜ery“least,“it“should“bMÞe“a˜w˜are“that“it“can“bMÞe“passed“a“negativ˜e“argumen˜t.ŽŸ‚‘!GA‘‘command–Ífunction“should“return“0“if“its“action“completes“successfully‘ÿe,‘Ëgand“a“v‘ÿdDalueަ‘Ggreater–Pthan“zero“if“some“error“oMÞccurs.‘ ÚÛAll“of“the“builtin“Readline“bindable“commandަ‘Gfunctions–¦fobMÞey“this“con•²!v“en“tion.ŽŸÄœ‘Gë]2.3‘™Readline‘f@V‘þ¦fariablesŽŽŸ33‘GáThese–¦fv›ÿdDariables“are“a²!v˜ailable“to“function“writers.ޤÚ’–3[V‘ÿeariable]ŽŽ‘Gó@ßêset“from“the“argumen²!t“to“âreadline()á,‘=yand“shouldŽ¡‘.ùœnot–:^bMÞe“assigned“to›:]directly‘ÿe.‘¹ÛThe“ârl_set_prompt()“áfunction˜(see“Section“2.4.6“[Redis-Ž¡‘.ùœpla•²!y],‘Fÿpage›&á42)‘&àma“y˜b•MÞe‘&àused˜to˜mo“dify–&àthe˜prompt“string˜after“calling˜âreadline()á.Ž¡‘.ùœReadline–}ÄpMÞerforms“some“prompt“expansions“and“analyzes“the“prompt“for“line“breaks,Ž¡‘.ùœso–¦fârl_set_prompt()“áis“preferred.ŽŸ’–3[V‘ÿeariable]ŽŽ‘Gë@char–LÉ*“rl_display_promptŽ¡‘.ùœáThe›ÏÛstring‘ÏÜdispla•²!y“ed˜as–ÏÜthe˜prompt.‘Z=This˜is“usually˜iden²!tical“to˜årl‘Ä>‰x³HøŽ‘Ñtpromptá,‘Ú9but˜ma²!yŽ¡‘.ùœbšMÞe–[c²!hanged“temp˜orarily“b²!y“functions“that“use“the“prompt“string“as“a“message“area,Ž¡‘.ùœsucš²!h–¦fas“incremen˜tal“searc˜h.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_already_promptedŽ¡‘.ùœáIf–\Xan“application“wishes›\Wto“displa²!y“the“prompt“itself,‘‰Ôrather˜than“ha•²!v“e–\XReadline“doŽ¡‘.ùœit–ï9the“ rst“time“âreadline()“áis“called,‘mit“should“set“this“v›ÿdDariable“to“a“non-zero“v˜alueŽ¡‘.ùœafter–Ëdisplaš²!ying‘Êthe“prompt.‘š The“prompt“m˜ust“also›ÊbMÞe“passed“as“the˜argumen²!t“toŽ¡‘.ùœâreadline()–÷ áso“the“redisplaš²!y“functions“can“upMÞdate‘÷the“displa˜y“propMÞerly‘ÿe.‘ÏÆThe“callingŽ¡‘.ùœapplication–¦fis“respMÞonsible“for“managing“the“v‘ÿdDalue;“Readline“nev²!er“sets“it.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_library_versionŽ¡‘.ùœáThe–¦fvš²!ersion“n˜um˜bMÞer“of“this“revision“of“the“Readline“library‘ÿe,“as“a“string“(e.g.,“â"á4.2â"á).ŽŸ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_readline_versionŽ¡‘.ùœáAn–’in²!teger›“encoMÞding“the˜currenš²!t“v˜ersion›“of“the˜library‘ÿe.‘4bThe“encoMÞding˜is“of˜the“formŽ¡‘.ùœ0xåMMmmá,‘‘àwhere–bÈåMM‘’váis‘bÇthe“t•²!w“o-digit–bÈma‘›»jor“vš²!ersion“n˜um˜bMÞer,‘‘àand“åmm‘bÇáis“the“t˜w˜o-Ž¡‘.ùœdigit–{¶minor‘{·vš²!ersion“n˜um˜bMÞer.‘]ÏF‘ÿeor“example,–± for‘{·Readline-4.2,“ârl_readline_versionŽ¡‘.ùœáw•²!ould›¦fha“v“e˜the˜v‘ÿdDalue˜0x0402.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_gnu_readline_pŽ¡‘.ùœáAlw•²!a“ys–¦fset“to“1,“denoting“that“this“is“çgnu“áReadline“rather“than“some“em²!ulation.ŽŽŒ‹!Ä¥Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—33ŽŽŽ ƒ33 ý ÌÍ’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_terminal_nameޤ 33‘.ùœáThe›_terminal–_t²!ypMÞe,‘mKused“for˜initialization.‘ÆIf˜not“set˜b²!y“the˜application,‘mJReadline˜setsŽ¡‘.ùœthis–Wõto“the‘Wöv›ÿdDalue“of“the“âTERM“áen•²!vironmen“t–Wõv˜ariable›Wöthe“ rst“time“it“is˜called.‘÷ReadlineŽ¡‘.ùœuses–¦fthis“to“loMÞok“up“the“terminal“capabilities“it“needs“in“the“terminfo“database.Ž©Â’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_readline_nameŽ¡‘.ùœáThis–¿ƒv‘ÿdDariable“is“set“to“a“unique“name‘¿„bš²!y“eac˜h“application“using“Readline.‘)4The“v‘ÿdDalueŽ¡‘.ùœallo²!ws–]wconditional“parsing›]vof“the“inputrc“ le“(see“Section˜1.3.2“[Conditional“Init“Con-Ž¡‘.ùœstructs],–¦fpage“14).ަ’–3[V‘ÿeariable]ŽŽ‘Gë@FILE–LÉ*“rl_instreamŽ¡‘.ùœáThe–í€stdio“stream“from“whic²!h“Readline“reads“input.‘³*If“âNULLá,‘?FReadline“defaults“toŽ¡‘.ùœåstdiná.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@FILE–LÉ*“rl_outstreamŽ¡‘.ùœáThe–#Rstdio›#Qstream“to“whic²!h˜Readline“pMÞerforms“output.‘T If˜âNULLá,‘BReadline˜defaults“toŽ¡‘.ùœåstdoutá.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_prefer_env_winsizeŽ¡‘.ùœáIf–h non-zero,‘t”Readline“givš²!es“v‘ÿdDalues“found“in“the‘hâLINES“áand“âCOLUMNS“áen˜vironmen˜t“v‘ÿdDari-Ž¡‘.ùœables–éžgreater“precedence“than“v‘ÿdDalues“fetcš²!hed“from“the“k˜ernel“when“computing“theŽ¡‘.ùœscreen‘¦fdimensions.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_command_func_t–LÉ*“rl_last_funcŽ¡‘.ùœáThe–þqaddress“of›þpthe“last“command“function“Readline˜executed.‘åþThis“ma²!y˜bMÞe“used“toŽ¡‘.ùœtest–¦fwhether“or“not“a“function“is“bMÞeing“executed“t²!wice“in“succession,“for“example.ŽŸÂ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_hook_func_t–LÉ*“rl_startup_hookŽ¡‘.ùœáIf–jÇnon-zero,‘›ßthis“is“the“address“of“a“function“to“call“just“bMÞefore“Readline“prin²!ts“theŽ¡‘.ùœ rst‘¦fprompt.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_hook_func_t–LÉ*“rl_pre_input_hookŽ¡‘.ùœáIf–CÜnon-zero,‘k9this›CÛis“the“address˜of“a“function˜to“call“after˜the“ rst“prompt˜has“bMÞeenŽ¡‘.ùœprinš²!ted–¦fand“just“bMÞefore“Readline“starts“reading“input“c˜haracters.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_hook_func_t–LÉ*“rl_event_hookŽ¡‘.ùœáIf–ânon-zero,‘0ìthis“is“the‘âaddress“of“a“function“to“call“p•MÞerio“dically–âwhen“Readline“isŽ¡‘.ùœw²!aiting–€*for“terminal–€)input.‘ÑBy“default,‘‡Ðthis›€*will“bMÞe˜called˜at˜most˜ten“times˜a˜secondŽ¡‘.ùœif–¦fthere“is“no“k²!eybMÞoard“input.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_getc_func_t–LÉ*“rl_getc_functionŽ¡‘.ùœáIf–§Wnon-zero,‘§“Readline“will“call“indirectly“through“this“pMÞoinš²!ter“to“get“a“c˜haracter“fromŽ¡‘.ùœthe–÷input›østream.‘ >‘By“default,‘y[it˜is“set“to˜ârl_getcá,‘y[the“Readline˜c²!haracter“inputŽ¡‘.ùœfunction–ªM(see“Section“2.4.8“[Character“Input],›ëGpage“44).‘é’In“general,˜an“applicationŽ¡‘.ùœthat–¦fsets“årl‘Ä>‰x³HøŽ–Ñtgetc‘Ä>‰x³HøŽ“function–¦fáshould“consider“setting“årl‘Ä>‰x³HøŽ–Ñtinput‘Ä>‰x³HøŽ“aš²!v‘ÿdDailable‘Ä>‰x³HøŽ“hoMÞok‘Pjáas‘¦fw˜ell.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_hook_func_t–LÉ*“rl_signal_event_hookŽ¡‘.ùœáIf–>Ûnon-zero,‘Sthis“is‘>Üthe“address“of“a“function“to“call“if“a“read“system“call“is“in²!terruptedŽ¡‘.ùœb²!y–¦fa“signal“when“Readline“is“reading“terminal“input.ŽŽŒ‹"ÒПò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—34ŽŽŽ ƒ33 ý ÌÍ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_hook_func_t–LÉ*“rl_timeout_event_hookޤ 33‘.ùœáIf–ƒnon-zero,‘'Jthis“is“the›„address“of“a“function“to“call“if“Readline˜times“out“while“readingŽ¡‘.ùœinput.Ž©34’–3[V‘ÿeariable]ŽŽ‘Gë@rl_hook_func_t–LÉ*“rl_input_available_hookŽ¡‘.ùœáIf–z÷non-zero,‘ƒ§Readline›zöwill“use“this“function's“return“v‘ÿdDalue“when˜it“needs“to“determineŽ¡‘.ùœwhether–àor“not“there‘áis“aš²!v‘ÿdDailable“input“on“the“curren˜t“input“source.‘ 8LThe“defaultŽ¡‘.ùœhoMÞok› #c•²!hec“ks– $ârl_instreamá;‘@:if˜an“application˜is“using˜a˜di eren²!t“input˜source,‘+Ëit˜shouldŽ¡‘.ùœset–îthe›ïhoMÞok“appropriately‘ÿe.‘óvReadline“queries“for“a²!v‘ÿdDailable˜input“when“implemen²!tingŽ¡‘.ùœin•²!tra-k“ey-sequence–æætimeouts›æçduring“input“and˜incremenš²!tal“searc˜hes.‘Ÿ^This“functionŽ¡‘.ùœmš²!ust–#›return“zero“if“there“is‘#œno“input“a˜v‘ÿdDailable,‘=Ãand“non-zero‘#œif“input“is“a˜v‘ÿdDailable.‘²DThisŽ¡‘.ùœma²!y–4Ruse“an“application-spšMÞeci c‘4Qtimeout“b˜efore“returning“a“v‘ÿdDalue;‘{GReadline“uses“theŽ¡‘.ùœv›ÿdDalue–ÿ"passed“to“ârl_set_keyboard_input_timeout()“áor“the“v˜alue“of“the“user-settableŽ¡‘.ùœåkš²!eyseq-timeout‘ ~áv‘ÿdDariable.‘S%This–Í~is‘Ídesigned“for“use“b˜y“applications“using“Readline'sŽ¡‘.ùœcallbac•²!k› _in“terface˜(see‘ `Section˜2.4.12˜[Alternate˜In“terface],–%Þpage˜48),“whic•²!h˜ma“y˜notŽ¡‘.ùœuse–ñ”the“traditional›ñ“âread(2)“áand“ le“descriptor“in²!terface,‘_or˜other“applications“usingŽ¡‘.ùœa–K;di erenš²!t‘K‰x³HøŽ–Ñtgetc‘Ä>‰x³HøŽ“function–W áshould“consider“setting“årl‘Ä>‰x³HøŽ–Ñtinput‘Ä>‰x³HøŽ“a²!v‘ÿdDailable‘Ä>‰x³HøŽ“hoMÞokŽ¡‘.ùœáas‘¦fw²!ell.ŽŸ35’–3[V‘ÿeariable]ŽŽ‘Gë@rl_voidfunc_t–LÉ*“rl_redisplay_functionŽ¡‘.ùœáReadline–{ßwill›{Þcall“indirectly˜through“this˜pMÞoin²!ter“to˜upMÞdate“the˜displa²!y“with˜the“curren²!tŽ¡‘.ùœcon•²!ten“ts–þÖof›þÕthe“editing“bu er.‘ç,By“default,‘Tñit“is“set˜to“ârl_redisplayá,‘Tñthe“defaultŽ¡‘.ùœReadline–¦fredisplaš²!y“function“(see“Section“2.4.6“[Redispla˜y],“page“42).ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_vintfunc_t–LÉ*“rl_prep_term_functionŽ¡‘.ùœáIf–âÏnon-zero,‘ íReadline“will›âÎcall“indirectly“through“this“pMÞoin²!ter“to˜initialize“the“terminal.Ž¡‘.ùœThe–ufunction“takš²!es“a‘u€single“argumen˜t,‘©Gan“âint“á ag“that“sa˜ys“whether‘u€or“not“to“useŽ¡‘.ùœeigh•²!t-bit›Èc“haracters.‘5By˜default,‘5athis˜is˜set˜to˜ârl_prep_terminal‘Éá(see˜Section˜2.4.9Ž¡‘.ùœ[T‘ÿeerminal–¦fManagemen²!t],“page“45).ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_voidfunc_t–LÉ*“rl_deprep_term_functionŽ¡‘.ùœáIf–eynon-zero,‘•>Readline›ezwill“call˜indirectly“through˜this“pMÞoin²!ter˜to“reset˜the“terminal.Ž¡‘.ùœThis–4function“should“undo‘4the“e ects“of“ârl_prep_term_functioná.‘ˆYBy“default,‘XthisŽ¡‘.ùœis–¦fset“to“ârl_deprep_terminal“á(see“Section“2.4.9“[T‘ÿeerminal“Managemen²!t],“page“45).ŽŸ35’–3[V‘ÿeariable]ŽŽ‘Gë@void‘LÉrl_macro_display_hookŽ¡‘.ùœáIf–Rset,‘¼øthis›RpMÞoin²!ts“to˜a“function˜that“ârl_macro_dumper˜áwill“call˜to“displa²!y˜a“k²!eyŽ¡‘.ùœsequence–H’bMÞound“to›H‘a“macro.‘ÄaIt“is˜called“with“the“kš²!ey“sequence,‘qthe“â"áun˜translatedâ"Ž¡‘.ùœámacro–(v‘ÿdDalue›((i.e.,‘ˆƒwith“bac²!kslash˜escapMÞes“included,‘ˆƒas˜when“passed˜to“ârl_macro_Ž¡‘.ùœbindá),‘8the–ò-âreadable“áargumenš²!t“passed“to‘ò,ârl_macro_dumperá,‘9and“an˜y‘ò,pre x“to“displa˜yŽ¡‘.ùœbMÞefore–¦fthe“k²!ey“sequence.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@Keymap‘LÉrl_executing_keymapŽ¡‘.ùœáThis–ROv‘ÿdDariable›RNis“set˜to“the˜k²!eymap“(see“Section˜2.4.2“[Keymaps],‘}Hpage“37)˜in“whic²!hŽ¡‘.ùœthe–¦fcurrenš²!tly“executing“Readline“function“w˜as“found.ŽŽŒ‹#ßùŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—35ŽŽŽ ƒ33 ý ÌÍ’–3[V‘ÿeariable]ŽŽ‘Gë@Keymap‘LÉrl_binding_keymapޤ 33‘.ùœáThis–ROv‘ÿdDariable›RNis“set˜to“the˜k²!eymap“(see“Section˜2.4.2“[Keymaps],‘}Hpage“37)˜in“whic²!hŽ¡‘.ùœthe–¦flast“k²!ey“binding“oMÞccurred.Ž©‹Þ’–3[V‘ÿeariable]ŽŽ‘Gë@char–LÉ*“rl_executing_macroŽ¡‘.ùœáThis–¦fv‘ÿdDariable“is“set“to“the“text“of“anš²!y“curren˜tly-executing“macro.ŽŸ‹Ý’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_executing_keyŽ¡‘.ùœáThe–¦fkš²!ey“that“caused“the“dispatc˜h“to“the“curren˜tly-executing“Readline“function.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@char–LÉ*“rl_executing_keyseqŽ¡‘.ùœáThe–Cùfull“kš²!ey‘Cúsequence“that“caused“the“dispatc˜h“to‘Cúthe“curren˜tly-executing“ReadlineŽ¡‘.ùœfunction.ŽŸ‹Ý’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_key_sequence_lengthŽ¡‘.ùœáThe›¦fn•²!um“bMÞer˜of˜c“haracters˜in˜årl‘Ä>‰x³HøŽ–Ñtexecuting‘Ä>‰x³HøŽ“k²!eyseqá.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_readline_stateŽ¡‘.ùœáA‘#¨v›ÿdDariable‘#Çwith–#Èbit“v˜alues›#Çthat“encapsulate“the“curren²!t˜Readline“state.‘VA‘#¨bit˜is“setŽ¡‘.ùœwith–½the›¾âRL_SETSTATE“ámacro,‘Ç“and“unset˜with“the“âRL_UNSETSTATE˜ámacro.‘“ãUse“theŽ¡‘.ùœâRL_ISSTATE–zámacro“to›ztest“whether“a“particular“state˜bit“is“set.‘X¬Curren²!t“state“bitsŽ¡‘.ùœinclude:ŽŸ5³‘.ùœâRL_STATE_NONEŽ¡‘hÊáReadline–¦fhas“not“y²!et“bšMÞeen“called,“nor“has“it“b˜egun“to“initialize.Ž©߈‘.ùœâRL_STATE_INITIALIZINGŽ¡‘hÊáReadline–¦fis“initializing“its“in²!ternal“data“structures.ަ‘.ùœâRL_STATE_INITIALIZEDŽ¡‘hÊáReadline–¦fhas“completed“its“initialization.ަ‘.ùœâRL_STATE_TERMPREPPEDŽ¡‘hÊáReadline–r[has“mošMÞdi ed“the“terminal“mo˜des“to“do“its“o²!wn“input“and“redis-Ž¡‘hÊpla²!y‘ÿe.ŽŸ߉‘.ùœâRL_STATE_READCMDŽ¡‘hÊáReadline–¦fis“reading“a“command“from“the“k²!eybMÞoard.ަ‘.ùœâRL_STATE_METANEXTŽ¡‘hÊáReadline–¦fis“reading“more“input“after“reading“the“meta-pre x“c²!haracter.ަ‘.ùœâRL_STATE_DISPATCHINGŽ¡‘hÊáReadline–¦fis“dispatc²!hing“to“a“command.ަ‘.ùœâRL_STATE_MOREINPUTŽ¡‘hÊáReadline–¦fis“reading“more“input“while“executing“an“editing“command.ŽŸ߉‘.ùœâRL_STATE_ISEARCHŽ¡‘hÊáReadline–¦fis“pMÞerforming“an“incremenš²!tal“history“searc˜h.ަ‘.ùœâRL_STATE_NSEARCHŽ¡‘hÊáReadline–¦fis“pMÞerforming“a“non-incremenš²!tal“history“searc˜h.ŽŽŒ‹$ð9Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—36ŽŽŽ ƒ33 ý ÌÍ‘.ùœâRL_STATE_SEARCHޤ 33‘hÊáReadline–péis‘pêsearcš²!hing“bac˜kw˜ard“or‘pêforw˜ard“through›pêthe“history“for˜a“string.Ž©S3‘.ùœâRL_STATE_NUMERICARGŽ¡‘hÊáReadline–¦fis“reading“a“nš²!umeric“argumen˜t.ŽŸS4‘.ùœâRL_STATE_MACROINPUTŽ¡‘hÊáReadline–çis›çcurren²!tly“getting˜its“input˜from“a˜previously-de ned“k²!eybMÞoardŽ¡‘hÊmacro.ަ‘.ùœâRL_STATE_MACRODEFŽ¡‘hÊáReadline–¦fis“currenš²!tly“reading“c˜haracters“de ning“a“k˜eybMÞoard“macro.ŽŸS4‘.ùœâRL_STATE_OVERWRITEŽ¡‘hÊáReadline–¦fis“in“o•²!v“erwrite‘¦fmoMÞde.ަ‘.ùœâRL_STATE_COMPLETINGŽ¡‘hÊáReadline–¦fis“pMÞerforming“w²!ord“completion.ŽŸS4‘.ùœâRL_STATE_SIGHANDLERŽ¡‘hÊáReadline–¦fis“curren²!tly“executing“the“Readline“signal“handler.ަ‘.ùœâRL_STATE_UNDOINGŽ¡‘hÊáReadline–¦fis“pMÞerforming“an“undo.ŽŸS4‘.ùœâRL_STATE_INPUTPENDINGŽ¡‘hÊáReadline–¦fhas“input“pMÞending“due“to“a“call“to“ârl_execute_next()á.ަ‘.ùœâRL_STATE_TTYCSAVEDŽ¡‘hÊáReadline–¦fhas“sa•²!v“ed–¦fthe“v‘ÿdDalues“of“the“terminal's“spMÞecial“c²!haracters.ŽŸS4‘.ùœâRL_STATE_CALLBACKŽ¡‘hÊáReadline–+Žis›+curren²!tly“using˜the“alternate˜(callbacš²!k)“in˜terface‘+(see“Sec-Ž¡‘hÊtion–¦f2.4.12“[Alternate“In²!terface],“page“48).ަ‘.ùœâRL_STATE_VIMOTIONŽ¡‘hÊáReadline–¦fis“reading“the“argumen²!t“to“a“vi-moMÞde“â"ámotionâ"“ácommand.ŽŸS4‘.ùœâRL_STATE_MULTIKEYŽ¡‘hÊáReadline–¦fis“reading“a“m•²!ultiple-k“eystrok“e‘¦fcommand.ަ‘.ùœâRL_STATE_VICMDONCEŽ¡‘hÊáReadline–²áhas›²âen²!tered“vi˜command“(mo•²!v“emen“t)–²ámoMÞde˜at“least˜one“timeŽ¡‘hÊduring–¦fthe“curren²!t“call“to“âreadline()á.ŽŸS4‘.ùœâRL_STATE_DONEŽ¡‘hÊáReadline–T†has“read“a“k²!ey“sequence‘T…bšMÞound“to“âaccept-line“áand“is“ab˜out“toŽ¡‘hÊreturn–¦fthe“line“to“the“caller.ަ‘.ùœâRL_STATE_TIMEOUTŽ¡‘hÊáReadline–4 has›4 timed“out“(it˜did“not“receiv²!e˜a“line“or˜spšMÞeci ed“n•²!um“b˜erŽ¡‘hÊof–Vhc²!haracters›VgbMÞefore“the˜timeout“duration˜spMÞeci ed“b²!y˜ârl_set_timeoutŽ¡‘hÊáelapsed)–¦fand“is“returning“that“status“to“the“caller.ŽŸS4‘.ùœâRL_STATE_EOFŽ¡‘hÊáReadline–¡‰has“read“an“EOF‘¡Icš²!haracter“(e.g.,‘àQthe“stt˜y“`âEOFá'“c˜haracter)“orŽ¡‘hÊencoun²!tered–¿Qa›¿Rread“error“or“EOF‘¿Kand˜is“abMÞout“to“return˜a“NULL‘¿Kline“toŽ¡‘hÊthe‘¦fcaller.ŽŽŒ‹%ù‰Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—37ŽŽŽ ƒ33 ý ÌÍ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_explicit_argޤ 33‘.ùœáSet–¶µto“a›¶´non-zero“v‘ÿdDalue“if“an“explicit“n•²!umeric˜argumen“t›¶µw“as˜spMÞeci ed˜b“y˜the˜user.‘ÉItŽ¡‘.ùœis–¦fonly“v‘ÿdDalid“in“a“bindable“command“function.Ž©¾w’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_numeric_argŽ¡‘.ùœáSet–r,to“the“v‘ÿdDalue“of“anš²!y“n˜umeric‘r-argumen˜t“explicitly“spMÞeci ed“b˜y“the“user“bMÞeforeŽ¡‘.ùœexecuting–¸the›·curren²!t“Readline“function.‘ FÒIt˜is“only˜v‘ÿdDalid“in“a˜bindable“commandŽ¡‘.ùœfunction.ŽŸ¾x’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_editing_modeŽ¡‘.ùœáSet–pto›oa“v‘ÿdDalue“denoting˜Readline's“curren²!t˜editing“moMÞde.‘§‹A‘Fv‘ÿdDalue“of“å1‘â¨ámeans“ReadlineŽ¡‘.ùœis–´Ncurren²!tly›´Oin“emacs“moMÞde;‘;Bå0‘“‡ámeans˜that“vi“moMÞde“is˜activ²!e.‘•This˜determines“theŽ¡‘.ùœcurren•²!t›¦fk“eymap˜and˜k“ey˜bindings.ŽŸ²-‘Gë]2.4‘™Readline›f@Con•ŒÌv“enience˜F‘þ¦functionsŽŽŸÙ‘Gëg2.4.1‘d(Naming–íMa“F‘þÄ£unctionŽŽŸ³3‘GáReadline–! has›! a“descriptiv²!e˜string“name˜for“ev²!ery˜function“a“user˜can“bind˜to“a˜k²!ey“sequence,Ž¡‘Gso–¨users›§ÿcan“dynamically“c²!hange˜the“bindings“assoMÞciated˜with“k²!ey“sequences˜while“usingŽ¡‘GReadline,‘using›ˆthe–‡descriptiv²!e“name˜when“referring“to˜the“function.‘ìATh²!us,‘in“an˜init“ le,Ž¡‘Gone–¦fmigh²!t“ ndޤ J‘.ùœâMeta-Rubout:‘ Tbackward-kill-wordŽ¡‘!GáThis– Mtbinds“the“k•²!eystrok“e– MtâMeta-Rubout‘ Muáto“the“function“ädescriptively‘ Euánamedޤ 33‘Gâbackward-kill-wordá.‘ÀAAs›ñÜthe–ñÝprogrammer,‘D¹y²!ou“should˜bind“the˜functions“y²!ou˜write“toŽ¡‘Gdescriptivš²!e–¦fnames“as“w˜ell.‘ÝÝReadline“pro˜vides“a“function“for“doing“that:ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_add_defun‘yšó;m#½R ó3 cmss10æ(óAp®0J cmsl10ëAconst–ùocªªhar“*name,‘ú¿rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t‘ùo*function,Ž¡‘DGin•ªªt‘k“eyæ)Ž¡‘.ùœáAdd–<ýåname‘Úáto“the›<þlist“of“named˜functions.‘¡£Mak²!e“åfunction˜ábMÞe“the“function˜that“getsŽ¡‘.ùœcalled–Â7bš²!y“k˜ey“sequences›Â8that“bind“to“ånameá.‘1PIf˜åk²!ey‘²Oáis“not“-1,‘É+then˜bind“it“to“åfunctionŽ¡‘.ùœáusing‘¦fârl_bind_key()á.Ž©¾x‘!GUsing–žthis›žfunction“alone˜is“sucien²!t˜for“most“applications.‘ÛIt˜is“the˜recommended“w•²!a“yŽ¡‘Gto–<Óadd›<Òa“few˜functions“to“the˜default“functions˜that“Readline˜has“built“in.‘º¬If˜y²!ou“need˜to“doŽ¡‘Gsomething– {other“than“adding‘ za“function“to“Readline,‘$Àyš²!ou“ma˜y“need‘ zto“use“the“underlyingŽ¡‘Gfunctions–¦fdescribšMÞed“b˜elo²!w.ŽŸ²-‘Gëg2.4.2‘d(Selecting–íMa“KeymapŽŽŸ³3‘GáKey–¦abindings“takš²!e“place‘¦`on“a“åk˜eymapá.‘ÝÎThe“k˜eymap“is“the‘¦`assošMÞciation“b˜et•²!w“een–¦athe“k²!eysŽ¡‘Gthat–k8the“user›k9t²!ypMÞes“and“the“functions“that˜get“run.‘Ê#Y‘ÿeou“can“makš²!e“y˜our‘k9o˜wn“k˜eymaps,‘wcop˜yŽ¡‘Gexisting–¦fkš²!eymaps,“and“tell“Readline“whic˜h“k˜eymap“to“use.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@Keymap‘LÉrl_make_bare_keymap‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáReturns–æEa‘æDnew,‘ ²emptš²!y“k˜eymap.‘ÒThe›æDspace“for“the˜k²!eymap“is“alloMÞcated˜with“âmalloc()á;Ž¡‘.ùœthe–¦fcaller“should“free“it“b²!y“calling“ârl_free_keymap()“áwhen“done.ŽŸ¾w’“z[F‘ÿeunction]ŽŽ‘Gë@Keymap‘LÉrl_copy_keymap‘yšæ(ëAKeymap‘mapæ)Ž¡‘.ùœáReturn–¦fa“new“kš²!eymap“whic˜h“is“a“cop˜y“of“åmapá.ŽŽŒ‹&ÍŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—38ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@Keymap‘LÉrl_make_keymap‘yšæ(ëAvªªoidæ)ޤ 33‘.ùœáReturn–Ŭa›Å«new“k²!eymap˜with“the˜prinš²!ting“c˜haracters‘Å«bMÞound“to“rl‘Ä>‰x³HøŽ‘Ñtinsert,‘Í|the“lo˜w˜ercaseŽ¡‘.ùœMeta–µÝcš²!haracters“bMÞound“to“run“their“equiv‘ÿdDalen˜ts,‘åùand“the“Meta“digits“bšMÞound“to“pro˜duceŽ¡‘.ùœn•²!umeric‘¦fargumen“ts.Ž©Ëë’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_discard_keymap‘yšæ(ëAKeymap‘kªªeymapæ)Ž¡‘.ùœáF‘ÿeree–…óthe›…òstorage“assoMÞciated“with˜the“data“in˜åk²!eymapá.‘Ó The“caller“should˜free“åk²!eymapá.ŽŸËì’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_free_keymap‘yšæ(ëAKeymap‘kªªeymapæ)Ž¡‘.ùœáF‘ÿeree–³öall“storage›³õassoMÞciated“with“åk²!eymapá.‘ŒThis“calls“ârl_discard_keymap˜áto“free“sub-Ž¡‘.ùœordinate–¦fk²!eymaps“and“macros.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_empty_keymap‘yšæ(ëAKeymap‘kªªeymapæ)Ž¡‘.ùœáReturn–¯Énon-zero“if“there“are“no“kš²!eys“bMÞound“to“functions“in“åk˜eymapUá;‘´zzero“if“there“areŽ¡‘.ùœan•²!y›¦fk“eys˜bMÞound.ŽŸËì‘!GReadline–qhas“sev•²!eral‘qin“ternal›qk“eymaps.‘ >These˜functions˜allo“w˜y“ou‘qto˜c“hange˜whic“hŽ¡‘Gkš²!eymap–¦fis“activ˜e.‘ÝÝThis“is“one“w˜a˜y“to“switc˜h“editing“moMÞdes,“for“example.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@Keymap‘LÉrl_get_keymap‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáReturns–¦fthe“currenš²!tly“activ˜e“k˜eymap.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_set_keymap‘yšæ(ëAKeymap‘kªªeymapæ)Ž¡‘.ùœáMak•²!es›¦fåk“eymap‘ûgáthe˜curren“tly˜activ“e˜k“eymap.ŽŸËì’“z[F‘ÿeunction]ŽŽ‘Gë@Keymap‘LÉrl_get_keymap_by_name‘yšæ(ëAconst–cªªhar“*nameæ)Ž¡‘.ùœáReturn–ý>the“k•²!eymap›ý=matc“hing–ý>ånameá.‘âdåname‘šEáis“one“whic•²!h˜w“ould–ý>bMÞe“supplied“in˜a“âsetŽ¡‘.ùœkeymap–¦fáinputrc“line“(see“Section“1.3“[Readline“Init“File],“page“4).ަ’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ*“rl_get_keymap_name‘yšæ(ëAKeymap‘kªªeymapæ)Ž¡‘.ùœáReturn–ý>the“name‘ý=matcš²!hing“åk˜eymapá.‘âdåname‘šEáis“one“whic˜h‘ý=w˜ould“bMÞe“supplied“in‘ý=a“âsetŽ¡‘.ùœkeymap–¦fáinputrc“line“(see“Section“1.3“[Readline“Init“File],“page“4).ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_set_keymap_name‘yšæ(ëAconst–cšªªhar“*name,“Keymap“k˜eymapæ)Ž¡‘.ùœáSet–the“name› of“åk²!eymapá.‘ÿÔThis“name“will“then˜bMÞe“â"áregisteredâ"“áand“a²!v‘ÿdDailable˜for“useŽ¡‘.ùœin–0”a“âset‘¦fkeymap›0•áinputrc“directiv²!e“see“Section˜1.3“[Readline“Init“File],‘S page“4).‘|hTheŽ¡‘.ùœåname‘Gzáma²!y–ªrnot›ªsbMÞe“one˜of“Readline's˜builtin“k•²!eymap˜names;‘þny“ou˜ma“y–ªrnot˜add“a˜di eren²!tŽ¡‘.ùœname–S'for“one“of“Readline's“builtin“kš²!eymaps.‘ä!Y‘ÿeou“ma˜y“replace“the“name“assoMÞciatedŽ¡‘.ùœwith–¼xa‘¼ygivš²!en“k˜eymap“b˜y›¼ycalling“this˜function“more“than˜once“with“the˜same“åk²!eymapŽ¡‘.ùœáargumen•²!t.‘ýY‘ÿeou›$ma“y˜assoMÞciate–%a˜registered˜åname‘£+áwith“a˜new˜k•²!eymap˜b“y‘%calling˜thisŽ¡‘.ùœfunction–Ìmore›Ìthan“once“with˜the“same“åname‘iáargumen²!t.‘NìThere˜is“no“w•²!a“y˜to‘Ìremo“v“eŽ¡‘.ùœa–:¤named›:£k²!eymap“once˜the“name˜has“bMÞeen˜registered.‘š–Readline˜will“mak²!e˜a“cop²!y˜ofŽ¡‘.ùœånameá.‘åÍThe–© return“v‘ÿdDalue›© is“greater“than“zero˜unless“åname‘Fáis“one˜of“Readline's“builtinŽ¡‘.ùœkš²!eymap–¦fnames“or“åk˜eymap‘ûgáis“one“of“Readline's“builtin“k˜eymaps.ŽŸ»&‘Gëg2.4.3‘d(Binding‘íMKeysŽŽŸ³3‘GáKey–¨žsequences›¨are“assoMÞciated˜with“functions˜through“the˜k²!eymap.‘ä„Readline˜has“sev²!eral˜in-Ž¡‘Gternal‘€²k²!eymaps:‘Ëâemacs_standard_keymapá,–ˆ<âemacs_meta_keymapá,“âemacs_ctlx_keymapá,“âvi_Ž¡‘Gmovement_keymapá,‘qxand–§âvi_insertion_keymapá.‘ +£âemacs_standard_keymap“áis–¨the“default,Ž¡‘Gand–¦fthe“examples“in“this“man²!ual“assume“that.ŽŽŒ‹'RŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—39ŽŽŽ ƒ33 ý ÌÍ‘!GSince–Qâreadline()“áinstalls›Qa“set“of“default˜k²!ey“bindings“the“ rst˜time“it“is“called,‘b"there“isޤ 33‘Galw•²!a“ys–èíthe›èîdanger“that“a˜custom“binding“installed˜bMÞefore“the“ rst˜call“to“âreadline()˜áwill“bMÞeŽ¡‘Go•²!v“erridden.‘KAn‘ Šalternate› ‹mec“hanism˜that‘ Šcan˜a“v“oid– Šthis˜is˜to“install˜custom“k²!ey˜bindingsŽ¡‘Gin–Jäan›Jåinitialization“function“assigned“to˜the“ârl_startup_hook“áv‘ÿdDariable“(see˜Section“2.3Ž¡‘G[Readline–¦fV‘ÿeariables],“page“31).ŽŸT<‘!GThese–¦ffunctions“manage“k²!ey“bindings.Ž©–L’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_key‘yšæ(ëAin•ªªt›k“ey‘þÿÿ,˜rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t˜*functionæ)Ž¡‘.ùœáBinds–ö½åkš²!ey‘æÖáto“åfunction“áin‘ö¾the“curren˜tly“activ˜e‘ö¾k˜eymap.‘ÎãReturns“non-zero“in‘ö¾the“caseŽ¡‘.ùœof–¦fan“inš²!v‘ÿdDalid“åk˜eyá.ŽŸ–M’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_key_in_map‘yšæ(ëAin•ªªt›k“ey‘þÿÿ,˜rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t˜*function,Ž¡‘DGKeymap‘mapæ)Ž¡‘.ùœáBind–¦fåkš²!ey‘–~áto“åfunction“áin“åmapá.‘ÝÝReturns“non-zero“in“the“case“of“an“in˜v‘ÿdDalid“åk˜eyá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_key_if_unbound‘yšæ(ëAin•ªªt›k“ey‘þÿÿ,˜rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“tŽ¡‘DG*functionæ)Ž¡‘.ùœáBinds–Iåk²!ey‘9-áto“åfunction“áif›Iit“is˜not“already“bMÞound˜in“the“curren•²!tly˜activ“e‘Ik“eymap.Ž¡‘.ùœReturns–¦fnon-zero“in“the“case“of“an“inš²!v‘ÿdDalid“åk˜ey‘–~áor“if“åk˜ey‘–~áis“already“bMÞound.ŽŸ–M’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_key_if_unbound_in_map‘yšæ(ëAin•ªªt›k“ey‘þÿÿ,˜rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“tŽ¡‘DG*function,–Keymap“mapæ)Ž¡‘.ùœáBinds–GÓåk²!ey‘7ëáto“åfunction“áif“it“is“not“already“bMÞound“in“åmapá.‘¾WReturns“non-zero“in“the“caseŽ¡‘.ùœof–¦fan“inš²!v‘ÿdDalid“åk˜ey‘–~áor“if“åk˜ey‘–~áis“already“bMÞound.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_unbind_key‘yšæ(ëAin•ªªt‘k“eyæ)Ž¡‘.ùœáBind–¸åkš²!ey‘ Ïáto“the“n˜ull“function‘·in“the“curren˜tly‘·activ˜e“k˜eymap.‘7ÒThis“is“not‘·the“sameŽ¡‘.ùœas–¦fbinding“it“to“âself-insertá.‘ÝÝReturns“non-zero“in“case“of“error.ŽŸ–M’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_unbind_key_in_map‘yšæ(ëAin•ªªt›k“ey‘þÿÿ,˜Keymap˜mapæ)Ž¡‘.ùœáBind–åkš²!ey‘1áto“the‘n˜ull“function“in“åmapá.‘ ,õThis“is“not“the“same“as‘binding“it“toŽ¡‘.ùœâself-insertá.‘ÝÝReturns–¦fnon-zero“in“case“of“error.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_unbind_function_in_map‘yšæ(ëArl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t‘*function,Ž¡‘DGKeymap‘mapæ)Ž¡‘.ùœáUnš²!bind–¦fall“k˜eys“that“execute“åfunction“áin“åmapá.ŽŸ–M’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_unbind_command_in_map‘yšæ(ëAconst–cªªhar“*command,“KeymapŽ¡‘DGmapæ)Ž¡‘.ùœáUnš²!bind–¦fall“k˜eys“that“are“bMÞound“to“åcommand‘¸áin“åmapá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_keyseq‘yšæ(ëAconst–cšªªhar“*k˜eyseq,“rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“tŽ¡‘DG*functionæ)Ž¡‘.ùœáBind–,Žthe“kš²!ey“sequence‘,represen˜ted“b˜y“the“string“åk˜eyseq‘mtáto‘,the“function“åfunctioná,Ž¡‘.ùœbMÞeginning–c®in›c­the“curren•²!t˜k“eymap.‘Ç This˜mak“es–c®new“k²!eymaps˜as“necessary‘ÿe.‘ÇŸThe“returnŽ¡‘.ùœv‘ÿdDalue–¦fis“non-zero“if“åkš²!eyseq‘çLáis“in˜v‘ÿdDalid.ŽŸ–M’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_keyseq_in_map‘yšæ(ëAconst–cšªªhar“*k˜eyseq,Ž¡‘DGrl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t–*function,“Keymap“mapæ)Ž¡‘.ùœáBind–Nßthe“kš²!ey‘NÞsequence“represen˜ted“b˜y“the‘NÞstring“åk˜eyseq‘Åáto“the‘NÞfunction“åfunction“áinŽ¡‘.ùœåmapá.‘@This‘ÇMmakš²!es–ÇLnew“k˜eymaps›ÇMas“necessary‘ÿe.‘@Initial˜bindings“are“pMÞerformed˜in“åmapá.Ž¡‘.ùœThe–¦freturn“v‘ÿdDalue“is“non-zero“if“åkš²!eyseq‘çLáis“in˜v‘ÿdDalid.ŽŽŒ‹(8Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—40ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_set_key‘yšæ(ëAconst–cšªªhar“*k˜eyseq,“rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t‘*function,ޤ 33‘DGKeymap‘mapæ)Ž¡‘.ùœáEquiv‘ÿdDalen²!t–¦fto“ârl_bind_keyseq_in_mapá.Ž©¾ ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_keyseq_if_unbound‘yšæ(ëAconst–cšªªhar“*k˜eyseq,Ž¡‘DGrl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t‘*functionæ)Ž¡‘.ùœáBinds–Cóåk²!eyseq‘„Øáto“åfunction“áif›Còit“is“not˜already“bMÞound˜in“the“curren•²!tly˜activ“e‘Cók“eymap.Ž¡‘.ùœReturns–¦fnon-zero“in“the“case“of“an“inš²!v‘ÿdDalid“åk˜eyseq‘çLáor“if“åk˜eyseq‘çLáis“already“bMÞound.ŽŸ¾’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_bind_keyseq_if_unbound_in_map‘yšæ(ëAconst–cšªªhar“*k˜eyseq,Ž¡‘DGrl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t–*function,“Keymap“mapæ)Ž¡‘.ùœáBinds–×åk²!eyseq‘øáto“åfunction›×áif“it“is˜not“already˜bMÞound“in˜åmapá.‘oãReturns“non-zero˜in“theŽ¡‘.ùœcase–¦fof“an“inš²!v‘ÿdDalid“åk˜eyseq‘çLáor“if“åk˜eyseq‘çLáis“already“bMÞound.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_generic_bind‘yšæ(ëAin•ªªt›t“ypUVe,˜const˜c“har˜*k“eyseq,˜c“har˜*data,Ž¡‘DGKeymap‘mapæ)Ž¡‘.ùœáBind–>ïthe›>ðk²!ey“sequence˜represenš²!ted“b˜y›>ðthe“string˜åk²!eyseq‘Õáto˜the“arbitrary˜pMÞoin²!ter“ådataá.Ž¡‘.ùœåt•²!ypšMÞe‘•ása“ys–jŽwhat‘jkind“of“data“is“p˜oinš²!ted‘jto“b˜y“ådataá;‘~this“can“bMÞe“a‘jfunction“(âISFUNCá),‘v†aŽ¡‘.ùœmacro–Š™(âISMACRá),‘(or“a›Š˜k²!eymap“(âISKMAPá).‘Ô™This˜makš²!es“new“k˜eymaps“as‘Š˜necessary‘ÿe.‘Ô™TheŽ¡‘.ùœinitial–T»kš²!eymap“in‘Tºwhic˜h“to“do“bindings›Tºis“åmapá.‘èÛReturns“non-zero“in“the˜case“of“anŽ¡‘.ùœin•²!v‘ÿdDalid›¦fåk“eyseqá,˜zero˜otherwise.ŽŸ¾’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_parse_and_bind‘yšæ(ëAcªªhar‘*lineæ)Ž¡‘.ùœáP²!arse–‡yåline‘$€áas›‡xif“it“had“bMÞeen“read“from˜the“âinputrc“á le“and“pMÞerform˜anš²!y“k˜ey“bindingsŽ¡‘.ùœand–¦fv‘ÿdDariable“assignmen²!ts“found“(see“Section“1.3“[Readline“Init“File],“page“4).ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_read_init_file‘yšæ(ëAconst–cªªhar“* lenameæ)Ž¡‘.ùœáRead–È8kš²!eybindings“and‘È9v‘ÿdDariable“assignmen˜ts“from“å lename‘e?á(see‘È9Section“1.3“[ReadlineŽ¡‘.ùœInit–¦fFile],“page“4).ŽŸ\Ž‘Gëg2.4.4‘d(Assoiciating–íMF‘þÄ£unction“Names“and“BindingsŽŽŸ³3‘GáThese–ž›functions‘žšalloš²!w“y˜ou›žšto“ nd˜out“what“k•²!eys˜in“v“ok“e–ž›named˜functions“and˜the“functionsŽ¡‘Gin•²!v“ok“ed›MLb“y‘MMa˜particular˜k“ey˜sequence.‘À*Y‘ÿeou‘MMma“y˜also˜assoMÞciate–MMa˜new˜function˜name“with˜anŽ¡‘Garbitrary‘¦ffunction.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@rl_command_func_t–LÉ*“rl_named_function‘yšæ(ëAconst–cªªhar“*nameæ)Ž¡‘.ùœáReturn–pWthe›pXfunction“with“name“ånameá.‘ËÙåname‘ ^áis“a˜descriptivš²!e“name“users“migh˜t‘pXuse“inŽ¡‘.ùœa–¦fk²!ey“binding.ŽŸ¾’“z[F‘ÿeunction]ŽŽ‘Gë@rl_command_func_t–LÉ*“rl_function_of_keyseq‘yšæ(ëAconst‘cªªharŽ¡‘DG*kšªªeyseq,–Keymap“map,“in˜t“*t˜ypUVeæ)Ž¡‘.ùœáReturn–|ºthe›|¹function“in•²!v“ok“ed‘|ºb“y˜åk“eyseq‘½ áin‘|ºk“eymap˜åmapá.‘ÏùIf–|ºåmap‘Ñ»áis˜âNULLá,‘…this˜uses“theŽ¡‘.ùœcurren•²!t›+¶k“eymap.‘mÍIf‘+·åt“ypMÞe‘Ƚáis˜not˜âNULLá,‘M this˜returns˜the˜t“ypMÞe˜of‘+·the˜ob‘›»ject˜in˜the˜âintŽ¡‘.ùœáv‘ÿdDariable–ŒLit“pMÞoinš²!ts“to“(one“of“âISFUNCá,‘‘…âISKMAPá,‘‘„or“âISMACRá).‘Õ*It“tak˜es“a“â"átranslatedâ"“ák˜eyŽ¡‘.ùœsequence–¦fand“should“not“bMÞe“used“if“the“k²!ey“sequence“can“include“NUL.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@rl_command_func_t–LÉ*“rl_function_of_keyseq_len‘yšæ(ëAconst‘cªªharŽ¡‘DG*kšªªeyseq,–size‘׉„F™œŽ‘G¼t“len,“Keymap“map,“in˜t“*t˜ypUVeæ)Ž¡‘.ùœáReturn–†¥the›†¦function“in•²!v“ok“ed˜b“y›†¥åk“eyseq‘ÇŒáof˜length˜ålen‘†¦áin˜k“eymap›†¦åmapá.‘}òEquiv‘ÿdDalen“t˜to‘†¥ârl_Ž¡‘.ùœfunction_of_keyseq–Jôáwith›Jóthe“addition“of“the˜ålen“áparameter.‘¿bIt“tak²!es˜a“â"átranslatedâ"Ž¡‘.ùœákš²!ey–¦fsequence“and“should“bMÞe“used“if“the“k˜ey“sequence“can“include“NUL.ŽŽŒ‹).åŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—41ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_trim_arg_from_keyseq‘yšæ(ëAconst–cšªªhar“*k˜eyseq,“size‘׉„F™œŽ‘G¼t“len,ޤ 33‘DGKeymap‘mapæ)Ž¡‘.ùœáIf–è’there›è“is“a“n•²!umeric˜argumen“t–è’at“the“bMÞeginning˜of“åk²!eyseqá,‘ùpMÞossibly˜including“digits,Ž¡‘.ùœreturn–þ¡the“index›þ of“the“ rst“c²!haracter˜in“åk•²!eyseq‘?‡áfollo“wing‘þ¡the˜n“umeric‘þ¡argumen“t.‘¥ñThisŽ¡‘.ùœcan–ŒbMÞe“used“to“skip“o•²!v“er›Œthe‘Œn“umeric˜argumen“t˜(whic“h˜is˜a“v‘ÿdDailable˜as˜ârl_numeric_argá)Ž¡‘.ùœwhile›¦ftra•²!v“ersing˜the˜k“ey˜sequence˜that˜in“v“ok“ed˜the˜curren“t˜command.Ž©–g’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ**“rl_invoking_keyseqs‘yšæ(ëArl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t‘*functionæ)Ž¡‘.ùœáReturn–¿ëan›¿êarra²!y“of˜strings“represen²!ting“the˜k²!ey“sequences“used˜to“in•²!v“ok“e˜åfunction‘¿ëáinŽ¡‘.ùœthe–¦fcurrenš²!t“k˜eymap.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ**“rl_invoking_keyseqs_in_map‘yšæ(ëArl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“tŽ¡‘DG*function,–Keymap“mapæ)Ž¡‘.ùœáReturn–¿ëan›¿êarra²!y“of˜strings“represen²!ting“the˜k²!ey“sequences“used˜to“in•²!v“ok“e˜åfunction‘¿ëáinŽ¡‘.ùœthe–¦fk²!eymap“åmapá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_print_keybinding‘yšæ(ëAconst–cšªªhar“*name,“Keymap“map,“in˜tŽ¡‘DGreadableæ)Ž¡‘.ùœáPrin•²!t›Œ×k“ey˜sequences–ŒØbMÞound˜to˜Readline˜function“name˜åname‘)Þáin˜k²!eymap“åmapá.‘ÕXIf˜åmapŽ¡‘.ùœáis–¼¦NULL,›¼§this“uses“the˜currenš²!t“k˜eymap.‘ žIf“åreadable‘Y­áis›¼§non-zero,‘Â6the“list˜is“formattedŽ¡‘.ùœin–gñsucš²!h“a‘gðw˜a˜y“that“it“can“bMÞe“made›gðpart“of“an“âinputrc“á le“and˜re-read“to“recreate“theŽ¡‘.ùœk²!ey‘¦fbinding.ŽŸ–h’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_function_dumper‘yšæ(ëAinªªt‘readableæ)Ž¡‘.ùœáPrin²!t›Lèthe–LçReadline“function˜names˜and“the˜k²!ey“sequences˜curren²!tly“bMÞound“to˜themŽ¡‘.ùœto–¿ãârl_outstreamá.‘*TIf“åreadable‘\êáis“non-zero,‘ÆBthe“list“is“formatted“in“sucš²!h“a“w˜a˜y“that“itŽ¡‘.ùœcan–¦fbMÞe“made“part“of“an“âinputrc“á le“and“re-read.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_list_funmap_names‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáPrin²!t–¦fthe“names“of“all“bindable“Readline“functions“to“ârl_outstreamá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@const–LÉchar“**“rl_funmap_names‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáReturn–Sa›RNULL‘1terminated“arra²!y˜of“kno²!wn“function˜names.‘°×The“arra²!y“is˜sorted.‘°×TheŽ¡‘.ùœarra²!y–\hitself›\iis“alloMÞcated,‘k5but“not˜the“strings“inside.‘Å3Y‘ÿeou˜should“free˜the“arra²!y‘ÿe,‘k5but“notŽ¡‘.ùœthe–¦fpMÞoinš²!ters,“using“âfree“áor“ârl_free“áwhen“y˜ou“are“done.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_add_funmap_entry‘yšæ(ëAconst–cªªhar“*name,“rl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“tŽ¡‘DG*functionæ)Ž¡‘.ùœáAdd–ð³åname‘»áto“the“list›ð´of“bindable˜Readline“command“names,‘Gand“mak²!e˜åfunction“átheŽ¡‘.ùœfunction–£ñto“bMÞe›£ðcalled“when“åname‘@øáis˜in•²!v“ok“ed.‘‡¶This–£ñreturns“the“index˜of“the“newly-addedŽ¡‘.ùœåname‘Cmáin–¦fthe“arra²!y“of“function“names.ŽŸ±š‘Gëg2.4.5‘d(Allo–áwing‘íMUndoingŽŽŸ³3‘GáSuppMÞorting–L´the›L³undo“command˜is“a“painless˜thing,‘vGand“mak•²!es˜y“our‘L´functions˜m“uc“h‘L´moreŽ¡‘Guseful.‘ÝÝIt–¦fis“certainly“easier“to“try“something“if“yš²!ou“kno˜w“y˜ou“can“undo“it.ŽŸäÍ‘!GIf–è*y²!our›è+function“simply“inserts˜text“once,‘8›or˜deletes“text“once,‘8›and˜uses“ârl_insert_Ž¡‘Gtext()–ò;áor›ò:ârl_delete_text()“áto˜do“it,‘0then˜Readline“doMÞes“the˜undoing“for˜y²!ou“automati-Ž¡‘Gcally‘ÿe.ŽŽŒ‹*?Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—42ŽŽŽ ƒ33 ý ÌÍ‘!GIf–u†yš²!ou“do“m˜ultiple“insertions“or“m˜ultiple“deletions,‘²or“an˜y“com˜bination“of“these“opMÞerations,ޤ 33‘Gy²!ou–‘should›group“them˜together“in²!to˜one“opMÞeration.‘œ\This“is˜done“with˜ârl_begin_undo_Ž¡‘Ggroup()–¦fáand“ârl_end_undo_group()á.ޤ|X‘!GThe–¦ftš²!ypMÞes“of“ev˜en˜ts“Readline“can“undo“are:ŽŸ É%‘.ùœóߤN cmtt9Éenum–¹–undo_code“{“UNDO_DELETE,“UNDO_INSERT,“UNDO_BEGIN,“UNDO_END“};Ž¡‘!GáNotice–£¯that›£®âUNDO_DELETE“ámeans“to“insert˜some“text,‘¤:and“âUNDO_INSERT“ámeans˜to“deleteޤ 33‘Gsome–O²text.‘ÀöThat“is,›a the“undo“coMÞde“tells“what‘O±to“undo,˜not“ho²!w“to“undo“it.‘ÀöâUNDO_BEGIN“áandŽ¡‘GâUNDO_END–ûÆáare›ûÇtags“added“b²!y˜ârl_begin_undo_group()“áand“ârl_end_undo_group()á;‘4§they“areŽ¡‘Gho²!w–¦fReadline“delimits“groups“of“commands“that“should“bMÞe“undone“together.Ž©Å}’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_begin_undo_group‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáBegins–·‡sa²!ving›·ˆundo“information“in˜a“group“construct.‘AThe“undo˜information“usuallyŽ¡‘.ùœcomes–þIfrom›þHcalls“to“ârl_insert_text()˜áand“ârl_delete_text()á,‘TAbut“could˜bMÞe“theŽ¡‘.ùœresult–¦fof“calls“to“ârl_add_undo()á.ŽŸÅ|’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_end_undo_group‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáCloses–Úˆthe›Ú‰curren²!t“undo˜group“started˜with“ârl_begin_undo_group()á.‘zEThere“shouldŽ¡‘.ùœbMÞe–¦fone“call“to“ârl_end_undo_group()“áfor“eac²!h“call“to“ârl_begin_undo_group()á.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_add_undo‘yšæ(ëAenšªªum–undo‘׉„F™œŽ‘G¼coUVde“what,“in˜t“start,“in˜t“end,“c˜harŽ¡‘DG*textæ)Ž¡‘.ùœáRemem•²!bMÞer›ího“w˜to˜undo‘ìan˜ev“en“t˜(according˜to˜åwhat=á).‘/rThe‘ìa ected˜text˜runs˜fromŽ¡‘.ùœåstart‘ãfáto–¦fåendá,“and“encompasses“åtextá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_free_undo_list‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáF‘ÿeree–¦fthe“existing“undo“list.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_do_undo‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáUndo–¾§the“ rst“thing“on“the“undo“list.‘žReturns“â0“áif“there“w²!as“nothing“to‘¾¨undo,‘ínon-zeroŽ¡‘.ùœif–¦fsomething“w²!as“undone.ަ‘!GFinally‘ÿe,‘Á#if›»Éy²!ou–»Êneither“insert“nor˜delete“text,‘Á#but˜directly“moMÞdify“the“existing˜text“(e.g.,Ž¡‘Gcš²!hange–§its“case),‘çKcall“ârl_modifying()“áonce,‘çLjust“bMÞefore“y˜ou‘§moMÞdify“the“text.‘àY‘ÿeou“m˜ustŽ¡‘Gsupply–éthe“indices“of“the‘étext“range“that“y²!ou“are“going“to“moMÞdify‘ÿe.‘¥³Readline“will“create“anŽ¡‘Gundo–¦fgroup“for“y²!ou.ŽŸÅ|’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_modifying‘yšæ(ëAinšªªt–start,“in˜t“endæ)Ž¡‘.ùœáT‘ÿeell–Ô-Readline“to›Ô.sa•²!v“e–Ô-the“text“bMÞet•²!w“een˜åstart‘-áand–Ô-åend‘Báas“a˜single“undo“unit.‘g3It“isŽ¡‘.ùœassumed–¦fthat“yš²!ou“will“subsequen˜tly“moMÞdify“that“text.ŽŸI%‘Gëg2.4.6‘d(Redispla–áyŽŽŸüX’“zá[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_redisplay‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáChange–Šwhat's“displa•²!y“ed–Šon“the“screen“to‘Šre ect“the“currenš²!t“con˜ten˜ts“of“ârl_line_Ž¡‘.ùœbufferá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_forced_update_display‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáF‘ÿeorce–Äóthe“line“to“bšMÞe“up˜dated“and“redispla•²!y“ed,‘ •whether–Äóor“not“Readline“thinks“theŽ¡‘.ùœscreen–¦fdispla²!y“is“correct.ŽŽŒ‹+MyŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—43ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_on_new_line‘yšæ(ëAvªªoidæ)ޤ 33‘.ùœáT‘ÿeell–•Ðthe›•ÏupMÞdate“functions˜that“wš²!e“ha˜v˜e‘•Ïmo˜v˜ed“on˜to“a‘•Ïnew“(empt˜y)‘•Ïline,‘™!usually“afterŽ¡‘.ùœoutputting–¦fa“newline.Ž©¹’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_on_new_line_with_prompt‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáT‘ÿeell–ã_the›ã`upMÞdate“functions“that˜wš²!e“ha˜v˜e“mo˜v˜ed‘ã`on˜to“a“new–ã`line,‘ `with“årl‘Ä>‰x³HøŽ‘Ñtprompt‘ _áalreadyŽ¡‘.ùœdispla•²!y“ed.‘Ë®This–oÚcould“bMÞe›oÙused“b²!y“applications“that˜w•²!an“t–oÚto“output“the˜prompt“stringŽ¡‘.ùœthemselvš²!es,‘\Çbut–J_still“need“Readline“to“kno˜w“the“prompt“string“length“for“redispla˜y‘ÿe.‘¿0ItŽ¡‘.ùœshould–¦fbMÞe“used“after“setting“årl‘Ä>‰x³HøŽ–Ñtalready‘Ä>‰x³HøŽ“promptedá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_clear_visible_line‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáClear–¦fthe“screen“lines“correspMÞonding“to“the“currenš²!t“line's“con˜ten˜ts.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_reset_line_state‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáReset–*‘the›*displa²!y“state“to“a˜clean“state“and“redispla²!y˜the“curren²!t“line“starting˜on“aŽ¡‘.ùœnew‘¦fline.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_crlf‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáMo•²!v“e–¦fthe“cursor“to“the“start“of“the“next“screen“line.ŽŸ¸’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_show_char‘yšæ(ëAinªªt‘cæ)Ž¡‘.ùœáDispla•²!y›ç³c“haracter–ç´åc‘‘·áon“ârl_outstreamá.‘¡ÅIf˜Readline“has˜not˜bMÞeen“set˜to“displa²!y˜metaŽ¡‘.ùœcš²!haracters–Ødirectly‘ÿe,‘9(this‘Ùwill“con˜v˜ert‘Ùmeta“c˜haracters“to›Ùa“meta-pre xed˜k²!ey“sequence.Ž¡‘.ùœThis–¦fis“inš²!tended“for“use“b˜y“applications“whic˜h“wish“to“do“their“o˜wn“redispla˜y‘ÿe.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_message‘yšæ(ëAconst–cªªhar“*,‘º/.‘èº.‘è».Ž‘æ)Ž¡‘.ùœáThe–y¦argumenš²!ts“are‘y¥a“format“string“as“w˜ould‘y¥bšMÞe“supplied“to“âprintfá,‘µÌp˜ossibly“con²!tainingŽ¡‘.ùœcon•²!v“ersion›NÂspMÞeci cations‘NÃsuc“h˜as˜`â%dá',‘¸Ùand˜an“y˜additional˜argumen“ts‘NÃnecessary˜toŽ¡‘.ùœsatisfy–ø•the“con•²!v“ersion–ø•spMÞeci cations.‘ÔiThe“resulting“string“is‘ø”displa•²!y“ed–ø•in“the“åec²!hoŽ¡‘.ùœareaá.‘qThe–‚Lecš²!ho“area“is“also“used“to“displa˜y“n˜umeric“argumen˜ts“and“searc˜h“strings.Ž¡‘.ùœY‘ÿeou–ßshould“call“ârl_save_prompt“áto“sa•²!v“e–ßthe“prompt“information“bMÞefore“calling“thisŽ¡‘.ùœfunction.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_clear_message‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáClear–zthe“message›zin“the“ec²!ho“area.‘ÏIf“the“prompt˜wš²!as“sa˜v˜ed“with“a‘zcall“to“ârl_save_Ž¡‘.ùœprompt–uÜábMÞefore“the“last“call“to“ârl_messageá,‘‘yš²!ou“m˜ust“call“ârl_restore_prompt“ábMÞeforeŽ¡‘.ùœcalling–¦fthis“function.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_save_prompt‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáSa•²!v“e–,the›, loMÞcal“Readline“prompt˜displa²!y“state“in˜preparation“for“displa²!ying˜a“newŽ¡‘.ùœmessage–¦fin“the“message“area“with“ârl_message()á.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_restore_prompt‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáRestore–!Pthe“loMÞcal›!OReadline“prompt“displa²!y“state˜sa•²!v“ed›!Pb“y˜the˜most‘!Orecen“t˜call˜toŽ¡‘.ùœârl_save_promptá.‘„*If–ÝÕyš²!ou“called“ârl_save_prompt“áto“sa˜v˜e“the“prompt“bMÞefore“a“call“toŽ¡‘.ùœârl_messageá,‘*Ãy²!ou– Ùshould› Úcall“this˜function˜bMÞefore“the˜correspMÞonding˜call“to˜ârl_clear_Ž¡‘.ùœmessageá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_expand_prompt‘yšæ(ëAcªªhar‘*promptæ)Ž¡‘.ùœáExpand–#&anš²!y‘#%spMÞecial“c˜haracter›#%sequences“in˜åprompt‘`&áand˜set“up˜the“loMÞcal˜ReadlineŽ¡‘.ùœprompt›M%redispla²!y–M$v‘ÿdDariables.‘ÒThis“function˜is“called˜bš²!y“âreadline()á.‘ÒIt“ma˜y‘M%also“bMÞeŽŽŒ‹,Z“Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—44ŽŽŽ ƒ33 ý ÌÍ‘.ùœcalled–vAto›vBexpand“the“primary˜prompt“if˜the“application“uses˜the“ârl_on_new_line_ޤ 33‘.ùœwith_prompt()–Záfunction“or›Zârl_already_prompted“áv‘ÿdDariable.‘ø·It˜returns“the“n•²!um“bMÞerŽ¡‘.ùœof–Ãvisible›Àc²!haracters“on“the˜last“line˜of“the“(pMÞossibly˜m²!ulti-line)“prompt.‘5-Applica-Ž¡‘.ùœtions–B/maš²!y“indicate‘B0that“the“prompt“con˜tains“c˜haracters“that‘B0tak˜e“up“no“ph˜ysicalŽ¡‘.ùœscreen–Ê%space›Ê$when“displa•²!y“ed˜b“y›Ê%brac“k“eting˜a–Ê$sequence˜of“suc•²!h˜c“haracters‘Ê$with˜theŽ¡‘.ùœspMÞecial–Ήx³HøŽ‘Ñtundo‘jáis“non-zero,˜this“clears›Ý7the“undo˜list“assoMÞciated˜withŽ¡‘.ùœthe–¦fcurren²!t“line.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_push_macro_input‘yšæ(ëAcªªhar‘*macroæ)Ž¡‘.ùœáInsert–‹^åmacro‘-áinš²!to“the“line,‘Æas“if‘‹]it“had“bMÞeen“in˜v˜ok˜ed‘‹]b˜y“a“k˜ey‘‹]bMÞound“to“a“macro.‘ÔÚNotŽ¡‘.ùœespMÞecially–¦fuseful;“use“ârl_insert_text()“áinstead.ŽŸ­L‘Gëg2.4.8‘d(Character‘íMInputŽŽŸ`~’“zá[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_read_key‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáReturn–Š7the›Š8next“c•²!haracter˜a“v‘ÿdDailable–Š7from˜Readline's“curren²!t˜input“stream.‘ÔyThis“han-Ž¡‘.ùœdles–.Sinput“inserted“in²!to“the“input“stream‘.Tvia“årl‘Ä>‰x³HøŽ–ÑtpMÞending‘Ä>‰x³HøŽ“input‘kSá(see–.SSection“2.3“[Read-Ž¡‘.ùœline–¸©V‘ÿeariables],›ý:page“31)‘¸ªand“ârl_stuff_char()á,‘ý9macros,˜and“c²!haracters‘¸ªread“fromŽ¡‘.ùœthe–×kš²!eybMÞoard.‘2.While“w˜aiting›Öfor“input,‘43this˜function“will˜call“an²!y˜function“assignedŽ¡‘.ùœto–¦fthe“ârl_event_hook“áv‘ÿdDariable.ŽŽŒ‹-iWŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—45ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_getc‘yšæ(ëAFILE‘*streamæ)ޤ 33‘.ùœáReturn–Œthe‘Œ€next“cš²!haracter“a˜v‘ÿdDailable“from–Œ€åstreamá,‘Äàwhic˜h“is–Œassumed“to“bMÞe‘Œ€the“k˜eybMÞoard.Ž©–ˆ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_stuff_char‘yšæ(ëAinªªt‘cæ)Ž¡‘.ùœáInsert–òåc‘œáin²!to“the“Readline“input“stream.‘ÀâIt“will“bšMÞe“â"áreadâ"“áb˜efore“Readline“attemptsŽ¡‘.ùœto–®èread“c²!haracters“from‘®çthe“terminal“with“ârl_read_key()á.‘÷bApplications“can“pushŽ¡‘.ùœbacš²!k–?Æup‘?Çto“512“c˜haracters.‘»¨ârl_stuff_char“áreturns‘?Ç1“if“the“c˜haracter‘?Çw˜as“successfullyŽ¡‘.ùœinserted;–¦f0“otherwise.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_execute_next‘yšæ(ëAinªªt‘cæ)Ž¡‘.ùœáMak²!e–HÆåc‘òËábMÞe“the›HÇnext“command“to˜bMÞe“executed˜when“ârl_read_key()“áis˜called.‘ÄþThisŽ¡‘.ùœsets‘¦fårl‘Ä>‰x³HøŽ–ÑtpMÞending‘Ä>‰x³HøŽ“inputá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_clear_pending_input‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáUnset›|årl‘Ä>‰x³HøŽ–ÑtpMÞending‘Ä>‰x³HøŽ“inputá,‘\e ectiv•²!ely˜negating˜the˜e ect‘{of˜an“y˜previous˜call˜to˜ârl_Ž¡‘.ùœexecute_next()á.‘zYThis–…:w²!orks“only“if“the“pšMÞending“input“has“not“already“b˜een“readŽ¡‘.ùœwith‘¦fârl_read_key()á.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_set_keyboard_input_timeout‘yšæ(ëAinªªt‘uæ)Ž¡‘.ùœáWhile–ÑŽwš²!aiting“for‘Ñk˜eybMÞoard“input“in“ârl_read_key()á,‘WReadline“will“w˜ait‘Ñfor“åu“ámi-Ž¡‘.ùœcroseconds–µÀfor“input›µÁbMÞefore“calling“an²!y“function˜assigned“to“ârl_event_hooká.‘ ìåu“ám²!ustŽ¡‘.ùœbšMÞe–Ógreater“than“or“equal“to“zero“(a“zero-length“timeout“is“equiv‘ÿdDalen²!t“to“a“p˜oll).‘e[TheŽ¡‘.ùœdefault–¦fwš²!aiting“p•MÞerio“d–¦fis“one-ten˜th“of“a“second.‘ÝÝReturns“the“old“timeout“v‘ÿdDalue.ŽŸ–‡’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_set_timeout‘yšæ(ëAunsigned–inšªªt“secs,“unsigned“in˜t“usecsæ)Ž¡‘.ùœáSet–×_a“timeout›×^for“subsequen²!t“calls“to˜âreadline()á.‘pÈIf˜Readline“doMÞes“not“read˜a“com-Ž¡‘.ùœplete–Uåline,‘Äor“the“n•²!um“bšMÞer–Uåof“c²!haracters“sp˜eci ed“b²!y“ârl_num_chars_to_readá,‘Äb˜eforeŽ¡‘.ùœthe–žduration“spMÞeci ed‘Ÿb²!y“åsecs‘t á(in“seconds)“and“åusecs‘t!á(microseconds),‘,it“returns“andŽ¡‘.ùœsets–”€âRL_STATE_TIMEOUT›”áin“ârl_readline_stateá.‘‚P²!assing˜0“for“âsecs“áand˜âusecs“ácancelsŽ¡‘.ùœanš²!y–Ñ$previously“set‘Ñ#timeout;‘;the“con˜v˜enience“macro‘Ñ#ârl_clear_timeout()“áis“shorthandŽ¡‘.ùœfor–¦fthis.‘ÝÝReturns“0“if“the“timeout“is“set“successfully‘ÿe.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_timeout_remaining‘yšæ(ëAunsigned‘ÒÈinšªªt–ÒÇ*secs,‘ÛÔunsigned“in˜t‘ÒÈ*usecsæ)Ž¡‘.ùœáReturn›¢Ôthe‘¢Õn•²!um“bMÞer˜of˜seconds–¢Õand˜microseconds“remaining˜in˜the“curren²!t˜timeoutŽ¡‘.ùœduration–+`in“å*secs›žááand“å*usecsá,‘CûrespMÞectiv²!ely‘ÿe.‘´ÛBoth“å*secs‘žâáand“å*usecs˜ám²!ust“bMÞe“non-NULLŽ¡‘.ùœto–qKreturn›qJan²!y“v‘ÿdDalues.‘Ì)The˜return“v‘ÿdDalue“is˜-1“on˜error“or˜when“there˜is“no˜timeout“set,Ž¡‘.ùœ0–&Æwhen“the›&Çtimeout“has“expired“(lea²!ving˜å*secs›šHáand“å*usecs˜áunc²!hanged),‘FÞand‘&Ç1“if“theŽ¡‘.ùœtimeout–·has“not›¶expired.‘¬£If“either“of˜åsecs›†9áand“åusecs˜áis–¶âNULLá,‘0Athe“return–·v‘ÿdDalue“indicatesŽ¡‘.ùœwhether–¦fthe“timeout“has“expired.ŽŸ—Ž‘Gëg2.4.9‘d(T‘þÄ£erminal‘íMManagemen–átŽŽŸJÁ’“zá[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_prep_terminal‘yšæ(ëAinªªt‘meta‘׉„F™œŽ‘G¼ agæ)Ž¡‘.ùœáMoMÞdify–¦the“terminal“settings“for“Readline's“use,‘w¶so“âreadline()“ácan“read“a“singleŽ¡‘.ùœc²!haracter–|wat›|va“time˜from“the“k²!eybMÞoard˜and“pMÞerform˜redispla•²!y‘ÿe.‘zŽThe˜åmeta‘Ä>‰x³HøŽ‘Ñt ag‘láargumen“tŽ¡‘.ùœshould–¦fbMÞe“non-zero“if“Readline“should“read“eigh²!t-bit“input.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_deprep_terminal‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáUndo–Ë­the›ˬe ects“of˜ârl_prep_terminal()á,‘Ôÿlea²!ving˜the“terminal“in˜the“state˜in“whic²!hŽ¡‘.ùœit–¦fwš²!as“bMÞefore“the“most“recen˜t“call“to“ârl_prep_terminal()á.ŽŽŒ‹.x Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—46ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_tty_set_default_bindings‘yšæ(ëAKeymap‘kmapæ)ޤ 33‘.ùœáRead–oÝthe›oÜopMÞerating“system's“terminal“editing˜cš²!haracters“(as“w˜ould“bMÞe‘oÜdispla˜y˜ed“b˜yŽ¡‘.ùœâsttyá)–¦fto“their“Readline“equiv‘ÿdDalen²!ts.‘ÝÝThe“bindings“are“pMÞerformed“in“åkmapá.Ž©+†’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_tty_unset_default_bindings‘yšæ(ëAKeymap‘kmapæ)Ž¡‘.ùœáReset–Ò;the“bindings“manipulated“b²!y‘Ò:ârl_tty_set_default_bindings“áso“that“the“ter-Ž¡‘.ùœminal–¯editing›°c²!haracters“are˜bMÞound“to“ârl_insertá.‘2¹The˜bindings“are˜pMÞerformed“inŽ¡‘.ùœåkmapá.ŽŸ+…’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_tty_set_echoing‘yšæ(ëAinªªt‘v‘ÿUUalueæ)Ž¡‘.ùœáSet–¶Readline's“idea“of›¶Žwhether“or“not“it“is“ec²!hoing“output˜to“its“output“streamŽ¡‘.ùœ(årl‘Ä>‰x³HøŽ‘Ñtoutstreamá).‘ê€If›ÿñåv‘ÿdDalue‘œùáis–ÿò0,‘TReadline“doMÞes˜not“displa²!y˜output“to“årl‘Ä>‰x³HøŽ‘Ñtoutstreamá;‘,·an²!yŽ¡‘.ùœother–'v‘ÿdDalue›'enables“output.‘ _ÙThe“initial˜v‘ÿdDalue“is˜set“when˜Readline“initializes˜theŽ¡‘.ùœterminal–¦fsettings.‘ÝÝThis“function“returns“the“previous“v‘ÿdDalue.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_reset_terminal‘yšæ(ëAconst–cªªhar“*terminal‘׉„F™œŽ‘G¼nameæ)Ž¡‘.ùœáReinitialize–÷Readline's“idea“of“the“terminal“settings“using“återminal‘Ä>‰x³HøŽ‘Ñtname‘”%áas“the“ter-Ž¡‘.ùœminal–gUt²!ypMÞe“(e.g.,›—‘âxtermá).‘ ªIf“återminal‘Ä>‰x³HøŽ‘Ñtname‘\áis“âNULLá,˜Readline“uses“the“v‘ÿdDalue“of“theŽ¡‘.ùœâTERM›¦fáen•²!vironmen“t˜v‘ÿdDariable.ŽŸ|)‘Gëg2.4.10‘d(Utilit–áy‘íMF‘þÄ£unctionsŽŽŸ/\’“zá[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_save_state‘yšæ(ëAstruct–readline‘׉„F™œŽ‘G¼state“*spæ)Ž¡‘.ùœáSa•²!v“e–ka›ksnapshot“of“Readline's“in²!ternal˜state“to“åspá.‘ÊThe“con•²!ten“ts–kof˜the“åreadline‘Ä>‰x³HøŽ‘ÑtstateŽ¡‘.ùœástructure–òare“došMÞcumen²!ted“in“âreadline.há.‘ѶThe“caller“is“resp˜onsible“for“allo˜cating“theŽ¡‘.ùœstructure.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_restore_state‘yšæ(ëAstruct–readline‘׉„F™œŽ‘G¼state“*spæ)Ž¡‘.ùœáRestore–© Readline's›©in²!ternal“state˜to“that“stored˜in“åspá,‘ÛÇwhicš²!h“m˜ust“ha˜v˜e‘©bMÞeen“sa˜v˜ed‘©b˜y“aŽ¡‘.ùœcall–|¼to“ârl_save_stateá.‘ÏúThe‘|»con•²!ten“ts–|¼of“the“åreadline‘Ä>‰x³HøŽ‘Ñtstate‘Ãástructure“are“doMÞcumen²!tedŽ¡‘.ùœin–¦fâreadline.há.‘ÝÝThe“caller“is“respMÞonsible“for“freeing“the“structure.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_free‘yšæ(ëAvªªoid‘*memæ)Ž¡‘.ùœáDeallošMÞcate–Œ“the‘Œ’memory“p˜oinš²!ted“to‘Œ’b˜y“åmemá.‘ìåmem“ám˜ust‘Œ’ha˜v˜e“bšMÞeen“allo˜cated‘Œ’b²!y“âmallocá.ŽŸ+…’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_extend_line_buffer‘yšæ(ëAinªªt‘lenæ)Ž¡‘.ùœáEnsure–QÇthat›QÈârl_line_buffer“áhas“enough˜space“to“hold˜ålen“ác²!haracters,‘b´realloMÞcating“itŽ¡‘.ùœif‘¦fnecessary‘ÿe.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_initialize‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáInitialize–n8or›n7re-initialize“Readline's˜in²!ternal“state.‘5RIt's“not˜strictly“necessary˜to“callŽ¡‘.ùœthis;–¦fâreadline()“ácalls“it“bMÞefore“reading“an²!y“input.ŽŸ+…’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_ding‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáRing–¦fthe“terminal“bšMÞell,“ob˜eying“the“setting“of“âbell-styleá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_alphabetic‘yšæ(ëAinªªt‘cæ)Ž¡‘.ùœáReturn–¦f1“if“åc‘Pjáis“an“alphabMÞetic“c²!haracter.ŽŽŒ‹/ˆ«Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—47ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_display_match_list‘yšæ(ëAc•ªªhar›**matc“hes,˜in“t˜len,˜in“t˜maxæ)ޤ 33‘.ùœáA‘#;con•²!v“enience–#[function“for“displa²!ying“a“list“of“strings“in“columnar“format“on“Read-Ž¡‘.ùœline's›woutput–xstream.‘âmatches“áis˜the˜list˜of“strings,‘»in˜argv“format,‘»suc²!h˜as˜a“list˜ofŽ¡‘.ùœcompletion–é9matcš²!hes.‘žÎâlen“áis“the“n˜um˜bMÞer“of“strings“in“âmatchesá,‘and“âmax“áis“the“length“ofŽ¡‘.ùœthe–$ˆlongest›$‡string“in“âmatchesá.‘²“This“function˜uses“the“setting˜of“âprint-completions-Ž¡‘.ùœhorizontally–Yðáto‘Yñselect“hoš²!w“the“matc˜hes‘Yñare“displa˜y˜ed“(see“Section‘Yñ1.3.1“[ReadlineŽ¡‘.ùœInit–Ÿ´File“Synš²!tax],‘¡ page‘Ÿµ4).‘Û¢When“displa˜ying“completions,‘¡ this“function‘Ÿµsets“the“n˜um-Ž¡‘.ùœbMÞer–ÔTof›ÔScolumns“used˜for“displa²!y“to˜the“v‘ÿdDalue˜of“âcompletion-display-widthá,‘þWthe“v‘ÿdDalueŽ¡‘.ùœof–¦fthe“en•²!vironmen“t–¦fv‘ÿdDariable“âCOLUMNSá,“or“the“screen“width,“in“that“order.Ž©=ð‘!GThe–Ûfolloš²!wing‘Ûare“implemen˜ted“as“macros,‘èlist“is˜formatted“in“suc²!h˜a“w•²!a“y˜that–Y=it˜can“bMÞe“made˜part“of˜an“âinputrcŽ¡‘.ùœá le–¦fand“re-read.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_variable_bind‘yšæ(ëAconst–cšªªhar“*v‘ÿUUariable,“const“c˜har“*v‘ÿUUalueæ)Ž¡‘.ùœáMak²!e–,Óthe“Readline‘,Òv›ÿdDariable“åv˜ariable‘ÉÚáha•²!v“e–,Óåv˜alueá.‘µVThis“bMÞeha•²!v“es–,Óas“if‘,Òthe“Readline“com-Ž¡‘.ùœmand›²0`âset–¦fèvariable“valueá'˜had˜bMÞeen˜executed˜in˜an˜âinputrc˜á le˜(see˜Section˜1.3.1Ž¡‘.ùœ[Readline–¦fInit“File“Synš²!tax],“page“4)“or“b˜y“ârl_parse_and_bindá.ŽŽŒ‹0–oŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—48ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ*“rl_variable_value‘yšæ(ëAconst–cªªhar“*v‘ÿUUariableæ)ޤ 33‘.ùœáReturn–ƒÅa›ƒÆstring“represen²!ting˜the“v‘ÿdDalue˜of“the˜Readline“v›ÿdDariable“åv˜ariableá.‘ÒSF‘ÿeor“b•MÞo“oleanŽ¡‘.ùœv‘ÿdDariables,–¦fthis“string“is“either“`âoná'“or“`âoffá'.Ž©Ëë’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_variable_dumper‘yšæ(ëAinªªt‘readableæ)Ž¡‘.ùœáPrinš²!t–T×the“Readline“v‘ÿdDariable‘TÖnames“and“their“curren˜t“v‘ÿdDalues“to‘TÖârl_outstreamá.‘ é0IfŽ¡‘.ùœåreadable‘iáis–Ìnon-zero,‘Õzthe“list“is“formatted“in“sucš²!h“a“w˜a˜y“that‘Ìit“can“bMÞe“made“part“ofŽ¡‘.ùœan–¦fâinputrc“á le“and“re-read.ŽŸËì’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_set_paren_blink_timeout‘yšæ(ëAinªªt‘uæ)Ž¡‘.ùœáSet–‘the“time“inš²!terv‘ÿdDal“(in“microseconds)“that“Readline“w˜aits“when“sho˜wing“a“balancingŽ¡‘.ùœc²!haracter–¦fwhen“âblink-matching-paren“áhas“bMÞeen“enabled.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ*“rl_get_termcap‘yšæ(ëAconst–cªªhar“*capæ)Ž¡‘.ùœáRetrievš²!e–=±the“string“v‘ÿdDalue“of“the“termcap“capabilit˜y“åcapá.‘ºöReadline“fetc˜hes“the“termcapŽ¡‘.ùœenš²!try–2for‘1the“curren˜t›1terminal“name“and˜uses“those“capabilities˜to“mo•²!v“e˜around‘2theŽ¡‘.ùœscreen–†´line“and“pšMÞerform‘†³other“terminal-sp˜eci c“op˜erations,‘À>lik²!e“erasing“a“line.‘}÷ReadlineŽ¡‘.ùœdoMÞes–™Ýnot“fetc²!h›™Þor“use“all“of“a˜terminal's“capabilities,‘Ï’and“this“function˜will“return“v‘ÿdDaluesŽ¡‘.ùœfor–¦fonly“those“capabilities“Readline“fetc²!hes.ŽŸËì’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_reparse_colors‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáRead–¦for“re-read“color“de nitions“from“âLS_COLORSá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_clear_history‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáClear–C%the“history›C$list“b²!y“deleting“all˜of“the“en²!tries,‘Vþin“the“same“manner˜as“the“HistoryŽ¡‘.ùœlibrary's›%>âclear_history()–%=áfunction.‘ ZeThis“di ers˜from˜âclear_history“ábMÞecause˜itŽ¡‘.ùœfrees–¦fpriv‘ÿdDate“data“Readline“sa•²!v“es–¦fin“the“history“list.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_activate_mark‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáEnable–Ìåan›Ìääactive‘Ÿ†áregion.‘QYWhen“this“is˜enabled,‘„the“text“bšMÞet•²!w“een‘Ìåp˜oin“t‘Ìäand‘ÌåmarkŽ¡‘.ùœ(the–jåregioná)“is“displa•²!y“ed›kusing–jthe“color“spMÞeci ed“b²!y“the˜v‘ÿdDalue“of“the“âactive-region-Ž¡‘.ùœstart-color–Êùáv‘ÿdDariable“(a“åface‘á).‘K—The“default“face“is‘Êúthe“terminal's“standout“moMÞde.Ž¡‘.ùœThis–ˆºis›ˆ¹called“b²!y˜v‘ÿdDarious“Readline˜functions“that“set˜the“mark˜and“insert“text,‘ލand“isŽ¡‘.ùœa²!v‘ÿdDailable–¦ffor“applications“to“call.ŽŸËì’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_deactivate_mark‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáT‘ÿeurn–¦fo “the“activ²!e“region.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_keep_mark_active‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáIndicate–Yvthat“the“mark“should“remain‘Ywactivš²!e“when“the“curren˜t“Readline“functionŽ¡‘.ùœcompletes–6zand“after“redisplaš²!y“oMÞccurs.‘¸In“most“cases,‘LÜthe“mark“remains“activ˜e“for“onlyŽ¡‘.ùœthe–¦fduration“of“a“single“bindable“Readline“function.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_mark_active_p‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáReturn–¦fa“non-zero“v‘ÿdDalue“if“the“mark“is“currenš²!tly“activ˜e;“zero“otherwise.ŽŸ»&‘Gëg2.4.12‘d(Alternate‘íMIn–áterfaceŽŽŸ³3‘GáF‘ÿeor–¦€applications“that‘¦need“more“granš²!ular“con˜trol“than“plain‘¦âreadline()“ápro˜vides,‘æ†thereŽ¡‘Gis–Lan›Lalternate“in²!terface.‘ εSome“applications˜need“to˜in•²!terlea“v“e‘Lk“eybMÞoard˜I/O‘K—with‘L le,Ž¡‘Gdevice,‘Oor–ïíwindoš²!w“system‘ïîI/O,“t˜ypically“b˜y“using“a›ïîmain“loMÞop“to“âselect()˜áon“v‘ÿdDarious“ leŽŽŒ‹1¥Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—49ŽŽŽ ƒ33 ý ÌÍ‘Gdescriptors.‘x/T‘ÿeo–„accommošMÞdate“this“use“case,‘¼Readline“can“also“b˜e“in•²!v“ok“ed‘„‚as–„a“`callbac²!k'ޤ 33‘Gfunction–¦ffrom“an“ev•²!en“t–¦floMÞop.‘ÝÝThere“are“functions“aš²!v‘ÿdDailable“to“mak˜e“this“easy‘ÿe.Ž©æh’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_callback_handler_install‘yšæ(ëAconst–cªªhar“*prompt,Ž¡‘DGrl‘׉„F™œŽ–G¼vªªcpfunc‘׉„F™œŽ“t‘*line‘׉„F™œŽ“handleræ)Ž¡‘.ùœáSet–´Îup“the›´Ïterminal“for“Readline“I/O‘´‘and˜displa²!y“the“initial“expanded˜v‘ÿdDalue“of“åpromptá.Ž¡‘.ùœSa•²!v“e–2the“v‘ÿdDalue“of›3åline‘Ä>‰x³HøŽ‘Ñthandler‘ß[áto“use“as“a“handler“function“to˜call“when“a“completeŽ¡‘.ùœline–÷Jof“input“has“bMÞeen“enš²!tered.‘ЉThe‘÷Khandler“function“receiv˜es“the“text“of“the“line“asŽ¡‘.ùœan–éõargumen²!t.‘¨‰As›éôwith“âreadline()á,‘úØthe“handler“function˜should“âfree“áthe˜line“whenŽ¡‘.ùœit–¦fit“ nished“with“it.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_callback_read_char‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáWhenevš²!er– Þan“application“determines“that“k˜eybMÞoard“input“is“a˜v‘ÿdDailable,‘%‰x³HøŽ‘Ñthandler‘U´áfunction›ŒŠinstalled–Œ‹b²!y“ârl_callback_handler_install“áto˜proMÞcess“the“line.Ž¡‘.ùœBefore–Ècalling“the“åline‘Ä>‰x³HøŽ‘Ñthandler‘‘ºáfunction,‘ÑReadline“resets“the‘È‘terminal“settings“to“theŽ¡‘.ùœv‘ÿdDalues–\ïthey›\ðhad“bMÞefore˜calling“ârl_callback_handler_installá.‘yIf˜the“åline‘Ä>‰x³HøŽ‘ÑthandlerŽ¡‘.ùœáfunction–i"returns,›™Ñand“the“line“handler‘i#remains“installed,˜Readline“moMÞdi es“the“ter-Ž¡‘.ùœminal–¸settings›¸for“its“use“again.‘úâEOF“áis˜indicated“b²!y“calling“åline‘Ä>‰x³HøŽ‘Ñthandler‘Dáwith“a“âNULLŽ¡‘.ùœáline.ŽŸæg’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_callback_sigcleanup‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáClean– Óup“anš²!y“in˜ternal‘ Òstate“the“callbac˜k“in˜terface“uses“to‘ Òmain˜tain“state“bMÞet˜w˜een“callsŽ¡‘.ùœto‘9rl‘Ä>‰x³HøŽ–Ñtcallbacš²!k‘Ä>‰x³HøŽ“read‘Ä>‰x³HøŽ“c˜har–9(e.g.,‘5íthe“state“of‘8an˜y“activ˜e“incremen˜tal“searc˜hes).‘6UThis“isŽ¡‘.ùœin²!tended–Ùto›ÙbMÞe“used˜b²!y“applications˜that“wish˜to“pMÞerform˜their“o²!wn˜signal“handling;Ž¡‘.ùœReadline's–¦fin²!ternal“signal“handler“calls“this“when“appropriate.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_callback_handler_remove‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáRestore–âthe“terminal“to“its‘âinitial“state“and“remo•²!v“e–âthe“line“handler.‘œlY‘ÿeou“ma²!y“call“thisŽ¡‘.ùœfunction–:Çfrom›:Èwithin“a˜callbac²!k“as˜w²!ell“as˜indepMÞenden²!tly‘ÿe.‘¹þIf“the˜åline‘Ä>‰x³HøŽ‘Ñthandler‘ðáinstalledŽ¡‘.ùœb²!y–ârl_callback_handler_install›ádoMÞes“not“exit˜the“program,‘“Áy²!our˜program“shouldŽ¡‘.ùœcall––›either“this“function›–œor“the“function“referred“to“b²!y˜the“v‘ÿdDalue“of“ârl_deprep_term_Ž¡‘.ùœfunction–¦fábMÞefore“the“program“exits“to“reset“the“terminal“settings.ŽŸÌΑGëg2.4.13‘d(A–íMReadline“ExampleŽŽŸ³3‘GáHere–.is‘/a“function“whicš²!h“c˜hanges‘/lo˜w˜ercase“c˜haracters“to“their‘/uppMÞercase“equiv‘ÿdDalen˜ts,‘+àandŽ¡‘GuppMÞercase–>cš²!haracters“to“lo˜w˜ercase.‘¦XIf“this“function“w˜as“bMÞound“to“`âM-cá',‘d™then“t˜yping“`âM-cá'Ž¡‘Gw•²!ould›ɳc“hange–É´the˜case“of˜the“c²!haracter˜under“pMÞoin•²!t.‘GÅT“yping‘É´`âM-1–¦f0“M-cá'˜w•²!ould‘É´c“hange˜theŽ¡‘Gcase–¦fof“the“folloš²!wing“10“c˜haracters,“lea˜ving“the“cursor“on“the“last“c˜haracter“c˜hanged.ŽŸš‘.ùœâ/*–¿ªInvert“the“case“of“the“COUNT“following“characters.“*/Ž¡‘.ùœintŽ¡‘.ùœinvert_case_line–¿ª(count,“key)Ž¡‘K·îint–¿ªcount,“key;Ž¡‘.ùœ{Ž¡‘:xðint–¿ªstart,“end,“i;ŽŸff‘:xðstart–¿ª=“rl_point;ŽŽŒ‹2³­Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—50ŽŽŽ ƒ33 ý®‘:xðâif–¿ª(rl_point“>=“rl_end)ޤ 33‘EøDreturn‘¿ª(0);Ž©ff‘:xð/*–¿ªFind“the“end“of“the“range“to“modify.“*/Ž¡‘:xðend–¿ª=“start“+“count;ަ‘:xð/*–¿ªForce“it“to“be“within“range.“*/Ž¡‘:xðif–¿ª(end“>“rl_end)Ž¡‘EøDend–¿ª=“rl_end;Ž¡‘:xðelse–¿ªif“(end“<“0)Ž¡‘EøDend–¿ª=“0;ަ‘:xðif–¿ª(start“==“end)Ž¡‘EøDreturn‘¿ª(0);ަ‘:xð/*–¿ªFor“positive“arguments,“put“point“after“the“last“changed“character.“ForŸnï„ ™Ž¡‘K·înegative–¿ªarguments,“put“point“before“the“last“changed“character.“*/Ž¡‘:xðrl_point–¿ª=“end;ަ‘:xð/*–¿ªSwap“start“and“end“if“we“are“moving“backwards“*/Ž¡‘:xðif–¿ª(start“>“end)Ž¡‘EøD{Ž¡‘Qw˜int–¿ªtemp“=“start;Ž¡‘Qw˜start–¿ª=“end;Ž¡‘Qw˜end–¿ª=“temp;Ž¡‘EøD}ަ‘:xð/*–¿ªTell“readline“that“we“are“modifying“the“line,Ž¡‘K·îso–¿ªit“will“save“the“undo“information.“*/Ž¡‘:xðrl_modifying–¿ª(start,“end);ަ‘:xðfor–¿ª(i“=“start;“i“!=“end;“i++)Ž¡‘EøD{Ž¡‘Qw˜if–¿ª(_rl_uppercase_p“(rl_line_buffer[i]))Ž¡‘\öìrl_line_buffer[i]–¿ª=“_rl_to_lower“(rl_line_buffer[i]);Ž¡‘Qw˜else–¿ªif“(_rl_lowercase_p“(rl_line_buffer[i]))Ž¡‘\öìrl_line_buffer[i]–¿ª=“_rl_to_upper“(rl_line_buffer[i]);Ž¡‘EøD}ަ‘:xðreturn‘¿ª(0);Ž¡‘.ùœ}ŽŽŒ‹3ÃKŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—51ŽŽŽ ƒ33 ý ÌÍ‘Gëg2.4.14‘d(Alternate–íMIn–áterface“ExampleŽŽŸ³3‘GáHere–¡Êis“a“complete“program“that“illustrates“Readline's“alternate“in²!terface.‘Ð It“reads“linesޤ 33‘Gfrom–¸0the“terminal“and“displaš²!ys“them,‘¼¢pro˜viding“the“standard“history“and“T‘ÿeAB‘¸+completionŽ¡‘Gfunctions.‘ÝÝIt–¦funderstands“the“EOF“c²!haracter“or“â"áexitâ"“áto“exit“the“program.ŽŸæo‘.ùœâ/*–¿ªStandard“include“files.“stdio.h“is“required.“*/Ž¡‘.ùœ#include‘¿ªŽ¡‘.ùœ#include‘¿ªŽ¡‘.ùœ#include‘¿ªŽ©ff‘.ùœ/*–¿ªUsed“for“select(2)“*/Ž¡‘.ùœ#include‘¿ªŽ¡‘.ùœ#include‘¿ªŽ¦‘.ùœ#include‘¿ªŽ¦‘.ùœ#include‘¿ªŽ¡‘.ùœ#include‘¿ªŽ¦‘.ùœ#include‘¿ªŽ¦‘.ùœ/*–¿ªStandard“readline“include“files.“*/Ž¡‘.ùœ#include‘¿ªŽ¡‘.ùœ#include‘¿ªŽ¦‘.ùœ#if–¿ª!defined“(errno)Ž¡‘.ùœextern–¿ªint“errno;Ž¡‘.ùœ#endifަ‘.ùœstatic–¿ªvoid“cb_linehandler“(char“*);Ž¡‘.ùœstatic–¿ªvoid“sighandler“(int);ަ‘.ùœint‘¿ªrunning;Ž¡‘.ùœint‘¿ªsigwinch_received;Ž¡‘.ùœconst–¿ªchar“*prompt“=“"rltest$“";ަ‘.ùœ/*–¿ªHandle“SIGWINCH“and“window“size“changes“when“readline“is“not“active“andŸnï„ ™Ž¡‘@8šreading–¿ªa“character.“*/Ž¡‘.ùœstatic‘¿ªvoidŽ¡‘.ùœsighandler–¿ª(int“sig)Ž¡‘.ùœ{Ž¡‘:xðsigwinch_received–¿ª=“1;Ž¡‘.ùœ}ަ‘.ùœ/*–¿ªCallback“function“called“for“each“line“when“accept-line“executed,“EOFŽ¡‘@8šseen,–¿ªor“EOF“character“read.‘ TThis“sets“a“flag“and“returns;“it“couldŽ¡‘@8šalso–¿ªcall“exit(3).“*/ŽŽŒ‹4ÈRŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—52ŽŽŽ ƒ33 ý ÌÍ‘.ùœâstatic‘¿ªvoidޤ 33‘.ùœcb_linehandler–¿ª(char“*line)Ž¡‘.ùœ{Ž¡‘:xð/*–¿ªCan“use“^D“(stty“eof)“or“`exit'“to“exit.“*/Ž¡‘:xðif–¿ª(line“==“NULL“||“strcmp“(line,“"exit")“==“0)Ž¡‘EøD{Ž¡‘Qw˜if–¿ª(line“==“0)Ž¡‘\öìprintf‘¿ª("\n");Ž¡‘Qw˜printf‘¿ª("exit\n");Ž¡‘Qw˜/*–¿ªThis“function“needs“to“be“called“to“reset“the“terminal“settings,Ÿnï„ ™Ž¡‘b¶–and–¿ªcalling“it“from“the“line“handler“keeps“one“extra“prompt“fromŸnï„ Ž¡‘b¶–being–¿ªdisplayed.“*/Ž¡‘Qw˜rl_callback_handler_remove‘¿ª();Ž©ff‘Qw˜running–¿ª=“0;Ž¡‘EøD}Ž¡‘:xðelseŽ¡‘EøD{Ž¡‘Qw˜if‘¿ª(*line)Ž¡‘\öìadd_history‘¿ª(line);Ž¡‘Qw˜printf–¿ª("input“line:“%s\n",“line);Ž¡‘Qw˜free‘¿ª(line);Ž¡‘EøD}Ž¡‘.ùœ}ަ‘.ùœintŽ¡‘.ùœmain–¿ª(int“c,“char“**v)Ž¡‘.ùœ{Ž¡‘:xðfd_set‘¿ªfds;Ž¡‘:xðint‘¿ªr;ަ‘:xð/*–¿ªSet“the“default“locale“values“according“to“environment“variables.“*/Ÿnï„ ™Ž¡‘:xðsetlocale–¿ª(LC_ALL,“"");ަ‘:xð/*–¿ªHandle“window“size“changes“when“readline“is“not“active“and“readingŽ¡‘K·îcharacters.‘¿ª*/Ž¡‘:xðsignal–¿ª(SIGWINCH,“sighandler);ަ‘:xð/*–¿ªInstall“the“line“handler.“*/Ž¡‘:xðrl_callback_handler_install–¿ª(prompt,“cb_linehandler);ަ‘:xð/*–¿ªEnter“a“simple“event“loop.‘ TThis“waits“until“something“is“availableŽ¡‘K·îto–¿ªread“on“readline's“input“stream“(defaults“to“standard“input)“andŽ¡‘K·îcalls–¿ªthe“builtin“character“read“callback“to“read“it.‘ TIt“does“notŽ¡‘K·îhave–¿ªto“modify“the“user's“terminal“settings.“*/Ž¡‘:xðrunning–¿ª=“1;Ž¡‘:xðwhile‘¿ª(running)ŽŽŒ‹5ÎÑŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—53ŽŽŽ ƒ33 ý ÌÍ‘EøDâ{ޤ 33‘Qw˜FD_ZERO‘¿ª(&fds);Ž¡‘Qw˜FD_SET–¿ª(fileno“(rl_instream),“&fds);Ž©ff‘Qw˜r–¿ª=“select“(FD_SETSIZE,“&fds,“NULL,“NULL,“NULL);Ž¡‘Qw˜if–¿ª(r“<“0“&&“errno“!=“EINTR)Ž¡‘\öì{Ž¡‘hv@perror–¿ª("rltest:“select");Ž¡‘hv@rl_callback_handler_remove‘¿ª();Ž¡‘hv@break;Ž¡‘\öì}Ž¡‘Qw˜if‘¿ª(sigwinch_received)Ž¡‘.ùœ{Ž¡‘:xðrl_resize_terminal‘¿ª();Ž¡‘:xðsigwinch_received–¿ª=“0;Ž¡‘.ùœ}Ž¡‘Qw˜if–¿ª(r“<“0)Ž¡‘.ùœcontinue;ަ‘Qw˜if–¿ª(FD_ISSET“(fileno“(rl_instream),“&fds))Ž¡‘\öìrl_callback_read_char‘¿ª();Ž¡‘EøD}ަ‘:xðprintf–¿ª("rltest:“Event“loop“has“exited\n");Ž¡‘:xðreturn‘¿ª0;Ž¡‘.ùœ}ŽŸLÑ‘Gë]2.5‘™Readline–f@Signal“HandlingŽŽŸ33‘GáSignals–¨”are“async•²!hronous‘¨“ev“en“ts›¨”sen“t˜to˜a‘¨“proMÞcess˜b“y˜the˜Unix‘¨“k“ernel,‘©sometimes˜on˜bMÞehalfŽ¡‘Gof–Ð[another“proMÞcess.‘–„They“are“inš²!tended‘Ð\to“indicate“exceptional“ev˜en˜ts,‘û*lik˜e“a“user“pressing“theŽ¡‘Gterminal's–Þuinš²!terrupt“k˜ey‘ÿe,‘ìxor“a“net˜w˜ork“connection“bMÞeing“brok˜en.‘† There‘Þtis“a“class“of“signalsŽ¡‘Gthat–¥Îcan›¥ÏbMÞe“sen²!t“to“the˜proMÞcess“curren²!tly“reading“input˜from“the“k²!eybMÞoard.‘Ý«Since“ReadlineŽ¡‘Gc²!hanges–Ä–the›Ä—terminal“attributes“when˜it“is“called,‘ "it˜needs“to“p•MÞerform˜sp“ecial‘Ä–pro“cessingŽ¡‘Gwhen–wsucš²!h“a‘xsignal“is“receiv˜ed“in›xorder“to“restore“the˜terminal“to“a“sane“state,‘<|or“pro²!videŽ¡‘Gapplications–¦fusing“Readline“with“functions“to“do“so“man²!ually‘ÿe.ŽŸÙ›‘!GReadline–Øúconš²!tains“an“in˜ternal›Øùsignal“handler“that“is“installed“for˜a“n•²!um“bMÞer–Øúof“signalsŽ¡‘G(âSIGINTá,–ª âSIGQUITá,“âSIGTERMá,›ª âSIGHUPá,“âSIGALRMá,“âSIGTSTPá,“âSIGTTINá,˜and‘vâSIGTTOUá).‘LÿWhenŽ¡‘GReadline–âUreceiv²!es“one›âVof“these“signals,‘ñQthe“signal“handler“will“reset˜the“terminal“attributesŽ¡‘Gto–5Ithose›5Jthat“w²!ere“in˜e ect“bMÞefore“âreadline()“áw²!as˜called,‘Kèreset˜the“signal“handling˜to“whatŽ¡‘Git–þëwš²!as“bMÞefore‘þêâreadline()“áw˜as“called,‘ jand“resend“the‘þêsignal“to“the“calling“application.‘¦ If“andŽ¡‘Gwhen–lµthe“calling›l¶application's“signal“handler“returns,‘x?Readline“will˜reinitialize“the“terminalŽ¡‘Gand› Ucon•²!tin“ue– Tto˜accept˜input.‘ ©When“a˜âSIGINT˜áis“receiv²!ed,‘eÐthe˜Readline“signal˜handlerŽ¡‘GpMÞerforms–Tsome›TŽadditional“w•²!ork,‘€whic“h˜will‘Tcause˜an“y‘Tpartially-en“tered˜line–Tto˜bšMÞe“ab˜ortedŽ¡‘G(see–¦fthe“description“of“ârl_free_line_state()“ábMÞelo²!w).ŽŸÙœ‘!GThere–ëªis“an“additional“Readline“signal“handler,›for“âSIGWINCHá,˜whicš²!h“the“k˜ernel“sends“to“aŽ¡‘GproMÞcess–v`whenev²!er›v_the“terminal's“size˜c²!hanges“(for˜example,‘ûif“a˜user“resizes˜an“âxtermá).‘ÍÛTheŽŽŒ‹6Õ(Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—54ŽŽŽ ƒ33 ý ÌÍ‘GReadline–GtâSIGWINCH“áhandler›GsupMÞdates“Readline's“in²!ternal“screen˜size“information,‘o·and“thenޤ 33‘Gcalls–÷an²!y“âSIGWINCH“ásignal“handler“the“calling“application‘öhas“installed.‘Readline“calls“theŽ¡‘Gapplication's–;âSIGWINCH“ásignal›; handler“without“resetting“the“terminal“to˜its“original“state.Ž¡‘GIf–Ö«the“application's“signal“handler“došMÞes“more“than‘Ö¬up˜date“its“idea“of“the“terminal“size“andŽ¡‘Greturn–Ž(for“example,‘’ìa“âlongjmp“ábac²!k“to“a“main“prošMÞcessing“lo˜op),‘’ìit“ämust‘—øácall“ârl_cleanup_Ž¡‘Gafter_signal()–¦fá(describšMÞed“b˜elo²!w),“to“restore“the“terminal“state.Ž©ú‘!GWhen–­an›­application“is“using˜the“callbacš²!k“in˜terface›­(see“Section“2.4.12˜[Alternate“In-Ž¡‘Gterface],–‰page›(€48),“Readline˜installs–(signal˜handlers“only“for˜the“duration˜of“the˜call“toŽ¡‘Gârl_callback_read_chará.‘ƒ”Applications–Ý£using“the‘Ý¢callbacš²!k“in˜terface“should“bMÞe“prepared“toŽ¡‘Gclean–3«up“Readline's›3ªstate“if“they“wish“to˜handle“the“signal“bMÞefore“the˜line“handler“completesŽ¡‘Gand–¦frestores“the“terminal“state.ŽŸúœ‘!GIf–Kan“application“using‘Kthe“callbacš²!k“in˜terface“wishes“to“ha˜v˜e‘KReadline“install“its“signalŽ¡‘Ghandlers–ºat›º€the“time˜the“application˜calls“ârl_callback_handler_install˜áand“remo•²!v“e˜themŽ¡‘Gonly–Ê\when“a“complete›Ê[line“of“input“has“bMÞeen“read,‘ö^it˜should“set“the“ârl_persistent_signal_Ž¡‘Ghandlers–¥qáv›ÿdDariable“to‘¥pa“non-zero“v˜alue.‘ˆ6This“allo²!ws“an›¥papplication“to“defer“all˜of“the“handlingŽ¡‘Gof–!Îthe›!Ïsignals“Readline“catc²!hes“to˜Readline.‘±ªApplications˜should“use“this“v‘ÿdDariable˜with“care;Ž¡‘Git–¹(can“result›¹)in“Readline“catc²!hing“signals“and˜not“acting“on“them“(or˜allo²!wing“the“applicationŽ¡‘Gto–<react“to›< them)“un²!til“the“application˜calls“ârl_callback_read_chará.‘žÃThis˜can“result“inŽ¡‘Gan–’™application“bšMÞecoming“less“resp˜onsivš²!e“to“k˜eybMÞoard‘’šsignals“lik˜e“SIGINT.“If“an“applicationŽ¡‘GdošMÞes–èÓnot“w•²!an“t–èÓor“need“to“p˜erform“an²!y“signal“handling,‘½or“do˜es“not“need“to“do“an²!y“pro˜cessingŽ¡‘GbšMÞet•²!w“een–¦fcalls“to“ârl_callback_read_chará,“setting“this“v‘ÿdDariable“ma²!y“b˜e“appropriate.ަ‘!GReadline–o#proš²!vides“t˜w˜o“v‘ÿdDariables“that“allo˜w‘o"application“writers“to“con˜trol“whether“or“notŽ¡‘Git–û.will›û/catc²!h“certain“signals“and˜act“on“them˜when“they“are“receiv²!ed.‘Ü6It“is˜impMÞortan²!t“thatŽ¡‘Gapplications–f“c²!hange›f’the“v‘ÿdDalues˜of“these˜v‘ÿdDariables“only˜when“calling“âreadline()á,‘–not˜in“aŽ¡‘Gsignal–¦fhandler,“so“Readline's“in²!ternal“signal“state“is“not“corrupted.ŽŸ‰o’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_catch_signalsŽ¡‘.ùœáIf–w*this›w)v‘ÿdDariable“is˜non-zero,‘€œReadline“will“install˜signal“handlers˜for“âSIGINTá,‘€œâSIGQUITá,Ž¡‘.ùœâSIGTERMá,–¦fâSIGHUPá,“âSIGALRMá,“âSIGTSTPá,“âSIGTTINá,“and“âSIGTTOUá.ަ‘.ùœThe–¦fdefault“v‘ÿdDalue“of“ârl_catch_signals“áis“1.ŽŸ‰o’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_catch_sigwinchŽ¡‘.ùœáIf–…Tthis“v›ÿdDariable“is“set“to“a“non-zero“v˜alue,‘½Readline“will“install“a“signal“handler“forŽ¡‘.ùœâSIGWINCHá.ަ‘.ùœThe–¦fdefault“v‘ÿdDalue“of“ârl_catch_sigwinch“áis“1.ŽŸ‰o’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_persistent_signal_handlersŽ¡‘.ùœáIf–Ë!an›Ë application“using˜the“callbacš²!k“in˜terface›Ë wishes“Readline's˜signal“handlers˜to“bMÞeŽ¡‘.ùœinstalled–zand“activ²!e“during“the“set‘zof“calls“to“ârl_callback_read_char“áthat“constitutesŽ¡‘.ùœan–¦fen²!tire“single“line,“it“should“set“this“v›ÿdDariable“to“a“non-zero“v˜alue.ަ‘.ùœThe–¦fdefault“v‘ÿdDalue“of“ârl_persistent_signal_handlers“áis“0.ŽŸ‰o’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_change_environmentŽ¡‘.ùœáIf–Ã2this›Ã1v‘ÿdDariable“is˜set“to˜a“non-zero˜v‘ÿdDalue,‘Êeand˜Readline“is˜handling“âSIGWINCHá,‘ÊdRead-Ž¡‘.ùœline–›Áwill››ÂmoMÞdify“the“åLINES‘?Iáand“åCOLUMNS‘?Háen•²!vironmen“t˜v‘ÿdDariables–›ÁupMÞon“receipt˜of“aŽ¡‘.ùœâSIGWINCHá.ަ‘.ùœThe–¦fdefault“v‘ÿdDalue“of“ârl_change_environment“áis“1.ŽŽŒ‹7à6Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—55ŽŽŽ ƒ33 ý ÌÍ‘!GIf–¸0an“application›¸/doMÞes“not“wish“to˜ha•²!v“e–¸0Readline“catcš²!h“an˜y–¸/signals,‘¼£or“to–¸0handle“signalsޤ 33‘Gother–¤Ãthan›¤Äthose“Readline“catc²!hes˜(âSIGHUPá,›äZfor“example),˜Readline‘¤Äproš²!vides“con˜v˜enienceŽ¡‘Gfunctions–¦fto“do“the“necessary“terminal“and“inš²!ternal“state“clean˜up“upMÞon“receipt“of“a“signal.Ž©p¤’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_pending_signal‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáReturn–IÚthe›IÙsignal“n•²!um“bMÞer˜of–IÚthe˜most“recen²!t“signal˜Readline“receiv²!ed˜but“has˜not“y²!etŽ¡‘.ùœhandled,–¦for“0“if“there“is“no“pMÞending“signal.ŽŸp¥’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_cleanup_after_signal‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáThis–¦function›¥will“reset˜the“state˜of“the“terminal˜to“what˜it“w²!as˜bMÞefore“âreadline()Ž¡‘.ùœáwš²!as–†called,‘Œ~and“remo˜v˜e›†the“Readline˜signal“handlers˜for“all˜signals,‘ŒdepMÞending˜on“theŽ¡‘.ùœv‘ÿdDalues–¦fof“ârl_catch_signals“áand“ârl_catch_sigwinchá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_free_line_state‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáThis–µwill“free›µ~an²!y“partial“state“assoMÞciated˜with“the“curren²!t“input˜line“(undo“infor-Ž¡‘.ùœmation,‘z$anš²!y–˜partial“history“en˜try‘ÿe,‘z#an˜y“partially-en˜tered“k˜eybMÞoard“macro,‘z$and“an˜yŽ¡‘.ùœpartially-en•²!tered‘½Õn“umeric›½Ôargumen“t).‘ $*This˜should–½ÕbMÞe“called˜bMÞefore“ârl_cleanup_Ž¡‘.ùœafter_signal()á.‘ LãThe– ½Readline“signal“handler› ¾for“âSIGINT“ácalls“this˜to“abMÞort“theŽ¡‘.ùœcurren²!t–¦finput“line.ŽŸp¥’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_reset_after_signal‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáThis–k¶will“reinitialize“the“terminal“and“reinstall‘kµan²!y“Readline“signal“handlers,‘wsdepMÞend-Ž¡‘.ùœing–¦fon“the“v‘ÿdDalues“of“ârl_catch_signals“áand“ârl_catch_sigwinchá.ަ‘!GIf–îan›îapplication“w•²!an“ts˜to–îforce˜Readline“to˜handle“an²!y˜signals“that˜ha•²!v“e‘îarriv“ed˜whileŽ¡‘Git–M9has›M:bMÞeen“executing,‘vïârl_check_signals()“áwill˜call“Readline's˜in²!ternal“signal˜handler“ifŽ¡‘Gthere–jare›jan²!y“pMÞending˜signals.‘(õThis˜is“primarily˜in²!tended“for˜those“applications˜that“useŽ¡‘Ga–‰úcustom›‰ùârl_getc_function“á(see˜Section“2.3˜[Readline“V‘ÿeariables],‘ÂÞpage˜31)“and˜wish“toŽ¡‘Ghandle–¦fsignals“receivš²!ed“while“w˜aiting“for“input.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_check_signals‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáIf–ã!there›ã are“an²!y˜pMÞending“signals,‘2Ncall“Readline's˜in²!ternal“signal˜handling“functionsŽ¡‘.ùœto–"GprošMÞcess“them.‘ Q€ârl_pending_signal()‘"Hácan“b˜e“used“indep˜enden²!tly“to“determineŽ¡‘.ùœwhether–¦for“not“there“are“an²!y“pMÞending“signals.ŽŸp¥‘!GIf–»µan›»¶application“doMÞes“not˜wish“Readline“to˜catcš²!h“âSIGWINCHá,‘ it“ma˜y‘»¶call“ârl_resize_Ž¡‘Gterminal()–Báor“ârl_set_screen_size()“áto“force“Readline“to“upMÞdate“its“idea“of“the“terminalŽ¡‘Gsize–¦fwhen“it“receiv²!es“a“âSIGWINCHá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_echo_signal_char‘yšæ(ëAinªªt‘sigæ)Ž¡‘.ùœáIf–òÊan“application›òÉwishes“to“install“its“o²!wn“signal˜handlers,‘Eãbut˜still“ha•²!v“e‘òÊReadlineŽ¡‘.ùœdispla•²!y›¨Íc“haracters–¨Îthat˜generate˜signals,‘©gcalling˜this“function˜with˜åsig‘˜åáset“to˜âSIGINTá,Ž¡‘.ùœâSIGQUITá,–¦for“âSIGTSTP“áwill“displaš²!y“the“c˜haracter“generating“that“signal.ŽŸp¥’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_resize_terminal‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáUpMÞdate–¦fReadline's“inš²!ternal“screen“size“b˜y“reading“v‘ÿdDalues“from“the“k˜ernel.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_set_screen_size‘yšæ(ëAin•ªªt›ro“ws,˜in“t˜colsæ)Ž¡‘.ùœáSet–XÅReadline's“idea›XÄof“the“terminal“size“to˜åro•²!ws›ÌGáro“ws–XÅand“åcols˜ácolumns.‘ÃüIf“either“åro²!wsŽ¡‘.ùœáor–—þåcolumns‘ áis“less“than“or›—ýequal“to“0,‘ÎReadline“doMÞesn't“c²!hange“that˜terminal“dimension.ŽŽŒ‹8ðŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—56ŽŽŽ ƒ33 ý ÌÍ‘.ùœThis–|kis›|lin²!tended“to“tell˜Readline“the“ph²!ysical˜dimensions“of“the˜terminal,‘„Ðand˜is“usedޤ 33‘.ùœinš²!ternally–Ùto“calculate“the‘Ømaxim˜um“n˜um˜bMÞer“of“c˜haracters“that“ma˜y‘ØappMÞear“on“aŽ¡‘.ùœsingle–¦fline“and“on“the“screen.Ž©F©‘!GIf–¹an“application›¸doMÞes“not“w•²!an“t–¹to“install“a˜âSIGWINCH“áhandler,‘Žbut“is˜still“in²!terested“inŽ¡‘Gthe–¦fscreen“dimensions,“it“ma²!y“query“Readline's“idea“of“the“screen“size.ŽŸF¨’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_get_screen_size‘yšæ(ëAin•ªªt›*ro“ws,˜in“t˜*colsæ)Ž¡‘.ùœáReturn–GReadline's“idea“of›Hthe“terminal's“size“in“the“v‘ÿdDariables“pMÞoin²!ted˜to“b²!y“the“argu-Ž¡‘.ùœmen²!ts.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@void‘LÉrl_reset_screen_size‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáCause–¦fReadline“to“reobtain“the“screen“size“and“recalculate“its“dimensions.ŽŸF¨‘!GThe–¦ffolloš²!wing“functions“install“and“remo˜v˜e“Readline's“signal“handlers.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_set_signals‘yšæ(ëAvªªoidæ)Ž¡‘.ùœáInstall–ÊíReadline's“signal“handler“for“âSIGINTá,–âSIGQUITá,›âSIGTERMá,“âSIGHUPá,˜âSIGALRMá,Ž¡‘.ùœâSIGTSTPá,–a¶âSIGTTINá,‘aµâSIGTTOUá,“and›‰x³HøŽ‘Ñtk˜eyá.‘ÂíIt“isolatesŽ¡‘'¿«the–ƒ,w²!ord“to“bMÞe“completed“and“calls‘ƒ+ârl_completion_matches()“áto“generate“a“list“ofŽ¡‘'¿«pMÞossible–¼?completions.‘iIt›¼@then“either˜lists“the“pMÞossible˜completions,‘Áµinserts˜the“pMÞossibleŽ¡‘'¿«completions,›ÞÎor‘mactually–m pMÞerforms“the“completion,˜depšMÞending‘mon“whic²!h“b˜eha²!vior“isŽ¡‘'¿«desired.ަ‘-2.Ž‘'¿«The–Œin²!ternal›‹function“ârl_completion_matches()˜áuses“an˜application-supplied“ågener-Ž¡‘'¿«ator‘:yáfunction›qQto–qPgenerate“the˜list“of“pMÞossible˜matc²!hes,‘¤ and˜then“returns“the˜arra²!y“ofŽ¡‘'¿«these–¯>matc²!hes.‘øfThe“caller“should“place“the“address“of“its‘¯?generator“function“in“ârl_Ž¡‘'¿«completion_entry_functioná.ŽŽŒ‹9ÿÝŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—57ŽŽŽ ƒ33 ý ÌÍ‘-3.Ž‘'¿«The–¿generator“function“is“called“repMÞeatedly“from‘¿ârl_completion_matches()á,‘íLreturningޤ 33‘'¿«a–înstring“eacš²!h“time.‘µõThe“argumen˜ts“to‘îothe“generator“function“are“åtext‘+náand“åstateá.‘µõåtextŽ¡‘'¿«áis–Ùâthe“partial“w²!ord“to“bMÞe“completed.‘xRåstate‘véáis“zero“the“ rst“time“the“function“is“called,Ž¡‘'¿«allo²!wing–Fithe›Fhgenerator“to˜pMÞerform“an²!y“necessary˜initialization,‘niand“a˜pMÞositivš²!e“in˜tegerŽ¡‘'¿«for›Íveac•²!h‘Íusubsequen“t˜call.‘S The˜generator–Íufunction˜returns“â(char‘¦f*)NULL˜áto“inform˜ârl_Ž¡‘'¿«completion_matches()–Âáthat›Áthere“are˜no“more˜pMÞossibilities“left.‘®¦Usually˜the“generatorŽ¡‘'¿«function–Ácomputes›Âthe“list˜of“pMÞossible˜completions“when˜åstate‘­Èáis˜zero,‘.¯and˜returns“themŽ¡‘'¿«one–§¶at›§µa“time“on“subsequen•²!t˜calls.‘ˆøEac“h–§¶string“the˜generator“function“returns“as˜a“matc²!hŽ¡‘'¿«m²!ust–­obšMÞe“allo˜cated“with“âmalloc()á;‘°ôReadline“frees“the“strings‘­pwhen“it“has“ nished“withŽ¡‘'¿«them.‘ž•Suc²!h›‘Ma–‘Ngenerator“function“is“referred“to˜as“an“åapplication-spMÞeci c“completionŽ¡‘'¿«functioná.Ž©´|’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_complete‘yšæ(ëAinšªªt–ignore,“in˜t“in˜v˜oking‘׉„F™œŽ‘G¼k˜eyæ)Ž¡‘.ùœáComplete–¯tthe›¯sw²!ord“at“or˜bšMÞefore“p˜oinš²!t.‘ùY‘ÿeou“ha˜v˜e“supplied›¯sthe“function“that˜doMÞes“theŽ¡‘.ùœinitial–ð™simple›ðšmatc²!hing“selection“algorithm˜(see“ârl_completion_matches()á).‘¼wTheŽ¡‘.ùœdefault–¦fis“to“do“ lename“completion.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_compentry_func_t–LÉ*“rl_completion_entry_functionŽ¡‘.ùœáThis–x‹is›xŠa“pMÞoin²!ter˜to“the˜generator“function˜for“ârl_completion_matches()á.‘y?If˜the“v‘ÿdDalueŽ¡‘.ùœof–ÎÈârl_completion_entry_function›ÎÇáis“âNULL“áthen˜Readline“uses“the˜default“ lenameŽ¡‘.ùœgenerator–5Efunction,‘Xüârl_filename_completion_function()á.‘ŠxAn“åapplication-spMÞeci cŽ¡‘.ùœcompletion–†Ëfunction›†Ìáis“a˜function“whose˜address“is˜assigned“to˜ârl_completion_entry_Ž¡‘.ùœfunction–¦fáand“whose“return“v‘ÿdDalues“are“used“to“generate“pMÞossible“completions.ŽŸ«†‘Gëg2.6.2‘d(Completion‘íMF‘þÄ£unctionsŽŽŸ³3‘GáHere–¦fis“the“complete“list“of“callable“completion“functions“presen²!t“in“Readline.ŽŸ´{’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_complete_internal‘yšæ(ëAinªªt‘what‘׉„F™œŽ–G¼to‘׉„F™œŽ“doæ)Ž¡‘.ùœáComplete–fthe“w²!ord‘fat“or“bšMÞefore“p˜oinš²!t.‘­åwhat‘Ä>‰x³HøŽ–Ñtto‘Ä>‰x³HøŽ“do‘òÑása˜ys›fwhat–fto“do“with˜the“com-Ž¡‘.ùœpletion.‘(éA‘¿cv‘ÿdDalue–¿jof“`â?á'“means“list“the“pMÞossible“completions.‘(è`âTABá'“means“do“standardŽ¡‘.ùœcompletion.‘&'`â*á'–¾~means›¾insert“all˜of“the˜pMÞossible“completions.‘&'`â!á'“means˜to“displa²!y˜allŽ¡‘.ùœof–!)the“pMÞossible“completions,‘?Úif“there“is›!*more“than“one,‘?Ùas˜w²!ell“as“pMÞerforming“partialŽ¡‘.ùœcompletion.‘Û`â@á'–Ÿ¤is›Ÿ¥similar“to˜`â!á',‘ þbut˜doMÞes˜not“list˜pMÞossible“completions˜if“the˜pMÞossibleŽ¡‘.ùœcompletions–¦fshare“a“common“pre x.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_complete‘yšæ(ëAinšªªt–ignore,“in˜t“in˜v˜oking‘׉„F™œŽ‘G¼k˜eyæ)Ž¡‘.ùœáComplete–ñèthe›ñçw²!ord“at˜or“bšMÞefore“p˜oinš²!t.‘ÀaY‘ÿeou“ha˜v˜e“supplied›ñçthe“function˜that“doMÞesŽ¡‘.ùœthe–õàinitial›õßsimple“matc²!hing“selection˜algorithm“(see˜ârl_completion_matches()“áandŽ¡‘.ùœârl_completion_entry_functioná).‘×XThe–Nädefault›Nåis“to“do˜ lename“completion.‘×XThisŽ¡‘.ùœcalls–¦fârl_complete_internal()“áwith“an“argumenš²!t“depMÞending“on“åin˜v˜oking‘Ä>‰x³HøŽ‘Ñtk˜eyá.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_possible_completions‘yšæ(ëAin•ªªt›coun“t,˜in“t˜in“v“oking‘׉„F™œŽ‘G¼k“eyæ)Ž¡‘.ùœáList–!…the“pMÞossible“completions.› O:See“description“of“ârl_complete()á.˜This“calls“ârl_Ž¡‘.ùœcomplete_internal()–¦fáwith“an“argumen²!t“of“`â?á'.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_insert_completions‘yšæ(ëAin•ªªt›coun“t,˜in“t˜in“v“oking‘׉„F™œŽ‘G¼k“eyæ)Ž¡‘.ùœáInsert– Ëthe› Êlist“of˜pMÞossible“completions˜in²!to“the˜line,‘"¤deleting˜the“partially-completedŽ¡‘.ùœw²!ord.›WâSee–Ïdescription‘Ïof“ârl_complete()á.˜This›Ïcalls“ârl_complete_internal()˜áwithŽ¡‘.ùœan–¦fargumen²!t“of“`â*á'.ŽŽŒ‹:¤Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—58ŽŽŽ ƒ33 ý ÌÍ’“z[F‘ÿeunction]ŽŽ‘Gë@int‘LÉrl_completion_mode‘yšæ(ëArl‘׉„F™œŽ–G¼command‘׉„F™œŽ“func‘׉„F™œŽ“t‘*cfuncæ)ޤ 33‘.ùœáReturns–úûthe›úúappropriate“v‘ÿdDalue˜to“pass˜to“ârl_complete_internal()˜ádepMÞending“onŽ¡‘.ùœwhether–çxåcfunc‘‘{áwš²!as“called‘çwt˜wice“in›çwsuccession“and˜the“v‘ÿdDalues˜of“the˜âshow-all-if-Ž¡‘.ùœambiguous–OŽáand‘Oâshow-all-if-unmodified“áv‘ÿdDariables.‘ÀêApplication-spMÞeci c“completionŽ¡‘.ùœfunctions–¦fmaš²!y“use“this“function“to“presen˜t“the“same“in˜terface“as“ârl_complete()á.Ž©´|’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ**“rl_completion_matches‘yšæ(ëAconst–cªªhar“*text,Ž¡‘DGrl‘׉„F™œŽ–G¼compUVenšªªtry‘׉„F™œŽ“func‘׉„F™œŽ“t‘*en˜try‘׉„F™œŽ“funcæ)Ž¡‘.ùœáReturns–Œ^an‘Œ]arraš²!y“of“strings“whic˜h›Œ]is“a“list“of˜completions“for“åtextá.‘ÄIf“there˜are“noŽ¡‘.ùœcompletions,‘C;returns–#ÝâNULLá.‘VCThe›#Þ rst“en²!try“in“the˜returned“arra²!y“is˜the“substitutionŽ¡‘.ùœfor–)Gåtextá.›´(The“remaining“en²!tries“are“the“pMÞossible“completions.˜The“arra²!y“is“terminatedŽ¡‘.ùœwith–¦fa“âNULL“ápMÞoin²!ter.ŽŸö‘.ùœåen²!try‘Ä>‰x³HøŽ‘Ñtfunc‘hoáis–¾la›¾kfunction“of˜t•²!w“o˜args,‘mand˜returns˜a–¾lâchar‘¦f*á.‘%íThe˜ rst“argumen²!t˜isŽ¡‘.ùœåtextá.‘××The–¤dsecond“is“a“state›¤eargumen²!t;‘#bit“is“zero˜on“the“ rst“call,‘ããand“non-zero“onŽ¡‘.ùœsubsequen•²!t›~calls.‘#åen“try‘Ä>‰x³HøŽ‘Ñtfunc‘º‚áreturns˜a‘}âNULL˜ápMÞoin“ter–}to˜the˜caller“when˜there“are˜noŽ¡‘.ùœmore‘¦fmatc²!hes.ަ’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ*“rl_filename_completion_function‘yšæ(ëAconst–cšªªhar“*text,“in˜tŽ¡‘DGstateæ)Ž¡‘.ùœáA‘‹generator–±function›°for“ lename˜completion“in˜the“general˜case.‘¬öåtext‘P±áis˜a“partial˜ le-Ž¡‘.ùœname.‘‚UThe–“ÏBash›“Îsource“is˜a“useful˜reference“for˜writing“application-spMÞeci c˜completionŽ¡‘.ùœfunctions–¦f(the“Bash“completion“functions“call“this“and“other“Readline“functions).ŽŸ´{’“z[F‘ÿeunction]ŽŽ‘Gë@char–LÉ*“rl_username_completion_function‘yšæ(ëAconst–cšªªhar“*text,“in˜tŽ¡‘DGstateæ)Ž¡‘.ùœáA‘l&completion–l4generator›l5for“usernames.‘Êxåtext‘©4ácon²!tains˜a“partial˜username“preceded˜b²!yŽ¡‘.ùœa–«ºrandom›«»c²!haracter“(usually“`â~á').‘íÚAs˜with“all“completion˜generators,‘­åstate‘HÁáis˜zero“onŽ¡‘.ùœthe–¦f rst“call“and“non-zero“for“subsequen²!t“calls.ŽŸ«†‘Gëg2.6.3‘d(Completion‘íMV‘þÄ£ariablesŽŽŸ^¹’–3á[V‘ÿeariable]ŽŽ‘Gë@rl_compentry_func_t–LÉ*“rl_completion_entry_functionŽ¡‘.ùœáA‘{pMÞoin²!ter‘’to–“the“generator“function“for“ârl_completion_matches()á.‘ûdâNULL“ámeans“toŽ¡‘.ùœuse–¦fârl_filename_completion_function()á,“the“default“ lename“completer.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_completion_func_t–LÉ*“rl_attempted_completion_functionŽ¡‘.ùœáA‘,„pMÞoinš²!ter–,§to‘,¦an“alternativ˜e›,¦function“to˜create“matc²!hes.‘pŸThe˜function“is˜called“withŽ¡‘.ùœåtextá,‘ô1åstartá,‘ô0and–~<åendá.‘ e_åstart‘»<áand“åend‘ìŽáare‘~;indices“in“ârl_line_buffer“áde ning“theŽ¡‘.ùœbMÞoundaries–£tof“åtextá,‘â·whicš²!h“is“a“c˜haracter‘£ustring.‘ÕIf“this“function“exists“and“returnsŽ¡‘.ùœâNULLá,‘ or–Îif“this›Îv‘ÿdDariable“is“set“to˜âNULLá,‘ then˜ârl_complete()“áwill“call“the˜v‘ÿdDalue“ofŽ¡‘.ùœârl_completion_entry_function–.íáto›.ìgenerate“matc²!hes,‘FÑotherwise“completion˜will“useŽ¡‘.ùœthe–Ëarra²!y“of“strings“this“function“returns.‘š If“this“function“sets“the“ârl_attempted_Ž¡‘.ùœcompletion_over–­áv›ÿdDariable“to“a“non-zero–­v˜alue,‘®»Readline“will–­not“pMÞerform“its“defaultŽ¡‘.ùœcompletion–¦fevš²!en“if“this“function“returns“no“matc˜hes.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_quote_func_t–LÉ*“rl_filename_quoting_functionŽ¡‘.ùœáA‘è–pMÞoin²!ter›è¦to–è§a“function˜that“will“quote“a˜ lename“in“an˜application-spMÞeci c“fashion.Ž¡‘.ùœReadline–%bcalls›%cthis“function˜during“ lename“completion˜if“one“of˜the“c²!haracters˜in“ârl_Ž¡‘.ùœfilename_quote_characters–œµáappMÞears›œ¶in“a˜completed“ lename.‘…NThe“function˜is“calledŽŽŒ‹;ªŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—59ŽŽŽ ƒ33 ý ÌÍ‘.ùœwith›Üåtextá,‘îåmatc•²!h‘Ä>‰x³HøŽ‘Ñtt“yp•MÞeá,‘íand˜åquote‘Ä>‰x³HøŽ‘Ñtp“oin²!terá.‘š–The˜åtext‘áis˜the‘Ü lename˜to˜b“e˜quoted.‘š–Theޤ 33‘.ùœåmatc•²!h‘Ä>‰x³HøŽ‘Ñtt“ypMÞe‘Auáis–¤neither›¤oâSINGLE_MATCHá,‘¤Óif“there“is“only“one˜completion“matc²!h,‘¤Óor“âMULT_Ž¡‘.ùœMATCHá.‘ˆ•Some–‰øfunctions›‰ùuse“this˜to“decide˜whether“or˜not“to˜insert“a˜closing“quoteŽ¡‘.ùœc•²!haracter.‘7)The›nÔåquote‘Ä>‰x³HøŽ‘ÑtpMÞoin“ter‘7þáis˜a‘nÕpMÞoin“ter˜to‘nÕan“y˜opMÞening‘nÕquote˜c“haracter‘nÕthe˜userŽ¡‘.ùœtš²!ypMÞed.‘ uSome–.functions“c˜hoMÞose“to“reset‘. this“c˜haracter“if“they“decide“to“quote“theŽ¡‘.ùœ lename–Œyin‘Œxa“di erenš²!t“st˜yle.‘Õ8It's“preferable“to“preserv˜e›Œxthe“user's“quoting“as˜m•²!uc“h‘ŒyasŽ¡‘.ùœpMÞossible–¦f{“it's“less“disruptiv²!e.Ž© ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_dequote_func_t–LÉ*“rl_filename_dequoting_functionŽ¡‘.ùœáA‘޼pMÞoin²!ter›ŽÃto–ŽÂa“function“that˜will“remo•²!v“e–ŽÂapplication-spMÞeci c“quoting˜c²!haracters“fromŽ¡‘.ùœa–”ê lename“bMÞefore“attempting“completion,‘Њso“those“cš²!haracters“do“not“in˜terfere“withŽ¡‘.ùœmatc²!hing–Í the“text›Í against“names“in“the˜ lesystem.‘QÉIt˜is“called“with“åtextá,‘Ö²the“text“ofŽ¡‘.ùœthe–à%w²!ord›à&to“bMÞe˜dequoted,‘Ëand˜åquote‘Ä>‰x³HøŽ‘Ñtc•²!hará,‘Ìwhic“h–à%is“the˜quoting“c²!haracter˜that“delimitsŽ¡‘.ùœthe–Æ@ lename“(usually“`â'á'“or“`â"á').‘“%If“åquote‘Ä>‰x³HøŽ‘Ñtcš²!har‘iáis“zero,‘óthe‘Æ? lename“w˜as“not“in“a“quotedŽ¡‘.ùœstring.ŽŸŸ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_linebuf_func_t–LÉ*“rl_char_is_quoted_pŽ¡‘.ùœáA‘„ðpMÞoin²!ter–„ùto›„øa“function˜to“call˜that“determines“whether˜or“not˜a“spMÞeci c˜c²!haracter“inŽ¡‘.ùœthe–/Üline“bu er›/Ýis“quoted,‘R:according“to“whatev²!er“quoting˜mec²!hanism“the“applicationŽ¡‘.ùœuses.‘¶The–0€function›0is“called˜with“t•²!w“o˜argumen“ts:‘¢êåtextá,‘Hthe˜text–0€of˜the“line,‘Hand˜åindexá,Ž¡‘.ùœthe–¤¬index›¤­of“the˜c²!haracter“in“the˜line.‘ÝJIt“is˜used“to“decide˜whether“a˜c²!haracter“foundŽ¡‘.ùœin–çârl_completer_word_break_characters›çáshould“bMÞe“used˜to“break“w²!ords˜for“theŽ¡‘.ùœcompleter.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_compignore_func_t–LÉ*“rl_ignore_some_completions_functionŽ¡‘.ùœáReadline–¬calls“this“function,›Ë=if“de ned,˜when‘« lename“completion“is“done,˜after“allŽ¡‘.ùœthe–yÿmatcš²!hing‘yþnames“ha˜v˜e“bMÞeen›yþgenerated.‘X§It“is“passed˜a“âNULL“áterminated˜arra²!y“ofŽ¡‘.ùœmatc•²!hes.‘¡-The›’+ rst‘’,elemen“t˜(âmatches[0]á)˜is˜the–’,maximal˜substring˜common“to˜allŽ¡‘.ùœmatc²!hes.‘6This–ÃÐfunction›ÃÏcan“re-arrange˜the“list“of˜matc²!hes“as“required,‘Ë*but˜m²!ust“freeŽ¡‘.ùœeac•²!h›¦felemen“t˜it˜deletes˜from˜the˜arra“y‘ÿe.ŽŸŸ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_icppfunc_t–LÉ*“rl_directory_completion_hookŽ¡‘.ùœáThis–¬|function,›Þwif“de ned,˜is“allo•²!w“ed–¬|to“mošMÞdify‘¬{the“directory“p˜ortion“of‘¬{ lenames“duringŽ¡‘.ùœcompletion.‘”‹It–Êpcould›ÊobMÞe“used˜to“expand˜sym²!bMÞolic“links˜or“shell˜v‘ÿdDariables“in˜pathnames.Ž¡‘.ùœIt–qÃis“called“with“the“address“of“a‘qÂstring“(the“currenš²!t“directory“name)“as“an“argumen˜t,Ž¡‘.ùœand–¾˜ma²!y“moMÞdify“that“string.‘&sIf“the“function“replaces“the“string“with“a“new“string,‘ĤitŽ¡‘.ùœshould–Â9free“the›Â:old“v‘ÿdDalue.‘1VAn²!y˜moMÞdi ed“directory“name“should“ha•²!v“e˜a–Â9trailing“slash.Ž¡‘.ùœThe–•ïmošMÞdi ed“v‘ÿdDalue‘•ðwill“b˜e“used“as‘•ðpart“of“the“completion,‘ÑÒreplacing“the“directoryŽ¡‘.ùœpšMÞortion–µçof“the“pathname“the“user“t•²!yp˜ed.‘ `A“t–µçthe“least,‘ùÇev²!en“if“no“other“expansionŽ¡‘.ùœis–¦8pMÞerformed,‘æ+this“function“should“remo•²!v“e›¦7an“y–¦8quote“c²!haracters“from˜the“directoryŽ¡‘.ùœname,–¦fbšMÞecause“its“result“will“b˜e“passed“directly“to“âopendir()á.ŽŸ¢é‘.ùœThe–directory“completion›ÿhoMÞok“returns“an“in²!teger˜that“should“bMÞe“non-zero˜if“the“func-Ž¡‘.ùœtion–õmoMÞdi es“its›ödirectory“argumen²!t.‘;‹The“function“should“not˜moMÞdify“the“directoryŽ¡‘.ùœargumen²!t–¦fif“it“returns“0.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_icppfunc_t–LÉ*“rl_directory_rewrite_hook;Ž¡‘.ùœáIf–&ßnon-zero,‘†üthis“is“the›&Þaddress“of“a“function˜to“call“when“completing˜a“directoryŽ¡‘.ùœname.‘)©This–jUfunction“tak²!es“the“address“of›jTthe“directory“name“to“b•MÞe˜mo“di ed–jUas“anŽŽŒ‹</îŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—60ŽŽŽ ƒ33 ý ÌÍ‘.ùœargumen•²!t.‘žUnlik“e–²¦ârl_directory_completion_hooká,‘õ·it“only“moMÞdi es‘²§the“directoryޤ 33‘.ùœname–‚Žused“in“âopendir()á,‘¹—not“what“Readline“displaš²!ys“when‘‚it“prin˜ts“or“inserts“theŽ¡‘.ùœpšMÞossible–=completions.‘ñbReadline“calls“this“b˜efore“rl‘Ä>‰x³HøŽ–Ñtdirectory‘Ä>‰x³HøŽ“completion‘Ä>‰x³HøŽ“ho˜ok.‘ñbA²!tŽ¡‘.ùœthe–7…least,›[Íev²!en“if“no“other“expansion“is“pMÞerformed,˜this“function“should“remo•²!v“e‘7…an“yŽ¡‘.ùœquote–#^c²!haracters“from“the“directory“name,‘BœbšMÞecause‘#_its“result“will“b˜e“passed“directlyŽ¡‘.ùœto‘¦fâopendir()á.Ž©g‘.ùœThe–Œ*directory›Œ+rewrite“hoMÞok˜returns“an˜in²!teger“that˜should“bMÞe˜non-zero“if˜the“func-Ž¡‘.ùœtion–õmoMÞdi es“its›ödirectory“argumen²!t.‘;‹The“function“should“not˜moMÞdify“the“directoryŽ¡‘.ùœargumen²!t–¦fif“it“returns“0.ŽŸÙœ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_icppfunc_t–LÉ*“rl_filename_stat_hookŽ¡‘.ùœáIf–?non-zero,‘Ÿthis“is“the›>address“of“a“function˜for“the“completer“to˜call“bMÞefore“decidingŽ¡‘.ùœwhic•²!h›ác“haracter–âto˜appMÞend˜to“a˜completed˜name.‘ÛThis˜function˜moMÞdi es“its˜ lenameŽ¡‘.ùœname–¸–argumen²!t,‘½#and“Readline“passes›¸—the“moMÞdi ed“v‘ÿdDalue˜to“âstat()“áto˜determine“theŽ¡‘.ùœ le's–×Rtš²!ypMÞe“and‘×Sc˜haracteristics.‘˜ÖThis“function›×SdoMÞes“not“need“to˜remo•²!v“e–×Rquote“c²!haractersŽ¡‘.ùœfrom–¦fthe“ lename.ަ‘.ùœThe–Ô stat“hošMÞok“returns“an“in²!teger“that‘Ô should“b˜e“non-zero“if“the“function“mo˜di esŽ¡‘.ùœits›¿Ãdirectory–¿Âargumen²!t.‘)óThe“function˜should˜not“moMÞdify˜the“directory˜argumen²!t“if˜itŽ¡‘.ùœreturns‘¦f0.ŽŸÙœ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_dequote_func_t–LÉ*“rl_filename_rewrite_hookŽ¡‘.ùœáIf–ÃÐnon-zero,‘Ë*this›ÃÏis“the˜address“of˜a“function“for˜Readline“to˜call“when˜reading“direc-Ž¡‘.ùœtory–÷@en²!tries“from“the“ lesystem“for“completion‘÷?and“comparing“them“to“the“ lenameŽ¡‘.ùœpMÞortion–G*of›G)the“partial“w²!ord˜bšMÞeing“completed.‘¾It“mo˜di es‘G)the“ lesystem“en²!tries,‘Z5as“op-Ž¡‘.ùœpšMÞosed–¡to‘¢ârl_completion_rewrite_hooká,‘pwhic²!h“mo˜di es›¢the“w²!ord˜bMÞeing“completed.Ž¡‘.ùœThe–%function‘%takš²!es“t˜w˜o“argumen˜ts:‘Û2åfnameá,‘Dºthe“ lename‘%to“bMÞe“con˜v˜erted,‘D»and“åfnlená,Ž¡‘.ùœits–p©length‘p¨in“bš²!ytes.‘<¤It“m˜ust“either›p¨return“its˜ rst“argumen²!t˜(if“no˜con•²!v“ersion‘p©tak“esŽ¡‘.ùœplace)–ÞAor›ÞBthe“con•²!v“erted˜ lename–ÞAin˜newly-alloMÞcated“memory‘ÿe.‘…oThe˜function“shouldŽ¡‘.ùœpMÞerform–$’an²!y›$‘necessary“application“or˜system-spMÞeci c“con•²!v“ersion–$’on˜the“ lename,‘>‰suc²!hŽ¡‘.ùœas›8con•²!v“erting‘9bMÞet“w“een˜c“haracter˜sets‘9or˜con“v“erting˜from˜a–9 lesystem˜format˜to“a˜c²!har-Ž¡‘.ùœacter–…6input›…5format.‘zLReadline“compares“the˜con•²!v“erted–…6form˜against“the“w²!ord˜to“bMÞeŽ¡‘.ùœcompleted,–a¸and,“if–‰x³HøŽ›Ñtmatc“hesá,‘¼Þâint‘¸_åmax‘Ä>‰x³HøŽ˜lengthá)–¸`where“åmatcš²!hes‘+âáis‘¸_the“arra˜y“of‘¸_matc˜hing“strings,Ž¡‘.ùœån•²!um‘Ä>‰x³HøŽ‘Ñtmatc“hes‘ù2áis›…±the‘…°n“um“bMÞer˜of–…°strings˜in“that˜arra²!y‘ÿe,‘½‚and˜åmax‘Ä>‰x³HøŽ‘Ñtlength“áis˜the“lengthŽ¡‘.ùœof–Ä„the“longest“string‘Ä…in“that“arraš²!y‘ÿe.‘87Readline“pro˜vides‘Ä…a“con˜v˜enience“function,‘ ârl_Ž¡‘.ùœdisplay_match_listá,‘y¥that–étakš²!es“care“of‘èÿdoing“the“displa˜y“to‘èÿReadline's“outputŽ¡‘.ùœstream.‘ÝÝY‘ÿeou–¦fma²!y“call“that“function“from“this“hoMÞok.Ž©s4’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_basic_word_break_charactersŽ¡‘.ùœáThe–Oobasic“list“of“cš²!haracters“that“signal‘Ona“break“bMÞet˜w˜een“w˜ords“for“the“completerŽ¡‘.ùœroutine.‘M¼The–v[default“v›ÿdDalue“of“this‘v\v˜ariable“is“the“cš²!haracters“whic˜h“break“w˜ords“forŽ¡‘.ùœcompletion–¦fin“Bash:‘ÝÝâ"“\t\n\"\\'`@$><=;|&{("á.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_basic_quote_charactersŽ¡‘.ùœáA‘Ï list–Ïof“quote‘Ïcš²!haracters“whic˜h›Ïcan“cause“a˜w²!ord“break.‘WïThe“default˜v‘ÿdDalue“includesŽ¡‘.ùœsingle–¦fand“double“quotes.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_completer_word_break_charactersŽ¡‘.ùœáThe–Ïlist“of“cš²!haracters“that“signal‘Ï~a“break“bMÞet˜w˜een“w˜ords“for“ârl_complete_Ž¡‘.ùœinternal()á.‘2ÅThese–´cš²!haracters‘³determine“ho˜w›³Readline“decides˜what“to˜complete.Ž¡‘.ùœThe–¦fdefault“list“is“the“v‘ÿdDalue“of“ârl_basic_word_break_charactersá.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@rl_cpvfunc_t–LÉ*“rl_completion_word_break_hookŽ¡‘.ùœáIf–Èënon-zero,‘ÑŒthis›Èêis“the“address˜of“a“function“to˜call“when“Readline“is˜deciding“whereŽ¡‘.ùœto–¡separate‘¢wš²!ords“for“w˜ord“completion.‘FIt“should‘¢return“a“c˜haracter“string‘¢lik˜e“ârl_Ž¡‘.ùœcompleter_word_break_characters–ôëáto“bšMÞe“used“to“p˜erform“the“curren²!t“completion.Ž¡‘.ùœThe–øMfunction“ma•²!y›øLc“hoMÞose–øMto“set“ârl_completer_word_break_characters˜áitself.‘£ÕIf“theŽ¡‘.ùœfunction–¦freturns“âNULLá,“Readline“uses“ârl_completer_word_break_charactersá.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_completer_quote_charactersŽ¡‘.ùœáA‘ Clist– ^of“c•²!haracters› ]whic“h– ^can“bMÞe˜used“to“quote˜a“substring“of˜the“line.‘ÄCompletionŽ¡‘.ùœoMÞccurs–É)on›É*the“en²!tire“substring,‘õiand˜within“the“substring,‘õiârl_completer_word_break_Ž¡‘.ùœcharacters–8\áare›8[treated“as“an²!y“other˜c²!haracter,‘\Ùunless“they“also“appMÞear˜within“thisŽ¡‘.ùœlist.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_filename_quote_charactersŽ¡‘.ùœáA‘3Blist›3gof–3fc²!haracters“that˜cause“Readline˜to“quote˜a“ lename“when˜they“appMÞear˜in“aŽ¡‘.ùœcompleted–¦f lename.‘ÝÝThe“default“is“the“n²!ull“string.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@const–LÉchar“*“rl_special_prefixesŽ¡‘.ùœáThe–S­list›S¬of“c²!haracters“that“are˜wš²!ord“break“c˜haracters,‘d8but›S¬should“bMÞe“left“in˜åtext‘­áwhenŽ¡‘.ùœit–ô¡is“passed“to“the›ô¢completion“function.‘¢›Programs“can“use˜this“to“help“determine“whatŽ¡‘.ùœkind–Uíof›Uîcompleting“to˜do.‘à F‘ÿeor“instance,‘fBash“sets“this˜v‘ÿdDariable“to“â"á$@â"˜áso“that˜it“canŽ¡‘.ùœcomplete–¦fshell“v‘ÿdDariables“and“hostnames.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_query_itemsŽ¡‘.ùœáThis–úÈdetermines“the“maximš²!um“n˜um˜bšMÞer“of‘úÇitems“that“p˜ossible-completions“will“displa²!yŽ¡‘.ùœunconditionally‘ÿe.‘»MIf–ð6there“are“more“pMÞossible‘ð5completions“than“this,‘ªReadline“asks“theŽŽŒ‹>RâŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—62ŽŽŽ ƒ33 ý ÌÍ‘.ùœuser–@for“con rmation›@bMÞefore“displa²!ying“them.‘ª¬The“default“v‘ÿdDalue“is˜100.‘ª«A‘?Ùnegativ²!eޤ 33‘.ùœv‘ÿdDalue–¦findicates“that“Readline“should“nev²!er“ask“for“con rmation.Ž©s4’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_append_characterŽ¡‘.ùœáWhen–ÎXa‘ÎYsingle“completion“alternativš²!e“matc˜hes›ÎYat“the“end“of˜the“command“line,Ž¡‘.ùœReadline–¶¶appMÞends“this›¶µc²!haracter“to“the“inserted˜completion“text.‘ÍThe˜default“is“aŽ¡‘.ùœspace›$oc²!haracter–$p(`‘¦f').‘WùSetting“this˜to˜the“n•²!ull˜c“haracter‘$p(`â\0á')˜prev“en“ts‘$pan“ything˜bMÞe-Ž¡‘.ùœing›à*appMÞended–à)automatically‘ÿe.‘‹(This“can˜bMÞe“c²!hanged˜in“application-spMÞeci c˜completionŽ¡‘.ùœfunctions–¤?to“proš²!vide‘¤>the“\most“sensible“w˜ord“separator“c˜haracter"‘¤>according“to“anŽ¡‘.ùœapplication-spšMÞeci c–šËcommand‘šÌline“syn²!tax“sp˜eci cation.‘ÙÿIt“is›šÌset“to“the˜default“bMÞeforeŽ¡‘.ùœcalling–A÷an²!y›Aøapplication-spMÞeci c“completion˜function,‘V and“ma²!y˜only“bMÞe˜c²!hanged“withinŽ¡‘.ùœsuc²!h–¦fa“function.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_suppress_appendŽ¡‘.ùœáIf–ï¹non-zero,‘BReadline›ï¸will“not“appMÞend“the˜årl‘Ä>‰x³HøŽ–Ñtcompletion‘Ä>‰x³HøŽ“appMÞend‘Ä>‰x³HøŽ“c•²!haracter‘¸âáto‘ï¹matc“hesŽ¡‘.ùœat–Éthe›Éend“of˜the“command˜line,‘ѯas˜describšMÞed“ab˜o•²!v“e.‘E¾It–Éis›Éset“to˜0“bMÞefore˜calling“an²!yŽ¡‘.ùœapplication-spšMÞeci c–`:completion“function,‘ίand“ma²!y“only“b˜e“cš²!hanged“within“suc˜h“aŽ¡‘.ùœfunction.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_suppress_quoteŽ¡‘.ùœáIf–àDnon-zero,‘î»Readline›àCdoMÞes“not˜appMÞend“a“matc²!hing˜quote“c²!haracter˜when“pMÞerformingŽ¡‘.ùœcompletion–d0on“a“quoted›d/string.‘;It“is“set“to“0˜bšMÞefore“calling“an²!y“application-sp˜eci cŽ¡‘.ùœcompletion–¦ffunction,“and“maš²!y“only“bMÞe“c˜hanged“within“suc˜h“a“function.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_found_quoteŽ¡‘.ùœáWhen–ÌúReadline“is“completing›Ìûquoted“text,‘ÖŸit“sets“this“v‘ÿdDariable“to˜a“non-zero“v‘ÿdDalue“ifŽ¡‘.ùœthe–‡¿wš²!ord‘‡¾bMÞeing“completed“con˜tains‘‡¾or“is“delimited“b˜y‘‡¾an˜y“quoting“c˜haracters,‘ÁincludingŽ¡‘.ùœbacš²!kslashes.‘ÝÝThis–¦fis“set“bMÞefore“calling“an˜y“application-spMÞeci c“completion“function.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_quote_characterŽ¡‘.ùœáWhen–X;Readline“is›X:completing“quoted“text,‘„°as˜delimited“b²!y“one“of˜the“c²!haracters“inŽ¡‘.ùœårl‘Ä>‰x³HøŽ–Ñtcompleter‘Ä>‰x³HøŽ“quote‘Ä>‰x³HøŽ“c²!haractersá,‘Š it–‚ósets›‚òthis“v‘ÿdDariable“to“the“quoting˜c²!haracter“it“found.Ž¡‘.ùœThis–¦fis“set“bšMÞefore“calling“an²!y“application-sp˜eci c“completion“function.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_mark_symlink_dirsŽ¡‘.ùœáIf––õnon-zero,‘š Readline“appMÞends›–öa“slash“to˜completed“ lenames“that“are˜sym²!bMÞolic“linksŽ¡‘.ùœto–ærdirectory›æsnames,‘ Ösub‘›»ject“to“the˜v‘ÿdDalue“of“the“user-settable˜åmark-directories‘Yôáv‘ÿdDariable.Ž¡‘.ùœThis–Imv‘ÿdDariable“exists“so“that“application-spMÞeci c“completion“functions“can“o•²!v“erride‘ImtheŽ¡‘.ùœuser's–Зglobal“preference“(set“via‘Жthe“åmark-symlink²!ed-directories‘DáReadline“v‘ÿdDariable)“ifŽ¡‘.ùœappropriate.‘¥This›‹¿v‘ÿdDariable–‹¾is“set“to˜the“user's“preference“bMÞefore˜calling“an²!y“application-Ž¡‘.ùœspMÞeci c›]acompletion–]bfunction,‘kûso“unless˜that˜function˜moMÞdi es“the˜v‘ÿdDalue,‘küReadline˜willŽ¡‘.ùœhonor–¦fthe“user's“preferences.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_ignore_completion_duplicatesŽ¡‘.ùœáIf–^non-zero,‘lŒthen“Readline“remo•²!v“es–^duplicates“in“the‘^set“of“pMÞossible“completions.‘ÅÂTheŽ¡‘.ùœdefault–¦fis“1.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_filename_completion_desiredŽ¡‘.ùœáA‘Ånon-zero–&v‘ÿdDalue“means“that›%Readline“should“treat˜the“results“of“the˜matc²!hes“asŽ¡‘.ùœ lenames.‘‡iThis–£ is“äalways‘‰"ázero›£ when“completion“is“attempted,‘Öéand“can˜only“bMÞe“c²!hangedŽŽŒ‹?b¼Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—63ŽŽŽ ƒ33 ý ÌÍ‘.ùœwithin–Ìgan“application-spMÞeci c“completion›Ìffunction.‘OàIf“it“is“set˜to“a“non-zero“v‘ÿdDalueޤ 33‘.ùœb•²!y›Ä\suc“h–Ä]a˜function,‘ ÚReadline˜appMÞends“a˜slash“to˜directory“names˜and“attempts˜toŽ¡‘.ùœquote–completed“ lenames‘if“they“conš²!tain“an˜y‘c˜haracters“in“ârl_filename_quote_Ž¡‘.ùœcharacters–¦fáand“ârl_filename_quoting_desired“áis“set“to“a“non-zero“v‘ÿdDalue.Ž© ë’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_filename_quoting_desiredŽ¡‘.ùœáA‘°Unon-zero–°Xv‘ÿdDalue“means“that“Readline“should“quote“the“results“of“the“matc²!hes“usingŽ¡‘.ùœdouble–wquotes“(or›wŒan“application-spMÞeci c“quoting“mec²!hanism)“if˜the“completed“ le-Ž¡‘.ùœname›ûScon•²!tains‘ûRan“y˜c“haracters–ûRin˜ârl_filename_quote_charsá.‘¤ÖThis˜is“äalways‘ákánon-zeroŽ¡‘.ùœwhen–ÀÖcompletion“is“attempted,‘îÀand“can“only“bšMÞe“c²!hanged“within“an“application-sp˜eci cŽ¡‘.ùœcompletion–ïèfunction.‘ºbThe›ïçquoting“is“pMÞerformed˜via“a“call˜to“the“function˜pMÞoin²!ted“toŽ¡‘.ùœb²!y‘¦fârl_filename_quoting_functioná.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_full_quoting_desiredŽ¡‘.ùœáA‘a°non-zero–aÂv‘ÿdDalue›aÁmeans“that˜Readline“should˜apply“ lename-st²!yle˜quoting,‘o|includingŽ¡‘.ùœanš²!y–þ¸application-spMÞeci ed“quoting“mec˜hanism,‘Ìto“all“completion‘þ·matc˜hes“ev˜en“if“it“isŽ¡‘.ùœnot–<~otherwise“treating‘<the“matc²!hes“as“ lenames.‘ &This“is“äalways‘"—ázero“when“comple-Ž¡‘.ùœtion–Q is›Qattempted,‘band“can“only˜bMÞe“c²!hanged˜within“an˜application-spMÞeci c“completionŽ¡‘.ùœfunction.‘ eþThe–)quoting›)is“pMÞerformed“via“a˜call“to“the˜function“pMÞoin²!ted“to˜b²!y“ârl_Ž¡‘.ùœfilename_quoting_functioná.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_attempted_completion_overŽ¡‘.ùœáIf– Oan“application-spMÞeci c“completion‘ Ofunction“assigned“to“ârl_attempted_Ž¡‘.ùœcompletion_function–básets›bŒthis“v‘ÿdDariable“to˜a“non-zero“v‘ÿdDalue,‘•Readline˜will“notŽ¡‘.ùœpMÞerform–Žºits“default“ lename“completion‘޹ev²!en“if“the“application's“completion“functionŽ¡‘.ùœreturns–¦fno“matcš²!hes.‘ÝÝIt“should“bMÞe“set“only“b˜y“an“application's“completion“function.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_sort_completion_matchesŽ¡‘.ùœáIf–”Ôan›”Óapplication“sets˜this“v‘ÿdDariable˜to“0,‘˜WReadline“will˜not“sort˜the“list˜of“completionsŽ¡‘.ùœ(whicš²!h–òÍimplies“that‘òÎit“cannot“remo˜v˜e“an˜y›òÎduplicate“completions).‘¡ÿThe˜default“v‘ÿdDalue“isŽ¡‘.ùœ1,›ÅÖwhic²!h–¿Œmeans“that“Readline“will“sort“the“completions“and,˜depMÞending“on“the“v‘ÿdDalueŽ¡‘.ùœof–¦fârl_ignore_completion_duplicatesá,“will“attempt“to“remo•²!v“e–¦fduplicate“matc²!hes.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_typeŽ¡‘.ùœáSet– ´to“a“cš²!haracter“describing“the“t˜ypMÞe‘ µof“completion“Readline“is“curren˜tly“attempting;Ž¡‘.ùœsee–þ@the“description›þAof“ârl_complete_internal()“á(see“Section˜2.6.2“[Completion“F‘ÿeunc-Ž¡‘.ùœtions],‘×Ôpage–Íñ57)“for›Íòthe“list“of“c²!haracters.‘TThis“is“set“to“the˜appropriate“v‘ÿdDalue“bMÞeforeŽ¡‘.ùœcalling–¯;anš²!y“application-spMÞeci c“completion“function,‘ñpso“these“functions“can“presen˜tŽ¡‘.ùœthe–¦fsame“in²!terface“as“ârl_complete()á.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_completion_invoking_keyŽ¡‘.ùœáSet–äRto›äQthe“ nal˜c²!haracter“in˜the“k²!ey“sequence˜that“in•²!v“ok“ed˜one–äRof˜the“completionŽ¡‘.ùœfunctions–that“call“ârl_complete_internal()á.‘o(This“is“set“to“the“appropriate“v‘ÿdDalueŽ¡‘.ùœbšMÞefore–¦fcalling“an²!y“application-sp˜eci c“completion“function.ަ’–3[V‘ÿeariable]ŽŽ‘Gë@int‘LÉrl_inhibit_completionŽ¡‘.ùœáIf–WWthis“v‘ÿdDariable‘WVis“non-zero,‘Ã’Readline“došMÞes“not“p˜erform–WVcompletion,‘Óevš²!en“if–WWa“k˜eyŽ¡‘.ùœbinding–¶Îindicates›¶Íit“should.‘The“completion“c²!haracter“is˜inserted“as“if“it˜w²!ere“bMÞoundŽ¡‘.ùœto‘¦fâself-insertá.ŽŽŒ‹@rïŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—64ŽŽŽ ƒ33 ý ÌÍ‘Gëg2.6.4‘d(A–íMShort“Completion“ExampleŽŽŸ³3‘GáHere–}ais“a›}`small“application“demonstrating“the˜use“of“the“GNU‘}VReadline“library‘ÿe.‘Ð0It“is“calledޤ 33‘Gâfilemaná,‘ 0and–ÃÕthe“source‘ÃÔcoMÞde“resides“in“âexamples/fileman.cá.‘6)This“sample“applicationŽ¡‘Gpro²!vides–¦fcommand“name“completion,“line“editing“features,“and“access“to“the“history“list.ŽŽŒ‹A‚`Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—65ŽŽŽ ƒ33 ý ÌÍ‘.ùœÉ/*–¹–fileman.c“--“A“tiny“application“which“demonstrates“how“to“use“theޤ €‘=&^GNU–¹–Readline“library.‘ s,This“application“interactively“allows“usersŽ¡‘=&^to–¹–manipulate“files“and“their“modes.“*/Ž©‘.ùœ#ifdef‘¹–HAVE_CONFIG_HŽ¡‘.ùœ#‘ s,include‘¹–Ž¡‘.ùœ#endifަ‘.ùœ#include‘¹–Ž¡‘.ùœ#ifdef‘¹–HAVE_SYS_FILE_HŽ¡‘.ùœ#‘ s,include‘¹–Ž¡‘.ùœ#endifŽ¡‘.ùœ#include‘¹–ަ‘.ùœ#ifdef‘¹–HAVE_UNISTD_HŽ¡‘.ùœ#‘ s,include‘¹–Ž¡‘.ùœ#endifަ‘.ùœ#include‘¹–Ž¡‘.ùœ#include‘¹–Ž¡‘.ùœ#include‘¹–Ž¡‘.ùœ#include‘¹–ަ‘.ùœ#if–¹–defined“(HAVE_STRING_H)Ž¡‘.ùœ#‘ s,include‘¹–Ž¡‘.ùœ#else–¹–/*“!HAVE_STRING_H“*/Ž¡‘.ùœ#‘ s,include‘¹–Ž¡‘.ùœ#endif–¹–/*“!HAVE_STRING_H“*/ަ‘.ùœ#ifdef‘¹–HAVE_STDLIB_HŽ¡‘.ùœ#‘ s,include‘¹–Ž¡‘.ùœ#endifަ‘.ùœ#include‘¹–ަ‘.ùœ#include‘¹–Ž¡‘.ùœ#include‘¹–ަ‘.ùœextern–¹–char“*xmalloc“PARAMS((size_t));ަ‘.ùœ/*–¹–The“names“of“functions“that“actually“do“the“manipulation.“*/Ž¡‘.ùœint–¹–com_list“PARAMS((char“*));Ž¡‘.ùœint–¹–com_view“PARAMS((char“*));Ž¡‘.ùœint–¹–com_rename“PARAMS((char“*));Ž¡‘.ùœint–¹–com_stat“PARAMS((char“*));Ž¡‘.ùœint–¹–com_pwd“PARAMS((char“*));Ž¡‘.ùœint–¹–com_delete“PARAMS((char“*));Ž¡‘.ùœint–¹–com_help“PARAMS((char“*));Ž¡‘.ùœint–¹–com_cd“PARAMS((char“*));Ž¡‘.ùœint–¹–com_quit“PARAMS((char“*));ަ‘.ùœ/*–¹–A“structure“which“contains“information“on“the“commands“this“programŽ¡‘=&^can–¹–understand.“*/ަ‘.ùœtypedef–¹–struct“{Ž¡‘8lÈchar–¹–*name;“/*“User“printable“name“of“the“function.“*/Ž¡‘8lÈrl_icpfunc_t–¹–*func;“/*“Function“to“call“to“do“the“job.“*/Ž¡‘8lÈchar–¹–*doc;“/*“Documentation“for“this“function.‘ s,*/ŽŽŒ‹B„YŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—66ŽŽŽ ƒ33 ý ÌÍ‘.ùœÉ}‘¹–COMMAND;Ž©‘.ùœCOMMAND–¹–commands[]“=“{ޤ €‘8lÈ{–¹–"cd",“com_cd,“"Change“to“directory“DIR"“},Ž¡‘8lÈ{–¹–"delete",“com_delete,“"Delete“FILE"“},Ž¡‘8lÈ{–¹–"help",“com_help,“"Display“this“text"“},Ž¡‘8lÈ{–¹–"?",“com_help,“"Synonym“for“`help'"“},Ž¡‘8lÈ{–¹–"list",“com_list,“"List“files“in“DIR"“},Ž¡‘8lÈ{–¹–"ls",“com_list,“"Synonym“for“`list'"“},Ž¡‘8lÈ{–¹–"pwd",“com_pwd,“"Print“the“current“working“directory"“},Ž¡‘8lÈ{–¹–"quit",“com_quit,“"Quit“using“Fileman"“},Ž¡‘8lÈ{–¹–"rename",“com_rename,“"Rename“FILE“to“NEWNAME"“},Ž¡‘8lÈ{–¹–"stat",“com_stat,“"Print“out“statistics“on“FILE"“},Ž¡‘8lÈ{–¹–"view",“com_view,“"View“the“contents“of“FILE"“},Ž¡‘8lÈ{–¹–(char“*)NULL,“(rl_icpfunc_t“*)NULL,“(char“*)NULL“}Ž¡‘.ùœ};ަ‘.ùœ/*–¹–Forward“declarations.“*/Ž¡‘.ùœchar–¹–*stripwhite“(char“*);Ž¡‘.ùœCOMMAND–¹–*find_command“(char“*);ަ‘.ùœ/*–¹–The“name“of“this“program,“as“taken“from“argv[0].“*/Ž¡‘.ùœchar‘¹–*progname;ަ‘.ùœ/*–¹–When“non-zero,“this“global“means“the“user“is“done“using“this“program.“*/Ž¡‘.ùœint‘¹–done;ަ‘.ùœchar‘¹–*Ž¡‘.ùœdupstr–¹–(char“*s)Ž¡‘.ùœ{Ž¡‘8lÈchar‘¹–*r;ަ‘8lÈr–¹–=“xmalloc“(strlen“(s)“+“1);Ž¡‘8lÈstrcpy–¹–(r,“s);Ž¡‘8lÈreturn‘¹–(r);Ž¡‘.ùœ}ަ‘.ùœintŽ¡‘.ùœmain–¹–(int“argc,“char“**argv)Ž¡‘.ùœ{Ž¡‘8lÈchar–¹–*line,“*s;ަ‘8lÈsetlocale–¹–(LC_ALL,“"");ަ‘8lÈprogname–¹–=“argv[0];ަ‘8lÈinitialize_readline–¹–();“/*“Bind“our“completer.“*/ަ‘8lÈ/*–¹–Loop“reading“and“executing“lines“until“the“user“quits.“*/Ž¡‘8lÈfor–¹–(“;“done“==“0;“)Ž¡‘Aßô{Ž¡‘KS line–¹–=“readline“("FileMan:“");ަ‘KS if‘¹–(!line)Ž¡‘TÆLbreak;ަ‘KS /*–¹–Remove“leading“and“trailing“whitespace“from“the“line.Ž¡‘YâThen,–¹–if“there“is“anything“left,“add“it“to“the“history“listŽŽŒ‹C‹ÒŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—67ŽŽŽ ƒ33 ý ÌÍ‘YâÉand–¹–execute“it.“*/ޤ €‘KS s–¹–=“stripwhite“(line);Ž©‘KS if‘¹–(*s)Ž¡‘TÆL{Ž¡‘^9xadd_history‘¹–(s);Ž¡‘^9xexecute_line‘¹–(s);Ž¡‘TÆL}ަ‘KS free‘¹–(line);Ž¡‘Aßô}Ž¡‘8lÈexit‘¹–(0);Ž¡‘.ùœ}ަ‘.ùœ/*–¹–Execute“a“command“line.“*/Ž¡‘.ùœintŽ¡‘.ùœexecute_line–¹–(char“*line)Ž¡‘.ùœ{Ž¡‘8lÈregister–¹–int“i;Ž¡‘8lÈCOMMAND‘¹–*command;Ž¡‘8lÈchar‘¹–*word;ަ‘8lÈ/*–¹–Isolate“the“command“word.“*/Ž¡‘8lÈi–¹–=“0;Ž¡‘8lÈwhile–¹–(line[i]“&&“whitespace“(line[i]))Ž¡‘Aßôi++;Ž¡‘8lÈword–¹–=“line“+“i;ަ‘8lÈwhile–¹–(line[i]“&&“!whitespace“(line[i]))Ž¡‘Aßôi++;ަ‘8lÈif‘¹–(line[i])Ž¡‘Aßôline[i++]–¹–=“'\0';ަ‘8lÈcommand–¹–=“find_command“(word);ަ‘8lÈif‘¹–(!command)Ž¡‘Aßô{Ž¡‘KS fprintf–¹–(stderr,“"%s:“No“such“command“for“FileMan.\n",“word);Ž¡‘KS return‘¹–(-1);Ž¡‘Aßô}ަ‘8lÈ/*–¹–Get“argument“to“command,“if“any.“*/Ž¡‘8lÈwhile–¹–(whitespace“(line[i]))Ž¡‘Aßôi++;ަ‘8lÈword–¹–=“line“+“i;ަ‘8lÈ/*–¹–Call“the“function.“*/Ž¡‘8lÈreturn–¹–((*(command->func))“(word));Ž¡‘.ùœ}ަ‘.ùœ/*–¹–Look“up“NAME“as“the“name“of“a“command,“and“return“a“pointer“to“thatŽ¡‘=&^command.‘ s,Return–¹–a“NULL“pointer“if“NAME“isn't“a“command“name.“*/Ž¡‘.ùœCOMMAND‘¹–*Ž¡‘.ùœfind_command–¹–(char“*name)Ž¡‘.ùœ{Ž¡‘8lÈregister–¹–int“i;ŽŽŒ‹D“Ÿò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—68ŽŽŽ ƒ33 ý«LÍ‘8lÈÉfor–¹–(i“=“0;“commands[i].name;“i++)ޤ €‘Aßôif–¹–(strcmp“(name,“commands[i].name)“==“0)Ž¡‘KS return‘¹–(&commands[i]);Ž©‘8lÈreturn–¹–((COMMAND“*)NULL);Ž¡‘.ùœ}ަ‘.ùœ/*–¹–Strip“whitespace“from“the“start“and“end“of“STRING.‘ s,Return“a“pointerŽ¡‘=&^into–¹–STRING.“*/Ž¡‘.ùœchar‘¹–*Ž¡‘.ùœstripwhite–¹–(char“*string)Ž¡‘.ùœ{Ž¡‘8lÈregister–¹–char“*s,“*t;ަ‘8lÈfor–¹–(s“=“string;“whitespace“(*s);“s++)Ž¡‘Aßô;ަ‘8lÈif–¹–(*s“==“0)Ž¡‘Aßôreturn‘¹–(s);ަ‘8lÈt–¹–=“s“+“strlen“(s)“-“1;Ž¡‘8lÈwhile–¹–(t“>“s“&&“whitespace“(*t))Ž¡‘Aßôt--;Ž¡‘8lÈ*++t–¹–=“'\0';ަ‘8lÈreturn‘¹–s;Ž¡‘.ùœ}ަ‘.ùœ/*–¹–****************************************************************“*/Ž¡‘.ùœ/*’7ج*/Ž¡‘.ùœ/*‘U ŒInterface–¹–to“Readline“Completion‘K™`*/Ž¡‘.ùœ/*’7ج*/Ž¡‘.ùœ/*–¹–****************************************************************“*/ަ‘.ùœchar–¹–*command_generator“(const“char“*,“int);Ž¡‘.ùœchar–¹–**fileman_completion“(const“char“*,“int,“int);ަ‘.ùœ/*–¹–Tell“the“GNU“Readline“library“how“to“complete.‘ s,We“want“to“try“to“completeŽ¡‘=&^on–¹–command“names“if“this“is“the“first“word“in“the“line,“or“on“filenamesŽ¡‘=&^if–¹–not.“*/Ž¡‘.ùœvoidŽ¡‘.ùœinitialize_readline‘¹–(void)Ž¡‘.ùœ{Ž¡‘8lÈ/*–¹–Allow“conditional“parsing“of“the“~/.inputrc“file.“*/Ž¡‘8lÈrl_readline_name–¹–=“"FileMan";ަ‘8lÈ/*–¹–Tell“the“completer“that“we“want“a“crack“first.“*/Ž¡‘8lÈrl_attempted_completion_function–¹–=“fileman_completion;Ž¡‘.ùœ}ަ‘.ùœ/*–¹–Attempt“to“complete“on“the“contents“of“TEXT.‘ s,START“and“END“bound“theŽ¡‘=&^region–¹–of“rl_line_buffer“that“contains“the“word“to“complete.‘ s,TEXT“isŽ¡‘=&^the–¹–word“to“complete.‘ s,We“can“use“the“entire“contents“of“rl_line_bufferŽ¡‘=&^in–¹–case“we“want“to“do“some“simple“parsing.‘ s,Return“the“array“of“matches,Ž¡‘=&^or–¹–NULL“if“there“aren't“any.“*/Ž¡‘.ùœchar‘¹–**Ž¡‘.ùœfileman_completion–¹–(const“char“*text,“int“start,“int“end)ŽŽŒ‹E˜rŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—69ŽŽŽ ƒ33 ý ÌÍ‘.ùœÉ{Ž© €‘8lÈchar‘¹–**matches;ޤ‘8lÈmatches–¹–=“(char“**)NULL;Ž¡‘8lÈ/*–¹–If“this“word“is“at“the“start“of“the“line,“then“it“is“a“commandަ‘F™Što–¹–complete.‘ s,Otherwise“it“is“the“name“of“a“file“in“the“currentަ‘F™Šdirectory.‘¹–*/ަ‘8lÈif–¹–(start“==“0)ަ‘Aßômatches–¹–=“rl_completion_matches“(text,“command_generator);Ž¡‘8lÈreturn‘¹–(matches);ަ‘.ùœ}Ž¡‘.ùœ/*–¹–Generator“function“for“command“completion.‘ s,STATE“lets“us“know“whetherަ‘=&^to–¹–start“from“scratch;“without“any“state“(i.e.“STATE“==“0),“then“weަ‘=&^start–¹–at“the“top“of“the“list.“*/ަ‘.ùœchar‘¹–*ަ‘.ùœcommand_generator–¹–(const“char“*text,“int“state)ަ‘.ùœ{ަ‘8lÈstatic–¹–int“list_index,“len;ަ‘8lÈchar‘¹–*name;Ž¡‘8lÈ/*–¹–If“this“is“a“new“word“to“complete,“initialize“now.‘ s,This“includesަ‘F™Šsaving–¹–the“length“of“TEXT“for“efficiency,“and“initializing“the“indexަ‘F™Švariable–¹–to“0.“*/ަ‘8lÈif‘¹–(!state)ަ‘Aßô{ަ‘KS list_index–¹–=“0;ަ‘KS len–¹–=“strlen“(text);ަ‘Aßô}Ž¡‘8lÈ/*–¹–Return“the“next“name“which“partially“matches“from“the“command“list.“*/ަ‘8lÈwhile–¹–(name“=“commands[list_index].name)ަ‘Aßô{ަ‘KS list_index++;Ž¡‘KS if–¹–(strncmp“(name,“text,“len)“==“0)ަ‘TÆLreturn‘¹–(dupstr(name));ަ‘Aßô}Ž¡‘8lÈ/*–¹–If“no“names“matched,“then“return“NULL.“*/ަ‘8lÈreturn–¹–((char“*)NULL);ަ‘.ùœ}Ž¡‘.ùœ/*–¹–****************************************************************“*/ަ‘.ùœ/*’7ج*/ަ‘.ùœ/*‘l¬zFileMan‘¹–Commands‘’Ò*/ަ‘.ùœ/*’7ج*/ަ‘.ùœ/*–¹–****************************************************************“*/Ž¡‘.ùœ/*–¹–String“to“pass“to“system“().‘ s,This“is“for“the“LIST,“VIEW“and“RENAMEަ‘=&^commands.‘¹–*/ަ‘.ùœstatic–¹–char“syscom[1024];Ž¡‘.ùœ/*–¹–List“the“file(s)“named“in“arg.“*/ަ‘.ùœintަ‘.ùœcom_list–¹–(char“*arg)ŽŽŒ‹F eŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—70ŽŽŽ ƒ33 ý ÌÍ‘.ùœÉ{ޤ €‘8lÈif‘¹–(!arg)Ž¡‘Aßôarg–¹–=“"";Ž©‘8lÈsnprintf–¹–(syscom,“sizeof“(syscom),“"ls“-FClg“%s",“arg);Ž¡‘8lÈreturn–¹–(system“(syscom));Ž¡‘.ùœ}ަ‘.ùœintŽ¡‘.ùœcom_view–¹–(char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈif–¹–(!valid_argument“("view",“arg))Ž¡‘Aßôreturn‘¹–1;ަ‘.ùœ#if–¹–defined“(__MSDOS__)Ž¡‘8lÈ/*–¹–more.com“doesn't“grok“slashes“in“pathnames“*/Ž¡‘8lÈsnprintf–¹–(syscom,“sizeof“(syscom),“"less“%s",“arg);Ž¡‘.ùœ#elseŽ¡‘8lÈsnprintf–¹–(syscom,“sizeof“(syscom),“"more“%s",“arg);Ž¡‘.ùœ#endifŽ¡‘8lÈreturn–¹–(system“(syscom));Ž¡‘.ùœ}ަ‘.ùœintŽ¡‘.ùœcom_rename–¹–(char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈtoo_dangerous‘¹–("rename");Ž¡‘8lÈreturn‘¹–(1);Ž¡‘.ùœ}ަ‘.ùœintŽ¡‘.ùœcom_stat–¹–(char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈstruct–¹–stat“finfo;ަ‘8lÈif–¹–(!valid_argument“("stat",“arg))Ž¡‘Aßôreturn‘¹–(1);ަ‘8lÈif–¹–(stat“(arg,“&finfo)“==“-1)Ž¡‘Aßô{Ž¡‘KS perror‘¹–(arg);Ž¡‘KS return‘¹–(1);Ž¡‘Aßô}ަ‘8lÈprintf–¹–("Statistics“for“`%s':\n",“arg);ަ‘8lÈprintf–¹–("%s“has“%d“link%s,“and“is“%d“byte%s“in“length.\n",Ž¡‘8lÈarg,Ž¡‘^9xfinfo.st_nlink,Ž¡‘^9x(finfo.st_nlink–¹–==“1)“?“""“:“"s",Ž¡‘^9xfinfo.st_size,Ž¡‘^9x(finfo.st_size–¹–==“1)“?“""“:“"s");Ž¡‘8lÈprintf–¹–("Inode“Last“Change“at:“%s",“ctime“(&finfo.st_ctime));Ž¡‘8lÈprintf–¹–("‘Y„Last“access“at:“%s",“ctime“(&finfo.st_atime));Ž¡‘8lÈprintf–¹–("‘æXLast“modified“at:“%s",“ctime“(&finfo.st_mtime));Ž¡‘8lÈreturn‘¹–(0);Ž¡‘.ùœ}ŽŽŒ‹G§àŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—71ŽŽŽ ƒ33 ý ÌÍ‘.ùœÉintޤ €‘.ùœcom_delete–¹–(char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈtoo_dangerous‘¹–("delete");Ž¡‘8lÈreturn‘¹–(1);Ž¡‘.ùœ}Ž©‘.ùœ/*–¹–Print“out“help“for“ARG,“or“for“all“of“the“commands“if“ARG“isŽ¡‘=&^not–¹–present.“*/Ž¡‘.ùœintŽ¡‘.ùœcom_help–¹–(char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈregister–¹–int“i;Ž¡‘8lÈint–¹–printed“=“0;ަ‘8lÈfor–¹–(i“=“0;“commands[i].name;“i++)Ž¡‘Aßô{Ž¡‘KS if–¹–(!*arg“||“(strcmp“(arg,“commands[i].name)“==“0))Ž¡‘TÆL{Ž¡‘^9xprintf–¹–("%s\t\t%s.\n",“commands[i].name,“commands[i].doc);Ž¡‘^9xprinted++;Ž¡‘TÆL}Ž¡‘Aßô}ަ‘8lÈif‘¹–(!printed)Ž¡‘Aßô{Ž¡‘KS printf–¹–("No“commands“match“`%s'.‘ s,Possibilities“are:\n",“arg);ަ‘KS for–¹–(i“=“0;“commands[i].name;“i++)Ž¡‘TÆL{Ž¡‘^9x/*–¹–Print“in“six“columns.“*/Ž¡‘^9xif–¹–(printed“==“6)Ž¡‘g¬¤{Ž¡‘qÐprinted–¹–=“0;Ž¡‘qÐprintf‘¹–("\n");Ž¡‘g¬¤}ަ‘^9xprintf–¹–("%s\t",“commands[i].name);Ž¡‘^9xprinted++;Ž¡‘TÆL}ަ‘KS if‘¹–(printed)Ž¡‘TÆLprintf‘¹–("\n");Ž¡‘Aßô}Ž¡‘8lÈreturn‘¹–(0);Ž¡‘.ùœ}ަ‘.ùœ/*–¹–Change“to“the“directory“ARG.“*/Ž¡‘.ùœintŽ¡‘.ùœcom_cd–¹–(char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈif–¹–(chdir“(arg)“==“-1)Ž¡‘Aßô{Ž¡‘KS perror‘¹–(arg);Ž¡‘KS return‘¹–1;Ž¡‘Aßô}ަ‘8lÈcom_pwd‘¹–("");ŽŽŒ‹H­ÙŸò‘GáChapter–¦f2:‘ÝÝProgramming“with“GNU“Readline’Ê—72ŽŽŽ ƒ33 ý ÌÍ‘8lÈÉreturn‘¹–(0);ޤ €‘.ùœ}Ž©‘.ùœ/*–¹–Print“out“the“current“working“directory.“*/Ž¡‘.ùœintŽ¡‘.ùœcom_pwd–¹–(char“*ignore)Ž¡‘.ùœ{Ž¡‘8lÈchar–¹–dir[1024],“*s;ަ‘8lÈs–¹–=“getcwd“(dir,“sizeof(dir)“-“1);Ž¡‘8lÈif–¹–(s“==“0)Ž¡‘Aßô{Ž¡‘KS printf–¹–("Error“getting“pwd:“%s\n",“dir);Ž¡‘KS return‘¹–1;Ž¡‘Aßô}ަ‘8lÈprintf–¹–("Current“directory“is“%s\n",“dir);Ž¡‘8lÈreturn‘¹–0;Ž¡‘.ùœ}ަ‘.ùœ/*–¹–The“user“wishes“to“quit“using“this“program.‘ s,Just“set“DONE“non-zero.“*/Ž¡‘.ùœintŽ¡‘.ùœcom_quit–¹–(char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈdone–¹–=“1;Ž¡‘8lÈreturn‘¹–(0);Ž¡‘.ùœ}ަ‘.ùœ/*–¹–Function“which“tells“you“that“you“can't“do“this.“*/Ž¡‘.ùœvoidŽ¡‘.ùœtoo_dangerous–¹–(char“*caller)Ž¡‘.ùœ{Ž¡‘8lÈfprintf‘¹–(stderr,Ž¡‘bó"%s:–¹–Too“dangerous“for“me“to“distribute.‘ s,Write“it“yourself.\n",Ž¡‘bócaller);Ž¡‘.ùœ}ަ‘.ùœ/*–¹–Return“non-zero“if“ARG“is“a“valid“argument“for“CALLER,“else“printŽ¡‘=&^an–¹–error“message“and“return“zero.“*/Ž¡‘.ùœintŽ¡‘.ùœvalid_argument–¹–(char“*caller,“char“*arg)Ž¡‘.ùœ{Ž¡‘8lÈif–¹–(!arg“||“!*arg)Ž¡‘Aßô{Ž¡‘KS fprintf–¹–(stderr,“"%s:“Argument“required.\n",“caller);Ž¡‘KS return‘¹–(0);Ž¡‘Aßô}ަ‘8lÈreturn‘¹–(1);Ž¡‘.ùœ}ŽŽŒ‹I²ðŸò’¸¼Ëá73ŽŽŽ ƒ33 ý ÌÍ‘GëTApp›Š=endix‘záA‘ ¸QGNU–z³F‘þaGree“Do˜cumen‘ÿuÂtation“LicenseŽŽŸƒª’£¤AáV‘ÿeersion–¦f1.3,“3“No•²!v“em“bMÞer‘¦f2008Ž©Q‘.ùœCop•²!yrigh“t‘±ž«‚cŽŽŽ‘¦fê ŽŽŽŽ‘@á2000,–¦f2001,“2002,“2007,“2008“F›ÿeree“Soft•²!w“are–¦fF˜oundation,“Inc.ޤ 33‘.ùœâhttp://fsf.org/ŽŸff‘.ùœáEv•²!ery“one–¦fis“pMÞermitted“to“copš²!y“and“distribute“v˜erbatim“copiesŽ¡‘.ùœof–¦fthis“license“doMÞcumenš²!t,“but“c˜hanging“it“is“not“allo˜w˜ed.ަ‘-0.Ž‘'¿«PREAMBLEަ‘'¿«The–vQpurpMÞose›vRof“this˜License“is˜to“mak²!e“a˜man²!ual,›ªLtextb•MÞo“ok,˜or–vQother‘vRfunctional“andŽ¡‘'¿«useful–žïdoMÞcumen²!t›žîåfree‘;öáin“the“sense˜of“freedom:‘Ú!to“assure“ev•²!ery“one‘žïthe˜e ectiv“e‘žïfreedomŽ¡‘'¿«to–Æ9cop²!y›Æ:and“redistribute“it,‘Î.with“or˜without“moMÞdifying“it,‘Î.either“commercially˜or“non-Ž¡‘'¿«commercially–ÿe.‘cÏSecondarily“,‘Hàthis–(aLicense›(bpreserv²!es“for“the˜author“and“publisher˜a“w•²!a“yŽ¡‘'¿«to–W9get“credit›W8for“their“w²!ork,‘ƒmwhile“not“bMÞeing“considered˜respšMÞonsible“for“mo˜di cationsŽ¡‘'¿«made–¦fb²!y“others.ަ‘'¿«This–È/License›È0is“a“kind“of˜\cop•²!yleft",‘ô whic“h–È/means˜that“deriv‘ÿdDativš²!e“w˜orks“of‘È0the“doMÞcumen˜tŽ¡‘'¿«m•²!ust›õthemselv“es–ôbMÞe˜free˜in˜the“same˜sense.‘ ‰It˜complemen²!ts˜the“GNU‘ÙGeneral˜PublicŽ¡‘'¿«License,–¦fwhicš²!h“is“a“cop˜yleft“license“designed“for“free“soft˜w˜are.ަ‘'¿«W‘ÿee›‹#ha•²!v“e˜designed˜this˜License˜in˜order˜to˜use˜it‘‹"for˜man“uals˜for˜free˜soft“w“are,‘—bMÞecauseŽ¡‘'¿«free›?soft•²!w“are˜needs˜free‘>doMÞcumen“tation:‘³a˜free˜program˜should‘>come˜with˜man“ualsŽ¡‘'¿«pro²!viding–urthe›ussame“freedoms˜that“the˜soft•²!w“are–urdoMÞes.‘ÍŒBut˜this“License˜is“not˜limited“toŽ¡‘'¿«soft•²!w“are›­âman“uals;‘±¡it–­ãcan˜bMÞe“used˜for“an²!y˜textual“w²!ork,‘¯Áregardless“of˜sub‘›»ject“matter˜orŽ¡‘'¿«whether–Ç2it“is“published“as“a“prin²!ted“b•MÞo“ok.‘@BW‘ÿee–Ç2recommend“this“License“principally“forŽ¡‘'¿«w²!orks–¦fwhose“purpMÞose“is“instruction“or“reference.ަ‘-1.Ž‘'¿«APPLICABILITY–¦fAND“DEFINITIONSŽŸP‘'¿«This–Ì>License‘Ì=applies“to“anš²!y“man˜ual‘Ì=or“other“w˜ork,‘³in“an˜y–Ì=medium,‘´that“con˜tains‘Ì>aŽ¡‘'¿«notice–ýplaced›ýb²!y“the˜cop•²!yrigh“t‘ýholder˜sa“ying–ýit˜can“bMÞe˜distributed“under˜the“termsŽ¡‘'¿«of–€†this“License.‘l=Sucš²!h“a“notice“gran˜ts“a“w˜orld-wide,‘· ro˜y˜alt˜y-free“license,‘·unlimited“inŽ¡‘'¿«duration,‘â to–o·use›o¶that“w²!ork“under˜the“conditions“stated˜herein.‘ 9ÏThe“\DoMÞcumen²!t",Ž¡‘'¿«bMÞeloš²!w,‘tkrefers–gìto“an˜y“suc˜h‘gíman˜ual“or“w˜ork.‘É An˜y“mem˜bMÞer“of“the‘gípublic“is“a“licensee,‘tkandŽ¡‘'¿«is–ÿaddressed“as“\yš²!ou".‘¦@Y‘ÿeou“accept“the“license“if“y˜ou“cop˜y‘ÿe,‘ îmoMÞdify“or“distribute“the“w˜orkŽ¡‘'¿«in–¦fa“w•²!a“y–¦frequiring“pMÞermission“under“cop•²!yrigh“t‘¦fla“w.ަ‘'¿«A‘ ¦\MošMÞdi ed– ÀV‘ÿeersion"‘ Áof“the“Do˜cumenš²!t“means‘ Áan˜y“w˜ork“con˜taining“the‘ ÁDoMÞcumen˜t“orŽ¡‘'¿«a–‚hpMÞortion›‚gof“it,‘¹heither˜copied“v²!erbatim,‘¹hor˜with“moMÞdi cations“and/or˜translated“in²!toŽ¡‘'¿«another‘¦flanguage.ަ‘'¿«A‘ž\Secondary–ÀSection"“is›Áa“named˜appMÞendix“or˜a“fron²!t-matter˜section“of˜the“DoMÞcumen²!tŽ¡‘'¿«that–Ž/deals“exclusiv²!ely›Ž0with“the“relationship“of˜the“publishers“or“authors˜of“the“DoMÞcumen²!tŽ¡‘'¿«to–z the‘zDoMÞcumenš²!t's“o˜v˜erall›zsub‘›»ject“(or˜to“related“matters)˜and“con²!tains˜nothing“thatŽ¡‘'¿«could–Ø®fall›دdirectly“within“that“o•²!v“erall˜sub‘›»ject.‘tµ(Th“us,‘%@if˜the›Ø®DoMÞcumen“t˜is˜in‘دpart˜aŽ¡‘'¿«textb•MÞo“ok›Õ†of–Õ…mathematics,‘ÿMa“Secondary˜Section˜ma²!y˜not“explain˜an²!y˜mathematics.)‘˜=TheŽ¡‘'¿«relationship–GÞcould“bMÞe“a“matter“of“historical“connection“with“the“sub‘›»ject“or“with“relatedŽ¡‘'¿«matters,–jor‘Bøof›B÷legal,“commercial,‘jphilosophical,“ethical˜or˜p•MÞolitical‘Bøp“osition˜regardingŽ¡‘'¿«them.ަ‘'¿«The›r\In•²!v‘ÿdDarian“t–sSections"˜are˜certain˜Secondary“Sections˜whose˜titles˜are“designated,‘0ÖasŽ¡‘'¿«bMÞeing–2Dthose›2Cof“In•²!v‘ÿdDarian“t–2DSections,‘I}in“the“notice˜that“sa²!ys˜that“the“DoMÞcumen²!t˜is“releasedŽŽŒ‹J¸Ÿò‘GáAppšMÞendix–¦fA:“GNU“F‘ÿeree“Do˜cumen²!tation“License’Á:74ŽŽŽ ƒ33 ý ÌÍ‘'¿«under–S5this“License.‘Â"If›S4a“section“doMÞes“not“ t˜the“abMÞo•²!v“e–S5de nition“of“Secondary˜then“it“isޤ 33‘'¿«not›Óallo•²!w“ed˜to‘ÓŽbMÞe˜designated˜as˜In“v‘ÿdDarian“t.‘eSThe˜DoMÞcumen“t˜ma“y‘ÓŽcon“tain˜zero˜In“v‘ÿdDarian“tŽ¡‘'¿«Sections.‘¢ÄIf–õthe“DošMÞcumen²!t“do˜es‘õnot“idenš²!tify“an˜y“In˜v‘ÿdDarian˜t“Sections“then‘õthere“are“none.Ž©&g‘'¿«The›f­\Co•²!v“er–f¬T‘ÿeexts"˜are˜certain˜short“passages˜of˜text˜that“are˜listed,‘–¾as˜F‘ÿeron•²!t-Co“v“erŽ¡‘'¿«T›ÿeexts–-or“Bac•²!k-Co“v“er‘,T˜exts,‘"8in–-the“notice“that‘,saš²!ys“that“the“DoMÞcumen˜t‘,is“released“underŽ¡‘'¿«this›’License.‘¯AA‘nF‘ÿeron•²!t-Co“v“er˜T‘ÿeext˜ma“y˜bMÞe˜at˜most˜5›‘w“ords,‘6Šand˜a›’Bac“k-Co“v“er˜T‘ÿeext˜ma“yŽ¡‘'¿«bMÞe–¦fat“most“25“w²!ords.ŽŸ&h‘'¿«A‘C¦\T‘ÿeransparen•²!t"›CÎcop“y˜of‘CÏthe˜DoMÞcumen“t˜means˜a‘CÏmac“hine-readable˜cop“y‘ÿe,‘k(represen“tedŽ¡‘'¿«in–Jma“format›Jnwhose“spMÞeci cation“is“a²!v‘ÿdDailable“to“the˜general“public,‘snthat˜is“suitable“forŽ¡‘'¿«revising–Îàthe‘ÎßdoMÞcumenš²!t“straigh˜tforw˜ardly“with›Îßgeneric“text˜editors“or“(for˜images“com-Ž¡‘'¿«pMÞosed–ÚÃof›ÚÄpixels)“generic˜pain²!t“programs˜or“(for˜dra²!wings)“some˜widely“a•²!v‘ÿdDailable˜dra“wingŽ¡‘'¿«editor,‘…úand–}ßthat“is“suitable“for“input“to‘}àtext“formatters“or“for“automatic“translation“toŽ¡‘'¿«a–9Ov‘ÿdDariet²!y“of›9Nformats“suitable“for“input“to“text˜formatters.‘¹A‘93cop²!y“made˜in“an“otherwiseŽ¡‘'¿«T‘ÿeransparen²!t–„æ le“format›„åwhose“markup,‘¼†or“absence˜of“markup,‘¼†has˜bMÞeen“arranged“toŽ¡‘'¿«th•²!w“art–0ûor›0üdiscourage“subsequen²!t“moMÞdi cation˜b²!y“readers“is˜not“T‘ÿeransparen²!t.‘¶ºAn“imageŽ¡‘'¿«format– Éis“not“T‘ÿeransparenš²!t“if“used‘ Èfor“an˜y“substan˜tial“amoun˜t“of“text.‘MA‘ ©cop˜y“that“isŽ¡‘'¿«not–¦f\T‘ÿeransparen²!t"“is“called“\Opaque".ަ‘'¿«Examples–cXof“suitable›cWformats“for“T‘ÿeransparen²!t“copies“include˜plain“çasci>Ki“áwithoutŽ¡‘'¿«markup,‘„ÂT‘ÿeexinfo–XIinput“format,›„ÁLaT‘þ,³Ÿ[wEŽ‘B X‘XJinput“format,˜óKñ`y cmr10«SGML“áor‘XJ«XML“áusing“a“publiclyŽ¡‘'¿«a²!v‘ÿdDailable–«DTDá,‘üand›Âstandard-conforming“simple˜«HTMLá,‘üP²!ostScript“or˜«PDF“ádesignedŽ¡‘'¿«for–˜.hš²!uman“moMÞdi cation.‘³4Examples“of“transparen˜t“image“formats“include“«PNGá,‘ÔŸ«X¸ãCFŽ¡‘'¿«áand–¢«JPGá.‘ÐáOpaque“formats“include“proprietary‘¢formats“that“can“bMÞe“read“and“editedŽ¡‘'¿«only–sbš²!y‘sproprietary“w˜ord›sproMÞcessors,‘&J«SGML“áor˜«XML“áfor˜whic²!h“the˜«DTD“áand/orŽ¡‘'¿«pro•MÞcessing›W*to“ols˜are˜not‘W)generally˜a•²!v‘ÿdDailable,‘CYand˜the˜mac“hine-generated˜«HTMLá,Ž¡‘'¿«Pš²!ostScript–¦for“«PDF“áproMÞduced“b˜y“some“w˜ord“prošMÞcessors“for“output“purp˜oses“only‘ÿe.ަ‘'¿«The–Ü\Title›ÛP²!age"“means,‘<ùfor˜a“prin²!ted˜b•MÞo“ok,‘<ùthe–Ütitle˜page“itself,‘<ùplus˜sucš²!h“follo˜wingŽ¡‘'¿«pages–RÃas“are“needed“to“hold,–c}legibly‘ÿe,“the–RÃmaterial“this‘RÂLicense“requires“to“appMÞear“in“theŽ¡‘'¿«title–1.page.‘¶ÊF‘ÿeor“w²!orks›1-in“formats˜whic²!h“do“not˜ha•²!v“e‘1.an“y˜title–1.page“as˜sucš²!h,‘HŸ\Title“P˜age"Ž¡‘'¿«means–­Žthe“text“near›­the“most“prominen²!t“appMÞearance“of“the˜w²!ork's“title,‘¯Xpreceding“theŽ¡‘'¿«bšMÞeginning–¦fof“the“b˜o˜dy“of“the“text.ަ‘'¿«The–)—\publisher"“means‘)˜anš²!y“pMÞerson“or“en˜tit˜y“that“distributes‘)˜copies“of“the“DoMÞcumen˜tŽ¡‘'¿«to–¦fthe“public.ŽŸ&h‘'¿«A›ísection–ò\En²!titled“XYZ"˜means“a“named›ósubunit“of“the“DoMÞcumen²!t˜whose“title“eitherŽ¡‘'¿«is–Uªprecisely‘U©XYZ›U•or“con²!tains“XYZ˜in“paren•²!theses›U©follo“wing–Uªtext“that˜translates“XYZ‘U•inŽ¡‘'¿«another–þ¯language.‘¥ö(Here“XYZ‘þ„stands“for“a“spšMÞeci c“section“name“men²!tioned“b˜elo•²!w,‘ :suc“hŽ¡‘'¿«as›aa\Ac•²!kno“wledgemen“ts",–o/\Dedications",“\Endorsemen²!ts",“or˜\History".)‘ÆÛT‘ÿeo˜\Preserv²!eŽ¡‘'¿«the–›Title"›šof“suc²!h˜a“section“when˜y²!ou“moMÞdify˜the“DoMÞcumen²!t“means˜that“it˜remains“aŽ¡‘'¿«section–¦f\En²!titled“XYZ"“according“to“this“de nition.ަ‘'¿«The–SuDoMÞcumenš²!t“ma˜y“include“W‘ÿearran˜t˜y“Disclaimers“next‘Svto“the“notice“whic˜h“states“thatŽ¡‘'¿«this–¹License“applies‘ºto“the“DoMÞcumenš²!t.‘×These“W‘ÿearran˜t˜y“Disclaimers‘ºare“considered“toŽ¡‘'¿«bMÞe–„ýincluded›„þb²!y“reference“in“this˜License,‘¼£but“only“as“regards˜disclaiming“w•²!arran“ties:Ž¡‘'¿«an²!y–nother›n‘implication“that˜these“W‘ÿearran•²!t“y˜Disclaimers‘nma“y˜ha“v“e‘nis˜v“oid–nand˜has“noŽ¡‘'¿«e ect–¦fon“the“meaning“of“this“License.ަ‘-2.Ž‘'¿«VERBA‘ÿeTIM‘¦fCOPYINGŽŽŒ‹KÈ‚Ÿò‘GáAppšMÞendix–¦fA:“GNU“F‘ÿeree“Do˜cumen²!tation“License’Á:75ŽŽŽ ƒ33 ý ÌÍ‘'¿«Y‘ÿeou–’ùmaš²!y“cop˜y“and“distribute“the“DoMÞcumen˜t“in“an˜y“medium,‘Îeither“commercially“orޤ 33‘'¿«noncommercially‘ÿe,›zªpro²!vided–that‘this“License,˜the‘cop•²!yrigh“t–notices,˜and‘the“licenseŽ¡‘'¿«notice–Ksa²!ying›K this“License˜applies“to˜the“DoMÞcumen²!t“are˜reproMÞduced“in˜all“copies,‘t7andŽ¡‘'¿«that–1'yš²!ou“add“no‘1(other“conditions“whatsoMÞev˜er“to“those“of“this“License.‘¶ÉY‘ÿeou“ma˜y“not“useŽ¡‘'¿«tec²!hnical–ò“measures›ò”to“obstruct˜or“con²!trol˜the“reading˜or“further˜cop²!ying“of˜the“copiesŽ¡‘'¿«y•²!ou›òÇmak“e‘òÈor˜distribute.‘¡þHo“w“ev“er,‘´y“ou˜ma“y˜accept‘òÈcompMÞensation˜in˜exc“hange‘òÈfor˜copies.Ž¡‘'¿«If–Þy²!ou›Þdistribute“a“large˜enough“n•²!um“bMÞer˜of–Þcopies“y•²!ou˜m“ust–Þalso“follo²!w˜the“conditionsŽ¡‘'¿«in–¦fsection“3.Ž©"#‘'¿«Y‘ÿeou–}ìma²!y“also›}ëlend“copies,‘¹7under“the“same“conditions“stated˜abMÞo•²!v“e,‘¹8and˜y“ou›}ìma“y˜publiclyŽ¡‘'¿«displa²!y‘¦fcopies.ަ‘-3.Ž‘'¿«COPYING–¦fIN“QUANTITYަ‘'¿«If–Ãyš²!ou‘Âpublish“prin˜ted›Âcopies“(or˜copies˜in“media“that˜commonly“ha•²!v“e˜prin“ted˜co“v“ers)‘ÃofŽ¡‘'¿«the‘Ñ.DošMÞcumen•²!t,‘Ûßn“um“b˜ering–Ñ.more“than–Ñ-100,‘Ûàand“the–Ñ.Do˜cumen²!t's“license‘Ñ-notice“requiresŽ¡‘'¿«Co•²!v“er›ÜT‘ÿeexts,‘<ùy“ou‘Ûm“ust˜enclose˜the˜copies‘Ûin˜co“v“ers˜that˜carry–ÿe,‘<ùclearly‘Ûand˜legibly“,‘<ùallŽ¡‘'¿«these›´@Co•²!v“er˜T–ÿeexts:‘ùF“ron•²!t-Co“v“er˜T‘ÿeexts˜on˜the˜fron“t˜co“v“er,‘÷µand˜Bac“k-Co“v“er˜T‘ÿeexts˜onŽ¡‘'¿«the›öbac•²!k‘õco“v“er.‘Ñ Both˜co“v“ers˜m“ust–õalso˜clearly˜and˜legibly“iden•²!tify˜y“ou˜as‘õthe˜publisherŽ¡‘'¿«of›,these–+copies.‘H/The“fron•²!t˜co“v“er˜m“ust˜presen“t–+the˜full˜title“with˜all˜w²!ords˜of“the˜titleŽ¡‘'¿«equally–³xprominenš²!t“and‘³yvisible.‘Y‘ÿeou“ma˜y›³yadd“other“material“on“the˜co•²!v“ers–³xin“addition.Ž¡‘'¿«Cop•²!ying›Y4with‘Y3c“hanges˜limited–Y3to˜the“co•²!v“ers,‘…ças–Y3long˜as“they˜preserv²!e“the˜title“of˜theŽ¡‘'¿«DošMÞcumen²!t–uand“satisfy“these“conditions,‘¨Åcan“b˜e“treated‘uas“vš²!erbatim“cop˜ying“in“otherŽ¡‘'¿«respMÞects.ަ‘'¿«If–î|the“required›î}texts“for“either“co•²!v“er–î|are“toMÞo˜vš²!oluminous“to“ t“legibly‘ÿe,‘‚y˜ou“should“putŽ¡‘'¿«the–ò rst›òones“listed“(as“man²!y˜as“ t“reasonably)“on˜the“actual“co•²!v“er,‘ùand˜con“tin“ue‘òtheŽ¡‘'¿«rest–¦fonš²!to“adjacen˜t“pages.ŽŸ""‘'¿«If–?|y²!ou›?{publish“or˜distribute“Opaque˜copies“of˜the“DoMÞcumen•²!t˜n“um“bMÞering–?|more˜than“100,Ž¡‘'¿«y•²!ou›\3m“ust˜either‘\4include˜a˜mac“hine-readable˜T‘ÿeransparen“t˜cop“y˜along‘\4with˜eac“h˜OpaqueŽ¡‘'¿«cop²!y‘ÿe,‘[>or›7state–7in“or˜with“eacš²!h“Opaque“cop˜y‘7a“computer-net˜w˜ork“loMÞcation‘7from“whic˜hŽ¡‘'¿«the›éSgeneral‘éRnet•²!w“ork-using˜public˜has‘éRaccess˜to˜do“wnload˜using‘éRpublic-standard˜net“w“orkŽ¡‘'¿«protoMÞcols–¬=a“complete‘¬>T‘ÿeransparenš²!t“cop˜y“of“the“DoMÞcumen˜t,‘í³free“of“added“material.‘ïcIfŽ¡‘'¿«yš²!ou–ªuse“the‘ªlatter“option,‘êùy˜ou“m˜ust‘ªtak˜e“reasonably“pruden˜t“steps,‘êøwhen“y˜ou“bMÞeginŽ¡‘'¿«distribution–—lof›—mOpaque“copies˜in“quan•²!tit“y‘ÿe,‘Ó®to–—lensure“that˜this“T‘ÿeransparen•²!t˜cop“y‘—lwillŽ¡‘'¿«remain– Cthš²!us“accessible‘ Dat“the“stated“loMÞcation“un˜til‘ Dat“least“one“y˜ear“after‘ Dthe“last“timeŽ¡‘'¿«yš²!ou–k‘distribute‘k’an“Opaque“cop˜y‘k’(directly“or“through“y˜our‘k’agen˜ts“or“retailers)‘k’of“thatŽ¡‘'¿«edition–¦fto“the“public.ަ‘'¿«It–&Nis“requested,‘FHbut“not“required,‘FGthat“yš²!ou“con˜tact“the“authors“of“the“DoMÞcumen˜t“w˜ellŽ¡‘'¿«bMÞefore–oÅredistributing‘oÄanš²!y“large“n˜um˜bMÞer›oÄof“copies,‘z²to˜giv²!e“them˜a“c²!hance“to˜proš²!vide“y˜ouŽ¡‘'¿«with–¦fan“upšMÞdated“v²!ersion“of“the“Do˜cumen²!t.ަ‘-4.Ž‘'¿«MODIFICA‘ÿeTIONSަ‘'¿«Y‘ÿeou–*maš²!y“cop˜y“and›)distribute“a“MoMÞdi ed“V‘ÿeersion“of“the˜DoMÞcumen²!t“under“the“conditionsŽ¡‘'¿«of–…šsections›…›2“and˜3“abMÞo•²!v“e,‘¿]pro“vided˜that‘…šy“ou˜release–…šthe˜MoMÞdi ed“V‘ÿeersion˜under“preciselyŽ¡‘'¿«this–{ÞLicense,‘„`with“the›{ßMoMÞdi ed“V‘ÿeersion“ lling˜the“role“of˜the“DoMÞcumen•²!t,‘„`th“us‘{ÞlicensingŽ¡‘'¿«distribution–¸and“mošMÞdi cation‘¹of“the“Mo˜di ed“V‘ÿeersion“to“who˜ev²!er‘¹p˜ossesses“a“cop²!y“ofŽ¡‘'¿«it.‘ÝÝIn–¦faddition,“yš²!ou“m˜ust“do“these“things“in“the“MoMÞdi ed“V‘ÿeersion:ަ‘*òÄA.Ž‘=nUse–ípin“the“Title“Pš²!age“(and“on“the“co˜v˜ers,‘ÿ2if“an˜y)“a“title“distinct“from“that“of“theŽ¡‘=nDoMÞcumenš²!t,‘+and–ˆfrom“those“of“previous“v˜ersions‘‡(whic˜h“should,‘+if“there“w˜ere“an˜y‘ÿe,ŽŽŒ‹LÚæŸò‘GáAppšMÞendix–¦fA:“GNU“F‘ÿeree“Do˜cumen²!tation“License’Á:76ŽŽŽ ƒ33 ý ÌÍ‘=nbšMÞe–Âølisted“in“the“History‘Â÷section“of“the“Do˜cumenš²!t).‘3“Y‘ÿeou“ma˜y‘Â÷use“the“same“title“asޤ 33‘=na–¦fprevious“vš²!ersion“if“the“original“publisher“of“that“v˜ersion“giv˜es“pMÞermission.Ž©€‘+gB.Ž‘=nList–ª\on“the“Title›ª[P²!age,‘«Zas“authors,‘«Yone“or“more“pMÞersons˜or“en²!tities“respMÞonsible“forŽ¡‘=nauthorship–"of›"the“moMÞdi cations“in˜the“MoMÞdi ed˜V‘ÿeersion,‘<|together“with“at˜least“ v²!eŽ¡‘=nof–߸the“principal“authors“of“the“DoMÞcumenš²!t“(all“of“its“principal“authors,‘uif“it“has“few˜erŽ¡‘=nthan–¦f vš²!e),“unless“they“release“y˜ou“from“this“requiremen˜t.ŽŸ€‘+@¢C.Ž‘=nState–±Óon›±Òthe“Title˜page“the˜name“of˜the“publisher˜of“the˜MoMÞdi ed“V‘ÿeersion,‘´­as“theŽ¡‘=npublisher.ަ‘*ËÕD.Ž‘=nPreservš²!e–¦fall“the“cop˜yrigh˜t“notices“of“the“DoMÞcumen˜t.ަ‘+µoE.Ž‘=nAdd–Äean›Ädappropriate“cop•²!yrigh“t˜notice‘Äefor˜y“our‘ÄemoMÞdi cations˜adjacen“t–Äeto˜the“otherŽ¡‘=ncop•²!yrigh“t‘¦fnotices.ŽŸ€‘,LF.Ž‘=nInclude,›hSimmediately–XÎafter“the“cop•²!yrigh“t–XÎnotices,˜a“license“notice“giving“the“publicŽ¡‘=npMÞermission–ïËto›ïÊuse“the˜MoMÞdi ed“V‘ÿeersion“under˜the“terms˜of“this“License,‘Pin˜the“formŽ¡‘=nshoš²!wn–¦fin“the“Addendum“bMÞelo˜w.ަ‘*‘nG.Ž‘=nPreserv²!e–¼min›¼lthat“license˜notice“the˜full“lists˜of“In•²!v‘ÿdDarian“t˜Sections–¼mand˜required“Co•²!v“erŽ¡‘=nT‘ÿeexts–¦fgivš²!en“in“the“DoMÞcumen˜t's“license“notice.ަ‘*òÄH.Ž‘=nInclude–¦fan“unaltered“cop²!y“of“this“License.ŽŸ€‘/4çI.Ž‘=nPreservš²!e–Ú†the‘Ú‡section“En˜titled‘Ú‡\History",‘çŽPreserv˜e“its›Ú‡Title,‘çŽand“add˜to“it˜an“itemŽ¡‘=nstating–_ at›_ least“the˜title,–mQy²!ear,“new˜authors,“and–_ publisher˜of“the˜MoMÞdi ed“V‘ÿeersionŽ¡‘=nas–ÄXgivš²!en“on‘ÄWthe“Title“P˜age.‘7³If‘ÄWthere“is“no“section“En˜titled“\History"‘ÄWin“the“DoMÞcu-Ž¡‘=nmenš²!t,‘O#create‘-eone–-dstating“the“title,‘O$y˜ear,–O#authors,“and‘-epublisher–-dof“the“DoMÞcumen˜tŽ¡‘=nas–Wgivš²!en“on“its“Title“P˜age,‘ƒFthen“add“an“item“describing“the“MoMÞdi ed“V‘ÿeersion“asŽ¡‘=nstated–¦fin“the“previous“sen²!tence.ަ‘-ˆ¢J.Ž‘=nPreservš²!e–æthe“net˜w˜ork“loMÞcation,‘õúif“an˜y‘ÿe,‘õúgiv˜en“in“the“DoMÞcumen˜t‘æfor“public“access“toŽ¡‘=na–½…T‘ÿeransparenš²!t“cop˜y‘½†of“the“DoMÞcumen˜t,‘ÃMand“lik˜ewise“the“net˜w˜ork‘½†loMÞcations“giv˜en“inŽ¡‘=nthe–Í„DoMÞcumenš²!t‘̓for“previous“v˜ersions‘̓it“w˜as“based“on.‘S6These‘̓ma˜y“bMÞe“placed‘̓in“theŽ¡‘=n\History"–8section.‘¦ÎY‘ÿeou›9ma²!y“omit˜a“net•²!w“ork–8loMÞcation˜for“a˜w²!ork“that˜w²!as“publishedŽ¡‘=nat–Kleast“four‘Ky²!ears“bšMÞefore“the“Do˜cumen²!t“itself,‘t@or“if“the“original‘Kpublisher“of“theŽ¡‘=nvš²!ersion–¦fit“refers“to“giv˜es“pMÞermission.ަ‘*¤åK.Ž‘=nF‘ÿeor–Ùranš²!y“section“En˜titled“\Ac˜kno˜wledgemen˜ts"“or“\Dedications",‘oPreserv˜e“the“TitleŽ¡‘=nof›/Rthe–/Qsection,‘G#and“preserv²!e˜in˜the“section˜all˜the“substance˜and“tone˜of˜eac²!h“of˜theŽ¡‘=ncon•²!tributor›¦fac“kno“wledgemen“ts˜and/or˜dedications˜giv“en˜therein.ަ‘,Q*L.Ž‘=nPreservš²!e–?Ôall‘?Óthe“In˜v‘ÿdDarian˜t›?ÓSections“of˜the“DoMÞcumen²!t,‘f/unaltered˜in“their˜text“andŽ¡‘=nin›PÜtheir–PÝtitles.‘Ý@Section“n•²!um“bMÞers˜or‘PÝthe˜equiv‘ÿdDalen“t–PÝare˜not“considered˜part“of˜theŽ¡‘=nsection‘¦ftitles.ŽŸ€‘)M.Ž‘=nDelete–°5anš²!y“section“En˜titled‘°4\Endorsemen˜ts".‘ûJSuc˜h“a“section‘°4ma˜y“not“bMÞe“includedŽ¡‘=nin–¦fthe“MoMÞdi ed“V‘ÿeersion.ަ‘*òÄN.Ž‘=nDo–g!not›g"retitle“an²!y˜existing“section“to˜bMÞe“Enš²!titled“\Endorsemen˜ts"›g"or“to˜con ict“inŽ¡‘=ntitle–¦fwith“anš²!y“In˜v‘ÿdDarian˜t“Section.ަ‘*¤åO.Ž‘=nPreserv•²!e›¦fan“y˜W‘ÿearran“t“y˜Disclaimers.ŽŸÌΑ'¿«If–Øthe›×MoMÞdi ed“V‘ÿeersion˜includes“new˜fron²!t-matter“sections˜or“appMÞendices˜that“qualifyŽ¡‘'¿«as–XSecondary›X Sections“and“con²!tain“no˜material“copied“from˜the“DoMÞcumen•²!t,‘g´y“ou˜ma“y‘XatŽ¡‘'¿«y²!our–ãkoption›ãldesignate“some˜or“all“of˜these“sections˜as“in•²!v‘ÿdDarian“t.‘”íT‘ÿeo˜do–ãkthis,‘ò­add“theirŽŽŒ‹MíHŸò‘GáAppšMÞendix–¦fA:“GNU“F‘ÿeree“Do˜cumen²!tation“License’Á:77ŽŽŽ ƒ33 ý ÌÍ‘'¿«titles–@«to“the“list›@¬of“In•²!v‘ÿdDarian“t–@«Sections“in“the“MoMÞdi ed“V‘ÿeersion's“license˜notice.‘¬¬Theseޤ 33‘'¿«titles–¦fmš²!ust“bMÞe“distinct“from“an˜y“other“section“titles.Ž©(ö‘'¿«Y‘ÿeou–pmaš²!y‘qadd“a“section“En˜titled‘q\Endorsemen˜ts",‘s²pro˜vided“it“con˜tains‘qnothing“butŽ¡‘'¿«endorsemen•²!ts›‘of‘‘y“our˜MoMÞdi ed˜V‘ÿeersion˜b“y‘‘v‘ÿdDarious˜parties|for˜example,‘•Zstatemen“ts˜ofŽ¡‘'¿«pšMÞeer–D review“or‘Dthat“the“text“has“b˜een‘Dappro•²!v“ed›D b“y˜an˜organization‘Das˜the˜authoritativ“eŽ¡‘'¿«de nition–¦fof“a“standard.ŽŸ(÷‘'¿«Y‘ÿeou–f,ma²!y›f-add“a˜passage“of˜up“to˜ vš²!e“w˜ords›f-as“a˜F›ÿeron•²!t-Co“v“er–f,T˜ext,‘sand›f-a“passage˜of“upŽ¡‘'¿«to–@25“wš²!ords‘@Žas“a“Bac˜k-Co˜v˜er“T‘ÿeext,‘Tìto›@Žthe“end“of“the˜list“of“Co•²!v“er–@T‘ÿeexts˜in“the“MoMÞdi edŽ¡‘'¿«V›ÿeersion.‘Õ+Only–N+one‘N*passage“of“F˜ron•²!t-Co“v“er‘N*T˜ext–N+and“one‘N*of“Bac•²!k-Co“v“er‘N+T˜ext‘N*ma“y‘N+bMÞeŽ¡‘'¿«added–NÁbš²!y“(or“through“arrangemen˜ts“made“b˜y)‘NÂan˜y“one“en˜tit˜y‘ÿe.‘À¦If“the“DoMÞcumen˜t“alreadyŽ¡‘'¿«includes›Éa‘Èco•²!v“er˜text–Èfor˜the˜same“co•²!v“er,‘/!previously˜added˜b“y‘Èy“ou˜or‘Èb“y˜arrangemen“tŽ¡‘'¿«made–:Çbš²!y“the“same“en˜tit˜y“y˜ou“are“acting“on“bMÞehalf“of,‘_ßy˜ou“ma˜y‘:Ènot“add“another;‘„÷butŽ¡‘'¿«y•²!ou›)ma“y˜replace–*the˜old˜one,‘2on˜explicit˜pMÞermission˜from˜the“previous˜publisher˜thatŽ¡‘'¿«added–¦fthe“old“one.ަ‘'¿«The–^author(s)›]and“publisher(s)˜of“the“DoMÞcumen²!t˜do“not“b²!y˜this“License˜giv²!e“pMÞermissionŽ¡‘'¿«to–¤juse“their›¤knames“for“publicit²!y“for“or˜to“assert“or“imply“endorsemen²!t˜of“an²!y“MoMÞdi edŽ¡‘'¿«V‘ÿeersion.ŽŸ(÷‘-5.Ž‘'¿«COMBINING‘¦fDOCUMENTSަ‘'¿«Y‘ÿeou›¦Çma•²!y‘¦Ècom“bine˜the˜DoMÞcumen“t–¦Èwith˜other“doMÞcumen²!ts˜released˜under“this˜License,Ž¡‘'¿«under–—sthe“terms›—tde ned“in“section“4˜abšMÞo•²!v“e–—sfor“mo˜di ed“v•²!ersions,‘Ó·pro“vided–—sthat“y²!ouŽ¡‘'¿«include– in› the“com²!bination“all“of˜the“In•²!v‘ÿdDarian“t– Sections˜of“all“of“the˜original“doMÞcumen²!ts,Ž¡‘'¿«unmoMÞdi ed,‘L3and–5¦list›5§them“all˜as“In•²!v‘ÿdDarian“t–5¦Sections˜of“yš²!our“com˜bined‘5§w˜ork“in‘5§its“licenseŽ¡‘'¿«notice,–¦fand“that“yš²!ou“preserv˜e“all“their“W‘ÿearran˜t˜y“Disclaimers.ަ‘'¿«The–¢@comš²!bined“w˜ork“need“only“con˜tain“one“cop˜y“of“this“License,‘£and“m˜ultiple“iden˜ticalŽ¡‘'¿«In•²!v‘ÿdDarian“t–æÝSections“maš²!y“bMÞe“replaced“with“a“single‘æÜcop˜y‘ÿe.‘ŸBIf“there“are“m˜ultiple“In˜v‘ÿdDarian˜tŽ¡‘'¿«Sections–6Çwith›6Èthe“same˜name“but˜di erenš²!t“con˜ten˜ts,‘Mmak˜e›6Èthe“title˜of“eac•²!h˜suc“h‘6ÇsectionŽ¡‘'¿«unique–bb²!y›cadding“at˜the“end˜of“it,‘1"in“paren²!theses,‘1!the˜name“of˜the“original˜author“orŽ¡‘'¿«publisher–of“that›~section“if“kno²!wn,‘!­or“else“a“unique˜n•²!um“bMÞer.‘¦‘Mak“e˜the–same“adjustmen²!tŽ¡‘'¿«to–î‡the›î†section“titles“in˜the“list“of˜In•²!v‘ÿdDarian“t–î‡Sections“in“the˜license“notice“of˜the“com²!binedŽ¡‘'¿«w²!ork.ŽŸ(÷‘'¿«In›ö"the‘ö#com•²!bination,‘Jy“ou˜m“ust‘ö#com“bine˜an“y‘ö#sections˜En“titled–ö#\History"˜in“the˜v‘ÿdDari-Ž¡‘'¿«ous–ÜÛoriginal›ÜÚdoMÞcumen²!ts,‘êxforming“one˜section“Enš²!titled“\History";‘ølik˜ewise‘ÜÚcom˜bine“an˜yŽ¡‘'¿«sections–ÑEnš²!titled“\Ac˜kno˜wledgemen˜ts",‘Û¿and“an˜y“sections“En˜titled“\Dedications".‘]çY‘ÿeouŽ¡‘'¿«mš²!ust–¦fdelete“all“sections“En˜titled“\Endorsemen˜ts."ަ‘-6.Ž‘'¿«COLLECTIONS–¦fOF“DOCUMENTSŽŸ(÷‘'¿«Y‘ÿeou–Ò¤maš²!y“mak˜e“a“collection“consisting“of‘Ò£the“DoMÞcumen˜t“and“other“doMÞcumen˜ts“releasedŽ¡‘'¿«under–this“License,‘sÚand“replace“the“individual“copies“of“this“License“in“the“v‘ÿdDariousŽ¡‘'¿«doMÞcumenš²!ts–Dwith‘Ca“single“cop˜y›Cthat“is˜included“in“the˜collection,‘y»pro²!vided˜that“y²!ouŽ¡‘'¿«follo²!w–t”the›t•rules“of˜this“License˜for“v•²!erbatim˜cop“ying‘t”of˜eac“h–t”of˜the“doMÞcumen²!ts˜in“allŽ¡‘'¿«other‘¦frespMÞects.ަ‘'¿«Y‘ÿeou–Æ=maš²!y“extract“a“single“doMÞcumen˜t“from“suc˜h“a“collection,‘Î2and“distribute“it“individu-Ž¡‘'¿«ally–4under›4this“License,‘Wnpro•²!vided˜y“ou–4insert“a“cop²!y˜of“this“License“in²!to˜the“extractedŽ¡‘'¿«doMÞcumen•²!t,‘ùøand›éBfollo“w–éAthis˜License“in“all˜other“respMÞects˜regarding“v•²!erbatim˜cop“ying‘éAofŽ¡‘'¿«that‘¦fdoMÞcumen²!t.ŽŽŒ‹Ný©Ÿò‘GáAppšMÞendix–¦fA:“GNU“F‘ÿeree“Do˜cumen²!tation“License’Á:78ŽŽŽ ƒ33 ý ÌÍ‘-7.Ž‘'¿«Aš²!GGREGA‘ÿeTION–¦fWITH“INDEPENDENT“W˜ORKSŽ©(ö‘'¿«A‘]Æcompilation–]Øof“the“DoMÞcumenš²!t‘]Ùor“its“deriv‘ÿdDativ˜es“with“other‘]Ùseparate“and“indepMÞenden˜tޤ 33‘'¿«doMÞcumen•²!ts›ÿhor‘ÿiw“orks,‘©in˜or˜on‘ÿia˜v“olume–ÿiof˜a“storage˜or˜distribution“medium,‘©is˜calledŽ¡‘'¿«an– \aggregate"“if“the› cop•²!yrigh“t– resulting“from“the“compilation“is“not˜used“to“limit“theŽ¡‘'¿«legal–1 righ²!ts›1of“the“compilation's˜users“bMÞey²!ond˜what“the“individual˜w²!orks“pMÞermit.‘¶¾WhenŽ¡‘'¿«the–žDošMÞcumen²!t“is“included‘žin“an“aggregate,‘Ûðthis“License“do˜es“not‘žapply“to“the“otherŽ¡‘'¿«wš²!orks–¦fin“the“aggregate“whic˜h“are“not“themselv˜es“deriv‘ÿdDativ˜e“w˜orks“of“the“DoMÞcumen˜t.ŽŸ(÷‘'¿«If–»Vthe“Co•²!v“er–»VT‘ÿeext“requiremenš²!t“of“section“3‘»Uis“applicable“to“these“copies“of“the“DoMÞcumen˜t,Ž¡‘'¿«then–°Dif›°Ethe“DoMÞcumen²!t“is“less˜than“one“half“of˜the“en²!tire“aggregate,‘á~the˜DoMÞcumenš²!t's“Co˜v˜erŽ¡‘'¿«T‘ÿeexts–0maš²!y“bMÞe“placed“on“co˜v˜ers“that“brac˜k˜et“the“DoMÞcumen˜t“within“the‘0aggregate,‘G°or“theŽ¡‘'¿«electronic–5qequiv‘ÿdDalenš²!t‘5pof“co˜v˜ers›5pif“the˜DoMÞcumen²!t“is“in˜electronic“form.‘ŠüOtherwise“theyŽ¡‘'¿«mš²!ust–¦fappMÞear“on“prin˜ted“co˜v˜ers“that“brac˜k˜et“the“whole“aggregate.ަ‘-8.Ž‘'¿«TRANSLA‘ÿeTIONŽŸ(÷‘'¿«T‘ÿeranslation–̯is›̰considered“a˜kind“of“moMÞdi cation,‘Aso˜yš²!ou“ma˜y‘̰distribute“translationsŽ¡‘'¿«of–Tþthe›TýDoMÞcumen²!t“under˜the“terms˜of“section“4.‘ é£Replacing“In•²!v‘ÿdDarian“t˜Sections‘TþwithŽ¡‘'¿«translations–v²requires‘v³spšMÞecial“p˜ermission“from“their›v³cop•²!yrigh“t‘v²holders,‘êÄbut˜y“ou‘v²ma“yŽ¡‘'¿«include–ðktranslations“of“some›ðjor“all“In•²!v‘ÿdDarian“t–ðkSections“in“addition˜to“the“original“v²!ersionsŽ¡‘'¿«of›Æthese‘ÆIn•²!v‘ÿdDarian“t˜Sections.‘=Y‘ÿeou‘Æma“y˜include–Æa˜translation˜of“this˜License,‘Î and“all˜theŽ¡‘'¿«license–òúnotices›òûin“the“DoMÞcumen•²!t,‘Fand˜an“y›òúW‘ÿearran“t“y˜Disclaimers,‘Fpro“vided‘òûthat˜y“ouŽ¡‘'¿«also–Ïinclude›Îÿthe“original“English˜v²!ersion“of“this“License˜and“the“original˜v²!ersions“ofŽ¡‘'¿«those–notices“and“disclaimers.‘5åIn“case“of“a“disagreemen•²!t‘bMÞet“w“een–the“translation“andŽ¡‘'¿«the–:•original›:”v²!ersion“of˜this“License˜or“a˜notice“or˜disclaimer,‘_ the“original˜v²!ersion“willŽ¡‘'¿«prev‘ÿdDail.ަ‘'¿«If–pèa“section“in‘péthe“DoMÞcumenš²!t“is“En˜titled“\Ac˜kno˜wledgemen˜ts",–{›\Dedications",“or‘pè\His-Ž¡‘'¿«tory",‘A¿the–(•requiremenš²!t“(section“4)“to“Preserv˜e“its“Title“(section“1)“will“t˜ypically“requireŽ¡‘'¿«c²!hanging–¦fthe“actual“title.ަ‘-9.Ž‘'¿«TERMINA‘ÿeTIONŽŸ(÷‘'¿«Y‘ÿeou–”maš²!y“not‘”cop˜y–ÿe,›—¾moMÞdify“,˜sublicense,˜or–”distribute“the“DoMÞcumen²!t‘”except“as“expresslyŽ¡‘'¿«proš²!vided–¡ðunder‘¡ñthis“License.‘Ð|An˜y›¡ñattempt“otherwise˜to“cop²!y–ÿe,›àÓmoMÞdify“,‘àÒsublicense,˜orŽ¡‘'¿«distribute–¦fit“is“vš²!oid,“and“will“automatically“terminate“y˜our“righ˜ts“under“this“License.ަ‘'¿«Ho•²!w“ev“er,‘ó·if›äAy“ou–ä@cease˜all“violation˜of“this“License,‘ó¸then“y²!our˜license“from˜a“particularŽ¡‘'¿«cop•²!yrigh“t–Jholder“is‘Jreinstated“(a)“proš²!visionally‘ÿe,‘sšunless“and“un˜til‘Jthe“cop˜yrigh˜t“holderŽ¡‘'¿«explicitly–á_and“ nally“terminates“yš²!our“license,‘0and“(b)“pMÞermanen˜tly‘ÿe,‘0if“the“cop˜yrigh˜tŽ¡‘'¿«holder–"fails“to“notify“yš²!ou“of“the“violation‘"b˜y“some“reasonable“means“prior“to“60“da˜ysŽ¡‘'¿«after–¦fthe“cessation.ŽŸ(÷‘'¿«Moreo•²!v“er,‘Ï8y“our–Ç license›Çfrom“a˜particular˜cop•²!yrigh“t–Ç holder˜is˜reinstated“pMÞermanen²!tly˜ifŽ¡‘'¿«the›V`cop•²!yrigh“t˜holder‘Vanoti es˜y“ou˜of˜the˜violation‘Vab“y˜some˜reasonable˜means,‘fbthis˜is˜theŽ¡‘'¿« rst–Wtime“y•²!ou‘Wha“v“e›Wreceiv“ed˜notice˜of˜violation‘Wof˜this˜License˜(for˜an“y‘Ww“ork)˜from˜thatŽ¡‘'¿«cop•²!yrigh“t–Õúholder,‘áÞand“yš²!ou“cure“the“violation“prior‘Õùto“30“da˜ys“after“y˜our‘Õùreceipt“of“theŽ¡‘'¿«notice.ަ‘'¿«T‘ÿeermination–Nuof“yš²!our“righ˜ts“under“this“section‘NtdoMÞes“not“terminate“the“licenses“of“partiesŽ¡‘'¿«who›•qha•²!v“e˜receiv“ed˜copies˜or˜righ“ts˜from˜y“ou‘•punder˜this˜License.‘ªþIf˜y“our˜righ“ts˜ha“v“eŽ¡‘'¿«bšMÞeen–Îterminated“and“not‘Íp˜ermanenš²!tly“reinstated,‘:¹receipt“of“a“cop˜y“of“some‘Íor“all“of“theŽ¡‘'¿«same–¦fmaterial“doMÞes“not“givš²!e“y˜ou“an˜y“righ˜ts“to“use“it.ŽŽŒ‹OŸò‘GáAppšMÞendix–¦fA:“GNU“F‘ÿeree“Do˜cumen²!tation“License’Á:79ŽŽŽ ƒ33 ý ÌÍ‘‡“10.Ž‘'¿«FUTURE–¦fREVISIONS“OF“THIS“LICENSEŽ©33‘'¿«The›ÿaF‘ÿeree‘ÿbSoft•²!w“are˜F‘ÿeoundation‘ÿbma“y˜publish–ÿbnew,‘UŸrevised“v²!ersions˜of“the˜GNU‘ÿ F‘ÿereeޤ 33‘'¿«DoMÞcumenš²!tation–ÙâLicense‘Ùãfrom“time“to“time.‘xRSuc˜h“new‘Ùãv˜ersions“will“bMÞe“similar‘Ùãin“spiritŽ¡‘'¿«to– æthe“presenš²!t“v˜ersion,‘?…but“ma˜y“di er“in“detail“to“address‘ ånew“problems“or“concerns.Ž¡‘'¿«See‘¦fâhttp://www.gnu.org/copyleft/á.ަ‘'¿«Eac•²!h›ˆ×v“ersion˜of˜the˜License˜is˜giv“en˜a˜distinguishing˜v“ersion˜n“um“b•MÞer.‘ÔIf˜the˜Do“cumen²!tŽ¡‘'¿«spšMÞeci es–r”that“a“particular“n•²!um“b˜ered›r”v“ersion˜of˜this˜License˜\or˜an“y˜later˜v“ersion"Ž¡‘'¿«applies‘æQto–æPit,‘öLyš²!ou“ha˜v˜e–æQthe“option‘æPof“follo˜wing“the“terms›æPand“conditions“either˜of“thatŽ¡‘'¿«spMÞeci ed–Žvš²!ersion“or“of“an˜y“later“v˜ersion“that‘Žhas“bMÞeen“published“(not“as“a“draft)“b˜yŽ¡‘'¿«the›î!F‘ÿeree‘î"Soft•²!w“are˜F‘ÿeoundation.‘µIf‘î"the˜DošMÞcumen“t‘î"do˜es–î!not“sp˜ecify›î"a“v•²!ersion˜n“um“bMÞer‘î!ofŽ¡‘'¿«this–$œLicense,‘D)yš²!ou“ma˜y“c˜hoMÞose‘$an˜y“v˜ersion“ev˜er“published“(not“as“a“draft)“b˜y“the“F‘ÿereeŽ¡‘'¿«Soft•²!w“are–ÖUF‘ÿeoundation.‘m©If“the“DošMÞcumen²!t“sp˜eci es“that“a“proš²!xy‘ÖTcan“decide“whic˜h“futureŽ¡‘'¿«v²!ersions–é)of›é*this“License˜can“bMÞe“used,‘ùÚthat˜proš²!xy's“public“statemen˜t›é*of“acceptance˜of“aŽ¡‘'¿«v•²!ersion›¦fpMÞermanen“tly˜authorizes˜y“ou˜to˜c“hoMÞose˜that˜v“ersion˜for˜the˜DoMÞcumen“t.ަ‘‡“11.Ž‘'¿«RELICENSINGަ‘'¿«\Massivš²!e–{"Multiauthor‘{#CollabMÞoration“Site"“(or“\MMC‘zìSite")“means“an˜y‘{#W‘ÿeorld“WideŽ¡‘'¿«W‘ÿeeb–Leservš²!er“that“publishes“cop˜yrigh˜table‘Lfw˜orks“and“also“pro˜vides“prominen˜t“facilitiesŽ¡‘'¿«for›M an²!yb•MÞo“dy˜to˜edit˜those˜w•²!orks.‘ÀEA‘MŠpublic˜wiki˜that‘MŸan“yb•MÞo“dy˜can˜edit˜is˜an˜example˜ofŽ¡‘'¿«sucš²!h– Ya“serv˜er.‘µA‘ ?\Massiv˜e‘ XMultiauthor“CollabMÞoration"“(or“\MMC")‘ >con˜tained“in“theŽ¡‘'¿«site–¦fmeans“anš²!y“set“of“cop˜yrigh˜table“w˜orks“th˜us“published“on“the“MMC“site.ަ‘'¿«\CC-BY-SA"‘8¤means–8Éthe‘8ÊCreativš²!e“Commons“A˜ttribution-Share‘8ÊAlik˜e“3.0‘8Êlicense“pub-Ž¡‘'¿«lished›8b•²!y‘8Creativ“e˜Commons–8CorpMÞoration,‘N(a˜not-for-pro t“corpMÞoration˜with“a˜principalŽ¡‘'¿«place–òof“business“in“San“F‘ÿerancisco,‘7£California,‘7¢as“wš²!ell“as“future“cop˜yleft“v˜ersions“of“thatŽ¡‘'¿«license–¦fpublished“b²!y“that“same“organization.ަ‘'¿«\IncorpšMÞorate"–­zmeans“to“publish‘­yor“republish“a“Do˜cumen²!t,›¯?in“whole“or‘­yin“part,˜as“partŽ¡‘'¿«of–¦fanother“DoMÞcumen²!t.ަ‘'¿«An–&\MMC‘&)‘£ ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘d}¬19ŽŽ¡’óáðÉend-of-line‘T(C-e)‘Y‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘P6¬18ŽŽ¦’óáðÉexchange-point-and-mark–T(C-x“C-x)‘”º‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘U—¬25ŽŽ¡’óáðÉexecute-named-command‘T(M-x)‘‹Ó‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘L°¬26ŽŽ¦’óáðexpand-tilde‘¶Å‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘w¡¬8ŽŽŸ €’óáðÉexport-completions‘T()U ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ê¬24ŽŽŸ Ö±’ókˆë]FŽŸxn’óáðÉfetch-history‘T()‘Ýì‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘žÉ¬21ŽŽ¡’óáðforce-meta-pre x‘ÊÆ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘‹¢¬8ŽŽ¦’óáðÉforward-backward-delete-char‘T()‘_¿‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ œ¬21ŽŽ¡’óáðÉforward-char‘T(C-f)‘@Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘£¬18ŽŽ¦’óáðÉforward-search-history‘T(C-s)=@‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘þ¬19ŽŽŸ €’óáðÉforward-word‘T(M-f)‘@Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘£¬18ŽŽŸ–°’ókˆë]HŽŸxn’óáð¬history-preserv•¾9e-pAÇoin“t‘ž‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘Þz¬8ŽŽ¡’óáðÉhistory-search-backward‘T()‘Úf‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘›C¬20ŽŽ¦’óáðÉhistory-search-forward‘T()‘(ù‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘éÖ¬20ŽŽ¡’óáðhistory-size‘é+‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ª¬9ŽŽ¦’óáðÉhistory-substring-search-backward‘T()‘å‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¥õ¬20ŽŽ¡’óáðÉhistory-substring-search-forward‘T()%s‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘æP¬20ŽŽŸ €’óáðhorizon¾9tal-scroll-moAÇde‘ƒN‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘D*¬9ŽŽŽŽŽŽŒ‹SBŸò‘GáF›ÿeunction–¦fand“V˜ariable“Index’œÃ83ŽŽŽ ƒ33Ÿæ€ ý¹®‘šßë]IŽ©‡£‘G¬input-metaMp‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘L¬9ŽŽ¤ ®¤‘GÉinsert-comment‘T(M-#)‘£ ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘d}¬26ŽŽ¡‘GÉinsert-completions‘T(M-*)‘wŒ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘8i¬24ŽŽŸ €‘Gisearc¾9h-terminatorsXº‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘—¬9ŽŽŸÜk‘šßë]Kަ‘G¬k¾9eymap‘ñá‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘²¾¬9ŽŽŸ ®¥‘GÉkill-line‘T(C-k)G‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ß$¬22ŽŽ¡‘GÉkill-region‘T()lÚ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘-·¬23ŽŽ¡‘GÉkill-whole-line‘T()‘@Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘£¬22ŽŽŸ €‘GÉkill-word‘T(M-d)G‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ß$¬22ŽŽŸý±‘šßë]Mަ‘G¬mark-moAÇdi ed-lines‘ ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘Éñ¬10ŽŽ¡‘Gmark-symlink¾9ed-directories‘ºó‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘{Ь10ŽŽ¡‘Gmatc¾9h-hidden- les‘ñø‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘²Ô¬10ŽŽ¡‘GÉmenu-complete‘T()‘Ýì‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘žÉ¬24ŽŽŸ ®¥‘GÉmenu-complete-backward‘T()‘(ù‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘éÖ¬24ŽŽ¡‘Gmen•¾9u-complete-displa“y-pre xBÝ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¹¬10ŽŽŸ €‘Gmeta- ag‘Ø‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘˜ö¬9ŽŽŸ ý²‘šßë]Nަ‘GÉnext-history‘T(C-n)‘@Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘£¬19ŽŽ¡‘GÉnext-screen-line‘T()‘ò3‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘³¬18ŽŽŸÞŸŸõ€‘GÉnon-incremental-forward-ŽŸ €‘QCsearch-history‘T(M-n) ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬19ŽŽŸÿÿŸõ€‘GÉnon-incremental-reverse-ŽŸ €‘QCsearch-history‘T(M-p) ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬19ŽŽŸ"Mµ‘šßë]Oަ‘GÉoperate-and-get-next‘T(C-o)‘Úf‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘›C¬20ŽŽŸ ®¥‘Goutput-meta‘TŒ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘h¬10ŽŽŸ €‘GÉoverwrite-mode‘T()‘Y‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘P6¬22ŽŽŸý±‘šßë]Pަ‘G¬page-completions£‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:ޑŀ¬10ŽŽ¡‘GÉpossible-completions‘T(M-?)‘Úf‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘›C¬24ŽŽ¡‘GÉprefix-meta‘T(ESC)‘Y‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘P6¬25ŽŽ¡‘GÉprevious-history‘T(C-p)z‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ÇW¬19ŽŽ¡‘GÉprevious-screen-line‘T()‘Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘†ü¬18ŽŽŸ €‘GÉprint-last-kbd-macro‘T()‘Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘†ü¬25ŽŽŸ!=²‘šßë]QŽŸXÿ‘GÉquoted-insert–T(C-q“or“C-v)pp‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘1M¬21ŽŽŽ ý¹®’ókˆë]RŽŸ à’óáðÉre-read-init-file–T(C-x“C-r)‘]ô‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘Ѭ25ŽŽ¤ †’óáðÉreadline‘r+‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘3¬28ŽŽ© †’óáðÉredraw-current-line‘T()z‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ÇW¬19ŽŽ¡’óáðÉreverse-search-history‘T(C-r)=@‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘þ¬19ŽŽ¡’óáðrev¾9ert-all-at-newlineFÆ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘£¬10ŽŽ¡’óáðÉrevert-line‘T(M-r)‘Y‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘P6¬25ŽŽ¡’óáðÉrl_activate_mark‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬48ŽŽ¦’óáðÉrl_add_defun7ß‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ø¼¬37ŽŽ¡’óáðÉrl_add_funmap_entry ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬41ŽŽ¡’óáðÉrl_add_undo‘†r‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘GO¬42ŽŽ¡’óáðÉrl_alphabetic‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬46ŽŽ¡’óáðÉrl_begin_undo_group ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬42ŽŽ¡’óáðÉrl_bind_key‘†r‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘GO¬39ŽŽ¦’óáðÉrl_bind_key_if_unbound‘B‘‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘n¬39ŽŽ¡’óáðÉrl_bind_key_if_unbound_in_map‘*Ä‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘롬39ŽŽ¡’óáðÉrl_bind_key_in_mapn¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬39ŽŽ¡’óáðÉrl_bind_keyseq‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά39ŽŽ¡’óáðÉrl_bind_keyseq_if_unboundVØ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘µ¬40ŽŽ¦’óáðÉrl_bind_keyseq_if_unbound_in_map? ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ÿè¬40ŽŽ¡’óáðÉrl_bind_keyseq_in_map‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬39ŽŽ¡’óáðÉrl_callback_handler_install‘Çê‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ˆÇ¬49ŽŽ¡’óáðÉrl_callback_handler_removeE‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘É"¬49ŽŽ¡’óáðÉrl_callback_read_char‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬49ŽŽ¡’óáðÉrl_callback_sigcleanup‘B‘‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘n¬49ŽŽ¦’óáðÉrl_check_signals‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬55ŽŽ¡’óáðÉrl_cleanup_after_signal‘óþ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘´Û¬55ŽŽ¡’óáðÉrl_clear_history‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬48ŽŽ¡’óáðÉrl_clear_message‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬43ŽŽ¡’óáðÉrl_clear_pending_input‘B‘‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘n¬45ŽŽ¡’óáðÉrl_clear_signals‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬56ŽŽ¦’óáðÉrl_clear_visible_line‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬43ŽŽ¡’óáðÉrl_complete‘†r‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘GO¬57ŽŽ¡’óáðÉrl_complete_internal‘ß·‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ ”¬57ŽŽ¡’óáðÉrl_completion_matches‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬58ŽŽ¡’óáðÉrl_completion_moden¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬58ŽŽ¦’óáðÉrl_copy_keymap‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά37ŽŽ¡’óáðÉrl_copy_text7ß‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ø¼¬44ŽŽ¡’óáðÉrl_crlf‘À¾‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘›¬43ŽŽ¡’óáðÉrl_deactivate_markn¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬48ŽŽ¡’óáðÉrl_delete_text‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά44ŽŽ¡’óáðÉrl_deprep_terminaln¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬45ŽŽ¦’óáðÉrl_ding‘À¾‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘›¬46ŽŽ¡’óáðÉrl_discard_keymap‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬38ŽŽ¡’óáðÉrl_display_match_list‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬47ŽŽ¡’óáðÉrl_do_undo‘Õ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘•â¬42ŽŽ¡’óáðÉrl_echo_signal_char ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬55ŽŽ¦’óáðÉrl_empty_keymap‘Z^‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘;¬38ŽŽ¡’óáðÉrl_end_undo_group‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬42ŽŽ¡’óáðÉrl_execute_next‘Z^‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘;¬45ŽŽ¡’óáðÉrl_expand_prompt‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬43ŽŽ¡’óáðÉrl_extend_line_buffer‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬46ŽŽ¡’óáðÉrl_filename_completion_function‘ž‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘N{¬58ŽŽ¦’óáðÉrl_forced_update_display‘¥k‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘fH¬42ŽŽ¡’óáðÉrl_free‘À¾‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘›¬46ŽŽ¡’óáðÉrl_free_keymap‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά38ŽŽŽŽŽŽŒ‹TdŸò‘GáF›ÿeunction–¦fand“V˜ariable“Index’œÃ84ŽŽŽ ƒ33Ÿæ€ ýµ™™‘GÉrl_free_line_staten¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬55ŽŽ¤ ©m‘GÉrl_free_undo_list‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬42ŽŽ¡‘GÉrl_function_dumpern¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬41ŽŽ¡‘GÉrl_function_of_keyseq‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬40ŽŽ¡‘GÉrl_function_of_keyseq_lenVØ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘µ¬40ŽŽ¡‘GÉrl_funmap_names‘Z^‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘;¬41ŽŽ¡‘GÉrl_generic_bind‘Z^‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘;¬40ŽŽ© ©l‘GÉrl_get_keymap‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬38ŽŽ¡‘GÉrl_get_keymap_by_name‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬38ŽŽ¡‘GÉrl_get_keymap_namen¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬38ŽŽ¡‘GÉrl_get_screen_sizen¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬56ŽŽ¡‘GÉrl_get_termcap‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά48ŽŽ¡‘GÉrl_getc‘À¾‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘›¬45ŽŽ¡‘GÉrl_initialize‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬46ŽŽ¡‘GÉrl_insert_completions‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬57ŽŽ¡‘GÉrl_insert_text‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά44ŽŽ¡‘GÉrl_invoking_keyseqs ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬41ŽŽ¡‘GÉrl_invoking_keyseqs_in_mapE‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘É"¬41ŽŽ¡‘GÉrl_keep_mark_active ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬48ŽŽ¡‘GÉrl_kill_text7ß‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ø¼¬44ŽŽ¡‘GÉrl_list_funmap_names‘ß·‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ ”¬41ŽŽ¦‘GÉrl_macro_bind‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬47ŽŽ¡‘GÉrl_macro_dumper‘Z^‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘;¬47ŽŽ¡‘GÉrl_make_bare_keymap ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬37ŽŽ¡‘GÉrl_make_keymap‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά38ŽŽ¡‘GÉrl_mark_active_p‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬48ŽŽ¡‘GÉrl_message‘Õ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘•â¬43ŽŽ¡‘GÉrl_modifying7ß‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ø¼¬42ŽŽ¡‘GÉrl_named_function‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬40ŽŽ¡‘GÉrl_on_new_line‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά43ŽŽ¡‘GÉrl_on_new_line_with_promptE‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘É"¬43ŽŽ¡‘GÉrl_parse_and_bind‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬40ŽŽ¡‘GÉrl_pending_signal‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬55ŽŽ¡‘GÉrl_possible_completions‘óþ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘´Û¬57ŽŽ¡‘GÉrl_prep_terminal‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬45ŽŽ¦‘GÉrl_print_keybinding ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬41ŽŽ¡‘GÉrl_push_macro_input ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬44ŽŽ¡‘GÉrl_read_init_file‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬40ŽŽ¡‘GÉrl_read_key‘†r‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘GO¬44ŽŽ¡‘GÉrl_redisplay7ß‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ø¼¬42ŽŽ¡‘GÉrl_reparse_colors‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬48ŽŽ¡‘GÉrl_replace_line‘Z^‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘;¬44ŽŽ¡‘GÉrl_reset_after_signal‘‘$‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘R¬55ŽŽ¡‘GÉrl_reset_line_state ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘àï¬43ŽŽ¡‘GÉrl_reset_screen_size‘ß·‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ ”¬56ŽŽ¡‘GÉrl_reset_terminal‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬46ŽŽ¡‘GÉrl_resize_terminaln¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬55ŽŽ¡‘GÉrl_restore_prompt‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬43ŽŽ¡‘GÉrl_restore_state‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬46ŽŽ¦‘GÉrl_save_prompt‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά43ŽŽ¡‘GÉrl_save_state‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬46ŽŽ¡‘GÉrl_set_key‘Õ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘•â¬40ŽŽ¡‘GÉrl_set_keyboard_input_timeout‘*Ä‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘롬45ŽŽ¡‘GÉrl_set_keymap‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬38ŽŽ¡‘GÉrl_set_keymap_namen¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬38ŽŽ¡‘GÉrl_set_paren_blink_timeoutE‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘É"¬48ŽŽŽ ýµ™™’óáðÉrl_set_prompt‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬44ŽŽ¤ X’óáðÉrl_set_screen_sizen¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬55ŽŽ¡’óáðÉrl_set_signals‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά56ŽŽ¡’óáðÉrl_set_timeout‘¨ñ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘iά45ŽŽ¡’óáðÉrl_show_char7ß‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ø¼¬43ŽŽ¡’óáðÉrl_stuff_char‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬45ŽŽ¡’óáðÉrl_timeout_remaining‘ß·‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ ”¬45ŽŽ¡’óáðÉrl_trim_arg_from_keyseq‘óþ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘´Û¬41ŽŽŸ W’óáðÉrl_tty_set_default_bindings‘Çê‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ˆÇ¬46ŽŽ¡’óáðÉrl_tty_set_echoingn¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬46ŽŽ¡’óáðÉrl_tty_unset_default_bindings‘*Ä‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘롬46ŽŽ¡’óáðÉrl_unbind_command_in_map‘¥k‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘fH¬39ŽŽ¡’óáðÉrl_unbind_function_in_mapVØ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘µ¬39ŽŽ¡’óáðÉrl_unbind_key‘÷„‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘¸a¬39ŽŽ¡’óáðÉrl_unbind_key_in_map‘ß·‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ ”¬39ŽŽ¡’óáðÉrl_username_completion_function‘ž‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘N{¬58ŽŽ¡’óáðÉrl_variable_bind‘ Ë‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘̨¬47ŽŽ¡’óáðÉrl_variable_dumpern¥‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘/‚¬48ŽŽ© €’óáðÉrl_variable_value‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬48ŽŽŸ²ù’ókˆë]SŽŸR’óáð¬searc¾9h-ignore-case‘œº‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘]—¬11ŽŽ¡’óáðÉself-insert–T(a,“b,“A,“1,“!,“...Ž‘B)‘a‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘Ð>¬21ŽŽ¡’óáðÉset-mark‘T(C-@)lÚ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘-·¬25ŽŽ¡’óáðsho•¾9w-all-if-am“biguous‘h¹‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘)•¬11ŽŽ¡’óáðsho¾9w-all-if-unmoAÇdi edg¿‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘(œ¬11ŽŽ¡’óáðsho¾9w-moAÇde-in-prompt‘Ç¿‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ˆœ¬11ŽŽ¡’óáðskip-completed-text‘ N‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘Ì*¬11ŽŽ¡’óáðÉskip-csi-sequence‘T()‘£ ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘d}¬26ŽŽ¦’óáðÉstart-kbd-macro–T(C-x“()‘Š‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘Jå¬25ŽŽŸ’p’ókˆë]TŽŸR’óáðÉtab-insert‘T(M-TAB)‘@Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘£¬21ŽŽ¡’óáðÉtilde-expand‘T(M-~)‘@Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘£¬25ŽŽ¡’óáðÉtranspose-chars‘T(C-t)U ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ê¬21ŽŽ¦’óáðÉtranspose-words‘T(M-t)U ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ê¬22ŽŽŸÒr’ókˆë]UŽŸR’óáðÉundo–T(C-_“or“C-x“C-u)‘½8‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘~¬25ŽŽ¡’óáðÉuniversal-argument‘T()U ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ê¬23ŽŽ¡’óáðÉunix-filename-rubout‘T()‘Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘†ü¬23ŽŽ¡’óáðÉunix-line-discard‘T(C-u)‘Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘†ü¬22ŽŽ¡’óáðÉunix-word-rubout‘T(C-w)z‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘ÇW¬23ŽŽ¦’óáðÉupcase-word‘T(M-u)‘Y‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘P6¬22ŽŽŸÒr’ókˆë]VŽŸR’óáð¬vi-cmd-moAÇde-string‘‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘Mñ¬11ŽŽ¡’óáðÉvi-editing-mode‘T(M-C-j)‘Æ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘†ü¬26ŽŽŸ W’óáðvi-ins-moAÇde-string=‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘þz¬12ŽŽ¦’óáðvisible-stats‘œ^‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘];¬12ŽŽŽŽŽŽŒ‹UæŸò‘GáF›ÿeunction–¦fand“V˜ariable“Index’œÃ85ŽŽŽ ƒ33 ýÍ¥ŸÒˆõ‘šßë]YŽŸ ÷ ‘GÉyank‘T(C-y)‘§&‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘h¬23ŽŽ¤ €‘GÉyank-last-arg–T(M-.“or“M-_)pp‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘1M¬20ŽŽ¡‘GÉyank-nth-arg‘T(M-C-y)‘£ ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘d}¬20ŽŽ¡‘GÉyank-pop‘T(M-y)lÚ‘ÅU²:Ž–p‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž“‘ÅU:Ž‘-·¬23ŽŽŽŽŽŽŒøI…ƒ’À;è…ïÿïÿYógÂÖN  #× cmbx12óe·ág£ff cmmi12ó]ÂÖN ff cmbx12óTÂÖN G® cmbx12óKÂÖN ¼j cmbx12óFßê  b> ó3 cmmi10ó=ßê. * Menu: * Command Line Editing:: GNU Readline User's Manual. * GNU Free Documentation License:: License for copying this manual.  File: rluserman.info, Node: Command Line Editing, Next: GNU Free Documentation License, Prev: Top, Up: Top 1 Command Line Editing ********************** This chapter describes the basic features of the GNU command line editing interface. * Menu: * Introduction and Notation:: Notation used in this text. * Readline Interaction:: The minimum set of commands for editing a line. * Readline Init File:: Customizing Readline from a user's view. * Bindable Readline Commands:: A description of most of the Readline commands available for binding * Readline vi Mode:: A short description of how to make Readline behave like the vi editor.  File: rluserman.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing 1.1 Introduction to Line Editing ================================ The following paragraphs use Emacs style to describe the notation used to represent keystrokes. The text ‘C-k’ is read as 'Control-K' and describes the character produced when the key is pressed while the Control key is depressed. The text ‘M-k’ is read as 'Meta-K' and describes the character produced when the Meta key (if you have one) is depressed, and the key is pressed (a “meta characterâ€), then both are released. The Meta key is labeled or