./numdiff-5.8.1/0000777000175000017500000000000012215353073012331 5ustar ivanoivano./numdiff-5.8.1/linesplit.h0000644000175000017500000000275312215353073014510 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #define I_DEF_SEP ' ' #define DEF_IFS "\\s \\t \\n" #define NEWLINE_STR "\n" char** ssplit (const char* str, char separator); char** ssplit_former_way (const char* str); void print_string_vector (FILE* fp, const char** sv, char separator); void sort_string_vector (char** sv); void remove_duplicates_from_string_vector (char** sv); int is_string_in_vector (const char* str, const char** sv); size_t is_char_in_vector (int ch, const char** sv); void delete_string_vector (char** sv); char* get_separating_string (const char* istr); char* string_cspn (const char* str, const char** svi, int eos); char* string_spn (const char* str, const char** svi, int eos); ./numdiff-5.8.1/INSTALL0000444000175000017500000003505612215353073013365 0ustar ivanoivano Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. *********************************************************************************** How to build and install Numdiff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option `-o' to write its output to a specified file, the option `-D' for macros pre-definition, the option `-l' to search for a specified library, and the options `-I' and `-L' to add a given directory to the search path for include and library files respectively. Numdiff has been successfully compiled and tested on: - Slackware(R) GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), - Slackware GNU/Linux 11 with GCC 3.4.6, - Slackware GNU/Linux 12.2 with GCC 4.2.4, - Slackware GNU/Linux 13 with GCC 4.3.3, - Debian(R) GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), - Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), - Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), - SunOS(R) 5.8 with GCC 2.95.3, and - SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. Moreover, you need a POSIX implementation of the `make' utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands `rm' and `find'. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Configuration, building and installation of Numdiff can be performed through the standard three steps: ./configure make make install If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then, after `make', you will have to type and run make install-nls By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/info' etc. You can specify an installation prefix other than `/usr/local' using the option `--prefix' in the `configure' step, for instance `--prefix=$HOME': ./configure --prefix=$HOME For better control, you can use the options `--bindir', `--infodir', and so on. Type `./configure --help' to obtain the complete list of all the available options. Anyway, the documentation files, including a full User Manual available in several formats (HTML, PDF and plain ASCII text), will always be put in `DOCDIR/numdiff', where `DOCDIR' is the path specified by the option `--docdir' or, if this option has not been given to `configure', `PREFIX/share/doc'. Here `PREFIX' is the installation prefix specified by the option `--prefix' or the default `/usr/local'. Once Numdiff has been installed you can remove all the files previously installed by a simple `make uninstall'. If you have also installed the localization files trough `make install-nls', then, in order to remove also these ones, use `make uninstall-nls' in place of `make uninstall'. Between the options accepted by `configure' there are `--enable-debug', `--enable-optimization', `--enable-nls' and `--enable-gmp'. The option `--enable-debug' turns on debugging when compiling the source code. This is obtained by passing to the compiler the `-g' option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable `DBGFLAGS' before calling `configure'. The option `--enable-optimization' turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the `-O' option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable `OPTFLAGS' before calling `configure'. The option `--enable-nls' turns on Natural Language Support. But you do not need to use it explicitly, since Natural Language Support is enabled by default. However, you can disable it by using `--disable-nls'. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for instance, through ./configure --disable-nls make make install Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option `--enable-gmp=no' or `--disable-gmp' to the configure script before building the program, like in ./configure --disable-gmp make make install Enabling the old internal support for multiple precision arithmetic is deprecated, I suggest to always link Numdiff against GNU MP. The latest version of GNU MP is available at ftp://ftp.gnu.org/gnu/gmp/. See the GNU MP web page at http://gmplib.org/ for up-to-date information on GNU MP. Below, I have attached the generic INSTALL instructions included in the autoconf distribution. ---------------------------------------------------------------------------- Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. 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 each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package 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 awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package 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 support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. 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: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. ./numdiff-5.8.1/linesplit.c0000644000175000017500000003755612215353073014514 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include #include #include #include"linesplit.h" #define O_DEF_SEP '\n' #define ESC_CHAR '\\' const unsigned char InvDigit = (unsigned char) -1; static unsigned char is_hex_digit (char ch) { if (ch >= '0' && ch <= '9') return ch - '0'; else { switch (ch) { case 'a': case 'A': return 10; case 'b': case 'B': return 11; case 'c': case 'C': return 12; case 'd': case 'D': return 13; case 'e': case 'E': return 14; case 'f': case 'F': return 15; default: return InvDigit; } } } static unsigned char is_oct_digit (char ch) { if (ch >= '0' && ch <= '7') return ch - '0'; else return InvDigit; } static int is_hex (const char* pafter_escape, char* byte) { unsigned char hb, lb; /* The return value is the number of hexadecimal digits successfully read */ if ( (hb = is_hex_digit (*pafter_escape)) != InvDigit ) { int rv = 1; lb = is_hex_digit (*(pafter_escape+1)); if (lb == InvDigit) { lb = hb; hb = 0; } else rv = 2; if ((byte)) *byte = (char)(16 * hb + lb); return rv; } else { if ((byte)) *byte = -1; return 0; } } static int is_oct (const char* pafter_escape, char* byte) { unsigned char ho, mo, lo; /* The return value is the number of octal digits successfully read */ if ( (ho = is_oct_digit (*pafter_escape)) != InvDigit ) { int rv = 1; mo = is_oct_digit (*(pafter_escape+1)); lo = is_oct_digit (*(pafter_escape+2)); if (mo == InvDigit) { lo = ho; ho = 0; mo = 0; } else { rv++; if (lo == InvDigit) { lo = mo; mo = ho; ho = 0; } else rv++; } if ((byte)) *byte = (char)(64 * ho + 8 * mo + lo); return (64 * (int)ho + 8 * (int)mo + (int)lo < 256 ? rv : 0); } else { if ((byte)) *byte = -1; return 0; } } static char process_character (const char* chp, const char** new_chp) { const char* nchp; char byte; int r; if (*chp == ESC_CHAR) { switch (*(chp+1)) { case 'a': byte = '\a'; nchp = chp+2; break; case 'b': byte = '\b'; nchp = chp+2; break; case 'f': byte = '\f'; nchp = chp+2; break; case 'n': byte = '\n'; nchp = chp+2; break; case 'r': byte = '\r'; nchp = chp+2; break; case 't': byte = '\t'; nchp = chp+2; break; case 'v': byte = '\v'; nchp = chp+2; break; case 's': byte = ' '; nchp = chp+2; break; case 'x': if ( (r = is_hex (chp+2, &byte)) && byte != '\0' ) nchp = chp + (r + 2); else { byte = *(chp+1); nchp = chp+2; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': if ( (r = is_oct (chp+1, &byte)) && byte != '\0' ) nchp = chp + (r + 1); else { byte = *(chp+1); nchp = chp+2; } break; default: byte = *(chp+1); nchp = chp+2; break; } } else { byte = *chp; nchp = chp+1; } if ((new_chp)) *new_chp = nchp; return byte; } /* Remark: process the substring [BPTR, EPTR) and return the result (NULL in case of error while allocating memory for the result). Precondition is EPTR >= BPTR. */ static char* process_substring (const char* bptr, const char* eptr) { size_t subssize = eptr - bptr + 1; const char* ptr; char *pstr, *pstrp; if ( !(pstr = (char*) calloc(subssize, sizeof(char))) ) return NULL; else { for (pstrp = pstr, ptr = bptr; ptr < eptr; pstrp++) { *pstrp = process_character (ptr, &ptr); } return pstr; } } /* Create and return a vector of strings using the description contained in the string pointed to by STR. The items in STR (to each of which should correspond a string in the returned vector) are separated by the character SEPARATOR. In case of error while allocating memory for the vector and its elements return NULL. Return NULL also if STR == NULL. Remark: SEPARATOR cannot be the nul character. Return NULL if SEPARATOR is the nul character. */ char** ssplit (const char* str, char separator) { size_t i, n; const char *beg, *ptr, *ptr2sep; char** sv; if (!str || separator == '\0') return NULL; for (beg = str; *beg == separator; beg++); /* Now BEG points to the first charatacrer of the buffer pointed to by STR which is not equal to SEPARATOR. */ /* First count the substrings contained in the buffer pointed to by STR. */ for (n = 1, ptr = beg; (ptr2sep = strchr (ptr, separator)) != NULL; n++) { for (ptr = ptr2sep+1; *ptr == separator; ptr++); } /* Now allocate memory for a vector of N+1 char*. If the allocation fails, return NULL. */ if ( !(sv = (char**) malloc ((n+1)*sizeof(char*))) ) return NULL; sv[n] = NULL; for (i = 0, ptr = beg; (ptr2sep = strchr (ptr, separator)) != NULL; i++) { sv[i] = process_substring (ptr, ptr2sep); if (!sv[i]) { delete_string_vector (sv); return NULL; } for (ptr = ptr2sep+1; *ptr == separator; ptr++); } if (*ptr != '\0') { ptr2sep = strchr (ptr, '\0'); sv[i] = process_substring (ptr, ptr2sep); if (!sv[i]) { delete_string_vector (sv); return NULL; } } return sv; } /* Create and return a vector of strings using the characters contained in the string pointed to by STR. To each (eventually escaped) character in this string will correspond exactly one string in the returned vector. Return NULL if STR == NULL or in case of out of memory. */ char** ssplit_former_way (const char* str) { if ((str)) { size_t n, ls = strlen(str); char **sv; const char *ptr, *nptr; sv = (char**) calloc (ls + 1, sizeof(char*)); if (!sv) return NULL; for (n = 0, ptr = str; *ptr != '\0'; ptr = nptr, n++) { sv[n] = (char*) malloc (2 *sizeof(char)); if ((sv[n])) { sv[n][0] = process_character (ptr, &nptr); sv[n][1] = '\0'; } else { delete_string_vector (sv); return NULL; } } return sv; } else return NULL; } /* Process the string pointed to by ISTR and return the result (NULL in case of error while allocating memory for the result). */ char* get_separating_string (const char* istr) { return process_substring (istr, istr+strlen(istr)); } /* Write to the file pointed to by FP the strings contained in the vector SV. Use SEPARATOR to separate each string from the following one. */ void print_string_vector (FILE* fp, const char** sv, char separator) { size_t n; if (!sv) { fputs ("", fp); fputc (separator, fp); } else { for (n = 0; sv[n] != NULL; n++) { fprintf (fp, "\"%s\"%c", sv[n], separator); } } } /* Rearrange the strings of the vector SV in descending order with respect to their length. Rem.: Pre-condition is that SV is NULL-terminated. This function is suitable only for small vectors, since it uses a bubble-sort algorithm. */ void sort_string_vector (char** sv) { if ((sv)) { size_t n, m, l, lmax, poslmax; char *tmp; for (n = 0; sv[n] != NULL; n++) { lmax = strlen(sv[n]); poslmax = n; for (m = n+1; sv[m] != NULL; m++) { if ( (l = strlen(sv[m])) > lmax ) { lmax = l; poslmax = m; } } tmp = sv[n]; sv[n] = sv[poslmax]; sv[poslmax] = tmp; } } } /* Remove duplicates from the vector SV. */ void remove_duplicates_from_string_vector (char** sv) { if ((sv)) { size_t k, m, n; for (n = 0; sv[n] != NULL; n++) { m = n+1; while (sv[m] != NULL) { if (strcmp (sv[m], sv[n]) == 0) { free((void*)sv[m]); for (k = m+1; sv[k] != NULL; k++) sv[k-1] = sv[k]; sv[k-1] = NULL; } else m++; } } } } /* Return 1 if the string pointed to by STR is found in the vector SV, otherwise 0. 0 should be also returned if STR or SV is NULL. */ int is_string_in_vector (const char* str, const char** sv) { if ((sv) && (str)) { size_t n; for (n = 0; sv[n] != NULL && strcmp(str, sv[n]) != 0; n++); return (sv[n] == NULL ? 0 : 1); } else return 0; } /* Return 0 if there is no string in the vector SV which contains the character CH, otherwise return the length of the longest string between those ones which contain the character CH. 0 should also be returned if SV is null. */ size_t is_char_in_vector (int ch, const char** sv) { if ((sv)) { size_t l, lm, n; for (lm = n = 0; sv[n] != NULL; n++) { if ( (strchr (sv[n], ch)) && (l = strlen (sv[n])) > lm) lm = l; } return lm; } else return 0; } /* Remove the memory allocated for the strings of the vector SV and then free the memory allocated for the vector itself. */ void delete_string_vector (char** sv) { size_t n; if ((sv)) { for (n = 0; sv[n] != NULL; n++) { free ((void*)sv[n]); } free((void*)sv); } } /* Return a pointer to the position following the initial segment of STR that does not contain any string from the vector SV. If such an initial segment does not exist, return a pointer to STR. Consider the string STR as ending at the first occurrence of EOS. SV must be NULL terminated, it cannot contain the empty ("") string nor a string of length > 1 with EOS being one of its non-null characters (but SV may well contain the string of length 1 having EOS as its only non-null character). Rem.: EOS can be the null character. If the string pointed to by STR does not contain any EOS character, a buffer overrun will occur. */ char* string_cspn (const char* str, const char** sv, int eos) { register const char *sviptr; register const char *endptr; register const char *nendptr; register const char *ptr; register size_t n; if (!str || !sv) { /* security check */ return NULL; } else { for (endptr = str; *endptr != eos; endptr++); for (nendptr = str; nendptr < endptr; nendptr++) { for (n = 0; sv[n] != NULL; n++) { for (ptr = nendptr, sviptr = sv[n]; *sviptr != '\0' && *sviptr == *ptr; sviptr++, ptr++); if (*sviptr == '\0') return (char*)nendptr; } } return (char*)nendptr; } } /* Return a pointer to the position following the initial segment of STR that consists entirely of strings from the vector SV. If such an initial segment does not exist, return a pointer to STR. Consider the string STR as ending at the first occurrence of EOS. SV must be NULL terminated, it cannot contain the empty ("") string nor a string of length > 1 with EOS being one of its non-null characters (but SV may well contain the string of length 1 having EOS as its only non-null character). Rem.: this function works under the assumption that the strings in the vector SV are ordered according to their lengths, where SV[0] is the string with the greatest length. EOS can be the null character. */ char* string_spn (const char* str, const char** sv, int eos) { register const char *ptr; register const char *nptr; register const char *sviptr; register size_t n; if (!str || !sv) { /* security check */ return NULL; } else { ptr = str; while (*ptr != eos) { /* Rem.: if strlen(sv[n])== 1 and sv[n][0] == EOS, then strstr(ptr, sv[n]) != ptr. Thus, whenever the following for cycle terminates, sv[n] can not be equal to the string "" (i.e. the string having EOS as its only null character). */ for (n = 0; sv[n] != NULL; n++) { for (nptr = ptr, sviptr = sv[n]; *sviptr!='\0' && *sviptr == *nptr; sviptr++, nptr++); if (*sviptr == '\0') { /* Rem.: if sv[n] does not contain any EOS, then by setting PTR to NPTR we do not skip any EOS. */ ptr = nptr; break; } } if (!sv[n]) break; } return (char*)ptr; } } #ifdef _TEST_LINE_SPLIT_ #define I_DEF_SEP ' ' static void print_help (const char* progname) { printf ("Usage: %s STRING\n\n", progname); } static void print_substring (FILE* fp, const char* bptr, const char* eptr, int nl) { const char *ptr; if (eptr > bptr) { for (ptr = bptr; ptr != eptr; ptr++) { putc (*ptr, fp); } if ((nl)) putc ('\n', fp); } } #define BUFFSIZE 1024 int main (int argc, char* argv[]) { if (argc != 2) { print_help(argv[0]); return 1; } else { char** string_vector = NULL; char** sv = NULL; char linebuff[BUFFSIZE] = ""; char *rv, *ptr, *endptr; size_t l; string_vector = ssplit (argv[1], I_DEF_SEP); sv = ssplit_former_way (argv[1]); remove_duplicates_from_string_vector (string_vector); remove_duplicates_from_string_vector (sv); sort_string_vector (string_vector); print_string_vector (stdout, (const char**)string_vector, O_DEF_SEP); l = is_char_in_vector (':', string_vector); printf ("Length of the longest string containing \':\' = %zu\n", l); puts ("\n\nSplitting the string in the former way produces the following result:"); print_string_vector (stdout, (const char**)sv, O_DEF_SEP); do { #ifdef _MINOR_TEST_ puts ("\nEnter a line of text (Ctrl+D to terminate)"); #endif rv = fgets (linebuff, BUFFSIZE, stdin); if ((rv)) { #ifdef _MINOR_TEST_ ptr = string_cspn (linebuff, (const char**)string_vector, '\0'); fputs ("Cspn =", stdout); print_substring (stdout, linebuff, ptr, 0); fputs ("|EoS|\n", stdout); ptr = string_spn (linebuff, (const char**)string_vector, '\0'); fputs ("Spn =", stdout); print_substring (stdout, linebuff, ptr, 0); fputs ("|EoS|\n", stdout); #else unsigned long fieldno; for (fieldno = 1, ptr = linebuff; *ptr != '\0'; fieldno++) { ptr = string_spn (ptr, (const char**)string_vector, '\0'); endptr = string_cspn (ptr, (const char**)string_vector, '\0'); if ((*ptr)) { printf ("%3lu.>", fieldno); print_substring (stdout, ptr, endptr, 0); puts ("<"); } ptr = endptr; } putchar ('\n'); #endif /* _MINOR_TEST_ */ } } while ((rv)); delete_string_vector (string_vector); return 0; } } #endif /* _TEST_LINE_SPLIT_ */ ./numdiff-5.8.1/getopt1.c0000644000175000017500000000765212215353073014066 0ustar ivanoivano/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #ifdef _LIBC # include #else # include "getopt.h" #endif #include "getopt_int.h" #include /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 0, 0); } int _getopt_long_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 0, 0, d); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 1, 0); } int _getopt_long_only_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 1, 0, d); } #ifdef TEST #include int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ ./numdiff-5.8.1/side.c0000444000175000017500000002537412215353073013426 0ustar ivanoivano/* sdiff-format output routines for GNU DIFF. Copyright (C) 1991, 1992, 1993, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. No author or distributor accepts responsibility to anyone for the consequences of using it or for whether it serves any particular purpose or works at all, unless he says so in writing. Refer to the GNU DIFF General Public License for full details. Everyone is granted permission to copy, modify and redistribute GNU DIFF, but only under the conditions described in the GNU DIFF General Public License. A copy of this license is supposed to have been given to you along with GNU DIFF so you can know your rights and responsibilities. It should be in a file named COPYING. Among other things, the copyright notice and this notice must be preserved on all copies. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff 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. Numdiff 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 "numdiff.h" static void print_sdiff_common_lines (lin, lin); static void print_sdiff_hunk (struct change *); /* Next line number to be printed in the two input files. */ static lin next0, next1; /* Print the edit-script SCRIPT as a sdiff style output. */ void print_sdiff_script (struct change *script) { next0 = next1 = - files[0].prefix_lines; print_script (script, print_sdiff_hunk); print_sdiff_common_lines (files[0].valid_lines, files[1].valid_lines); } /* Tab from column FROM to column TO, where FROM <= TO. Yield TO. */ static unsigned int tab_from_to (unsigned int from, unsigned int to) { FILE *out = outfile; unsigned int tab; if (!expand_tabs) for (tab = from + TAB_WIDTH - from % TAB_WIDTH; tab <= to; tab += TAB_WIDTH) { putc ('\t', out); from = tab; } while (from++ < to) putc (' ', out); return to; } /* * Print the text for half an sdiff line. This means truncate to width * observing tabs, and trim a trailing newline. Returns the last column * written (not the number of chars). */ static unsigned int print_half_line (char const *const *line, unsigned int indent, unsigned int out_bound) { FILE *out = outfile; register unsigned int in_position = 0; register unsigned int out_position = 0; register char const *text_pointer = line[0]; register char const *text_limit = line[1]; while (text_pointer < text_limit) { register unsigned char c = *text_pointer++; switch (c) { case '\t': { unsigned int spaces = TAB_WIDTH - in_position % TAB_WIDTH; if (in_position == out_position) { unsigned int tabstop = out_position + spaces; if ((expand_tabs)) { if (out_bound < tabstop) tabstop = out_bound; for (; out_position < tabstop; out_position++) putc (' ', out); } else if (tabstop < out_bound) { out_position = tabstop; putc (c, out); } } in_position += spaces; } break; case '\r': { putc (c, out); tab_from_to (0, indent); in_position = out_position = 0; } break; case '\b': if (in_position != 0 && --in_position < out_bound) { if (out_position <= in_position) /* Add spaces to make up for suppressed tab past out_bound. */ for (; out_position < in_position; out_position++) putc (' ', out); else { out_position = in_position; putc (c, out); } } break; case '\f': case '\v': control_char: if (in_position < out_bound) putc (c, out); break; default: if (! ISPRINT (c)) goto control_char; /* falls through */ case ' ': if (in_position++ < out_bound) { out_position = in_position; putc (c, out); } break; case '\n': return out_position; } } return out_position; } /* * Print side by side lines with a separator in the middle. * 0 parameters are taken to indicate white space text. * Blank lines that can easily be caught are reduced to a single newline. */ static void print_1sdiff_line (char const *const *left, char sep, char const *const *right) { FILE *out = outfile; unsigned int hw = sdiff_half_width, c2o = sdiff_column2_offset; unsigned int col = 0; bool put_newline = 0; if (left) { put_newline |= left[1][-1] == '\n'; col = print_half_line (left, 0, hw); } if (sep != ' ') { col = tab_from_to (col, (hw + c2o - 1) / 2) + 1; if (sep == '|' && put_newline != (right[1][-1] == '\n')) sep = put_newline ? '/' : '\\'; putc (sep, out); } if (right) { put_newline |= right[1][-1] == '\n'; if (**right != '\n') { col = tab_from_to (col, c2o); print_half_line (right, col, hw); } } if (put_newline) putc ('\n', out); } /* Print lines common to both files in side-by-side format. */ static void print_sdiff_common_lines (lin limit0, lin limit1) { lin i0 = next0, i1 = next1; /* long len0, len1; */ if (i0 != limit0 || i1 != limit1) { if (!suppress_common_lines) { while (i0 != limit0 && i1 != limit1) print_1sdiff_line (&files[0].linbuf[i0++], ' ', &files[1].linbuf[i1++]); while (i1 != limit1) print_1sdiff_line (0, ')', &files[1].linbuf[i1++]); while (i0 != limit0) print_1sdiff_line (&files[0].linbuf[i0++], '(', 0); } /* else */ /* { */ /* len0 = limit0 - i0; */ /* len1 = limit1 - i1; */ /* fprintf (outfile, "i%ld,%ld\n", len0, len1); */ /* } */ } next0 = limit0; next1 = limit1; } /* Print a hunk of an sdiff diff. This is a contiguous portion of a complete edit script, describing changes in consecutive lines. */ static void print_sdiff_hunk (struct change *hunk) { lin first0, last0, first1, last1; register lin i, j; /* Determine range of line numbers involved in each file. */ enum changes changes = analyze_hunk (hunk, &first0, &last0, &first1, &last1); if (!changes) return; /* Print out lines up to this change. */ print_sdiff_common_lines (first0, first1); /* if ((suppress_common_lines)) */ /* { */ /* long len0 = last0 - first0 + 1; */ /* long len1 = last1 - first1 + 1; */ /* fprintf (outfile, "c%ld,%ld\n", len0, len1); */ /* } */ /* Print ``xxx | xxx '' lines */ if (changes == CHANGED) { for (i = first0, j = first1; i <= last0 && j <= last1; i++, j++) print_1sdiff_line (&files[0].linbuf[i], '|', &files[1].linbuf[j]); changes = (i <= last0 ? OLD : 0) + (j <= last1 ? NEW : 0); next0 = first0 = i; next1 = first1 = j; } /* Print `` > xxx '' lines */ if (changes & NEW) { for (j = first1; j <= last1; ++j) print_1sdiff_line (0, '>', &files[1].linbuf[j]); next1 = j; } /* Print ``xxx < '' lines */ if (changes & OLD) { for (i = first0; i <= last0; ++i) print_1sdiff_line (&files[0].linbuf[i], '<', 0); next0 = i; } } /* * This function does the same actions as print_half_line(), * but takes as first argument a simple pointer to * const char */ static unsigned int display_half_line (const char* line, unsigned int indent, unsigned int out_bound) { FILE *out = outfile; register unsigned int in_position = 0; register unsigned int out_position = 0; register const char *text_pointer = line; register const char *text_limit = line; for (; *text_limit != '\0'; text_limit++); while (text_pointer < text_limit) { register unsigned char c = *text_pointer++; switch (c) { case '\t': { unsigned int spaces = TAB_WIDTH - in_position % TAB_WIDTH; if (in_position == out_position) { unsigned int tabstop = out_position + spaces; if ((expand_tabs)) { if (out_bound < tabstop) tabstop = out_bound; for (; out_position < tabstop; out_position++) putc (' ', out); } else if (tabstop < out_bound) { out_position = tabstop; putc (c, out); } } in_position += spaces; } break; case '\r': { putc (c, out); tab_from_to (0, indent); in_position = out_position = 0; } break; case '\b': if (in_position != 0 && --in_position < out_bound) { if (out_position <= in_position) /* Add spaces to make up for suppressed tab past out_bound. */ for (; out_position < in_position; out_position++) putc (' ', out); else { out_position = in_position; putc (c, out); } } break; case '\f': case '\v': control_character: if (in_position < out_bound) putc (c, out); break; default: if (! ISPRINT (c)) goto control_character; /* falls through */ case ' ': if (in_position++ < out_bound) { out_position = in_position; putc (c, out); } break; case '\n': return out_position; } } return out_position; } /* * Print side by side lines with a separator in the middle. * 0 parameters are taken to indicate white space text. * Blank lines that can easily be caught are reduced to a single newline. * This function works almost like print_1sdiff_line() (see above), * but the parameter list is slightly different. * In addition, different separators are used */ void print_1overview_line (const char *left, int are_different, const char *right) { FILE *out = outfile; unsigned int hw = sdiff_half_width, c2o = sdiff_column2_offset; unsigned int col = 0; bool put_newline = 0; register const char *end_of_left = left; register const char *end_of_right = right; const char *sep = ":!:"; if (left) { for (; *end_of_left != '\0'; end_of_left++); if (end_of_left != left) end_of_left--; put_newline |= *end_of_left == '\n'; col = display_half_line (left, 0, hw); } else sep = ":>:"; if (!right) sep = ":<:"; if ((are_different)) { col = tab_from_to (col, (hw + c2o - 3) / 2) + 3; fputs (sep, out); } if (right) { for (; *end_of_right != '\0'; end_of_right++); if (end_of_right != right) end_of_right--; put_newline |= (*end_of_right == '\n'); if (*right != '\n') { col = tab_from_to (col, c2o); display_half_line (right, col, hw); } } if (put_newline) putc ('\n', out); } ./numdiff-5.8.1/COPYING0000444000175000017500000010451312215353073013362 0ustar ivanoivano 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 . ./numdiff-5.8.1/docs/0000777000175000017500000000000012215353073013261 5ustar ivanoivano./numdiff-5.8.1/docs/numdiff.html0000644000175000017500000076074312215353073015614 0ustar ivanoivano Numdiff Manual 5.8

Numdiff Manual 5.8


Next: , Previous: (dir), Up: (dir)

Numdiff User Manual

“...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!”



This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats.

Copyright © 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi ivprimi(at)libero(dot)it

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in GNU Free Documentation License.


Next: , Previous: Top, Up: Top

1 Copying

Numdiff (also written numdiff) 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.

Numdiff 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 http://www.gnu.org/licenses/.


Next: , Previous: Copying, Up: Top

2 Acknowledgments

I want to thank Mr. Norman Clerman norm(dot)opcon(at)fuse(dot)net for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff.

Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option -S.


Next: , Previous: Acknowledgments, Up: Top

3 Overview

Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people.

There are several ways to think about the differences between two files. One way to think of the differences is as a series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known diff program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, the diff program considers any change in the amount or in the type of the characters as a relevant difference. However, trough some command line options it also provides ways to suppress certain kinds of differences that are not important to the user. For instance, diff provides ways to ignore differences in the amount of white space between words or lines, or differences in alphabetic case.

Another way to think of the differences is as a series of words that were deleted from, inserted in, or changed in one file to produce the other file. Here “word” refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word.

The less known wdiff program by Franc,ois Pinard pinard(at)iro(dot)umontreal(dot)ca compares words in two files and reports the differences.

At last, one can think of the differences between two files as a sequence of pairs of bytes that can be either identical or different. The cmp program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than diff or wdiff for comparing binary files.

However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. Indeed, when you compare a couple of such files, what you want to obtain usually is a list of the numerical fields in the second file which numerically differ from the corresponding fields in the first file. But, as you probably knows, a number can be written using different notations and programs like diff or wdiff can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values.

For instance, 11.23 and 11.2300000 are the same number but represented in different ways. While, if you are interested in the numerical values, it is obvious that the difference in the representation is not meaningful and then it should be ignored, however diff and wdiff consider the previous one as a relevant difference and there is no way for you to tell these programs to ignore it!

Another example of this type is given by 98765.4321 and 9.87654321E04 where the difference is only due to the use of the scientific notation in place of the ordinary decimal notation.

Moreover, depending on your country you could stick to different conventions in writing numbers. For instance, the amount “three hundred millions and fifty-two thousands of dollars and forty-six cents” is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but diff and wdiff would report a difference, which probably is not what you want in a similar case.

At last, sometimes you could want to ignore even differences in numerical values as long as they do not overcome a certain threshold. In other words, you could desire to suppress all “small” numerical differences too.

For instance, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 must be considered equal, while 33 and 33.00011 must be reported as different.

However, diff and wdiff can not be used to ignore “small” numerical differences, since they do not even know what a numerical difference is.

What I have been saying till now explains why I decided to implement a new program with the capability to “appropriately” compare files containing numerical fields. In writing this program I was inspired by ndiff, a GPL'ed software by Nelson H. Baabe of the Salt Lake City University. The author of ndiff had the same good reasons as me to write ndiff. ndiff is actually a good tool and I used it for a while. But I did not completely like the way it works and so numdiff was born. Although ndiff inspired numdiff, they are completely different from the viewpoint of the source code: numdiff has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than ndiff does.

numdiff can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. numdiff takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What corresponding here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then numdiff performs a numerical comparison between them, else it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option -s or -D, numdiff takes as field delimiters the characters newline (‘\n’, ASCII code 0x0A), horizontal tabulation (‘\t’, ASCII code 0x09), and blank (‘ ’, ASCII code 0x20).

For example, if the file list1 contains the data

accident        123     23Joshua          34.55           +3+4i	        water
dog       -3455.321     cat             2.345678e-9     .0005-6.23e2i

and file list2 contains the data

Accident        123     23456          34.5500         +3.0001+4i
dog       -3455.320098  Cat     +2.345678e-9            -6.23e2i    $$$
A new line

then the output of the command ‘numdiff list1 list2’ will be:

     ----------------
     ##1       #:1   <== accident
     ##1       #:1   ==> Accident
     @                                                     @@
     ##1       #:3   <== 23Joshua
     ##1       #:3   ==> 23456
     @                                                     @@
     ##1       #:5   <== +3+4i
     ##1       #:5   ==> +3.0001+4i
     @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5
     ##1       #>6   <== water
     ##1             ==>
     @ Line 1 in file "list2" is shorter than expected!
     ----------------
     ##2       #:2   <== -3455.321
     ##2       #:2   ==> -3455.320098
     @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7
     ##2       #:3   <== cat
     ##2       #:3   ==> Cat
     @                                                     @@
     ##2       #:5   <== .0005-6.23e2i
     ##2       #:5   ==> -6.23e2i
     @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7
     ##2             <==
     ##2       #>6   ==> $$$
     @ Line 2 in file "list1" is shorter than expected!
     ----------------
     ##3             <==
     ##3       #>1   ==> A new line
     @ Line 3 in file "list1" is shorter than expected!
     ----------------
               <==
     ##4       ==>
     
     
     +++  File "list1" differs from file "list2"

At the same time numdiff will print the following error message on stderr:

     ***  End of file "list1" reached while trying to read line 4.
          File "list2" has more lines than file "list1",
          line 4 is the last one read from file "list2"

It is worth remarking that numdiff can recognize complex numbers, provided that they are written in the form a+bi or a-bi with no extra characters between the values a, b and the sign + or - (the symbol i, used to represent the imaginary unit, can be changed by a suitable command line option, see Invoking numdiff). If you do not know what complex numbers are, do not worry! In this case probably you will never manage files containing complex numbers and so you can happily continue to ignore them. :)

We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then numdiff version 4.x does not show only the one line difference: once the files are out of synchronization numdiff 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option -z @. If bill1 and bill2 are given by

 Month          Expenses
-------------------------
 Jan09          $  233.56
 Feb09          $  850.77
 Mar09          $   12.55
 Apr09          $  524.00
 May09          $   78.25
 Jun09          $  230.00
 Jul09          $  443.10
 Aug09          $   67.65
 Sep09          $   10.00
 Oct09          $  201.45
 Nov09          $  110.00
 Dec09          $  200.27
-------------------------
Total           $ 2961.60

and

 Month          Expenses
 Jan09          $  234.00
 Mar09          $   13.00
 May09          $   78.25
 Jul09          $  443.10
 Sep09          $   10.00
 Nov09          $  110.00
 Jan10          $  200.00
-------------------------

Total           $ 1088.35   

respectively, then the differences between the two files are:

  • the insertion of the separator ------------------------- in bill1 before the list of the months,
  • the deletion in bill2 of the lines related to the expenses for the months February, April, June, August, October, December,
  • small changes in bill2 to the expenses of the months January 2009 and March,
  • the presence in bill2 of an entry for January 2010 just before the separator -------------------------,
  • the addition of an empty line to bill2 after the separator -------------------------,
  • and the different values for the total sum of the expenses.

The output of the command ‘numdiff -z @ -V bill1 bill2’ (I have added here the option -V to let Numdiff show which couples of lines it is comparing each time) is exactly then what you expect:

     
     ----------------
     ##2       <== -------------------------
               ==>
     
     ----------------
     ##3       <==  Jan09          $  233.56
     ##2       ==>  Jan09          $  234.00
     
     ##3       #:3   <== 233.56
     ##2       #:3   ==> 234.00
     @ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3
     ----------------
     ##4       <==  Feb09          $  850.77
               ==>
     
     ----------------
     ##5       <==  Mar09          $   12.55
     ##3       ==>  Mar09          $   13.00
     
     ##5       #:3   <== 12.55
     ##3       #:3   ==> 13.00
     @ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2
     ----------------
     ##6       <==  Apr09          $  524.00
               ==>
     
     ----------------
     ##8       <==  Jun09          $  230.00
               ==>
     
     ----------------
     ##10      <==  Aug09          $   67.65
               ==>
     
     ----------------
     ##12      <==  Oct09          $  201.45
               ==>
     
     ----------------
     ##14      <==  Dec09          $  200.27
     ##8       ==>  Jan10          $  200.00
     
     ##14      #:1   <== Dec09
     ##8       #:1   ==> Jan10
     @                                                     @@
     ##14      #:3   <== 200.27
     ##8       #:3   ==> 200.00
     @ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3
     ----------------
               <==
     ##10      ==>
     
     ----------------
     ##16      <== Total           $ 2961.60
     ##11      ==> Total           $ 1088.35
     
     ##16      #:3   <== 2961.60
     ##11      #:3   ==> 1088.35
     @ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0
     
     +++  File "bill1" differs from file "bill2"
     

Numdiff has reported correctly the following differences:

  • the second line of file bill1, i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file bill2.
  • The lines related to the months January and March 2009 have been slightly modified in bill2, namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file bill1 and the second one in file bill2. This information is printed by Numdiff in the form
              ##3       <==  Jan09          $  233.56
              ##2       ==>  Jan09          $  234.00
    

    Analogously

              ##5       <==  Mar09          $   12.55
              ##3       ==>  Mar09          $   13.00
    

    says that the line for March is the fifth one in bill1 and the third one in bill2.

  • The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file bill1 and the 11th one in file bill2.
  • The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10 and 12 of bill1, are not present in bill2.
  • The line of bill1 with the expenses for December 2009 is replaced in bill2 by the line containing the value of the expenses for January 2010.
  • The tenth line of bill2, i.e. the empty line after the separator, is not present in bill1. With respect to bill1 this line represents then an addition.

If you compare bill1 and bill2 without using the option -z @, the result is completely misleading. This is the output of ‘numdiff -V bill1 bill2’:

     
     ----------------
     ##2       <== -------------------------
     ##2       ==>  Jan09          $  234.00
     
     ##2       #:1   <== -------------------------
     ##2       #:1   ==> Jan09
     @                                                     @@
     ##2             <==
     ##2       #>2   ==> $  234.00
     @ Line 2 in file "bill1" is shorter than expected!
     ----------------
     ##3       <==  Jan09          $  233.56
     ##3       ==>  Mar09          $   13.00
     
     ##3       #:1   <== Jan09
     ##3       #:1   ==> Mar09
     @                                                     @@
     ##3       #:3   <== 233.56
     ##3       #:3   ==> 13.00
     @ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1
     ----------------
     ##4       <==  Feb09          $  850.77
     ##4       ==>  May09          $   78.25
     
     ##4       #:1   <== Feb09
     ##4       #:1   ==> May09
     @                                                     @@
     ##4       #:3   <== 850.77
     ##4       #:3   ==> 78.25
     @ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0
     ----------------
     ##5       <==  Mar09          $   12.55
     ##5       ==>  Jul09          $  443.10
     
     ##5       #:1   <== Mar09
     ##5       #:1   ==> Jul09
     @                                                     @@
     ##5       #:3   <== 12.55
     ##5       #:3   ==> 443.10
     @ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1
     ----------------
     ##6       <==  Apr09          $  524.00
     ##6       ==>  Sep09          $   10.00
     
     ##6       #:1   <== Apr09
     ##6       #:1   ==> Sep09
     @                                                     @@
     ##6       #:3   <== 524.00
     ##6       #:3   ==> 10.00
     @ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1
     ----------------
     ##7       <==  May09          $   78.25
     ##7       ==>  Nov09          $  110.00
     
     ##7       #:1   <== May09
     ##7       #:1   ==> Nov09
     @                                                     @@
     ##7       #:3   <== 78.25
     ##7       #:3   ==> 110.00
     @ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1
     ----------------
     ##8       <==  Jun09          $  230.00
     ##8       ==>  Jan10          $  200.00
     
     ##8       #:1   <== Jun09
     ##8       #:1   ==> Jan10
     @                                                     @@
     ##8       #:3   <== 230.00
     ##8       #:3   ==> 200.00
     @ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1
     ----------------
     ##9       <==  Jul09          $  443.10
     ##9       ==> -------------------------
     
     ##9       #:1   <== Jul09
     ##9       #:1   ==> -------------------------
     @                                                     @@
     ##9       #>2   <== $  443.10
     ##9             ==>
     @ Line 9 in file "bill2" is shorter than expected!
     ----------------
     ##10      <==  Aug09          $   67.65
     ##10      ==>
     
     ##10      #>1   <== Aug09          $   67.65
     ##10            ==>
     @ Line 10 in file "bill2" is shorter than expected!
     ----------------
     ##11      <==  Sep09          $   10.00
     ##11      ==> Total           $ 1088.35
     
     ##11      #:1   <== Sep09
     ##11      #:1   ==> Total
     @                                                     @@
     ##11      #:3   <== 10.00
     ##11      #:3   ==> 1088.35
     @ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2
     ----------------
     ##12      <==  Oct09          $  201.45
               ==>
     
     
     ***  End of file "bill2" reached while trying to read line 12.
          File "bill1" has more lines than file "bill2",
          line 12 is the last one read from file "bill1"
     
     
     +++  File "bill1" differs from file "bill2"

Numdiff compares now the first, second, third line of bill1 with the first, second, third line of bill2 and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number.

Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without doing any comparison between corresponding lines. The output of ‘numdiff -z @ -f bill1 bill2’ is

      Month          Expenses          Month          Expenses
     -------------------------     <
      Jan09          $  233.56         Jan09          $  234.00
      Feb09          $  850.77     <
      Mar09          $   12.55         Mar09          $   13.00
      Apr09          $  524.00     <
      May09          $   78.25         May09          $   78.25
      Jun09          $  230.00     <
      Jul09          $  443.10         Jul09          $  443.10
      Aug09          $   67.65     <
      Sep09          $   10.00         Sep09          $   10.00
      Oct09          $  201.45     <
      Nov09          $  110.00         Nov09          $  110.00
      Dec09          $  200.27     |   Jan10          $  200.00
     -------------------------        -------------------------
                                   >
     Total           $ 2961.60        Total           $ 1088.35
     
     
     +++  File "bill1" differs from file "bill2"

and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since to guess the right options can be sometime tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, see Filtering, I will explain in detail

  • what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare,
  • and how the related options affect the action of the filter.

By the way, it is even possible to use -f without any other additional option for the filter, like in ‘numdiff -f bill1 bill2’, but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters.

The option -f can be followed by an argument in the form of an integer number whose meaning will be explained later, see Use of the option -f.

Even if the output of numdiff is self-explanatory, in the next section I will explain in details all you have to know about it.


Next: , Up: Overview

3.1 Output format

Let us go back to our first example. If the files list1 and list2 contain the data

accident        123     23Joshua          34.55           +3+4i	        water
dog       -3455.321     cat             2.345678e-9     .0005-6.23e2i

and

Accident        123     23456          34.5500         +3.0001+4i
dog       -3455.320098  Cat     +2.345678e-9            -6.23e2i    $$$
A new line

respectively, then the output of the command ‘numdiff list1 list2’ will be:

     ----------------
     ##1       #:1   <== accident
     ##1       #:1   ==> Accident
     @                                                     @@
     ##1       #:3   <== 23Joshua
     ##1       #:3   ==> 23456
     @                                                     @@
     ##1       #:5   <== +3+4i
     ##1       #:5   ==> +3.0001+4i
     @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5
     ##1       #>6   <== water
     ##1             ==>
     @ Line 1 in file "list2" is shorter than expected!
     ----------------
     ##2       #:2   <== -3455.321
     ##2       #:2   ==> -3455.320098
     @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7
     ##2       #:3   <== cat
     ##2       #:3   ==> Cat
     @                                                     @@
     ##2       #:5   <== .0005-6.23e2i
     ##2       #:5   ==> -6.23e2i
     @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7
     ##2             <==
     ##2       #>6   ==> $$$
     @ Line 2 in file "list1" is shorter than expected!
     ----------------
     ##3             <==
     ##3       #>1   ==> A new line
     @ Line 3 in file "list1" is shorter than expected!
     ----------------
               <==
     ##4       ==>
     
     
     +++  File "list1" differs from file "list2"

numdiff prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file.

First this report indicates the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is “1” for the first field of a line, “2” for the second field, “3” for the third one and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol “##”, while the field number by “#:”. Then numdiff shows in what the difference consists. For instance,

     ##1       #:1   <== accident
     ##1       #:1   ==> Accident
     @                                                     @@

means that the first field of the first line is “accident” in the first file, while in the second file it appears as “Accident”. This difference could be then canceled by removing “accident” from the first file and inserting “Accident” in place of it. The arrows “<==” and “==>” try to visualize this idea. Analogously,

     ##2       #:2   <== -3455.321
     ##2       #:2   ==> -3455.320098
     @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7

means that the second field of the second line is “-3455.321” in the first file and “-3455.320098” in the second one. Since the contents of the field are numerical in both files, numdiff also prints the absolute and relative errors.

The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files.

The relative error (or relative difference) is actually defined in a more complicated way. If n1 is the value appearing in the first file and n2 is the value in the second file, then the absolute error is given by the formula A=|n1-n2|, while the relative error R is given by:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and at least one of them is zero,
  • R = A/ min(|n1|, |n2|) if n1 and n2 are both non zero and n2 differs from n1. min(|n1|, |n2|) denotes the minimum between the absolute value of n1 and the absolute value of n2.

With these definitions of absolute and relative error it turns out that A(n2, n1) = A(n1, n2) and R(n2, n1) = R(n1, n2). In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option -F, see Alternative formulas for the computation of the relative difference.

If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator:

@                                                     @@

It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. When this is the case, numdiff reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in

     ##1       #>6   <== water
     ##1             ==>
     @ Line 1 in file "list2" is shorter than expected!

or in

     ##3             <==
     ##3       #>1   ==> A new line
     @ Line 3 in file "list1" is shorter than expected!

In addition, numdiff shows the tail of the longer line, using the notation “#>n” to indicate the number n of the first field of the longer line for which there is no corresponding field in the shorter line. For example,

     ##1       #>6   <== water
     ##1             ==>
     @ Line 1 in file "list2" is shorter than expected!

means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file (list2). In this context, the symbol <<*>> (when it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating newline character.

It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, numdiff prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached:

     ***  End of file "list1" reached while trying to read line 4.
          File "list2" has more lines than file "list1",
          line 4 is the last one read from file "list2"

Unless the option -q is used (see Invoking numdiff), numdiff prints on standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering:

     +++  File "list1" differs from file "list2"


Next: , Previous: Output format, Up: Overview

3.2 Overview mode

Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option -O. If this option is present on the command line, numdiff prints a side-by-side report instead of the usual one.

For example, if sheet1 contains the text

A    1    1
B    2    4
C    3    9
D    4   16
E    5   25
F    6   36
G    7   49
H    8   64
I    9   81
J   10  100

and sheet2 the following lines

A    1      1
B    2      4
C    3.3    9.03
D    4     16
E    5.5   25.05
F    6.6   36
G    7.7   49.49
H    8     64
I    9.9   81.09

then ‘numdiff -O sheet1 sheet2’ prints this report

     A    1    1                            A    1      1
     B    2    4                            B    2      4
     C    3    9                         :!:C    3.3    9.03
     D    4   16                            D    4     16
     E    5   25                         :!:E    5.5   25.05
     F    6   36                         :!:F    6.6   36
     G    7   49                         :!:G    7.7   49.49
     H    8   64                            H    8     64
     I    9   81                         :!:I    9.9   81.09
     J   10  100                         :<:
     
     ***  End of file "sheet2" reached while trying to read line 10.
          File "sheet1" has more lines than file "sheet2",
          line 10 is the last one read from file "sheet1"
     
     
     +++  File "sheet1" differs from file "sheet2"

On the left side you can see the lines coming from the file specified as first on the command line, i.e. sheet1, on the right side the lines from the second file of the command line, in this case sheet2. In the middle there is a gutter which contains one of these markers:

white spaces
The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options -s, -D, -I, -X, -a, -r, -P and -N.
:!:
The corresponding lines have at least one field which differs.
:<:
The files differ and only the first file contains the line.
:>:
The files differ and only the second file contains the line.

In the case of sheet1 and sheet2 a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated.

The option -O can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, see Invoking numdiff. The default value for the width of the side-by-side report is 130. No wonder then that the command ‘numdiff -O40 sheet1 sheet2’ displays a report with shorter lines:

     A    1    1           A    1      1
     B    2    4           B    2      4
     C    3    9       :!: C    3.3    9.03
     D    4   16           D    4     16
     E    5   25       :!: E    5.5   25.05
     F    6   36       :!: F    6.6   36
     G    7   49       :!: G    7.7   49.49
     H    8   64           H    8     64
     I    9   81       :!: I    9.9   81.09
     J   10  100       :<:
     
     ***  End of file "sheet2" reached while trying to read line 10.
          File "sheet1" has more lines than file "sheet2",
          line 10 is the last one read from file "sheet1"
     
     
     +++  File "sheet1" differs from file "sheet2"

A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command ‘numdiff -O40 sheet1 sheet2’:

     C    3    9       :!: C    3.3    9.03
     E    5   25       :!: E    5.5   25.05
     F    6   36       :!: F    6.6   36
     G    7   49       :!: G    7.7   49.49
     I    9   81       :!: I    9.9   81.09
     J   10  100       :<:
     
     ***  End of file "sheet2" reached while trying to read line 10.
          File "sheet1" has more lines than file "sheet2",
          line 10 is the last one read from file "sheet1"
     
     
     +++  File "sheet1" differs from file "sheet2"

If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of ‘numdiff -O24 sheet1 sheet2’:

     A    1         A    1
     B    2         B    2
     C    3    :!:  C    3.3
     D    4         D    4
     E    5    :!:  E    5.5
     F    6    :!:  F    6.6
     G    7    :!:  G    7.7
     H    8         H    8
     I    9    :!:  I    9.9
     J   10    :<:
     
     ***  End of file "sheet2" reached while trying to read line 10.
          File "sheet1" has more lines than file "sheet2",
          line 10 is the last one read from file "sheet1"
     
     
     +++  File "sheet1" differs from file "sheet2"

If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130.

Notice that the numeric argument must immediately follow the option -O, intermediate spaces are not allowed. This is also the case for the optional argument of -f, while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument.

The option -O can be used together with any other option of Numdiff except for -f, -q, -U, -E, -V and -b. When -O is in use, -U, -E, -V and -b are ignored. If -q is present on the command line together with -O, then -O is ignored. Finally, if both -f and -O are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters.

Therefore, the command ‘numdiff -O40 -f sheet1 sheet2’ displays the same report as ‘numdiff -O40 sheet1 sheet2’, while the output of ‘numdiff -f -O40 sheet1 sheet2’ is given by

     A    1    1                            A    1      1
     B    2    4                            B    2      4
     C    3    9                          | C    3.3    9.03
     D    4   16                            D    4     16
     E    5   25                          | E    5.5   25.05
     F    6   36                          | F    6.6   36
     G    7   49                          | G    7.7   49.49
     H    8   64                            H    8     64
     I    9   81                          | I    9.9   81.09
     J   10  100                          <
     
     
     +++  File "sheet1" differs from file "sheet2"

and coincides then with the one of ‘numdiff -f sheet1 sheet2’.

The option -O can be used together with the filter to cope with the addition/deletion of lines. If the file sheet3 contains the text

A    1      1
C    3.3    9.03
E    5.5   25.05
G    7.7   49.49
I    9.9   81.09
J    10   100.00
K    0      0.02

then ‘numdiff -O40 sheet1 sheet3’ prints a wrong report, as in the example with files bill1 and bill2:

     A    1    1           A    1      1
     B    2    4     :!:   C    3.3    9.03
     C    3    9     :!:   E    5.5   25.05
     D    4   16     :!:   G    7.7   49.49
     E    5   25     :!:   I    9.9   81.09
     F    6   36     :!:   J    10   100.00
     G    7   49     :!:   K    0      0.02
     H    8   64     :<:
     
     ***  End of file "sheet3" reached while trying to read line 8.
          File "sheet1" has more lines than file "sheet3",
          line 8 is the last one read from file "sheet1"
     
     
     +++  File "sheet1" differs from file "sheet3"

On the other hand, the presence of -z @ makes Numdiff always compare fields of corresponding lines, as shown by the output of the command ‘numdiff -O40 -z @ sheet1 sheet3’:

     A    1    1           A    1      1
     B    2    4     :<:
     C    3    9     :!:   C    3.3    9.03
     D    4   16     :<:
     E    5   25     :!:   E    5.5   25.05
     F    6   36     :<:
     G    7   49     :!:   G    7.7   49.49
     H    8   64     :<:
     I    9   81     :!:   I    9.9   81.09
     J   10  100           J    10   100.00
                     :>:   K    0      0.02
     
     +++  File "sheet1" differs from file "sheet3"

Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters.


Previous: Overview mode, Up: Overview

3.3 Output of the filter

The output produced just by running the filter (option -f) is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers:

white space
The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options -s, -D, -I, -X, -z and -Z.
|
The corresponding lines differ, and they are either both complete or both incomplete.
<
(
The files differ and only the first file contains the line.
>
)
The files differ and only the second file contains the line.
\
The corresponding lines differ, and only the first line is incomplete.
/
The corresponding lines differ, and only the second line is incomplete.

An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked ‘\’ if the line from the first file is incomplete, ‘/’ if the line from the second file is.

Like -O, the option -f can take an optional argument which allows to set the width of the output and eventually to suppress common lines, see Invoking numdiff and Use of the option -f.

More generally, the user can always make numdiff avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, see Invoking numdiff.


Next: , Previous: Overview, Up: Top

4 Installing

To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option -o to write its output to a specified file, the option -D for macros predefinition, the option -l to search for a specified library, and the options -I and -L to add a given directory to the search path for include and library files respectively.

In addition, you need a POSIX implementation of the make utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands rm and find. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible.

Numdiff has been successfully compiled and tested on:

  • Slackware® GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC),
  • Slackware GNU/Linux 11 with GCC 3.4.6,
  • Slackware GNU/Linux 12.2 with GCC 4.2.4,
  • Slackware GNU/Linux 13 with GCC 4.3.3,
  • Debian® GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21),
  • Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8),
  • Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5),
  • SunOS® 5.8 with GCC 2.95.3, and
  • SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler.

Configuration, building and installation of Numdiff can be performed through the standard three steps:

             ./configure
             make
             make install

If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then, after ‘make’, you will have to type and run

             make install-nls

By default, ‘make install’ will install all the files in /usr/local/bin, /usr/local/info etc. You can specify an installation prefix other than /usr/local using the option --prefix in the configure step, for instance ‘--prefix=$HOME’:

             ./configure --prefix=$HOME

For better control, you can use the options --bindir, --infodir, and so on. Type ‘./configure --help’ to obtain the complete list of all the available options.

Anyway, the documentation files, including a full User Manual available in several formats (HTML, PDF and plain ASCII text), will always be put in DOCDIR/numdiff, where DOCDIR is the path specified by the option --docdir or, if this option has not been given to configure, PREFIX/local/doc. Here PREFIX is the installation prefix specified by the option --prefix or the default /usr/local.

Once Numdiff has been installed you can remove all the files previously installed by a simple ‘make uninstall’. If you have also installed the localization files trough ‘make install-nls’, then, in order to remove also these ones, use ‘make uninstall-nls’ in place of ‘make uninstall’.

Between the options accepted by configure there are --enable-debug, --enable-optimization, --enable-nls and --enable-gmp.

The option --enable-debug turns on debugging when compiling the source code. This is obtained by passing to the compiler the -g option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable DBGFLAGS before calling configure.

The option --enable-optimization turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the -O option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable OPTFLAGS before calling configure.

The option --enable-nls turns on Natural Language Support. But you do not need to use it explicitly, since Natural Language Support is enabled by default. However, you can disable it by using --disable-nls. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through

             ./configure --disable-nls
             make
             make install

Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option --enable-gmp=no or --disable-gmp to the configure script before building the program, like in

             ./configure --disable-gmp
             make
             make install

Enabling the old internal support for multiple precision arithmetic is deprecated, see with GNU MP is better. The latest version of GNU MP is available at ftp://ftp.gnu.org/gnu/gmp/. See the GNU MP web page at http://gmplib.org/ for up-to-date information on GNU MP.


Next: , Previous: Installing, Up: Top

5 Invoking numdiff

SYNOPSIS

        numdiff -h|--help|-v|--version

or

        numdiff [-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]]
        [-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I]
        [-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2]
        [-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][-q][-S]
        [-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]]
        [-T][-B][-l PATH][-o PATH] FILE1 FILE2

where FILE1 and FILE2 are the names of the two files to compare and RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like ‘1-’, ‘3-5’ or ‘-7’.

In the first case numdiff prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer and some information about the way it was built. In the second case numdiff compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be -, which refers to stdin.

OPTIONS

-s, --separators=IFS
Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If IFS is prefixed with ‘1:’ or ‘2:’ then use the given delimiter set only for the lines from the first or the second file respectively
-D, --delimiters=DELIMS
Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If DELIMS is prefixed with ‘1:’ or ‘2:’ then use the given delimiter set only for the lines from the first or the second file respectively
-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]
Set to THRVAL the maximum absolute difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2
-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]
Set to THRVAL the maximum relative difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2
-2, --strict
Consider two numerical values as equal only if both absolute and relative difference do not exceed the corresponding tolerance threshold
-F, --formula=NUM
Use the formula indicated by NUM to compute the relative errors. If NUM is 0 use the classic formula. If NUM is 1 compute the relative errors by considering the values in FILE1 as sample values. If NUM is 2 compute the relative errors by considering the values in FILE2 as sample values.
-#, --digits=NUM
Set to NUM the number of digits in the significands used in multiple precision arithmetic
-P, --positive-differences
Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file
-N, --negative-differences
Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file
-I, --ignore-case
Ignore changes in case while doing literal comparisons
-c, --currency=CURRNAME
Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with ‘1:’ or ‘2:’ to specify the currency name only for the first or the second file
-d, --decimal-point=C1C2
Specify the characters representing the decimal point in the two files to compare
-t, --thousands-separator=C1C2
Specify the characters representing the thousands separator in the two files to compare
-g, --group-length=N1N2
Specify the number of digits forming each group of thousands in the two files to compare
-p, --plus-prefix=C1C2
Specify the (optional) prefixes for positive values used in the two files to compare
-n, --minus-prefix=C1C2
Specify the prefixes for negative values used in the two files to compare
-e, --exponent-letter=C1C2
Specify the exponent letters used in the two files to compare
-i, --imaginary-unit=C1C2
Specify the characters representing the imaginary unit in the two files to compare
-X, --exclude=1:RANGE
Select the fields of the first file that have to be ignored
-X, --exclude=2:RANGE
Select the fields of the second file that have to be ignored
-E, --essential
While printing the differences between the two compared files show only the numerical ones
-U, --dummy
While printing the differences between the two compared files neglect all the numerical ones (dummy mode)
-b, --brief
Suppress all messages concerning the differences discovered in the structures of the two files
-V, --verbose
For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files
-O, --overview[=NUM]
Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line.
-q, --quiet, --silent
Suppress all the standard output
-S, --statistics
Add some statistics to the standard output
-z, --blur-if-numerical=1:RANGE
Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric
-z, --blur-if-numerical=2:RANGE
Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric
-Z, --blur-unconditionally=1:RANGE
Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure
-Z, --blur-unconditionally=2:RANGE
Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure
-m, --minimal
During synchronization try hard to find a smaller set of changes
-H, --speed-large-files
During synchronization assume large files and many scattered small changes
-f, --test-filter[=NUM]
Run only the filter and then show the results of its attempt to synchronize the two files. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line.
-T, --expand-tabs
Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option -O or -f)
-B, --binary
Treat both files as binary files (only meaningful under Doz/Windoz)
-l, --warnings-to=PATH
Redirect warning and error messages from stderr to the indicated file
-o, --output=PATH
Redirect output from stdout to the indicated file
-h, --help
Show help message and predefined settings
-v, --version
Show version number, Copyright, Distribution Terms and NO-Warranty

DIAGNOSTICS

The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error.

DEFAULT NUMERIC FORMAT (for both files to compare): Currency name = ""


Decimal point = `.'

Thousands separator = `,'

Number of digits in each thousands group = 3

Leading positive sign = `+'

Leading negative sign = `-'

Prefix for decimal exponent = `e'

Symbol used to denote the imaginary unit = `i'

SOME EXPLANATIONS

The options -U, -E, -b and -q are used to hide part of the standard output of the program according to some rule.

The option -U triggers the dummy mode. In this mode numdiff does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The dummy mode is so called since in this mode numdiff does not perform the job for which I created it.

The option -E triggers the essential mode. In this mode numdiff only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when, comparing two lines, it turns out that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option -X, then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line.

The option -b triggers the brief mode. In this mode numdiff does not print the differences in the structure of the two files (see above for an explanation about what they are).

The option -q triggers the quiet mode. In this mode numdiff does not print anything on the standard output. The quiet mode is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program.

The option -O activates the overview mode, which makes numdiff print a side-by-side report in the form described in section Overview mode. The optional numeric argument after -O must immediately follow, intermediate spaces are not allowed. The option -O can be used together with any other option of Numdiff except for -f, -q, -U, -E, -V and -b. When -O is in use, -U, -E, -V and -b are ignored. If -q is present on the command line together with -O, then -O is ignored. Finally, if both -f and -O are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters.

The option -V triggers the verbose mode. In this mode numdiff produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files data1 and data2 contain the data

12      33
22      44.5
0.008   1.002
221.12  -34.56  water
2101.21 boats

and

12      33
22.3      44.5
0.008   1.202
221.12  -34.56
2101.21 boats   dogs

respectively, then the command ‘numdiff -V data1 data2’ will print the following output:

     ----------------
     ##2       <== 22      44.5
     ##2       ==> 22.3      44.5
     
     ##2       #:1   <== 22
     ##2       #:1   ==> 22.3
     @ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2
     ----------------
     ##3       <== 0.008   1.002
     ##3       ==> 0.008   1.202
     
     ##3       #:2   <== 1.002
     ##3       #:2   ==> 1.202
     @ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1
     ----------------
     ##4       <== 221.12  -34.56  water
     ##4       ==> 221.12  -34.56
     
     ##4       #>3   <== water
     ##4             ==>
     @ Line 4 in file "data2" is shorter than expected!
     ----------------
     ##5       <== 2101.21 boats
     ##5       ==> 2101.21 boats   dogs
     
     ##5             <==
     ##5       #>3   ==> dogs
     @ Line 5 in file "data1" is shorter than expected!
     
     +++  File "data1" differs from file "data2"

You must care that the options -b and -V will be overridden if -q is also set.

The amount of additional information printed by -V is trivially influenced by the options that alter the way numdiff performs the comparisons between fields (for instance -a, -r, -2, -N, -P, -U, -E, -I, -X).

In the headers printed by numdiff when in “verbose mode” can also appear the symbol <<*>>. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating newline character.

The option -S adds to the standard output of numdiff a statistical report with the following information:

  • the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options -P and -N) and the number of those comparisons whose outcome is a relevant numerical difference.
  • the largest absolute error in the set of relevant numerical differences and the corresponding relative error,
  • the largest relative error in the set of relevant numerical differences together with the corresponding absolute error,
  • the sum and the arithmetic mean of all absolute errors,
  • the sum and the arithmetic mean of the relevant absolute errors,
  • the square root of the sum of the squares of all absolute errors,
  • the square root of the sum of the squares of the relevant absolute errors,
  • the quadratic mean of all absolute errors, and
  • the quadratic mean of the relevant absolute errors.
By relevant numerical differences and relevant absolute errors I mean those ones appearing in the output of numdiff when the options -U, -f, -O and -q are not used. The information printed by -S is not removed when this option is used together with -q.

The options -a, -r, -2, -P and -N affect the way numdiff performs the comparisons between numerical values. Without any of these options, numdiff considers two numerical fields as equal when their difference is zero.

The option -a can be used to order that two numerical fields must be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the -a option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values.

Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, numdiff prints the difference in its report, unless some other option, for example -P or -N, makes the difference unimportant. If nothing else follows the threshold value, what has been just explained applies to all comparisons between numerical fields. To see this in practice, if the file many_columns1 contains the text

A	1	 1.2	  1	 0.1	  11.0         1.0e-1
B	2        2.4      4      0.4      24.0         1.0e-2
C	3        3.6      9      0.9      39.0         1.0e-3
D	4	 4.8     16      1.6     416.0         1.0e-4

and the contents of the file many_columns2 are given by

A	1.1	1.08	 1.01	 0.1	 11.011        -1.0e-1
B	2.2     2.16     4.04    0.4     24.024        -1.0e-2
C	3.3     3.24     9.09    0.9     39.039        -1.0e-3
D	4.4	4.32    16.16    1.6    416.039        -1.0e-4

then the output of the command ‘numdiff -a 0.5 many_columns1 many_columns2’ is

     
     +++  Files "many_columns1" and "many_columns2" are equal

The highest absolute difference between a field from many_columns1 and the corresponding field from many_columns2 is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5.

On the other hand, the command ‘numdiff -a 0.35 many_columns1 many_columns2’ prints the report

     ----------------
     ##3       #:3   <== 3.6
     ##3       #:3   ==> 3.24
      Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1
     ----------------
     ##4       #:2   <== 4
     ##4       #:2   ==> 4.4
      Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     ##4       #:3   <== 4.8
     ##4       #:3   ==> 4.32
      Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1
     
     +++  File "many_columns1" differs from file "many_columns2"

since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4 and |4.32 - 4.8| = 0.48 exceed the value 0.35, and the other differences are below this threshold.

If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of -a. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (`:'). If you specify only one range of numbers after the threshold value, numdiff uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, ‘-a 0.01:2-5’ sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. If the files many_columns1 and many_columns2 are the same as before, then the command ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’ displays the following report

     ----------------
     ##1       #:2   <== 1
     ##1       #:2   ==> 1.1
      Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
     ##1       #:7   <== 1.0e-1
     ##1       #:7   ==> -1.0e-1
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
     ----------------
     ##2       #:2   <== 2
     ##2       #:2   ==> 2.2
      Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
     ##2       #:7   <== 1.0e-2
     ##2       #:7   ==> -1.0e-2
      Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
     ----------------
     ##3       #:2   <== 3
     ##3       #:2   ==> 3.3
      Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
     ##3       #:7   <== 1.0e-3
     ##3       #:7   ==> -1.0e-3
      Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
     ----------------
     ##4       #:2   <== 4
     ##4       #:2   ==> 4.4
      Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     ##4       #:7   <== 1.0e-4
     ##4       #:7   ==> -1.0e-4
      Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0
     
     +++  File "many_columns1" differs from file "many_columns2"

since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option -a more times. The command ‘numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2’ sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report:

     ----------------
     ##1       #:7   <== 1.0e-1
     ##1       #:7   ==> -1.0e-1
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
     ----------------
     ##2       #:7   <== 1.0e-2
     ##2       #:7   ==> -1.0e-2
      Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
     ----------------
     ##3       #:2   <== 3
     ##3       #:2   ==> 3.3
      Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
     ----------------
     ##4       #:2   <== 4
     ##4       #:2   ==> 4.4
      Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     
     +++  File "many_columns1" differs from file "many_columns2"

Observe that :2 and :7 are abbreviations of :2-2 and :7-7, respectively. It is even possible to use range expressions like ‘m-’ or ‘-n’. The first expression corresponds to all fields starting from the mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the nth one, both inclusive.

If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), numdiff uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, ‘-a 1e-4:3-5:4-6’ sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option -X, which makes numdiff ignore one or more fields from one of the compared files.

The file many_columns3:

A    I	1.1	1.08	 1.01	 0.1	 11.011        -1.0e-1
B   II	2.2     2.16     4.04    0.4     24.024        -1.0e-2
C  III	3.3     3.24     9.09    0.9     39.039        -1.0e-3
D   IV	4.4	4.32    16.16    1.6    416.039        -1.0e-4

has one column more than the file many_columns1, namely the second one. When comparing many_columns1 with many_columns3 it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option -X (for a full description of the use of this option, see Restriction of the comparison to particular fields). Ignoring the second field of each line of many_columns3 implies that the fields in the third column of this file are compared with the corresponding fields of the second column of many_columns1, the fields in the fourth column of many_columns3 are compared with the ones in the third column of many_columns1, and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that ‘-X 2:2’ makes numdiff compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of many_columns1 with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of many_columns3. Therefore, the command ‘numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3’ will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from many_columns1 with the fourth, fifth, and sixth field respectively of the corresponding line of many_columns3. This explains why the report of ‘numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3

     ----------------
     ##1       #:2   <== 1
     ##1       #:3   ==> 1.1
      Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
     ##1       #:6   <== 11.0
     ##1       #:7   ==> 11.011
      Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3
     ##1       #:7   <== 1.0e-1
     ##1       #:8   ==> -1.0e-1
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
     ----------------
     ##2       #:2   <== 2
     ##2       #:3   ==> 2.2
      Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
     ##2       #:6   <== 24.0
     ##2       #:7   ==> 24.024
      Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3
     ##2       #:7   <== 1.0e-2
     ##2       #:8   ==> -1.0e-2
      Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
     ----------------
     ##3       #:2   <== 3
     ##3       #:3   ==> 3.3
      Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
     ##3       #:6   <== 39.0
     ##3       #:7   ==> 39.039
      Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3
     ##3       #:7   <== 1.0e-3
     ##3       #:8   ==> -1.0e-3
      Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
     ----------------
     ##4       #:2   <== 4
     ##4       #:3   ==> 4.4
      Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     ##4       #:6   <== 416.0
     ##4       #:7   ==> 416.039
      Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5
     ##4       #:7   <== 1.0e-4
     ##4       #:8   ==> -1.0e-4
      Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0
     
     +++  File "many_columns1" differs from file "many_columns3"

does not show the same difference listing of the command ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’.

If what you want is to obtain the same difference listing of ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’, then the right command is ‘numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3’. The report printed by this last command is indeed

     ----------------
     ##1       #:2   <== 1
     ##1       #:3   ==> 1.1
      Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
     ##1       #:7   <== 1.0e-1
     ##1       #:8   ==> -1.0e-1
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
     ----------------
     ##2       #:2   <== 2
     ##2       #:3   ==> 2.2
      Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
     ##2       #:7   <== 1.0e-2
     ##2       #:8   ==> -1.0e-2
      Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
     ----------------
     ##3       #:2   <== 3
     ##3       #:3   ==> 3.3
      Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
     ##3       #:7   <== 1.0e-3
     ##3       #:8   ==> -1.0e-3
      Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
     ----------------
     ##4       #:2   <== 4
     ##4       #:3   ==> 4.4
      Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     ##4       #:7   <== 1.0e-4
     ##4       #:8   ==> -1.0e-4
      Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0
     
     +++  File "many_columns1" differs from file "many_columns3"

and up to the positions of the fields from many_columns3 coincides with the one of ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’.

The option -a can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command ‘numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2

     ----------------
     ##1       #:2   <== 1
     ##1       #:2   ==> 1.1
      Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
     ##1       #:7   <== 1.0e-1
     ##1       #:7   ==> -1.0e-1
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
     ----------------
     ##2       #:2   <== 2
     ##2       #:2   ==> 2.2
      Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
     ##2       #:7   <== 1.0e-2
     ##2       #:7   ==> -1.0e-2
      Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
     ----------------
     ##3       #:2   <== 3
     ##3       #:2   ==> 3.3
      Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
     ##3       #:4   <== 9
     ##3       #:4   ==> 9.09
      Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2
     ##3       #:7   <== 1.0e-3
     ##3       #:7   ==> -1.0e-3
      Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
     ----------------
     ##4       #:2   <== 4
     ##4       #:2   ==> 4.4
      Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     ##4       #:4   <== 16
     ##4       #:4   ==> 16.16
      Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2
     ##4       #:7   <== 1.0e-4
     ##4       #:7   ==> -1.0e-4
      Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0
     
     +++  File "many_columns1" differs from file "many_columns2"

you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position.

Finally, if -a is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example -P or -N, makes numdiff ignore it.

The option -r can be used to order that two numerical fields must be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the -r option. As for the option -a, the argument of -r can have several forms. These forms are the same accepted by -a and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one.

The relative difference is normally defined in this way. If n1 is a value from the file specified as first on the command line and n2 is the corresponding value from the second file, then the absolute difference is given by the formula A=|n1-n2|. The relative difference R is given by:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and at least one of them is zero,
  • R = A/ min(|n1|, |n2|) if n1 and n2 are both non zero and n2 differs from n1. min(|n1|, |n2|) denotes the minimum between the absolute value of n1 and the absolute value of n2.

With this definition of relative difference it turns out that R(n2, n1) = R(n1, n2): the relative difference does not change if you only change the ordering of the compared files on the command line.

However there are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option -F together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with ‘-F 1’ the relative difference R is computed according to these rules:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and n1 is zero,
  • R = |n1-n2|/ |n1| if n1 is not zero and n2 differs from n1.

With ‘-F 2’ the rules become:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and n2 is zero,
  • R = |n1-n2|/ |n2| if n2 is not zero and n2 differs from n1.

With the last two sets of rules it is not anymore true that R(n2, n1) = R(n1, n2): the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that file1 and file2 contain

1    9.9  0.5  440

and

1.2  8    0.51 400 

respectively. Then ‘numdiff file1 file2’ displays

     ----------------
     ##1       #:1   <== 1
     ##1       #:1   ==> 1.2
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1
     ##1       #:2   <== 9.9
     ##1       #:2   ==> 8
      Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1
     ##1       #:3   <== 0.5
     ##1       #:3   ==> 0.51
      Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2
     ##1       #:4   <== 440
     ##1       #:4   ==> 400
      Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1
     
     +++  File "file1" differs from file "file2"

numdiff -F 1 file1 file2’ prints

     ----------------
     ##1       #:1   <== 1
     ##1       #:1   ==> 1.2
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1
     ##1       #:2   <== 9.9
     ##1       #:2   ==> 8
      Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1
     ##1       #:3   <== 0.5
     ##1       #:3   ==> 0.51
      Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2
     ##1       #:4   <== 440
     ##1       #:4   ==> 400
      Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2
     
     +++  File "file1" differs from file "file2"

the output of ‘numdiff -F 2 file1 file2’ is

     ----------------
     ##1       #:1   <== 1
     ##1       #:1   ==> 1.2
      Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1
     ##1       #:2   <== 9.9
     ##1       #:2   ==> 8
      Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1
     ##1       #:3   <== 0.5
     ##1       #:3   ==> 0.51
      Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2
     ##1       #:4   <== 440
     ##1       #:4   ==> 400
      Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1
     
     +++  File "file1" differs from file "file2"

numdiff -F 1 -r 0.195 file1 file2’ displays

     ----------------
     ##1       #:1   <== 1
     ##1       #:1   ==> 1.2
      Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1
     
     +++  File "file1" differs from file "file2"

and, finally, ‘numdiff -F 2 -r 0.195 file1 file2’ displays

     ----------------
     ##1       #:2   <== 9.9
     ##1       #:2   ==> 8
      Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1
     
     +++  File "file1" differs from file "file2"

The option -2 is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option numdiff considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option -2 numdiff regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if file1 contains the unique line

100

and file2 the line

100.00012

then the output of the command ‘numdiff file1 file2’ will be

     ----------------
     ##1       #:1   <== 100
                     ==> 100.00012
     @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6
     
     +++  File "file1" differs from file "file2"

The output of the commands ‘numdiff -a 1.0e-4 file1 file2’ and ‘numdiff -r 1.0e-6 file1 file2’ will be the same as above, but ‘numdiff -a 1.0e-4 -r 1.3e-6 file1 file2’ and ‘numdiff -a 1.3e-4 -r 1.0e-6 file1 file2’ will print the message

     
     +++  Files "file1" and "file2" are equal

since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold.

On the other hand, the commands ‘numdiff -a 1.0e-4 -r 1.3e-6 -2 file1 file2’ and ‘numdiff -a 1.3e-4 -r 1.0e-6 -2 file1 file2’ will print the message

     ----------------
     ##1       #:1   <== 100
                     ==> 100.00012
     @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6
     
     +++  File "file1" differs from file "file2"

since the option -2 makes numdiff regard two values as equal only if both absolute and relative difference do not exceed the corresponding threshold of tolerance.

The option -P makes numdiff consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than the real part and, respectively, the imaginary part of the first value.

Finally, the option -N makes numdiff consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than the real part and, respectively, the imaginary part of the first value.

The options -B, -I, -l, -o, -h and -v do not require further explanations. The options -l and -o are only supplied for the users of some poorly designed operating systems (like MSDog or MSWindoze), whose default shell does not allow the redirection of standard error and standard output. The option -I has no effect on the outcome of numerical comparisons but affects the action of the filter, see Filtering.

The option -s requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples:

     numdiff -s ' \t\n,;:.' file1 file2
     numdiff -s ' \t\n\r\f\v"\:;' file1 file2
     numdiff -s `` \t\n''' file1 file2

If you want to include in the set of delimiters also some special characters, e.g the blank, then you must quote it. I recommend you to always use the single quote character (') to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell.

numdiff recognizes and interprets the following sequences of characters within the argument passed to the option -s:

  • \a’ alert (bell),
  • \b’ backspace,
  • \f’ form feed,
  • \n’ newline,
  • \r’ carriage return,
  • \s’ blank,
  • \t’ horizontal tab,
  • \v’ vertical tab,
  • \\’ backslash,
  • \nnn’ the eight-bit character whose value is the octal value nnn (one to three digits),
  • \xHH’ the eight-bit character whose value is the hexadecimal value HH (one or two digits).

By passing the string ‘ \t\n,;:.’ as argument for the option -s, one tells numdiff to use as field delimiters the characters blank, horizontal tab, newline, comma, semicolon, colon and dot. Passing ‘ \t\n’ as argument to the option -s is the same as not using at all the option -s, since blank, horizontal tab and newline are the default field delimiters.

In the list of field delimiters the character backslash (‘\’) is always treated in a special way. If it forms, combined with the subsequent character(s), one of the backslash escape sequences listed above, then it is considered to be an escape character and the whole escape sequence is decoded as shown above. Otherwise, the backslash is just ignored.

Therefore, the delimiters specified by the command line

     numdiff -s' \t\n\\\"' file1 file2

are blank, horizontal tab, newline, backslash and double quote, since ‘\\’ and ‘\"’ are interpreted by numdiff as ‘\’ and ‘"’.

Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be constrained to use the double quote character (‘"’) to enclose the set of field delimiters, e.g. if the single quote character is used as field delimiter, like in one of the precedent examples. However you must take into account that in this case the shell could make some substitutions on the command line before executing numdiff. For instance, if your shell is GNU bash, then (citing the man page of GNU bash)

Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, and ‘\’. The characters ‘$’ and ‘`’ retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘\’, or <newline>. A double quote may be quoted within double quotes by preceding it with a backslash ... The special parameters * and @ have special meaning when in double quotes ...

Therefore, if the set of delimiters is formed by ‘ ’, ‘\t’, ‘\n’, ‘\’ and ‘"’, and you decide to enclose them in double quotes, the numdiff command line should be

     numdiff -s'' \t\n\\\\\"'' file1 file2

and not

     numdiff -s'' \t\n\\\"'' file1 file2

In this last case the shell would indeed replace the string

\t\n\\\"

by

\t\n\"

and then numdiff would take ‘ ’, ‘\t’, ‘\n’ and ‘"’ as field delimiters.

numdiff requires the presence of the newline in the set of characters passed to -s. The absence of the newline in the set of delimiters causes the issue of a suitable warning message and the termination of the program.

If you run Numdiff with the option -B (--binary) on files created under MSDog/MSWindoze, then you should put the carriage return in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by numdiff, since numdiff would consider the final carriage return as part of the field and this one would be then qualified as non-numerical.

You can specify different delimiters for the two files to compare by putting the prefix ‘1:’ or ‘2:’ in front of the set of characters passed to -s. If the argument of -s begins with ‘1:’, the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is ‘2:’, then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case numdiff uses the default field delimiters blank, tab and newline for the other file. Therefore, with ‘numdiff -s '1:: \n' file1 file2’ the program will take colon, blank and newline as delimiters for file1, and blank, tab and newline as delimiters for file2. The recommendations about quoting the set of delimiters are valid also in presence of a prefix.

Starting from version 5.8 numdiff allows to specify whole strings as field delimiters instead of single characters. To this purpose the option -D is provided. Assume that file register1 and file register2 contain

--A:    +1.0---
--B:    -2.0---
--C:    +3.0---
--D:    -4.0---
--E:    +5.0---
--F:    -6.0---

and

--a:    +1.1---
--b:    -2.2---
--c:    +3.3---
--d:    -4.4---
--e:    +5.5---
--f:    -6.6---

respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character - (minus) as delimiter via the option -s: if you do it, then the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option -D you can tell numdiff to consider the strings -- and --- as field delimiters but not the single character -. To see this in practice, look at the output of the command ‘numdiff -D ': -- --- \s \n' register1 register2’:

     ----------------
     ##1       #:1   <== A
     ##1       #:1   ==> a
                                                          @
     ##1       #:2   <== +1.0
     ##1       #:2   ==> +1.1
      Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
     ----------------
     ##2       #:1   <== B
     ##2       #:1   ==> b
                                                          @
     ##2       #:2   <== -2.0
     ##2       #:2   ==> -2.2
      Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
     ----------------
     ##3       #:1   <== C
     ##3       #:1   ==> c
                                                          @
     ##3       #:2   <== +3.0
     ##3       #:2   ==> +3.3
      Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
     ----------------
     ##4       #:1   <== D
     ##4       #:1   ==> d
                                                          @
     ##4       #:2   <== -4.0
     ##4       #:2   ==> -4.4
      Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     ----------------
     ##5       #:1   <== E
     ##5       #:1   ==> e
                                                          @
     ##5       #:2   <== +5.0
     ##5       #:2   ==> +5.5
      Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1
     ----------------
     ##6       #:1   <== F
     ##6       #:1   ==> f
                                                          @
     ##6       #:2   <== -6.0
     ##6       #:2   ==> -6.6
      Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1
     
     +++  File "register1" differs from file "register2"

The argument ‘-D ': -- --- \s \n'’ instructs numdiff to regard every occurrence of a colon (:), of a blank (\s), of a newline (\n), as well as every occurrence of the strings -- and --- as field delimiters. The minus sign in front of the negative numbers is then handled as it should be.

In general the argument to the option -D is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option -D is

     string1 string2 ... stringN

where string1, string2, and so on are sequences of one or more characters (strings) containing no blank.

Mind that at least one of these strings must be ‘\n’. In addition, if a string contains the newline character, this must be the only one: strings like ‘#\n’, ‘%%\n’, or ‘\s\n’ are not allowed (entering such a string makes the program terminate after issuing a suitable warning message).

Since the blank character has a special meaning for the shell, if the argument of -D is formed by two or more strings it should be quoted either with a single (‘'’) or with a double quote (‘"’). Quoting is also adviced if one of the strings passed to -D contains a character (or a sequence of characters) having a special meaning for the shell.

For the usage of single and double quoting to delimit the argument of -D the same warnings and recommendations apply as for the argument of -s.

If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence \s, like in the example above: within the argument of -D the blank character is always interpreted as a separator of adjacent delimiters.

More generally, when writing the argument of -D the same escape sequences are allowed as for the argument of -s. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between ledger1:

                  In                            Out
     
     Jan      1200.00€                1000.00€
     Feb       800.40€                 650.00€
     Mar      1620.50€                1500.00€
     Apr       760.00€                 900.00€
     
     Total    4380.90€                4050.00€
     
     Difference: +330.90€

and ledger2:

                  In                            Out
     
     Jan      1100.00€                1000.00€
     Feb       800.40€                 750.00€
     Mar      1620.50€                1700.00€
     Apr       750.00€                 900.00€
     
     Total    4270.90€                4350.00€
     
     Difference: -79.10€

Since the Euro symbol is attached to all values, numdiff cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command ‘numdiff ledger1 ledger2’ shows:

     ----------------
     ##3       #:2   <== 1200.00€
     ##3       #:2   ==> 1100.00€
                                                          @
     ----------------
     ##4       #:3   <== 650.00€
     ##4       #:3   ==> 750.00€
                                                          @
     ----------------
     ##5       #:3   <== 1500.00€
     ##5       #:3   ==> 1700.00€
                                                          @
     ----------------
     ##6       #:2   <== 760.00€
     ##6       #:2   ==> 750.00€
                                                          @
     ----------------
     ##8       #:2   <== 4380.90€
     ##8       #:2   ==> 4270.90€
                                                          @
     ##8       #:3   <== 4050.00€
     ##8       #:3   ==> 4350.00€
                                                          @
     ----------------
     ##10      #:2   <== +330.90€
     ##10      #:2   ==> -79.10€
                                                          @
     
     +++  File "ledger1" differs from file "ledger2"

The trick to perform the comparison in the proper way consists in specifying the € symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If ledger1 and ledger2 are encoded in UTF-8, this can be done by using the option -D with the argument ‘\xE2\x82\xAC \s \t \n’, since the hexadecimal representation of € in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command ‘numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2’ shows that in this case numdiff performs indeed a numerical comparison of the values contained in the two files:

     ----------------
     ##3       #:2   <== 1200.00
     ##3       #:2   ==> 1100.00
      Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2
     ----------------
     ##4       #:3   <== 650.00
     ##4       #:3   ==> 750.00
      Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1
     ----------------
     ##5       #:3   <== 1500.00
     ##5       #:3   ==> 1700.00
      Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1
     ----------------
     ##6       #:2   <== 760.00
     ##6       #:2   ==> 750.00
      Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2
     ----------------
     ##8       #:2   <== 4380.90
     ##8       #:2   ==> 4270.90
      Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2
     ##8       #:3   <== 4050.00
     ##8       #:3   ==> 4350.00
      Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2
     ----------------
     ##10      #:2   <== +330.90
     ##10      #:2   ==> -79.10
      Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0
     
     +++  File "ledger1" differs from file "ledger2"

If ledger1 and ledger2 had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to € in this other encoding should have been passed to -D.

As for -s, with -D you can specify different delimiters for the two files to compare by means of the prefixes ‘1:’ and ‘2:’, like in ‘numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file’. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, numdiff uses the default field delimiters blank, tab and newline for the other file.

If you run Numdiff with the option -B (--binary) on files created under MSDog/MSWindoze, you should always include the character ‘\r’ in the set of field delimiters.

The option -s and -D can appear more than once on the command line. In case of conflicts, numdiff assumes as set of delimiters for a given file the one specified last on the command line.

By means of the option -# the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user.

Take into account that an higher precision makes the execution of numdiff slower. This is particularly true if numdiff is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, you have to care that numdiff truncates the value of a numerical field if it has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply.

  • If numdiff has been built with its own internal support for multiple precision arithmetic, then
    • if a number is written in ordinary decimal notation, numdiff will consider, in addition to all digits of the integer part, only the first P digits of the fractional part;
    • if a value is written in scientific notation, then numdiff will only consider the first P digits of the fractional part of the mantissa.
  • If numdiff uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered.

You can find out whether your local version of numdiff is relying on GNU MP or not by executing the command ‘numdiff -v’. If numdiff uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information:

     The software has been linked against
     the GNU Multiple Precision Arithmetic Library,
     version number 4.2.4.

If numdiff does not rely on GNU MP, then the displayed message will be (up to translation into your mother language)

     The software has been built with
     its own internal support for multiple precision arithmetic.

By means of the option -c the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored by numdiff whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of -c with ‘1:’ or ‘2:’ it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files money1:

	Profits			Expenses

	+$430.10		-$300.50
	+$750.20		-$550.02
	+$876.24		-$720.00

Totals  $2056.54               -$1570.52

and money2:

	Profits			Expenses

	USD430.10		-USD300.50
	USD750.20		-USD550.02
	USD876.24		-USD720.15
	
Totals    2056.54                 -1570.67
To properly compare them we have to tell numdiff that ‘$’ and ‘USD’ are the currency symbols for money1 and money2 respectively. This can be achieved by ‘-c 1:$’ and ‘-c 2:USD’. The output of the command ‘numdiff -c 1:$ -c 2:USD money1 money2’ is
     ----------------
     ##5       #:2   <== -$720.00
     ##5       #:2   ==> -USD720.15
      Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4
     ----------------
     ##7       #:3   <== -$1570.52
     ##7       #:3   ==> -1570.67
      Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5
     
     +++  File "money1" differs from file "money2"

as it should be.

The argument of -c may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write ‘-c €’ to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options -s and -D.

For example, if the files to compare are encoded in UTF-8, you can set € as currency name by adding ‘-c '\xE2\x82\xAC'’ to the command line of numdiff, since the hexadecimal representation of € in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC. Mind that in this case the argument of -c has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell.

To see this in practice, if euro1 contains the text

     	Profits			       Expenses
     
     	+€430.10		      -€300.50
     	+€750.20		      -€550.02
     	+€876.24		      -€720.00

and euro2 the text

     	Profits			       Expenses
     
     	+€430.10		      -€300.00
     	+€750.20		      -€550.02
     	+€876.00		      -€720.00

then the report of ‘numdiff -c '\xE2\x82\xAC' euro1 euro2’ is

     ----------------
     ##3       #:2   <== -€300.50
     ##3       #:2   ==> -€300.00
      Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3
     ----------------
     ##5       #:1   <== +€876.24
     ##5       #:1   ==> +€876.00
      Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4
     
     +++  File "euro1" differs from file "euro2"

Please consider that -c is only provided to let numdiff regard a field as numeric also in presence of a currency name immediately before its first digit: numdiff does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. numdiff can even cope with the currency name when it appears in a complex number. For example, with ‘-c EURnumdiff considers +EUR12-EUR0.24i and +12-0.24i as equal.

The options -d, -t, -g, -p, -n, -e and -i can be used to instruct numdiff about the numeric formats used in the files which it is going to compare. The two files to compare do not have to adopt the same numeric format and then numdiff allows to specify different numeric formats for them. Each of the options -d, -t, -g, -p, -n, -e, and -i can have as argument one or two (single-byte) characters, in particular one or two digits if the option is -g. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option -d can be used to tell numdiff which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command ‘numdiff -d_ file1 file2’, then numdiff will understand that both in file1 and in file2 the character underscore (‘_’) is used in place of the default one (‘.’) to indicate the position of the decimal point in the numerical values. But if the command is ‘numdiff -d_: file1 file2’, then numdiff will understand that the decimal point is indicated by the character underscore in file1, and by colon (‘:’) in file2.

If you omit to use one of the options -d, -t, -g, -p, -n, -e, and -i, then the corresponding attribute will take its default value, see Default Numeric Format.

You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option -g must be digits, the arguments of the options -d and -t must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function ispunct returns a non zero value), those ones of the options -p, -n, -e and -i must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function isgraph returns a non zero value).

It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command ‘numdiff -d,. file1 file2’ will make numdiff abnormally terminate after printing the error message:

     The numeric format specified for the first file is illegal,
     the following symbols should be all different
     while two or more of them are actually equal:
     
     Decimal point = `,'
     Thousands separator = `,'
     Leading positive sign = `+'
     Leading negative sign = `-'
     Prefix for decimal exponent = `e'
     Symbol used to denote the imaginary unit = `i'

With the option -d we have told numdiff that in the first file the decimal point is indicated by the character comma, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. comma, for both files to compare. In this way we have implicitly told that in file1 the character comma represents both decimal point and thousands separator. Since this is not reasonable, numdiff refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option -t: ‘numdiff -d,. -t., file1 file2’. Of course, we assume here that the decimal point and the thousands separator are represented in file1 by comma and dot respectively, in file2 by dot and comma.

I strongly suggest you, whenever you write a file, to avoid using the same symbol to mean two different things (like would be using comma for both decimal point and thousands separator), it is nonsense.

At last, it is possible (but stupid) to use as argument for the options -d, -t, -g, -p, -n, -e, and -i one of the characters used as delimiters in the files to compare. In such a case numdiff does not complain, but you have to consider that it first uses the set of field delimiters to split the files into fields and then, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. However, it should never happen to specify as argument for one of the options -d, -t, -g, -p, -n, -e, and -i a character which is also used as field delimiter: in writing a file you should avoid (and people usually avoid it) to use the same symbol to mean two different things. What we have said also explains why the argument of the option -c should never contain one or more field delimiters.

The option -X can be used to restrict the comparison between files to a certain group of fields. This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument specifies the position(s) of the fields that numdiff has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand.

The argument passed to -X can start with a prefix, which must be either ‘1:’ or ‘2:’. ‘1:’ refers to the file passed as first on the command line, ‘2:’ to the file specified as second. With the prefix ‘1:’ only the fields of the first file corresponding to the given position(s) are ignored. Similarly, if you want to ignore only fields from the second file you have to use the prefix ‘2:’.

The option -X can appear more times on the command line, in which case numdiff will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file List1 contains the data

* a  1    1     1     1
* b  2    2     2     2
* c  3    3     3     3
* d  4    4     4     4
* e  5    5     5     5

and List2 the data

     1    1.1  1.01   A  1.001  1.0001
     2    2.2  2.02   B  2.002  2.0002
     3    3.3  3.03   C  3.003  3.0003
     4    4.4  4.04   D  4.004  4.0004
     5    5.5  5.05   E  5.005  5.0005

then the output of ‘numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2’ is

     ----------------
     ##1       #:4   <== 1
     ##1       #:2   ==> 1.1
     @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
     ##1       #:5   <== 1
     ##1       #:3   ==> 1.01
     @ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2
     ----------------
     ##2       #:4   <== 2
     ##2       #:2   ==> 2.2
     @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
     ##2       #:5   <== 2
     ##2       #:3   ==> 2.02
     @ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2
     ----------------
     ##3       #:4   <== 3
     ##3       #:2   ==> 3.3
     @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
     ##3       #:5   <== 3
     ##3       #:3   ==> 3.03
     @ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2
     ----------------
     ##4       #:4   <== 4
     ##4       #:2   ==> 4.4
     @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
     ##4       #:5   <== 4
     ##4       #:3   ==> 4.04
     @ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2
     ----------------
     ##5       #:4   <== 5
     ##5       #:2   ==> 5.5
     @ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1
     ##5       #:5   <== 5
     ##5       #:3   ==> 5.05
     @ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2
     
     +++  File "List1" differs from file "List2"

Numdiff cuts off from List1 the fields in the positions 1, 2 and 6 and from List2 the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of List1 with the first, second and third field respectively of the corresponding line of List2. An equivalent form of the command ‘numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2’ is given by ‘numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2’ : since the sixth field is cut off from both files we can refer to it without a prefix.

As you can see, you can specify a range of fields by using the notation ‘m-n’, where m and n are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like ‘m-’ or ‘-n’. The first expression corresponds to all fields starting from the mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the nth one (inclusive). Therefore the command ‘numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2’ is equivalent to ‘numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2’ or to ‘numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2’.

Mind that the largest field number you can use while writing a specification for the option -X is 32768.

If you use the option -X the exit status of numdiff reflects the outcome of the restricted comparison. For instance, the exit status of ‘numdiff -X 8- file1 file2’ is 1 only if numdiff has found a difference in the first seven fields of file1 and file2. If the two files differ only in the fields after the seventh one, then numdiff ends with a zero exit status.

Going back to the example with List1 and List2, the output of ‘numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2’ is

     
     +++  Files "List1" and "List2" are equal

since every field of List1 at position 3 is equal to the first field in the corresponding line of List2. The exit code returned by the program to the shell is zero.

The options -z, -Z, -m, -H, -f, and -T influence the action of the filter and their use is then described later, Filtering. Care that -z and -Z need both an argument in the same form required by -X.

Since version 5 Numdiff accepts also long options to conform to the GNU standards. Now it is then possible, e.g., to use ‘--separators='\n\t %'’ or ‘--separators '\n\t %'’ instead of using ‘-s '\n\t %'’.

The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option.

The argument of a long option may or may not preceded by the = sign. The only exceptions are the options --test-filter and --overview, for which the presence of the = before the argument is mandatory. Then ‘--test-filter=60’ is correct while ‘--test-filter 60’ is not accepted.


Next: , Previous: Invoking numdiff, Up: Top

6 Selecting lines and fields for the comparison

Together with the version 5.x of Numdiff is shipped the program ndselect. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file list1 contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24:

12       3.46410161513775458705
13       3.60555127546398929312
14       3.74165738677394138558
15       3.87298334620741688518
16       4
17       4.12310562561766054982
18       4.24264068711928514641
19       4.35889894354067355224
20       4.47213595499957939282
21       4.58257569495584000659
22       4.69041575982342955457
23       4.7958315233127195416
24       4.89897948556635619639

and list2 contains suitable approximations of the square root only for the numbers between 12 and 21 which are multiple of 3:

12       3.46410162002945508100
15       3.87298387096774193548
18       4.24264705882352941176
21       4.58260869565217391304

These approximations could have been obtained by using the famous Heron's algorithm, which, given an approximation a for the square root of a number x, computes a better approximation by the formula a := 0.5 * (x/a + a). What we want now is to understand by using numdiff how good the approximations contained in file list2 are. Unfortunately, we cannot execute directly the command ‘numdiff list1 list2’, since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15 respectively. To make the comparison in the right way, one could open list1 in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file.

An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities head and sed, in this particular case ‘head -n 10 list1 | sed -n -e '1~3 p' > List1’. A quick explanation for the ones who do not know how to use head and sed: the previous command extracts from list1 the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed on the file List1, which then looks like:

12       3.46410161513775458705
15       3.87298334620741688518
18       4.24264068711928514641
21       4.58257569495584000659

Once obtained List1, we can perform the comparison between the values we are interested in by means of ‘numdiff List1 list2’ . Unfortunately, this trick only works if you have installed the GNU version of sed, which, as far as I know, is the only one to provide the extension first~step to specify line addresses. That is way I decided to implement ndselect, which allows to obtain the same result as above with the simpler command ‘ndselect -b 1 -e 10 -s 3 list1 > List1

The meaning of the arguments passed to the options -b, -e, and -s is the following: we tell ndselect to print every third line of file list1 (the option -s specifies the step) starting from the first one (the option -b specifies the beginning) and ending within the tenth one possibly inclusive (the option -e specifies the end). Because of the presence of the redirection operator >, the previous command sends to the file List1 what ndselect would print on the screen (standard output).

Since version 5.6 ndselect can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option -F to indicate the position of the first field to print, the option -L to indicate the position of the last field that can be printed, the option -I to set the increment when selecting the fields. In addition, the option -S can be used to specify a set of field delimiters different from the default one (which consists of blank, tab and newline). As for numdiff, the field delimiters are used to split the input lines into fields.

The option -S of ndselect recognizes and accepts the same escape sequences of numdiff options -s, -D, and -c.

As example consider the selection of the even fields between the second and the sixth one inclusive from the file many_many_columns, whose contents are shown here:

A |   I | 1.1 |   1.08  |   1.01  |  0.1  |   11.011    |    -1.0e-1  
B |  II | 2.2 |   2.16  |   4.04  |  0.4  |   24.024    |    -1.0e-2  
C | III | 3.3 |   3.24  |   9.09  |  0.9  |   39.039    |    -1.0e-3  
D |  IV | 4.4 |   4.32  |  16.16  |  1.6  |  416.039    |    -1.0e-4  
E |   V | 5.5 |   5.40  |  25.25  |  2.5  |  525.416    |    -1.0e-5  
F |   # |  #  |    #    |    #    |   #   |     #       |      #

This selection can be accomplished by means of the command ‘ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns’, whose output shows only the selected fields:

     I | 1.08  |   0.1
     II | 2.16  |   0.4
     III | 3.24  |   0.9
     IV | 4.32  |  1.6
     V | 5.40  |  2.5
     # |  #    |    #

Of course, you can also select particular fields of particular lines, as shown by the output of the command ‘ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns’:

     I | 1.08  |   0.1
     IV | 4.32  |  1.6

By default, ndselect reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option -O. This one recognizes and accepts the same escape sequences of numdiff options -s, -D, and -c. For example, ‘ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns’ puts two horizontal tabulations after every printed field:

I		1.08		0.1		
IV		4.32		1.6		

Even if the implementation of a filter in numdiff and the addition of the option -X have made ndselect much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than numdiff. The complete synopsis of ndselect can be found in the next chapter.


Next: , Previous: ndselect, Up: Top

7 Invoking ndselect

SYNOPSIS

        ndselect -h|--help|-v|--version

or

        ndselect [-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS]
        [-O OSEP][-x][-l PATH][-o PATH][FILE]

where FILE is the name of the file to read from.

In the first case ndselect prints a short help or/and version number, Copyright, License notice and NO-Warranty disclaimer. In the second case ndselect prints on the standard output a subset of lines and fields from FILE. The complete path of FILE should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input.

OPTIONS

-b, --beginning, --start=N
Set to N the number of the first line to print (The default behavior is to start with line number 1)
-e, --end=N
Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file)
-s, --step=N
Set to N the increment to use when selecting the lines to print (The default value for the increment is 1)
-F, --first-field=N
Set to N the number of the first field to print (The default behavior is to start with field number 1)
-L, --last-field=N
Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line)
-I, --increment=N
Set to N the increment to use when selecting the fields to print (The default value for the increment is 1)
-S, --separators=IFS
Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline)
-D, --delimiters=DELIMS
Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline)
-O, --output-separator=OSEP
Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines)
-x, --omit-empty-lines
Do not print empty lines
-l, --warnings-to=PATH
Redirect warning and error messages from stderr to the indicated file
-o, --output=PATH
Redirect output from stdout to the indicated file
-h, --help
Show this help message
-v, --version
Show version number, Copyright, Distribution Terms and NO-Warranty

Passing 0 as argument to the option -L or to -e is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively).

DIAGNOSTICS

The exit status is 0 in case of normal termination, -1 (255) in case of error.

As numdiff does, since version 5 also ndselect accepts long options. Thus, instead of ‘ndselect -b 1 -e 10 -s 3 list1 > List1’ you can write ‘ndselect --start=1 --end=10 --step=3 list1 > List1’.

The usage of the option -D is the same as for numdiff. The option -S corresponds to the option -s of numdiff.


Next: , Previous: Invoking ndselect, Up: Top

8 Using the filter of numdiff

Since version 5 it is possible to activate a filter when calling numdiff, so that the program performs automatically the comparison in the desired way. Recalling the example of chapter 6, if you run the command numdiff -z 2- -V list1 list2 you obtain the following result:

     
     ----------------
     ##1       <== 12       3.46410161513775458705
     ##1       ==> 12       3.46410162002945508100
     
     ##1       #:2   <== 3.46410161513775458705
     ##1       #:2   ==> 3.46410162002945508100
      Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9
     ----------------
     ##2       <== 13       3.60555127546398929312
               ==>
     
     ----------------
     ##3       <== 14       3.74165738677394138558
               ==>
     
     ----------------
     ##4       <== 15       3.87298334620741688518
     ##2       ==> 15       3.87298387096774193548
     
     ##4       #:2   <== 3.87298334620741688518
     ##2       #:2   ==> 3.87298387096774193548
      Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7
     ----------------
     ##5       <== 16       4
               ==>
     
     ----------------
     ##6       <== 17       4.12310562561766054982
               ==>
     
     ----------------
     ##7       <== 18       4.24264068711928514641
     ##3       ==> 18       4.24264705882352941176
     
     ##7       #:2   <== 4.24264068711928514641
     ##3       #:2   ==> 4.24264705882352941176
      Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6
     ----------------
     ##8       <== 19       4.35889894354067355224
               ==>
     
     ----------------
     ##9       <== 20       4.47213595499957939282
               ==>
     
     ----------------
     ##10      <== 21       4.58257569495584000659
     ##4       ==> 21       4.58260869565217391304
     
     ##10      #:2   <== 4.58257569495584000659
     ##4       #:2   ==> 4.58260869565217391304
      Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6
     ----------------
     ##11      <== 22       4.69041575982342955457
               ==>
     
     ----------------
     ##12      <== 23       4.7958315233127195416
               ==>
     
     ----------------
     ##13      <== 24       4.89897948556635619639
               ==>
     
     
     +++  File "list1" differs from file "list2"

Numdiff has recognized that the lines of list1 with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23 and 24 have been deleted from list2. The numerical comparison has been done by likening each line of list2 to the line of list1 which displays the square root for the same integer value. The output obtained running the filter of Numdiff by numdiff -f -z 2- list1 list2 confirms this:

     12       3.46410161513775458705         12       3.46410162002945508100
     13       3.60555127546398929312      <
     14       3.74165738677394138558      <
     15       3.87298334620741688518         15       3.87298387096774193548
     16       4                           <
     17       4.12310562561766054982      <
     18       4.24264068711928514641         18       4.24264705882352941176
     19       4.35889894354067355224      <
     20       4.47213595499957939282      <
     21       4.58257569495584000659         21       4.58260869565217391304
     22       4.69041575982342955457      <
     23       4.7958315233127195416       <
     24       4.89897948556635619639      <
     
     
     +++  File "list1" differs from file "list2"

If you compare the command numdiff -z 2- -V list1 list2 with the one used for the files bill1 and bill2, see command, you surely notice that the filter has been invoked in different ways, first with -z @ and then with -z 2-.

The synchronization procedure used by the filter is based on blurring and byte-by-byte comparison. The options -z and -Z are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by -X, see Use of the option -X, but accept additionally the special value ‘@’ as abbreviation for the range of fields ‘1-’. Then the specifications ‘1:@’, ‘2:@’ and ‘@’ are used to mean all fields of the first file, of the second one or of both, respectively.

Employing -z and -Z in the right way is extremely important to let the filter work as desired. For instance, numdiff -f -z @ list1 list2 matches the lines of list1 and list2 in the same wrong way

     12       3.46410161513775458705         12       3.46410162002945508100
     13       3.60555127546398929312         15       3.87298387096774193548
     14       3.74165738677394138558         18       4.24264705882352941176
     15       3.87298334620741688518         21       4.58260869565217391304
     16       4                           <
     17       4.12310562561766054982      <
     18       4.24264068711928514641      <
     19       4.35889894354067355224      <
     20       4.47213595499957939282      <
     21       4.58257569495584000659      <
     22       4.69041575982342955457      <
     23       4.7958315233127195416       <
     24       4.89897948556635619639      <
     
     
     +++  File "list1" differs from file "list2"

as Numdiff would do without employing the filter.

It is essential then to understand what blurring a field means and how the filter uses blurring to match the lines of the files to compare.

After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option -X, then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of place card.

After doing this, the filter converts all remaining numerical fields to a standard format and compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one and how to match the remaining lines to create a one-to-one correspondence.

Only at this point numdiff inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option -X compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values.

Blurring the right fields is essential to match the lines from the two files appropriately before doing any numerical comparison. Without blurring, the numerical fields could prevent numdiff from an appropriate matching of the lines, in case some of these are present in only one file, by creating confusion with their (maybe small) numeric differences.

Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option -z indicate which fields of which file have to be blurred under the condition that they are recognized as numeric fields. Non-numeric fields are left by -z untouched (no blurring occurs for them). Then ‘-z 1:5-7’ makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric.

By the option -Z you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, ‘-Z 2:3-4’ activates the blurring of the 3th and 4th field of each line of the second file.

Going back to the comparison of the files list1 and list2, the option ‘-z 2-’ of the command ‘numdiff -z 2- -V list1 list2’ makes the filter transform the (memory copies of the) two files as

     12       •
     13       •
     14       •
     15       •
     16       •
     17       •
     18       •
     19       •
     20       •
     21       •
     22       •
     23       •
     24       •

and

     12       •
     15       •
     18       •
     21       •

respectively. Here • denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command ‘sdiff -W’ when applied to them:

     12       •                        12       •
     13       •                     <
     14       •                     <
     15       •                        15       •
     16       •                     <
     17       •                     <
     18       •                        18       •
     19       •                     <
     20       •                     <
     21       •                        21       •
     22       •                     <
     23       •                     <
     24       •                     <

If you put the blurred fields back you obtain exactly the output of ‘numdiff -f -z 2- list1 list2’:

     12       3.46410161513775458705           12       3.46410162002945508100
     13       3.60555127546398929312        <
     14       3.74165738677394138558        <
     15       3.87298334620741688518           15       3.87298387096774193548
     16       4                             <
     17       4.12310562561766054982        <
     18       4.24264068711928514641           18       4.24264705882352941176
     19       4.35889894354067355224        <
     20       4.47213595499957939282        <
     21       4.58257569495584000659           21       4.58260869565217391304
     22       4.69041575982342955457        <
     23       4.7958315233127195416         <
     24       4.89897948556635619639        <
     
     
     +++  File "list1" differs from file "list2"
     

Since the second field is a numerical value in all the lines of list1 and list2, to use the option -Z instead of -z makes no difference in this case. The output of ‘numdiff -f -Z 2- list1 list2’ is then the same of ‘numdiff -f -z 2- list1 list2’.

After this explanation you can also understand why ‘numdiff -f -z @ list1 list2’ gives a wrong result. Since also the first field is always a numerical value, the option ‘-z @’ makes the filter transform the two given files as

     •       •
     •       •
     •       •
     •       •
     •       •
     •       •
     •       •
     •       •
     •       •
     •       •
     •       •
     •       •
     •       •

and

     •       •
     •       •
     •       •
     •       •

respectively, so that it is not anymore possible to match the lines in a reasonable way.

We consider now a typical situation where it is better to use -Z in place of -z. If the file Table1 contains

-6 	 2.449490
-5 	 2.236068
-4 	 2.000000
-3 	 1.732051
-2 	 1.414214
-1       1.000000
0        0
- - - - - - - - -
1 	 1.000000
2 	 1.414214
3 	 1.732051
4 	 2.000000
- - - - - - - - -
5 	 2.236068
6 	 2.449490
7 	 2.645751
- - - - - - - - -
8 	 2.828427
9 	 3.000000
10 	 3.162278
11 	 3.316625
12 	 3.464102
- - - - - - - - -
- - - - - - - - -
13 	 3.605551
14 	 3.741657

and Table2 contains

-6       Not_defined
-4       Not_defined
-2       Not_defined
 0       0.000000
 2 	 1.414216
 4 	 2.000000
 6 	 2.449494
 8 	 2.828469
 10 	 3.162278
 12 	 3.464102
 14 	 3.741658
********************END

then the output of ‘numdiff -z 1:2 -Z 2:2 -f Table1 Table2’ is

     -6       2.449490               -6       Not_defined
     -5       2.236068            <
     -4       2.000000               -4       Not_defined
     -3       1.732051            <
     -2       1.414214               -2       Not_defined
     -1       1.000000            <
     0        0                       0       0.000000
     - - - - - - - - -            <
     1        1.000000            <
     2        1.414214                2       1.414216
     3        1.732051            <
     4        2.000000                4       2.000000
     - - - - - - - - -            <
     5        2.236068            <
     6        2.449490                6       2.449494
     7        2.645751            <
     - - - - - - - - -            <
     8        2.828427                8       2.828469
     9        3.000000            <
     10       3.162278                10      3.162278
     11       3.316625            <
     12       3.464102                12      3.464102
     - - - - - - - - -            <
     - - - - - - - - -            <
     13       3.605551            <
     14       3.741657                14      3.741658
                                  >  ********************END
     
     
     +++  File "Table1" differs from file "Table2"

which is exactly what is expected. On the other hand the command ‘numdiff -z 2 -f Table1 Table2’ displays

     -6       2.449490            |  -6       Not_defined
     -5       2.236068            |  -4       Not_defined
     -4       2.000000            |  -2       Not_defined
     -3       1.732051            <
     -2       1.414214            <
     -1       1.000000            <
     0        0                       0       0.000000
     - - - - - - - - -            <
     1        1.000000            <
     2        1.414214                2       1.414216
     3        1.732051            <
     4        2.000000                4       2.000000
     - - - - - - - - -            <
     5        2.236068            <
     6        2.449490                6       2.449494
     7        2.645751            <
     - - - - - - - - -            <
     8        2.828427                8       2.828469
     9        3.000000            <
     10       3.162278                10      3.162278
     11       3.316625            <
     12       3.464102                12      3.464102
     - - - - - - - - -            <
     - - - - - - - - -            <
     13       3.605551            <
     14       3.741657                14      3.741658
                                  >  ********************END
     
     
     +++  File "Table1" differs from file "Table2"

which is partially wrong.

Notice that in Table1 you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file Table2 contains some approximations (obtained by Newton's method) for the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by Not_defined.

Since Not_defined is not a numeric value, during the execution of the last command the filter transforms Table1 in this way

     -6       •
     -5       •
     -4       •
     -3       •
     -2       •
     -1       •
     0        •
     - - - - - - - - -
     1        •
     2        •
     3        •
     4        •
     - - - - - - - - -
     5        •
     6        •
     7        •
     - - - - - - - - -
     8        •
     9        •
     10       •
     11       •
     12       •
     - - - - - - - - -
     - - - - - - - - -
     13       •
     14       •

and Table2 in this other way

     -6       Not_defined
     -4       Not_defined
     -2       Not_defined
      0       •
      2       •
      4       •
      6       •
      8       •
      10      •
      12      •
      14      •
     ********************END

Unfortunately the first three lines are enough to confuse the synchronization procedure, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as we explained before.

You can check that this is definitely the case by looking at the output of the command ‘sdiff -W’ on the transformed files, which is

     -6       •           |  -6       Not_defined
     -5       •           |  -4       Not_defined
     -4       •           |  -2       Not_defined
     -3       •           <
     -2       •           <
     -1       •           <
     0        •               0       •
     - - - - - - - - -    <
     1        •           <
     2        •               2       •
     3        •           <
     4        •               4       •
     - - - - - - - - -    <
     5        •           <
     6        •               6       •
     7        •           <
     - - - - - - - - -    <
     8        •               8       •
     9        •           <
     10       •               10      •
     11       •           <
     12       •               12      •
     - - - - - - - - -    <
     - - - - - - - - -    <
     13       •           <
     14       •               14      •
                          >  ********************END

If we give the command ‘numdiff -z 1:2 -Z 2:2 -f Table1 Table2’ instead of ‘numdiff -z 2 -f Table1 Table2’, the second field of the lines of Table2 is always blurred. The filter transforms then Table2 into

     -6       •
     -4       •
     -2       •
      0       •
      2       •
      4       •
      6       •
      8       •
      10      •
      12      •
      14      •
     ********************END

and re-synchronizes the files Table1 and Table2 in the right way.

Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use -X to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be the case e.g. when in some lines the content of the field is given by a special numeric value, like Infinity, Inf, +Inf or -Inf, or by NaN, abbreviation for Not a Number.

Concerning the numeric fields which are not blurred, one has to remark that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that short1 contains a list of numbers with their logarithms

0.001          -3
0.01           -2
0.1            -1
1               0
1000            3
1000000         6
1000000000      9

and short2 the same list of numbers and logarithms, but with differences in the numeric format:

******************
0.0010000       -3
.0100           -2
0000.10         -1
1.               0
1,000.000        3
1,000,000.       6
1,000,000,000    9

Then ‘numdiff -f -z 2- short1 short2’ displays

                                  >  ******************
     0.001          -3               0.0010000       -3
     0.01           -2               .0100           -2
     0.1            -1               0000.10         -1
     1               0               1.               0
     1000            3               1,000.000        3
     1000000         6               1,000,000.       6
     1000000000      9               1,000,000,000    9
     
     
     +++  File "short1" differs from file "short2"

showing that the filter has matched the lines in the right way.

The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files decimal and scientific contain

.001           -3
.01            -2
.1             -1
* * * * * * * * *
1               0
1000            3
1000000         6
1000000000      9

and

*****************
1.0e-3         -3
1.0e-2         -2
1.0e-1         -1
1.0e0           0
1.0e3           3
1.0e6           6
1.0e9           9
*****************

respectively, then ‘numdiff -f -z 2- decimal scientific’ shows

                                  >  *****************
     .001           -3               1.0e-3         -3
     .01            -2               1.0e-2         -2
     .1             -1               1.0e-1         -1
     * * * * * * * * *            <
     1               0               1.0e0           0
     1000            3               1.0e3           3
     1000000         6               1.0e6           6
     1000000000      9               1.0e9           9
                                  >  *****************
     
     
     +++  File "decimal" differs from file "scientific"

proving that the filter does not get confused.

No problems come out also in the case when for the same not blurred field the scientific notation is used in both files. If the files sc1 and sc2 contain

  1.E-3          -3
  1.00E-2        -2
  1.0E-1         -1
  1.0000E0        0
001.0E3           3
+01.000E6         6
  1.0E+09         9
  1.0E+10        10
* * * * * * * * * *

and

*****************
 1.0e-003      -3
 1.0e-2        -2
 1.0e-1        -1
 1.0e0          0
+1.0e3          3
 1.0e+6         6
 1.0e9          9

respectively, then ‘numdiff -f -z 2- sc1 sc2’ correctly displays

                                  >  *****************
       1.E-3          -3              1.0e-003      -3
       1.00E-2        -2              1.0e-2        -2
       1.0E-1         -1              1.0e-1        -1
       1.0000E0        0              1.0e0          0
     001.0E3           3             +1.0e3          3
     +01.000E6         6              1.0e+6         6
       1.0E+09         9              1.0e9          9
       1.0E+10        10          <
     * * * * * * * * * *          <
     
     
     +++  File "sc1" differs from file "sc2"

The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize ‘123.456E+2’ and ‘1.23456E+4’ as equal.

We can see this in the case of the files Scnot1:

-------------------------
1.2E0             *     1
2.45E-1           *     2
-3.678E-2         *     3

and Scnot2:

12E-1             *     1
245E-3            *     2
-0.003678E+1      *     3

numdiff -f -z 3- Scnot1 Scnot2’ displays the report:

     -------------------------    <
     1.2E0             *     1       12E-1             *     1
     2.45E-1           *     2       245E-3            *     2
     -3.678E-2         *     3       -0.003678E+1      *     3
     
     
     +++  File "Scnot1" differs from file "Scnot2"

which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If Scnot1 is given by

 1.2000e0         *     1
02.4500e-1        *     2
-003.678E-2       *     3

and Scnot2 is the same file as before, the output of the command ‘numdiff -f -z 3- Scnot1 Scnot2’ is still right:

      1.2000e0         *     1       12E-1             *     1
     02.4500e-1        *     2       245E-3            *     2
     -003.678E-2       *     3       -0.003678E+1      *     3
     
     
     +++  Files "Scnot1" and "Scnot2" have the same structure

Till now we have always used the option -f with no argument. But -f accepts an optional argument, which can be used to control how -f displays its output. If you provide an argument, care not to leave any space between the option and the argument: ‘-f60’ is correct while ‘-f 60’ makes Numdiff terminate after printing an error message.

If the argument is a positive number NUM, then the side-by-side output produced by -f will be NUM columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when -f has no argument, or the supplied argument is zero. In other words, ‘-f’ and ‘-f0’ are just easier to remind versions of ‘-f130’.

A negative argument has the same effect as the positive number with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command ‘numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2’ displays the following text

     -5       2.236068            <
     -3       1.732051            <
     -1       1.000000            <
     - - - - - - - - -            <
     1        1.000000            <
     3        1.732051            <
     - - - - - - - - -            <
     5        2.236068            <
     7        2.645751            <
     - - - - - - - - -            <
     9        3.000000            <
     11       3.316625            <
     - - - - - - - - -            <
     - - - - - - - - -            <
     13       3.605551            <
                                  >  ********************END
     
     
     +++  File "Table1" differs from file "Table2"

In conjunction with the option -f or -O you can use -T to expand tabs to spaces in the output produced by -f / -O. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter.

The options -H and -m affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others.

The way that the filter re-synchronizes two files to compare always comes up with a near-minimal set of deletions/insertions of lines. Usually it is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The -m option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior.

If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the -H option to make a different modification to the algorithm that the filter uses. If the input files have a constant small density of changes, where change means deletion/insertion of lines, this option speeds up the comparisons without changing the output or in the worst case introducing minor modifications.


Next: , Previous: Filtering, Up: Top

9 Warnings

  • Bug reports have to be sent to the address ivprimi(at)libero(dot)it . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions.
  • Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, ..., +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is
              numdiff: A number with a too small exponent has been found,
              namely "1.0001e-2147483640".
              Exponents smaller than -1073741824 are not accepted,
              the execution of the program ends now
    
  • If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude 10^6 = 1000000. This is what I obtained on my laptop, equipped with a dual core processor @1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000:
              numdiff: Insufficient memory for new allocation,
              the execution of the program ends now
    

    In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, ..., 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, ..., 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    Consider also that, if you have numeric data with exponents outside the range -300, ..., 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right.

  • If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user.
  • After reading a numeric field, Numdiff truncates its value if this number has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply.

    If numdiff has been built with its own internal support for multiple precision arithmetic, then

    • if the number is written in ordinary decimal notation, numdiff will consider, in addition to all digits of the integer part, only the first P digits of the fractional part;
    • if the value is written in scientific notation, then numdiff will only consider the first P digits of the fractional part of the mantissa.

    If numdiff uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered.

    By current value of the precision I mean the integer value specified by the option -#, or the default one (35) when this option is not in use.

  • You can find out whether your local version of numdiff is relying on GNU MP or not by executing the command ‘numdiff -v’. If numdiff uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information:
              The software has been linked against
              the GNU Multiple Precision Arithmetic Library,
              version number 4.2.4.
    

    If numdiff does not rely on GNU MP, then the displayed message will be (up to translation into your mother language)

              The software has been built with
              its own internal support for multiple precision arithmetic.
    
  • Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, numdiff checks for the presence of null bytes (0x00) in the file.
  • If you are not including the so called white-space characters (usually ‘ ’, ‘\t’, ‘\f’, ‘\v’ and ‘\r’) in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only colon (‘:’) and newline as field delimiters and Numdiff finds a line like that
         ::::3.0-5.6e-356i::::-12.9   +4.34i::::-12.9    4.34i::::New York::::
    

    then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers 3.0-5.6e-356i and -12.9+4.34i, the last two ones are the strings New York and -12.9 4.34i. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only 3.0-5.6e-356i as numeric field and treats -12.9 +4.34i as non-numeric due to the presence of spaces in the middle. -12.9 4.34i is already considered as non-numeric due to the absence of a leading sign in the imaginary value.

  • We have seen that one of the two files passed to numdiff can be -, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in ‘cat file2 | numdiff -a 1.0e-3 file1 -’. However, if you activate the filter by means of the options -z or/and -Z, Numdiff can not work with the standard input unless you use also the option -f. Therefore, the command ‘cat file2 | numdiff -a 1.0e-3 -z @ file1 -’ displays only the error message
         numdiff: -: Illegal seek
    
    (or maybe the translation of this message in the language you are using on your computer) but ‘cat file2 | numdiff -a 1.0e-3 -z @ -f file1 -’ works as expected.
  • This manual describes the version 5.8 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output.


Up: Top

Appendix A GNU Free Documentation License

Version 1.3, 3 November 2008
     Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     http://fsf.org/
     
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
  1. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

  2. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

    Examples of suitable formats for Transparent copies include plain ascii without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.

    The “publisher” means any person or entity that distributes copies of the Document to the public.

    A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

  3. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

  4. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

  5. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
    4. Preserve all the copyright notices of the Document.
    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
    8. Include an unaltered copy of this License.
    9. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
    13. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
    14. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

  6. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”

  7. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

  8. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

  9. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

  10. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    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, receipt of a copy of some or all of the same material does not give you any rights to use it.

  11. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See http://www.gnu.org/copyleft/.

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

  12. RELICENSING

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

       Copyright (C)  year  your name.
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.3
       or any later version published by the Free Software Foundation;
       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
       Texts.  A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with...Texts.” line with this:

         with the Invariant Sections being list their titles, with
         the Front-Cover Texts being list, and with the Back-Cover Texts
         being list.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.


Previous: Warnings, Up: Top

Index

./numdiff-5.8.1/docs/fdl.texi0000644000175000017500000005601512215353073014724 0ustar ivanoivano@c The GNU Free Documentation License. @center Version 1.3, 3 November 2008 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. @uref{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @enumerate 0 @item PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document @dfn{free} in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. @item APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain @sc{ascii} without markup, Texinfo input format, La@TeX{} input format, @acronym{SGML} or @acronym{XML} using a publicly available @acronym{DTD}, and standard-conforming simple @acronym{HTML}, PostScript or @acronym{PDF} designed for human modification. Examples of transparent image formats include @acronym{PNG}, @acronym{XCF} and @acronym{JPG}. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, @acronym{SGML} or @acronym{XML} for which the @acronym{DTD} and/or processing tools are not generally available, and the machine-generated @acronym{HTML}, PostScript or @acronym{PDF} produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The ``publisher'' means any person or entity that distributes copies of the Document to the public. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. @item VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. @item COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. @item MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: @enumerate A @item Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. @item List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. @item State on the Title page the name of the publisher of the Modified Version, as the publisher. @item Preserve all the copyright notices of the Document. @item Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. @item Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. @item Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. @item Include an unaltered copy of this License. @item Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @item Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. @item Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version. @item Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section. @item Preserve any Warranty Disclaimers. @end enumerate If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. @item COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.'' @item COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. @item AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. @item TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. @item TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. 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, receipt of a copy of some or all of the same material does not give you any rights to use it. @item FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See @uref{http://www.gnu.org/copyleft/}. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. @item RELICENSING ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the site means any set of copyrightable works thus published on the MMC site. ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. ``Incorporate'' means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is ``eligible for relicensing'' if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. @end enumerate @page @heading ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: @smallexample @group Copyright (C) @var{year} @var{your name}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end group @end smallexample If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with@dots{}Texts.'' line with this: @smallexample @group with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. @end group @end smallexample If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. @c Local Variables: @c ispell-local-pdict: "ispell-dict" @c End: ./numdiff-5.8.1/docs/ndselect.10000644000175000017500000000650612215353073015147 0ustar ivanoivano.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.43.3. .TH NDSELECT "1" "July 2013" "ndselect 5.8.1" "User Commands" .SH NAME ndselect \- select lines and fields for numdiff .SH DESCRIPTION Usage: ndselect \fB\-h\fR|\-\-help|\-v|\-\-version or .PP ndselect [\-b N][\-e N][\-s N][\-F N][\-L N][\-I N][\-S IFS][\-D DELIMS][\-O OSEP][\-x][\-l PATH][\-o PATH] [FILE] .PP Print to standard output a subset of lines and fields from a given file. .PP The argument after the options is the name of the file to read from. The complete path of the file should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. .PP Exit status: 0 in case of normal termination, \fB\-1\fR (255) in case of error .PP \fB\-b\fR, \fB\-\-beginning\fR, \fB\-\-start\fR=\fIN\fR .IP Set to N the number of the first line to print (The default behavior is to start with line number 1) .PP \fB\-e\fR, \fB\-\-end\fR=\fIN\fR .IP Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) .PP \fB\-s\fR, \fB\-\-step\fR=\fIN\fR .IP Set to N the increment to use when selecting the lines to print (The default value for the increment is 1) .PP \fB\-F\fR, \fB\-\-first\-field\fR=\fIN\fR .IP Set to N the number of the first field to print (The default behavior is to start with field number 1) .PP \fB\-L\fR, \fB\-\-last\-field\fR=\fIN\fR .IP Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) .PP \fB\-I\fR, \fB\-\-increment\fR=\fIN\fR .IP Set to N the increment to use when selecting the fields to print (The default value for the increment is 1) .PP \fB\-S\fR, \fB\-\-separators\fR=\fIIFS\fR .IP Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) .PP \fB\-D\fR, \fB\-\-delimiters\fR=\fIDELIMS\fR .IP Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) .PP \fB\-O\fR, \fB\-\-output\-separator\fR=\fIOSEP\fR .IP Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines) .PP \fB\-x\fR, \fB\-\-omit\-empty\-lines\fR .IP Do not print empty lines .PP \fB\-l\fR, \fB\-\-warnings\-to\fR=\fIPATH\fR .IP Redirect warning and error messages from stderr to the indicated file .PP \fB\-o\fR, \fB\-\-output\fR=\fIPATH\fR .IP Redirect output from stdout to the indicated file .PP \fB\-h\fR, \fB\-\-help\fR .IP Show this help message .PP \fB\-v\fR, \fB\-\-version\fR .IP Show version number, Copyright, Distribution Terms and NO\-Warranty .SH COPYRIGHT Copyright \(co 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi .br License GPLv3+: GNU GPL version 3 or later, see . .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B ndselect is maintained as a Texinfo manual. If the .B info and .B ndselect programs are properly installed at your site, the command .IP .B info numdiff .PP should give you access to the complete manual. ./numdiff-5.8.1/docs/numdiff.txt0000644000175000017500000056042312215353073015460 0ustar ivanoivanoTable of Contents ***************** Numdiff User Manual 1 Copying 2 Acknowledgments 3 Overview 3.1 Output format 3.2 Overview mode 3.3 Output of the filter 4 Installing 5 Invoking numdiff 6 Selecting lines and fields for the comparison 7 Invoking ndselect 8 Using the filter of numdiff 9 Warnings Appendix A GNU Free Documentation License Index Numdiff User Manual ******************* _"...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!"_ This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in *note GNU Free Documentation License::. 1 Copying ********* Numdiff (also written numdiff) 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. Numdiff 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 `http://www.gnu.org/licenses/'. 2 Acknowledgments ***************** I want to thank Mr. Norman Clerman for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff. Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option `-S'. 3 Overview ********** Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people. There are several ways to think about the differences between two files. One way to think of the differences is as a series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known `diff' program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, the `diff' program considers any change in the amount or in the type of the characters as a relevant difference. However, trough some command line options it also provides ways to suppress certain kinds of differences that are not important to the user. For instance, `diff' provides ways to ignore differences in the amount of white space between words or lines, or differences in alphabetic case. Another way to think of the differences is as a series of words that were deleted from, inserted in, or changed in one file to produce the other file. Here "word" refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word. The less known `wdiff' program by Franc,ois Pinard compares words in two files and reports the differences. At last, one can think of the differences between two files as a sequence of pairs of bytes that can be either identical or different. The `cmp' program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than `diff' or `wdiff' for comparing binary files. However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. Indeed, when you compare a couple of such files, what you want to obtain usually is a list of the numerical fields in the second file which *numerically* differ from the corresponding fields in the first file. But, as you probably knows, a number can be written using different notations and programs like `diff' or `wdiff' can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values. For instance, 11.23 and 11.2300000 are the same number but represented in different ways. While, if you are interested in the numerical values, it is obvious that the difference in the representation is not meaningful and then it should be ignored, however `diff' and `wdiff' consider the previous one as a relevant difference and there is no way for you to tell these programs to ignore it! Another example of this type is given by 98765.4321 and 9.87654321E04 where the difference is only due to the use of the scientific notation in place of the ordinary decimal notation. Moreover, depending on your country you could stick to different conventions in writing numbers. For instance, the amount "three hundred millions and fifty-two thousands of dollars and forty-six cents" is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but `diff' and `wdiff' would report a difference, which probably is not what you want in a similar case. At last, sometimes you could want to ignore even differences in numerical values as long as they do not overcome a certain threshold. In other words, you could desire to suppress all "small" numerical differences too. For instance, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 must be considered equal, while 33 and 33.00011 must be reported as different. However, `diff' and `wdiff' can not be used to ignore "small" numerical differences, since they do not even know what a numerical difference is. What I have been saying till now explains why I decided to implement a new program with the capability to "appropriately" compare files containing numerical fields. In writing this program I was inspired by `ndiff', a GPL'ed software by Nelson H. Baabe of the Salt Lake City University. The author of `ndiff' had the same good reasons as me to write `ndiff'. `ndiff' is actually a good tool and I used it for a while. But I did not completely like the way it works and so `numdiff' was born. Although `ndiff' inspired `numdiff', they are completely different from the viewpoint of the source code: `numdiff' has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than `ndiff' does. `numdiff' can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. `numdiff' takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What _corresponding_ here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then `numdiff' performs a numerical comparison between them, else it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option `-s' or `-D', `numdiff' takes as field delimiters the characters newline (`\n', ASCII code 0x0A), horizontal tabulation (`\t', ASCII code 0x09), and blank (` ', ASCII code 0x20). For example, if the file `list1' contains the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and file `list2' contains the data Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line then the output of the command `numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" At the same time `numdiff' will print the following error message on stderr: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" It is worth remarking that `numdiff' can recognize complex numbers, provided that they are written in the form a+bi or a-bi with no extra characters between the values a, b and the sign + or - (the symbol i, used to represent the imaginary unit, can be changed by a suitable command line option, *note Invoking numdiff::). If you do not know what complex numbers are, do not worry! In this case probably you will never manage files containing complex numbers and so you can happily continue to ignore them. :) We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then `numdiff' version 4.x does *not* show only the one line difference: once the files are out of synchronization `numdiff' 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option `-z @'. If `bill1' and `bill2' are given by Month Expenses ------------------------- Jan09 $ 233.56 Feb09 $ 850.77 Mar09 $ 12.55 Apr09 $ 524.00 May09 $ 78.25 Jun09 $ 230.00 Jul09 $ 443.10 Aug09 $ 67.65 Sep09 $ 10.00 Oct09 $ 201.45 Nov09 $ 110.00 Dec09 $ 200.27 ------------------------- Total $ 2961.60 and Month Expenses Jan09 $ 234.00 Mar09 $ 13.00 May09 $ 78.25 Jul09 $ 443.10 Sep09 $ 10.00 Nov09 $ 110.00 Jan10 $ 200.00 ------------------------- Total $ 1088.35 respectively, then the differences between the two files are: * the insertion of the separator ------------------------- in `bill1' before the list of the months, * the deletion in `bill2' of the lines related to the expenses for the months February, April, June, August, October, December, * small changes in `bill2' to the expenses of the months January 2009 and March, * the presence in `bill2' of an entry for January 2010 just before the separator -------------------------, * the addition of an empty line to `bill2' after the separator -------------------------, * and the different values for the total sum of the expenses. The output of the command `numdiff -z @ -V bill1 bill2' (I have added here the option `-V' to let Numdiff show which couples of lines it is comparing each time) is exactly then what you expect: ---------------- ##2 <== ------------------------- ==> ---------------- ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 ##3 #:3 <== 233.56 ##2 #:3 ==> 234.00 @ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3 ---------------- ##4 <== Feb09 $ 850.77 ==> ---------------- ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 ##5 #:3 <== 12.55 ##3 #:3 ==> 13.00 @ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2 ---------------- ##6 <== Apr09 $ 524.00 ==> ---------------- ##8 <== Jun09 $ 230.00 ==> ---------------- ##10 <== Aug09 $ 67.65 ==> ---------------- ##12 <== Oct09 $ 201.45 ==> ---------------- ##14 <== Dec09 $ 200.27 ##8 ==> Jan10 $ 200.00 ##14 #:1 <== Dec09 ##8 #:1 ==> Jan10 @ @@ ##14 #:3 <== 200.27 ##8 #:3 ==> 200.00 @ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3 ---------------- <== ##10 ==> ---------------- ##16 <== Total $ 2961.60 ##11 ==> Total $ 1088.35 ##16 #:3 <== 2961.60 ##11 #:3 ==> 1088.35 @ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0 +++ File "bill1" differs from file "bill2" Numdiff has reported correctly the following differences: * the second line of file `bill1', i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file `bill2'. * The lines related to the months January and March 2009 have been slightly modified in `bill2', namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file `bill1' and the second one in file `bill2'. This information is printed by Numdiff in the form ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 Analogously ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 says that the line for March is the fifth one in `bill1' and the third one in `bill2'. * The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file `bill1' and the 11th one in file `bill2'. * The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10 and 12 of `bill1', are not present in `bill2'. * The line of `bill1' with the expenses for December 2009 is replaced in `bill2' by the line containing the value of the expenses for January 2010. * The tenth line of `bill2', i.e. the empty line after the separator, is not present in `bill1'. With respect to `bill1' this line represents then an addition. If you compare `bill1' and `bill2' without using the option `-z @', the result is completely misleading. This is the output of `numdiff -V bill1 bill2': ---------------- ##2 <== ------------------------- ##2 ==> Jan09 $ 234.00 ##2 #:1 <== ------------------------- ##2 #:1 ==> Jan09 @ @@ ##2 <== ##2 #>2 ==> $ 234.00 @ Line 2 in file "bill1" is shorter than expected! ---------------- ##3 <== Jan09 $ 233.56 ##3 ==> Mar09 $ 13.00 ##3 #:1 <== Jan09 ##3 #:1 ==> Mar09 @ @@ ##3 #:3 <== 233.56 ##3 #:3 ==> 13.00 @ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1 ---------------- ##4 <== Feb09 $ 850.77 ##4 ==> May09 $ 78.25 ##4 #:1 <== Feb09 ##4 #:1 ==> May09 @ @@ ##4 #:3 <== 850.77 ##4 #:3 ==> 78.25 @ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0 ---------------- ##5 <== Mar09 $ 12.55 ##5 ==> Jul09 $ 443.10 ##5 #:1 <== Mar09 ##5 #:1 ==> Jul09 @ @@ ##5 #:3 <== 12.55 ##5 #:3 ==> 443.10 @ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1 ---------------- ##6 <== Apr09 $ 524.00 ##6 ==> Sep09 $ 10.00 ##6 #:1 <== Apr09 ##6 #:1 ==> Sep09 @ @@ ##6 #:3 <== 524.00 ##6 #:3 ==> 10.00 @ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1 ---------------- ##7 <== May09 $ 78.25 ##7 ==> Nov09 $ 110.00 ##7 #:1 <== May09 ##7 #:1 ==> Nov09 @ @@ ##7 #:3 <== 78.25 ##7 #:3 ==> 110.00 @ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1 ---------------- ##8 <== Jun09 $ 230.00 ##8 ==> Jan10 $ 200.00 ##8 #:1 <== Jun09 ##8 #:1 ==> Jan10 @ @@ ##8 #:3 <== 230.00 ##8 #:3 ==> 200.00 @ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1 ---------------- ##9 <== Jul09 $ 443.10 ##9 ==> ------------------------- ##9 #:1 <== Jul09 ##9 #:1 ==> ------------------------- @ @@ ##9 #>2 <== $ 443.10 ##9 ==> @ Line 9 in file "bill2" is shorter than expected! ---------------- ##10 <== Aug09 $ 67.65 ##10 ==> ##10 #>1 <== Aug09 $ 67.65 ##10 ==> @ Line 10 in file "bill2" is shorter than expected! ---------------- ##11 <== Sep09 $ 10.00 ##11 ==> Total $ 1088.35 ##11 #:1 <== Sep09 ##11 #:1 ==> Total @ @@ ##11 #:3 <== 10.00 ##11 #:3 ==> 1088.35 @ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2 ---------------- ##12 <== Oct09 $ 201.45 ==> *** End of file "bill2" reached while trying to read line 12. File "bill1" has more lines than file "bill2", line 12 is the last one read from file "bill1" +++ File "bill1" differs from file "bill2" Numdiff compares now the first, second, third line of `bill1' with the first, second, third line of `bill2' and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number. Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without doing any comparison between corresponding lines. The output of `numdiff -z @ -f bill1 bill2' is Month Expenses Month Expenses ------------------------- < Jan09 $ 233.56 Jan09 $ 234.00 Feb09 $ 850.77 < Mar09 $ 12.55 Mar09 $ 13.00 Apr09 $ 524.00 < May09 $ 78.25 May09 $ 78.25 Jun09 $ 230.00 < Jul09 $ 443.10 Jul09 $ 443.10 Aug09 $ 67.65 < Sep09 $ 10.00 Sep09 $ 10.00 Oct09 $ 201.45 < Nov09 $ 110.00 Nov09 $ 110.00 Dec09 $ 200.27 | Jan10 $ 200.00 ------------------------- ------------------------- > Total $ 2961.60 Total $ 1088.35 +++ File "bill1" differs from file "bill2" and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since to guess the right options can be sometime tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, *note Filtering::, I will explain in detail * what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare, * and how the related options affect the action of the filter. By the way, it is even possible to use `-f' without any other additional option for the filter, like in `numdiff -f bill1 bill2', but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters. The option `-f' can be followed by an argument in the form of an integer number whose meaning will be explained later, *note Use of the option -f::. Even if the output of `numdiff' is self-explanatory, in the next section I will explain in details all you have to know about it. 3.1 Output format ================= Let us go back to our first example. If the files `list1' and `list2' contain the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line respectively, then the output of the command `numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" `numdiff' prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file. First this report indicates the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is "1" for the first field of a line, "2" for the second field, "3" for the third one and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol "##", while the field number by "#:". Then `numdiff' shows in what the difference consists. For instance, ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ means that the first field of the first line is "accident" in the first file, while in the second file it appears as "Accident". This difference could be then canceled by removing "accident" from the first file and inserting "Accident" in place of it. The arrows "<==" and "==>" try to visualize this idea. Analogously, ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 means that the second field of the second line is "-3455.321" in the first file and "-3455.320098" in the second one. Since the contents of the field are numerical in both files, `numdiff' also prints the absolute and relative errors. The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files. The relative error (or relative difference) is actually defined in a more complicated way. If _n1_ is the value appearing in the first file and _n2_ is the value in the second file, then the absolute error is given by the formula _A=|n1-n2|_, while the relative error _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With these definitions of absolute and relative error it turns out that _A(n2, n1) = A(n1, n2)_ and _R(n2, n1) = R(n1, n2)_. In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option `-F', *note Alternative formulas for the computation of the relative difference::. If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator: @ @@ It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. When this is the case, `numdiff' reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! or in ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! In addition, `numdiff' shows the tail of the longer line, using the notation "#>n" to indicate the number n of the first field of the longer line for which there is no corresponding field in the shorter line. For example, ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file (`list2'). In this context, the symbol <<*>> (when it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating _newline_ character. It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, `numdiff' prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" Unless the option `-q' is used (*note Invoking numdiff::), `numdiff' prints on standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering: +++ File "list1" differs from file "list2" 3.2 Overview mode ================= Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option `-O'. If this option is present on the command line, `numdiff' prints a side-by-side report instead of the usual one. For example, if `sheet1' contains the text A 1 1 B 2 4 C 3 9 D 4 16 E 5 25 F 6 36 G 7 49 H 8 64 I 9 81 J 10 100 and `sheet2' the following lines A 1 1 B 2 4 C 3.3 9.03 D 4 16 E 5.5 25.05 F 6.6 36 G 7.7 49.49 H 8 64 I 9.9 81.09 then `numdiff -O sheet1 sheet2' prints this report A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!:C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!:E 5.5 25.05 F 6 36 :!:F 6.6 36 G 7 49 :!:G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!:I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" On the left side you can see the lines coming from the file specified as first on the command line, i.e. `sheet1', on the right side the lines from the second file of the command line, in this case `sheet2'. In the middle there is a gutter which contains one of these markers: `white spaces' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options `-s', `-D', `-I', `-X', `-a', `-r', `-P' and `-N'. `:!:' The corresponding lines have at least one field which differs. `:<:' The files differ and only the first file contains the line. `:>:' The files differ and only the second file contains the line. In the case of `sheet1' and `sheet2' a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated. The option `-O' can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff::. The default value for the width of the side-by-side report is 130. No wonder then that the command `numdiff -O40 sheet1 sheet2' displays a report with shorter lines: A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!: C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command `numdiff -O40 sheet1 sheet2': C 3 9 :!: C 3.3 9.03 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of `numdiff -O24 sheet1 sheet2': A 1 A 1 B 2 B 2 C 3 :!: C 3.3 D 4 D 4 E 5 :!: E 5.5 F 6 :!: F 6.6 G 7 :!: G 7.7 H 8 H 8 I 9 :!: I 9.9 J 10 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130. Notice that the numeric argument must immediately follow the option `-O', intermediate spaces are not allowed. This is also the case for the optional argument of `-f', while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument. The option `-O' can be used together with any other option of Numdiff except for `-f', `-q', `-U', `-E', `-V' and `-b'. When `-O' is in use, `-U', `-E', `-V' and `-b' are ignored. If `-q' is present on the command line together with `-O', then `-O' is ignored. Finally, if both `-f' and `-O' are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. Therefore, the command `numdiff -O40 -f sheet1 sheet2' displays the same report as `numdiff -O40 sheet1 sheet2', while the output of `numdiff -f -O40 sheet1 sheet2' is given by A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 | C 3.3 9.03 D 4 16 D 4 16 E 5 25 | E 5.5 25.05 F 6 36 | F 6.6 36 G 7 49 | G 7.7 49.49 H 8 64 H 8 64 I 9 81 | I 9.9 81.09 J 10 100 < +++ File "sheet1" differs from file "sheet2" and coincides then with the one of `numdiff -f sheet1 sheet2'. The option `-O' can be used together with the filter to cope with the addition/deletion of lines. If the file `sheet3' contains the text A 1 1 C 3.3 9.03 E 5.5 25.05 G 7.7 49.49 I 9.9 81.09 J 10 100.00 K 0 0.02 then `numdiff -O40 sheet1 sheet3' prints a wrong report, as in the example with files `bill1' and `bill2': A 1 1 A 1 1 B 2 4 :!: C 3.3 9.03 C 3 9 :!: E 5.5 25.05 D 4 16 :!: G 7.7 49.49 E 5 25 :!: I 9.9 81.09 F 6 36 :!: J 10 100.00 G 7 49 :!: K 0 0.02 H 8 64 :<: *** End of file "sheet3" reached while trying to read line 8. File "sheet1" has more lines than file "sheet3", line 8 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet3" On the other hand, the presence of `-z @' makes Numdiff always compare fields of corresponding lines, as shown by the output of the command `numdiff -O40 -z @ sheet1 sheet3': A 1 1 A 1 1 B 2 4 :<: C 3 9 :!: C 3.3 9.03 D 4 16 :<: E 5 25 :!: E 5.5 25.05 F 6 36 :<: G 7 49 :!: G 7.7 49.49 H 8 64 :<: I 9 81 :!: I 9.9 81.09 J 10 100 J 10 100.00 :>: K 0 0.02 +++ File "sheet1" differs from file "sheet3" Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters. 3.3 Output of the filter ======================== The output produced just by running the filter (option `-f') is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers: `white space' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options `-s', `-D', `-I', `-X', `-z' and `-Z'. `|' The corresponding lines differ, and they are either both complete or both incomplete. `<' `(' The files differ and only the first file contains the line. `>' `)' The files differ and only the second file contains the line. `\' The corresponding lines differ, and only the first line is incomplete. `/' The corresponding lines differ, and only the second line is incomplete. An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked `\' if the line from the first file is incomplete, `/' if the line from the second file is. Like `-O', the option `-f' can take an optional argument which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff:: and *note Use of the option -f::. More generally, the user can always make `numdiff' avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, *note Invoking numdiff::. 4 Installing ************ To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option `-o' to write its output to a specified file, the option `-D' for macros predefinition, the option `-l' to search for a specified library, and the options `-I' and `-L' to add a given directory to the search path for include and library files respectively. In addition, you need a POSIX implementation of the `make' utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands `rm' and `find'. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Numdiff has been successfully compiled and tested on: * Slackware(R) GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), * Slackware GNU/Linux 11 with GCC 3.4.6, * Slackware GNU/Linux 12.2 with GCC 4.2.4, * Slackware GNU/Linux 13 with GCC 4.3.3, * Debian(R) GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), * Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), * Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), * SunOS(R) 5.8 with GCC 2.95.3, and * SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. Configuration, building and installation of Numdiff can be performed through the standard three steps: ./configure make make install If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then, after `make', you will have to type and run make install-nls By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/info' etc. You can specify an installation prefix other than `/usr/local' using the option `--prefix' in the `configure' step, for instance `--prefix=$HOME': ./configure --prefix=$HOME For better control, you can use the options `--bindir', `--infodir', and so on. Type `./configure --help' to obtain the complete list of all the available options. Anyway, the documentation files, including a full User Manual available in several formats (HTML, PDF and plain ASCII text), will always be put in `DOCDIR/numdiff', where DOCDIR is the path specified by the option `--docdir' or, if this option has not been given to `configure', `PREFIX/local/doc'. Here PREFIX is the installation prefix specified by the option `--prefix' or the default `/usr/local'. Once Numdiff has been installed you can remove all the files previously installed by a simple `make uninstall'. If you have also installed the localization files trough `make install-nls', then, in order to remove also these ones, use `make uninstall-nls' in place of `make uninstall'. Between the options accepted by `configure' there are `--enable-debug', `--enable-optimization', `--enable-nls' and `--enable-gmp'. The option `--enable-debug' turns on debugging when compiling the source code. This is obtained by passing to the compiler the `-g' option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable `DBGFLAGS' before calling `configure'. The option `--enable-optimization' turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the `-O' option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable `OPTFLAGS' before calling `configure'. The option `--enable-nls' turns on Natural Language Support. But you do not need to use it explicitly, since Natural Language Support is enabled by default. However, you can disable it by using `--disable-nls'. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through ./configure --disable-nls make make install Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option `--enable-gmp=no' or `--disable-gmp' to the configure script before building the program, like in ./configure --disable-gmp make make install Enabling the old internal support for multiple precision arithmetic is deprecated, *note with GNU MP is better::. The latest version of GNU MP is available at `ftp://ftp.gnu.org/gnu/gmp/'. See the GNU MP web page at `http://gmplib.org/' for up-to-date information on GNU MP. 5 Invoking numdiff ****************** *SYNOPSIS* numdiff -h|--help|-v|--version or numdiff [-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]] [-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I] [-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2] [-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][-q][-S] [-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]] [-T][-B][-l PATH][-o PATH] FILE1 FILE2 where FILE1 and FILE2 are the names of the two files to compare and RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like `1-', `3-5' or `-7'. In the first case `numdiff' prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer and some information about the way it was built. In the second case `numdiff' compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be -, which refers to stdin. *OPTIONS* `-s, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If IFS is prefixed with `1:' or `2:' then use the given delimiter set only for the lines from the first or the second file respectively `-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If DELIMS is prefixed with `1:' or `2:' then use the given delimiter set only for the lines from the first or the second file respectively `-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum absolute difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 `-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum relative difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 `-2, --strict' Consider two numerical values as equal only if both absolute and relative difference do not exceed the corresponding tolerance threshold `-F, --formula=NUM' Use the formula indicated by NUM to compute the relative errors. If NUM is 0 use the classic formula. If NUM is 1 compute the relative errors by considering the values in FILE1 as sample values. If NUM is 2 compute the relative errors by considering the values in FILE2 as sample values. `-#, --digits=NUM' Set to NUM the number of digits in the significands used in multiple precision arithmetic `-P, --positive-differences' Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file `-N, --negative-differences' Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file `-I, --ignore-case' Ignore changes in case while doing literal comparisons `-c, --currency=CURRNAME' Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with `1:' or `2:' to specify the currency name only for the first or the second file `-d, --decimal-point=C1C2' Specify the characters representing the decimal point in the two files to compare `-t, --thousands-separator=C1C2' Specify the characters representing the thousands separator in the two files to compare `-g, --group-length=N1N2' Specify the number of digits forming each group of thousands in the two files to compare `-p, --plus-prefix=C1C2' Specify the (optional) prefixes for positive values used in the two files to compare `-n, --minus-prefix=C1C2' Specify the prefixes for negative values used in the two files to compare `-e, --exponent-letter=C1C2' Specify the exponent letters used in the two files to compare `-i, --imaginary-unit=C1C2' Specify the characters representing the imaginary unit in the two files to compare `-X, --exclude=1:RANGE' Select the fields of the first file that have to be ignored `-X, --exclude=2:RANGE' Select the fields of the second file that have to be ignored `-E, --essential' While printing the differences between the two compared files show only the numerical ones `-U, --dummy' While printing the differences between the two compared files neglect all the numerical ones (dummy mode) `-b, --brief' Suppress all messages concerning the differences discovered in the structures of the two files `-V, --verbose' For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files `-O, --overview[=NUM]' Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. `-q, --quiet, --silent' Suppress all the standard output `-S, --statistics' Add some statistics to the standard output `-z, --blur-if-numerical=1:RANGE' Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric `-z, --blur-if-numerical=2:RANGE' Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric `-Z, --blur-unconditionally=1:RANGE' Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure `-Z, --blur-unconditionally=2:RANGE' Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure `-m, --minimal' During synchronization try hard to find a smaller set of changes `-H, --speed-large-files' During synchronization assume large files and many scattered small changes `-f, --test-filter[=NUM]' Run only the filter and then show the results of its attempt to synchronize the two files. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. `-T, --expand-tabs' Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option `-O' or `-f') `-B, --binary' Treat both files as binary files (only meaningful under Doz/Windoz) `-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file `-o, --output=PATH' Redirect output from stdout to the indicated file `-h, --help' Show help message and predefined settings `-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty *DIAGNOSTICS* The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error. *DEFAULT NUMERIC FORMAT (for both files to compare):* Currency name = "" Decimal point = `.' Thousands separator = `,' Number of digits in each thousands group = 3 Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' *SOME EXPLANATIONS* The options `-U', `-E', `-b' and `-q' are used to hide part of the standard output of the program according to some rule. The option `-U' triggers the dummy mode. In this mode `numdiff' does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The dummy mode is so called since in this mode `numdiff' does not perform the job for which I created it. The option `-E' triggers the essential mode. In this mode `numdiff' only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when, comparing two lines, it turns out that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option `-X', then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line. The option `-b' triggers the brief mode. In this mode `numdiff' does not print the differences in the structure of the two files (see above for an explanation about what they are). The option `-q' triggers the quiet mode. In this mode `numdiff' does not print anything on the standard output. The quiet mode is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program. The option `-O' activates the overview mode, which makes `numdiff' print a side-by-side report in the form described in section *note Overview mode::. The optional numeric argument after `-O' must immediately follow, intermediate spaces are not allowed. The option `-O' can be used together with any other option of Numdiff except for `-f', `-q', `-U', `-E', `-V' and `-b'. When `-O' is in use, `-U', `-E', `-V' and `-b' are ignored. If `-q' is present on the command line together with `-O', then `-O' is ignored. Finally, if both `-f' and `-O' are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. The option `-V' triggers the verbose mode. In this mode `numdiff' produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files `data1' and `data2' contain the data 12 33 22 44.5 0.008 1.002 221.12 -34.56 water 2101.21 boats and 12 33 22.3 44.5 0.008 1.202 221.12 -34.56 2101.21 boats dogs respectively, then the command `numdiff -V data1 data2' will print the following output: ---------------- ##2 <== 22 44.5 ##2 ==> 22.3 44.5 ##2 #:1 <== 22 ##2 #:1 ==> 22.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2 ---------------- ##3 <== 0.008 1.002 ##3 ==> 0.008 1.202 ##3 #:2 <== 1.002 ##3 #:2 ==> 1.202 @ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1 ---------------- ##4 <== 221.12 -34.56 water ##4 ==> 221.12 -34.56 ##4 #>3 <== water ##4 ==> @ Line 4 in file "data2" is shorter than expected! ---------------- ##5 <== 2101.21 boats ##5 ==> 2101.21 boats dogs ##5 <== ##5 #>3 ==> dogs @ Line 5 in file "data1" is shorter than expected! +++ File "data1" differs from file "data2" You must care that the options `-b' and `-V' will be overridden if `-q' is also set. The amount of additional information printed by `-V' is trivially influenced by the options that alter the way `numdiff' performs the comparisons between fields (for instance `-a', `-r', `-2', `-N', `-P', `-U', `-E', `-I', `-X'). In the headers printed by `numdiff' when in "verbose mode" can also appear the symbol <<*>>. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating *newline* character. The option `-S' adds to the standard output of `numdiff' a statistical report with the following information: * the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options `-P' and `-N') and the number of those comparisons whose outcome is a relevant numerical difference. * the largest absolute error in the set of relevant numerical differences and the corresponding relative error, * the largest relative error in the set of relevant numerical differences together with the corresponding absolute error, * the sum and the arithmetic mean of all absolute errors, * the sum and the arithmetic mean of the relevant absolute errors, * the square root of the sum of the squares of all absolute errors, * the square root of the sum of the squares of the relevant absolute errors, * the quadratic mean of all absolute errors, and * the quadratic mean of the relevant absolute errors. By relevant numerical differences and relevant absolute errors I mean those ones appearing in the output of `numdiff' when the options `-U', `-f', `-O' and `-q' are not used. The information printed by `-S' is not removed when this option is used together with `-q'. The options `-a', `-r', `-2', `-P' and `-N' affect the way `numdiff' performs the comparisons between numerical values. Without any of these options, `numdiff' considers two numerical fields as equal when their difference is zero. The option `-a' can be used to order that two numerical fields must be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the `-a' option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values. Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, `numdiff' prints the difference in its report, unless some other option, for example `-P' or `-N', makes the difference unimportant. If nothing else follows the threshold value, what has been just explained applies to all comparisons between numerical fields. To see this in practice, if the file `many_columns1' contains the text A 1 1.2 1 0.1 11.0 1.0e-1 B 2 2.4 4 0.4 24.0 1.0e-2 C 3 3.6 9 0.9 39.0 1.0e-3 D 4 4.8 16 1.6 416.0 1.0e-4 and the contents of the file `many_columns2' are given by A 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D 4.4 4.32 16.16 1.6 416.039 -1.0e-4 then the output of the command `numdiff -a 0.5 many_columns1 many_columns2' is +++ Files "many_columns1" and "many_columns2" are equal The highest absolute difference between a field from `many_columns1' and the corresponding field from `many_columns2' is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5. On the other hand, the command `numdiff -a 0.35 many_columns1 many_columns2' prints the report ---------------- ##3 #:3 <== 3.6 ##3 #:3 ==> 3.24 Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:3 <== 4.8 ##4 #:3 ==> 4.32 Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1 +++ File "many_columns1" differs from file "many_columns2" since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4 and |4.32 - 4.8| = 0.48 exceed the value 0.35, and the other differences are below this threshold. If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of `-a'. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (`:'). If you specify only one range of numbers after the threshold value, `numdiff' uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, `-a 0.01:2-5' sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. If the files `many_columns1' and `many_columns2' are the same as before, then the command `numdiff -a 0.5:3-6 many_columns1 many_columns2' displays the following report ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option `-a' more times. The command `numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2' sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report: ---------------- ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "many_columns1" differs from file "many_columns2" Observe that :2 and :7 are abbreviations of :2-2 and :7-7, respectively. It is even possible to use range expressions like `M-' or `-N'. The first expression corresponds to all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one, both inclusive. If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), `numdiff' uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, `-a 1e-4:3-5:4-6' sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option `-X', which makes `numdiff' ignore one or more fields from one of the compared files. The file `many_columns3': A I 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B II 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C III 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D IV 4.4 4.32 16.16 1.6 416.039 -1.0e-4 has one column more than the file `many_columns1', namely the second one. When comparing `many_columns1' with `many_columns3' it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option `-X' (for a full description of the use of this option, *note Restriction of the comparison to particular fields::). Ignoring the second field of each line of `many_columns3' implies that the fields in the third column of this file are compared with the corresponding fields of the second column of `many_columns1', the fields in the fourth column of `many_columns3' are compared with the ones in the third column of `many_columns1', and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that `-X 2:2' makes `numdiff' compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of `many_columns1' with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of `many_columns3'. Therefore, the command `numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from `many_columns1' with the fourth, fifth, and sixth field respectively of the corresponding line of `many_columns3'. This explains why the report of `numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:6 <== 11.0 ##1 #:7 ==> 11.011 Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:6 <== 24.0 ##2 #:7 ==> 24.024 Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:6 <== 39.0 ##3 #:7 ==> 39.039 Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:6 <== 416.0 ##4 #:7 ==> 416.039 Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" does not show the same difference listing of the command `numdiff -a 0.5:3-6 many_columns1 many_columns2'. If what you want is to obtain the same difference listing of `numdiff -a 0.5:3-6 many_columns1 many_columns2', then the right command is `numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3'. The report printed by this last command is indeed ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" and up to the positions of the fields from `many_columns3' coincides with the one of `numdiff -a 0.5:3-6 many_columns1 many_columns2'. The option `-a' can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command `numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2' ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:4 <== 9 ##3 #:4 ==> 9.09 Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:4 <== 16 ##4 #:4 ==> 16.16 Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position. Finally, if `-a' is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example `-P' or `-N', makes `numdiff' ignore it. The option `-r' can be used to order that two numerical fields must be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the `-r' option. As for the option `-a', the argument of `-r' can have several forms. These forms are the same accepted by `-a' and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one. The relative difference is normally defined in this way. If _n1_ is a value from the file specified as first on the command line and _n2_ is the corresponding value from the second file, then the absolute difference is given by the formula _A=|n1-n2|_. The relative difference _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With this definition of relative difference it turns out that _R(n2, n1) = R(n1, n2)_: the relative difference does not change if you only change the ordering of the compared files on the command line. However there are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option `-F' together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with `-F 1' the relative difference _R_ is computed according to these rules: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n1_ is zero, * _R = |n1-n2|/ |n1|_ if _n1_ is not zero and _n2_ differs from _n1_. With `-F 2' the rules become: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n2_ is zero, * _R = |n1-n2|/ |n2|_ if _n2_ is not zero and _n2_ differs from _n1_. With the last two sets of rules it is not anymore true that _R(n2, n1) = R(n1, n2)_: the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that FILE1 and FILE2 contain 1 9.9 0.5 440 and 1.2 8 0.51 400 respectively. Then `numdiff FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" `numdiff -F 1 FILE1 FILE2' prints ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2 +++ File "file1" differs from file "file2" the output of `numdiff -F 2 FILE1 FILE2' is ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" `numdiff -F 1 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 +++ File "file1" differs from file "file2" and, finally, `numdiff -F 2 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 +++ File "file1" differs from file "file2" The option `-2' is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option `numdiff' considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option `-2' `numdiff' regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if FILE1 contains the unique line 100 and FILE2 the line 100.00012 then the output of the command `numdiff FILE1 FILE2' will be ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" The output of the commands `numdiff -a 1.0e-4 FILE1 FILE2' and `numdiff -r 1.0e-6 FILE1 FILE2' will be the same as above, but `numdiff -a 1.0e-4 -r 1.3e-6 FILE1 FILE2' and `numdiff -a 1.3e-4 -r 1.0e-6 FILE1 FILE2' will print the message +++ Files "FILE1" and "FILE2" are equal since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold. On the other hand, the commands `numdiff -a 1.0e-4 -r 1.3e-6 -2 FILE1 FILE2' and `numdiff -a 1.3e-4 -r 1.0e-6 -2 FILE1 FILE2' will print the message ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" since the option `-2' makes `numdiff' regard two values as equal only if both absolute and relative difference do not exceed the corresponding threshold of tolerance. The option `-P' makes `numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than the real part and, respectively, the imaginary part of the first value. Finally, the option `-N' makes `numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than the real part and, respectively, the imaginary part of the first value. The options `-B', `-I', `-l', `-o', `-h' and `-v' do not require further explanations. The options `-l' and `-o' are only supplied for the users of some poorly designed operating systems (like MSDog or MSWindoze), whose default shell does not allow the redirection of standard error and standard output. The option `-I' has no effect on the outcome of numerical comparisons but affects the action of the filter, *note Filtering::. The option `-s' requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples: numdiff -s ' \t\n,;:.' FILE1 FILE2 numdiff -s ' \t\n\r\f\v"\:;' FILE1 FILE2 numdiff -s `` \t\n''' FILE1 FILE2 If you want to include in the set of delimiters also some special characters, e.g the *blank*, then you must quote it. I recommend you to always use the single quote character (') to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell. `numdiff' recognizes and interprets the following sequences of characters within the argument passed to the option `-s': * `\a' alert (bell), * `\b' backspace, * `\f' form feed, * `\n' newline, * `\r' carriage return, * `\s' blank, * `\t' horizontal tab, * `\v' vertical tab, * `\\' backslash, * `\NNN' the eight-bit character whose value is the octal value NNN (one to three digits), * `\xHH' the eight-bit character whose value is the hexadecimal value HH (one or two digits). By passing the string ` \t\n,;:.' as argument for the option `-s', one tells `numdiff' to use as field delimiters the characters *blank*, *horizontal tab*, *newline*, *comma*, *semicolon*, *colon* and *dot*. Passing ` \t\n' as argument to the option `-s' is the same as not using at all the option `-s', since *blank*, *horizontal tab* and *newline* are the default field delimiters. In the list of field delimiters the character *backslash* (`\') is always treated in a special way. If it forms, combined with the subsequent character(s), one of the backslash escape sequences listed above, then it is considered to be an escape character and the whole escape sequence is decoded as shown above. Otherwise, the *backslash* is just ignored. Therefore, the delimiters specified by the command line numdiff -s' \t\n\\\"' FILE1 FILE2 are *blank*, *horizontal tab*, *newline*, *backslash* and *double quote*, since `\\' and `\"' are interpreted by `numdiff' as `\' and `"'. Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be constrained to use the double quote character (`"') to enclose the set of field delimiters, e.g. if the single quote character is used as field delimiter, like in one of the precedent examples. However you must take into account that in this case the shell could make some substitutions on the command line before executing `numdiff'. For instance, if your shell is GNU bash, then (citing the man page of GNU bash) Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of `$', ``', and `\'. The characters `$' and ``' retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: `$', ``', `"', `\', or **. A double quote may be quoted within double quotes by preceding it with a backslash ... The special parameters * and @ have special meaning when in double quotes ... Therefore, if the set of delimiters is formed by ` ', `\t', `\n', `\' and `"', and you decide to enclose them in double quotes, the `numdiff' command line should be numdiff -s'' \t\n\\\\\"'' FILE1 FILE2 and not numdiff -s'' \t\n\\\"'' FILE1 FILE2 In this last case the shell would indeed replace the string ` \t\n\\\"' by ` \t\n\"' and then `numdiff' would take ` ', `\t', `\n' and `"' as field delimiters. `numdiff' requires the presence of the *newline* in the set of characters passed to `-s'. The absence of the *newline* in the set of delimiters causes the issue of a suitable warning message and the termination of the program. If you run Numdiff with the option `-B' (`--binary') on files created under MSDog/MSWindoze, then you should put the *carriage return* in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by `numdiff', since `numdiff' would consider the final *carriage return* as part of the field and this one would be then qualified as non-numerical. You can specify different delimiters for the two files to compare by putting the prefix `1:' or `2:' in front of the set of characters passed to `-s'. If the argument of `-s' begins with `1:', the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is `2:', then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case `numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. Therefore, with `numdiff -s '1:: \n' FILE1 FILE2' the program will take *colon*, *blank* and *newline* as delimiters for FILE1, and *blank*, *tab* and *newline* as delimiters for FILE2. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Starting from version 5.8 `numdiff' allows to specify whole strings as field delimiters instead of single characters. To this purpose the option `-D' is provided. Assume that file `register1' and file `register2' contain --A: +1.0--- --B: -2.0--- --C: +3.0--- --D: -4.0--- --E: +5.0--- --F: -6.0--- and --a: +1.1--- --b: -2.2--- --c: +3.3--- --d: -4.4--- --e: +5.5--- --f: -6.6--- respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character - (minus) as delimiter via the option `-s': if you do it, then the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option `-D' you can tell `numdiff' to consider the strings -- and --- as field delimiters but not the single character -. To see this in practice, look at the output of the command `numdiff -D ': -- --- \s \n' register1 register2': ---------------- ##1 #:1 <== A ##1 #:1 ==> a @ ##1 #:2 <== +1.0 ##1 #:2 ==> +1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##2 #:1 <== B ##2 #:1 ==> b @ ##2 #:2 <== -2.0 ##2 #:2 ==> -2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##3 #:1 <== C ##3 #:1 ==> c @ ##3 #:2 <== +3.0 ##3 #:2 ==> +3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:1 <== D ##4 #:1 ==> d @ ##4 #:2 <== -4.0 ##4 #:2 ==> -4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##5 #:1 <== E ##5 #:1 ==> e @ ##5 #:2 <== +5.0 ##5 #:2 ==> +5.5 Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##6 #:1 <== F ##6 #:1 ==> f @ ##6 #:2 <== -6.0 ##6 #:2 ==> -6.6 Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "register1" differs from file "register2" The argument `-D ': -- --- \s \n'' instructs `numdiff' to regard every occurrence of a colon (:), of a blank (\s), of a newline (\n), as well as every occurrence of the strings -- and --- as field delimiters. The minus sign in front of the negative numbers is then handled as it should be. In general the argument to the option `-D' is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option `-D' is STRING1 STRING2 ... STRINGN where STRING1, STRING2, and so on are sequences of one or more characters (strings) containing no blank. Mind that at least one of these strings must be `\n'. In addition, if a string contains the newline character, this must be the only one: strings like `#\n', `%%\n', or `\s\n' are not allowed (entering such a string makes the program terminate after issuing a suitable warning message). Since the blank character has a special meaning for the shell, if the argument of `-D' is formed by two or more strings it should be quoted either with a single (`'') or with a double quote (`"'). Quoting is also adviced if one of the strings passed to `-D' contains a character (or a sequence of characters) having a special meaning for the shell. For the usage of single and double quoting to delimit the argument of `-D' the same warnings and recommendations apply as for the argument of `-s'. If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence `\s', like in the example above: within the argument of `-D' the blank character is always interpreted as a separator of adjacent delimiters. More generally, when writing the argument of `-D' the same escape sequences are allowed as for the argument of `-s'. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between `ledger1': In Out Jan 1200.00Euro 1000.00Euro Feb 800.40Euro 650.00Euro Mar 1620.50Euro 1500.00Euro Apr 760.00Euro 900.00Euro Total 4380.90Euro 4050.00Euro Difference: +330.90Euro and `ledger2': In Out Jan 1100.00Euro 1000.00Euro Feb 800.40Euro 750.00Euro Mar 1620.50Euro 1700.00Euro Apr 750.00Euro 900.00Euro Total 4270.90Euro 4350.00Euro Difference: -79.10Euro Since the Euro symbol is attached to all values, `numdiff' cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command `numdiff ledger1 ledger2' shows: ---------------- ##3 #:2 <== 1200.00Euro ##3 #:2 ==> 1100.00Euro @ ---------------- ##4 #:3 <== 650.00Euro ##4 #:3 ==> 750.00Euro @ ---------------- ##5 #:3 <== 1500.00Euro ##5 #:3 ==> 1700.00Euro @ ---------------- ##6 #:2 <== 760.00Euro ##6 #:2 ==> 750.00Euro @ ---------------- ##8 #:2 <== 4380.90Euro ##8 #:2 ==> 4270.90Euro @ ##8 #:3 <== 4050.00Euro ##8 #:3 ==> 4350.00Euro @ ---------------- ##10 #:2 <== +330.90Euro ##10 #:2 ==> -79.10Euro @ +++ File "ledger1" differs from file "ledger2" The trick to perform the comparison in the proper way consists in specifying the Euro symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If `ledger1' and `ledger2' are encoded in UTF-8, this can be done by using the option `-D' with the argument `\xE2\x82\xAC \s \t \n', since the hexadecimal representation of Euro in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command `numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2' shows that in this case `numdiff' performs indeed a numerical comparison of the values contained in the two files: ---------------- ##3 #:2 <== 1200.00 ##3 #:2 ==> 1100.00 Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2 ---------------- ##4 #:3 <== 650.00 ##4 #:3 ==> 750.00 Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1 ---------------- ##5 #:3 <== 1500.00 ##5 #:3 ==> 1700.00 Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1 ---------------- ##6 #:2 <== 760.00 ##6 #:2 ==> 750.00 Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2 ---------------- ##8 #:2 <== 4380.90 ##8 #:2 ==> 4270.90 Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2 ##8 #:3 <== 4050.00 ##8 #:3 ==> 4350.00 Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2 ---------------- ##10 #:2 <== +330.90 ##10 #:2 ==> -79.10 Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0 +++ File "ledger1" differs from file "ledger2" If `ledger1' and `ledger2' had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to Euro in this other encoding should have been passed to `-D'. As for `-s', with `-D' you can specify different delimiters for the two files to compare by means of the prefixes `1:' and `2:', like in `numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file'. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, `numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. If you run Numdiff with the option `-B' (`--binary') on files created under MSDog/MSWindoze, you should always include the character `\r' in the set of field delimiters. The option `-s' and `-D' can appear more than once on the command line. In case of conflicts, `numdiff' assumes as set of delimiters for a given file the one specified last on the command line. By means of the option `-#' the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If `numdiff' has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. Take into account that an higher precision makes the execution of `numdiff' slower. This is particularly true if `numdiff' is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, you have to care that `numdiff' truncates the value of a numerical field if it has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. * If `numdiff' has been built with its own internal support for multiple precision arithmetic, then * if a number is written in ordinary decimal notation, `numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if a value is written in scientific notation, then `numdiff' will only consider the first P digits of the fractional part of the mantissa. * If `numdiff' uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. You can find out whether your local version of `numdiff' is relying on GNU MP or not by executing the command `numdiff -v'. If `numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If `numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. By means of the option `-c' the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored by `numdiff' whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of `-c' with `1:' or `2:' it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files `money1': Profits Expenses +$430.10 -$300.50 +$750.20 -$550.02 +$876.24 -$720.00 Totals $2056.54 -$1570.52 and `money2': Profits Expenses USD430.10 -USD300.50 USD750.20 -USD550.02 USD876.24 -USD720.15 Totals 2056.54 -1570.67 To properly compare them we have to tell `numdiff' that `$' and `USD' are the currency symbols for `money1' and `money2' respectively. This can be achieved by `-c 1:$' and `-c 2:USD'. The output of the command `numdiff -c 1:$ -c 2:USD money1 money2' is ---------------- ##5 #:2 <== -$720.00 ##5 #:2 ==> -USD720.15 Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4 ---------------- ##7 #:3 <== -$1570.52 ##7 #:3 ==> -1570.67 Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5 +++ File "money1" differs from file "money2" as it should be. The argument of `-c' may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write `-c Euro ' to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options `-s' and `-D'. For example, if the files to compare are encoded in UTF-8, you can set Euro as currency name by adding `-c '\xE2\x82\xAC'' to the command line of `numdiff', since the hexadecimal representation of Euro in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC. Mind that in this case the argument of `-c' has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell. To see this in practice, if `euro1' contains the text Profits Expenses +Euro 430.10 -Euro 300.50 +Euro 750.20 -Euro 550.02 +Euro 876.24 -Euro 720.00 and `euro2' the text Profits Expenses +Euro 430.10 -Euro 300.00 +Euro 750.20 -Euro 550.02 +Euro 876.00 -Euro 720.00 then the report of `numdiff -c '\xE2\x82\xAC' euro1 euro2' is ---------------- ##3 #:2 <== -Euro 300.50 ##3 #:2 ==> -Euro 300.00 Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3 ---------------- ##5 #:1 <== +Euro 876.24 ##5 #:1 ==> +Euro 876.00 Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4 +++ File "euro1" differs from file "euro2" Please consider that `-c' is only provided to let `numdiff' regard a field as numeric also in presence of a currency name immediately before its first digit: `numdiff' does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. `numdiff' can even cope with the currency name when it appears in a complex number. For example, with `-c EUR' `numdiff' considers +EUR12-EUR0.24i and +12-0.24i as equal. The options `-d', `-t', `-g', `-p', `-n', `-e' and `-i' can be used to instruct `numdiff' about the numeric formats used in the files which it is going to compare. The two files to compare do not have to adopt the same numeric format and then `numdiff' allows to specify different numeric formats for them. Each of the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i' can have as argument one or two (single-byte) characters, in particular one or two digits if the option is `-g'. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option `-d' can be used to tell `numdiff' which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command `numdiff -d_ FILE1 FILE2', then `numdiff' will understand that both in FILE1 and in FILE2 the character *underscore* (`_') is used in place of the default one (`.') to indicate the position of the decimal point in the numerical values. But if the command is `numdiff -d_: FILE1 FILE2', then `numdiff' will understand that the decimal point is indicated by the character *underscore* in FILE1, and by *colon* (`:') in FILE2. If you omit to use one of the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i', then the corresponding attribute will take its default value, *note Default Numeric Format::. You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option `-g' must be digits, the arguments of the options `-d' and `-t' must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function `ispunct' returns a non zero value), those ones of the options `-p', `-n', `-e' and `-i' must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function `isgraph' returns a non zero value). It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command `numdiff -d,. FILE1 FILE2' will make `numdiff' abnormally terminate after printing the error message: The numeric format specified for the first file is illegal, the following symbols should be all different while two or more of them are actually equal: Decimal point = `,' Thousands separator = `,' Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' With the option `-d' we have told `numdiff' that in the first file the decimal point is indicated by the character *comma*, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. *comma*, for both files to compare. In this way we have implicitly told that in FILE1 the character *comma* represents both decimal point and thousands separator. Since this is not reasonable, `numdiff' refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option `-t': `numdiff -d,. -t., FILE1 FILE2'. Of course, we assume here that the decimal point and the thousands separator are represented in FILE1 by *comma* and *dot* respectively, in FILE2 by *dot* and *comma*. I strongly suggest you, whenever you write a file, to avoid using the same symbol to mean two different things (like would be using *comma* for both decimal point and thousands separator), it is nonsense. At last, it is possible (but stupid) to use as argument for the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i' one of the characters used as delimiters in the files to compare. In such a case `numdiff' does not complain, but you have to consider that it first uses the set of field delimiters to split the files into fields and then, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. However, it should never happen to specify as argument for one of the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i' a character which is also used as field delimiter: in writing a file you should avoid (and people usually avoid it) to use the same symbol to mean two different things. What we have said also explains why the argument of the option `-c' should never contain one or more field delimiters. The option `-X' can be used to restrict the comparison between files to a certain group of fields. This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument specifies the position(s) of the fields that `numdiff' has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand. The argument passed to `-X' can start with a prefix, which must be either `1:' or `2:'. `1:' refers to the file passed as first on the command line, `2:' to the file specified as second. With the prefix `1:' only the fields of the first file corresponding to the given position(s) are ignored. Similarly, if you want to ignore only fields from the second file you have to use the prefix `2:'. The option `-X' can appear more times on the command line, in which case `numdiff' will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file `List1' contains the data * a 1 1 1 1 * b 2 2 2 2 * c 3 3 3 3 * d 4 4 4 4 * e 5 5 5 5 and `List2' the data 1 1.1 1.01 A 1.001 1.0001 2 2.2 2.02 B 2.002 2.0002 3 3.3 3.03 C 3.003 3.0003 4 4.4 4.04 D 4.004 4.0004 5 5.5 5.05 E 5.005 5.0005 then the output of `numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is ---------------- ##1 #:4 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:5 <== 1 ##1 #:3 ==> 1.01 @ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##2 #:4 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:5 <== 2 ##2 #:3 ==> 2.02 @ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##3 #:4 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:5 <== 3 ##3 #:3 ==> 3.03 @ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##4 #:4 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:5 <== 4 ##4 #:3 ==> 4.04 @ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##5 #:4 <== 5 ##5 #:2 ==> 5.5 @ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ##5 #:5 <== 5 ##5 #:3 ==> 5.05 @ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2 +++ File "List1" differs from file "List2" Numdiff cuts off from `List1' the fields in the positions 1, 2 and 6 and from `List2' the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of `List1' with the first, second and third field respectively of the corresponding line of `List2'. An equivalent form of the command `numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is given by `numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2' : since the sixth field is cut off from both files we can refer to it without a prefix. As you can see, you can specify a range of fields by using the notation `M-N', where M and N are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like `M-' or `-N'. The first expression corresponds to all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one (inclusive). Therefore the command `numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is equivalent to `numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2' or to `numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2'. Mind that the largest field number you can use while writing a specification for the option `-X' is 32768. If you use the option `-X' the exit status of `numdiff' reflects the outcome of the restricted comparison. For instance, the exit status of `numdiff -X 8- FILE1 FILE2' is 1 only if `numdiff' has found a difference in the first seven fields of FILE1 and FILE2. If the two files differ only in the fields after the seventh one, then `numdiff' ends with a zero exit status. Going back to the example with `List1' and `List2', the output of `numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2' is +++ Files "List1" and "List2" are equal since every field of `List1' at position 3 is equal to the first field in the corresponding line of `List2'. The exit code returned by the program to the shell is zero. The options `-z', `-Z', `-m', `-H', `-f', and `-T' influence the action of the filter and their use is then described later, *note Filtering::. Care that `-z' and `-Z' need both an argument in the same form required by `-X'. Since version 5 Numdiff accepts also long options to conform to the GNU standards. Now it is then possible, e.g., to use `--separators='\n\t %'' or `--separators '\n\t %'' instead of using `-s '\n\t %''. The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option. The argument of a long option may or may not preceded by the = sign. The only exceptions are the options `--test-filter' and `--overview', for which the presence of the = before the argument is mandatory. Then `--test-filter=60' is correct while `--test-filter 60' is not accepted. 6 Selecting lines and fields for the comparison *********************************************** Together with the version 5.x of Numdiff is shipped the program `ndselect'. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file `list1' contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24: 12 3.46410161513775458705 13 3.60555127546398929312 14 3.74165738677394138558 15 3.87298334620741688518 16 4 17 4.12310562561766054982 18 4.24264068711928514641 19 4.35889894354067355224 20 4.47213595499957939282 21 4.58257569495584000659 22 4.69041575982342955457 23 4.7958315233127195416 24 4.89897948556635619639 and LIST2 contains _suitable_ approximations of the square root only for the numbers between 12 and 21 which are multiple of 3: 12 3.46410162002945508100 15 3.87298387096774193548 18 4.24264705882352941176 21 4.58260869565217391304 These approximations could have been obtained by using the famous Heron's algorithm, which, given an approximation `a' for the square root of a number `x', computes a better approximation by the formula `a := 0.5 * (x/a + a)'. What we want now is to understand by using `numdiff' how good the approximations contained in file LIST2 are. Unfortunately, we cannot execute directly the command `numdiff list1 list2', since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15 respectively. To make the comparison in the right way, one could open `list1' in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file. An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities `head' and `sed', in this particular case `head -n 10 list1 | sed -n -e '1~3 p' > List1'. A quick explanation for the ones who do not know how to use `head' and `sed': the previous command extracts from `list1' the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed on the file `List1', which then looks like: 12 3.46410161513775458705 15 3.87298334620741688518 18 4.24264068711928514641 21 4.58257569495584000659 Once obtained `List1', we can perform the comparison between the values we are interested in by means of `numdiff List1 list2' . Unfortunately, this trick only works if you have installed the GNU version of `sed', which, as far as I know, is the only one to provide the extension FIRST~STEP to specify line addresses. That is way I decided to implement `ndselect', which allows to obtain the same result as above with the simpler command `ndselect -b 1 -e 10 -s 3 list1 > List1' The meaning of the arguments passed to the options `-b', `-e', and `-s' is the following: we tell `ndselect' to print every third line of file `list1' (the option `-s' specifies the step) starting from the first one (the option `-b' specifies the beginning) and ending within the tenth one possibly inclusive (the option `-e' specifies the end). Because of the presence of the redirection operator `>', the previous command sends to the file `List1' what `ndselect' would print on the screen (standard output). Since version 5.6 `ndselect' can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option `-F' to indicate the position of the first field to print, the option `-L' to indicate the position of the last field that can be printed, the option `-I' to set the increment when selecting the fields. In addition, the option `-S' can be used to specify a set of field delimiters different from the default one (which consists of *blank*, *tab* and *newline*). As for `numdiff', the field delimiters are used to split the input lines into fields. The option `-S' of `ndselect' recognizes and accepts the same escape sequences of `numdiff' options `-s', `-D', and `-c'. As example consider the selection of the even fields between the second and the sixth one inclusive from the file `many_many_columns', whose contents are shown here: A | I | 1.1 | 1.08 | 1.01 | 0.1 | 11.011 | -1.0e-1 B | II | 2.2 | 2.16 | 4.04 | 0.4 | 24.024 | -1.0e-2 C | III | 3.3 | 3.24 | 9.09 | 0.9 | 39.039 | -1.0e-3 D | IV | 4.4 | 4.32 | 16.16 | 1.6 | 416.039 | -1.0e-4 E | V | 5.5 | 5.40 | 25.25 | 2.5 | 525.416 | -1.0e-5 F | # | # | # | # | # | # | # This selection can be accomplished by means of the command `ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns', whose output shows only the selected fields: I | 1.08 | 0.1 II | 2.16 | 0.4 III | 3.24 | 0.9 IV | 4.32 | 1.6 V | 5.40 | 2.5 # | # | # Of course, you can also select particular fields of particular lines, as shown by the output of the command `ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns': I | 1.08 | 0.1 IV | 4.32 | 1.6 By default, `ndselect' reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option `-O'. This one recognizes and accepts the same escape sequences of `numdiff' options `-s', `-D', and `-c'. For example, `ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns' puts two horizontal tabulations after every printed field: I 1.08 0.1 IV 4.32 1.6 Even if the implementation of a filter in `numdiff' and the addition of the option `-X' have made `ndselect' much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than `numdiff'. The complete synopsis of `ndselect' can be found in the next chapter. 7 Invoking ndselect ******************* *SYNOPSIS* ndselect -h|--help|-v|--version or ndselect [-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS] [-O OSEP][-x][-l PATH][-o PATH][FILE] where FILE is the name of the file to read from. In the first case `ndselect' prints a short help or/and version number, Copyright, License notice and NO-Warranty disclaimer. In the second case `ndselect' prints on the standard output a subset of lines and fields from FILE. The complete path of FILE should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. *OPTIONS* `-b, --beginning, --start=N' Set to N the number of the first line to print (The default behavior is to start with line number 1) `-e, --end=N' Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) `-s, --step=N' Set to N the increment to use when selecting the lines to print (The default value for the increment is 1) `-F, --first-field=N' Set to N the number of the first field to print (The default behavior is to start with field number 1) `-L, --last-field=N' Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) `-I, --increment=N' Set to N the increment to use when selecting the fields to print (The default value for the increment is 1) `-S, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline) `-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) `-O, --output-separator=OSEP' Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines) `-x, --omit-empty-lines' Do not print empty lines `-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file `-o, --output=PATH' Redirect output from stdout to the indicated file `-h, --help' Show this help message `-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty Passing 0 as argument to the option `-L' or to `-e' is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively). *DIAGNOSTICS* The exit status is 0 in case of normal termination, -1 (255) in case of error. As `numdiff' does, since version 5 also `ndselect' accepts long options. Thus, instead of `ndselect -b 1 -e 10 -s 3 list1 > List1' you can write `ndselect --start=1 --end=10 --step=3 list1 > List1'. The usage of the option `-D' is the same as for `numdiff'. The option `-S' corresponds to the option `-s' of `numdiff'. 8 Using the filter of numdiff ***************************** Since version 5 it is possible to activate a filter when calling `numdiff', so that the program performs automatically the comparison in the desired way. Recalling the example of chapter 6, if you run the command `numdiff -z 2- -V list1 list2' you obtain the following result: ---------------- ##1 <== 12 3.46410161513775458705 ##1 ==> 12 3.46410162002945508100 ##1 #:2 <== 3.46410161513775458705 ##1 #:2 ==> 3.46410162002945508100 Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9 ---------------- ##2 <== 13 3.60555127546398929312 ==> ---------------- ##3 <== 14 3.74165738677394138558 ==> ---------------- ##4 <== 15 3.87298334620741688518 ##2 ==> 15 3.87298387096774193548 ##4 #:2 <== 3.87298334620741688518 ##2 #:2 ==> 3.87298387096774193548 Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7 ---------------- ##5 <== 16 4 ==> ---------------- ##6 <== 17 4.12310562561766054982 ==> ---------------- ##7 <== 18 4.24264068711928514641 ##3 ==> 18 4.24264705882352941176 ##7 #:2 <== 4.24264068711928514641 ##3 #:2 ==> 4.24264705882352941176 Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6 ---------------- ##8 <== 19 4.35889894354067355224 ==> ---------------- ##9 <== 20 4.47213595499957939282 ==> ---------------- ##10 <== 21 4.58257569495584000659 ##4 ==> 21 4.58260869565217391304 ##10 #:2 <== 4.58257569495584000659 ##4 #:2 ==> 4.58260869565217391304 Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6 ---------------- ##11 <== 22 4.69041575982342955457 ==> ---------------- ##12 <== 23 4.7958315233127195416 ==> ---------------- ##13 <== 24 4.89897948556635619639 ==> +++ File "list1" differs from file "list2" Numdiff has recognized that the lines of `list1' with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23 and 24 have been deleted from `list2'. The numerical comparison has been done by likening each line of `list2' to the line of `list1' which displays the square root for the same integer value. The output obtained running the filter of Numdiff by `numdiff -f -z 2- list1 list2' confirms this: 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" If you compare the command `numdiff -z 2- -V list1 list2' with the one used for the files `bill1' and `bill2', *note command::, you surely notice that the filter has been invoked in different ways, first with `-z @' and then with `-z 2-'. The synchronization procedure used by the filter is based on blurring and byte-by-byte comparison. The options `-z' and `-Z' are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by `-X', *note Use of the option -X::, but accept additionally the special value `@' as abbreviation for the range of fields `1-'. Then the specifications `1:@', `2:@' and `@' are used to mean all fields of the first file, of the second one or of both, respectively. Employing `-z' and `-Z' in the right way is extremely important to let the filter work as desired. For instance, `numdiff -f -z @ list1 list2' matches the lines of `list1' and `list2' in the same wrong way 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 15 3.87298387096774193548 14 3.74165738677394138558 18 4.24264705882352941176 15 3.87298334620741688518 21 4.58260869565217391304 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 < 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 < 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" as Numdiff would do without employing the filter. It is essential then to understand what blurring a field means and how the filter uses blurring to match the lines of the files to compare. After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option `-X', then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of place card. After doing this, the filter converts all remaining numerical fields to a standard format and compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one and how to match the remaining lines to create a one-to-one correspondence. Only at this point `numdiff' inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option `-X' compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values. Blurring the right fields is essential to match the lines from the two files appropriately before doing any numerical comparison. Without blurring, the numerical fields could prevent `numdiff' from an appropriate matching of the lines, in case some of these are present in only one file, by creating confusion with their (maybe small) numeric differences. Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option `-z' indicate which fields of which file have to be blurred *under the condition that they are recognized as numeric fields*. Non-numeric fields are left by `-z' untouched (no blurring occurs for them). Then `-z 1:5-7' makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric. By the option `-Z' you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, `-Z 2:3-4' activates the blurring of the 3th and 4th field of each line of the second file. Going back to the comparison of the files `list1' and `list2', the option `-z 2-' of the command `numdiff -z 2- -V list1 list2' makes the filter transform the (memory copies of the) two files as 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * and 12 * 15 * 18 * 21 * respectively. Here * denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command `sdiff -W' when applied to them: 12 * 12 * 13 * < 14 * < 15 * 15 * 16 * < 17 * < 18 * 18 * 19 * < 20 * < 21 * 21 * 22 * < 23 * < 24 * < If you put the blurred fields back you obtain exactly the output of `numdiff -f -z 2- list1 list2': 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" Since the second field is a numerical value in all the lines of `list1' and `list2', to use the option `-Z' instead of `-z' makes no difference in this case. The output of `numdiff -f -Z 2- list1 list2' is then the same of `numdiff -f -z 2- list1 list2'. After this explanation you can also understand why `numdiff -f -z @ list1 list2' gives a wrong result. Since also the first field is always a numerical value, the option `-z @' makes the filter transform the two given files as * * * * * * * * * * * * * * * * * * * * * * * * * * and * * * * * * * * respectively, so that it is not anymore possible to match the lines in a reasonable way. We consider now a typical situation where it is better to use `-Z' in place of `-z'. If the file `Table1' contains -6 2.449490 -5 2.236068 -4 2.000000 -3 1.732051 -2 1.414214 -1 1.000000 0 0 - - - - - - - - - 1 1.000000 2 1.414214 3 1.732051 4 2.000000 - - - - - - - - - 5 2.236068 6 2.449490 7 2.645751 - - - - - - - - - 8 2.828427 9 3.000000 10 3.162278 11 3.316625 12 3.464102 - - - - - - - - - - - - - - - - - - 13 3.605551 14 3.741657 and `Table2' contains -6 Not_defined -4 Not_defined -2 Not_defined 0 0.000000 2 1.414216 4 2.000000 6 2.449494 8 2.828469 10 3.162278 12 3.464102 14 3.741658 ********************END then the output of `numdiff -z 1:2 -Z 2:2 -f Table1 Table2' is -6 2.449490 -6 Not_defined -5 2.236068 < -4 2.000000 -4 Not_defined -3 1.732051 < -2 1.414214 -2 Not_defined -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is exactly what is expected. On the other hand the command `numdiff -z 2 -f Table1 Table2' displays -6 2.449490 | -6 Not_defined -5 2.236068 | -4 Not_defined -4 2.000000 | -2 Not_defined -3 1.732051 < -2 1.414214 < -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is partially wrong. Notice that in `Table1' you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file `Table2' contains some approximations (obtained by Newton's method) for the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by Not_defined. Since Not_defined is not a numeric value, during the execution of the last command the filter transforms `Table1' in this way -6 * -5 * -4 * -3 * -2 * -1 * 0 * - - - - - - - - - 1 * 2 * 3 * 4 * - - - - - - - - - 5 * 6 * 7 * - - - - - - - - - 8 * 9 * 10 * 11 * 12 * - - - - - - - - - - - - - - - - - - 13 * 14 * and `Table2' in this other way -6 Not_defined -4 Not_defined -2 Not_defined 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END Unfortunately the first three lines are enough to confuse the synchronization procedure, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as we explained before. You can check that this is definitely the case by looking at the output of the command `sdiff -W' on the transformed files, which is -6 * | -6 Not_defined -5 * | -4 Not_defined -4 * | -2 Not_defined -3 * < -2 * < -1 * < 0 * 0 * - - - - - - - - - < 1 * < 2 * 2 * 3 * < 4 * 4 * - - - - - - - - - < 5 * < 6 * 6 * 7 * < - - - - - - - - - < 8 * 8 * 9 * < 10 * 10 * 11 * < 12 * 12 * - - - - - - - - - < - - - - - - - - - < 13 * < 14 * 14 * > ********************END If we give the command `numdiff -z 1:2 -Z 2:2 -f Table1 Table2' instead of `numdiff -z 2 -f Table1 Table2', the second field of the lines of `Table2' is always blurred. The filter transforms then `Table2' into -6 * -4 * -2 * 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END and re-synchronizes the files `Table1' and `Table2' in the right way. Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use `-X' to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be the case e.g. when in some lines the content of the field is given by a special numeric value, like Infinity, Inf, +Inf or -Inf, or by NaN, abbreviation for Not a Number. Concerning the numeric fields which are not blurred, one has to remark that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that `short1' contains a list of numbers with their logarithms 0.001 -3 0.01 -2 0.1 -1 1 0 1000 3 1000000 6 1000000000 9 and `short2' the same list of numbers and logarithms, but with differences in the numeric format: ****************** 0.0010000 -3 .0100 -2 0000.10 -1 1. 0 1,000.000 3 1,000,000. 6 1,000,000,000 9 Then `numdiff -f -z 2- short1 short2' displays > ****************** 0.001 -3 0.0010000 -3 0.01 -2 .0100 -2 0.1 -1 0000.10 -1 1 0 1. 0 1000 3 1,000.000 3 1000000 6 1,000,000. 6 1000000000 9 1,000,000,000 9 +++ File "short1" differs from file "short2" showing that the filter has matched the lines in the right way. The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files `decimal' and `scientific' contain .001 -3 .01 -2 .1 -1 * * * * * * * * * 1 0 1000 3 1000000 6 1000000000 9 and ***************** 1.0e-3 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 1.0e3 3 1.0e6 6 1.0e9 9 ***************** respectively, then `numdiff -f -z 2- decimal scientific' shows > ***************** .001 -3 1.0e-3 -3 .01 -2 1.0e-2 -2 .1 -1 1.0e-1 -1 * * * * * * * * * < 1 0 1.0e0 0 1000 3 1.0e3 3 1000000 6 1.0e6 6 1000000000 9 1.0e9 9 > ***************** +++ File "decimal" differs from file "scientific" proving that the filter does not get confused. No problems come out also in the case when for the same not blurred field the scientific notation is used in both files. If the files `sc1' and `sc2' contain 1.E-3 -3 1.00E-2 -2 1.0E-1 -1 1.0000E0 0 001.0E3 3 +01.000E6 6 1.0E+09 9 1.0E+10 10 * * * * * * * * * * and ***************** 1.0e-003 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 +1.0e3 3 1.0e+6 6 1.0e9 9 respectively, then `numdiff -f -z 2- sc1 sc2' correctly displays > ***************** 1.E-3 -3 1.0e-003 -3 1.00E-2 -2 1.0e-2 -2 1.0E-1 -1 1.0e-1 -1 1.0000E0 0 1.0e0 0 001.0E3 3 +1.0e3 3 +01.000E6 6 1.0e+6 6 1.0E+09 9 1.0e9 9 1.0E+10 10 < * * * * * * * * * * < +++ File "sc1" differs from file "sc2" The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize `123.456E+2' and `1.23456E+4' as equal. We can see this in the case of the files `Scnot1': ------------------------- 1.2E0 * 1 2.45E-1 * 2 -3.678E-2 * 3 and `Scnot2': 12E-1 * 1 245E-3 * 2 -0.003678E+1 * 3 `numdiff -f -z 3- Scnot1 Scnot2' displays the report: ------------------------- < 1.2E0 * 1 12E-1 * 1 2.45E-1 * 2 245E-3 * 2 -3.678E-2 * 3 -0.003678E+1 * 3 +++ File "Scnot1" differs from file "Scnot2" which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If `Scnot1' is given by 1.2000e0 * 1 02.4500e-1 * 2 -003.678E-2 * 3 and `Scnot2' is the same file as before, the output of the command `numdiff -f -z 3- Scnot1 Scnot2' is still right: 1.2000e0 * 1 12E-1 * 1 02.4500e-1 * 2 245E-3 * 2 -003.678E-2 * 3 -0.003678E+1 * 3 +++ Files "Scnot1" and "Scnot2" have the same structure Till now we have always used the option `-f' with no argument. But `-f' accepts an optional argument, which can be used to control how `-f' displays its output. If you provide an argument, care not to leave any space between the option and the argument: `-f60' is correct while `-f 60' makes Numdiff terminate after printing an error message. If the argument is a positive number NUM, then the side-by-side output produced by `-f' will be NUM columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when `-f' has no argument, or the supplied argument is zero. In other words, `-f' and `-f0' are just easier to remind versions of `-f130'. A negative argument has the same effect as the positive number with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command `numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2' displays the following text -5 2.236068 < -3 1.732051 < -1 1.000000 < - - - - - - - - - < 1 1.000000 < 3 1.732051 < - - - - - - - - - < 5 2.236068 < 7 2.645751 < - - - - - - - - - < 9 3.000000 < 11 3.316625 < - - - - - - - - - < - - - - - - - - - < 13 3.605551 < > ********************END +++ File "Table1" differs from file "Table2" In conjunction with the option `-f' or `-O' you can use `-T' to expand tabs to spaces in the output produced by `-f' / `-O'. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter. The options `-H' and `-m' affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others. The way that the filter re-synchronizes two files to compare always comes up with a near-minimal set of deletions/insertions of lines. Usually it is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The `-m' option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior. If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the `-H' option to make a different modification to the algorithm that the filter uses. If the input files have a constant small density of changes, where change means deletion/insertion of lines, this option speeds up the comparisons without changing the output or in the worst case introducing minor modifications. 9 Warnings ********** * Bug reports have to be sent to the address . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. * Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, ..., +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is numdiff: A number with a too small exponent has been found, namely "1.0001e-2147483640". Exponents smaller than -1073741824 are not accepted, the execution of the program ends now * If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude 10^6 = 1000000. This is what I obtained on my laptop, equipped with a dual core processor @1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000: numdiff: Insufficient memory for new allocation, the execution of the program ends now In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, ..., 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, ..., 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Consider also that, if you have numeric data with exponents outside the range -300, ..., 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right. * If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. * After reading a numeric field, Numdiff truncates its value if this number has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. If `numdiff' has been built with its own internal support for multiple precision arithmetic, then * if the number is written in ordinary decimal notation, `numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if the value is written in scientific notation, then `numdiff' will only consider the first P digits of the fractional part of the mantissa. If `numdiff' uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. By current value of the precision I mean the integer value specified by the option `-#', or the default one (35) when this option is not in use. * You can find out whether your local version of `numdiff' is relying on GNU MP or not by executing the command `numdiff -v'. If `numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If `numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. * Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, `numdiff' checks for the presence of null bytes (0x00) in the file. * If you are not including the so called white-space characters (usually ` ', `\t', `\f', `\v' and `\r') in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only *colon* (`:') and *newline* as field delimiters and Numdiff finds a line like that ::::3.0-5.6e-356i::::-12.9 +4.34i::::-12.9 4.34i::::New York:::: then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers 3.0-5.6e-356i and -12.9+4.34i, the last two ones are the strings New York and -12.9 4.34i. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only 3.0-5.6e-356i as numeric field and treats -12.9 +4.34i as non-numeric due to the presence of spaces in the middle. -12.9 4.34i is already considered as non-numeric due to the absence of a leading sign in the imaginary value. * We have seen that one of the two files passed to `numdiff' can be -, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in `cat file2 | numdiff -a 1.0e-3 file1 -'. However, if you activate the filter by means of the options `-z' or/and `-Z', Numdiff can not work with the standard input unless you use also the option `-f'. Therefore, the command `cat file2 | numdiff -a 1.0e-3 -z @ file1 -' displays only the error message numdiff: -: Illegal seek (or maybe the translation of this message in the language you are using on your computer) but `cat file2 | numdiff -a 1.0e-3 -z @ -f file1 -' works as expected. * This manual describes the version 5.8 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output. Appendix A GNU Free Documentation License ***************************************** Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. `http://fsf.org/' Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. 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, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See `http://www.gnu.org/copyleft/'. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. Index ***** Acknowledgments: See 2. (line 60) Build: See 4. (line 1025) Caveats: See 9. (line 3705) Command line options for ndselect: See 7. (line 2893) Command line options for numdiff: See 5. (line 1142) Compile: See 4. (line 1025) Copying Conditions: See 1. (line 44) Diagnostics (ndselect): See 7. (line 2893) Diagnostics (numdiff): See 5. (line 1142) FDL: See Appendix A. (line 3842) Filter: See 8. (line 2985) Filter output (numdiff): See 3.3. (line 977) Format of the reports: See 3.1. (line 592) GNU FDL: See Appendix A. (line 3842) GNU Free Documentation License: See Appendix A. (line 3842) GNU General Public License: See 1. (line 44) GPL: See 1. (line 44) How to use numdiff: See 3. (line 76) Install: See 4. (line 1025) Introduction: See 3. (line 76) Invoking ndselect: See 7. (line 2893) Invoking numdiff: See 5. (line 1142) License: See 1. (line 44) ndselect (introduction to its use): See 6. (line 2759) Notes: See 9. (line 3705) Options, command line (ndselect): See 7. (line 2893) Options, command line (numdiff): See 5. (line 1142) Output format (numdiff): See 3.1. (line 592) Overview mode of numdiff: See 3.2. (line 754) Predefined settings of numdiff: See 5. (line 1142) Purposes: See 3. (line 76) Side-by-side report (numdiff): See 3.2. (line 754) Synopsis (ndselect): See 7. (line 2893) Synopsis (numdiff): See 5. (line 1142) Thanks: See 2. (line 60) Tools: See 6. (line 2759) Usage of numdiff: See 3. (line 76) Warnings: See 9. (line 3705) ./numdiff-5.8.1/docs/numdiff.info0000644000175000017500000056745012215353073015603 0ustar ivanoivanoThis is ./docs/numdiff.info, produced by makeinfo version 4.13 from ./docs/numdiff.txi. INFO-DIR-SECTION Text creation and manipulation START-INFO-DIR-ENTRY * Numdiff: (numdiff). Comparing files containing numeric fields (and not only) END-INFO-DIR-ENTRY _"...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!"_ This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in *note GNU Free Documentation License::.  File: numdiff.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) Numdiff User Manual ******************* _"...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!"_ This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in *note GNU Free Documentation License::. * Menu: * Copying:: Numdiff Copying Conditions (GPL) * Acknowledgments:: Acknowledgments * Overview:: Introduction to numdiff * Installing:: How to install numdiff * Invoking numdiff:: How to use numdiff * ndselect:: (numdiff) ndselect. Selecting lines and fields * Invoking ndselect:: How to use ndselect * Filtering:: How to use the filter of numdiff * Warnings:: Various recommendations * GNU Free Documentation License:: The license covering this document * Index:: Complete index  File: numdiff.info, Node: Copying, Next: Acknowledgments, Prev: Top, Up: Top 1 Copying ********* Numdiff (also written numdiff) 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. Numdiff 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 `http://www.gnu.org/licenses/'.  File: numdiff.info, Node: Acknowledgments, Next: Overview, Prev: Copying, Up: Top 2 Acknowledgments ***************** I want to thank Mr. Norman Clerman for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff. Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option `-S'.  File: numdiff.info, Node: Overview, Next: Installing, Prev: Acknowledgments, Up: Top 3 Overview ********** Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people. There are several ways to think about the differences between two files. One way to think of the differences is as a series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known `diff' program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, the `diff' program considers any change in the amount or in the type of the characters as a relevant difference. However, trough some command line options it also provides ways to suppress certain kinds of differences that are not important to the user. For instance, `diff' provides ways to ignore differences in the amount of white space between words or lines, or differences in alphabetic case. Another way to think of the differences is as a series of words that were deleted from, inserted in, or changed in one file to produce the other file. Here "word" refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word. The less known `wdiff' program by Franc,ois Pinard compares words in two files and reports the differences. At last, one can think of the differences between two files as a sequence of pairs of bytes that can be either identical or different. The `cmp' program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than `diff' or `wdiff' for comparing binary files. However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. Indeed, when you compare a couple of such files, what you want to obtain usually is a list of the numerical fields in the second file which *numerically* differ from the corresponding fields in the first file. But, as you probably knows, a number can be written using different notations and programs like `diff' or `wdiff' can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values. For instance, 11.23 and 11.2300000 are the same number but represented in different ways. While, if you are interested in the numerical values, it is obvious that the difference in the representation is not meaningful and then it should be ignored, however `diff' and `wdiff' consider the previous one as a relevant difference and there is no way for you to tell these programs to ignore it! Another example of this type is given by 98765.4321 and 9.87654321E04 where the difference is only due to the use of the scientific notation in place of the ordinary decimal notation. Moreover, depending on your country you could stick to different conventions in writing numbers. For instance, the amount "three hundred millions and fifty-two thousands of dollars and forty-six cents" is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but `diff' and `wdiff' would report a difference, which probably is not what you want in a similar case. At last, sometimes you could want to ignore even differences in numerical values as long as they do not overcome a certain threshold. In other words, you could desire to suppress all "small" numerical differences too. For instance, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 must be considered equal, while 33 and 33.00011 must be reported as different. However, `diff' and `wdiff' can not be used to ignore "small" numerical differences, since they do not even know what a numerical difference is. What I have been saying till now explains why I decided to implement a new program with the capability to "appropriately" compare files containing numerical fields. In writing this program I was inspired by `ndiff', a GPL'ed software by Nelson H. Baabe of the Salt Lake City University. The author of `ndiff' had the same good reasons as me to write `ndiff'. `ndiff' is actually a good tool and I used it for a while. But I did not completely like the way it works and so `numdiff' was born. Although `ndiff' inspired `numdiff', they are completely different from the viewpoint of the source code: `numdiff' has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than `ndiff' does. `numdiff' can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. `numdiff' takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What _corresponding_ here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then `numdiff' performs a numerical comparison between them, else it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option `-s' or `-D', `numdiff' takes as field delimiters the characters newline (`\n', ASCII code 0x0A), horizontal tabulation (`\t', ASCII code 0x09), and blank (` ', ASCII code 0x20). For example, if the file `list1' contains the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and file `list2' contains the data Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line then the output of the command `numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" At the same time `numdiff' will print the following error message on stderr: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" It is worth remarking that `numdiff' can recognize complex numbers, provided that they are written in the form a+bi or a-bi with no extra characters between the values a, b and the sign + or - (the symbol i, used to represent the imaginary unit, can be changed by a suitable command line option, *note Invoking numdiff::). If you do not know what complex numbers are, do not worry! In this case probably you will never manage files containing complex numbers and so you can happily continue to ignore them. :) We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then `numdiff' version 4.x does *not* show only the one line difference: once the files are out of synchronization `numdiff' 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option `-z @'. If `bill1' and `bill2' are given by Month Expenses ------------------------- Jan09 $ 233.56 Feb09 $ 850.77 Mar09 $ 12.55 Apr09 $ 524.00 May09 $ 78.25 Jun09 $ 230.00 Jul09 $ 443.10 Aug09 $ 67.65 Sep09 $ 10.00 Oct09 $ 201.45 Nov09 $ 110.00 Dec09 $ 200.27 ------------------------- Total $ 2961.60 and Month Expenses Jan09 $ 234.00 Mar09 $ 13.00 May09 $ 78.25 Jul09 $ 443.10 Sep09 $ 10.00 Nov09 $ 110.00 Jan10 $ 200.00 ------------------------- Total $ 1088.35 respectively, then the differences between the two files are: * the insertion of the separator ------------------------- in `bill1' before the list of the months, * the deletion in `bill2' of the lines related to the expenses for the months February, April, June, August, October, December, * small changes in `bill2' to the expenses of the months January 2009 and March, * the presence in `bill2' of an entry for January 2010 just before the separator -------------------------, * the addition of an empty line to `bill2' after the separator -------------------------, * and the different values for the total sum of the expenses. The output of the command `numdiff -z @ -V bill1 bill2' (I have added here the option `-V' to let Numdiff show which couples of lines it is comparing each time) is exactly then what you expect: ---------------- ##2 <== ------------------------- ==> ---------------- ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 ##3 #:3 <== 233.56 ##2 #:3 ==> 234.00 @ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3 ---------------- ##4 <== Feb09 $ 850.77 ==> ---------------- ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 ##5 #:3 <== 12.55 ##3 #:3 ==> 13.00 @ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2 ---------------- ##6 <== Apr09 $ 524.00 ==> ---------------- ##8 <== Jun09 $ 230.00 ==> ---------------- ##10 <== Aug09 $ 67.65 ==> ---------------- ##12 <== Oct09 $ 201.45 ==> ---------------- ##14 <== Dec09 $ 200.27 ##8 ==> Jan10 $ 200.00 ##14 #:1 <== Dec09 ##8 #:1 ==> Jan10 @ @@ ##14 #:3 <== 200.27 ##8 #:3 ==> 200.00 @ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3 ---------------- <== ##10 ==> ---------------- ##16 <== Total $ 2961.60 ##11 ==> Total $ 1088.35 ##16 #:3 <== 2961.60 ##11 #:3 ==> 1088.35 @ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0 +++ File "bill1" differs from file "bill2" Numdiff has reported correctly the following differences: * the second line of file `bill1', i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file `bill2'. * The lines related to the months January and March 2009 have been slightly modified in `bill2', namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file `bill1' and the second one in file `bill2'. This information is printed by Numdiff in the form ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 Analogously ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 says that the line for March is the fifth one in `bill1' and the third one in `bill2'. * The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file `bill1' and the 11th one in file `bill2'. * The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10 and 12 of `bill1', are not present in `bill2'. * The line of `bill1' with the expenses for December 2009 is replaced in `bill2' by the line containing the value of the expenses for January 2010. * The tenth line of `bill2', i.e. the empty line after the separator, is not present in `bill1'. With respect to `bill1' this line represents then an addition. If you compare `bill1' and `bill2' without using the option `-z @', the result is completely misleading. This is the output of `numdiff -V bill1 bill2': ---------------- ##2 <== ------------------------- ##2 ==> Jan09 $ 234.00 ##2 #:1 <== ------------------------- ##2 #:1 ==> Jan09 @ @@ ##2 <== ##2 #>2 ==> $ 234.00 @ Line 2 in file "bill1" is shorter than expected! ---------------- ##3 <== Jan09 $ 233.56 ##3 ==> Mar09 $ 13.00 ##3 #:1 <== Jan09 ##3 #:1 ==> Mar09 @ @@ ##3 #:3 <== 233.56 ##3 #:3 ==> 13.00 @ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1 ---------------- ##4 <== Feb09 $ 850.77 ##4 ==> May09 $ 78.25 ##4 #:1 <== Feb09 ##4 #:1 ==> May09 @ @@ ##4 #:3 <== 850.77 ##4 #:3 ==> 78.25 @ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0 ---------------- ##5 <== Mar09 $ 12.55 ##5 ==> Jul09 $ 443.10 ##5 #:1 <== Mar09 ##5 #:1 ==> Jul09 @ @@ ##5 #:3 <== 12.55 ##5 #:3 ==> 443.10 @ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1 ---------------- ##6 <== Apr09 $ 524.00 ##6 ==> Sep09 $ 10.00 ##6 #:1 <== Apr09 ##6 #:1 ==> Sep09 @ @@ ##6 #:3 <== 524.00 ##6 #:3 ==> 10.00 @ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1 ---------------- ##7 <== May09 $ 78.25 ##7 ==> Nov09 $ 110.00 ##7 #:1 <== May09 ##7 #:1 ==> Nov09 @ @@ ##7 #:3 <== 78.25 ##7 #:3 ==> 110.00 @ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1 ---------------- ##8 <== Jun09 $ 230.00 ##8 ==> Jan10 $ 200.00 ##8 #:1 <== Jun09 ##8 #:1 ==> Jan10 @ @@ ##8 #:3 <== 230.00 ##8 #:3 ==> 200.00 @ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1 ---------------- ##9 <== Jul09 $ 443.10 ##9 ==> ------------------------- ##9 #:1 <== Jul09 ##9 #:1 ==> ------------------------- @ @@ ##9 #>2 <== $ 443.10 ##9 ==> @ Line 9 in file "bill2" is shorter than expected! ---------------- ##10 <== Aug09 $ 67.65 ##10 ==> ##10 #>1 <== Aug09 $ 67.65 ##10 ==> @ Line 10 in file "bill2" is shorter than expected! ---------------- ##11 <== Sep09 $ 10.00 ##11 ==> Total $ 1088.35 ##11 #:1 <== Sep09 ##11 #:1 ==> Total @ @@ ##11 #:3 <== 10.00 ##11 #:3 ==> 1088.35 @ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2 ---------------- ##12 <== Oct09 $ 201.45 ==> *** End of file "bill2" reached while trying to read line 12. File "bill1" has more lines than file "bill2", line 12 is the last one read from file "bill1" +++ File "bill1" differs from file "bill2" Numdiff compares now the first, second, third line of `bill1' with the first, second, third line of `bill2' and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number. Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without doing any comparison between corresponding lines. The output of `numdiff -z @ -f bill1 bill2' is Month Expenses Month Expenses ------------------------- < Jan09 $ 233.56 Jan09 $ 234.00 Feb09 $ 850.77 < Mar09 $ 12.55 Mar09 $ 13.00 Apr09 $ 524.00 < May09 $ 78.25 May09 $ 78.25 Jun09 $ 230.00 < Jul09 $ 443.10 Jul09 $ 443.10 Aug09 $ 67.65 < Sep09 $ 10.00 Sep09 $ 10.00 Oct09 $ 201.45 < Nov09 $ 110.00 Nov09 $ 110.00 Dec09 $ 200.27 | Jan10 $ 200.00 ------------------------- ------------------------- > Total $ 2961.60 Total $ 1088.35 +++ File "bill1" differs from file "bill2" and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since to guess the right options can be sometime tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, *note Filtering::, I will explain in detail * what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare, * and how the related options affect the action of the filter. By the way, it is even possible to use `-f' without any other additional option for the filter, like in `numdiff -f bill1 bill2', but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters. The option `-f' can be followed by an argument in the form of an integer number whose meaning will be explained later, *note Use of the option -f::. Even if the output of `numdiff' is self-explanatory, in the next section I will explain in details all you have to know about it. * Menu: * Output format:: How numdiff prints its reports on stdout * Overview mode:: An alternative way to print listings of differences * Filter output:: How the built-in filter prints its report  File: numdiff.info, Node: Output format, Next: Overview mode, Up: Overview 3.1 Output format ================= Let us go back to our first example. If the files `list1' and `list2' contain the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line respectively, then the output of the command `numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" `numdiff' prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file. First this report indicates the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is "1" for the first field of a line, "2" for the second field, "3" for the third one and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol "##", while the field number by "#:". Then `numdiff' shows in what the difference consists. For instance, ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ means that the first field of the first line is "accident" in the first file, while in the second file it appears as "Accident". This difference could be then canceled by removing "accident" from the first file and inserting "Accident" in place of it. The arrows "<==" and "==>" try to visualize this idea. Analogously, ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 means that the second field of the second line is "-3455.321" in the first file and "-3455.320098" in the second one. Since the contents of the field are numerical in both files, `numdiff' also prints the absolute and relative errors. The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files. The relative error (or relative difference) is actually defined in a more complicated way. If _n1_ is the value appearing in the first file and _n2_ is the value in the second file, then the absolute error is given by the formula _A=|n1-n2|_, while the relative error _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With these definitions of absolute and relative error it turns out that _A(n2, n1) = A(n1, n2)_ and _R(n2, n1) = R(n1, n2)_. In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option `-F', *note Alternative formulas for the computation of the relative difference::. If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator: @ @@ It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. When this is the case, `numdiff' reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! or in ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! In addition, `numdiff' shows the tail of the longer line, using the notation "#>n" to indicate the number n of the first field of the longer line for which there is no corresponding field in the shorter line. For example, ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file (`list2'). In this context, the symbol <<*>> (when it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating _newline_ character. It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, `numdiff' prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" Unless the option `-q' is used (*note Invoking numdiff::), `numdiff' prints on standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering: +++ File "list1" differs from file "list2"  File: numdiff.info, Node: Overview mode, Next: Filter output, Prev: Output format, Up: Overview 3.2 Overview mode ================= Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option `-O'. If this option is present on the command line, `numdiff' prints a side-by-side report instead of the usual one. For example, if `sheet1' contains the text A 1 1 B 2 4 C 3 9 D 4 16 E 5 25 F 6 36 G 7 49 H 8 64 I 9 81 J 10 100 and `sheet2' the following lines A 1 1 B 2 4 C 3.3 9.03 D 4 16 E 5.5 25.05 F 6.6 36 G 7.7 49.49 H 8 64 I 9.9 81.09 then `numdiff -O sheet1 sheet2' prints this report A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!:C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!:E 5.5 25.05 F 6 36 :!:F 6.6 36 G 7 49 :!:G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!:I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" On the left side you can see the lines coming from the file specified as first on the command line, i.e. `sheet1', on the right side the lines from the second file of the command line, in this case `sheet2'. In the middle there is a gutter which contains one of these markers: `white spaces' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options `-s', `-D', `-I', `-X', `-a', `-r', `-P' and `-N'. `:!:' The corresponding lines have at least one field which differs. `:<:' The files differ and only the first file contains the line. `:>:' The files differ and only the second file contains the line. In the case of `sheet1' and `sheet2' a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated. The option `-O' can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff::. The default value for the width of the side-by-side report is 130. No wonder then that the command `numdiff -O40 sheet1 sheet2' displays a report with shorter lines: A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!: C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command `numdiff -O40 sheet1 sheet2': C 3 9 :!: C 3.3 9.03 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of `numdiff -O24 sheet1 sheet2': A 1 A 1 B 2 B 2 C 3 :!: C 3.3 D 4 D 4 E 5 :!: E 5.5 F 6 :!: F 6.6 G 7 :!: G 7.7 H 8 H 8 I 9 :!: I 9.9 J 10 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130. Notice that the numeric argument must immediately follow the option `-O', intermediate spaces are not allowed. This is also the case for the optional argument of `-f', while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument. The option `-O' can be used together with any other option of Numdiff except for `-f', `-q', `-U', `-E', `-V' and `-b'. When `-O' is in use, `-U', `-E', `-V' and `-b' are ignored. If `-q' is present on the command line together with `-O', then `-O' is ignored. Finally, if both `-f' and `-O' are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. Therefore, the command `numdiff -O40 -f sheet1 sheet2' displays the same report as `numdiff -O40 sheet1 sheet2', while the output of `numdiff -f -O40 sheet1 sheet2' is given by A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 | C 3.3 9.03 D 4 16 D 4 16 E 5 25 | E 5.5 25.05 F 6 36 | F 6.6 36 G 7 49 | G 7.7 49.49 H 8 64 H 8 64 I 9 81 | I 9.9 81.09 J 10 100 < +++ File "sheet1" differs from file "sheet2" and coincides then with the one of `numdiff -f sheet1 sheet2'. The option `-O' can be used together with the filter to cope with the addition/deletion of lines. If the file `sheet3' contains the text A 1 1 C 3.3 9.03 E 5.5 25.05 G 7.7 49.49 I 9.9 81.09 J 10 100.00 K 0 0.02 then `numdiff -O40 sheet1 sheet3' prints a wrong report, as in the example with files `bill1' and `bill2': A 1 1 A 1 1 B 2 4 :!: C 3.3 9.03 C 3 9 :!: E 5.5 25.05 D 4 16 :!: G 7.7 49.49 E 5 25 :!: I 9.9 81.09 F 6 36 :!: J 10 100.00 G 7 49 :!: K 0 0.02 H 8 64 :<: *** End of file "sheet3" reached while trying to read line 8. File "sheet1" has more lines than file "sheet3", line 8 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet3" On the other hand, the presence of `-z @' makes Numdiff always compare fields of corresponding lines, as shown by the output of the command `numdiff -O40 -z @ sheet1 sheet3': A 1 1 A 1 1 B 2 4 :<: C 3 9 :!: C 3.3 9.03 D 4 16 :<: E 5 25 :!: E 5.5 25.05 F 6 36 :<: G 7 49 :!: G 7.7 49.49 H 8 64 :<: I 9 81 :!: I 9.9 81.09 J 10 100 J 10 100.00 :>: K 0 0.02 +++ File "sheet1" differs from file "sheet3" Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters.  File: numdiff.info, Node: Filter output, Prev: Overview mode, Up: Overview 3.3 Output of the filter ======================== The output produced just by running the filter (option `-f') is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers: `white space' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options `-s', `-D', `-I', `-X', `-z' and `-Z'. `|' The corresponding lines differ, and they are either both complete or both incomplete. `<' `(' The files differ and only the first file contains the line. `>' `)' The files differ and only the second file contains the line. `\' The corresponding lines differ, and only the first line is incomplete. `/' The corresponding lines differ, and only the second line is incomplete. An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked `\' if the line from the first file is incomplete, `/' if the line from the second file is. Like `-O', the option `-f' can take an optional argument which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff:: and *note Use of the option -f::. More generally, the user can always make `numdiff' avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, *note Invoking numdiff::.  File: numdiff.info, Node: Installing, Next: Invoking numdiff, Prev: Overview, Up: Top 4 Installing ************ To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option `-o' to write its output to a specified file, the option `-D' for macros predefinition, the option `-l' to search for a specified library, and the options `-I' and `-L' to add a given directory to the search path for include and library files respectively. In addition, you need a POSIX implementation of the `make' utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands `rm' and `find'. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Numdiff has been successfully compiled and tested on: * Slackware(R) GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), * Slackware GNU/Linux 11 with GCC 3.4.6, * Slackware GNU/Linux 12.2 with GCC 4.2.4, * Slackware GNU/Linux 13 with GCC 4.3.3, * Debian(R) GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), * Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), * Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), * SunOS(R) 5.8 with GCC 2.95.3, and * SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. Configuration, building and installation of Numdiff can be performed through the standard three steps: ./configure make make install If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then, after `make', you will have to type and run make install-nls By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/info' etc. You can specify an installation prefix other than `/usr/local' using the option `--prefix' in the `configure' step, for instance `--prefix=$HOME': ./configure --prefix=$HOME For better control, you can use the options `--bindir', `--infodir', and so on. Type `./configure --help' to obtain the complete list of all the available options. Anyway, the documentation files, including a full User Manual available in several formats (HTML, PDF and plain ASCII text), will always be put in `DOCDIR/numdiff', where DOCDIR is the path specified by the option `--docdir' or, if this option has not been given to `configure', `PREFIX/local/doc'. Here PREFIX is the installation prefix specified by the option `--prefix' or the default `/usr/local'. Once Numdiff has been installed you can remove all the files previously installed by a simple `make uninstall'. If you have also installed the localization files trough `make install-nls', then, in order to remove also these ones, use `make uninstall-nls' in place of `make uninstall'. Between the options accepted by `configure' there are `--enable-debug', `--enable-optimization', `--enable-nls' and `--enable-gmp'. The option `--enable-debug' turns on debugging when compiling the source code. This is obtained by passing to the compiler the `-g' option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable `DBGFLAGS' before calling `configure'. The option `--enable-optimization' turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the `-O' option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable `OPTFLAGS' before calling `configure'. The option `--enable-nls' turns on Natural Language Support. But you do not need to use it explicitly, since Natural Language Support is enabled by default. However, you can disable it by using `--disable-nls'. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through ./configure --disable-nls make make install Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option `--enable-gmp=no' or `--disable-gmp' to the configure script before building the program, like in ./configure --disable-gmp make make install Enabling the old internal support for multiple precision arithmetic is deprecated, *note with GNU MP is better::. The latest version of GNU MP is available at `ftp://ftp.gnu.org/gnu/gmp/'. See the GNU MP web page at `http://gmplib.org/' for up-to-date information on GNU MP.  File: numdiff.info, Node: Invoking numdiff, Next: ndselect, Prev: Installing, Up: Top 5 Invoking numdiff ****************** *SYNOPSIS* numdiff -h|--help|-v|--version or numdiff [-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]] [-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I] [-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2] [-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][-q][-S] [-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]] [-T][-B][-l PATH][-o PATH] FILE1 FILE2 where FILE1 and FILE2 are the names of the two files to compare and RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like `1-', `3-5' or `-7'. In the first case `numdiff' prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer and some information about the way it was built. In the second case `numdiff' compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be -, which refers to stdin. *OPTIONS* `-s, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If IFS is prefixed with `1:' or `2:' then use the given delimiter set only for the lines from the first or the second file respectively `-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If DELIMS is prefixed with `1:' or `2:' then use the given delimiter set only for the lines from the first or the second file respectively `-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum absolute difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 `-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum relative difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 `-2, --strict' Consider two numerical values as equal only if both absolute and relative difference do not exceed the corresponding tolerance threshold `-F, --formula=NUM' Use the formula indicated by NUM to compute the relative errors. If NUM is 0 use the classic formula. If NUM is 1 compute the relative errors by considering the values in FILE1 as sample values. If NUM is 2 compute the relative errors by considering the values in FILE2 as sample values. `-#, --digits=NUM' Set to NUM the number of digits in the significands used in multiple precision arithmetic `-P, --positive-differences' Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file `-N, --negative-differences' Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file `-I, --ignore-case' Ignore changes in case while doing literal comparisons `-c, --currency=CURRNAME' Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with `1:' or `2:' to specify the currency name only for the first or the second file `-d, --decimal-point=C1C2' Specify the characters representing the decimal point in the two files to compare `-t, --thousands-separator=C1C2' Specify the characters representing the thousands separator in the two files to compare `-g, --group-length=N1N2' Specify the number of digits forming each group of thousands in the two files to compare `-p, --plus-prefix=C1C2' Specify the (optional) prefixes for positive values used in the two files to compare `-n, --minus-prefix=C1C2' Specify the prefixes for negative values used in the two files to compare `-e, --exponent-letter=C1C2' Specify the exponent letters used in the two files to compare `-i, --imaginary-unit=C1C2' Specify the characters representing the imaginary unit in the two files to compare `-X, --exclude=1:RANGE' Select the fields of the first file that have to be ignored `-X, --exclude=2:RANGE' Select the fields of the second file that have to be ignored `-E, --essential' While printing the differences between the two compared files show only the numerical ones `-U, --dummy' While printing the differences between the two compared files neglect all the numerical ones (dummy mode) `-b, --brief' Suppress all messages concerning the differences discovered in the structures of the two files `-V, --verbose' For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files `-O, --overview[=NUM]' Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. `-q, --quiet, --silent' Suppress all the standard output `-S, --statistics' Add some statistics to the standard output `-z, --blur-if-numerical=1:RANGE' Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric `-z, --blur-if-numerical=2:RANGE' Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric `-Z, --blur-unconditionally=1:RANGE' Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure `-Z, --blur-unconditionally=2:RANGE' Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure `-m, --minimal' During synchronization try hard to find a smaller set of changes `-H, --speed-large-files' During synchronization assume large files and many scattered small changes `-f, --test-filter[=NUM]' Run only the filter and then show the results of its attempt to synchronize the two files. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. `-T, --expand-tabs' Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option `-O' or `-f') `-B, --binary' Treat both files as binary files (only meaningful under Doz/Windoz) `-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file `-o, --output=PATH' Redirect output from stdout to the indicated file `-h, --help' Show help message and predefined settings `-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty *DIAGNOSTICS* The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error. *DEFAULT NUMERIC FORMAT (for both files to compare):* Currency name = "" Decimal point = `.' Thousands separator = `,' Number of digits in each thousands group = 3 Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' *SOME EXPLANATIONS* The options `-U', `-E', `-b' and `-q' are used to hide part of the standard output of the program according to some rule. The option `-U' triggers the dummy mode. In this mode `numdiff' does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The dummy mode is so called since in this mode `numdiff' does not perform the job for which I created it. The option `-E' triggers the essential mode. In this mode `numdiff' only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when, comparing two lines, it turns out that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option `-X', then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line. The option `-b' triggers the brief mode. In this mode `numdiff' does not print the differences in the structure of the two files (see above for an explanation about what they are). The option `-q' triggers the quiet mode. In this mode `numdiff' does not print anything on the standard output. The quiet mode is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program. The option `-O' activates the overview mode, which makes `numdiff' print a side-by-side report in the form described in section *note Overview mode::. The optional numeric argument after `-O' must immediately follow, intermediate spaces are not allowed. The option `-O' can be used together with any other option of Numdiff except for `-f', `-q', `-U', `-E', `-V' and `-b'. When `-O' is in use, `-U', `-E', `-V' and `-b' are ignored. If `-q' is present on the command line together with `-O', then `-O' is ignored. Finally, if both `-f' and `-O' are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. The option `-V' triggers the verbose mode. In this mode `numdiff' produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files `data1' and `data2' contain the data 12 33 22 44.5 0.008 1.002 221.12 -34.56 water 2101.21 boats and 12 33 22.3 44.5 0.008 1.202 221.12 -34.56 2101.21 boats dogs respectively, then the command `numdiff -V data1 data2' will print the following output: ---------------- ##2 <== 22 44.5 ##2 ==> 22.3 44.5 ##2 #:1 <== 22 ##2 #:1 ==> 22.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2 ---------------- ##3 <== 0.008 1.002 ##3 ==> 0.008 1.202 ##3 #:2 <== 1.002 ##3 #:2 ==> 1.202 @ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1 ---------------- ##4 <== 221.12 -34.56 water ##4 ==> 221.12 -34.56 ##4 #>3 <== water ##4 ==> @ Line 4 in file "data2" is shorter than expected! ---------------- ##5 <== 2101.21 boats ##5 ==> 2101.21 boats dogs ##5 <== ##5 #>3 ==> dogs @ Line 5 in file "data1" is shorter than expected! +++ File "data1" differs from file "data2" You must care that the options `-b' and `-V' will be overridden if `-q' is also set. The amount of additional information printed by `-V' is trivially influenced by the options that alter the way `numdiff' performs the comparisons between fields (for instance `-a', `-r', `-2', `-N', `-P', `-U', `-E', `-I', `-X'). In the headers printed by `numdiff' when in "verbose mode" can also appear the symbol <<*>>. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating *newline* character. The option `-S' adds to the standard output of `numdiff' a statistical report with the following information: * the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options `-P' and `-N') and the number of those comparisons whose outcome is a relevant numerical difference. * the largest absolute error in the set of relevant numerical differences and the corresponding relative error, * the largest relative error in the set of relevant numerical differences together with the corresponding absolute error, * the sum and the arithmetic mean of all absolute errors, * the sum and the arithmetic mean of the relevant absolute errors, * the square root of the sum of the squares of all absolute errors, * the square root of the sum of the squares of the relevant absolute errors, * the quadratic mean of all absolute errors, and * the quadratic mean of the relevant absolute errors. By relevant numerical differences and relevant absolute errors I mean those ones appearing in the output of `numdiff' when the options `-U', `-f', `-O' and `-q' are not used. The information printed by `-S' is not removed when this option is used together with `-q'. The options `-a', `-r', `-2', `-P' and `-N' affect the way `numdiff' performs the comparisons between numerical values. Without any of these options, `numdiff' considers two numerical fields as equal when their difference is zero. The option `-a' can be used to order that two numerical fields must be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the `-a' option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values. Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, `numdiff' prints the difference in its report, unless some other option, for example `-P' or `-N', makes the difference unimportant. If nothing else follows the threshold value, what has been just explained applies to all comparisons between numerical fields. To see this in practice, if the file `many_columns1' contains the text A 1 1.2 1 0.1 11.0 1.0e-1 B 2 2.4 4 0.4 24.0 1.0e-2 C 3 3.6 9 0.9 39.0 1.0e-3 D 4 4.8 16 1.6 416.0 1.0e-4 and the contents of the file `many_columns2' are given by A 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D 4.4 4.32 16.16 1.6 416.039 -1.0e-4 then the output of the command `numdiff -a 0.5 many_columns1 many_columns2' is +++ Files "many_columns1" and "many_columns2" are equal The highest absolute difference between a field from `many_columns1' and the corresponding field from `many_columns2' is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5. On the other hand, the command `numdiff -a 0.35 many_columns1 many_columns2' prints the report ---------------- ##3 #:3 <== 3.6 ##3 #:3 ==> 3.24 Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:3 <== 4.8 ##4 #:3 ==> 4.32 Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1 +++ File "many_columns1" differs from file "many_columns2" since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4 and |4.32 - 4.8| = 0.48 exceed the value 0.35, and the other differences are below this threshold. If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of `-a'. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (`:'). If you specify only one range of numbers after the threshold value, `numdiff' uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, `-a 0.01:2-5' sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. If the files `many_columns1' and `many_columns2' are the same as before, then the command `numdiff -a 0.5:3-6 many_columns1 many_columns2' displays the following report ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option `-a' more times. The command `numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2' sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report: ---------------- ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "many_columns1" differs from file "many_columns2" Observe that :2 and :7 are abbreviations of :2-2 and :7-7, respectively. It is even possible to use range expressions like `M-' or `-N'. The first expression corresponds to all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one, both inclusive. If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), `numdiff' uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, `-a 1e-4:3-5:4-6' sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option `-X', which makes `numdiff' ignore one or more fields from one of the compared files. The file `many_columns3': A I 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B II 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C III 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D IV 4.4 4.32 16.16 1.6 416.039 -1.0e-4 has one column more than the file `many_columns1', namely the second one. When comparing `many_columns1' with `many_columns3' it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option `-X' (for a full description of the use of this option, *note Restriction of the comparison to particular fields::). Ignoring the second field of each line of `many_columns3' implies that the fields in the third column of this file are compared with the corresponding fields of the second column of `many_columns1', the fields in the fourth column of `many_columns3' are compared with the ones in the third column of `many_columns1', and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that `-X 2:2' makes `numdiff' compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of `many_columns1' with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of `many_columns3'. Therefore, the command `numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from `many_columns1' with the fourth, fifth, and sixth field respectively of the corresponding line of `many_columns3'. This explains why the report of `numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:6 <== 11.0 ##1 #:7 ==> 11.011 Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:6 <== 24.0 ##2 #:7 ==> 24.024 Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:6 <== 39.0 ##3 #:7 ==> 39.039 Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:6 <== 416.0 ##4 #:7 ==> 416.039 Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" does not show the same difference listing of the command `numdiff -a 0.5:3-6 many_columns1 many_columns2'. If what you want is to obtain the same difference listing of `numdiff -a 0.5:3-6 many_columns1 many_columns2', then the right command is `numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3'. The report printed by this last command is indeed ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" and up to the positions of the fields from `many_columns3' coincides with the one of `numdiff -a 0.5:3-6 many_columns1 many_columns2'. The option `-a' can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command `numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2' ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:4 <== 9 ##3 #:4 ==> 9.09 Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:4 <== 16 ##4 #:4 ==> 16.16 Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position. Finally, if `-a' is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example `-P' or `-N', makes `numdiff' ignore it. The option `-r' can be used to order that two numerical fields must be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the `-r' option. As for the option `-a', the argument of `-r' can have several forms. These forms are the same accepted by `-a' and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one. The relative difference is normally defined in this way. If _n1_ is a value from the file specified as first on the command line and _n2_ is the corresponding value from the second file, then the absolute difference is given by the formula _A=|n1-n2|_. The relative difference _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With this definition of relative difference it turns out that _R(n2, n1) = R(n1, n2)_: the relative difference does not change if you only change the ordering of the compared files on the command line. However there are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option `-F' together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with `-F 1' the relative difference _R_ is computed according to these rules: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n1_ is zero, * _R = |n1-n2|/ |n1|_ if _n1_ is not zero and _n2_ differs from _n1_. With `-F 2' the rules become: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n2_ is zero, * _R = |n1-n2|/ |n2|_ if _n2_ is not zero and _n2_ differs from _n1_. With the last two sets of rules it is not anymore true that _R(n2, n1) = R(n1, n2)_: the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that FILE1 and FILE2 contain 1 9.9 0.5 440 and 1.2 8 0.51 400 respectively. Then `numdiff FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" `numdiff -F 1 FILE1 FILE2' prints ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2 +++ File "file1" differs from file "file2" the output of `numdiff -F 2 FILE1 FILE2' is ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" `numdiff -F 1 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 +++ File "file1" differs from file "file2" and, finally, `numdiff -F 2 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 +++ File "file1" differs from file "file2" The option `-2' is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option `numdiff' considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option `-2' `numdiff' regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if FILE1 contains the unique line 100 and FILE2 the line 100.00012 then the output of the command `numdiff FILE1 FILE2' will be ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" The output of the commands `numdiff -a 1.0e-4 FILE1 FILE2' and `numdiff -r 1.0e-6 FILE1 FILE2' will be the same as above, but `numdiff -a 1.0e-4 -r 1.3e-6 FILE1 FILE2' and `numdiff -a 1.3e-4 -r 1.0e-6 FILE1 FILE2' will print the message +++ Files "FILE1" and "FILE2" are equal since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold. On the other hand, the commands `numdiff -a 1.0e-4 -r 1.3e-6 -2 FILE1 FILE2' and `numdiff -a 1.3e-4 -r 1.0e-6 -2 FILE1 FILE2' will print the message ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" since the option `-2' makes `numdiff' regard two values as equal only if both absolute and relative difference do not exceed the corresponding threshold of tolerance. The option `-P' makes `numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than the real part and, respectively, the imaginary part of the first value. Finally, the option `-N' makes `numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than the real part and, respectively, the imaginary part of the first value. The options `-B', `-I', `-l', `-o', `-h' and `-v' do not require further explanations. The options `-l' and `-o' are only supplied for the users of some poorly designed operating systems (like MSDog or MSWindoze), whose default shell does not allow the redirection of standard error and standard output. The option `-I' has no effect on the outcome of numerical comparisons but affects the action of the filter, *note Filtering::. The option `-s' requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples: numdiff -s ' \t\n,;:.' FILE1 FILE2 numdiff -s ' \t\n\r\f\v"\:;' FILE1 FILE2 numdiff -s `` \t\n''' FILE1 FILE2 If you want to include in the set of delimiters also some special characters, e.g the *blank*, then you must quote it. I recommend you to always use the single quote character (') to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell. `numdiff' recognizes and interprets the following sequences of characters within the argument passed to the option `-s': * `\a' alert (bell), * `\b' backspace, * `\f' form feed, * `\n' newline, * `\r' carriage return, * `\s' blank, * `\t' horizontal tab, * `\v' vertical tab, * `\\' backslash, * `\NNN' the eight-bit character whose value is the octal value NNN (one to three digits), * `\xHH' the eight-bit character whose value is the hexadecimal value HH (one or two digits). By passing the string ` \t\n,;:.' as argument for the option `-s', one tells `numdiff' to use as field delimiters the characters *blank*, *horizontal tab*, *newline*, *comma*, *semicolon*, *colon* and *dot*. Passing ` \t\n' as argument to the option `-s' is the same as not using at all the option `-s', since *blank*, *horizontal tab* and *newline* are the default field delimiters. In the list of field delimiters the character *backslash* (`\') is always treated in a special way. If it forms, combined with the subsequent character(s), one of the backslash escape sequences listed above, then it is considered to be an escape character and the whole escape sequence is decoded as shown above. Otherwise, the *backslash* is just ignored. Therefore, the delimiters specified by the command line numdiff -s' \t\n\\\"' FILE1 FILE2 are *blank*, *horizontal tab*, *newline*, *backslash* and *double quote*, since `\\' and `\"' are interpreted by `numdiff' as `\' and `"'. Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be constrained to use the double quote character (`"') to enclose the set of field delimiters, e.g. if the single quote character is used as field delimiter, like in one of the precedent examples. However you must take into account that in this case the shell could make some substitutions on the command line before executing `numdiff'. For instance, if your shell is GNU bash, then (citing the man page of GNU bash) Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of `$', ``', and `\'. The characters `$' and ``' retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: `$', ``', `"', `\', or **. A double quote may be quoted within double quotes by preceding it with a backslash ... The special parameters * and @ have special meaning when in double quotes ... Therefore, if the set of delimiters is formed by ` ', `\t', `\n', `\' and `"', and you decide to enclose them in double quotes, the `numdiff' command line should be numdiff -s'' \t\n\\\\\"'' FILE1 FILE2 and not numdiff -s'' \t\n\\\"'' FILE1 FILE2 In this last case the shell would indeed replace the string ` \t\n\\\"' by ` \t\n\"' and then `numdiff' would take ` ', `\t', `\n' and `"' as field delimiters. `numdiff' requires the presence of the *newline* in the set of characters passed to `-s'. The absence of the *newline* in the set of delimiters causes the issue of a suitable warning message and the termination of the program. If you run Numdiff with the option `-B' (`--binary') on files created under MSDog/MSWindoze, then you should put the *carriage return* in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by `numdiff', since `numdiff' would consider the final *carriage return* as part of the field and this one would be then qualified as non-numerical. You can specify different delimiters for the two files to compare by putting the prefix `1:' or `2:' in front of the set of characters passed to `-s'. If the argument of `-s' begins with `1:', the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is `2:', then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case `numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. Therefore, with `numdiff -s '1:: \n' FILE1 FILE2' the program will take *colon*, *blank* and *newline* as delimiters for FILE1, and *blank*, *tab* and *newline* as delimiters for FILE2. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Starting from version 5.8 `numdiff' allows to specify whole strings as field delimiters instead of single characters. To this purpose the option `-D' is provided. Assume that file `register1' and file `register2' contain --A: +1.0--- --B: -2.0--- --C: +3.0--- --D: -4.0--- --E: +5.0--- --F: -6.0--- and --a: +1.1--- --b: -2.2--- --c: +3.3--- --d: -4.4--- --e: +5.5--- --f: -6.6--- respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character - (minus) as delimiter via the option `-s': if you do it, then the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option `-D' you can tell `numdiff' to consider the strings -- and --- as field delimiters but not the single character -. To see this in practice, look at the output of the command `numdiff -D ': -- --- \s \n' register1 register2': ---------------- ##1 #:1 <== A ##1 #:1 ==> a @ ##1 #:2 <== +1.0 ##1 #:2 ==> +1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##2 #:1 <== B ##2 #:1 ==> b @ ##2 #:2 <== -2.0 ##2 #:2 ==> -2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##3 #:1 <== C ##3 #:1 ==> c @ ##3 #:2 <== +3.0 ##3 #:2 ==> +3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:1 <== D ##4 #:1 ==> d @ ##4 #:2 <== -4.0 ##4 #:2 ==> -4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##5 #:1 <== E ##5 #:1 ==> e @ ##5 #:2 <== +5.0 ##5 #:2 ==> +5.5 Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##6 #:1 <== F ##6 #:1 ==> f @ ##6 #:2 <== -6.0 ##6 #:2 ==> -6.6 Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "register1" differs from file "register2" The argument `-D ': -- --- \s \n'' instructs `numdiff' to regard every occurrence of a colon (:), of a blank (\s), of a newline (\n), as well as every occurrence of the strings -- and --- as field delimiters. The minus sign in front of the negative numbers is then handled as it should be. In general the argument to the option `-D' is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option `-D' is STRING1 STRING2 ... STRINGN where STRING1, STRING2, and so on are sequences of one or more characters (strings) containing no blank. Mind that at least one of these strings must be `\n'. In addition, if a string contains the newline character, this must be the only one: strings like `#\n', `%%\n', or `\s\n' are not allowed (entering such a string makes the program terminate after issuing a suitable warning message). Since the blank character has a special meaning for the shell, if the argument of `-D' is formed by two or more strings it should be quoted either with a single (`'') or with a double quote (`"'). Quoting is also adviced if one of the strings passed to `-D' contains a character (or a sequence of characters) having a special meaning for the shell. For the usage of single and double quoting to delimit the argument of `-D' the same warnings and recommendations apply as for the argument of `-s'. If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence `\s', like in the example above: within the argument of `-D' the blank character is always interpreted as a separator of adjacent delimiters. More generally, when writing the argument of `-D' the same escape sequences are allowed as for the argument of `-s'. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between `ledger1': In Out Jan 1200.00Euro 1000.00Euro Feb 800.40Euro 650.00Euro Mar 1620.50Euro 1500.00Euro Apr 760.00Euro 900.00Euro Total 4380.90Euro 4050.00Euro Difference: +330.90Euro and `ledger2': In Out Jan 1100.00Euro 1000.00Euro Feb 800.40Euro 750.00Euro Mar 1620.50Euro 1700.00Euro Apr 750.00Euro 900.00Euro Total 4270.90Euro 4350.00Euro Difference: -79.10Euro Since the Euro symbol is attached to all values, `numdiff' cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command `numdiff ledger1 ledger2' shows: ---------------- ##3 #:2 <== 1200.00Euro ##3 #:2 ==> 1100.00Euro @ ---------------- ##4 #:3 <== 650.00Euro ##4 #:3 ==> 750.00Euro @ ---------------- ##5 #:3 <== 1500.00Euro ##5 #:3 ==> 1700.00Euro @ ---------------- ##6 #:2 <== 760.00Euro ##6 #:2 ==> 750.00Euro @ ---------------- ##8 #:2 <== 4380.90Euro ##8 #:2 ==> 4270.90Euro @ ##8 #:3 <== 4050.00Euro ##8 #:3 ==> 4350.00Euro @ ---------------- ##10 #:2 <== +330.90Euro ##10 #:2 ==> -79.10Euro @ +++ File "ledger1" differs from file "ledger2" The trick to perform the comparison in the proper way consists in specifying the Euro symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If `ledger1' and `ledger2' are encoded in UTF-8, this can be done by using the option `-D' with the argument `\xE2\x82\xAC \s \t \n', since the hexadecimal representation of Euro in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command `numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2' shows that in this case `numdiff' performs indeed a numerical comparison of the values contained in the two files: ---------------- ##3 #:2 <== 1200.00 ##3 #:2 ==> 1100.00 Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2 ---------------- ##4 #:3 <== 650.00 ##4 #:3 ==> 750.00 Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1 ---------------- ##5 #:3 <== 1500.00 ##5 #:3 ==> 1700.00 Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1 ---------------- ##6 #:2 <== 760.00 ##6 #:2 ==> 750.00 Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2 ---------------- ##8 #:2 <== 4380.90 ##8 #:2 ==> 4270.90 Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2 ##8 #:3 <== 4050.00 ##8 #:3 ==> 4350.00 Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2 ---------------- ##10 #:2 <== +330.90 ##10 #:2 ==> -79.10 Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0 +++ File "ledger1" differs from file "ledger2" If `ledger1' and `ledger2' had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to Euro in this other encoding should have been passed to `-D'. As for `-s', with `-D' you can specify different delimiters for the two files to compare by means of the prefixes `1:' and `2:', like in `numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file'. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, `numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. If you run Numdiff with the option `-B' (`--binary') on files created under MSDog/MSWindoze, you should always include the character `\r' in the set of field delimiters. The option `-s' and `-D' can appear more than once on the command line. In case of conflicts, `numdiff' assumes as set of delimiters for a given file the one specified last on the command line. By means of the option `-#' the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If `numdiff' has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. Take into account that an higher precision makes the execution of `numdiff' slower. This is particularly true if `numdiff' is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, you have to care that `numdiff' truncates the value of a numerical field if it has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. * If `numdiff' has been built with its own internal support for multiple precision arithmetic, then * if a number is written in ordinary decimal notation, `numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if a value is written in scientific notation, then `numdiff' will only consider the first P digits of the fractional part of the mantissa. * If `numdiff' uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. You can find out whether your local version of `numdiff' is relying on GNU MP or not by executing the command `numdiff -v'. If `numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If `numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. By means of the option `-c' the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored by `numdiff' whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of `-c' with `1:' or `2:' it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files `money1': Profits Expenses +$430.10 -$300.50 +$750.20 -$550.02 +$876.24 -$720.00 Totals $2056.54 -$1570.52 and `money2': Profits Expenses USD430.10 -USD300.50 USD750.20 -USD550.02 USD876.24 -USD720.15 Totals 2056.54 -1570.67 To properly compare them we have to tell `numdiff' that `$' and `USD' are the currency symbols for `money1' and `money2' respectively. This can be achieved by `-c 1:$' and `-c 2:USD'. The output of the command `numdiff -c 1:$ -c 2:USD money1 money2' is ---------------- ##5 #:2 <== -$720.00 ##5 #:2 ==> -USD720.15 Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4 ---------------- ##7 #:3 <== -$1570.52 ##7 #:3 ==> -1570.67 Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5 +++ File "money1" differs from file "money2" as it should be. The argument of `-c' may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write `-c Euro ' to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options `-s' and `-D'. For example, if the files to compare are encoded in UTF-8, you can set Euro as currency name by adding `-c '\xE2\x82\xAC'' to the command line of `numdiff', since the hexadecimal representation of Euro in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC. Mind that in this case the argument of `-c' has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell. To see this in practice, if `euro1' contains the text Profits Expenses +Euro 430.10 -Euro 300.50 +Euro 750.20 -Euro 550.02 +Euro 876.24 -Euro 720.00 and `euro2' the text Profits Expenses +Euro 430.10 -Euro 300.00 +Euro 750.20 -Euro 550.02 +Euro 876.00 -Euro 720.00 then the report of `numdiff -c '\xE2\x82\xAC' euro1 euro2' is ---------------- ##3 #:2 <== -Euro 300.50 ##3 #:2 ==> -Euro 300.00 Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3 ---------------- ##5 #:1 <== +Euro 876.24 ##5 #:1 ==> +Euro 876.00 Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4 +++ File "euro1" differs from file "euro2" Please consider that `-c' is only provided to let `numdiff' regard a field as numeric also in presence of a currency name immediately before its first digit: `numdiff' does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. `numdiff' can even cope with the currency name when it appears in a complex number. For example, with `-c EUR' `numdiff' considers +EUR12-EUR0.24i and +12-0.24i as equal. The options `-d', `-t', `-g', `-p', `-n', `-e' and `-i' can be used to instruct `numdiff' about the numeric formats used in the files which it is going to compare. The two files to compare do not have to adopt the same numeric format and then `numdiff' allows to specify different numeric formats for them. Each of the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i' can have as argument one or two (single-byte) characters, in particular one or two digits if the option is `-g'. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option `-d' can be used to tell `numdiff' which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command `numdiff -d_ FILE1 FILE2', then `numdiff' will understand that both in FILE1 and in FILE2 the character *underscore* (`_') is used in place of the default one (`.') to indicate the position of the decimal point in the numerical values. But if the command is `numdiff -d_: FILE1 FILE2', then `numdiff' will understand that the decimal point is indicated by the character *underscore* in FILE1, and by *colon* (`:') in FILE2. If you omit to use one of the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i', then the corresponding attribute will take its default value, *note Default Numeric Format::. You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option `-g' must be digits, the arguments of the options `-d' and `-t' must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function `ispunct' returns a non zero value), those ones of the options `-p', `-n', `-e' and `-i' must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function `isgraph' returns a non zero value). It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command `numdiff -d,. FILE1 FILE2' will make `numdiff' abnormally terminate after printing the error message: The numeric format specified for the first file is illegal, the following symbols should be all different while two or more of them are actually equal: Decimal point = `,' Thousands separator = `,' Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' With the option `-d' we have told `numdiff' that in the first file the decimal point is indicated by the character *comma*, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. *comma*, for both files to compare. In this way we have implicitly told that in FILE1 the character *comma* represents both decimal point and thousands separator. Since this is not reasonable, `numdiff' refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option `-t': `numdiff -d,. -t., FILE1 FILE2'. Of course, we assume here that the decimal point and the thousands separator are represented in FILE1 by *comma* and *dot* respectively, in FILE2 by *dot* and *comma*. I strongly suggest you, whenever you write a file, to avoid using the same symbol to mean two different things (like would be using *comma* for both decimal point and thousands separator), it is nonsense. At last, it is possible (but stupid) to use as argument for the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i' one of the characters used as delimiters in the files to compare. In such a case `numdiff' does not complain, but you have to consider that it first uses the set of field delimiters to split the files into fields and then, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. However, it should never happen to specify as argument for one of the options `-d', `-t', `-g', `-p', `-n', `-e', and `-i' a character which is also used as field delimiter: in writing a file you should avoid (and people usually avoid it) to use the same symbol to mean two different things. What we have said also explains why the argument of the option `-c' should never contain one or more field delimiters. The option `-X' can be used to restrict the comparison between files to a certain group of fields. This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument specifies the position(s) of the fields that `numdiff' has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand. The argument passed to `-X' can start with a prefix, which must be either `1:' or `2:'. `1:' refers to the file passed as first on the command line, `2:' to the file specified as second. With the prefix `1:' only the fields of the first file corresponding to the given position(s) are ignored. Similarly, if you want to ignore only fields from the second file you have to use the prefix `2:'. The option `-X' can appear more times on the command line, in which case `numdiff' will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file `List1' contains the data * a 1 1 1 1 * b 2 2 2 2 * c 3 3 3 3 * d 4 4 4 4 * e 5 5 5 5 and `List2' the data 1 1.1 1.01 A 1.001 1.0001 2 2.2 2.02 B 2.002 2.0002 3 3.3 3.03 C 3.003 3.0003 4 4.4 4.04 D 4.004 4.0004 5 5.5 5.05 E 5.005 5.0005 then the output of `numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is ---------------- ##1 #:4 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:5 <== 1 ##1 #:3 ==> 1.01 @ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##2 #:4 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:5 <== 2 ##2 #:3 ==> 2.02 @ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##3 #:4 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:5 <== 3 ##3 #:3 ==> 3.03 @ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##4 #:4 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:5 <== 4 ##4 #:3 ==> 4.04 @ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##5 #:4 <== 5 ##5 #:2 ==> 5.5 @ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ##5 #:5 <== 5 ##5 #:3 ==> 5.05 @ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2 +++ File "List1" differs from file "List2" Numdiff cuts off from `List1' the fields in the positions 1, 2 and 6 and from `List2' the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of `List1' with the first, second and third field respectively of the corresponding line of `List2'. An equivalent form of the command `numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is given by `numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2' : since the sixth field is cut off from both files we can refer to it without a prefix. As you can see, you can specify a range of fields by using the notation `M-N', where M and N are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like `M-' or `-N'. The first expression corresponds to all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one (inclusive). Therefore the command `numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is equivalent to `numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2' or to `numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2'. Mind that the largest field number you can use while writing a specification for the option `-X' is 32768. If you use the option `-X' the exit status of `numdiff' reflects the outcome of the restricted comparison. For instance, the exit status of `numdiff -X 8- FILE1 FILE2' is 1 only if `numdiff' has found a difference in the first seven fields of FILE1 and FILE2. If the two files differ only in the fields after the seventh one, then `numdiff' ends with a zero exit status. Going back to the example with `List1' and `List2', the output of `numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2' is +++ Files "List1" and "List2" are equal since every field of `List1' at position 3 is equal to the first field in the corresponding line of `List2'. The exit code returned by the program to the shell is zero. The options `-z', `-Z', `-m', `-H', `-f', and `-T' influence the action of the filter and their use is then described later, *note Filtering::. Care that `-z' and `-Z' need both an argument in the same form required by `-X'. Since version 5 Numdiff accepts also long options to conform to the GNU standards. Now it is then possible, e.g., to use `--separators='\n\t %'' or `--separators '\n\t %'' instead of using `-s '\n\t %''. The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option. The argument of a long option may or may not preceded by the = sign. The only exceptions are the options `--test-filter' and `--overview', for which the presence of the = before the argument is mandatory. Then `--test-filter=60' is correct while `--test-filter 60' is not accepted.  File: numdiff.info, Node: ndselect, Next: Invoking ndselect, Prev: Invoking numdiff, Up: Top 6 Selecting lines and fields for the comparison *********************************************** Together with the version 5.x of Numdiff is shipped the program `ndselect'. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file `list1' contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24: 12 3.46410161513775458705 13 3.60555127546398929312 14 3.74165738677394138558 15 3.87298334620741688518 16 4 17 4.12310562561766054982 18 4.24264068711928514641 19 4.35889894354067355224 20 4.47213595499957939282 21 4.58257569495584000659 22 4.69041575982342955457 23 4.7958315233127195416 24 4.89897948556635619639 and LIST2 contains _suitable_ approximations of the square root only for the numbers between 12 and 21 which are multiple of 3: 12 3.46410162002945508100 15 3.87298387096774193548 18 4.24264705882352941176 21 4.58260869565217391304 These approximations could have been obtained by using the famous Heron's algorithm, which, given an approximation `a' for the square root of a number `x', computes a better approximation by the formula `a := 0.5 * (x/a + a)'. What we want now is to understand by using `numdiff' how good the approximations contained in file LIST2 are. Unfortunately, we cannot execute directly the command `numdiff list1 list2', since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15 respectively. To make the comparison in the right way, one could open `list1' in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file. An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities `head' and `sed', in this particular case `head -n 10 list1 | sed -n -e '1~3 p' > List1'. A quick explanation for the ones who do not know how to use `head' and `sed': the previous command extracts from `list1' the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed on the file `List1', which then looks like: 12 3.46410161513775458705 15 3.87298334620741688518 18 4.24264068711928514641 21 4.58257569495584000659 Once obtained `List1', we can perform the comparison between the values we are interested in by means of `numdiff List1 list2' . Unfortunately, this trick only works if you have installed the GNU version of `sed', which, as far as I know, is the only one to provide the extension FIRST~STEP to specify line addresses. That is way I decided to implement `ndselect', which allows to obtain the same result as above with the simpler command `ndselect -b 1 -e 10 -s 3 list1 > List1' The meaning of the arguments passed to the options `-b', `-e', and `-s' is the following: we tell `ndselect' to print every third line of file `list1' (the option `-s' specifies the step) starting from the first one (the option `-b' specifies the beginning) and ending within the tenth one possibly inclusive (the option `-e' specifies the end). Because of the presence of the redirection operator `>', the previous command sends to the file `List1' what `ndselect' would print on the screen (standard output). Since version 5.6 `ndselect' can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option `-F' to indicate the position of the first field to print, the option `-L' to indicate the position of the last field that can be printed, the option `-I' to set the increment when selecting the fields. In addition, the option `-S' can be used to specify a set of field delimiters different from the default one (which consists of *blank*, *tab* and *newline*). As for `numdiff', the field delimiters are used to split the input lines into fields. The option `-S' of `ndselect' recognizes and accepts the same escape sequences of `numdiff' options `-s', `-D', and `-c'. As example consider the selection of the even fields between the second and the sixth one inclusive from the file `many_many_columns', whose contents are shown here: A | I | 1.1 | 1.08 | 1.01 | 0.1 | 11.011 | -1.0e-1 B | II | 2.2 | 2.16 | 4.04 | 0.4 | 24.024 | -1.0e-2 C | III | 3.3 | 3.24 | 9.09 | 0.9 | 39.039 | -1.0e-3 D | IV | 4.4 | 4.32 | 16.16 | 1.6 | 416.039 | -1.0e-4 E | V | 5.5 | 5.40 | 25.25 | 2.5 | 525.416 | -1.0e-5 F | # | # | # | # | # | # | # This selection can be accomplished by means of the command `ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns', whose output shows only the selected fields: I | 1.08 | 0.1 II | 2.16 | 0.4 III | 3.24 | 0.9 IV | 4.32 | 1.6 V | 5.40 | 2.5 # | # | # Of course, you can also select particular fields of particular lines, as shown by the output of the command `ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns': I | 1.08 | 0.1 IV | 4.32 | 1.6 By default, `ndselect' reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option `-O'. This one recognizes and accepts the same escape sequences of `numdiff' options `-s', `-D', and `-c'. For example, `ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns' puts two horizontal tabulations after every printed field: I 1.08 0.1 IV 4.32 1.6 Even if the implementation of a filter in `numdiff' and the addition of the option `-X' have made `ndselect' much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than `numdiff'. The complete synopsis of `ndselect' can be found in the next chapter.  File: numdiff.info, Node: Invoking ndselect, Next: Filtering, Prev: ndselect, Up: Top 7 Invoking ndselect ******************* *SYNOPSIS* ndselect -h|--help|-v|--version or ndselect [-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS] [-O OSEP][-x][-l PATH][-o PATH][FILE] where FILE is the name of the file to read from. In the first case `ndselect' prints a short help or/and version number, Copyright, License notice and NO-Warranty disclaimer. In the second case `ndselect' prints on the standard output a subset of lines and fields from FILE. The complete path of FILE should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. *OPTIONS* `-b, --beginning, --start=N' Set to N the number of the first line to print (The default behavior is to start with line number 1) `-e, --end=N' Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) `-s, --step=N' Set to N the increment to use when selecting the lines to print (The default value for the increment is 1) `-F, --first-field=N' Set to N the number of the first field to print (The default behavior is to start with field number 1) `-L, --last-field=N' Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) `-I, --increment=N' Set to N the increment to use when selecting the fields to print (The default value for the increment is 1) `-S, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline) `-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) `-O, --output-separator=OSEP' Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines) `-x, --omit-empty-lines' Do not print empty lines `-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file `-o, --output=PATH' Redirect output from stdout to the indicated file `-h, --help' Show this help message `-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty Passing 0 as argument to the option `-L' or to `-e' is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively). *DIAGNOSTICS* The exit status is 0 in case of normal termination, -1 (255) in case of error. As `numdiff' does, since version 5 also `ndselect' accepts long options. Thus, instead of `ndselect -b 1 -e 10 -s 3 list1 > List1' you can write `ndselect --start=1 --end=10 --step=3 list1 > List1'. The usage of the option `-D' is the same as for `numdiff'. The option `-S' corresponds to the option `-s' of `numdiff'.  File: numdiff.info, Node: Filtering, Next: Warnings, Prev: Invoking ndselect, Up: Top 8 Using the filter of numdiff ***************************** Since version 5 it is possible to activate a filter when calling `numdiff', so that the program performs automatically the comparison in the desired way. Recalling the example of chapter 6, if you run the command `numdiff -z 2- -V list1 list2' you obtain the following result: ---------------- ##1 <== 12 3.46410161513775458705 ##1 ==> 12 3.46410162002945508100 ##1 #:2 <== 3.46410161513775458705 ##1 #:2 ==> 3.46410162002945508100 Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9 ---------------- ##2 <== 13 3.60555127546398929312 ==> ---------------- ##3 <== 14 3.74165738677394138558 ==> ---------------- ##4 <== 15 3.87298334620741688518 ##2 ==> 15 3.87298387096774193548 ##4 #:2 <== 3.87298334620741688518 ##2 #:2 ==> 3.87298387096774193548 Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7 ---------------- ##5 <== 16 4 ==> ---------------- ##6 <== 17 4.12310562561766054982 ==> ---------------- ##7 <== 18 4.24264068711928514641 ##3 ==> 18 4.24264705882352941176 ##7 #:2 <== 4.24264068711928514641 ##3 #:2 ==> 4.24264705882352941176 Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6 ---------------- ##8 <== 19 4.35889894354067355224 ==> ---------------- ##9 <== 20 4.47213595499957939282 ==> ---------------- ##10 <== 21 4.58257569495584000659 ##4 ==> 21 4.58260869565217391304 ##10 #:2 <== 4.58257569495584000659 ##4 #:2 ==> 4.58260869565217391304 Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6 ---------------- ##11 <== 22 4.69041575982342955457 ==> ---------------- ##12 <== 23 4.7958315233127195416 ==> ---------------- ##13 <== 24 4.89897948556635619639 ==> +++ File "list1" differs from file "list2" Numdiff has recognized that the lines of `list1' with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23 and 24 have been deleted from `list2'. The numerical comparison has been done by likening each line of `list2' to the line of `list1' which displays the square root for the same integer value. The output obtained running the filter of Numdiff by `numdiff -f -z 2- list1 list2' confirms this: 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" If you compare the command `numdiff -z 2- -V list1 list2' with the one used for the files `bill1' and `bill2', *note command::, you surely notice that the filter has been invoked in different ways, first with `-z @' and then with `-z 2-'. The synchronization procedure used by the filter is based on blurring and byte-by-byte comparison. The options `-z' and `-Z' are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by `-X', *note Use of the option -X::, but accept additionally the special value `@' as abbreviation for the range of fields `1-'. Then the specifications `1:@', `2:@' and `@' are used to mean all fields of the first file, of the second one or of both, respectively. Employing `-z' and `-Z' in the right way is extremely important to let the filter work as desired. For instance, `numdiff -f -z @ list1 list2' matches the lines of `list1' and `list2' in the same wrong way 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 15 3.87298387096774193548 14 3.74165738677394138558 18 4.24264705882352941176 15 3.87298334620741688518 21 4.58260869565217391304 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 < 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 < 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" as Numdiff would do without employing the filter. It is essential then to understand what blurring a field means and how the filter uses blurring to match the lines of the files to compare. After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option `-X', then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of place card. After doing this, the filter converts all remaining numerical fields to a standard format and compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one and how to match the remaining lines to create a one-to-one correspondence. Only at this point `numdiff' inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option `-X' compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values. Blurring the right fields is essential to match the lines from the two files appropriately before doing any numerical comparison. Without blurring, the numerical fields could prevent `numdiff' from an appropriate matching of the lines, in case some of these are present in only one file, by creating confusion with their (maybe small) numeric differences. Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option `-z' indicate which fields of which file have to be blurred *under the condition that they are recognized as numeric fields*. Non-numeric fields are left by `-z' untouched (no blurring occurs for them). Then `-z 1:5-7' makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric. By the option `-Z' you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, `-Z 2:3-4' activates the blurring of the 3th and 4th field of each line of the second file. Going back to the comparison of the files `list1' and `list2', the option `-z 2-' of the command `numdiff -z 2- -V list1 list2' makes the filter transform the (memory copies of the) two files as 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * and 12 * 15 * 18 * 21 * respectively. Here * denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command `sdiff -W' when applied to them: 12 * 12 * 13 * < 14 * < 15 * 15 * 16 * < 17 * < 18 * 18 * 19 * < 20 * < 21 * 21 * 22 * < 23 * < 24 * < If you put the blurred fields back you obtain exactly the output of `numdiff -f -z 2- list1 list2': 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" Since the second field is a numerical value in all the lines of `list1' and `list2', to use the option `-Z' instead of `-z' makes no difference in this case. The output of `numdiff -f -Z 2- list1 list2' is then the same of `numdiff -f -z 2- list1 list2'. After this explanation you can also understand why `numdiff -f -z @ list1 list2' gives a wrong result. Since also the first field is always a numerical value, the option `-z @' makes the filter transform the two given files as * * * * * * * * * * * * * * * * * * * * * * * * * * and * * * * * * * * respectively, so that it is not anymore possible to match the lines in a reasonable way. We consider now a typical situation where it is better to use `-Z' in place of `-z'. If the file `Table1' contains -6 2.449490 -5 2.236068 -4 2.000000 -3 1.732051 -2 1.414214 -1 1.000000 0 0 - - - - - - - - - 1 1.000000 2 1.414214 3 1.732051 4 2.000000 - - - - - - - - - 5 2.236068 6 2.449490 7 2.645751 - - - - - - - - - 8 2.828427 9 3.000000 10 3.162278 11 3.316625 12 3.464102 - - - - - - - - - - - - - - - - - - 13 3.605551 14 3.741657 and `Table2' contains -6 Not_defined -4 Not_defined -2 Not_defined 0 0.000000 2 1.414216 4 2.000000 6 2.449494 8 2.828469 10 3.162278 12 3.464102 14 3.741658 ********************END then the output of `numdiff -z 1:2 -Z 2:2 -f Table1 Table2' is -6 2.449490 -6 Not_defined -5 2.236068 < -4 2.000000 -4 Not_defined -3 1.732051 < -2 1.414214 -2 Not_defined -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is exactly what is expected. On the other hand the command `numdiff -z 2 -f Table1 Table2' displays -6 2.449490 | -6 Not_defined -5 2.236068 | -4 Not_defined -4 2.000000 | -2 Not_defined -3 1.732051 < -2 1.414214 < -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is partially wrong. Notice that in `Table1' you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file `Table2' contains some approximations (obtained by Newton's method) for the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by Not_defined. Since Not_defined is not a numeric value, during the execution of the last command the filter transforms `Table1' in this way -6 * -5 * -4 * -3 * -2 * -1 * 0 * - - - - - - - - - 1 * 2 * 3 * 4 * - - - - - - - - - 5 * 6 * 7 * - - - - - - - - - 8 * 9 * 10 * 11 * 12 * - - - - - - - - - - - - - - - - - - 13 * 14 * and `Table2' in this other way -6 Not_defined -4 Not_defined -2 Not_defined 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END Unfortunately the first three lines are enough to confuse the synchronization procedure, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as we explained before. You can check that this is definitely the case by looking at the output of the command `sdiff -W' on the transformed files, which is -6 * | -6 Not_defined -5 * | -4 Not_defined -4 * | -2 Not_defined -3 * < -2 * < -1 * < 0 * 0 * - - - - - - - - - < 1 * < 2 * 2 * 3 * < 4 * 4 * - - - - - - - - - < 5 * < 6 * 6 * 7 * < - - - - - - - - - < 8 * 8 * 9 * < 10 * 10 * 11 * < 12 * 12 * - - - - - - - - - < - - - - - - - - - < 13 * < 14 * 14 * > ********************END If we give the command `numdiff -z 1:2 -Z 2:2 -f Table1 Table2' instead of `numdiff -z 2 -f Table1 Table2', the second field of the lines of `Table2' is always blurred. The filter transforms then `Table2' into -6 * -4 * -2 * 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END and re-synchronizes the files `Table1' and `Table2' in the right way. Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use `-X' to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be the case e.g. when in some lines the content of the field is given by a special numeric value, like Infinity, Inf, +Inf or -Inf, or by NaN, abbreviation for Not a Number. Concerning the numeric fields which are not blurred, one has to remark that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that `short1' contains a list of numbers with their logarithms 0.001 -3 0.01 -2 0.1 -1 1 0 1000 3 1000000 6 1000000000 9 and `short2' the same list of numbers and logarithms, but with differences in the numeric format: ****************** 0.0010000 -3 .0100 -2 0000.10 -1 1. 0 1,000.000 3 1,000,000. 6 1,000,000,000 9 Then `numdiff -f -z 2- short1 short2' displays > ****************** 0.001 -3 0.0010000 -3 0.01 -2 .0100 -2 0.1 -1 0000.10 -1 1 0 1. 0 1000 3 1,000.000 3 1000000 6 1,000,000. 6 1000000000 9 1,000,000,000 9 +++ File "short1" differs from file "short2" showing that the filter has matched the lines in the right way. The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files `decimal' and `scientific' contain .001 -3 .01 -2 .1 -1 * * * * * * * * * 1 0 1000 3 1000000 6 1000000000 9 and ***************** 1.0e-3 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 1.0e3 3 1.0e6 6 1.0e9 9 ***************** respectively, then `numdiff -f -z 2- decimal scientific' shows > ***************** .001 -3 1.0e-3 -3 .01 -2 1.0e-2 -2 .1 -1 1.0e-1 -1 * * * * * * * * * < 1 0 1.0e0 0 1000 3 1.0e3 3 1000000 6 1.0e6 6 1000000000 9 1.0e9 9 > ***************** +++ File "decimal" differs from file "scientific" proving that the filter does not get confused. No problems come out also in the case when for the same not blurred field the scientific notation is used in both files. If the files `sc1' and `sc2' contain 1.E-3 -3 1.00E-2 -2 1.0E-1 -1 1.0000E0 0 001.0E3 3 +01.000E6 6 1.0E+09 9 1.0E+10 10 * * * * * * * * * * and ***************** 1.0e-003 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 +1.0e3 3 1.0e+6 6 1.0e9 9 respectively, then `numdiff -f -z 2- sc1 sc2' correctly displays > ***************** 1.E-3 -3 1.0e-003 -3 1.00E-2 -2 1.0e-2 -2 1.0E-1 -1 1.0e-1 -1 1.0000E0 0 1.0e0 0 001.0E3 3 +1.0e3 3 +01.000E6 6 1.0e+6 6 1.0E+09 9 1.0e9 9 1.0E+10 10 < * * * * * * * * * * < +++ File "sc1" differs from file "sc2" The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize `123.456E+2' and `1.23456E+4' as equal. We can see this in the case of the files `Scnot1': ------------------------- 1.2E0 * 1 2.45E-1 * 2 -3.678E-2 * 3 and `Scnot2': 12E-1 * 1 245E-3 * 2 -0.003678E+1 * 3 `numdiff -f -z 3- Scnot1 Scnot2' displays the report: ------------------------- < 1.2E0 * 1 12E-1 * 1 2.45E-1 * 2 245E-3 * 2 -3.678E-2 * 3 -0.003678E+1 * 3 +++ File "Scnot1" differs from file "Scnot2" which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If `Scnot1' is given by 1.2000e0 * 1 02.4500e-1 * 2 -003.678E-2 * 3 and `Scnot2' is the same file as before, the output of the command `numdiff -f -z 3- Scnot1 Scnot2' is still right: 1.2000e0 * 1 12E-1 * 1 02.4500e-1 * 2 245E-3 * 2 -003.678E-2 * 3 -0.003678E+1 * 3 +++ Files "Scnot1" and "Scnot2" have the same structure Till now we have always used the option `-f' with no argument. But `-f' accepts an optional argument, which can be used to control how `-f' displays its output. If you provide an argument, care not to leave any space between the option and the argument: `-f60' is correct while `-f 60' makes Numdiff terminate after printing an error message. If the argument is a positive number NUM, then the side-by-side output produced by `-f' will be NUM columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when `-f' has no argument, or the supplied argument is zero. In other words, `-f' and `-f0' are just easier to remind versions of `-f130'. A negative argument has the same effect as the positive number with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command `numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2' displays the following text -5 2.236068 < -3 1.732051 < -1 1.000000 < - - - - - - - - - < 1 1.000000 < 3 1.732051 < - - - - - - - - - < 5 2.236068 < 7 2.645751 < - - - - - - - - - < 9 3.000000 < 11 3.316625 < - - - - - - - - - < - - - - - - - - - < 13 3.605551 < > ********************END +++ File "Table1" differs from file "Table2" In conjunction with the option `-f' or `-O' you can use `-T' to expand tabs to spaces in the output produced by `-f' / `-O'. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter. The options `-H' and `-m' affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others. The way that the filter re-synchronizes two files to compare always comes up with a near-minimal set of deletions/insertions of lines. Usually it is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The `-m' option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior. If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the `-H' option to make a different modification to the algorithm that the filter uses. If the input files have a constant small density of changes, where change means deletion/insertion of lines, this option speeds up the comparisons without changing the output or in the worst case introducing minor modifications.  File: numdiff.info, Node: Warnings, Next: Index, Prev: Filtering, Up: Top 9 Warnings ********** * Bug reports have to be sent to the address . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. * Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, ..., +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is numdiff: A number with a too small exponent has been found, namely "1.0001e-2147483640". Exponents smaller than -1073741824 are not accepted, the execution of the program ends now * If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude 10^6 = 1000000. This is what I obtained on my laptop, equipped with a dual core processor @1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000: numdiff: Insufficient memory for new allocation, the execution of the program ends now In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, ..., 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, ..., 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Consider also that, if you have numeric data with exponents outside the range -300, ..., 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right. * If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. * After reading a numeric field, Numdiff truncates its value if this number has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. If `numdiff' has been built with its own internal support for multiple precision arithmetic, then * if the number is written in ordinary decimal notation, `numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if the value is written in scientific notation, then `numdiff' will only consider the first P digits of the fractional part of the mantissa. If `numdiff' uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. By current value of the precision I mean the integer value specified by the option `-#', or the default one (35) when this option is not in use. * You can find out whether your local version of `numdiff' is relying on GNU MP or not by executing the command `numdiff -v'. If `numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If `numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. * Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, `numdiff' checks for the presence of null bytes (0x00) in the file. * If you are not including the so called white-space characters (usually ` ', `\t', `\f', `\v' and `\r') in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only *colon* (`:') and *newline* as field delimiters and Numdiff finds a line like that ::::3.0-5.6e-356i::::-12.9 +4.34i::::-12.9 4.34i::::New York:::: then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers 3.0-5.6e-356i and -12.9+4.34i, the last two ones are the strings New York and -12.9 4.34i. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only 3.0-5.6e-356i as numeric field and treats -12.9 +4.34i as non-numeric due to the presence of spaces in the middle. -12.9 4.34i is already considered as non-numeric due to the absence of a leading sign in the imaginary value. * We have seen that one of the two files passed to `numdiff' can be -, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in `cat file2 | numdiff -a 1.0e-3 file1 -'. However, if you activate the filter by means of the options `-z' or/and `-Z', Numdiff can not work with the standard input unless you use also the option `-f'. Therefore, the command `cat file2 | numdiff -a 1.0e-3 -z @ file1 -' displays only the error message numdiff: -: Illegal seek (or maybe the translation of this message in the language you are using on your computer) but `cat file2 | numdiff -a 1.0e-3 -z @ -f file1 -' works as expected. * This manual describes the version 5.8 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output.  File: numdiff.info, Node: GNU Free Documentation License, Up: Top Appendix A GNU Free Documentation License ***************************************** Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. `http://fsf.org/' Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. 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, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See `http://www.gnu.org/copyleft/'. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: numdiff.info, Node: Index, Prev: Warnings, Up: Top Index ***** [index] * Menu: * Acknowledgments: Acknowledgments. (line 6) * Build: Installing. (line 6) * Caveats: Warnings. (line 6) * Command line options for ndselect: Invoking ndselect. (line 6) * Command line options for numdiff: Invoking numdiff. (line 6) * Compile: Installing. (line 6) * Copying Conditions: Copying. (line 6) * Diagnostics (ndselect): Invoking ndselect. (line 6) * Diagnostics (numdiff): Invoking numdiff. (line 6) * FDL: GNU Free Documentation License. (line 6) * Filter: Filtering. (line 6) * Filter output (numdiff): Filter output. (line 6) * Format of the reports: Output format. (line 6) * GNU FDL: GNU Free Documentation License. (line 6) * GNU Free Documentation License: GNU Free Documentation License. (line 6) * GNU General Public License: Copying. (line 6) * GPL: Copying. (line 6) * How to use numdiff: Overview. (line 6) * Install: Installing. (line 6) * Introduction: Overview. (line 6) * Invoking ndselect: Invoking ndselect. (line 6) * Invoking numdiff: Invoking numdiff. (line 6) * License: Copying. (line 6) * ndselect (introduction to its use): ndselect. (line 6) * Notes: Warnings. (line 6) * Options, command line (ndselect): Invoking ndselect. (line 6) * Options, command line (numdiff): Invoking numdiff. (line 6) * Output format (numdiff): Output format. (line 6) * Overview mode of numdiff: Overview mode. (line 6) * Predefined settings of numdiff: Invoking numdiff. (line 6) * Purposes: Overview. (line 6) * Side-by-side report (numdiff): Overview mode. (line 6) * Synopsis (ndselect): Invoking ndselect. (line 6) * Synopsis (numdiff): Invoking numdiff. (line 6) * Thanks: Acknowledgments. (line 6) * Tools: ndselect. (line 6) * Usage of numdiff: Overview. (line 6) * Warnings: Warnings. (line 6)  Tag Table: Node: Top1039 Node: Copying2589 Node: Acknowledgments3326 Node: Overview4119 Ref: command15908 Node: Output format26503 Node: Overview mode33622 Node: Filter output42154 Node: Installing44039 Node: Invoking numdiff49291 Ref: Default Numeric Format57888 Ref: Alternative formulas for the computation of the relative difference80321 Ref: Restriction of the comparison to particular fields114096 Ref: Use of the option -X114199 Node: ndselect119911 Node: Invoking ndselect126610 Node: Filtering129833 Ref: Use of the option -f152847 Node: Warnings155870 Ref: with GNU MP is better157213 Node: GNU Free Documentation License163376 Node: Index188508  End Tag Table ./numdiff-5.8.1/docs/numdiff.info.gz0000644000175000017500000014352512215353073016213 0ustar ivanoivano‹¬Æ5Rì[ks·’ý¼ø‹(©²eSc>DIÖ&©(Š+ë‡Ê’“JÕVÅÃ!(Îõp†;I̯ßÓÝÇß›O[—¥’DÆéîÓ ðzžV?ѳi‘TÏòf1Mg³(ÍgEO/ËbÚ$fª'+½ˆ?úTßš²J‹\Fƒ‘ž•ÅB­õ­ïÓH©‹·/ßütñþàêÅùõÅ»·úÚÜ×:)M\Sï8ŸbÈ<]6 ®®ÏÞ_ø^/Þ^¿ÿ]=ÑoeÐSýØ¿i}^,–q™æ7z–f¦ÒI‘×qšÓheÊ4Á“M+ý˜æÉ‹Zy¶ÚW/Þþ´>…ÒZÿ±EQƒ–SSj“Þä&×ÿ]Ƴš[—qcð¬ªñ¤Æã«6©þÙTÉ<3ɼVf±,ʯöþPJ]“>±°&Î0Z•”é΋;]:Í«:Î2^|S·¸žŽIÕ7e¼Ðwó4™«„ˆŽË¦†znM¶ÒUºH³¸´KÎÒÜжð_LŸð?=…U¬¢jAS:½Ð|¦4y‚1ŠòõtÕ­òŠr×UÄÊ9/–«2½™×úñù¾öûãý>âßÇüû„?§ßƒ>ÿðï!ÿ©‹Û8/ôe‰hýmz»¤ÿÇõ~í”ÅãiQï§õ÷<Ö—¦\¤c º„Vò„úHÒƒ¸U ­65¯ûYQêE%¬t ÕË€#V‚aO±£õÜèƒbÅ3~óóÛúeiŒþÉ6L¾N“W¦'ƒüjq>ˆFÐ悲c ã `ÙL²´š‹yа<äU1«ï°w2ÈË"ðèÿ¥ïÒz,ê‹üàŪô•IèQÕ£_–@ñÁyáÙVð)Ö'Ãàñqò)| 38c¸Ee"=é,Í“¬™B0`õ Ðo…ùü²OO±ßÿ©^^§ºëôÛbН‹%ýÙO@Þ_–ææ9MË}¼û°´ÿ+eÑ­?Tù ›„z²ùRê_4?ýoóû·ùýÿ0¿'úÉ›SúÇØé©Þör¶e[áo>My1úñÏ—¯÷1ÀYò)/î23½¡¹ªµÖž¢ý;¬í65wÛg¼Èk&,2À`ú]ˆUíõU×ôÂn·Å'±9ŸnéFVÚvɧ•Å×Û%ôÁ·‹°Ãô—f!C­ZK­:l7”À>GxG`p×¾}3nLi×ð[\OYßûúÈ,šJ—.#Ø%aÖ×*-ŒÒÛ#¯yjîw`JxUf`Ù)5{ ´@"¢|d¨Aqÿ)5pUœÇYUè»2­kÄ¿¡XÃŒÖ^Yã>Õ«¢ÑIœCQ­?Ri½æ’ÒϺ ŸMnJĉKr$‰S¥Š«\KàUzˆGxÞ:¥‘@9gF¾ ®––ÔiÓ™‰«wZ -ó«b/B2Ì‹%Á caYw)Œibj³&ëi´T¿]\¿z÷áZŸ½ý]ÿvöþýÙÛëßÅí ‚ä­‘qRìqŠa±òíäÀÔ›ïÏ_¡ýÙ¯/®'¡_^\¿}qu¥_¾{Ow r~qþáõÙ{}ùáý廫p€WÆ8eªíʤP†Í€Î¦ =³1íwì^©1çñ­!¸DÙ)qèR?·IYt³KgˆÛø ¡.fÄ÷{º‚pçu½<}öìîî.ºÉ›¨(ožY©ž=zˆîlZ€î¥Gxk åÃM»É{.°CðØÖü“~SF˜±?×ç™á¿ß‚E,8@Kd9´gØsþ$7õ÷¤`UaoIGUssc*‰Pß ©vaØý.  [Ù-d`Óx’f)¶žü!¡Õ€‚$Dtà$½5à?$Ð"j~…ðO¶º,Ræh¬¨Sn„,Ê “€ØùA| NµÊ“9Bmú§±a“üòÄÔw†ðyW(!X}@%žJh#TNáˆåÿR:£¼xÚ}T]¨¬FÏÓ¥œèÏH¤ ›ò†U², q<þÌZa…œöžu2Æ_˜…[.ƒö æ!·ÚÓëû¶ë+Sxë 4Ôb™Æú]LâpªÀà» æÒ, ‚yU`[LYeEŒ3£M!D‰Ç¦ÀQVµ÷)¼ï)ñ2.²BŸÇ@=Òè$îa¤ÂAsÈÆCw¢ B6±J¾iÓíþºÝfߤ?\=hˆE´ÀÛĦñxÛùTh | ð])̉t‘ Vð¸ú$tþ®°T\øs¤À[çñ²bXÐr£1ðx¸g·VöÙÔyÅ« #AµÃbE¥6&ÕéË€š3òP)AŸchÄZ`àFÌÃSyµ4ð/ÀA`F3š3Ô»xUÉ.¤€O<¡9H®0;Ø0 KCß¶«]OØVM ‡IL´`ÛP9X`¶!Lµ›13SJ˜á`å–ôšdsa/ 6ÔG´ãÎdÙí7ðC²<òù”ϤZÅ’8ʦN=Þ`Ê2ŠfÙ +aNVÅ4ö¯®´‰“¹´&û”žÞAšßl´Ã¤Ø­†66H¢wÅC¢—WØÙ²â,Kwñ6^ ÌפûA½Z§q4-ã¤æžøegæ–œB»ÑAÃÔ¹¹™‹Ù±£qæhe£ˆNÞT‘—†<•GHÕ,á¨à“lR A>±¾ E¸ç¬."ŸJ)®½ƒbŽ€ÀÖR G—^ ˆî„œ·ÕATW3rYàˆÕ2†[s0½+J’«” $­gËyŒæˆâäÙÅ6ÎrÓ—£Z&¤•«ÕâCT¿¢!÷hŽ=`oFûLÎóÿoC1©‡CaU°*T€ ƒ»¯@¤¦7ðª“ö¤$*"˜ùg‰E zÏjË\I ïJtFp°Æv×µ6Löœ.éÐ×ešÇåT}»ä¿ÄR›ë7 ¤º ¿Kâï[3­¦y`¯”;ó[Û»‡5ÈlUËrˆ”ïÜÅÀ§¹ÁÉxB¥.ã”?ÖR;dÓ˜ðÏ–j·ž˜ø€ó¸‘"Ý|LËV;¤Þ"M†_Šþ2xj$çŽ|ó‘~è=o –N˜„Þš ˇ§•’¸Å1WÈ9“goÂm’IJ'´K+GÔê½GÎD‡µ BÃ!ð‚¤œ¦„ïààQ‚nŠ´~Žé)="Ž¢¸lÃ{ÛaMµxW;‡¿¨€Tv™ˆâ+’T\RÙ J±e)(\Rg¢YȪ̴×N¶m’ª¯æIzên.9gNÅ„ÝYS5<%Çjä\žŽ¬OŠMáØS!3æ$sp±N?ñM³Õ»ÏìÄQ%ögI夜~¬€fY‹ÿ±ÁŽ$$4<‰'‹ÌŒ A$Îà •KP›Š¶.(à’–K¡ÁÂ"Þ'³ EƒÑÑ%û7Lˆ¡N†xÀµƒÖµÓ ‚[1§qÎÞ‰Àq r$µ(¸3¤T$Diê6·¹nŒ ¢áŸÒb´¼ëÓK;Þ\Å ãTC( Ê6¹ÍZ[ÅPt¡èL\†2c-ÇLKá䄰ʦhÁ¬]0·\aеh×ÕO/@'RïÂÄTq!K´N6§!mþ ³‘4ÏÅâ”Ý*jíŒÕžyIlda7-.`#ü+;YiDqdó´tÚ,p&kÒ(>þBÀ¯:ñÑÜÇ g»” 0¡ò,ål䞟£ÃÑpÀû¥žGô½Ñ?$`Ù- µVéuô4•ó4ªJRr3 Íc z^fqâYœ ¸­©IҶ̵\Ϙ¦fiØ1£”B"è)΃v‰kò‰iY4´~KB0Eʹ.d+†@\µÁi–²WÏKcԼɧ%%C)²g—³tV¯Èœˆ+V±#TEºh› n¬ªô¼ ÙËž‚®œ«rÆO‘=×H|Rü^aˆ€Dýñ0‚±ô¾±I^œ«3w§ý/Ÿ†5Ô±‡Ž=tŒÐ‘8ÿŒôSR]|}T1̵.Ú[Ak¢žº)D~³âÜe ÈE‰š‡Ñ³®ÖùEeM«ëÕ‰ãùc’€â9z@ô·N¦ 6Ý… {.Ruyã†C ýrõ'æÈðr ¤%İcO– °ó ìé"·i 3œ^ ØoZšÙ¦JõÜ쎲ø‹b›Ç„_IlYk¹äzÛZØ³ë Ž„ÖFOA~R±ð’'»¡ÃsöAPŸ`0ˆ¨ÞUË>ÇGÒ{OœÜÖ0:9ØŒh€þs½hÔœ‹ƒ¹€ÅYÏ¢v­Ç`àzX¤PÙ® ‰X‡¼ló¥6îIùr¨Åê<Øò@5®î9ã…‚´@1ÞªT¨F„úÚØ Ñ„BjóáIMÅTÄÜýa71Ú É«M×ÊYŠK íy¡T IïKWTCó=fiË2Å~e«=O˜ ©Íë ]nå]XÚäªDµLKN,ÔÇœJüäçË׸°dKÔT«3È(sý*Ò?ÆÈ»œÏ¾Š³Z¿ŽÁHÎ!¬ú§\©Wgq§Ègvt¨kÚz¦˜€aÅδ’*“ße;D¾g—pWØ„á Ù{[˜‹c-"FŠOåÒFbÏ#²•p(N†b®ëÃŒ?‰¯® L(eªGŠT4)Êœ¸yFîi·Ç©Î7ï ˜HaíTª¥-žER±Š+N‹\rB½¨æÇƒ®*F–òüÙE ªJʸ†õ¨iK›3‹Äàk-ÔšÊꓤÇep> ÕâM–N&®·D>r²m%Úê%2bÄ b㜖ÌàEšR’«ÜkgZ8Ø.Ç&^ÎJŠ:W»NÅõ_>6aýT<°Ž¥¶D5•¸.JÚÍ›FjŽì—q=÷%í6ãk—æžM·«%LØÚžY=-T{tجés©ÊK&7\"Jærn£\= ¬lŒ°é6ùH«j,o%ל­¥( µ‘Ҵײ£Èú»?:ÍÿÐÄèdRcûˆW– *Áp¥eú'QäƒñÄÞ‡¤æµk®\óçûRŸdtîôø£^pØßoy©M{v·ÅÐ>’ÜI[‹ëXÁqmÍÝpò¯õpôKQÍ›¸½'0:ŒÆãàÞÀÓÑÓÃô?Ü»;"©jZÜØ÷£Ãñ8âÌ/ØeçÎÁ0Âã£ãsðœßÇEѦJÅÎA°ÜÃmr«³‚cä5©ûý@jæ³}‹°`Æ'ZŸ[aŸ®KéZ[9éÿo¾ùF19äå9x÷œÍƒCr íêì¹þ©½‹u°ö’O¿þz`çÿú”þûö»ï´Û¼í-¾ûî{}Öiñƒþg^?ü°9þÈJà`²½IÀûñwO?¶Ó3·?¦¹ƒÍ¶œ¹‹bõwzÀ ‘¼ÌÁaO¿7óßbØi1Þ˜íû#+Œ˜ÀÚcyA'Ákr Ê›á{Œ=òlHZKŸéÁ¸’éWŸÇÄЯyh¥ð†·½ ©%„ûNÅ<úÇs4èF#sp¼9Ÿ ¬ûCæ<þ›ÀÙíÐÑõ*[›±::-¶¨bü FN ¬ñÑÉpp2êoQ…¼ Ò† ‚‰Ÿ2ì"dðO#d´K†‘—Á;‹Ö‘…¢ŒþQ¶ qh?"±îïéÓ§š®ÜµÓ ¨$A ­Æ•š<‰¤JS®Ù±"!·e±Y‘eß·}[˜ªŠoà«sUÕS|v*Ç£ª3O³] \.G~ .[šE\~’t¡¬›Ùµç’üÞ»ÂjÏCO}µ]˜¢KfÝù ˆ£ŽŸNR¾ {€¿îŽ­¹¯Ë8< ذ/ãõôÄgU2Cý”Æ9ÐùƒÕbR€§ö”Ë>»uÍtßHí¹ÉS0?›ª—1b]5)UÖMV,¯ëÉÍÜ-×P÷%Ghy$˜äkMQšÓGÛ /W_1Eæº ód’ÄE@`tîC‚ÛÆ×W6&‡»îHeÅ4[q)Í¥nokg”gDút_*]¦=± Â¦œ H%6{'÷âÝ¥CADp=Km½ž¥¿ðz–ê\Ϻ/[µ% 2Ì‚/ˆ}í‡ <|±ìUµ' [Sø–Zd.Òé43ráB–@b(ºž@õ]¶¸ö&KÁyáZ%WÀµÂöÆß¾¬Ô€Ád\®Dû2¯«$É™®½1Ð&¹è7°×q¨ŸpysŸ˜¥»Ÿ‹y³ýØ2œÊÒñT‹¼Š–=J—Ù9ƒÏö<·—DÊŸo¤¬í7·î¹ÜÃ&ðDä$ˆU’‹Ê‚\ë&fmš‚)­j#iK;Íâ¯í´…N­Xë+ªé*'ÙØö!ã¯ÒIÆ'{|ŒL`“+tM1¦/¸k…ò• ìè”E›º{ðüÝ ‹ÇöjQ´í>–ÍIUÙÐ6¹_ÖÞßö5̶æx!ñ„ïÊEÞØÞp5SN;aÞb¹ûò‰½¾¿ù2Ç).lÊc¹M ×*.;Wµ»ãHÇv^Õ }9î$¯ê‰Cû8È[Чÿ‘nÜ¢Òo`Eó6ô¼@(§›²j=ˆÑü—8ïÑ7”t"bù/ÍdíÉɸƒ½‰Ëµ'ÈØš)}¶\2‚qQŸÕzŸã“hˆ>¿4›ô¹Ï/M¶öäðp ð䬹Yíè8:ÂhWf¹!›Œö.©×çé¢Côy[Ü®=Ø>?™d£O?F£×ÕÂ>ÃçGƒè¨Ï©°Ú½I[·Â)oSá£ÕºKy»U´[mÐïø°ŸbœŠ¿«¦ÿ!'‰¤Áv‰aÂIÃ3ši±¬m¨Áš¼£ó—éüèÛ”)Cm$,uÊkÆiÕ,œÎœÛ+{T€ÈIëƒ_5#J[‰ËA¥Âò€ Ã_Óþ•÷Œ8#QÇ-¿“[XÁõ_‰«-7ñ±‡¿]ãÎØ”ü©¾ärÕ¢\ˇ欻/Nò>;ì(ö3a¦+¥®»áFºÔ®¶Ö©\±£×–ªÀatT[ªƒèädtrr8˜ƒÑç—î2a^úî8ú¥‡ÃîÂ]±Fwõ¡[n¬U¨?;õ9~@ŸØ®“ñÑøxtÜ›ƒáçîjÀ¼ðÝãKõy»›†|é°.PŠ´;™Ê; †ÝMf¾xØÃ`Ø|gMcÎL·s‚õ¡Û"7¿>X[áæÿ¦ú²ŸÛ»ˆ­+ \D¿ÿ9H£ã]Ähܶø¬‹h_AýÌ)ó/ìÙ‘ï¬wóM×xà‡ÝÒØS²µ¡½m.pvˆ]šƒë< E5æéh«æŽ‡ƒÁÉèðpxbžö7‹‡X·9Øî…_¾¤âœ¿ØÄÇØ.2EÀi|Ò¦úîü^Ž­„&Ú£]Ÿa%:te=3é±yœ¢KQ‚ÙÂÄ’ÏÂ{í"üD0ÿÿµ÷îÝmW¾èýóº¾Äí«ÌY$e“¯ÄY¡%Êæ‰Ò‘¨ØIÍ|œ/.§‹˜©KÅ^ ´e;iu•/g¸Ðb¯ÖÚ¯Ú«B ÜÁsv½D’ÐYsŠEÉŽ>R›BÕÙü(ñ…߸Ÿ ƒ¿-ÒyqY¬Êù]ÐÄGÜðÑ0×_ó´é˜!ì ˆÀD%¹„w\Ø}âu–\|µ3-ÄÓ&IØ>ÿ( ´Ä°]ÈŸ¢C ´y‘¨‚Ût(ÊJÒdΑN<éÁ®Ÿ³¦5&s&¸Á é©ûŸÌµŸ‡ªpšŸ %¡FE/w’ÝN²ß±,‡eE‚âÂs(I ÃvÄÖ¾f—ü»ÍÇÓ)Ÿr4©eË\!†\ó I³ÇfCÖȰ1„ }huR°ÊÀLŒs¸¥VE©‰N7¬±aŽ»×b°Å™† "œ¦)›îiÄy-JR®R¶GÃeWƒX²›¬tP›÷2ïQœÙ EÉã¨É뼜g)Ä` C+£¯„þÑhýó3j}«žyõkð±² ˆŠH>åOÝ›ì&\wÝŠ;=âÓu.K"?Ó{/øã48¯¢É¢«Œ¿†&±ÅϳÀ›ôñU‡½a²Ë’ô—ÃF‰q÷`ww0íw³/ŸM¼ØI»y5~Ú¯:¶ßü5­úÝçZu߸¬zóLüª³i˜:¯­úž•Â'Ãu«9IñݘÝÑÈéØRÛª”µB&Ófº®[+dÕ1Ç_#3?Ϫo°”„_Cßbv§ÎL%£þd²nÕG½ñ¨¿»·7<èïo¤õ0•ø‡qÕ[ÝñÓ~Õ±ý毡Ilñó¬ºo\V½y&Z+]Ça&½³ø5¯zøÄ†Ußãî™ÖÛ|2áøê­.—øiMëw~Õï¡Ilñó¬ºo\V½q"jÑׯº={¿¦ «n÷tbÙ;°Œ&ënXõ°ß}¬é*´MámºZü“LW¡iŠnÓ¦™ÜÛt5Ò1oË>íµë—]V™—½ÍÍ>ŒÁy­R`ü´^ö¹_öðëõM~–­pþ^B2['è¦HŽ¡äøéÁ¡aTn²$úÏ(D¹÷=[iž™ýösMm ¦Ö§5Ó+eÒêNŠ¿vM~& t`(EA¡i"cGíïíÖÛQõœ*ŸîO ë‘•L›#+­Ä¤L¼í¡•Ôz-´ÒNcSl%5Ý“ú1fe—òµpÁEKLŠF;d‡íbMvs¿§‡[,ˆ B_r"4k[Î6ÆW¥auHßæ%§xBðd"U!¸¸èÍÏë–*Œ»EsU"°Û´ Wé{±\À3F²³”=ßUÉ\!"bA+ŒˆsvGÙüD±ZPŽ×‚eÈ2 ¼Ê”B5–ÎHaO"–YÃD(¨Z"— SÚtDc“5]ú¡K_,`m1<þ“Ö Ÿ¦éþÐyä>ÚÌî“õ&æVE7è¤M/óYkRnÕ0¢NšbÕÉ:‰¹U´ :iDÜ'ë%•ÖÛ0è¤ívrŸ¬¿¾ZÙlÐI›Jà>iÓÂ?mN\üí§dô‹¿®§ÎuÄ—EÓ"Z½–òÁš»ýãÙ8&¡QÄ´ó0¯AXFàyU&ÿYœ‹Ã»oÓ»ŽI˲˜æ©$ ±Nvf~Ç7%U3ÄW«ZÅc~‡ñ;Õ2C¯cN!ÞÚ<)ójňDÕdØÌoù>ðõ‹¨%ˆqÍ \ƒBÖË«¶¢0Gà'¸ Tz¹š†#‰&/Jœ¯ïÝ©v‹XޏÌþºÊ—̘ÆÇZI.r ƒ÷vS`×@.±ÅðÑ劢¾ehÒ*' 0‰±·ÚôG;¸eËJËÍÚÛá·s¥k Á¨Àð2£ÌòÕ ÅCCbò¥_;àgJÌ™ FAMw$à˜*\ ÃÉáqQ%wŸgW¹8;§Ù‚á!Æ}[ÿð-‰‡¤§F”ÖZμ Ž“hidqSÄ”%OÛTGYÒ é‚ÿš?pP8ô!=\ü7N¿ë^x7ÜϸoÄ“âB¸]PõÑ!؈|¡.æðN&ääp?Q~ô©,›ài@lŽÞ>¿“ln¡\nÀ•%Áv_V3À)öX÷À©&Ž€mÚEYbÄ,ŒÒÆ ºÛ#ðM Ï+ ™ÃÊ>Ð%u¬ nÞ®žp †çÀøºX×XÑ$|Ï|ÿ1æe”\ÉyJØ[ÍE˜œ/äˆHú8ú')iYðl(Lö—œIþKMo‰gÿØÄqókâøGtÿkâ8wókâø¯‰ãë)ä¿}⸂õ¡»9D§n¾Ôr&<ä̼ɛé48mÐ-qñ àM¨È0† ¶†±D<+Ðç ÊK6£•XYêL#‰ÄA¦‘‡ ¢“Xµ|é —JPrÉÀ„ç™´ìè»Ò^§µà¦†ÒY ý#.7ÁÁŒü7>LÐ5¥r*° „êâô;Ì4LvQ%ª'-ˆ¼S«¾pUܦ .J!¼ÁiÀ˜ÃK©áTߩ⚆×8[ýÁo~ó@`½˜/¹wöûÃd3T‰²†, ù«q æHÒ;ãå_À…nÖË)ŸÁ†ûuÈÐÌHñ²lü…Κp| ò´Èèi%óҫŘ¾(CMa¥æ¤8¡d¢á(ÆÉ„óáá#=b‡}›WlùM-ï¶{÷À®ûŒÁ|`×÷8-@˜~ŸŠéÐ9–H{Aðnç—xÇÛªi„3ç6ÖVvÖ(NKú@öA´Ë”ÿÚæ‚>“Ž«B×îØ#(à€ÖÆQ½žSUââ0¥Je$ôä•򠑦 €ò‘§¯r¹Rï¦ÚˆÞí£á‰˜ÑhE'ûñ„Åñ¸¢ñ¸ôôYvj=Øþv#Añ¤Ý;ÒåÞ.oÅlE£® Èoš>ß.†ÑõSªÔ–h-í – ÔÑÕ ±ežºC¡©{– U}G C®||±¾ýÕçëäepÝaµ•ñO0%!Æ`×ùš%•À»ã„/*2¢•6#J[‡\%ˆOýO7nÀ‹(ÿר«HŒÙoˆø -U¤¹3þôO¶dtw~«²ðà7¿_< ¢©¤í‘´ˆE(Zxºªa<´¤‚VªE“ö)w9ÍÎ0J®Æýçï¨AUõ98u墮–ù‡ê q£®°BǺ™+]c›mÚ;=ä…æíìCÕÑšÞï~÷ð÷¿O¶o¹˜”ǯŒnlܘãŬûâ¢û”˜7„¼¤®¢¦þ”ö 2ˆú‰Á‘MæUÚx:,f»ûÝ()Ö<Íä{~Ë@´o=.[Os6œ5{ÛÄÔ`aÁGfT¬•gZ$Ôk04Ì]µDˆX¼Þe— Ò´ ‘¦;u«Œ:u (aVÈ”¡–QÓ$PÐS˜‰ÇЕ.õrØúR\A$ÔÌ¥à |Ðêó;ÃQlÿº0‚oÎÿé…¿n9ßn…ÏSûfxßÐõÐüòû«6¼¹öéj%ÝÈ×TáßÅœT® m±è|ÆîÐlä ô…E)ðxƒ¸z¸ß?Á¤x¯ò™â¸#w^àDte4c×_ì䆭59ù"i··‹N亗s–—Vrº‹X‡¤¤Jc‚°üÞ²,”Ò0,d B( ’æ‹­ž‘‚%êøs~e!âGkl`©O;üë-£N$®®?xP#ö»ò*Ëj(ØÀåÍl6^eó5üƒ†—±y ÿ q`žàGðÈ®9†ŸÁ 0œ˜§ð3Ü£]ó ü ASãó-ü q÷»cs‚MÀïóïÐDþ#x/À1]i¸‚ðQC ç‡×£öú#?F5ʳח¡ö‚Áöh¸==b5æº×?`pkTñ"¡MdüŽa;Û5"µºÉš?áLñµëÞ WÿQ;×úÚáÿ{X[AüBmõºnÃÕÆa¬ë¶¶3ø…¢¤u/‡»ˆŸ*º[÷fmÇñ E¨­/ëÇ:ð_EÖ뺭Q~¡ÎAûË¿;l'ª»Wèx¿~é®»O¹ýzðxãÊ78¦¤Û†k„ûÃw^,¼Sž`ÁJ VŽ©8ZÃp*ª@¢R#E‘TxbGžA·2[Õ°•ÔE(p£Jô3ÂØz$:„V§œ¤Éåªrpžž/ëÚ—ÀŒíRšwªmÉ9÷gš4c¢.pp,@`ˆ{GË Ä`±™B•%ô°ðW ´Þ4åE?NjF¢à |DGŠGtOðïïñïÿ^âß/9 ¦{ 0 ïìAÙ0)’ïµ}…TšÀëˆMýN7u¡*fcöUÙ¥‚;ÕAhç÷÷kG“ESCI" øÁî..@/*ÜÔÀ·¾ð_…Òô@ÖIèäÐTåÄ ¯@I´ëUXêÒ•©;.6¡öTÔ•“„bû^Pl”ñé q¡}"T¥ P茢oóYåT¥Dê$’ù2¨D/5™)®´.²³3k–]¤É–G¦|Ýc³äU&ƒQp{’ÛbÁ52~Oâ¸%Ó}1îÇò ŸÊñŽ6Q±à׉÷–î% ؘ|Œ‰|Êw3w~lS-W 6S:kJSF܋ḙJ5ëv¿Æ,\ýÓ6‰#êˆK'ê׈Îé=!ðˆ°éK¡èˆ˜éK¡âˆÛ&ê׈°é=¡è’¥àMŒÑv KKÇK4ÄÛU[•lœ Ör@T¡ÔÒfPÊLzfÂüú:›QW¶Ç(ƒ–I®C5Ìù1VIK$82 } ­ìNüCßž’ñèt¡B©Œ•BÕÍ ›7§PÌ\«‚ 9*×y%âRªú5 Úè’…>h€jc}…ÐK*_¢›ËÒ‘ç‹ #ÃV%/h’`Z†¿ßàßÇø÷E':·Z#ú>±GpB¥ƒlÍó¤Ä‘’†’Åtí-&VX£áÓÖVª[ßàS°QC¤~~a0°³u¨óÔ9w¤¢bÎ3È‚Æ)aµMˆU8TT ²?;2ZÕv‡åæ|Vµ ’‰–¬Þi””º­‚x%µ ¥x½¾ªp£Ó®šÄ~Nõ˶&?}”>Pûó‰öAÛí§ÛíËŸh´oþWØm·ŸnL~÷‰WœŠi‘/ ГAœ%[u4‡ü±\QY Гz£êúJÁ#]EIpTIFë½p0j$[#¦Ú6×6àß^|X}ÈòþŸðïƒý`XwDç|¤¢êo—P/I):.êÜo¹Ät6!aþ\ Ê_-9æôlóé‹==Û|dâcNÏ6Óy|ªéÙÚàwñ9¦gk›ƒ?ÅÇv£¨9º¨¹ÿÉ’æ¨.iîÿÍQ`I'¡ä*%•P*"@UÖãEZ¡ =~âƒP ³”wÓr ZHxd~6©ÿ®Å°î ÔèZi&âû]M®‘fнßEã‰ï‘uÇ©ùÚh>NñŸÃß7§O¥½×ÚÎCÞ|LvOË;9T˜Š: ÆÕ@b8%÷ó¯Ìe¶À„{®¯çKû1máñB7ã*°F^úãWTjÀ@ëÀÚ I GVA[À2›¢‹¥€›·ÊE0@V|¡·, „JtfQü%ÞAŠÝ…½²ÊŽY R¥çIY7%z[ì7x[ 6‚/=¾!¦¢%zbCŠôHâ+d‚z…‹¥8óú†S€¸†ÑPWü¶Êæ§XýЂ®¼Jœ]Þ&;Ç}ü1݈NÑšßœ¾IJ\í™ èܘóÕ5§sÙa°³Mk|ÜÓà€S ޏQ?ÜßDuû3úÞ~Ú0 ˜paTž*ƒ¿Íýó§V¾äÏ¡“ßm™wÛŸÅ/÷{ÛÒÎgñ̽ûá#fõQz?œê£Oi5Ì/jh6A¬†|áÄ1-OöƒaÌ K8&"±æi‘Pd‘ããÙ ŠÈUÖ`,”Ô°ŽÈNA¤º¸á|ÛóÙvÎ5.ümÁ9lJŒ€Î®1/ñ<Ó3SZ6’Í #-/;[ùƒ ÑrpZ-…ÿ°Ì­)'­+Ò™=Z^ òóØâ𠘔³›ÔLZ½¹©uSà}F;;â±…ò$©Až<é•.Ý9ƒ2Àm¶äPYLÛ1Qgž½/ò™Ã é¼q”XÛ¶ò ±k›ofDGB`ØÑÛ¼„å] ÈR5etX=·k÷Úî¥àq`'b8—5K²ér=»£a]´bÜHíÊåÛö¬¸1f¬Z0Õ(òøƒS»+X) =Œ’Ì”™dc»¾ÌÌÔJ2s¼RÄøÉ~|±–QLÉ"9:}}b…]nvéQV>­ ER¤S´Lô[`¥=¨}%Jò¡ê¾.Â3sLðâ“-4q^§Óe¶GŸ\‘ùÑ=ÖR£°nyžŸ/±ð‡˜dýv"w×3l A\3åÊÍr€•*(•Ž,¶~“¢ùÓùjFqãÜßޤWÏoÁnqiòòÅë“ï¬R '9Õ0Oïàxl%«*ŸçÕÙ>!{Þ† µ\?˜MÿGä•ÿ^dËËäµ¥jNV)d£dów …n¯ë—iß.Ïòš—Ç®ú jvUÈÉ;FMÁÊq7ÙR¨Ìµ#<Ë>À9€äA2ÓRR‘#Høí¬˜®Ü v8¶ÜÊþ¿vÕEA®‚t²ÑÒ…¤4‘?¾àOk!I¯çéôÇ[KôÛ¯v`€žå‹Õpù ½uI}­tÛÛ•5ÙD›%w 1ZVBx–..WöÚÞñè„°Ó@8=ð¢!€-#ò‰ÄŒ™¹Ô"'n¶Í¾ë‚k"cžØ—ìf™àÈI²}Y]x¶CΛG;ë0*¢íNʪ»J“¶ `ûl»‹y)ˆwì—ìP›òa89þ"3âû…•¤WåòŽöÑy¾ÝE}¬h+ɪ)£5b„(^!w„ §öjÇåX€Dãji«©ÌP—^Ù2ìßçv| I¢Ã7 Sø¾ú·o_ —Û7Ï_î`\WtËé+΢XßÈj©@€Ùì˜Ò9G6ì×2˜7˜Ôón.àê@üW°ÎÃñpàÛsÜ?㨠RbxfÚÑz÷‰to»ÇãŽl]õ(ó<ä¾ÊÕÅ…=CÉúÀ€"ÑÀß+_- ”Ôq€ÛF¸UâÕ”rºÌo*á NK"w0gŸ3tô}Íöòq„v¼àÓY­Ù¼dÓæ™‘1öVŒ{¤\ºÕ$IÚexà³n…ÀÉÌa¢…{wQÝ>zdÿî].V½byùÈþûÈÎó‘å.¯3òíË·Ù¹½.í©µ/^Uøæ%œÞs|‘Œ`«›nUtgm¨‹*²÷›m5ƒ#Y"³ÒªÿSïô ¬•Î9©µX"ÅùðõŸN_¼|}òú¡qûç\õW?‘êðS÷½ý‰W“RÔêá¿tËääéëÿøK÷IòäøÙÉsø1Mξ}õÇ£g9|utúÍñOôÏ€þþǸVþÒ]nxô/Ý¡ýïirúæ¹ý÷7üïKûß©ýïD75M¿yõêôèù±ýf–<<†W+ùÁ^ƒSøáF>YÈý ÚÊå«ï þÿ³úüÚþ÷­ýï‚ZT-ÙO¿¶ÿÍ“—GgðHA?$OOžðï¡1tcÑG VáÇè½ZÈL‡,Òwb,Ž¥“Ð^`+´`&¹C:Oó=qDÀca´­%}o–( q®û¾d†ónÐ zÔ0+ÛÛ ²æÈÀlº´ó¥ Ñdk<ô‘qàV‡;;¶ÝG0ta”ÕÖI7w˜óÙ±·Ô ÎÀ%žØäé‹îwéÒŽ¼‚RíåÔj¤×RÌñúHh;úoÒ;tn€è=s ®D³p%’¼Ù£¦‚¯¬ä\r̬ŠÐf-^+9=qB²a&ƒý] €$j·»¤ÞŽ$â|ˆ¬/ᔼi\ˆÇÌ 4ð¼U_IŸÃéCCè:1™æÀ/¦¸®$âkä«ì 8øV²=yq üé]×M·ë®Ê¯,Ãaoëk6ýÐjãJø` ¹¶ÓR• `Ïbiù6 ×ÔÝìâÜDèÓB" ¶Ï”&^ïDü¶ÐÁ(¬nB¾×Ríˆ9.Ûª÷m†±×ƒC"þá¡«§yóÜÈ©ëÅüÎ¥,Fi+„î‰íĸ³ó,pvÀš>5õËò1ïöe-«%Vøå¬)ø¶¬),«`·YQÀªr`*üjí-'«ž¡:B’-7ýˆMœð€¶ ïdª`¶GSò<ùx c½L—3J`ò¥gôVPŒ}I8¼Ø)Ý.’½ãÖÓó.0[Î2gÐG\TgÍ àM U쀴ãõƒæAì€zç5R¿‚`&´‡X•­ÓÂlæÙⲺê.”Te<¶Ô£ŒÑí9¿#`¤`$ÎSÑ‚pM×­Lg4±š¿ÏF ˜„¿ÒÄ¿ M ñJƒBLÕ–8, ŠIïT:w`º¥Àå¸pWžt~ùåÂìÝþe „¸V…†~_B¿"²wU²6àC ÑÚ£3¹g+4~DŒ£=¡ Æd¤Z#îgÔV€Ž­`{vȧ0dI>ÿ‡ùr™¥¢ñž£–ñ:i;ê5lvAðK6âÒ™ Hp¢ÒzsGÒ¹ª©UBƒShpºZÂôî¾7$ù”ÎÏ’ ï* 4èz| ÝÛ˜ zž­‘§PD÷Â!½vÈR§T“›`b3’@§ùu:·¤iÅï@énA•dèâ åts 6 Æ=-éC¿ô %ÖJ8G^¯ø”Þ]3‰k& ¦U‡1\Â.—Åê¦K÷ÓW`œhè¼Æ ¤ÖnÀˆ¶eÂÚöz¿Af0_•â”n™ù¶Ä0îIJ²Sý™å1+Ú<ítl‡¿±ç ;@Qï.艩Ñw—AwÙ{†í–Ù…#a[òXBµ÷¢;Èñ°_§—ù"]ÞuW‹ü“hص>Ìûñ÷45 mûŠ…FÇ晫WY’½ ÀÚ´r‘ç.‰¸Öòð~-khMÓÇØt‰SOçÜèwÈ].žé:,£Û†(cr”hÉG†e§áßuß §Y]_ß}Ž>© K”¸âY{M¶±;LÈØ!œÃΗyv!k)á¼Ð€ ”µË8Í–‹¦A=ªxŸ-££æ „Ö­zÐï¡_ûÖyᮢ§®¦ÏÔr‚5“z9U Ë+Ô·pÍ8saÉ2쿇}™¥+þJåvòÖ•d`ÁÑ´™HTŸ' Ô™n 2¯™3a4N6£Yùä Ÿñ<9ñY{RâòU%´háíX¼1fúèv©Pê…}c*CDR>Á«&.‚ß)(Æå…¯lwvW£¾Ëw¹aô¨ 9e¤ãgS;ðô†v –vH§à“G„‹Pše¹ŸncG@"øë*Ïðn.í /ª¦sRéH=žŠ}ý5)Sv„–¦"ÍØjë¿q–ÉzÃ:_-»ùE׿ÏÀZ¡M øÙ*T|íY‰V+¦Ù +ýúìŒ;ôÎSå lG¶fÄŸeó©÷§™Ù¥÷ŸÝ¸W —¶ßýüŦ£f£X?“õüùkûyFxÍrH¾Â-éÕø5(Ñt…q­À)f°eÄðy!* 4û-ž£›,›uçéò2ë"¯[ßÕÖW`eç%+Ïvs ¸(å‘:²õÉò™ïï%ñ¬¬º”H°ÿW«…N¿r…©ÑŽSújÌPθ”„%èïú¦rÂ`\àÙ— ºÛ øÛÏ`»í|ÛåIöœOe»þ*BÞ{ÆB²}µ[¥ç²ÝÇø ˜ÞÉ/Cx?ùBºeÍ•ú¢U»á”V¦±Í%›¡;ít€!ÁàCØ]ŒÊS_ãE¡Yï@×W4¸ãHªæiìCõ‰E“'Åß}gOFñ7lx ߦ(ƒ•ݪø \¬B’yÉþž²´FßIpè7(+Û²óƒ9ãXhß(PòÁÕlìDJ0rƒÌPƒ][W ÷eÖ„âøG^”êfR<‹CËð¾gÌFúý5ŽS+›UËÜ AðýY¶¼&ÒSþSc>99úæôÅ볓Çfp†z–Õp÷Mz¹ÞÈ„«S;;Iß]+ ùPÉ«¤;H¶‡“ÉŽ³£X‚Ã}Ïá“ã§GožÁ):~uò8yúâÕó£³dûBrTc}jçðaò8°a|•< |ö'uá«ä]o‹gR×ûí·-I~©ÙïP_÷j:iî_%#J)´r4Гã`éƒ¿Ü ¾wü@¾ïÒ÷/)°øa—hÄNŸµOeôÔkªéQ/Ü+ ö•| ‚D^sæ"ó(j3çÜÚ†£8GŽ „¦ÿ³8WÅwN’)ÚOgTÅ>Þ¦ãh›œ `íVdØaM”ú>Úº@8¦ß>ƒ1€†:5•ZÌê¢B÷$z¬¢Â.%íµá´wô ez椲SŽyº¦"‘i¨}•kœR@ ꤣõ…³¡^a°&Ñ÷P2šcüˆ/²>6'з õ¸G½~ß×ã4ÔãôF»ò¿¬;\?9©h c ÷8znYü„¯=ÞØ€¯;N¯·Mpx ìöû{ûcxbýg”½‰l£ijŒùÍïGICýÊÒ4®_9öõ+‘,×Õ¯\;#A{ÅG.zgÒx¢]{ñ4QhßÓÓ™„ÓÙXá4½ã70ïhið ÈBÇÀ‰)ÅØ§V¥ÔJñùˆŸ“¬±Ìg3ÈÙ½0r¿a®T™) *½.V„’-Á×XÞ ER2òY¡¸U–ù{ÄãÜ«6.|•`7* {™s™Œ`Waö¤æ•Šuc4ŠÓ´$ˆ7J†×•~†ø÷)Wý^K‚K¶ÄüÓÕRsrƒ¢¤‹ä¾ü¸Šž\“Mç¾v)çwÒGxÓ¸»SË}ýQ¼a¸ºN*xÙh3ô;+·w­OM¯ºGµÒ‡Óü0‰ª•Àë-Øÿ6÷•†îÝì=ñwYZÑUfH8•KEQÞ,EÅfõHäPMÚF† ¨µlcõX<;V‚·rEu×ñH~ŒûŒ‘2ºIªo¦K1öª:Q;HWDУàQ»öC¶;çTdgž½OU£é gü¼ÑÀH!Ÿw¥sq‘ë­±A^×>Y4…X†1„†Žã¢óÝq€9B83=„r¥að]âR=œ@é^.?âmr ðð×5ciâ‘‹ÂY¡eù¿-ï3œû¶Ó80ZÖz«öµ€Í¬_qÓüÒºÅÀ`¼¯ïÖ“l)åà›HN ³ª‚Xç¿xÒXÆ­ˆ¨r …[“v÷"²ê+‘5ÊæëÈ ×b¡;̤£ *jƒö =Å\°l¼`£°zò…¸cƒûÌèû,iºÏâhk€<ÌÁVO-2%”n$ ™‹"Ë(l[Bì%lQl+ù2ÂößcÇOcí\¹¢X~ßÚÎ}I_ûu 0»†›âØ4e“Èe8JEú4|Úu\R@n-OQ$Ò÷íhßPða—Ž¡øRv¬Ä:N¢×Y¨o]”“ TT>#͸\š˜w”AÉfÙßßz<ÅæRâz$ùÝäL¿¢â×TI™{,:fhíyNŠä³Zä×Ðdº¨Èdc§†ÆÃl^ŠÐAƒ‰§G¶L‡`ƒ(ÃhðD_ŠU(ø„F×/-PYÁUCÉÜtrU4fq÷–ýâÍ%’¿|ZàV•üÂj•øÁ*N±?ƒb÷õ®tÓ°ÇÚÿÓ—ß‡ãø½¡yü…(ɨÇõ-ä=þat¿72O¾‘Œ{TxBêq ¸…ñ`7~cLňûY"_TA:h¬ÄpKeÓX6«`gnÚ‡ÅèËJÀB X{×/EoÈ+Á#³륀•ŽÃq-Ø$1êñ·væz-`)Fዸ½±ýo4¤Õàny9p5â—Æ\Ê!¼›M4©í~’¤b¢åÊËXs,“Áð’ >³zµ³yÞöU~yH  $Õ¾ˆ€M³äÙö‚®JÃõ?ínÿ„ Ùêú)ù*ù©kw ‚;>þ£(EÔ—T#…ðÉL²–#&k,°VÊ åk4ïËhÃÆ(Ï¡®Í½ÉÆô›C1›Œ¤$Zü%˜€NéÛ&ë×îFãÐÀý¹·qÈ›®ÆÍ_Á¸ìqhÖø6«à‰z/²4–@š¿¤!Œ†ícØÿÈ¥©™e¢³Õ`ž Oš1äÞÖ×s@µ?Á^ví¦ Ív‰æG»Ä‰qwl7?ÙCÀgOBtXàˆèë\H{4qÇaǵ2å` K€OFO#/š šò©3¹.]š¥ñŽd¼ä}¢ìPÝÈM(GIõ¶°h[º%òèbR’Êŵ¡‘ÈešE.RíI†u>-Œ˜|¶l&ðtvK‹…Ù~w¸µãÝÓ’„“ÆŠ*‚wàÀñrç$iþŠ$ƒ6.?øÔ›Æ÷²—8/Më÷0Š®~àSü4Á_öïçeó Ôà!“²²ð§«e|/Á5Œ"\ {Ždøs¨îfµ»Ø\!ÛOs 6.ï%X †Q„ Ô:’pF?w~AÂ\°@ £¨u$áï±@ŸU¤kP&œ QGk0'(àq‰Ø‹«% DЃ€Oùû“ÜKR÷óBß6&ö4Ü6h(a {uqy^´ú‰c$HÊYCu({ƒbÆ“´ˆÎAŸW-ièþŽ4% Ñcv`š…ÆÑT¦^2ÏaòÀ,–=TE[Ô`¼yðÇáÄR¨ýilσ¥’µZØzQb8Y+E4ÎÕÏ%ƒ‡ÑØL(V1µ^¢^rZ$·Å‚L«B[±”Í‹`X‹´‚Ò´Âl”\ìg2þu®²_o’FùËãߟk¾8/³å{S°£„d·qÿÎÏÏI0ÛNر,l>9»åA¿è$J™ ÍR7m²•]ªêè–N©§Ž+pƪGPÕ]2ýõvþ) ûÊPdw˜EàYw?£ïƒ–6ÍïŽ]‚mßa†^¿Cšàêz§]×5÷?ò냔%8Hþs|Ü„…¤¶Š’ŒhËZ9…[*XÑÂÞ@“Ãqwwí­‚!{±ŠêÕQ}gKðu(À¦àF¶ˆÖjb*º"’" IÔŽ>AÞâ\Ë hJ陵jn“àѨæšõjn²IÍE{Ïmzg²Ÿð«È®—w°¥M#’ðp°J-þÓðÙ]j%Ð}Í1¼bKB±Ea›Eœ:kÝá5h±ÐìÉG9:à…“OövÀË'Ÿìò€¾ÿøI~Ø\X%š; ~‚xT_›Ý Hˆ Êš’C¾ 9Elñ ?~¸ÎŒt½ ¤vöÁ²©ŠâytunÑÓuጮ çûµrho8f⊸(nŠ•ŠÓw1îðèJÊå¹0A~ÅïV‚¦ÇæÕÃC4T ]b·LG±#%k+vÍþO‘JCÔ,d\~¹({‹âÎ–ê ¬ãÉQÒºñk_£„zÿÄïÔâñ7£ÐÉ:Ñj½En ΜÌdùE€áRŠé1:7[)C­Ù(îlâ“D—öà¢@·j¬Ià“ÝÕÐáí4ª˜Ò/yz¬•4\7õQ· u³¶ynšje`ýýÈÛ¨¾©á>4[*q‘”ÚhÚ –#ŽŠ…c‡ª»r‚$j#wFó½D÷vê¯Ô5뮜WþÊ´.T|zÅ?Âá `'Ô4ÊT1Xõ[câm}#®øêþ±FÜ]€}²]ï¥+¶}ƒ je8ŒÑÇ+àûÉ/Ö–,ûôµ%Ë>¸Ò®ÿ“0Ó>Œñ§íÓý á>ý¢ >,àiÒ–}Á°Ý Mbcû0>mŸîoY÷éeY÷1 ÿH˺ìÊáí†uÓ?}§z£½‰{bÒÜÓ:¸S¿ÿèñ Éí#ípŸê1u¦ŒEtbe^FµÛ»7M¦òu]*?/úäŒ=/ׇãîÞZÁ€ì÷,_¨<*³„eâ}?öõ/#Küz‰7.Я·çgsÿmý+ßÀÔV7bïi ­ªÂŽ@wÏS«ã—F›(Býì~l½=“ƒó½«µ €À9Ñ \—P‚mžO«’´ldßR²=À¹$ðÕÈ+œk¢œ½{·¿8^£±?‡þùkѯAD¿TׯîeÌ8hþ Vû¶l\˜p x¿†15n‘ïE¶h°Ûü²p´3šÍáú›ôß#” Ø÷§b[E…öX¸iÒ!ç£n˜eÓºö‚ÔBnØGà"npă¯È°’nÓݨ‘Ã8žªf'¾ Gf{ÖXÂg$«ã§î|ÐUS N^êÌ»´4¾ËÇ&Ò%*‘ÎÔœ›zË`:hsÉ X:èR¥ƒ•> ÎËK° Ì6XnX “¨g‹–””YFAÕºØ;8äÃ@ Fƒ-©’wc„†§%’¤h±TRe)—¿w¤Sh@¹¦%FŠ_^#þ³ ²æœ}›Þ‘ ÷v1x n{A€TÑsc®Cš‚Þ.†oM.)ÐÚy5¬¼­ÊFÑ”ÕêÒÇxÓ¥ÔÛ£¯~Z º‹áOo{áôõÛo_½Õ-rÞüÛWIóøÎ]Æî³å$-ÿíÉââm²/ìÒåÕݽbŸ 8žk$¨eP\Û¬8‘“°;zG nfÛÎã§Nò“ÊNË0&1)ÃÕ<^ò¶Ö*¡°ÒÆp¨5¡C U9>çFÒöõð­%¿ïH¡‚ô°Lì¹n¤Ç*‰Ð%ß¾Ú^ ;f1ر+b¶ãb¸óö08M\ƒ1¾5 áð¨/¹:Wc¬F£^„{ÃÕ¹áÛ%{¸ÓËVª€\ ͳ5 ÕŒžÛøŒ¥)¸m‘¨6æ§¡!"¶÷“ÈÉÃ3%5YYñ½„]N¡ò*q!Œ°áJc¸‘–ý#j ø1ƇÏ%4´Ì©Ð*ÀYšyz^ èð‚sD d ±@-“ã,ê÷¡lZÎbÊÉA¾ÓLwúáˆèŒ#:޳:§ø¤ ZO­•×P%ÛÌA>Ýj@1q÷À Ù¶«2Üa¶$p„ŒáÃëhÚhócæhÚ–šcS$Ø¶Š¤ ª½Ç ò¼XJ•6„‡cÀ‹§É`«u˜W:R à‘+¼þ¹<üóP¾êì’ùý#øá'ß1 uÂÛ¸"ó)X„!/ k¬dpþñ“nœÔP&5üØI9à i´ §ÇÑP‚Œ]h¹Ê4ëM,ë5÷c½\U¡#a5—Ù‚ŠÉY¦Ð1õSóàvÖ‹RZj7ó!™åêæ¦(y¸qµqÁkDC˳&‘ŒÇ}Â[@ØâØÏɸßQQ¨[x•*pîÓÛîk„,Ãó@~Že¸É% ²]ˆv;Ø~»rz ¾Æh'`‹†'Í_jâäž–¸æ¯ ûnDIhüíýþ½ì_~R¸<Ðx³F ƒ&ì-¢–‡TGi ¿ÒœbÀÿþLs`ú“ÿÁ>æ×@¹€‡!æ¿êôvåÏÞÿ±ÏŽr·¿·? F{ÿ]8^w 1ï“­ ÷¦È2b„ ÝçY„öø„E,Œ„—HrÈ€VW[:{SIª]«®Lg®ÔŽ.PÞ$·öhÏhTÀ{ÃëÅMXyjÒ†AÄ`l ¾–… C“¥];?äev pf=`k÷F°^ÁÝ ˆÜn¼IP[@Dw¸hANU.bu|¶Zä]ŽˆôI\g¡Uþ3¬†÷ÇÑ Žƒ ›æ'ŽWF£¸AáG ˆÝ€çíÙF“o%|b·~¦pg §&gªi-ÊÀÝN^ pYô‚Ë„ð™ÝÆ¥S6î’j…[¾qØÐ¨ÖPìÿÇgøiß­ÑÝú‚&\S¬öŒáÎhI4Ì™ÏÙo1ˆÛ €¾ÇC=ã³cyvÜá„GôG¬..òi.]&ÇÄÀ‹"ÙÀÂîGÖ¸¥~½­LðqKÞÖ7Û´­ú¯cã)C3Õ8džX+^\ <à§f-?MÖñSÓÂîæÚà—{Ù”$ùB~˜ ØÛÈCBÀ‡dfŒ§u_X”L£?ËìÇœÜé³û8¹Y9î`æ÷í³Õ¿„]ㆯ+ë¹ü¯yöA²¡;–qqÁHÁ3sKaî1| 7†»½Ì@€Ã/UìŒ*5'­³7á‹/±ZÙÒ7àkpÊë%™L “I³+R¢CsÏÄÄbêÄ’l$¤È€RŒ£”ä“)Åó€¶þZÕE˜ãßþ}%×ï·„k-ídóef. ®"[êò`e/nw.‰r'Ønç^F$éIʇ,Š%:¥!ÄÁ>UÜdKªVPÞ•Uv]&Ûˆèðüõ“ⱟ¿¦ªÙN‡‘øÅW^eVrpw.–¢âU¤*§ä¢óõ éNÁ¼¸ÞXÈyO¶8S=É÷»Xˆ)gAµÅ õP½ñ¢ê4È祺v’ðû³3?c–Eõ ül¸ –mžbÏš^ŬG™ŸÏ-Éÿø]wR‚…–*G<>»7À{0–0=…âvd qzÇu’loíÀ@­œ0/øIqèÆ /U3]ÐM•„eL¼Å¸¢ru^VyEÅríqArξ?9 £À#Ó3F‹=ÓâJXS¨Öz³íW1À_i‰‘@Eí‰R ƒÓ‡×ÛÑ(äËS Q’´b¼û!ÝÂ=N­ôS%ÛçvT;÷å9}yžNÄrsþ› ú†C3(¢-ß,è®xâ?_ÒçÓt¹Ì¡T±Új¹ðß—Ül¹ÿ´¢O¯Šeþ7Ð`çP«Úýž¾¶÷(B ¾üAÞ^’Wþ›ÓÓSø³¥»çy¥ˆƒ¸[îUL+¡§Ca›€ZÓ-î2˸ °Z½ß~û‘½\ÙÍ¥}©úöÛo©«‚äîÈRÏ×!$àJƒ:úšcÕ‚°J{ù€1úZo `H_;„lºBùÙí*cMPÓkÉ]Ùο9}c¦½šèÔmOóJ˜¹íÀ2w‚¸¶A©”«¦åc\oxRñâ|ìR]¾ç°Ã9,cx‡q£f!BèÆ“PEX–¢ßýÛV‡y÷Žá[,ý²ø®´ÏÑ—ï@‘Û|éä>lƒ}Ò}0 nÓ³/j¦D›^c+ ”¤&:kº¤·¦üHææES²´Ý9ay釿ã³ÿû‡*ˆk+žó/Ú4*É ‹©]\®-U3ëõh²Ô†ÜV§±]·¸–àiþÞ-×ÎcV„mp϶a4Z+X¶¡Ú×Ì\ ÿ^ÐjæP´åpÆ@^™e¸®Q#ñl_®)8BöZ€SwÞÀ«³vókJ`XóRí £¤,éðèßâ ¸LÆ2³ú6[+I®ÂnÞù–Â)þ3øÄ•ÎPe·°UdBÑ‚ ·o`w,[hí€UPæ{%^®LϾ¼` piíÀk Q‘ßôü^­(ò˜¦S0/KŠ•´¢Ê*·$ ä¥K¤D¶a»z®¢Ï *v³ö¸\ùxÏ:^Ü×[ö¾éZŒ.öÚ)¨âgi¦,6­ßÍœ­BéŽLd7œðP4CšH4í&=Xàêõ5·L¿¢ù’Ç"ho¯‚»¨¨dêøÉ?JáZ“Ž 3+ó%®1ÙAìhÂâʩīÚ陯æ©UÂüc;Ý´iìÀĺnByN–‰Zfeäc÷+ʺÝC°N†Ö1h¨"'ˆ:·p¸M`ߣ߳YÏUa…nâc¥y˜¨9¾22@Ú©Ùr—¬=Iù‡äÝàRv†ö_ÈfZ e-ŒÌ<&>Lbï “Y¬œyž]""¾Ú>:d,õÇR0C©ì9 È@zjé #å\o°ÜÙí).‹UÉÉX~ê iìuE‚xxöªÚ8*ã1«cC±3ç6Lv«»Z¦ðî’ÔCR6ÜQÐ*úFç}–ä/Þ"“oEmÓêŒ×ê:aˆ .‘îêf…­Vá6e²58•NFôûL:Óï™t2¡ß/¤“]ì$ ÌæÕ€KŒ+RÌ<±k.ûË×ÌÌŠ®™J6Èò$KÝB “Ýùr7bë)SÄ'³È.çœU³r@€¤mq#ÞØßƒvø=y)xø "Ÿp°Í%¦›l[¡dUîcHÞçiÝXÊ)N°¯8¥%9t\‡ÕßAÎ'à'Nɲ`rñŽqR.§“wµ?ƒ=(#KŽ/f‚š¸¥&˜öËž .n>^I·‹kß…NxS0ýÑ©îF-äºZŒ€O!”Ð1£˜å“dëF£ø¡D¦éÎ`âÞ½ù%4â¨=B1mŽ™¸×Ÿ?´‡~Ù„(ñ€_~~4Œ¶Åð²_7ã:ÿ‹QG½>Øü-¦Ê~ä‹¶Åð` ²›¿‚qM?ÇbÔ.àhþ)ã¿¢À,Æ“æ¯`\³Ï±u,‰î¸ 6ÏQÆçÇ“h[ŒIm1Ž›¿‚qeŸc1|³Ž2&~1Âo‘2&ã^_ŒÉç]ŒÝÚbv~Á wé4³¹‹ˆã@Ò÷®áÛB!u¹‚0„À¿ÆAn((—·\záÕ€dû8ð;ŠöÉö¥|À‚½ýha?²7ö­½æAF&)+lïþ÷<ìP"H¬ ×òÀ-0jrN"J^gÎs2IT ´äØ£G2¹L·ÌÀð UçKò5½1‘R&…8ÚÅ…K½æ@çEA-¡–³*©Ä¶ ¤©ºwó€ˆ<^Ÿ½:9ýfÀÿÑTK?Ÿˆå²ÃáG:òŒ5G‘W;îõ<´=`›ç´£sÍÝDp5Ÿç($ƒ‹3;€±—~U0Tâ¦Ä¼R¦lò$Y^¹œ\W×~ûݘ0ÝÇ?Ýj=ó¿XÏ9\&½·"õ ì7Êò!]k›ÔUçNžôvÀ©À‹[_£cV_ŽsU²‡Šç¯æÂÉëÌa‚ÃfdQŸ·²äxÞÈ&qsc©.õÖ½°r«¡’.× ÐÚ£úˆWèãˆ$S*ñÔÍE§ «‘Å~tŒaq~JC.3BD@‡÷acˆŽ^†˜X}h€öw´c† aöŸé4´‚2¯âd–‡00¥Û¥w26wƒ&g<ÓÂðM> û 6OÃW(#è½¾üÂüNjĸØÔ2˜y•Ÿßµxƒ½Ö WÅÂ\ì–?±ðR&»,¼Vv5~•$ ½³—Ö%˜xäË2×üy±ÇÓ¿§üà`ˆqöÇ«eQ{Ðíù;zëivÎ_íÛoÆÍo%»“ð­çé’ÛÛö{“–¾&Q_G7üV²·Û:ÂäÀ¿E¯ü`ÿŒGûýÞAókãþ$zí‰ Á?´ÍHÞ$ï¯øð3­øà³¯øÞ'­ø^ûŠO>iŇ{í+>Z·âݽƒÞÀé¯Bl«¼»>/0ô ­*+7Ñ•ž* ÖÖõÃØ†¦jž\‹]ËÞÐ7p©¥w\O Ê%®T™§Àº„0DˆT2>—‰P È”·åÓO]ÝV'²]ëVDôóµ™Íú¶d-ÇG» 8&ÆÄȼ²)#«ñø!\µ˜äÿc«k†žµë‡ÿŒUÛ¯L1Éæ‡0ÜŸëÏ¡9ûdï4;n|G1ú'¬Ð /Ýzã×(^¡ð!Tî=ÿú9C«iõÌQuzæ2¬ÑCõ¯±ÐW¶D=‘9”uˆbFYQØyDÂ"Îl·®sw´ƒ,)þ9 >\Í)x^HE#¯³“_’ànaÍØë àH„7gO»û´@“³‚œ) µ‚ŸøªIÆ[7~øp<üáþýïè1Z7ª=ï»PÑË>C Ÿ8pÒi!h0û5XAýœ$Ý·}Ù¿öᯣÇ=LѼ¾3/ßçê3Ló`M|«`}xƒÞd´?ÞØ¿'aÈî²÷ؽ|-¹?a\ /´M—ÙýÖ¯ÙÜ©‡·a{[oµ7ZûÖoØ›ìM&»“Ép  VZ¯¶×Ú½<(CÙ³ZÁÿãZµÞo›î¶v§Æ¦¥šôû£Ñ`8Ü5ÃBßï’KÖÞWéŒ@+ËÊnÒÁzø4Ý,ð©¿Â~Ü5“I$·4Á‹g¢ Ðîf ¨04—¹.Øžæ¡4¡ËÀMEvF¦$ÆZTNðû„‹™–p±ÐÅNa-â c¸n<%FŸàÒµƒ¿ Ñ3ÀnmŒÕzK¡R…?sø´¹o½{f`/.btn®ÒÒ ±“û„¹K°þÒ !㹌å¥Ë‘Kò,?_BÂ÷6+‚¯m_{¹£¸žŸG^Ñ1sèÝ cþ^å—W “Àø]ÀŠË(é&×Põ˜±|-Í­$oCg¾pe2ì‹ÇwvLÄô‚X:ûH|Ã~'õ%4†{2¾YymH€Ÿ#ûÞ¸ŸPIex­ë‡ö3 ™oÜkú-îìêè s ;pƒ¨%îÝ%vAßËМÓðδ¼¾qïVâ ÊE÷DQ‚M{ÉÑyZª¬5×4”ëDCÑ W¤ç€âS@PVzè¢KrD=’.‡¬ŠÒñÚEf¶;l§“8 }–—’§ÜÌ–KNSwôS÷v%áMUö@N¯äà"oåÐ@q’o¹òKŒxçï¸cí÷ìeðJ3 sÍi—”ƒÀ¹=>=à?k‡˜$óU>ç,+d¢Ÿ¶k—˜2IBÒZ6C§×Ù&ù…¨‡ˆ|ûdEÙ5É û(š®jJûá“[÷ƒøÄ QSöÁîÊ+Í‹¸úµDØQí Ó•ȼ_F¯], à€áM~kâ¹8®¨¦R"x0d5‰*È^‰g‚ÈBÿï1=zÀ^1•åØiÏ4ì°‹ÑÞx˜¼‘†º€!¨óÈYGëHŸçéõji¯¹9'á‚ÿ°¾B.Fµ¶%ÔÄÚuˆgÏx(’dkCâá/@L±ïöŠ01op^ÀÈ%‚ºˆØÒ2›ßQþ›áe²ì>îTvb³ÍäýV|WÂ&p;îr#xr|Éá£ó+é?¶÷Ò !–‘ší›¯ç»Úã¼®Iè·òàå ¼øIz Pôi¾€ýÅÅgë ˆeqQÝÂò9vÞ鼡s±óy“ååã?î {ãB\øÅqX'K,¾H¢…Êdiì€d9$x›ë×ñBàغë&ìùŸ'þ6&¸AÌB(f!o y”£sç]éäF§‚ï1 …D@ßò¸ÏX ãn<0d^Îûs¤»RPx¶÷µU”f¹%§ù$âº#ið,ºs—<Ü þ‚ïÈE¤áYŽFêÊã8˜fÈÎ3Žž‘ ycƒ´—a|6©]|ìLè+ŸnùÄ Ÿ|„®4>-™Ä0ø;tzg`±AÙ%)­,,´‘8*­ÂéÀFÄkH›êiGúm³}¸£ßÙcšÝ÷ü‹—ËâÂà_|qüáJn”Æ|ñå¿GýÞ ÿÅÝõÁ{ ŸEkˆŸMÀ^3„Ïö÷v{Ã1|¶7DŽAWh™$ÿ6ìOv{“qþéþÛ`²g[ä4Pɰu$o^?qC±?Ë`ìn4ögýÑ ±CLü’¤yLvT8¨Ý="9ðÂTÔÛÌ”ÄÁù(¾I´íwËAP¸½¢}gs¯~¢ 9Pª5ló¥"{/¥’¦ÉàP:³¿ ¡G`Úªï&òVBId›0¬ëÁ¯nÛŸ@Ó™ßúªÁÒ8ñæ³6Há}o ¯äžÂÈ RH®ñ*ü&ûÿ©c<èY"<ØÛÝïîB­ïš‰Öº¹ä®?‡¡hÞQã@»Ž# eãcˆ«ç—¦á‘$ö3¹Ò/,¯d$ÏáwË#¦½Ž³ÏLš…ÑD„è¹,w€ ЋàÂ÷ˆÑ”¸¥ù]Š€Ñ9§œ¡£T­»Û!ÔKFøQÛm¢OI4|Ëұ†8nqN#„%.+—hœ)¯“[8N/Ç{´¾¼¶QåRÄXW¶Ã§$µÊlûWw¼­ª!NVÍ!dÁª¾–NS^¼RŒ©r ¹¡Sö-$¨ˆ›L†[óTò \~d®í£íT)ÀÛ°xü¶¶œ®ªÌh¼|?¿e¢ü–Æmzฬ۸kÎK±‹v09R; ÜÔ‡‚–ø¾È)‘Þ…¹ôkw,ÂKÖäj™#³³l…AÁUöÅiu·2ëóW,=ð%.—\µ|)âg|åêÇäêÕñ¬“«X?&RR š“j?ßXûŸ<Ö~¿y¬N7ð…šõ’p‚;‘ðÔ6ݨu¿q}Ñ›œÇõé~Zz‰®1ºïå/é%z—›ŸÂ µ¾íÎÚñF`ot°7ÜíÁÃ7®_¯¸ì·+nyÏ^BÜ} ƒäçWÐõ%³Îï<«$ÌüH £!”NkhΤ¹^]ß1 ö‘ õÃ&5õÇEq (…|É%n8'ÀA”±8+½¦á9%ïÚ‰ŠV¬Šª]ÇI{é„Exâ ‹fÂ2©²GA¤êw Œ„ÐóÑbïû\ÙÚzI¦W Ù»É|äJØÛ-ƒš9½qy6‰¶^X”É2Å›Wùß+øÒ~3víß–5Œs¼ý¾´ðoŒôÛ„;CÔWÄé^âß7ø7&Pt3¹Hó ¬A`MÊ&Ò¾ŸóbåéˆÖÐ{Xü½KîWÒ1/ ŽÎ÷ÓgZýÓ—4cÒŠÞ’ÎìTŒ“Â~½l]v¿WCãQ³ Äủ=ÕæÅ3~ñ:áêá µµA!)n“$EBSAˆ½I |QÄg±À±€£Îx‹`ý–_fÈTà‚Lëºÿ4gŸAf¸¸=ß‚·ÑŠÊÜai…v-µ4ÁzY`šÕjGÚ,»ú¡ö¶åŽ{ò‹d0c æ¦(|7e"üÙ ‚X‹=sö6Ü蘈"Ñ|‰n`D N<иíÙºã_†´œőޜZö 0ŽoÆÑ7Žbº÷7Ðö»ÞÖŽ‰'.5³ý áíÖbÖ3_ÛSŸ‡!py¬Àa¸ñ¡D{d¼ (Ýp=¼¢s…+!KG'Ð>+ŸÛïa‰x1O~‰A8ªŒX÷â•&<îÃ&úO+«Jƒ à±VàneAƒ~ÂvÊ|é)ò%†þ“¸DKŽA"‹<ÕiŠ.3çÔ3Oáv$)Nîð‘ p{¯5÷b8DRk¹O:½†b9˜¨E1Wë=N]Å/âà Õäìö³š–yR‚^ÖÀ—çs»¡óŽ÷u)˜p6{fEÎf»ðK³ó,©ïÎ5Q>ÆiØÉà~È8Ÿ·ÃWɻΖL FˆúëgYŠÌ8 KxàËè€Há.?ð²T᱌{MÛ.B#4‘®}'ßR|µlã­ôóYl¢w"µÛ‹ ãÜî}kz@l,SP93œ©òëÌõ Lຘ„ äl¾+\š<>pi)ý¦4¸‰¼R“ KËìš¡}CÁ„‹Ž¸QAÐD£€ªêÃi—BÑ`>|¸^bë"ñ£qêÞÐV’Ø.É#<ãè©çÒÙ(T‡<°iY, ¼hÙEP$·Å1,aC!Ù7®†Uˆ.(E,WqØâV[‹uDTmFü£[õ:A±(HlåzµHÉÛŒãø„hǦfÃXàкuÍf^”%Q ×Ý¡­GÕoœ¤ ÏÂ÷ô$½ÅW˜¤ «0A±ƒKŒ»³|¸J?lã&Æï­—>\ ¯aÍ.+Vœ‹F )?âv‡Zi¸ÚƒkèÆ¯Œ¤÷¢ ‡ W¨ètb¯ë6˲ZÝ䳆é›û+ôJ'õB®–4\1€·k´˜Óä;4DÓ`ïAˆ=ëÄat{h³Pyt•»›–xVÒÝçœÄOc¨)yˆ–ŸlÑq–¶dÏòî½U^^9Û‘WfÁWá|’U¬Ä-©0r/Šò«›9ê·¤Ó=xG9ĈX¯À´ˆ\EÁCi„QGâN5@¬”XB#_ ”æ!¢Vrz>!“ÌìkÚ¿ÉŠt¬ÑMßä•£Ö5ÍÄ Š]-7/S‰"ÇšC`zu»+L$,®Ä2j=è!Òß׌ –IA:^¥"‚~ŠC I¦ÙûÄKÐÑp)r$wÒRËg™..q·x"‘xœÒ¦A¡w‘ðñãFl‰·ÕÇØj…L"—ÑÔqæ#DÁ0v¯²ë mªînà÷ˆ°UÉð€ àQÈ›ðÂ<»¨­Gzèa¸¡N²é⊛’¯*—à ^d :Â{‡] ¬ )"‚°.fEǽ€A~õ2g”jF¸l[;£ßj@ ÕE]ü–†àãød1#ñ.*HÝ Ðè½Ä\°ï1ôwƒêHø Çî`ŸÆíèÜѶ-‡Z‹aÍZÏOYCpOsy¸…é”GTmx 4ðº€{¼òe™¹]Þ±ÃÄA™“‚ 8ž©]àdüüò5þÔ§úâJ¤±öFðW~yŒ?õéû¯ñã÷ÆðW~y‚?õéû¯ñßô&ðW~9ÆŸúôý·±¾¯—\¿O‡ƒî~Žé÷]úmÒÝMp› ¯Êý‹×KÙô–²òT=œ¿l,WúIwº›Iû\jh¯ß!4'†O¬_Œ)K3¬%Kã03Æõ‰ ™º›IûFnýûág/w[ËÒŒÚ=ÚA³a\Ÿ¡©»™´`äFпï~öÒøtkYšqý+—©+xš ãúD@MÝͤ}.A·×¿ï~öÒøYšI{t¡C×l×'Âkên&í#¹ôï;„û,M-®ùtc\òîÆH>åt…N‚ zFîa% Õ»&C¼ÊwñŽôï ׿7îØÛ ß Kà¡fm—#®òå ìRP •ÑØ/Ð>•Íctq¸¼hÌÆe†^Ã……+.@±œñûÚâTó@ä F»ÍѬ¢¹UX[th’õ`ÙûÜ ‰»A]xYk Ý ü½x¨ÚÊüƒ[ˆþÅ+÷SÙõn)en”KIn;|àTúTêLÅ]:Å™Ä9¯sÀ"ƥμ{Þ=ÝB •,Ÿã>œ&© Ù‡á °h „“º‚'fªòÌ8˜ ºvU1D{N@Þ$åÎj³vKK¤xcÄg&{;ÄRÈÖäMa õ[åLâ¡ÙSìüGÆÁâRû®ˆ ¬nS”ÙßÐ$ùgüûÿþÿ¾pFÊ3€1¸˜S3úGu™ì„Êd‹Ë!_âÈçYVN—ù9 ùbÚFÓ¶š«OK¶Ãá^ÿ¼•,J ¯"0Wˆ9I À†WªÎþ†©Ñ}]‘N¡@!›Xç˜@ÈkAvoÂòÂÅÃÄFñÓ—½ä´¸e'ÎM.*ZÙ‘R˜ïº]çR(¿ÚúañC•ü-¾CÔW‰ÿJÕ¨¡ ñ]·4îk¿kz¸_*lI"$È€“k­tB©jkPweÁõ¦¥:Ù n ác/ÀýŸ.}d¼&ÅòªXVìÏhÎIõ1§ìºö U BœÎÓùún{ˆ¦† ÄÕŽ,Ý}ïé´[YnÙ%bévßçÙíVÇ„á#qñ»¯tÞŸ'¥’lg°”•-LØÓW»ý-ªq»„T¾FÂg~#uº0I÷ÿ*Ï¥â`2T;‰%¢|8£ >È>T‡V°}_üˆŽmÿÍËeö^C Ù/ÞÜ&gÅ1»Ék|XEÉb/É|©ù»Å<ü¸?ÌvI™ÅNJö•™>Àâʱ‚„È«üæ†ýÆÌ…,ïåé s™ƒgA†O¸$$Ú… q…ree˜¼ºã,z”9Í,Kç[‹cÀ}JÂÅGŸ:ÇT4»+s{t¿µ÷9a²Éyu™ãE" T“ÇÌuÒKžeãCY²XèÖ•~š7ØÅÀ°Û–Óƒ·µ(ìv.áö%L"ønØW~IŒ/â`×ìU9WüR †ãC3k˨7ÞúƒÝÁd0ÚÛ›Œ'û{VIŒÜ÷»ýÉd2Ú¯vGûÃÑ`hc÷ýÞx°;ÙíïîíƃÑþd²o÷ýþÞð`4ïûðèþþd`¿ ²±H†Û¸7ŽýÉîp²;ØÛµýŽömWûîûáx¸;îïîï CÛ Ý Ü÷£Éþ¾âx4±Oí&“ápl†}÷ýxo8Ml»“½ƒ‘mdh†÷ýd8Ù›ìŒì Êwr`†C÷ýîA<°OØaÆCûÐx²g†#÷ýÞÁd4˜ >ko`ûìšáØ} cÛ;ÛÚÝÙ9Ø%‹ï³“×gCO ozþm‚ÁDòk†iªSFX¯mËÌÜà-—¥mšZöûÃñdÒßôûõ½´r`w{<8° ½_Û K?ûv&¶‰ÝÇhwûû»“ÝÉp`Ée0êœßáL§$ß"öïñ$/ÒëbU{>‹ÅÜÊ—&œóõÖaE—ü¾ùä]ºåùq1 -¦Âäx÷a«Ã@ˆuc×%• ¡s&XÚeMm»æð«¤ß›$“íÒäË$ÝÙRÞOôÏ@¢DŽƒ •yißœ}î²(ˆ'ÖÖGÁ?"G!"ï½yrHµZ`G‡•p¸`¢!ó©j²&3gq˜ÄÓ<ŒÉ‘.é8Ÿ$§˜p™‘f‘Ž“N2Øï8ú”¢öÜÈ>7îà9±¤¦Ÿ1b~ä¹µýŠˆ T`97ðp7ˆÉNÜS4 Ÿ+Éf9†·`]€k+ˆ‚ŒèsòRÑ%y¾¢ÄŒ]f4Á"ÀÁ°ÍP|ĸN):ê çÅa• Zf•¹ÍÃ@Ù&M.²[êþæ )i™ÃÙÏ/WK m‚9/1#Ë3mä‹ Â’-ÈÅL]˜+K†VF´la;[ (T€m5ˆâ–YÁD\Dm æ%dGâ>"˜tU–>2JPÄÎííh(2ƒ™D ¾ÊÁ¡ýîÊŠ·,µ•DGH’£ÊŸ #<™t-ãë'?%àÙµŸt³dkð¿GÉÍVò{RÙÐÆf¬ôo•C CXDêüÓY IMÁ'Xb6ùøaÖ¡ÈŽïs»†îXYê‚mæuÊóÚÕvÕAÔ>“´òª@KÓÑЇ[Vnåƒá€å;3©×CÆHª„]3+)PÁ¶"ã\Ö4Eç´ýTD³ ¹9‹“KÐ(s +|¨‘(·/r/°ŠÍî!žl/6È ›î| ò(ÿË­ãGLg¯¶Ye®æn)ÿÓj³’Û:¢Ï±]²#ÛMjLé`£©ø|áñìö§I0ú `ŒÊM£Q|èàðµæ{fì?'HÖVK]áD="ÎUF¬xŒm==yõúì¿>;~©ãš(Äc6£fFñ0)ž¸/NŒ’ÖQh&¸g'Ý !ø.Wk“cŒl»E‘–TçD]ØÞR]bÜhÒ=Opêíùê–ɈùÁï îE• 4Q¡¦2LPªä¹ŽÂ2˜“΋ç"£a×9WIæH+ „µY\˜@'Øl„¶ý0¶ÇÑÍNýŠÃÎ㜿ƒç7#ýœ*ÇànWbqK¦’3Ggqã¶µžù:£Úâ‡-P¨ímƒçMF¡¥ï~¿Õ X¨ À)36Ž×B7n ŽÎ-2ÝC´ÎÅSZýÐÉm—2A¶½FCOoW·&U£u´S—¬ÐR\­ùÄ›d\T¾²½Þ$ôu0sHð ŸÁÀãСT÷í]}®ríhËE¿æ 0?Ó-ªb`â±ì\ñqDëð3Èœ#KÇJkU—ƒÆÚè Іr§¹©ô‘l’7íj€¾©xa=Q’ vËîÞâ_Ób¾º^Ø¡YÂ((=¾BnÕï®@nÕ¡9²’„“ÿ„1Sðó ×·bÿ4ÀŸú½¡P¿%]û+8Ù¿†_O ˆ¨‚¯†=0]ü”H@6Bÿ&Cû©ûª‘¡yl=ÁF Þê'”Z†ü àâs#ôo2²¢FFæ ŽäöoˆÆ¢þGC|h°+côè_+5426Çø+4±Zðó¤7îãCÃIo8¡ŸzôïÄ~4&;jdbžâ¯¿¿Ã_ýÆ=ä~ú|B¹ß’߀¾æ>G-8 ÊóòŠ”ü ã¡ávm¶~J~¨ûúi2LºÏ’ݤ{bj –„¨…½:T‘A«¡3±|2 ‘ŽL_Ř„ úï";,;k7”¿ M“Í’ª¢´ ²ú"Ë*ËiŒJÞ¦Ž7RíRw‹ú5‹´äÃ!ˆ:-å-üê&~uYŽš£6.ö†õ«-|þõ0ÛNÈÊ\Î@6½Z8×<2JCŒ2ôÒzžä¶Ö¹µBQ ‡9·& 7˜®J«­Þ' ç…+Hóû±ßd=û5ì7‚;Ú°]Vê5µíê¾H¶ìs…[Û¸ä¢rÀä+Ã_Fœ²$¹ˆZ‡ {hN¾ø6û‹/`£OþøÅ°Åðíï1\¹$w²à†Rñæ ßrÇ›xÝ¿ß"½ç:ešj\až¹ ¢=3ìÁ &ã2UsŽ'‡À%ãQ©Ù¤o»TªûÁ#/uäU h ¼Ï³;*‰Fo£N» ’ëŠðAŠënQÜ”yÝæÜ|@ó 0X±ëm“«¨É3D>#çEu¾"õˆóíÕ[hòóðõŸN_¼|}òú¡özõS·{•Ío~ê¾·?±¸ Ï v²~ú/–†Oÿã/–ˆáïÿ~Š?ÿOðï×ÉÉÓ×öß'É“ãg'Ï_ÿ‡kè/–Ê_¼>~i¿ü`ÿ›'/ξµ?üÄ#ü‡”Ô…_DCUx€Ìp)…›¹BÃÞbÂAín³ðP T)ø:˜°à# d™2Ùk:Éãâæí“«÷O!_ lLö' YzÑý.].­>0&åtžæ×-ZEàõþÙÔq9,i{Îâ/2L£Ý} qÁZpˆ€£Ë›´º’p•鋆õ†ƒ€"W,<(òdbÔÇ¢`V²Š],'ˆ:€µV‘Inø²]ÿ‡/^ž¼8³jm'év* ¿ JüÕ©äèf¨L*3Yò…º·S·¶Ï¼ÄO œgP®¶X²­^eà›Üä`“AÿVK½Oï¨QçuµÇÁ0Ϭ~Dã°t˜$õ°/![QI+’Ý4ÉiXbÍlP´èV•¢Fô21èµØK}“E„ƒx ƒÀÕî"ÝsBåó£v'ˆâ¢q<ƒqÀºßëµ×Ÿ³M^õDZÀØÜÚ}únyç“·ë5ÒŒ?± VFÃr UÈBTf©Ï_UbIc¨ÒÂ=€@‹nŽµÞ‰$~”7)¶¥çºVŽÿ Œßá+ºÚ§ …­ÿqã×¹¶›ÇÿÆOÜÚoÃWp•5Ͱ;ýؽ¨Ú.S3k¥ápŽªuýAl„si~­tNK…ü€´Ov³ë›ê®‹ßðÜžçƒ6Røšo)ûÞÞ“âÝݪø .r~ïÛ¥¸7Ù45ü_)e5³ˬt‚,É<ƒž ¿ðIƒ (4èÚº‚¶@ÝC爞(ðèàÉ÷ð$‹úá'>žä%!Á÷g”Œ$c^¦%nQ¿…šò8Œ¬¹qX®!ø•ÞŠÙ}HÞb"„XŽ`¶]ýs¤ƒÕ RŠk¹¼\¢¨ºÌ:ˬ¶Ÿœ}súâõÙÉc6Ϯ W;Ö> 4"Ș‚¢{wl'“yÔ ¤ÛÃQ©ôHx/¸D%\‰^¢çA›$íCÀ÷ Þœ5x£{‚]“hV¸Ãþ5–r,oÀëtÍÇMx[áŠJ%DêÓç·@½4Ì• ØTÃHõØK¡ÙMj‰V>HùŽOwCäZƒZ²Ÿ¼ñA ¤p6>tµ>P͘8¸³ÁS ä– È´Ž.TW B4:P|È…‘‹ëêy²Ã›«2E¾BöµÌ²ÃOoÓ;L¿æ>èhøÐ2V÷’]—ê õÉ*•¥ì•ÿ– »I÷LìPD 4ïUS¥pе&Ð;›Ò*©^(ÿÒâž^Á4Ç AFÍ)š˜w¯>tr^côXCBØþTçŒûY÷ 1ëi<ÃáÔ=¸_†%®Ò†º$ücǾa Fºñ xÝøX7¾Á½M÷wCXsÆ íï}úÐûÛØAËþNzÃñÞn4œôíîí5×.Œ†“Ñh4°OÜ/áWÉÇ0~ôjïêv6@~tã{ºñ ‘üÊÈ7^{%Žç‹»Qu\ïÕ‡Nmì e+w{£={TÇÃñx”uw›Ëøöûv«í ³O¬_%™%®Ò†ÒÞ‚Õø¦Ôn\j¾bã"Yø•±o<Ùu£÷÷>}èýmì eG½4x°kYAÖ4–Îö£ñp4ê6îï` ViC ïÇoÁP5¾>øãÛ©¶7D75^KË·¦åÎ9-×>/‘ø„áæ*0ø¹œ11%H% Ø4•"sô¦e–ö?Ë~öŠ…‘ÃaŽâÑ}˜/8Æ3T¡\¬œKZj¬‰î Uq­yd WÅÂ¥?±ÄRkðñ€q„¥œ%ÛékŠNÙ•²‘h1+š-‹ÌK§²ÄªàTÒq-Õ ‘(_¢Ç ä¡ËÑÀ&I‹Z/›0ò³ëEðÙõ’ƒäqrlÒþG:^‰†Ï®¿ý 7\„ôÐú«#èxÃM>»ž±»AnâæôÐzþv¼–…«¾=ɳŸÈ’8iV™ßS×qýÀÐ3§1È­ržÏç’ö ?Cœ;A3s‡‡VÛ¼\aù=öÍ(P,<ÕŽýä ¬Rl§$‚òοãŠáKþà<›‹Ä}8ì*u½¼[L¯–…eÀä!EÔ¬ÙJâ„$å€]¦vi‰qbæ|¾ZºàoÀ›ïžßQŸ A؇•QÊ$ðñ(ÎX£vÉ'sª~nY/ô þÛúAøëu¹—‰Ë½¤˜XN¾”]xƒvÿÖý¶±LÑÒâÜÂNµG-Y¹ßÁ:—&=?‡`Â0°;Fx7èò%³ð-Ivw ^ØBü/Þ;l[…m!ì]Þ§`Ãâɰߎ!ë œ]£ÐÂEtpŒ{”Ì©w(Îl@s݇ ù¤y E_(ŠÐ̳€T!^˜,Üho¨%ŠGWÒ‚,ä:­¦WŠQptü Þã[@òD° b•ÿô,¹ïMsŸ+.¹ïpÏ;ð^œû¿ôüÝ/àŠûÝ¿ì fÏšH|•<+öI掷?¡›¢èp3¼'ÂL1Œyö¼ž”›„ÕÕÐËà>†P¹Ç1ý§âØÑ;Bµ”ï…¹9<(öN˜¦Îý§jëÈH4Y”#ì¨ðßEv©\Ϧ»Ê«©­Ý%šÊi¯ýô¢=2"E‡‹ ÷,§ÿ—Z†À‹TòFäe}Ǻ·Ã€•ìhât.w$Œ_-ýÀùå)¼Ô­Š.åŠ+‚øzœ1™zì+#¬hU;{W<“ê´X‰]_c$Ð*tÈḛ́T·…v5“l/í¼Za¬:C“'Y6Ũ2 QÖ–ªz!²'ï{„M%©¥;¥³ö}чѴÇYVÛïð»Õ …ÍÁÓ„ÊÏ`d¨c\N쨯€MÖٚˋñå¦Ti_Ë™Îk²00¢«eÚN¼îˆ…#8Lœ±,uœýÎSúä"¨ cUYG¼ïâ²,=ÌOIDìÉ߸-’,í‘DåJÑ+tj‰dïöuzÈóP4bG†­P|â…æ@èÞ.”™.!z!â6H®«…ú€=…îŠÁƒïÏ/T7DбHj å¼‚Ä Fêh!Ž=$ Ê5(4»ä”@‡±®Õ`¸ð»ÖxNñ»c|g Sµõ¨ƒ‡€ôâÐÆ¢uÄEFEÇneOój ±îÛ‹Â_ÏÅtºZúe;WäoÉàpÒÝÛ„çàþ…—ñ÷ 軌^·`×¥Ìb8¬>šk¦×“@í€güy«†Ô¬¶º€šãGëÍ…!0Ýé&~Z9ˆÎôÑî”ÏéPù8{ÓG;U>§[åãÌRg˜úTÓÔkã+²áøjõ éù™fbï Åœ¢Žoúç_f¾Ó43réò¹T/BÃôŸk¾RÁSD§-çï¬gÚ€Âw­ ’,£[Íkû 2b`ÉêM×fO°9-x3nr:'Q}Ù£„vtÕw}±ÜU(õ ã}ø/ù«ô>µ…°™l殦Uý±Œ‰ VÊKU8ŒÖÄa}§²à±:h,¸jͨCF!{BŒ.ç GÄ#åRöûô¨ Mw7ùêÐ-÷ê›îŽv-ç5Ý1þF(í¦;²¿ z{£a20Ý!þ6Œ‡ƒ±é ‹\w#¼4±/&ÑÿÌßå'ƒ†‚>Âîk­c ¦±‡¿ìZ¾ #­½¸_ï÷ÇÃ=s`‘*fÐÇßì=ÜÛ7ƒþ6ìÚK €„¾;|ØÐjÃ4Gø]è€sø…»°¹: nÇPmìý9-ª·³ìb@`#>6|˜Èº÷eJ‰Z_{-kš¨U³÷_—Ý“„k‘„ÓOôlöƒ¤OŸl(Õfˆ!òaøç"!âLdQ\uYÙß$üÓ¸dôÍĽId¢_ãËÑ­­¬JÜzÓÚÓ7r Á6µ>tÏ…Ç­7n"~©†Öý!KšÿÔ©›®ý¯Þ´›Ìšî‡þ™ÆÉ%ÑäY*ù×Z×Í5Õ²+I¼k÷Ÿ™“Í×Å®¦‘ä’ˆ$YˆÛó¯óihú>CÜ÷í—Š»ß¾ßåà='ÉÚ÷L"1ÝÉŽ›–üÉÇOî5b‡MMGŠÎ0‰þÈž‹ÀŸû,Ƚ(6V¡šž‰§ÚÇÁ÷µà÷†?¿·‚Aû«ÉÓÄâjb{Œ¯½(úé-ãŸP┡_0W­®0rˆá êµ<þ–4qV‰N¼ýé“ùëOkyç:®ûÓZ¾øs¹îï~寿òW×ίüõ¾Ïü÷㯈m„–sÔ³I ;UÑ™€!#(óPée»Z®S ÔK¨cŒ nA}G…³‡ «©ä*„íкÓºe¾ØÞïXÅÐßÁkuõYq ÿ a¢Zɶ¥æ ·ŒƒÇ×"Xåmƒ}šÝVˆ{}UWÅlÇnš:#b|p7R_õ[À­ SÈr?E“ݤô¤¢ð­£öato>ŒnÇÑ÷0ºÏFw×ÃèžzØrœ£;çat¿<Œ.އÑ%±¾ÙIôØnôûÞýšÙ;ˆ~D¿A´±Ï§¥›¶µi÷_†ªºl.‰^°ÅÑ·Ë:õoZ¥œ$šlM.‰(&‰(,‰œ@nõÜïÃè÷qð{+Ç „•²ºZf ª9ÉTp Õëi G—è+‚îÌf¿#ÀgáQ»ÍÃÈ1„&¾Í¤,8°ŒÒ!¶ð'6ÎN¯2ðÅ_I°U^kÊÝ1ŒÆr@•Æðª`Ó‚{ç]˜E‹cÔÏ5æ‰ÿs?¹;~c³¼¿±YÎÖoÄòuÓwM.ÂXžÖßé/ÚŽ®jcÐÔF,0ÇíG§gÔô\,ÇmÄâ<ëæ²–ÖÐg«#?ârÖÉ› šÓo ²¬5ìfUÓkÕôNÝ«&hÈÎyæm¥ »tòLƒRa˜¿Ìª¢ED‰É=¾€~©UÝèú›&ˆÑcèã'š”©M¤»ø‰&¿ƒ†ñD-U3ç‘}Õ øŸÈ{èµÚ–EoÖ׊_‹öµéµ`Aéµxó›^ Vÿ­Qˆ~'VMùO7ÅÛGobMµ=v¯­åL5BЯµ3¦µ$ÿ4îm1ù4ó3GR–§aµ¨žð‰(‹]f^³=“¬8©‚TÃ#åD¶vL,€`Q² „Þ¬™9•%%·\ÞfÄ¡ŒåIÇ|`u=Ö”T ¾¿cO£H¢ö³ã˜þÈGx¬bªì‘±Ï…TñeŸ;ö›¾Ëí}Ù÷;z ŸùËuЯ3@ —k8³xBúý‘ŸHxÔ`á)‚IDÄß7_FtÍí| ?¢Æƒ{2*» ¯ÿ’«SþL1I^«mcøj}mÜçáN7¼Ò|CÃkÁ*ûÞz©¿lýS'©à­†ýÂëTWï-ÜT?·€0ë¯;¯_Ó´ëŸù]«~¨Ÿi³¦-2Ö¬5”‚¸†LLJwI_uîÑ1RîÂg›%*ÁÛ'Ê%ïÃQo<Ù=þrȬdÐŽðƒñ@d]¥s2 ùr׬ÖÌ.Ì&{=µclš+̃†ÙnŽCR¡…˜¡Ïq@}ôÍÐtG½Ý½}EÚü͈57ìÒ&Ããˆ|]ãÐö¨þm$ò´ÿå j<:ó£nBL¸Ã „V\fô«ÖP4ÔºBv­³¡¡·­ÿÖ>eaÛ¢òokÖ¥FÜ´,ôMKÕq„†*LD¦À#”Ú©*9×Áýz³ÌªêÎ\y‚¬_\ãT9~–oK!Em$N?´lDñ%YÐ>,f_3:Oýh¡i/„]@¤dWP'ŠMm¢j¡00ÿ!ø4jS‡b§l™Çý§u²÷$œ¶ùhÂ)=åÀZ ­p®¬fY-WÓjµÌH„Å€Àu©<Ì&iÂiÐ9Œ«µ(\Úµ¥¯W•Áï;]ð+VççÄŒåCAkYÌ„ÚpçÐ\m&I£r¤Qª€$"àŽqGI“A¦£‚.¯TÞø!Ìk·¿E9ë(vÏ·Ÿ'ð%]‹ ˆg\ Éw\„ó=ñ;èÞ(Á†Ê$ºÀ‰äôÍóŽKaI “ìŽð¯¸+9)“Q²p¨^‘}5áêMö³YF„Z¹TÐí÷•ÃHᆡðè¯wç"35Ú/«e*æs.â»äz•h z±¼(¥ãàÀˆ¡h¤“HPÊŠ3Cõrü-[TÖ†}óÅà,ˆ¢ôê¢O`[€b ä5eO,³ëÜ—Õ!ÇJ÷ÂÎFÒ{|€ŠëMÆr 2ËZ-äâMA;¤{6Œÿ!K%Šˆ­“û:”|qQaëâ±¹í§! …§ì ‹}gÊ8ÏT×ΰ-2”˜¶Ãõ°æ0÷ ©¿Oˆæ=Â/?Wå}"?Wdãç Q¼W¬á=‚ÿ™Ñkÿ|ö0¾ºåûÿ¹ZPõG#«ï¨CÐ}á¡%ȯv†~5+× ·g’J¦¦ÊMÐÆ0q™¾3Š1R® `•%ßé<¿\\‹c zê˜p$šØVEçBY.$)>®s|¹ª²×™›$À.~+üíÚþ@¬ p”Tµád ßBtë¢á˜\W)™mgù5ìæ;¯t½ÔÞóNQ3G„)Õ›p¦ylÒrgaåw®ýŽxÅ›Šð*+ªQ£ Ѝ¶€_›‹jn`‡bá‘ÉXFîj?_Ý¥–ã§Ë®½ÈÞé ðd8ëGùÂnt%—Å_š7%Á0PrÞeQÌ$ t¾ÀC‹ùÍj ~¹ÐvdÇkóM“¹½h\i!Dihêœêx^³1‰%k¬ác÷pFMéü²@¿-,l•Ãl@CJˆ>vɨÇчÖ‰‹Ïšá@Ýü-ˆ[€÷⪢ÅÊuW c¤À HU¥½R0° Ï¢]1L£ô”ÕU½þK ÑÂÄaûØ bÀâà²!Èo8«ärY¬nÒkzh%ÔŽ³äÁ«  ¸îl¢Âyëæ¹œ?f&U¸¬´Êï)ñÀÑ‚+Š\ém7а¼Lx\°“4ôœ»êŽ‹vÀØ;œJ¿‚{Úð¤áÈ’ëSò ìÍfHæUû`Wtéб]ñ ‹bä@ç¬HÅ¥ íà+$xÖžŒEðKQn*Ú¢J´PÍ–“Å,ûà ¶èš.®PË{K™%‘4Z.vÉZ¾ JJU¤È V–¥²ðwù{+ˆ^çÛiµ3Ï­˜VlÏŠj'¯~Ÿô’—Vü‡*¹0y×,nuþŸ Ùc#äÊReË¥ŒC‚rô°Bå]Ye׎jÔ[Ù†¤]Wf·#ê³e—T·MÐä²°t2va[RjawÜ=‡ŠEØÉ Õ®´Ë å\r=€Ý".›)ªÔù*·:¿¿ h5¸zpK‚(aÛö—ªMjFÌ•ÛýæôMòü¥%Çóeº¼ƒaîGHHi1,1Ÿæsjö`Š™uPv••X— ²¦ÕT¸ÇNrÂkGMˆ’‡qK‚^/æ\-’~‰G†ìü Œ ,Ñ-îJ,M}YIÂÞ€fÕ87 s‘ÁÝAo´7ìǤ×ëu’/ý'Ȩ¶¯°æ«h ‹¶ k,ÃÇ­³Au„ÐXQÜÜÀ}©›¶Ó×”›Ðº'±R­3;È7ffoúru} ™¹l„ñsb¤y°õ?¼g Ô>ȺÃÁxo¼?Ú÷øÉxœ ¨[®­øÌ^AMó (EÁlTvÇclã²vt+)¢7 ¨§;vû,7&^dj{]„‘”-սĩÁeP ËžV&Ê“‹ Ž&W¦D³ÆíG–` QdN=^ÛµÎÁÌl%ÉiNò^Kö®˜j,óŒ1*u<½„è Êïßgt|Ù¼ …µYf‡?KQ„!IJWV¨¸6oÂâ ¿Þá5ŠÓ%Mêþ Ù]§—‹¼‚¹AÿÿcÇÁWâÁ`PH´<ñ5ì@®ï,¿¸±ßÁtHøDL[+„fD8ÄŠ9¥¥¯?@Ñ—ä›oÿ†ÓÀ§ß| yuô¼Cf‰“¤Z$ÏJ!Ê»B½%!åh…æÀŸá?:l"à“E¹º°&GÁ‚V‘Òcn!¶°˜²+ácé =ñ–/åX¹{9/Ò™¼Ç A¶9‰ û(.‡˜Åù#e¶ ·IÅ[tt%Á›-ï*„±pq"cTU»yÓE¨Œæw°áÉœ'¼–2«Ür ùÝʼnxd4n5h¼œÐšE”Úý8§ãîdj¤~¢%ŒïNξ}ñæ,9:ýSòÝÑ«WG§gú­k~϶9¨\žK¬ý­Ôg¶£}~üêñ·ö¥£¯Ožœý ®Ë§'g§Ç¯_'O_¼²LîåÑ«³“Çož½J^¾yõòÅëã+Ð<„bÒÊI(Ià›=«iÂ9¼¡Ô@ÃŽŽÜÂàOàc·Wj¨K*¿ êÄ•f§Géú:L²\äF› “·ò8Ûã|RuhA1Æ2·ÄÌ]ކZV=€Y¥ìØiÔØŒ¥ž*Ã'çJ?d²{Ä'周Éz):¿£{‡á¢±Ž$Šåî@óê­á×užJìT8óKáÌÔÓ‘gÏÌn“mÖ¨æP“XñŽ2ñzÖžWNŠCžÈÐ1vÚWv”rQ¡ë {1Äê…>‰žíª ~gq½•—•ÓǶ˥ƒ,ÂD†#£yߥ0ŽÂwd$hÊvmËkײÁ²<î#7LñÝ®Ÿ QÞ –³O¶e»xÅ‚oð£ÅÕõIæé3"èR+[•~±À®¥% ÎÏêÎM@¶>6OÃÈ㎷øsâ(ù$8pŽ‚vÜçºÂËõ + ]ÂÓx¢8öÁ!‡BØÊ¢ò“àyž6.~ iˆA‰¬—Á{Í{ÛñÜQv\1汕 Ož&þH(Dåî²{(”ãecqX,íÒÃy‰Cõm釋NÁZê„V÷ãøyÙ9á·!yº °uu¸rIp/Ã×’ ´ù û žÿ­©ÏFÂ'õdšâÂH—-5"œ ÄGÝ{Dª™èâlÜå6•lŸ$⦃L´¢q—Šš¹EÕJ"„<•yJÑï øº…àó!š—«zóq`šfÊf$Z: 'CtâõçÄŠ‚X¬…lºª_`Ž?G8Ç¿Ùã§Öˆ’íÑdG¢l…!ð;|í6%LG1)d‹@+iq®•dÏC1"4^È~’jf¡’oéº+éýV¯>¨-wGtÿ5IÔx°P©óÇÊ3§sÚ›!¿Îçé2Ùfá®F8Ëk4³Lh–•}}'I¯A¨ ' –”ñ®en0i–ÅEu ›ßr]GrvóÅÝpgk–ݰÊÞ¸ñh9Ó–ˆr[¢®z¯ K±oü-»ß£^ᖉ©ÃuòK´q%<×¼o C_ÏËcC ê ÄÍ'³0ÞìC5ÆùÉ™l[Í‘åÂ2Øb‘Å6“Hk[-¥ˆO“sºF°oÒYVaìËÕoÎÜñá'éÌtÔVbF±/_¨ý8‹lÖ›ËvÿC¿¿ãËIÌ3%MŠ´LGÅäpŸ±ç;wë&â0±8» §…Õ&Ûïí¤aû¡ƒ¾VSöãªNKyS Ò)H£8´F½~wÒÛͺ£ÉntÃøp¿÷Fãà“Ä}rjõú?YU~6îžÄj4€B\”°º‘®®éV¹€£-U;yÏ*;†dÛe'¢Ck§¶&@Q}ñ¦69aU¾iƒÛ]ÆŽu_£ ôX• [&?%N@I%m¾$]‘W¾uKf\äA{él—äW PC–Ë–¤Œ^'¸ÔÄ: JÚ‹“¬s烂þÑW+€¾*nï–*HÑÉ`jºNkŒæŒ5÷dâ>¦Ç ËáEéìÝÃädN5R,­üÈ7ÿ6<Še_^”|Á §þÆ? I‰·æx£Á"/YGÈ–;µa»£fþ±˜n^d(L.<š…íb‚?ËÊé2?g½EȤ·¯˜ø¸–¹æ¤÷Áh± ,{3–Ê$:[¬…(ð@! “¶0¿û ›ÿ}cã^¿G¶QïÉ=hÔþdvœ8Ù‰MUŸË“bŠ1j´IÏòi¶3€÷£Ý@q”üCr´á¥zöGÛ¯ÙþÈë=è:ÉÈô=YQ‡ýþ¾3ZÞÜQ:âöãø*:÷ûü{ˆïáßû4Ð×"«>+Ç'‹)ŸïwWUusøèÑEyÑ+–—¶¸›c° /Ü/(«JGoîpO¼vìܶ|ÍeP”Úˆ÷0®½¿¦”x®ýæ ô¦Ê~/yùêøèù×ÏŽy@ ws$ˆkš—ÍwkqHȔϋâGTC¼àð'–Ë8IF—<¸°«öÀËx ê>ׇN$—Þ2#C|A†@Žk„PF~ý9à#ö…U#(ÕG­„Z91›'±²¢i×KÂt”4Þ2ùLè:>/P¬AÜ*ùè§)f¼P`#³Ÿ$ÌÑMªçÔ³¥ôN¨Ã–ÀG‘‡´ì†ÏЇv‡äXß9–R y‘›ûÎPrfOC´«Aƒf# ʃƒF:QˆE^,e7Ÿ"KR͵}NÔŸuœÁOݦ¿£j3¨¸w\ÛsLOx´d"ùbhÜŽÇO‹jà^ò;ŠEŸ7“–½sISj¹i$ࢠV@ô^àM(Gkô2®œXHcÏâÔÁR¤ïÓ|žrcÏ—,Úӵݡ¥CÈ:v—\ ¼ö>wÁ8³€€ì=œÂ]j»铯lÐå`U@—*ˆÿoCsT˜ÝûX°°3äƒä²¹åæòòMšcÜ äþõÙ2G }¢ŠDŸœÁuäçÈqßö7Ì n"z“{ ×±â+ë‚®­Ùs`Ù¤E8)e‰£^né$n•C¼ ˜ÃY»ÍíF*b!×R°Í€E·ºAÂ[~Y௜»ãÇ.‘ü.0’¥ìõ²Sœ½-J+7¹Í ÒÎï0v#‰g¨‘¡h0³¯Ÿœxc/¬=ò`[“\-lµ“^âïÝ”§Ÿe3b Ùä%ÄM(Ç Ý*Ë|¡À½Ö·9¸TB«B¤.ÙÇ…œ¬Ú•/ÜæÓ±7ïJÒæÕ°¤ò$›‰¦ ¿/fö´¹¯m_¾EýèîA£YΊäÁK‹Ôö€î4ÐȘ0È 3'ÉìPWñ•96çÏ5Û”Zv/N1ñÒYmðˆyA[ Ü WýN"ÀŸØ;ÛÞN×p£Ï›éH‹ÃtâÐêã$âf š¦2 ‰ÒÕØa Çê qFb›÷”Þå{&Oòú´d}ƒã±Œí§^sˆñÁ„&ïÆÀ€xÉ£d)¿lYX9ä4¶ï÷E>ó—*F0 ƒ(ôRl¹ƒMö’?¿úúèìäyòøÅË?œ~Ã{ñu¤ÕD¡#ùLzgµòsÄ.ŽŽä¨ÍêÛ¨·7k”þ:k«¾lÍÔíðMØLR=En9±F¾¦DkïÈ?”m±Ê 8eñÓØEƒWKÛÙ\BÆÍlzµ@{ƒÝ'ðAá(‹s²+ +l²F¥þ  ¿ZŠåíNq{øðƒ-°,ö|€wÄÃØL š‹±ƒ.Í>P¶-ò8jÙAɰ²íICr·9c…#£ W œ7èõ'&ìMjIAÃfv3êE4‰ïÎ3´ÑVyÃ0ú-êÖa´Zð|a_eÎNN•ÀLž ô8êÉ™HNN“ÿõæèôìäìO>|‘j­ãÕéDžæ¶[*˜œTÌvc"žbÿê{´ùE×^‡CD0f}¸s™£cádœÀÐ ;ÁF;ËæŠ2ÓÔ“/xH'ƒHðC’Ê_)Q u¹“£Kµ§(Û2â."®òQ„ü÷œ+û= !È%ëHrü½ëM3Ò÷RF2Èìww!p7ç¼ÚfÙBIBC©ÏYÇ1AÙöt¹™´ @Ò9JL,ŽÒMP.#Áʹ`0æ®(ìÍ7_Aæý æEîòë˜&a¯Ù×y³‚%æÞáú`Ù‚m„‰^ÜQd%ö'.N}·# Ïù2žX‘+ç‹g‹e%=É5ñŸéSS@Eé5sŒÐÛÃê&½FÉ·• 8ž*ò0KU©Ü6‘©-2 ?uYk™}X æÎÒ‘‘’ãºùQt–SXSw‘UèI’¬M„°ÑâLOLtüp—lìgQ.¤·wVÜ. S“šÐv]„™ôiÏXULQ/N¤t„ž³²¼ÔX-ú&!Â+ËÉôÈi‚ìA¤Æ‹ŸUJq påz"²Z²+˜Ý”'‹AõŸB ìT ÉÁ>`ùjaX ËÜWD•CkÛŠ¥$½Û'V²žÅ!ž|¼y:²W+ÛÓž\Õ,¹Õ”BÏ+k¥Ñf`ŶsMaÔ "ŽPœ=˜ê¼”sgU¶¹¿S²°*h‘P™z æ‹ ]£Œó;Œh+ÄZ€£YÙíªŠ4ºÅ]K7YF1‚–˜ ?«8€Â;\)íaœ9a×>}™º2אּ’W*¹)ˆ¢U…N›×‹cMáQB»@ý\¨)Ç®åïjx[â7éÝÈïÒ*ÊDB`Ö&T¥¥è6~cÏôá<$dÞ¡Jæü®!øÔ¥a“aÖ.ò¶2&rüíg£í‡}‘qøŠÇÆv¼DȉèŽs¤ìgˆÆDy½ÏTäœùv*Ù«ä²ã\34ïzEîiÅéÁú<¿°Ëà™ÆP£4Šgë·Hõü¥à'“ùŒ F‹†âçÓ¼ÒúãR2žc(‚y6“ª%ÔžŽá JÞæü÷ævÝy)Qçd÷£&$Rm¥š§åe þ—J°…$Œ6[êœÍŒB=!zâN3¦À=[- ÿªLÙ¼tÞH’‡¯y.Ó ò03ÀÊÑ„¡ $¼lp"«‘žM@*N¬¬#eàŽ ö2޵aƒtA9šW"QÏháÐr}ÝNò[¯šßg …„YÔðJ¨CQJèÕ`%’Èê¯jy­‡EIv·>{vü]UÉ‹§­ –óû§Å|Î[ŒÊi ñ:Z®ùÖup5X½å +1vko{˜œ­÷Îwœr<àBŒÀ+`~nMÌ›‚Ÿ‰ÕQ¤——°6àcœQ| v Ⴒ"4ê™rÊŠNÀ#ß !é`CÎH£ÞÞÂÂxhx»+Q”«øRÄ=–Xöôê8}ðÀ=#ë4H¾ÊÀ¹†>Ýúš´B!+¼ÆR$ÏcOø Á*bÛ,”b£ÜbÊ람0«í‚}Z[™Õ™VèÏq^/4ä}á¢å"Ðç@ÈYfá’Á„ZÑ l¶ÜL%xnOìY”¤èR’ƒ~4rI\ Mµ• ÃF)â­>/ˆLuoQ+p£‚ÒYIŠYÎI ¤Ü;Ú0Ü2µ-kÏ ·p¿—œ½::}ý Y‚Hp² àÌÞ‰ö"b[ »é¸jßXÝiÛàq ¤¨£ñ /;8°­¦î†bÞ‚¸]1×îI‚Ž(;Z Ó©âyhûV³°¦ñ‡ë§.MHƱÆDà?…c‰³ ³+ĸJ‹ÂB{—¤št‘¦kBS© W mÛ˃ Î@¡îkW¤PƒæH §Q™8.ˆœ:’K-eãѵ=õRIŒ}ܧº4Õ01ýEÄì¥A§¹ˆMó–”4Ÿ+.é-ƒ±¯)/×yDX_’gt² F³Ým§€ï8»BÝñêìPXÇ—çÖ‚ÒQ|WPÐ(ާw`9Èñ«ç'§šƒüIYy4¤ ;˜”:6HèÌ>`ì>ÁÁ -6'†CÔkUe×7 íÙfqï‘P–?d¡(c#®K-ÆUòå^Ñ<ËbAÃÀxUb Â)Æ—ÀI}Ÿm‡¹âÈJDíÓªÈTcTÌ'¥¨à¡Íâ=‚ùRº ‡¼ ÎÆHVAè·%F7‰~‘/Âe(§Zó¡íód¾)ˆCÍRwsa ÚúáÔql»x ÝqÞ¦X 9$5ã ¯„ý³Mìö“VÞó%j¨ý3Ï‹eFÑÏzà÷[[éÞ-°š¥\íµ×pZ’2¢Úìjc´4®»Äˆ°­Š92 i–ƒÍÞ›Z‰‹2ô!gGÅ3sZG8úŽK2™®#Ö7í–}DËÎd‚kO§v㼉aèÉ“²å8Õà;åiû N\äÁ‡²RÜ∼ézñSLjè&ÞrŽ D7‰…JZƒÑi‚ðtÒÑ+áµÅÐ]æçƒ$ç”s3G33ÞÄv÷xDv VuÐï%Oßœ½yuœ¼:þãÉk±\œ}{ò:yvòøøôµ†-lÃaôùDö:_dˆ6e¹G”Vö£]=É¢-ˆDö_q»ת`  j<˜•oòeî³p9k彄ȯ*-€‚qá·0cGÏ Ý¨PôfžN…•o§ÙrAîr&%Áœ¼½½í].Vˆ;)¨y¶`Ø+¢0gG1);/Wv Yc÷±Îf!¾¨B*ä»Ðìˆ^jŒ³V§ûnHþuòè¼Áœ¼¹âöãÐ †¬DIŸOìDtvK`5§gFUÇE†¶çE0z\ü¡ÏÆ^¨Ð‚ój¶´ŒdGNm´ªjîEî>4Rt11üãK×sôš\EIÆIyb©7”šY;ÜM{¾,>0EC*TB™±êž\¬*`áԬ¶_aR΀»þ?Üm•ZåœÃ¸A˜,™:Dj™®âdÌ×Éíû7¾É@¶¢E â“ÅѨƒAÏ2$b@>1÷Áó´2ªÆÀ¶øÇ–úÒó‚Ðó’×9ØtÀCúàùóÇôëŽOí§v¾h¾ä;X¤ï²ó%^vþÉn•þ^ÃË•!‡Qe¥†…ÌR¥¶]XtN±Ð|i"ú$®ÌÐB³Ç¶< /ñmþcÎÊoÁÖàk`Yˆ§>Hk‡K£{,_»(ìr6[6ÈAÙ,…À¥šójtœŒævÒçlW™Ù x @€¬Ã'ÿ1DÍËEžbä5¦Ï@¼88¹¢£çzcFvÎ8x—ë( ·Š' ¸GÐ(tVÝ2“_R¥¶ç 6ꈃ•¡îpÔ»%p±éîh[ $ø ›ç—¹ÇrI'|}ZžZ+Ä£F^HÆèÌÃ0µ‚¤U¿ -m DµiÈ\²ËvoGÊÅ¿ê‘ð¢Ü¯ÝL¯ˆÃýs¶wldÛj»W)¦¼£µŒ/ /sQIÎ5ÄzÌp‡æ‚‡#èE_n¦ð€Øw½¯]¹T}òæù!¨²>´!òìP‘@±ò›¯>á1g #nšs鸈\f«ãmd"U›@ ãš;Úýæ’h ã•  -†(,zâJˆã“ŸBðóäOÇG¯ìß/Þ¼JNž»Â³/½A$E°ºe3o¤21¸Ô›äe„ê–4'.l’Æ;Ê]ZjcNÖ.ýVš¡j£M؆ø¸–>OgÌ~ãä¤)üÞC¯¹ˆ-'eÇJÑ31ª½{gBšk_­-W“Þ‘VÓøë¹ÿ0v5pž‘vÒ>€éõz4™Tø…ƒ#òÒOâ#&lÊ„ùìäõ™UãŽO^%g'gÏŽ_ë„CdB¸Cñ ýËÄÕÂ…Gcpßå>+ãׂ}…Â_¨Ú¢gP!8ফ%`_gKÌ‘B! Ý̱ ù¡.ÉŠýp–Á­Ôå)Z¹;Ö Yb·ßƒÚœ)ô4 Ÿyt›˜M~wVwÊÌ¿F7 8ç|Ö¨àÅUA&b—;c"¹ÃØÍ^†|ì—X»Š1Ø×ÖŠ8±ãúÐACïûC0ä>N©kDà†k;ü_ÿ÷_À)ûáÿú¿ÿÃLšÿDõøãm¤ëÝÛÐ×Pq¾íuÿç¬"˜ÛÓ«†[jKÛG"d½ðcÝW[ÁO¤ÔÖbž•èt;ä½/°¬|Ü»CRu%jÈ•$©7tƒú³×ˆ]ÿ^ÞØ&?-‘nèIž^.Š ­RË °Skló… ÑÔÛ¹Ç=}òl3%®:]îýÓþèaE¡ƒ¢ÇjË]kH [W)x¬×Øax‚5@æ ð‚:"¿Æ†p7/ø?q±×wåúOQ3–móYûæå½({sCJ9Pøç…½•!ê¿C2£ùùüèÀ½fTBbMk÷QÄhš[ÛÌbFÓ2ªÍü¨i¯þlÞ5j²«Õ"«,†#gÔÔÐiQe¯Çû\/nõH_pµk`ób·51¸Í‹p¬v¹™± ¥ÅU;›È x¬±!+]I {™Uâa44·yj/YvÃÆm>"¯­ß=¿ëBˆóþ¦•Ú<µ×w‹â¦Ì×^üÉ}¶_5ÔzñßkήÒÅ›I{³0zˆÂ›Èæ³öFR}Ö³‘Í»&§qà6ZÐ ÎÒËä ¬·‡†4+ìÿ}Ðð¯ÌŠþ>œìËGÑŠý}4îòW2ô¿ƒó*³SäSü÷Áä ¿/é#÷÷áî¤?Š@B³-ï‡üM Èü}<LÆFt¹Qþ>û‘Çò÷ñÁð`@ƒzÂe¶O¹²&É@ŸìíïïÓG^ƒÄq®æ©¯à«ê™{¹iNKbÂ4ûû~4ä_e`‘  _¨Ôe^ÛVþ9*àú÷Á`Ü?Ø¥×ßz¦ó¯u¿‡2[¡>ûéÁÁ`P[÷õpwwÐÖn0<ØZ;»°Û7Üïñ{BXöÓÉþ^Ÿ^C“× ÏÁbI¦ö‰½á@vw½ õ÷Áîh´·k”Fú÷ÁþþÄ’ÍÿcŽíEàhÕüÿ"ï(ï./numdiff-5.8.1/docs/numdiff.txi0000644000175000017500000051473212215353073015447 0ustar ivanoivano\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename numdiff.info @settitle Numdiff Manual 5.8 @afourpaper @c %**end of header @dircategory Text creation and manipulation @direntry * Numdiff: (numdiff). Comparing files containing numeric fields (and not only) @end direntry @copying @emph{``...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!''} @sp 2 @noindent This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright @copyright{} 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi @email{ivprimi(at)libero(dot)it} @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in @ref{GNU Free Documentation License}. @end quotation @end copying @titlepage @title Numdiff User Manual, version 5.8 @page @vskip 0pt plus 1filll @insertcopying @end titlepage @c Output the table of the contents at the beginning. @contents @ifnottex @node Top, Copying, (dir), (dir) @top Numdiff User Manual @insertcopying @end ifnottex @menu * Copying:: Numdiff Copying Conditions (GPL) * Acknowledgments:: Acknowledgments * Overview:: Introduction to numdiff * Installing:: How to install numdiff * Invoking numdiff:: How to use numdiff * ndselect:: (numdiff) ndselect. Selecting lines and fields * Invoking ndselect:: How to use ndselect * Filtering:: How to use the filter of numdiff * Warnings:: Various recommendations * GNU Free Documentation License:: The license covering this document * Index:: Complete index @end menu @node Copying, Acknowledgments, Top, Top @chapter Copying @cindex Copying Conditions @cindex License @cindex GNU General Public License @cindex GPL Numdiff (also written numdiff) 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. Numdiff 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 @uref{http://www.gnu.org/licenses/}. @node Acknowledgments, Overview, Copying, Top @chapter Acknowledgments @cindex Acknowledgments @cindex Thanks I want to thank Mr. Norman Clerman @email{norm(dot)opcon(at)fuse(dot)net} for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff. Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option @option{-S}. @node Overview, Installing, Acknowledgments, Top @chapter Overview @cindex Introduction @cindex Usage of numdiff @cindex Purposes @cindex How to use numdiff Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people. There are several ways to think about the differences between two files. One way to think of the differences is as a series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known @command{diff} program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, the @command{diff} program considers any change in the amount or in the type of the characters as a relevant difference. However, trough some command line options it also provides ways to suppress certain kinds of differences that are not important to the user. For instance, @command{diff} provides ways to ignore differences in the amount of white space between words or lines, or differences in alphabetic case. Another way to think of the differences is as a series of words that were deleted from, inserted in, or changed in one file to produce the other file. Here ``word'' refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word. The less known @command{wdiff} program by Franc,ois Pinard @email{pinard(at)iro(dot)umontreal(dot)ca} compares words in two files and reports the differences. At last, one can think of the differences between two files as a sequence of pairs of bytes that can be either identical or different. The @command{cmp} program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than @command{diff} or @command{wdiff} for comparing binary files. However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. Indeed, when you compare a couple of such files, what you want to obtain usually is a list of the numerical fields in the second file which @strong{numerically} differ from the corresponding fields in the first file. But, as you probably knows, a number can be written using different notations and programs like @command{diff} or @command{wdiff} can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values. For instance, 11.23 and 11.2300000 are the same number but represented in different ways. While, if you are interested in the numerical values, it is obvious that the difference in the representation is not meaningful and then it should be ignored, however @command{diff} and @command{wdiff} consider the previous one as a relevant difference and there is no way for you to tell these programs to ignore it! Another example of this type is given by 98765.4321 and 9.87654321E04 where the difference is only due to the use of the scientific notation in place of the ordinary decimal notation. Moreover, depending on your country you could stick to different conventions in writing numbers. For instance, the amount ``three hundred millions and fifty-two thousands of dollars and forty-six cents'' is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but @command{diff} and @command{wdiff} would report a difference, which probably is not what you want in a similar case. At last, sometimes you could want to ignore even differences in numerical values as long as they do not overcome a certain threshold. In other words, you could desire to suppress all ``small'' numerical differences too. For instance, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 must be considered equal, while 33 and 33.00011 must be reported as different. However, @command{diff} and @command{wdiff} can not be used to ignore ``small'' numerical differences, since they do not even know what a numerical difference is. What I have been saying till now explains why I decided to implement a new program with the capability to ``appropriately'' compare files containing numerical fields. In writing this program I was inspired by @command{ndiff}, a GPL'ed software by Nelson H. Baabe of the Salt Lake City University. The author of @command{ndiff} had the same good reasons as me to write @command{ndiff}. @command{ndiff} is actually a good tool and I used it for a while. But I did not completely like the way it works and so @command{numdiff} was born. Although @command{ndiff} inspired @command{numdiff}, they are completely different from the viewpoint of the source code: @command{numdiff} has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than @command{ndiff} does. @command{numdiff} can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. @command{numdiff} takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What @emph{corresponding} here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then @command{numdiff} performs a numerical comparison between them, else it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option @option{-s} or @option{-D}, @command{numdiff} takes as field delimiters the characters newline (@samp{\n}, ASCII code 0x0A), horizontal tabulation (@samp{\t}, ASCII code 0x09), and blank (@samp{ }, ASCII code 0x20). For example, if the file @file{list1} contains the data @verbatim accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i @end verbatim @noindent and file @file{list2} contains the data @verbatim Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line @end verbatim @noindent then the output of the command @samp{numdiff list1 list2} will be: @example ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @@ @@@@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @@ @@@@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @@ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @@ @@@@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @@ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @@ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @@ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" @end example At the same time @command{numdiff} will print the following error message on stderr: @example *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" @end example It is worth remarking that @command{numdiff} can recognize complex numbers, provided that they are written in the form @math{a+bi} or @math{a-bi} with no extra characters between the values @math{a}, @math{b} and the sign @math{+} or @math{-} (the symbol @math{i}, used to represent the imaginary unit, can be changed by a suitable command line option, @pxref{Invoking numdiff}). If you do not know what complex numbers are, do not worry! In this case probably you will never manage files containing complex numbers and so you can happily continue to ignore them. :) We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then @command{numdiff} version 4.x does @strong{not} show only the one line difference: once the files are out of synchronization @command{numdiff} 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option @option{-z @@}. If @file{bill1} and @file{bill2} are given by @verbatim Month Expenses ------------------------- Jan09 $ 233.56 Feb09 $ 850.77 Mar09 $ 12.55 Apr09 $ 524.00 May09 $ 78.25 Jun09 $ 230.00 Jul09 $ 443.10 Aug09 $ 67.65 Sep09 $ 10.00 Oct09 $ 201.45 Nov09 $ 110.00 Dec09 $ 200.27 ------------------------- Total $ 2961.60 @end verbatim @noindent and @verbatim Month Expenses Jan09 $ 234.00 Mar09 $ 13.00 May09 $ 78.25 Jul09 $ 443.10 Sep09 $ 10.00 Nov09 $ 110.00 Jan10 $ 200.00 ------------------------- Total $ 1088.35 @end verbatim @noindent respectively, then the differences between the two files are: @itemize @item the insertion of the separator @verb{|-------------------------|} in @file{bill1} before the list of the months, @item the deletion in @file{bill2} of the lines related to the expenses for the months February, April, June, August, October, December, @item small changes in @file{bill2} to the expenses of the months January 2009 and March, @item the presence in @file{bill2} of an entry for January 2010 just before the separator @verb{|-------------------------|}, @item the addition of an empty line to @file{bill2} after the separator @verb{|-------------------------|}, @item and the different values for the total sum of the expenses. @end itemize The output of the command @samp{numdiff -z @@ -V bill1 bill2} (I have added here the option @option{-V} to let Numdiff show which couples of lines it is comparing each time) is exactly then what you expect: @anchor{command} @example ---------------- ##2 <== ------------------------- ==> ---------------- ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 ##3 #:3 <== 233.56 ##2 #:3 ==> 234.00 @@ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3 ---------------- ##4 <== Feb09 $ 850.77 ==> ---------------- ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 ##5 #:3 <== 12.55 ##3 #:3 ==> 13.00 @@ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2 ---------------- ##6 <== Apr09 $ 524.00 ==> ---------------- ##8 <== Jun09 $ 230.00 ==> ---------------- ##10 <== Aug09 $ 67.65 ==> ---------------- ##12 <== Oct09 $ 201.45 ==> ---------------- ##14 <== Dec09 $ 200.27 ##8 ==> Jan10 $ 200.00 ##14 #:1 <== Dec09 ##8 #:1 ==> Jan10 @@ @@@@ ##14 #:3 <== 200.27 ##8 #:3 ==> 200.00 @@ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3 ---------------- <== ##10 ==> ---------------- ##16 <== Total $ 2961.60 ##11 ==> Total $ 1088.35 ##16 #:3 <== 2961.60 ##11 #:3 ==> 1088.35 @@ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0 +++ File "bill1" differs from file "bill2" @end example Numdiff has reported correctly the following differences: @itemize @item the second line of file @file{bill1}, i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file @file{bill2}. @item The lines related to the months January and March 2009 have been slightly modified in @file{bill2}, namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file @file{bill1} and the second one in file @file{bill2}. This information is printed by Numdiff in the form @example ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 @end example Analogously @example ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 @end example says that the line for March is the fifth one in @file{bill1} and the third one in @file{bill2}. @item The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file @file{bill1} and the 11th one in file @file{bill2}. @item The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10 and 12 of @file{bill1}, are not present in @file{bill2}. @item The line of @file{bill1} with the expenses for December 2009 is replaced in @file{bill2} by the line containing the value of the expenses for January 2010. @item The tenth line of @file{bill2}, i.e. the empty line after the separator, is not present in @file{bill1}. With respect to @file{bill1} this line represents then an addition. @end itemize If you compare @file{bill1} and @file{bill2} without using the option @option{-z @@}, the result is completely misleading. This is the output of @samp{numdiff -V bill1 bill2}: @example ---------------- ##2 <== ------------------------- ##2 ==> Jan09 $ 234.00 ##2 #:1 <== ------------------------- ##2 #:1 ==> Jan09 @@ @@@@ ##2 <== ##2 #>2 ==> $ 234.00 @@ Line 2 in file "bill1" is shorter than expected! ---------------- ##3 <== Jan09 $ 233.56 ##3 ==> Mar09 $ 13.00 ##3 #:1 <== Jan09 ##3 #:1 ==> Mar09 @@ @@@@ ##3 #:3 <== 233.56 ##3 #:3 ==> 13.00 @@ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1 ---------------- ##4 <== Feb09 $ 850.77 ##4 ==> May09 $ 78.25 ##4 #:1 <== Feb09 ##4 #:1 ==> May09 @@ @@@@ ##4 #:3 <== 850.77 ##4 #:3 ==> 78.25 @@ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0 ---------------- ##5 <== Mar09 $ 12.55 ##5 ==> Jul09 $ 443.10 ##5 #:1 <== Mar09 ##5 #:1 ==> Jul09 @@ @@@@ ##5 #:3 <== 12.55 ##5 #:3 ==> 443.10 @@ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1 ---------------- ##6 <== Apr09 $ 524.00 ##6 ==> Sep09 $ 10.00 ##6 #:1 <== Apr09 ##6 #:1 ==> Sep09 @@ @@@@ ##6 #:3 <== 524.00 ##6 #:3 ==> 10.00 @@ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1 ---------------- ##7 <== May09 $ 78.25 ##7 ==> Nov09 $ 110.00 ##7 #:1 <== May09 ##7 #:1 ==> Nov09 @@ @@@@ ##7 #:3 <== 78.25 ##7 #:3 ==> 110.00 @@ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1 ---------------- ##8 <== Jun09 $ 230.00 ##8 ==> Jan10 $ 200.00 ##8 #:1 <== Jun09 ##8 #:1 ==> Jan10 @@ @@@@ ##8 #:3 <== 230.00 ##8 #:3 ==> 200.00 @@ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1 ---------------- ##9 <== Jul09 $ 443.10 ##9 ==> ------------------------- ##9 #:1 <== Jul09 ##9 #:1 ==> ------------------------- @@ @@@@ ##9 #>2 <== $ 443.10 ##9 ==> @@ Line 9 in file "bill2" is shorter than expected! ---------------- ##10 <== Aug09 $ 67.65 ##10 ==> ##10 #>1 <== Aug09 $ 67.65 ##10 ==> @@ Line 10 in file "bill2" is shorter than expected! ---------------- ##11 <== Sep09 $ 10.00 ##11 ==> Total $ 1088.35 ##11 #:1 <== Sep09 ##11 #:1 ==> Total @@ @@@@ ##11 #:3 <== 10.00 ##11 #:3 ==> 1088.35 @@ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2 ---------------- ##12 <== Oct09 $ 201.45 ==> *** End of file "bill2" reached while trying to read line 12. File "bill1" has more lines than file "bill2", line 12 is the last one read from file "bill1" +++ File "bill1" differs from file "bill2" @end example Numdiff compares now the first, second, third line of @file{bill1} with the first, second, third line of @file{bill2} and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number. Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without doing any comparison between corresponding lines. The output of @samp{numdiff -z @@ -f bill1 bill2} is @example Month Expenses Month Expenses ------------------------- < Jan09 $ 233.56 Jan09 $ 234.00 Feb09 $ 850.77 < Mar09 $ 12.55 Mar09 $ 13.00 Apr09 $ 524.00 < May09 $ 78.25 May09 $ 78.25 Jun09 $ 230.00 < Jul09 $ 443.10 Jul09 $ 443.10 Aug09 $ 67.65 < Sep09 $ 10.00 Sep09 $ 10.00 Oct09 $ 201.45 < Nov09 $ 110.00 Nov09 $ 110.00 Dec09 $ 200.27 | Jan10 $ 200.00 ------------------------- ------------------------- > Total $ 2961.60 Total $ 1088.35 +++ File "bill1" differs from file "bill2" @end example @noindent and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since to guess the right options can be sometime tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, @pxref{Filtering}, I will explain in detail @itemize @item what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare, @item and how the related options affect the action of the filter. @end itemize By the way, it is even possible to use @option{-f} without any other additional option for the filter, like in @samp{numdiff -f bill1 bill2}, but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters. The option @option{-f} can be followed by an argument in the form of an integer number whose meaning will be explained later, @pxref{Use of the option -f}. Even if the output of @command{numdiff} is self-explanatory, in the next section I will explain in details all you have to know about it. @menu * Output format:: How numdiff prints its reports on stdout * Overview mode:: An alternative way to print listings of differences * Filter output:: How the built-in filter prints its report @end menu @node Output format, Overview mode, , Overview @section Output format @cindex Output format (numdiff) @cindex Format of the reports Let us go back to our first example. If the files @file{list1} and @file{list2} contain the data @verbatim accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i @end verbatim @noindent and @verbatim Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line @end verbatim @noindent respectively, then the output of the command @samp{numdiff list1 list2} will be: @example ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @@ @@@@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @@ @@@@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @@ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @@ @@@@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @@ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @@ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @@ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" @end example @command{numdiff} prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file. First this report indicates the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is ``1'' for the first field of a line, ``2'' for the second field, ``3'' for the third one and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol ``##'', while the field number by ``#:''. Then @command{numdiff} shows in what the difference consists. For instance, @example ##1 #:1 <== accident ##1 #:1 ==> Accident @@ @@@@ @end example @noindent means that the first field of the first line is ``accident'' in the first file, while in the second file it appears as ``Accident''. This difference could be then canceled by removing ``accident'' from the first file and inserting ``Accident'' in place of it. The arrows ``<=='' and ``==>'' try to visualize this idea. Analogously, @example ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 @end example @noindent means that the second field of the second line is ``-3455.321'' in the first file and ``-3455.320098'' in the second one. Since the contents of the field are numerical in both files, @command{numdiff} also prints the absolute and relative errors. The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files. The relative error (or relative difference) is actually defined in a more complicated way. If @emph{n1} is the value appearing in the first file and @emph{n2} is the value in the second file, then the absolute error is given by the formula @emph{A=|n1-n2|}, while the relative error @emph{R} is given by: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and at least one of them is zero, @item @emph{R = A/ min(|n1|, |n2|)} if @emph{n1} and @emph{n2} are both non zero and @emph{n2} differs from @emph{n1}. @emph{min(|n1|, |n2|)} denotes the minimum between the absolute value of @emph{n1} and the absolute value of @emph{n2}. @end itemize @noindent With these definitions of absolute and relative error it turns out that @emph{A(n2, n1) = A(n1, n2)} and @emph{R(n2, n1) = R(n1, n2)}. In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option @option{-F}, @pxref{Alternative formulas for the computation of the relative difference}. If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator: @verbatim @ @@ @end verbatim It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. When this is the case, @command{numdiff} reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in @example ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! @end example or in @example ##3 <== ##3 #>1 ==> A new line @@ Line 3 in file "list1" is shorter than expected! @end example In addition, @command{numdiff} shows the @i{tail} of the longer line, using the notation ``#>@math{n}'' to indicate the number @math{n} of the first field of the longer line for which there is no corresponding field in the shorter line. For example, @example ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! @end example @noindent means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file (@file{list2}). In this context, the symbol @verb{|<<*>>|} (when it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating @emph{newline} character. It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, @command{numdiff} prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached: @example *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" @end example Unless the option @option{-q} is used (@pxref{Invoking numdiff}), @command{numdiff} prints on standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering: @example +++ File "list1" differs from file "list2" @end example @node Overview mode, Filter output, Output format, Overview @section Overview mode @cindex Overview mode of numdiff @cindex Side-by-side report (numdiff) Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option @option{-O}. If this option is present on the command line, @command{numdiff} prints a side-by-side report instead of the usual one. For example, if @file{sheet1} contains the text @verbatim A 1 1 B 2 4 C 3 9 D 4 16 E 5 25 F 6 36 G 7 49 H 8 64 I 9 81 J 10 100 @end verbatim @noindent and @file{sheet2} the following lines @verbatim A 1 1 B 2 4 C 3.3 9.03 D 4 16 E 5.5 25.05 F 6.6 36 G 7.7 49.49 H 8 64 I 9.9 81.09 @end verbatim @noindent then @samp{numdiff -O sheet1 sheet2} prints this report @example A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!:C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!:E 5.5 25.05 F 6 36 :!:F 6.6 36 G 7 49 :!:G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!:I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example On the left side you can see the lines coming from the file specified as first on the command line, i.e. @file{sheet1}, on the right side the lines from the second file of the command line, in this case @file{sheet2}. In the middle there is a @i{gutter} which contains one of these markers: @table @samp @item white spaces The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options @option{-s}, @option{-D}, @option{-I}, @option{-X}, @option{-a}, @option{-r}, @option{-P} and @option{-N}. @item :!: The corresponding lines have at least one field which differs. @item :<: The files differ and only the first file contains the line. @item :>: The files differ and only the second file contains the line. @end table In the case of @file{sheet1} and @file{sheet2} a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated. The option @option{-O} can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, @pxref{Invoking numdiff}. The default value for the width of the side-by-side report is 130. No wonder then that the command @samp{numdiff -O40 sheet1 sheet2} displays a report with shorter lines: @example A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!: C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command @samp{numdiff -O40 sheet1 sheet2}: @example C 3 9 :!: C 3.3 9.03 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of @samp{numdiff -O24 sheet1 sheet2}: @example A 1 A 1 B 2 B 2 C 3 :!: C 3.3 D 4 D 4 E 5 :!: E 5.5 F 6 :!: F 6.6 G 7 :!: G 7.7 H 8 H 8 I 9 :!: I 9.9 J 10 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130. Notice that the numeric argument must immediately follow the option @option{-O}, intermediate spaces are not allowed. This is also the case for the optional argument of @option{-f}, while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument. The option @option{-O} can be used together with any other option of Numdiff except for @option{-f}, @option{-q}, @option{-U}, @option{-E}, @option{-V} and @option{-b}. When @option{-O} is in use, @option{-U}, @option{-E}, @option{-V} and @option{-b} are ignored. If @option{-q} is present on the command line together with @option{-O}, then @option{-O} is ignored. Finally, if both @option{-f} and @option{-O} are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. Therefore, the command @samp{numdiff -O40 -f sheet1 sheet2} displays the same report as @samp{numdiff -O40 sheet1 sheet2}, while the output of @samp{numdiff -f -O40 sheet1 sheet2} is given by @example A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 | C 3.3 9.03 D 4 16 D 4 16 E 5 25 | E 5.5 25.05 F 6 36 | F 6.6 36 G 7 49 | G 7.7 49.49 H 8 64 H 8 64 I 9 81 | I 9.9 81.09 J 10 100 < +++ File "sheet1" differs from file "sheet2" @end example @noindent and coincides then with the one of @samp{numdiff -f sheet1 sheet2}. The option @option{-O} can be used together with the filter to cope with the addition/deletion of lines. If the file @file{sheet3} contains the text @verbatim A 1 1 C 3.3 9.03 E 5.5 25.05 G 7.7 49.49 I 9.9 81.09 J 10 100.00 K 0 0.02 @end verbatim @noindent then @samp{numdiff -O40 sheet1 sheet3} prints a wrong report, as in the example with files @file{bill1} and @file{bill2}: @example A 1 1 A 1 1 B 2 4 :!: C 3.3 9.03 C 3 9 :!: E 5.5 25.05 D 4 16 :!: G 7.7 49.49 E 5 25 :!: I 9.9 81.09 F 6 36 :!: J 10 100.00 G 7 49 :!: K 0 0.02 H 8 64 :<: *** End of file "sheet3" reached while trying to read line 8. File "sheet1" has more lines than file "sheet3", line 8 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet3" @end example On the other hand, the presence of @option{-z @@} makes Numdiff always compare fields of corresponding lines, as shown by the output of the command @samp{numdiff -O40 -z @@ sheet1 sheet3}: @example A 1 1 A 1 1 B 2 4 :<: C 3 9 :!: C 3.3 9.03 D 4 16 :<: E 5 25 :!: E 5.5 25.05 F 6 36 :<: G 7 49 :!: G 7.7 49.49 H 8 64 :<: I 9 81 :!: I 9.9 81.09 J 10 100 J 10 100.00 :>: K 0 0.02 +++ File "sheet1" differs from file "sheet3" @end example Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters. @node Filter output, , Overview mode, Overview @section Output of the filter @cindex Filter output (numdiff) The output produced just by running the filter (option @option{-f}) is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers: @table @samp @item white space The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options @option{-s}, @option{-D}, @option{-I}, @option{-X}, @option{-z} and @option{-Z}. @item | The corresponding lines differ, and they are either both complete or both incomplete. @item < @itemx ( The files differ and only the first file contains the line. @item > @itemx ) The files differ and only the second file contains the line. @item \ The corresponding lines differ, and only the first line is incomplete. @item / The corresponding lines differ, and only the second line is incomplete. @end table An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked @samp{\} if the line from the first file is incomplete, @samp{/} if the line from the second file is. Like @option{-O}, the option @option{-f} can take an optional argument which allows to set the width of the output and eventually to suppress common lines, @pxref{Invoking numdiff} and @ref{Use of the option -f}. More generally, the user can always make @command{numdiff} avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, @pxref{Invoking numdiff}. @node Installing, Invoking numdiff, Overview, Top @chapter Installing @cindex Install @cindex Compile @cindex Build To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option @option{-o} to write its output to a specified file, the option @option{-D} for macros predefinition, the option @option{-l} to search for a specified library, and the options @option{-I} and @option{-L} to add a given directory to the search path for include and library files respectively. In addition, you need a POSIX implementation of the @command{make} utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands @command{rm} and @command{find}. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Numdiff has been successfully compiled and tested on: @itemize @item Slackware@registeredsymbol{} GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), @item Slackware GNU/Linux 11 with GCC 3.4.6, @item Slackware GNU/Linux 12.2 with GCC 4.2.4, @item Slackware GNU/Linux 13 with GCC 4.3.3, @item Debian@registeredsymbol{} GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), @item Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), @item Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), @item SunOS@registeredsymbol{} 5.8 with GCC 2.95.3, and @item SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. @end itemize Configuration, building and installation of Numdiff can be performed through the standard three steps: @example ./configure make make install @end example @noindent If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then, after @samp{make}, you will have to type and run @example make install-nls @end example By default, @samp{make install} will install all the files in @file{/usr/local/bin}, @file{/usr/local/info} etc. You can specify an installation prefix other than @file{/usr/local} using the option @option{--prefix} in the @command{configure} step, for instance @samp{--prefix=$HOME}: @example ./configure --prefix=$HOME @end example @noindent For better control, you can use the options @option{--bindir}, @option{--infodir}, and so on. Type @samp{./configure --help} to obtain the complete list of all the available options. Anyway, the documentation files, including a full User Manual available in several formats (HTML, PDF and plain ASCII text), will always be put in @file{@var{DOCDIR}/numdiff}, where @var{DOCDIR} is the path specified by the option @option{--docdir} or, if this option has not been given to @command{configure}, @file{@var{PREFIX}/local/doc}. Here @var{PREFIX} is the installation prefix specified by the option @option{--prefix} or the default @file{/usr/local}. Once Numdiff has been installed you can remove all the files previously installed by a simple @samp{make uninstall}. If you have also installed the localization files trough @samp{make install-nls}, then, in order to remove also these ones, use @samp{make uninstall-nls} in place of @samp{make uninstall}. Between the options accepted by @command{configure} there are @option{--enable-debug}, @option{--enable-optimization}, @option{--enable-nls} and @option{--enable-gmp}. The option @option{--enable-debug} turns on debugging when compiling the source code. This is obtained by passing to the compiler the @option{-g} option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable @env{DBGFLAGS} before calling @command{configure}. The option @option{--enable-optimization} turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the @option{-O} option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable @env{OPTFLAGS} before calling @command{configure}. The option @option{--enable-nls} turns on Natural Language Support. But you do not need to use it explicitly, since Natural Language Support is enabled by default. However, you can disable it by using @option{--disable-nls}. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through @example ./configure --disable-nls make make install @end example @noindent Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option @option{--enable-gmp=no} or @option{--disable-gmp} to the configure script before building the program, like in @example ./configure --disable-gmp make make install @end example @noindent Enabling the old internal support for multiple precision arithmetic is deprecated, @pxref{with GNU MP is better}. The latest version of GNU MP is available at @uref{ftp://ftp.gnu.org/gnu/gmp/}. See the GNU MP web page at @uref{http://gmplib.org/} for up-to-date information on GNU MP. @node Invoking numdiff, ndselect, Installing, Top @chapter Invoking numdiff @cindex Invoking numdiff @cindex Options, command line (numdiff) @cindex Command line options for numdiff @cindex Synopsis (numdiff) @cindex Diagnostics (numdiff) @cindex Predefined settings of numdiff @strong{SYNOPSIS} @example numdiff -h|--help|-v|--version @end example or @example numdiff [-s @var{IFS}][-D @var{DELIMS}][-a @var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}]] [-r @var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}]][-2][-F @var{NUM}][-# @var{NUM}][-P][-N][-I] [-c @var{CURRNAME}][-d @var{C1C2}][-t @var{C1C2}][-g @var{N1N2}][-p @var{C1C2}][-n @var{C1C2}][-e @var{C1C2}] [-i @var{C1C2}][-X 1:@var{RANGE}][-X 2:@var{RANGE}][-E][-U][-b][-V][-O[@var{NUM}]][-q][-S] [-z 1:@var{RANGE}][-z 2:@var{RANGE}][-Z 1:@var{RANGE}][-Z 2:@var{RANGE}][-m][-H][-f[@var{NUM}]] [-T][-B][-l @var{PATH}][-o @var{PATH}] @var{FILE1} @var{FILE2} @end example @noindent where @var{FILE1} and @var{FILE2} are the names of the two files to compare and @var{RANGE}, @var{RANGE1} and @var{RANGE2} stay for a positive integer value or for a range of integer values, like @samp{1-}, @samp{3-5} or @samp{-7}. In the first case @command{numdiff} prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer and some information about the way it was built. In the second case @command{numdiff} compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be @verb{|-|}, which refers to stdin. @noindent @strong{OPTIONS} @table @option @item -s, --separators=@var{IFS} Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If @var{IFS} is prefixed with @samp{1:} or @samp{2:} then use the given delimiter set only for the lines from the first or the second file respectively @item -D, --delimiters=@var{DELIMS} Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline). If @var{DELIMS} is prefixed with @samp{1:} or @samp{2:} then use the given delimiter set only for the lines from the first or the second file respectively @item -a, --absolute-tolerance=@var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}] Set to @var{THRVAL} the maximum absolute difference permitted before that two numeric fields are regarded as different (The default value is zero). If a @var{RANGE} is given, use the specified threshold only when comparing fields whose indexes lie in @var{RANGE}. If both @var{RANGE1} and @var{RANGE2} are given and have the same length, then use the specified threshold when comparing a field of @var{FILE1} lying in @var{RANGE1} with the corresponding field of @var{FILE2} in @var{RANGE2} @item -r, --relative-tolerance=@var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}] Set to @var{THRVAL} the maximum relative difference permitted before that two numeric fields are regarded as different (The default value is zero). If a @var{RANGE} is given, use the specified threshold only when comparing fields whose indexes lie in @var{RANGE}. If both @var{RANGE1} and @var{RANGE2} are given and have the same length, then use the specified threshold when comparing a field of @var{FILE1} lying in @var{RANGE1} with the corresponding field of @var{FILE2} in @var{RANGE2} @item -2, --strict Consider two numerical values as equal only if both absolute and relative difference do not exceed the corresponding tolerance threshold @item -F, --formula=@var{NUM} Use the formula indicated by @var{NUM} to compute the relative errors. If @var{NUM} is 0 use the classic formula. If @var{NUM} is 1 compute the relative errors by considering the values in @var{FILE1} as sample values. If @var{NUM} is 2 compute the relative errors by considering the values in @var{FILE2} as sample values. @item -#, --digits=@var{NUM} Set to @var{NUM} the number of digits in the significands used in multiple precision arithmetic @item -P, --positive-differences Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file @item -N, --negative-differences Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file @item -I, --ignore-case Ignore changes in case while doing literal comparisons @item -c, --currency=@var{CURRNAME} Set to @var{CURRNAME} the currency name for the two files to compare. @var{CURRNAME} must be prefixed with @samp{1:} or @samp{2:} to specify the currency name only for the first or the second file @item -d, --decimal-point=@var{C1C2} Specify the characters representing the decimal point in the two files to compare @item -t, --thousands-separator=@var{C1C2} Specify the characters representing the thousands separator in the two files to compare @item -g, --group-length=@var{N1N2} Specify the number of digits forming each group of thousands in the two files to compare @item -p, --plus-prefix=@var{C1C2} Specify the (optional) prefixes for positive values used in the two files to compare @item -n, --minus-prefix=@var{C1C2} Specify the prefixes for negative values used in the two files to compare @item -e, --exponent-letter=@var{C1C2} Specify the exponent letters used in the two files to compare @item -i, --imaginary-unit=@var{C1C2} Specify the characters representing the imaginary unit in the two files to compare @item -X, --exclude=1:@var{RANGE} Select the fields of the first file that have to be ignored @item -X, --exclude=2:@var{RANGE} Select the fields of the second file that have to be ignored @item -E, --essential While printing the differences between the two compared files show only the numerical ones @item -U, --dummy While printing the differences between the two compared files neglect all the numerical ones (dummy mode) @item -b, --brief Suppress all messages concerning the differences discovered in the structures of the two files @item -V, --verbose For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files @item -O, --overview[=@var{NUM}] Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If @var{NUM} is zero or is not specified, output at most 130 columns per line. If @var{NUM} is a positive number, output at most @var{NUM} columns per line. If @var{NUM} is a negative number, do not output common lines and display at most -@var{NUM} columns per line. @item -q, --quiet, --silent Suppress all the standard output @item -S, --statistics Add some statistics to the standard output @item -z, --blur-if-numerical=1:@var{RANGE} Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric @item -z, --blur-if-numerical=2:@var{RANGE} Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric @item -Z, --blur-unconditionally=1:@var{RANGE} Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure @item -Z, --blur-unconditionally=2:@var{RANGE} Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure @item -m, --minimal During synchronization try hard to find a smaller set of changes @item -H, --speed-large-files During synchronization assume large files and many scattered small changes @item -f, --test-filter[=@var{NUM}] Run only the filter and then show the results of its attempt to synchronize the two files. If @var{NUM} is zero or is not specified, output at most 130 columns per line. If @var{NUM} is a positive number, output at most @var{NUM} columns per line. If @var{NUM} is a negative number, do not output common lines and display at most -@var{NUM} columns per line. @item -T, --expand-tabs Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option @option{-O} or @option{-f}) @item -B, --binary Treat both files as binary files (only meaningful under Doz/Windoz) @item -l, --warnings-to=@var{PATH} Redirect warning and error messages from stderr to the indicated file @item -o, --output=@var{PATH} Redirect output from stdout to the indicated file @item -h, --help Show help message and predefined settings @item -v, --version Show version number, Copyright, Distribution Terms and NO-Warranty @end table @noindent @strong{DIAGNOSTICS} The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error. @noindent @strong{DEFAULT NUMERIC FORMAT (for both files to compare):} @anchor{Default Numeric Format} Currency name = "" @sp 1 Decimal point = `.' @sp 1 Thousands separator = `,' @sp 1 Number of digits in each thousands group = 3 @sp 1 Leading positive sign = `+' @sp 1 Leading negative sign = `-' @sp 1 Prefix for decimal exponent = `e' @sp 1 Symbol used to denote the imaginary unit = `i' @noindent @strong{SOME EXPLANATIONS} The options @option{-U}, @option{-E}, @option{-b} and @option{-q} are used to hide part of the standard output of the program according to some rule. The option @option{-U} triggers the @i{dummy mode}. In this mode @command{numdiff} does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The @i{dummy mode} is so called since in this mode @command{numdiff} does not perform the job for which I created it. The option @option{-E} triggers the @i{essential mode}. In this mode @command{numdiff} only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when, comparing two lines, it turns out that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option @option{-X}, then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line. The option @option{-b} triggers the @i{brief mode}. In this mode @command{numdiff} does not print the differences in the structure of the two files (see above for an explanation about what they are). The option @option{-q} triggers the @i{quiet mode}. In this mode @command{numdiff} does not print anything on the standard output. The @i{quiet mode} is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program. The option @option{-O} activates the @i{overview mode}, which makes @command{numdiff} print a side-by-side report in the form described in section @ref{Overview mode}. The optional numeric argument after @option{-O} must immediately follow, intermediate spaces are not allowed. The option @option{-O} can be used together with any other option of Numdiff except for @option{-f}, @option{-q}, @option{-U}, @option{-E}, @option{-V} and @option{-b}. When @option{-O} is in use, @option{-U}, @option{-E}, @option{-V} and @option{-b} are ignored. If @option{-q} is present on the command line together with @option{-O}, then @option{-O} is ignored. Finally, if both @option{-f} and @option{-O} are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. The option @option{-V} triggers the @i{verbose mode}. In this mode @command{numdiff} produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files @file{data1} and @file{data2} contain the data @verbatim 12 33 22 44.5 0.008 1.002 221.12 -34.56 water 2101.21 boats @end verbatim @noindent and @verbatim 12 33 22.3 44.5 0.008 1.202 221.12 -34.56 2101.21 boats dogs @end verbatim @noindent respectively, then the command @samp{numdiff -V data1 data2} will print the following output: @example ---------------- ##2 <== 22 44.5 ##2 ==> 22.3 44.5 ##2 #:1 <== 22 ##2 #:1 ==> 22.3 @@ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2 ---------------- ##3 <== 0.008 1.002 ##3 ==> 0.008 1.202 ##3 #:2 <== 1.002 ##3 #:2 ==> 1.202 @@ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1 ---------------- ##4 <== 221.12 -34.56 water ##4 ==> 221.12 -34.56 ##4 #>3 <== water ##4 ==> @@ Line 4 in file "data2" is shorter than expected! ---------------- ##5 <== 2101.21 boats ##5 ==> 2101.21 boats dogs ##5 <== ##5 #>3 ==> dogs @@ Line 5 in file "data1" is shorter than expected! +++ File "data1" differs from file "data2" @end example You must care that the options @option{-b} and @option{-V} will be overridden if @option{-q} is also set. The amount of additional information printed by @option{-V} is trivially influenced by the options that alter the way @command{numdiff} performs the comparisons between fields (for instance @option{-a}, @option{-r}, @option{-2}, @option{-N}, @option{-P}, @option{-U}, @option{-E}, @option{-I}, @option{-X}). In the headers printed by @command{numdiff} when in ``verbose mode'' can also appear the symbol @verb{|<<*>>|}. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating @strong{newline} character. The option @option{-S} adds to the standard output of @command{numdiff} a statistical report with the following information: @itemize @item the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options @option{-P} and @option{-N}) and the number of those comparisons whose outcome is a relevant numerical difference. @item the largest absolute error in the set of relevant numerical differences and the corresponding relative error, @item the largest relative error in the set of relevant numerical differences together with the corresponding absolute error, @item the sum and the arithmetic mean of all absolute errors, @item the sum and the arithmetic mean of the relevant absolute errors, @item the square root of the sum of the squares of all absolute errors, @item the square root of the sum of the squares of the relevant absolute errors, @item the quadratic mean of all absolute errors, and @item the quadratic mean of the relevant absolute errors. @end itemize By relevant numerical differences and relevant absolute errors I mean those ones appearing in the output of @command{numdiff} when the options @option{-U}, @option{-f}, @option{-O} and @option{-q} are not used. The information printed by @option{-S} is not removed when this option is used together with @option{-q}. The options @option{-a}, @option{-r}, @option{-2}, @option{-P} and @option{-N} affect the way @command{numdiff} performs the comparisons between numerical values. Without any of these options, @command{numdiff} considers two numerical fields as equal when their difference is zero. The option @option{-a} can be used to order that two numerical fields must be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the @option{-a} option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values. Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, @command{numdiff} prints the difference in its report, unless some other option, for example @option{-P} or @option{-N}, makes the difference unimportant. If nothing else follows the threshold value, what has been just explained applies to all comparisons between numerical fields. To see this in practice, if the file @file{many_columns1} contains the text @verbatim A 1 1.2 1 0.1 11.0 1.0e-1 B 2 2.4 4 0.4 24.0 1.0e-2 C 3 3.6 9 0.9 39.0 1.0e-3 D 4 4.8 16 1.6 416.0 1.0e-4 @end verbatim @noindent and the contents of the file @file{many_columns2} are given by @verbatim A 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D 4.4 4.32 16.16 1.6 416.039 -1.0e-4 @end verbatim @noindent then the output of the command @samp{numdiff -a 0.5 many_columns1 many_columns2} is @example +++ Files "many_columns1" and "many_columns2" are equal @end example @noindent The highest absolute difference between a field from @file{many_columns1} and the corresponding field from @file{many_columns2} is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5. On the other hand, the command @samp{numdiff -a 0.35 many_columns1 many_columns2} prints the report @example ---------------- ##3 #:3 <== 3.6 ##3 #:3 ==> 3.24 @ Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:3 <== 4.8 ##4 #:3 ==> 4.32 @ Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4 and |4.32 - 4.8| = 0.48 exceed the value 0.35, and the other differences are below this threshold. If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of @option{-a}. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (`:'). If you specify only one range of numbers after the threshold value, @command{numdiff} uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, @samp{-a 0.01:2-5} sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. If the files @file{many_columns1} and @file{many_columns2} are the same as before, then the command @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2} displays the following report @example ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option @option{-a} more times. The command @samp{numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2} sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report: @example ---------------- ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent Observe that @verb{|:2|} and @verb{|:7|} are abbreviations of @verb{|:2-2|} and @verb{|:7-7|}, respectively. It is even possible to use range expressions like @samp{@var{m}-} or @samp{-@var{n}}. The first expression corresponds to all fields starting from the @var{m}th one (inclusive) till to the end of line, the second selects all fields from the first one till to the @var{n}th one, both inclusive. If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), @command{numdiff} uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, @samp{-a 1e-4:3-5:4-6} sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option @option{-X}, which makes @command{numdiff} ignore one or more fields from one of the compared files. The file @file{many_columns3}: @verbatim A I 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B II 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C III 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D IV 4.4 4.32 16.16 1.6 416.039 -1.0e-4 @end verbatim @noindent has one column more than the file @file{many_columns1}, namely the second one. When comparing @file{many_columns1} with @file{many_columns3} it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option @option{-X} (for a full description of the use of this option, @pxref{Restriction of the comparison to particular fields}). Ignoring the second field of each line of @file{many_columns3} implies that the fields in the third column of this file are compared with the corresponding fields of the second column of @file{many_columns1}, the fields in the fourth column of @file{many_columns3} are compared with the ones in the third column of @file{many_columns1}, and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that @samp{-X 2:2} makes @command{numdiff} compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of @file{many_columns1} with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of @file{many_columns3}. Therefore, the command @samp{numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3} will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from @file{many_columns1} with the fourth, fifth, and sixth field respectively of the corresponding line of @file{many_columns3}. This explains why the report of @samp{numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3} @example ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:6 <== 11.0 ##1 #:7 ==> 11.011 @ Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:6 <== 24.0 ##2 #:7 ==> 24.024 @ Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:6 <== 39.0 ##3 #:7 ==> 39.039 @ Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:6 <== 416.0 ##4 #:7 ==> 416.039 @ Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" @end example @noindent does not show the same difference listing of the command @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2}. If what you want is to obtain the same difference listing of @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2}, then the right command is @samp{numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3}. The report printed by this last command is indeed @example ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" @end example @noindent and up to the positions of the fields from @file{many_columns3} coincides with the one of @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2}. The option @option{-a} can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command @samp{numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2} @example ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:4 <== 9 ##3 #:4 ==> 9.09 @ Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:4 <== 16 ##4 #:4 ==> 16.16 @ Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position. Finally, if @option{-a} is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example @option{-P} or @option{-N}, makes @command{numdiff} ignore it. The option @option{-r} can be used to order that two numerical fields must be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the @option{-r} option. As for the option @option{-a}, the argument of @option{-r} can have several forms. These forms are the same accepted by @option{-a} and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one. The relative difference is normally defined in this way. If @emph{n1} is a value from the file specified as first on the command line and @emph{n2} is the corresponding value from the second file, then the absolute difference is given by the formula @emph{A=|n1-n2|}. The relative difference @emph{R} is given by: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and at least one of them is zero, @item @emph{R = A/ min(|n1|, |n2|)} if @emph{n1} and @emph{n2} are both non zero and @emph{n2} differs from @emph{n1}. @emph{min(|n1|, |n2|)} denotes the minimum between the absolute value of @emph{n1} and the absolute value of @emph{n2}. @end itemize @noindent With this definition of relative difference it turns out that @emph{R(n2, n1) = R(n1, n2)}: the relative difference does not change if you only change the ordering of the compared files on the command line. @anchor{Alternative formulas for the computation of the relative difference} However there are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option @option{-F} together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with @samp{-F 1} the relative difference @emph{R} is computed according to these rules: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and @emph{n1} is zero, @item @emph{R = |n1-n2|/ |n1|} if @emph{n1} is not zero and @emph{n2} differs from @emph{n1}. @end itemize @noindent With @samp{-F 2} the rules become: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and @emph{n2} is zero, @item @emph{R = |n1-n2|/ |n2|} if @emph{n2} is not zero and @emph{n2} differs from @emph{n1}. @end itemize @noindent With the last two sets of rules it is not anymore true that @emph{R(n2, n1) = R(n1, n2)}: the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that @var{file1} and @var{file2} contain @verbatim 1 9.9 0.5 440 @end verbatim @noindent and @verbatim 1.2 8 0.51 400 @end verbatim @noindent respectively. Then @samp{numdiff @var{file1} @var{file2}} displays @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 @ Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 @ Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" @end example @noindent @samp{numdiff -F 1 @var{file1} @var{file2}} prints @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 @ Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 @ Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2 +++ File "file1" differs from file "file2" @end example @noindent the output of @samp{numdiff -F 2 @var{file1} @var{file2}} is @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 @ Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 @ Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" @end example @noindent @samp{numdiff -F 1 -r 0.195 @var{file1} @var{file2}} displays @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 +++ File "file1" differs from file "file2" @end example @noindent and, finally, @samp{numdiff -F 2 -r 0.195 @var{file1} @var{file2}} displays @example ---------------- ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 +++ File "file1" differs from file "file2" @end example @noindent The option @option{-2} is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option @command{numdiff} considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option @option{-2} @command{numdiff} regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if @var{file1} contains the unique line @verbatim 100 @end verbatim @noindent and @var{file2} the line @verbatim 100.00012 @end verbatim @noindent then the output of the command @samp{numdiff @var{file1} @var{file2}} will be @example ---------------- ##1 #:1 <== 100 ==> 100.00012 @@ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "@var{file1}" differs from file "@var{file2}" @end example @noindent The output of the commands @samp{numdiff -a 1.0e-4 @var{file1} @var{file2}} and @samp{numdiff -r 1.0e-6 @var{file1} @var{file2}} will be the same as above, but @samp{numdiff -a 1.0e-4 -r 1.3e-6 @var{file1} @var{file2}} and @samp{numdiff -a 1.3e-4 -r 1.0e-6 @var{file1} @var{file2}} will print the message @example +++ Files "@var{file1}" and "@var{file2}" are equal @end example @noindent since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold. On the other hand, the commands @samp{numdiff -a 1.0e-4 -r 1.3e-6 -2 @var{file1} @var{file2}} and @samp{numdiff -a 1.3e-4 -r 1.0e-6 -2 @var{file1} @var{file2}} will print the message @example ---------------- ##1 #:1 <== 100 ==> 100.00012 @@ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "@var{file1}" differs from file "@var{file2}" @end example @noindent since the option @option{-2} makes @command{numdiff} regard two values as equal only if both absolute and relative difference do not exceed the corresponding threshold of tolerance. The option @option{-P} makes @command{numdiff} consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than the real part and, respectively, the imaginary part of the first value. Finally, the option @option{-N} makes @command{numdiff} consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than the real part and, respectively, the imaginary part of the first value. The options @option{-B}, @option{-I}, @option{-l}, @option{-o}, @option{-h} and @option{-v} do not require further explanations. The options @option{-l} and @option{-o} are only supplied for the users of some poorly designed operating systems (like MSDog or MSWindoze), whose default shell does not allow the redirection of standard error and standard output. The option @option{-I} has no effect on the outcome of numerical comparisons but affects the action of the filter, @pxref{Filtering}. The option @option{-s} requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples: @example numdiff -s ' \t\n,;:.' @var{file1} @var{file2} numdiff -s ' \t\n\r\f\v"\:;' @var{file1} @var{file2} numdiff -s `` \t\n''' @var{file1} @var{file2} @end example @noindent If you want to include in the set of delimiters also some special characters, e.g the @strong{blank}, then you must quote it. I recommend you to always use the single quote character (@verb{|'|}) to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell. @noindent @command{numdiff} recognizes and interprets the following sequences of characters within the argument passed to the option @option{-s}: @itemize @item @samp{\a} alert (bell), @item @samp{\b} backspace, @item @samp{\f} form feed, @item @samp{\n} newline, @item @samp{\r} carriage return, @item @samp{\s} blank, @item @samp{\t} horizontal tab, @item @samp{\v} vertical tab, @item @samp{\\} backslash, @item @samp{\@var{nnn}} the eight-bit character whose value is the octal value @var{nnn} (one to three digits), @item @samp{\x@var{HH}} the eight-bit character whose value is the hexadecimal value @var{HH} (one or two digits). @end itemize @noindent By passing the string @samp{ \t\n,;:.} as argument for the option @option{-s}, one tells @command{numdiff} to use as field delimiters the characters @strong{blank}, @strong{horizontal tab}, @strong{newline}, @strong{comma}, @strong{semicolon}, @strong{colon} and @strong{dot}. Passing @samp{ \t\n} as argument to the option @option{-s} is the same as not using at all the option @option{-s}, since @strong{blank}, @strong{horizontal tab} and @strong{newline} are the default field delimiters. In the list of field delimiters the character @strong{backslash} (@samp{\}) is always treated in a special way. If it forms, combined with the subsequent character(s), one of the backslash escape sequences listed above, then it is considered to be an escape character and the whole escape sequence is decoded as shown above. Otherwise, the @strong{backslash} is just ignored. Therefore, the delimiters specified by the command line @example numdiff -s' \t\n\\\"' @var{file1} @var{file2} @end example @noindent are @strong{blank}, @strong{horizontal tab}, @strong{newline}, @strong{backslash} and @strong{double quote}, since @samp{\\} and @samp{\"} are interpreted by @command{numdiff} as @samp{\} and @samp{"}. Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be constrained to use the double quote character (@samp{"}) to enclose the set of field delimiters, e.g. if the single quote character is used as field delimiter, like in one of the precedent examples. However you must take into account that in this case the shell could make some substitutions on the command line before executing @command{numdiff}. For instance, if your shell is GNU bash, then (citing the man page of GNU bash) @quotation Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of @samp{$}, @samp{`}, and @samp{\}. The characters @samp{$} and @samp{`} retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: @samp{$}, @samp{`}, @samp{"}, @samp{\}, or @strong{}. A double quote may be quoted within double quotes by preceding it with a backslash @enddots{} The special parameters * and @@ have special meaning when in double quotes @dots{} @end quotation @noindent Therefore, if the set of delimiters is formed by @samp{ }, @samp{\t}, @samp{\n}, @samp{\} and @samp{"}, and you decide to enclose them in double quotes, the @command{numdiff} command line should be @example numdiff -s'' \t\n\\\\\"'' @var{file1} @var{file2} @end example @noindent and not @example numdiff -s'' \t\n\\\"'' @var{file1} @var{file2} @end example @noindent In this last case the shell would indeed replace the string @samp{ \t\n\\\"} @noindent by @samp{ \t\n\"} @noindent and then @command{numdiff} would take @samp{ }, @samp{\t}, @samp{\n} and @samp{"} as field delimiters. @command{numdiff} requires the presence of the @strong{newline} in the set of characters passed to @option{-s}. The absence of the @strong{newline} in the set of delimiters causes the issue of a suitable warning message and the termination of the program. If you run Numdiff with the option @option{-B} (@option{--binary}) on files created under MSDog/MSWindoze, then you should put the @strong{carriage return} in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by @command{numdiff}, since @command{numdiff} would consider the final @strong{carriage return} as part of the field and this one would be then qualified as non-numerical. You can specify different delimiters for the two files to compare by putting the prefix @samp{1:} or @samp{2:} in front of the set of characters passed to @option{-s}. If the argument of @option{-s} begins with @samp{1:}, the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is @samp{2:}, then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case @command{numdiff} uses the default field delimiters @strong{blank}, @strong{tab} and @strong{newline} for the other file. Therefore, with @samp{numdiff -s '1:: \n' @var{file1} @var{file2}} the program will take @strong{colon}, @strong{blank} and @strong{newline} as delimiters for @var{file1}, and @strong{blank}, @strong{tab} and @strong{newline} as delimiters for @var{file2}. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Starting from version 5.8 @command{numdiff} allows to specify whole strings as field delimiters instead of single characters. To this purpose the option @option{-D} is provided. Assume that file @file{register1} and file @file{register2} contain @verbatim --A: +1.0--- --B: -2.0--- --C: +3.0--- --D: -4.0--- --E: +5.0--- --F: -6.0--- @end verbatim @noindent and @verbatim --a: +1.1--- --b: -2.2--- --c: +3.3--- --d: -4.4--- --e: +5.5--- --f: -6.6--- @end verbatim @noindent respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character @verb{|-|} (minus) as delimiter via the option @option{-s}: if you do it, then the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option @option{-D} you can tell @command{numdiff} to consider the strings @verb{|--|} and @verb{|---|} as field delimiters but not the single character @verb{|-|}. To see this in practice, look at the output of the command @samp{numdiff -D ': -- --- \s \n' register1 register2}: @example ---------------- ##1 #:1 <== A ##1 #:1 ==> a @ @@ ##1 #:2 <== +1.0 ##1 #:2 ==> +1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##2 #:1 <== B ##2 #:1 ==> b @ @@ ##2 #:2 <== -2.0 ##2 #:2 ==> -2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##3 #:1 <== C ##3 #:1 ==> c @ @@ ##3 #:2 <== +3.0 ##3 #:2 ==> +3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:1 <== D ##4 #:1 ==> d @ @@ ##4 #:2 <== -4.0 ##4 #:2 ==> -4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##5 #:1 <== E ##5 #:1 ==> e @ @@ ##5 #:2 <== +5.0 ##5 #:2 ==> +5.5 @ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##6 #:1 <== F ##6 #:1 ==> f @ @@ ##6 #:2 <== -6.0 ##6 #:2 ==> -6.6 @ Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "register1" differs from file "register2" @end example @noindent The argument @samp{-D ': -- --- \s \n'} instructs @command{numdiff} to regard every occurrence of a colon (@verb{|:|}), of a blank (@verb{|\s|}), of a newline (@verb{|\n|}), as well as every occurrence of the strings @verb{|--|} and @verb{|---|} as field delimiters. The minus sign in front of the negative numbers is then handled as it should be. In general the argument to the option @option{-D} is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option @option{-D} is @example @var{string1} @var{string2} ... @var{stringN} @end example @noindent where @var{string1}, @var{string2}, and so on are sequences of one or more characters (strings) containing no blank. Mind that at least one of these strings must be @samp{\n}. In addition, if a string contains the newline character, this must be the only one: strings like @samp{#\n}, @samp{%%\n}, or @samp{\s\n} are not allowed (entering such a string makes the program terminate after issuing a suitable warning message). Since the blank character has a special meaning for the shell, if the argument of @option{-D} is formed by two or more strings it should be quoted either with a single (@samp{'}) or with a double quote (@samp{"}). Quoting is also adviced if one of the strings passed to @option{-D} contains a character (or a sequence of characters) having a special meaning for the shell. For the usage of single and double quoting to delimit the argument of @option{-D} the same warnings and recommendations apply as for the argument of @option{-s}. If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence @option{\s}, like in the example above: within the argument of @option{-D} the blank character is always interpreted as a separator of adjacent delimiters. More generally, when writing the argument of @option{-D} the same escape sequences are allowed as for the argument of @option{-s}. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between @file{ledger1}: @example In Out Jan 1200.00@euro{} 1000.00@euro{} Feb 800.40@euro{} 650.00@euro{} Mar 1620.50@euro{} 1500.00@euro{} Apr 760.00@euro{} 900.00@euro{} Total 4380.90@euro{} 4050.00@euro{} Difference: +330.90@euro{} @end example @noindent and @file{ledger2}: @example In Out Jan 1100.00@euro{} 1000.00@euro{} Feb 800.40@euro{} 750.00@euro{} Mar 1620.50@euro{} 1700.00@euro{} Apr 750.00@euro{} 900.00@euro{} Total 4270.90@euro{} 4350.00@euro{} Difference: -79.10@euro{} @end example Since the Euro symbol is attached to all values, @command{numdiff} cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command @samp{numdiff ledger1 ledger2} shows: @example ---------------- ##3 #:2 <== 1200.00@euro{} ##3 #:2 ==> 1100.00@euro{} @ @@ ---------------- ##4 #:3 <== 650.00@euro{} ##4 #:3 ==> 750.00@euro{} @ @@ ---------------- ##5 #:3 <== 1500.00@euro{} ##5 #:3 ==> 1700.00@euro{} @ @@ ---------------- ##6 #:2 <== 760.00@euro{} ##6 #:2 ==> 750.00@euro{} @ @@ ---------------- ##8 #:2 <== 4380.90@euro{} ##8 #:2 ==> 4270.90@euro{} @ @@ ##8 #:3 <== 4050.00@euro{} ##8 #:3 ==> 4350.00@euro{} @ @@ ---------------- ##10 #:2 <== +330.90@euro{} ##10 #:2 ==> -79.10@euro{} @ @@ +++ File "ledger1" differs from file "ledger2" @end example @noindent The trick to perform the comparison in the proper way consists in specifying the @euro{} symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If @file{ledger1} and @file{ledger2} are encoded in UTF-8, this can be done by using the option @option{-D} with the argument @samp{\xE2\x82\xAC \s \t \n}, since the hexadecimal representation of @euro{} in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command @samp{numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2} shows that in this case @command{numdiff} performs indeed a numerical comparison of the values contained in the two files: @example ---------------- ##3 #:2 <== 1200.00 ##3 #:2 ==> 1100.00 @ Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2 ---------------- ##4 #:3 <== 650.00 ##4 #:3 ==> 750.00 @ Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1 ---------------- ##5 #:3 <== 1500.00 ##5 #:3 ==> 1700.00 @ Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1 ---------------- ##6 #:2 <== 760.00 ##6 #:2 ==> 750.00 @ Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2 ---------------- ##8 #:2 <== 4380.90 ##8 #:2 ==> 4270.90 @ Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2 ##8 #:3 <== 4050.00 ##8 #:3 ==> 4350.00 @ Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2 ---------------- ##10 #:2 <== +330.90 ##10 #:2 ==> -79.10 @ Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0 +++ File "ledger1" differs from file "ledger2" @end example If @file{ledger1} and @file{ledger2} had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to @euro{} in this other encoding should have been passed to @option{-D}. As for @option{-s}, with @option{-D} you can specify different delimiters for the two files to compare by means of the prefixes @samp{1:} and @samp{2:}, like in @samp{numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file}. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, @command{numdiff} uses the default field delimiters @strong{blank}, @strong{tab} and @strong{newline} for the other file. If you run Numdiff with the option @option{-B} (@option{--binary}) on files created under MSDog/MSWindoze, you should always include the character @samp{\r} in the set of field delimiters. The option @option{-s} and @option{-D} can appear more than once on the command line. In case of conflicts, @command{numdiff} assumes as set of delimiters for a given file the one specified last on the command line. By means of the option @option{-#} the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If @command{numdiff} has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. @noindent Take into account that an higher precision makes the execution of @command{numdiff} slower. This is particularly true if @command{numdiff} is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, you have to care that @command{numdiff} truncates the value of a numerical field if it has @i{too much} digits with respect to the current precision. To be precise, denoted by @var{P} the current value of the precision, the following rules apply. @itemize @item If @command{numdiff} has been built with its own internal support for multiple precision arithmetic, then @itemize @item if a number is written in ordinary decimal notation, @command{numdiff} will consider, in addition to all digits of the integer part, only the first @var{P} digits of the fractional part; @item if a value is written in scientific notation, then @command{numdiff} will only consider the first @var{P} digits of the fractional part of the mantissa. @end itemize @item If @command{numdiff} uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first @var{P} digits of the fractional part of the mantissa are considered. @end itemize @noindent You can find out whether your local version of @command{numdiff} is relying on GNU MP or not by executing the command @samp{numdiff -v}. If @command{numdiff} uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: @example The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. @end example @noindent If @command{numdiff} does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) @example The software has been built with its own internal support for multiple precision arithmetic. @end example @noindent By means of the option @option{-c} the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored by @command{numdiff} whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of @option{-c} with @samp{1:} or @samp{2:} it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files @file{money1}: @verbatim Profits Expenses +$430.10 -$300.50 +$750.20 -$550.02 +$876.24 -$720.00 Totals $2056.54 -$1570.52 @end verbatim @noindent and @file{money2}: @verbatim Profits Expenses USD430.10 -USD300.50 USD750.20 -USD550.02 USD876.24 -USD720.15 Totals 2056.54 -1570.67 @end verbatim To properly compare them we have to tell @command{numdiff} that @samp{$} and @samp{USD} are the currency symbols for @file{money1} and @file{money2} respectively. This can be achieved by @samp{-c 1:$} and @samp{-c 2:USD}. The output of the command @samp{numdiff -c 1:$ -c 2:USD money1 money2} is @example ---------------- ##5 #:2 <== -$720.00 ##5 #:2 ==> -USD720.15 @ Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4 ---------------- ##7 #:3 <== -$1570.52 ##7 #:3 ==> -1570.67 @ Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5 +++ File "money1" differs from file "money2" @end example @noindent as it should be. The argument of @option{-c} may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write @samp{-c @euro{}} to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options @option{-s} and @option{-D}. For example, if the files to compare are encoded in UTF-8, you can set @euro{} as currency name by adding @samp{-c '\xE2\x82\xAC'} to the command line of @command{numdiff}, since the hexadecimal representation of @euro{} in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC. Mind that in this case the argument of @option{-c} has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell. To see this in practice, if @file{euro1} contains the text @example Profits Expenses +@euro{}430.10 -@euro{}300.50 +@euro{}750.20 -@euro{}550.02 +@euro{}876.24 -@euro{}720.00 @end example @noindent and @file{euro2} the text @example Profits Expenses +@euro{}430.10 -@euro{}300.00 +@euro{}750.20 -@euro{}550.02 +@euro{}876.00 -@euro{}720.00 @end example @noindent then the report of @samp{numdiff -c '\xE2\x82\xAC' euro1 euro2} is @example ---------------- ##3 #:2 <== -@euro{}300.50 ##3 #:2 ==> -@euro{}300.00 @ Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3 ---------------- ##5 #:1 <== +@euro{}876.24 ##5 #:1 ==> +@euro{}876.00 @ Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4 +++ File "euro1" differs from file "euro2" @end example Please consider that @option{-c} is only provided to let @command{numdiff} regard a field as numeric also in presence of a currency name immediately before its first digit: @command{numdiff} does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. @command{numdiff} can even cope with the currency name when it appears in a complex number. For example, with @samp{-c EUR} @command{numdiff} considers @verb{|+EUR12-EUR0.24i|} and @verb{|+12-0.24i|} as equal. The options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e} and @option{-i} can be used to instruct @command{numdiff} about the numeric formats used in the files which it is going to compare. The two files to compare do not have to adopt the same numeric format and then @command{numdiff} allows to specify different numeric formats for them. Each of the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, and @option{-i} can have as argument one or two (single-byte) characters, in particular one or two digits if the option is @option{-g}. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option @option{-d} can be used to tell @command{numdiff} which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command @samp{numdiff -d_ @var{file1} @var{file2}}, then @command{numdiff} will understand that both in @var{file1} and in @var{file2} the character @strong{underscore} (@samp{_}) is used in place of the default one (@samp{.}) to indicate the position of the decimal point in the numerical values. But if the command is @samp{numdiff -d_: @var{file1} @var{file2}}, then @command{numdiff} will understand that the decimal point is indicated by the character @strong{underscore} in @var{file1}, and by @strong{colon} (@samp{:}) in @var{file2}. If you omit to use one of the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, and @option{-i}, then the corresponding attribute will take its default value, @pxref{Default Numeric Format}. You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option @option{-g} must be digits, the arguments of the options @option{-d} and @option{-t} must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function @code{ispunct} returns a non zero value), those ones of the options @option{-p}, @option{-n}, @option{-e} and @option{-i} must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function @code{isgraph} returns a non zero value). It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command @samp{numdiff -d,. @var{file1} @var{file2}} will make @command{numdiff} abnormally terminate after printing the error message: @example The numeric format specified for the first file is illegal, the following symbols should be all different while two or more of them are actually equal: Decimal point = `,' Thousands separator = `,' Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' @end example @noindent With the option @option{-d} we have told @command{numdiff} that in the first file the decimal point is indicated by the character @strong{comma}, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. @strong{comma}, for both files to compare. In this way we have implicitly told that in @var{file1} the character @strong{comma} represents both decimal point and thousands separator. Since this is not reasonable, @command{numdiff} refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option @option{-t}: @samp{numdiff -d,. -t., @var{file1} @var{file2}}. Of course, we assume here that the decimal point and the thousands separator are represented in @var{file1} by @strong{comma} and @strong{dot} respectively, in @var{file2} by @strong{dot} and @strong{comma}. I strongly suggest you, whenever you write a file, to avoid using the same symbol to mean two different things (like would be using @strong{comma} for both decimal point and thousands separator), it is nonsense. At last, it is possible (but stupid) to use as argument for the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, and @option{-i} one of the characters used as delimiters in the files to compare. In such a case @command{numdiff} does not complain, but you have to consider that it first uses the set of field delimiters to split the files into fields and then, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. However, it should never happen to specify as argument for one of the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, and @option{-i} a character which is also used as field delimiter: in writing a file you should avoid (and people usually avoid it) to use the same symbol to mean two different things. What we have said also explains why the argument of the option @option{-c} should never contain one or more field delimiters. @anchor{Restriction of the comparison to particular fields} The option @option{-X} can be used to restrict the comparison between files to a certain group of fields. @anchor{Use of the option -X} This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument specifies the position(s) of the fields that @command{numdiff} has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand. The argument passed to @option{-X} can start with a prefix, which must be either @samp{1:} or @samp{2:}. @samp{1:} refers to the file passed as first on the command line, @samp{2:} to the file specified as second. With the prefix @samp{1:} only the fields of the first file corresponding to the given position(s) are ignored. Similarly, if you want to ignore only fields from the second file you have to use the prefix @samp{2:}. The option @option{-X} can appear more times on the command line, in which case @command{numdiff} will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file @file{List1} contains the data @verbatim * a 1 1 1 1 * b 2 2 2 2 * c 3 3 3 3 * d 4 4 4 4 * e 5 5 5 5 @end verbatim @noindent and @file{List2} the data @verbatim 1 1.1 1.01 A 1.001 1.0001 2 2.2 2.02 B 2.002 2.0002 3 3.3 3.03 C 3.003 3.0003 4 4.4 4.04 D 4.004 4.0004 5 5.5 5.05 E 5.005 5.0005 @end verbatim @noindent then the output of @samp{numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2} is @example ---------------- ##1 #:4 <== 1 ##1 #:2 ==> 1.1 @@ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:5 <== 1 ##1 #:3 ==> 1.01 @@ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##2 #:4 <== 2 ##2 #:2 ==> 2.2 @@ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:5 <== 2 ##2 #:3 ==> 2.02 @@ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##3 #:4 <== 3 ##3 #:2 ==> 3.3 @@ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:5 <== 3 ##3 #:3 ==> 3.03 @@ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##4 #:4 <== 4 ##4 #:2 ==> 4.4 @@ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:5 <== 4 ##4 #:3 ==> 4.04 @@ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##5 #:4 <== 5 ##5 #:2 ==> 5.5 @@ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ##5 #:5 <== 5 ##5 #:3 ==> 5.05 @@ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2 +++ File "List1" differs from file "List2" @end example @noindent Numdiff cuts off from @file{List1} the fields in the positions 1, 2 and 6 and from @file{List2} the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of @file{List1} with the first, second and third field respectively of the corresponding line of @file{List2}. An equivalent form of the command @samp{numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2} is given by @samp{numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2} : since the sixth field is cut off from both files we can refer to it without a prefix. As you can see, you can specify a range of fields by using the notation @samp{@var{m}-@var{n}}, where @var{m} and @var{n} are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like @samp{@var{m}-} or @samp{-@var{n}}. The first expression corresponds to all fields starting from the @var{m}th one (inclusive) till to the end of line, the second selects all fields from the first one till to the @var{n}th one (inclusive). Therefore the command @samp{numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2} is equivalent to @samp{numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2} or to @samp{numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2}. Mind that the largest field number you can use while writing a specification for the option @option{-X} is 32768. If you use the option @option{-X} the exit status of @command{numdiff} reflects the outcome of the restricted comparison. For instance, the exit status of @samp{numdiff -X 8- @var{file1} @var{file2}} is 1 only if @command{numdiff} has found a difference in the first seven fields of @var{file1} and @var{file2}. If the two files differ only in the fields after the seventh one, then @command{numdiff} ends with a zero exit status. Going back to the example with @file{List1} and @file{List2}, the output of @samp{numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2} is @example +++ Files "List1" and "List2" are equal @end example @noindent since every field of @file{List1} at position 3 is equal to the first field in the corresponding line of @file{List2}. The exit code returned by the program to the shell is zero. The options @option{-z}, @option{-Z}, @option{-m}, @option{-H}, @option{-f}, and @option{-T} influence the action of the filter and their use is then described later, @ref{Filtering}. Care that @option{-z} and @option{-Z} need both an argument in the same form required by @option{-X}. Since version 5 Numdiff accepts also long options to conform to the GNU standards. Now it is then possible, e.g., to use @samp{--separators='\n\t %'} or @samp{--separators '\n\t %'} instead of using @samp{-s '\n\t %'}. The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option. The argument of a long option may or may not preceded by the @verb{|=|} sign. The only exceptions are the options @option{--test-filter} and @option{--overview}, for which the presence of the @verb{|=|} before the argument is mandatory. Then @samp{--test-filter=60} is correct while @samp{--test-filter 60} is not accepted. @node ndselect, Invoking ndselect, Invoking numdiff, Top @chapter Selecting lines and fields for the comparison @cindex ndselect (introduction to its use) @cindex Tools Together with the version 5.x of Numdiff is shipped the program @command{ndselect}. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file @file{list1} contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24: @verbatim 12 3.46410161513775458705 13 3.60555127546398929312 14 3.74165738677394138558 15 3.87298334620741688518 16 4 17 4.12310562561766054982 18 4.24264068711928514641 19 4.35889894354067355224 20 4.47213595499957939282 21 4.58257569495584000659 22 4.69041575982342955457 23 4.7958315233127195416 24 4.89897948556635619639 @end verbatim @noindent and @var{list2} contains @emph{suitable} approximations of the square root only for the numbers between 12 and 21 which are multiple of 3: @verbatim 12 3.46410162002945508100 15 3.87298387096774193548 18 4.24264705882352941176 21 4.58260869565217391304 @end verbatim @noindent These approximations could have been obtained by using the famous Heron's algorithm, which, given an approximation @code{a} for the square root of a number @code{x}, computes a better approximation by the formula @code{a := 0.5 * (x/a + a)}. What we want now is to understand by using @command{numdiff} how good the approximations contained in file @var{list2} are. Unfortunately, we cannot execute directly the command @samp{numdiff list1 list2}, since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15 respectively. To make the comparison in the right way, one could open @file{list1} in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file. An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities @command{head} and @command{sed}, in this particular case @samp{head -n 10 list1 | sed -n -e '1~3 p' > List1}. A quick explanation for the ones who do not know how to use @command{head} and @command{sed}: the previous command extracts from @file{list1} the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed on the file @file{List1}, which then looks like: @verbatim 12 3.46410161513775458705 15 3.87298334620741688518 18 4.24264068711928514641 21 4.58257569495584000659 @end verbatim Once obtained @file{List1}, we can perform the comparison between the values we are interested in by means of @samp{numdiff List1 list2} . Unfortunately, this trick only works if you have installed the GNU version of @command{sed}, which, as far as I know, is the only one to provide the extension @var{first~step} to specify line addresses. That is way I decided to implement @command{ndselect}, which allows to obtain the same result as above with the simpler command @samp{ndselect -b 1 -e 10 -s 3 list1 > List1} The meaning of the arguments passed to the options @option{-b}, @option{-e}, and @option{-s} is the following: we tell @command{ndselect} to print every third line of file @file{list1} (the option @option{-s} specifies the step) starting from the first one (the option @option{-b} specifies the beginning) and ending within the tenth one possibly inclusive (the option @option{-e} specifies the end). Because of the presence of the redirection operator @code{>}, the previous command sends to the file @file{List1} what @command{ndselect} would print on the screen (standard output). Since version 5.6 @command{ndselect} can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option @option{-F} to indicate the position of the first field to print, the option @option{-L} to indicate the position of the last field that can be printed, the option @option{-I} to set the increment when selecting the fields. In addition, the option @option{-S} can be used to specify a set of field delimiters different from the default one (which consists of @strong{blank}, @strong{tab} and @strong{newline}). As for @command{numdiff}, the field delimiters are used to split the input lines into fields. The option @option{-S} of @command{ndselect} recognizes and accepts the same escape sequences of @command{numdiff} options @option{-s}, @option{-D}, and @option{-c}. As example consider the selection of the even fields between the second and the sixth one inclusive from the file @file{many_many_columns}, whose contents are shown here: @verbatim A | I | 1.1 | 1.08 | 1.01 | 0.1 | 11.011 | -1.0e-1 B | II | 2.2 | 2.16 | 4.04 | 0.4 | 24.024 | -1.0e-2 C | III | 3.3 | 3.24 | 9.09 | 0.9 | 39.039 | -1.0e-3 D | IV | 4.4 | 4.32 | 16.16 | 1.6 | 416.039 | -1.0e-4 E | V | 5.5 | 5.40 | 25.25 | 2.5 | 525.416 | -1.0e-5 F | # | # | # | # | # | # | # @end verbatim @noindent This selection can be accomplished by means of the command @samp{ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns}, whose output shows only the selected fields: @example I | 1.08 | 0.1 II | 2.16 | 0.4 III | 3.24 | 0.9 IV | 4.32 | 1.6 V | 5.40 | 2.5 # | # | # @end example @noindent Of course, you can also select particular fields of particular lines, as shown by the output of the command @samp{ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns}: @example I | 1.08 | 0.1 IV | 4.32 | 1.6 @end example By default, @command{ndselect} reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option @option{-O}. This one recognizes and accepts the same escape sequences of @command{numdiff} options @option{-s}, @option{-D}, and @option{-c}. For example, @samp{ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns} puts two horizontal tabulations after every printed field: @verbatim I 1.08 0.1 IV 4.32 1.6 @end verbatim Even if the implementation of a filter in @command{numdiff} and the addition of the option @option{-X} have made @command{ndselect} much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than @command{numdiff}. The complete synopsis of @command{ndselect} can be found in the next chapter. @node Invoking ndselect, Filtering, ndselect, Top @chapter Invoking ndselect @cindex Invoking ndselect @cindex Options, command line (ndselect) @cindex Command line options for ndselect @cindex Synopsis (ndselect) @cindex Diagnostics (ndselect) @noindent @strong{SYNOPSIS} @example ndselect -h|--help|-v|--version @end example or @example ndselect [-b @var{N}][-e @var{N}][-s @var{N}][-F @var{N}][-L @var{N}][-I @var{N}][-S @var{IFS}][-D @var{DELIMS}] [-O @var{OSEP}][-x][-l @var{PATH}][-o @var{PATH}][@var{FILE}] @end example @noindent where @var{FILE} is the name of the file to read from. In the first case @command{ndselect} prints a short help or/and version number, Copyright, License notice and NO-Warranty disclaimer. In the second case @command{ndselect} prints on the standard output a subset of lines and fields from @var{FILE}. The complete path of @var{FILE} should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. @noindent @strong{OPTIONS} @table @option @item -b, --beginning, --start=@var{N} Set to @var{N} the number of the first line to print (The default behavior is to start with line number 1) @item -e, --end=@var{N} Set to @var{N} the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) @item -s, --step=@var{N} Set to @var{N} the increment to use when selecting the lines to print (The default value for the increment is 1) @item -F, --first-field=@var{N} Set to @var{N} the number of the first field to print (The default behavior is to start with field number 1) @item -L, --last-field=@var{N} Set to @var{N} the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) @item -I, --increment=@var{N} Set to @var{N} the increment to use when selecting the fields to print (The default value for the increment is 1) @item -S, --separators=@var{IFS} Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of characters is space, tab and newline) @item -D, --delimiters=@var{DELIMS} Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) @item -O, --output-separator=@var{OSEP} Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines) @item -x, --omit-empty-lines Do not print empty lines @item -l, --warnings-to=@var{PATH} Redirect warning and error messages from stderr to the indicated file @item -o, --output=@var{PATH} Redirect output from stdout to the indicated file @item -h, --help Show this help message @item -v, --version Show version number, Copyright, Distribution Terms and NO-Warranty @end table @noindent Passing 0 as argument to the option @option{-L} or to @option{-e} is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively). @noindent @strong{DIAGNOSTICS} The exit status is 0 in case of normal termination, -1 (255) in case of error. @noindent As @command{numdiff} does, since version 5 also @command{ndselect} accepts long options. Thus, instead of @samp{ndselect -b 1 -e 10 -s 3 list1 > List1} you can write @samp{ndselect --start=1 --end=10 --step=3 list1 > List1}. The usage of the option @option{-D} is the same as for @command{numdiff}. The option @option{-S} corresponds to the option @option{-s} of @command{numdiff}. @node Filtering, Warnings, Invoking ndselect, Top @chapter Using the filter of numdiff @cindex Filter Since version 5 it is possible to activate a filter when calling @command{numdiff}, so that the program performs automatically the comparison in the desired way. Recalling the example of chapter 6, if you run the command @command{numdiff -z 2- -V list1 list2} you obtain the following result: @example ---------------- ##1 <== 12 3.46410161513775458705 ##1 ==> 12 3.46410162002945508100 ##1 #:2 <== 3.46410161513775458705 ##1 #:2 ==> 3.46410162002945508100 @ Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9 ---------------- ##2 <== 13 3.60555127546398929312 ==> ---------------- ##3 <== 14 3.74165738677394138558 ==> ---------------- ##4 <== 15 3.87298334620741688518 ##2 ==> 15 3.87298387096774193548 ##4 #:2 <== 3.87298334620741688518 ##2 #:2 ==> 3.87298387096774193548 @ Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7 ---------------- ##5 <== 16 4 ==> ---------------- ##6 <== 17 4.12310562561766054982 ==> ---------------- ##7 <== 18 4.24264068711928514641 ##3 ==> 18 4.24264705882352941176 ##7 #:2 <== 4.24264068711928514641 ##3 #:2 ==> 4.24264705882352941176 @ Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6 ---------------- ##8 <== 19 4.35889894354067355224 ==> ---------------- ##9 <== 20 4.47213595499957939282 ==> ---------------- ##10 <== 21 4.58257569495584000659 ##4 ==> 21 4.58260869565217391304 ##10 #:2 <== 4.58257569495584000659 ##4 #:2 ==> 4.58260869565217391304 @ Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6 ---------------- ##11 <== 22 4.69041575982342955457 ==> ---------------- ##12 <== 23 4.7958315233127195416 ==> ---------------- ##13 <== 24 4.89897948556635619639 ==> +++ File "list1" differs from file "list2" @end example Numdiff has recognized that the lines of @file{list1} with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23 and 24 have been deleted from @file{list2}. The numerical comparison has been done by likening each line of @file{list2} to the line of @file{list1} which displays the square root for the same integer value. The output obtained running the filter of Numdiff by @command{numdiff -f -z 2- list1 list2} confirms this: @example 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" @end example If you compare the command @command{numdiff -z 2- -V list1 list2} with the one used for the files @file{bill1} and @file{bill2}, @pxref{command}, you surely notice that the filter has been invoked in different ways, first with @option{-z @@} and then with @option{-z 2-}. The @i{synchronization} procedure used by the filter is based on @i{blurring} and byte-by-byte comparison. The options @option{-z} and @option{-Z} are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by @option{-X}, @pxref{Use of the option -X}, but accept additionally the special value @samp{@@} as abbreviation for the range of fields @samp{1-}. Then the specifications @samp{1:@@}, @samp{2:@@} and @samp{@@} are used to mean all fields of the first file, of the second one or of both, respectively. Employing @option{-z} and @option{-Z} in the right way is extremely important to let the filter work as desired. For instance, @command{numdiff -f -z @@ list1 list2} matches the lines of @file{list1} and @file{list2} in the same wrong way @example 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 15 3.87298387096774193548 14 3.74165738677394138558 18 4.24264705882352941176 15 3.87298334620741688518 21 4.58260869565217391304 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 < 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 < 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" @end example @noindent as Numdiff would do without employing the filter. It is essential then to understand what @i{blurring a field} means and how the filter uses blurring to match the lines of the files to compare. After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option @option{-X}, then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of @i{place card}. After doing this, the filter converts all remaining numerical fields to a standard format and compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one and how to match the remaining lines to create a one-to-one correspondence. Only at this point @command{numdiff} inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option @option{-X} compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values. Blurring the right fields is essential to match the lines from the two files appropriately before doing any numerical comparison. Without blurring, the numerical fields could prevent @command{numdiff} from an appropriate matching of the lines, in case some of these are present in only one file, by creating confusion with their (maybe small) numeric differences. Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option @option{-z} indicate which fields of which file have to be blurred @strong{under the condition that they are recognized as numeric fields}. Non-numeric fields are left by @option{-z} untouched (no blurring occurs for them). Then @samp{-z 1:5-7} makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric. By the option @option{-Z} you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, @samp{-Z 2:3-4} activates the blurring of the 3th and 4th field of each line of the second file. Going back to the comparison of the files @file{list1} and @file{list2}, the option @samp{-z 2-} of the command @samp{numdiff -z 2- -V list1 list2} makes the filter transform the (memory copies of the) two files as @example 12 @bullet{} 13 @bullet{} 14 @bullet{} 15 @bullet{} 16 @bullet{} 17 @bullet{} 18 @bullet{} 19 @bullet{} 20 @bullet{} 21 @bullet{} 22 @bullet{} 23 @bullet{} 24 @bullet{} @end example @noindent and @example 12 @bullet{} 15 @bullet{} 18 @bullet{} 21 @bullet{} @end example @noindent respectively. Here @bullet{} denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command @samp{sdiff -W} when applied to them: @example 12 @bullet{} 12 @bullet{} 13 @bullet{} < 14 @bullet{} < 15 @bullet{} 15 @bullet{} 16 @bullet{} < 17 @bullet{} < 18 @bullet{} 18 @bullet{} 19 @bullet{} < 20 @bullet{} < 21 @bullet{} 21 @bullet{} 22 @bullet{} < 23 @bullet{} < 24 @bullet{} < @end example @noindent If you put the blurred fields back you obtain exactly the output of @samp{numdiff -f -z 2- list1 list2}: @example 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" @end example @noindent Since the second field is a numerical value in all the lines of @file{list1} and @file{list2}, to use the option @option{-Z} instead of @option{-z} makes no difference in this case. The output of @samp{numdiff -f -Z 2- list1 list2} is then the same of @samp{numdiff -f -z 2- list1 list2}. After this explanation you can also understand why @samp{numdiff -f -z @@ list1 list2} gives a wrong result. Since also the first field is always a numerical value, the option @samp{-z @@} makes the filter transform the two given files as @example @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @end example @noindent and @example @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @end example @noindent respectively, so that it is not anymore possible to match the lines in a reasonable way. We consider now a typical situation where it is better to use @option{-Z} in place of @option{-z}. If the file @file{Table1} contains @verbatim -6 2.449490 -5 2.236068 -4 2.000000 -3 1.732051 -2 1.414214 -1 1.000000 0 0 - - - - - - - - - 1 1.000000 2 1.414214 3 1.732051 4 2.000000 - - - - - - - - - 5 2.236068 6 2.449490 7 2.645751 - - - - - - - - - 8 2.828427 9 3.000000 10 3.162278 11 3.316625 12 3.464102 - - - - - - - - - - - - - - - - - - 13 3.605551 14 3.741657 @end verbatim @noindent and @file{Table2} contains @verbatim -6 Not_defined -4 Not_defined -2 Not_defined 0 0.000000 2 1.414216 4 2.000000 6 2.449494 8 2.828469 10 3.162278 12 3.464102 14 3.741658 ********************END @end verbatim @noindent then the output of @samp{numdiff -z 1:2 -Z 2:2 -f Table1 Table2} is @example -6 2.449490 -6 Not_defined -5 2.236068 < -4 2.000000 -4 Not_defined -3 1.732051 < -2 1.414214 -2 Not_defined -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" @end example @noindent which is exactly what is expected. On the other hand the command @samp{numdiff -z 2 -f Table1 Table2} displays @example -6 2.449490 | -6 Not_defined -5 2.236068 | -4 Not_defined -4 2.000000 | -2 Not_defined -3 1.732051 < -2 1.414214 < -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" @end example @noindent which is partially wrong. Notice that in @file{Table1} you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file @file{Table2} contains some approximations (obtained by Newton's method) for the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by @verb{|Not_defined|}. Since @verb{|Not_defined|} is not a numeric value, during the execution of the last command the filter transforms @file{Table1} in this way @example -6 @bullet{} -5 @bullet{} -4 @bullet{} -3 @bullet{} -2 @bullet{} -1 @bullet{} 0 @bullet{} - - - - - - - - - 1 @bullet{} 2 @bullet{} 3 @bullet{} 4 @bullet{} - - - - - - - - - 5 @bullet{} 6 @bullet{} 7 @bullet{} - - - - - - - - - 8 @bullet{} 9 @bullet{} 10 @bullet{} 11 @bullet{} 12 @bullet{} - - - - - - - - - - - - - - - - - - 13 @bullet{} 14 @bullet{} @end example @noindent and @file{Table2} in this other way @example -6 Not_defined -4 Not_defined -2 Not_defined 0 @bullet{} 2 @bullet{} 4 @bullet{} 6 @bullet{} 8 @bullet{} 10 @bullet{} 12 @bullet{} 14 @bullet{} ********************END @end example @noindent Unfortunately the first three lines are enough to confuse the synchronization procedure, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as we explained before. You can check that this is definitely the case by looking at the output of the command @samp{sdiff -W} on the transformed files, which is @example -6 @bullet{} | -6 Not_defined -5 @bullet{} | -4 Not_defined -4 @bullet{} | -2 Not_defined -3 @bullet{} < -2 @bullet{} < -1 @bullet{} < 0 @bullet{} 0 @bullet{} - - - - - - - - - < 1 @bullet{} < 2 @bullet{} 2 @bullet{} 3 @bullet{} < 4 @bullet{} 4 @bullet{} - - - - - - - - - < 5 @bullet{} < 6 @bullet{} 6 @bullet{} 7 @bullet{} < - - - - - - - - - < 8 @bullet{} 8 @bullet{} 9 @bullet{} < 10 @bullet{} 10 @bullet{} 11 @bullet{} < 12 @bullet{} 12 @bullet{} - - - - - - - - - < - - - - - - - - - < 13 @bullet{} < 14 @bullet{} 14 @bullet{} > ********************END @end example If we give the command @samp{numdiff -z 1:2 -Z 2:2 -f Table1 Table2} instead of @samp{numdiff -z 2 -f Table1 Table2}, the second field of the lines of @file{Table2} is always blurred. The filter transforms then @file{Table2} into @example -6 @bullet{} -4 @bullet{} -2 @bullet{} 0 @bullet{} 2 @bullet{} 4 @bullet{} 6 @bullet{} 8 @bullet{} 10 @bullet{} 12 @bullet{} 14 @bullet{} ********************END @end example @noindent and @i{re-synchronizes} the files @file{Table1} and @file{Table2} in the right way. Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use @option{-X} to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be the case e.g. when in some lines the content of the field is given by a special numeric value, like @verb{|Infinity|}, @verb{|Inf|}, @verb{|+Inf|} or @verb{|-Inf|}, or by @verb{|NaN|}, abbreviation for @i{Not a Number}. Concerning the numeric fields which are not blurred, one has to remark that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that @file{short1} contains a list of numbers with their logarithms @verbatim 0.001 -3 0.01 -2 0.1 -1 1 0 1000 3 1000000 6 1000000000 9 @end verbatim @noindent and @file{short2} the same list of numbers and logarithms, but with differences in the numeric format: @verbatim ****************** 0.0010000 -3 .0100 -2 0000.10 -1 1. 0 1,000.000 3 1,000,000. 6 1,000,000,000 9 @end verbatim @noindent Then @samp{numdiff -f -z 2- short1 short2} displays @example > ****************** 0.001 -3 0.0010000 -3 0.01 -2 .0100 -2 0.1 -1 0000.10 -1 1 0 1. 0 1000 3 1,000.000 3 1000000 6 1,000,000. 6 1000000000 9 1,000,000,000 9 +++ File "short1" differs from file "short2" @end example @noindent showing that the filter has matched the lines in the right way. The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files @file{decimal} and @file{scientific} contain @verbatim .001 -3 .01 -2 .1 -1 * * * * * * * * * 1 0 1000 3 1000000 6 1000000000 9 @end verbatim @noindent and @verbatim ***************** 1.0e-3 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 1.0e3 3 1.0e6 6 1.0e9 9 ***************** @end verbatim @noindent respectively, then @samp{numdiff -f -z 2- decimal scientific} shows @example > ***************** .001 -3 1.0e-3 -3 .01 -2 1.0e-2 -2 .1 -1 1.0e-1 -1 * * * * * * * * * < 1 0 1.0e0 0 1000 3 1.0e3 3 1000000 6 1.0e6 6 1000000000 9 1.0e9 9 > ***************** +++ File "decimal" differs from file "scientific" @end example @noindent proving that the filter does not get confused. No problems come out also in the case when for the same not blurred field the scientific notation is used in both files. If the files @file{sc1} and @file{sc2} contain @verbatim 1.E-3 -3 1.00E-2 -2 1.0E-1 -1 1.0000E0 0 001.0E3 3 +01.000E6 6 1.0E+09 9 1.0E+10 10 * * * * * * * * * * @end verbatim @noindent and @verbatim ***************** 1.0e-003 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 +1.0e3 3 1.0e+6 6 1.0e9 9 @end verbatim @noindent respectively, then @samp{numdiff -f -z 2- sc1 sc2} correctly displays @example > ***************** 1.E-3 -3 1.0e-003 -3 1.00E-2 -2 1.0e-2 -2 1.0E-1 -1 1.0e-1 -1 1.0000E0 0 1.0e0 0 001.0E3 3 +1.0e3 3 +01.000E6 6 1.0e+6 6 1.0E+09 9 1.0e9 9 1.0E+10 10 < * * * * * * * * * * < +++ File "sc1" differs from file "sc2" @end example @noindent The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize @samp{123.456E+2} and @samp{1.23456E+4} as equal. We can see this in the case of the files @file{Scnot1}: @verbatim ------------------------- 1.2E0 * 1 2.45E-1 * 2 -3.678E-2 * 3 @end verbatim @noindent and @file{Scnot2}: @verbatim 12E-1 * 1 245E-3 * 2 -0.003678E+1 * 3 @end verbatim @noindent @samp{numdiff -f -z 3- Scnot1 Scnot2} displays the report: @example ------------------------- < 1.2E0 * 1 12E-1 * 1 2.45E-1 * 2 245E-3 * 2 -3.678E-2 * 3 -0.003678E+1 * 3 +++ File "Scnot1" differs from file "Scnot2" @end example @noindent which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If @file{Scnot1} is given by @verbatim 1.2000e0 * 1 02.4500e-1 * 2 -003.678E-2 * 3 @end verbatim @noindent and @file{Scnot2} is the same file as before, the output of the command @samp{numdiff -f -z 3- Scnot1 Scnot2} is still right: @example 1.2000e0 * 1 12E-1 * 1 02.4500e-1 * 2 245E-3 * 2 -003.678E-2 * 3 -0.003678E+1 * 3 +++ Files "Scnot1" and "Scnot2" have the same structure @end example Till now we have always used the option @option{-f} with no argument. @anchor{Use of the option -f} But @option{-f} accepts an optional argument, which can be used to control how @option{-f} displays its output. If you provide an argument, care not to leave any space between the option and the argument: @samp{-f60} is correct while @samp{-f 60} makes Numdiff terminate after printing an error message. If the argument is a positive number @var{NUM}, then the side-by-side output produced by @option{-f} will be @var{NUM} columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when @option{-f} has no argument, or the supplied argument is zero. In other words, @samp{-f} and @samp{-f0} are just easier to remind versions of @samp{-f130}. A negative argument has the same effect as the positive number with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command @samp{numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2} displays the following text @example -5 2.236068 < -3 1.732051 < -1 1.000000 < - - - - - - - - - < 1 1.000000 < 3 1.732051 < - - - - - - - - - < 5 2.236068 < 7 2.645751 < - - - - - - - - - < 9 3.000000 < 11 3.316625 < - - - - - - - - - < - - - - - - - - - < 13 3.605551 < > ********************END +++ File "Table1" differs from file "Table2" @end example In conjunction with the option @option{-f} or @option{-O} you can use @option{-T} to expand tabs to spaces in the output produced by @option{-f} / @option{-O}. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter. The options @option{-H} and @option{-m} affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others. The way that the filter re-synchronizes two files to compare always comes up with a near-minimal set of deletions/insertions of lines. Usually it is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The @option{-m} option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior. If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the @option{-H} option to make a different modification to the algorithm that the filter uses. If the input files have a constant small density of changes, where change means deletion/insertion of lines, this option speeds up the comparisons without changing the output or in the worst case introducing minor modifications. @node Warnings, Index, Filtering, Top @chapter Warnings @cindex Warnings @cindex Notes @cindex Caveats @itemize @item Bug reports have to be sent to the address @email{ivprimi(at)libero(dot)it} . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. @item Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, @dots{}, +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is @example numdiff: A number with a too small exponent has been found, namely "1.0001e-2147483640". Exponents smaller than -1073741824 are not accepted, the execution of the program ends now @end example @item @anchor{with GNU MP is better} If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude @math{10^6 = 1000000}. This is what I obtained on my laptop, equipped with a dual core processor @@1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000: @example numdiff: Insufficient memory for new allocation, the execution of the program ends now @end example In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, @dots{}, 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, @dots{}, 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Consider also that, if you have numeric data with exponents outside the range -300, @dots{}, 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right. @item If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. @item After reading a numeric field, Numdiff truncates its value if this number has @i{too much} digits with respect to the current precision. To be precise, denoted by @var{P} the current value of the precision, the following rules apply. If @command{numdiff} has been built with its own internal support for multiple precision arithmetic, then @itemize @item if the number is written in ordinary decimal notation, @command{numdiff} will consider, in addition to all digits of the integer part, only the first @var{P} digits of the fractional part; @item if the value is written in scientific notation, then @command{numdiff} will only consider the first @var{P} digits of the fractional part of the mantissa. @end itemize If @command{numdiff} uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first @var{P} digits of the fractional part of the mantissa are considered. By current value of the precision I mean the integer value specified by the option @option{-#}, or the default one (35) when this option is not in use. @item You can find out whether your local version of @command{numdiff} is relying on GNU MP or not by executing the command @samp{numdiff -v}. If @command{numdiff} uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: @example The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. @end example @noindent If @command{numdiff} does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) @example The software has been built with its own internal support for multiple precision arithmetic. @end example @item Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, @command{numdiff} checks for the presence of null bytes (0x00) in the file. @item If you are not including the so called white-space characters (usually @samp{ }, @samp{\t}, @samp{\f}, @samp{\v} and @samp{\r}) in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only @strong{colon} (@samp{:}) and @strong{newline} as field delimiters and Numdiff finds a line like that @verbatim ::::3.0-5.6e-356i::::-12.9 +4.34i::::-12.9 4.34i::::New York:::: @end verbatim @noindent then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers @i{3.0-5.6e-356i} and @i{-12.9+4.34i}, the last two ones are the strings @verb{|New York|} and @verb{|-12.9 4.34i|}. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only @verb{|3.0-5.6e-356i|} as numeric field and treats @verb{|-12.9 +4.34i|} as non-numeric due to the presence of spaces in the middle. @verb{|-12.9 4.34i|} is already considered as non-numeric due to the absence of a leading sign in the imaginary value. @item We have seen that one of the two files passed to @command{numdiff} can be @verb{|-|}, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in @samp{cat file2 | numdiff -a 1.0e-3 file1 -}. However, if you activate the filter by means of the options @option{-z} or/and @option{-Z}, Numdiff can not work with the standard input unless you use also the option @option{-f}. Therefore, the command @samp{cat file2 | numdiff -a 1.0e-3 -z @@ file1 -} displays only the error message @verbatim numdiff: -: Illegal seek @end verbatim (or maybe the translation of this message in the language you are using on your computer) but @samp{cat file2 | numdiff -a 1.0e-3 -z @@ -f file1 -} works as expected. @item This manual describes the version 5.8 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output. @end itemize @node GNU Free Documentation License, , , Top @appendix GNU Free Documentation License @cindex GNU Free Documentation License @cindex GNU FDL @cindex FDL @include fdl.texi @node Index, , Warnings, Top @unnumbered Index @printindex cp @bye ./numdiff-5.8.1/docs/numdiff.10000644000175000017500000002304012215353073014766 0ustar ivanoivano.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.43.3. .TH NUMDIFF "1" "July 2013" "numdiff 5.8.1" "User Commands" .SH NAME numdiff \- compare similar files with numeric fields .SH DESCRIPTION Usage: numdiff \fB\-h\fR|\-\-help|\-v|\-\-version or .PP numdiff [\-s IFS][\-D DELIMS][\-a THRVAL[:RANGE|:RANGE1:RANGE2]][\-r THRVAL[:RANGE|:RANGE1:RANGE2]][\-2][\-F NUM][\-# NUM][\-P][\-N][\-I][\-c CURRNAME][\-d C1C2][\-t C1C2][\-g N1N2][\-p C1C2][\-n C1C2][\-e C1C2][\-i C1C2][\-X 1:RANGE][\-X 2:RANGE][\-E][\-U][\-b][\-V][\-O[NUM]][\-q][\-S][\-z 1:RANGE][\-z 2:RANGE][\-Z 1:RANGE][\-Z 2:RANGE][\-m][\-H][\-f[NUM]][\-T][\-B][\-l PATH][\-o PATH] FILE1 FILE2 .PP Compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. .PP RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like 1\-, 3\-5 or \fB\-7\fR. The two arguments after the options are the names of the files to compare. The complete paths of the files should be given, a directory name is not accepted. The given paths cannot refer to the same file but one of them can be "\-", which refers to stdin. .PP Exit status: 1 if files differ, 0 if they are equal, \fB\-1\fR (255) in case of error .PP \fB\-s\fR, \fB\-\-separators\fR=\fIIFS\fR .IP Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If IFS is prefixed with 1: or 2: then use the given delimiter set only for the lines from the first or the second file respectively .PP \fB\-D\fR, \fB\-\-delimiters\fR=\fIDELIMS\fR .IP Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If DELIMS is prefixed with 1: or 2: then use the given delimiter set only for the lines from the first or the second file respectively .PP \fB\-a\fR, \fB\-\-absolute\-tolerance\fR=\fITHRVAL[\fR:RANGE|:RANGE1:RANGE2] .IP Set to THRVAL the maximum absolute difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose positions lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 .PP \fB\-r\fR, \fB\-\-relative\-tolerance\fR=\fITHRVAL[\fR:RANGE|:RANGE1:RANGE2] .IP Set to THRVAL the maximum relative difference permitted before that two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose positions lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 .PP \fB\-2\fR, \fB\-\-strict\fR .IP Consider two numerical values as equal only if both absolute and relative difference do not exceed the corresponding tolerance threshold .PP \fB\-F\fR, \fB\-\-formula\fR=\fINUM\fR .IP Use the formula indicated by NUM to compute the relative errors. If 'NUM' is 0 use the classic formula. If 'NUM' is 1 compute the relative errors by considering the values in FILE1 as sample values. If 'NUM' is 2 compute the relative errors by considering the values in FILE2 as sample values. .PP \-#, \fB\-\-digits\fR=\fINUM\fR .IP Set to NUM the number of digits in the significands used in multiple precision arithmetic .PP \fB\-P\fR, \fB\-\-positive\-differences\fR .IP Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file .PP \fB\-N\fR, \fB\-\-negative\-differences\fR .IP Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file .PP \fB\-I\fR, \fB\-\-ignore\-case\fR .IP Ignore changes in case while doing literal comparisons .PP \fB\-c\fR, \fB\-\-currency\fR=\fICURRNAME\fR .IP Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with 1: or 2: to specify the currency name only for the first or the second file .PP \fB\-d\fR, \fB\-\-decimal\-point\fR=\fIC1C2\fR .IP Specify the characters representing the decimal point in the two files to compare .PP \fB\-t\fR, \fB\-\-thousands\-separator\fR=\fIC1C2\fR .IP Specify the characters representing the thousands separator in the two files to compare .PP \fB\-g\fR, \fB\-\-group\-length\fR=\fIN1N2\fR .IP Specify the number of digits forming each group of thousands in the two files to compare .PP \fB\-p\fR, \fB\-\-plus\-prefix\fR=\fIC1C2\fR .IP Specify the (optional) prefixes for positive values used in the two files to compare .PP \fB\-n\fR, \fB\-\-minus\-prefix\fR=\fIC1C2\fR .IP Specify the prefixes for negative values used in the two files to compare .PP \fB\-e\fR, \fB\-\-exponent\-letter\fR=\fIC1C2\fR .IP Specify the exponent letters used in the two files to compare .PP \fB\-i\fR, \fB\-\-imaginary\-unit\fR=\fIC1C2\fR .IP Specify the characters representing the imaginary unit in the two files to compare .PP \fB\-X\fR, \fB\-\-exclude\fR=\fI1\fR:RANGE .IP Select the fields of the first file that have to be ignored .PP \fB\-X\fR, \fB\-\-exclude\fR=\fI2\fR:RANGE .IP Select the fields of the second file that have to be ignored .PP \fB\-E\fR, \fB\-\-essential\fR .IP While printing the differences between the two compared files show only the numerical ones .PP \fB\-U\fR, \fB\-\-dummy\fR .IP While printing the differences between the two compared files neglect all the numerical ones (dummy mode) .PP \fB\-b\fR, \fB\-\-brief\fR .IP Suppress all messages concerning the differences discovered in the structures of the two files .PP \fB\-V\fR, \fB\-\-verbose\fR .IP For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files .PP \fB\-O\fR, \fB\-\-overview\fR[=\fINUM\fR] .IP Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If 'NUM' is zero or is not specified, output at most 130 columns per line. If 'NUM' is a positive number, output at most 'NUM' columns per line. If 'NUM' is a negative number, do not output common lines and display at most \-'NUM' columns per line. .PP \fB\-q\fR, \fB\-\-quiet\fR, \fB\-\-silent\fR .IP Suppress all the standard output .PP \fB\-S\fR, \fB\-\-statistics\fR .IP Add some statistics to the standard output .PP \fB\-z\fR, \fB\-\-blur\-if\-numerical\fR=\fI1\fR:RANGE .IP Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric .PP \fB\-z\fR, \fB\-\-blur\-if\-numerical\fR=\fI2\fR:RANGE .IP Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric .PP \fB\-Z\fR, \fB\-\-blur\-unconditionally\fR=\fI1\fR:RANGE .IP Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure .PP \fB\-Z\fR, \fB\-\-blur\-unconditionally\fR=\fI2\fR:RANGE .IP Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure .PP \fB\-m\fR, \fB\-\-minimal\fR .IP During synchronization try hard to find a smaller set of changes .PP \fB\-H\fR, \fB\-\-speed\-large\-files\fR .IP During synchronization assume large files and many scattered small changes .PP \fB\-f\fR, \fB\-\-test\-filter\fR[=\fINUM\fR] .IP Run only the filter and then show the results of its attempt to synchronize the two files. If 'NUM' is zero or is not specified, output at most 130 columns per line. If 'NUM' is a positive number, output at most 'NUM' columns per line. If 'NUM' is a negative number, do not output common lines and display at most \-'NUM' columns per line. .PP \fB\-T\fR, \fB\-\-expand\-tabs\fR .IP Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option \fB\-O\fR or \fB\-f\fR) .PP \fB\-B\fR, \fB\-\-binary\fR .IP Treat both files as binary files (only meaningful under Doz/Windoz) .PP \fB\-l\fR, \fB\-\-warnings\-to\fR=\fIPATH\fR .IP Redirect warning and error messages from stderr to the indicated file .PP \fB\-o\fR, \fB\-\-output\fR=\fIPATH\fR .IP Redirect output from stdout to the indicated file .PP \fB\-h\fR, \fB\-\-help\fR .IP Show help message and predefined settings .PP \fB\-v\fR, \fB\-\-version\fR .IP Show version number, Copyright, Distribution Terms and NO\-Warranty .IP .SH Default numeric format (for both files to compare): .PP Currency name = "" .br Decimal point = `.' .br Thousands separator = `,' .br Number of digits in each thousands group = 3 .br Leading positive sign = `+' .br Leading negative sign = `\-' .br Prefix for decimal exponent = `e' .br Symbol used to denote the imaginary unit = `i' .SH COPYRIGHT Copyright \(co 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi .br License GPLv3+: GNU GPL version 3 or later, see . .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B numdiff is maintained as a Texinfo manual. If the .B info and .B numdiff programs are properly installed at your site, the command .IP .B info numdiff .PP should give you access to the complete manual. ./numdiff-5.8.1/docs/numdiff.pdf0000644000175000017500000137574612215353073015427 0ustar ivanoivano%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 190 /Filter /FlateDecode >> stream xÚuŽ1 Â0…÷üŠŒ-˜3—kšdt„8©ƒØжbKýý¦´u(Ê-÷îÝ}ÈeäFqc ,~«˜Ý;ÃQ%š@'ôÏXL¹@—ü9"ÂaRÖõ +Ï–›`) ©¶šû¢ÇH%‘–ûŒŸ¢}WeåY"Å‚ŒŽŽmÞ jw­c¨»>ƒñŽIEyÓ–Ïz04Øøâ·líÙëKîk‡`N„xÀMÎ v˜l(h;/ 8GSá‘ÝDE endstream endobj 14 0 obj << /Length 981 /Filter /FlateDecode >> stream xÚ}ÙnÛFðÝ_Áæi ˜ë½x¡ONÚi‹ @Õ¾Äy É•´aIÉñßgf‡”dY hç¾g(#?å*Ê Í Guw#fê·9C&Õ<5à«ì$Uià'gVÞ®nîÞ§&’‚—¢”Ñjn”2¼Èk¢/ìAjÃ9ß÷Mœè´`õä̺Mo{"þíãT²j=z°~"ÊÞ’^ÎÆ f¾u³Þ:HYG"ìXo[‹¤z»ˆv;ÄÿÛ›øëê/ˆVžG+¢Ä(nÌìjëFÐ+3ÖU}¬r¶¯Z°íÝcœ(°9Ël‡°'Dr6 Dtý8UmKÄ*DÔýh ø´ï÷ ¤¾#5«ˆ¼óÃÆW!O[W£ó-¡õÐí*¿8Ýí§jräÛösÂ$¤æ2¥F×¹¶‚"‘1ðdZTE¤u½%辤†h-Û6¯egÆ® ƒÞõâ]HA*],$íñÀY9£ä­·}½„5ø»£ç½N/Ò›{8û¬‚I­ [ÇØß®šFôÆ:—†TÞ »„w›íÉnZ§‘àZ•$WÓˆdâ|DÍLý™„˜^&%¸øRJˆ UæÁ,€ÁüD-N`yâH•òª¨ã¤0š}<Ä)vm ô³‡Îc\7®Žk ë(U‰–a­¹*€(1éô|¹A,9“£½V{½„ôÜa‡þD*ª þeë­o†@pÓe0J”ÎÌ‹ˆ^šEêu@/ª-…à P²rŽé36×úΣzœ(Ò‘^X/š)ÛßzޏÐ, ¶‚)'XöýdIÆón¥i¤AUá,¯Ÿg[ÛÅM3„QÀÎ#Èpþ¬_dí•­ l0¡RÆ5½(€Ÿþ#à=ÆèíLþãÒÜÌyÿ¸Úö£½Å8ûõ¬lÉõìËÓKµy&¤­&;ÓTÑ“ænÿ˜\ÛÊÖ[¬¬–âx1I pб¸õáx·3™j2ù‰9{rÓ–Ø8èø~ ÷…†ß»j©s°kkToM`Ø0?½)yîöœÚµdV¡^ß§`&7óÏ2²ïÛ*èo¦ï¨Ìã¾—ìžÈÇ1,=F*•'Ã+FHøáÛ×í¾±Í‚]î“ÑWpœrɕɹà‹hr’½²SC1îw;úêõûN‘܇¢Áñ͹A›çµû¦Uk}ÞqÀ~6­xÁçiýzK¢»j3+eéeÊ|&Ò‚‹2ûÉY„’“Ô•d/L…èùâï)ŠB endstream endobj 37 0 obj << /Length 1099 /Filter /FlateDecode >> stream xÚíšKsÛ6ÇïþºúÀ›µ³g=ÀsÚ©e’ŠPZ´´Çà° B˜ó¶Y`Ü37¸ü¼KKóPÁ—„«\q’ 'Æ=›×k‹æm½·‡wÛª|»³„óžð1«LgX?¤³_Î=óðêm1ºFþŽÁ5¨blaz-c†TÞj ÏÖ«{ Uu¼ßTï¦`2‚ýø‰ïÉöùÇ#Ò{u’ƒ1Æä””0Få™ä¸–€yÕHP¤0û3‚ØI™Rš¾ºkw ÌíB¤7ûãnÕ8D• û0äÿÑç@γîì%$¹{g›ÆSõìY—n¢Ïô2Æ=ªé¹W†’ÜŸãžwÜß/xÑ%e _¦»ý"ã:-«É0Äpþ1sô…Ù§£ €Y#0¢‘ÉX„ÊHàš]h kÉnª!b"ñ·‹;86W.þ Ln›ê8 Œ¤Èùe2ør‡ãÝ“2÷Áã=„é(ï2Æû™æƒú[É‚H]Ò—ß/ëS³Ún#»†Cñ­/ ¹Ï8–s&¨!’ÊΗ(ŒÞ4l§jîq‡EEqÅHÄ-ˆ,'´S=‰v!Ø®÷·–ÇvG­Ýf¸Û•Hºbr³Aê6Ë_}ȼŸæQ6c˜…®çÑ7TÆ@C5áJèð%uîIû­ÚVë¦G ’_ur§«ºt'vН¶¥¿ K?wâJ8Yïw‡ÕqsÚ×SL ¡‰fŸ”Ɉ»ß?˃1âÁÑ#•ỹ¡2âA\ÓzP1¸rrÏå©õìtš0„ƒà×”&>Õ\Ô¹hdƒ1YèuYD! ”1ÈPM Tí†ú72…‡ìõ©'«û¾ô½öiiÄ&)Î|âk¤bÜø§>›Áã&t¤¢QneŒT®¬"÷¯fŒçæMûnðX=§HQ­©¹ìh?½¢ºsç, cÈ!yt/;TF€Ä5-J˜êœÜõáù‰¥U]nÞ»Lu O@H‘þôëkwã……õXùôöþm°¾Ûù7Ø«f%NûÝ/›uUŸªÉzGÁÚ¶`»ó™ÿÅó|6c> b®¢> ”1Ÿ¡šÖgœíÿÅð².«÷SXrBEqYå|ŒëÜ>ÛÞÃ6àHG_å²=´ÿi×#¶ endstream endobj 113 0 obj << /Length 861 /Filter /FlateDecode >> stream xÚ…UMoÛ8½çWèH-’’eµ'7H¶^dÀVP틎ˆ•%C¢ÖÈ¿ßå¸N‹…k8óføæƒ¤"ø‰ •A:W|®Ò`»¿Š¼öŸ+á¥áâK~5½KD "žE™òÝyˆ¼ ¾³›ª8XÝMB¥Ÿ&a'ì¦=L䜽™æ R%“¿ó?¯nóÓ^‰Lx«ÿ!4¢>°"åR$ñÈJÎx„+d%&a2Sއ’Ķ¿Ì% B9çQæVþ4?"¡€s±Qußbj;vÆZÝ©ÁìÞÑéÁ‚€¦'̮Ӛ¤¾ÝYt8â_Ñi,R’²7\¶a¶ECî.Mo;ó2Xïn,YЦœ¶éöÀ ¼K³{ó»Z2 M Í€\19¡¸€Œ]r¶ÂpY YûžÄvçUÕD0oþcõäÝ讨iñ8¼ÔfKò½Ùê¦÷ðÂ…ŠÙ}¥KR¿¸öÑ=ön2WŒªW•ôT•&†¢4eaMÛ\ÿ*m ¢¸1‚îzÀ’BÑÇe_Ú[Å#ékoîHëZlIçÛá·Ü쪂âãNo´¨ {F`Ž¥ŒHÆgó,ŽøŒ •}˜/9›¹A‘³”•àtjyI:ÓÆñG¡‚Ii+Ò#mÅÈÁÔ«¦/ðI Ÿ²¡×»¡¾FUÆ`Ò~[æ_žr °X=“ðm"„`‹õz±ÊŸ?»lÂS:g}8BÚÁÍ]Ì4u¢¡•³?ÔÆ Ü ¾Ó]áŽG$öƒð¿nר½ù [ã°,¾,ï—ù3iöaD–ùêv³!åâÖdYîѹ®ñ?_Þ<…¿¢ûÅšøø´~|ØÜrZm´Ÿ?8ÊŸмŸôÏÈïçP;hÀ8]û¶óAJm S÷¿g$‹wœÅ¬‡²ÖnV˜à8e¨éôVRxLAn[é’KŠ_ „*ïêrq˜ ú¹ á” ŠºÅûõØkRÚŠæ6a‡®}íŠ=ÿý„,ý)lZ{M%顾gidÏ$=\ÎÑD\%燆gXz¡äù­~Ð1©¬=|šNÇ#mÞv¯ÓšRí§—„$¼4JÉŸ}|˜FÔG2?=1—Á>nùþÖâL endstream endobj 117 0 obj << /Length 899 /Filter /FlateDecode >> stream xÚ…UMã6 ½Ï¯ð­°V-ÉŸ½u[t Ì¢ÀæÖ¨ÆVbal)M§¿¾¤(oœÌE¢žžÈG†”y’Ã'µHêF²FÖI7=ä}yàÑÊ€m÷?þRò„ç¬Í[žì[û>ù#}ÔiÑ~—I)SñÓ.+Š2ý¹Û‰&}±—˨ûã¤-Ú˼ËDÃË<»¿ö¿=|Ú]Š’•…ü+ëJÐÅk&xY¬*EÅrÜ¡J±ËÊJ¢.)‚.ɯºÀ] ç>×<±,o£“ÏdU¦LDQ:„,.®ƒ²/d>íxêD•múÅù øuØÜ%/*Á [µ5k«; Ér[•š]¹ô7‰­ô;‡A¿æeÞ»îN³¸Wa{8Ïzsjõr/²5ߊ|û­¤7òn*[Ȇ‰òFÝÁy*Ѭ¿amµWcÎÇ£ž3”“PáÍŒKÆÁg¸ºg¡± ‘§ƒ¦õ¨Ð9"dŠ+þY¸šéä¡?ëÒ²Þ÷ZõêÙŒfÁÓW•íïhP1.u·rbõu¸ÃÓ—Óy!Cg¥ý¹ÓÑã3…ÁóÛ侜§Þ`†³U¤¿jœ5žªqvdÀY:c1›="êÎЂ ÙAV¯ÇK¼ eu˜Îze+Z f1ÆÑ¾ò½ž_mïÁ;kþÕwFE ó9èuàCj¤í{Y^ §.)zðT©±vjÖ„`}Q}oðï¨'´×£Þ ‘묾¥MÎG$¨Æq­š0æ jÛˆ,QÚÑlÑÁLQœ× …ÀÃë²M—²=û£¦“ÊZ@Kè“ò+8D#ÂLý¼‚ýCG¡Ñ( ‰i°iŒÌ Öð\ðŠñø=AÞî:þ\lËx#ïß·&ŠÄ5¾oH',Î+Ùo´ígâ<)oÔÉ(:úi0ÇÐŽáÆ³ò.F›í4±æ/\özZuAãôñÔMñX{ïüLïÀ÷´®U½ fDfÞ€£oF_Œ=â¶»ÊÏ m(J¨.¡‚°.ƒ™ébOƒÚ×ïŠçkõJ ºÑÑöQyÏ»éT$^Gžè£ébH •¹÷¦ºšþËØ¡G{ŠCáaœÔb°¤–ލ‡6m³¾5Û®¸žâd€ýwüêÝ~: ÉàaMAKöõ½O#çðy)WÎlýVüŠð” endstream endobj 121 0 obj << /Length 3548 /Filter /FlateDecode >> stream xÚZIܸ¾ûWtŒT@—"Ф–Ü<Á âç``™Ø*U—Ð*©F‹{:¿>o£–*UÛ6Ð"÷Ç÷¾·°ÔCÿÕC?¤™3>ç‘P_>()í¡Ã~Ñ㧯þö‹U* ó(W_Ë)¾þüãä.CÙíöZë@ÿ}·7Æ_¾íâ,(»oUù -*Km wÿýú¯?³± ­ÑßÙ‘ïu³-؈JÃXYã·'a„5Ü–Þím¢q#:öõ¯O=ìa”Ž”¦=_F:Mœ˜`ìˮǢÚãP6Lý=R¦9>YP®¯ZiZnrý N-òâUZ¹ Úy¶º”UTuÙ…ÀÅX¿îâö ö»hÊå(&V=Óšò•yÏ­ßxÚœ¬t¨¬¸=ÂRìëTr¡…R‡E+‹À^›_:n?;œýí‰^^ p1:$L§ÃJ?¸n(²Î8ð*NZ«0FUáj&í¥âÁ6xw*!r@Y´ÀEOÐêšgžzÓ&·ìY,‹¡Øšà§.µ<.R&Ì‘6L3øõD+ê ò…¾9Ç#á÷ÂꙂâ@ßSÕ¼Èð'ZŽ8ÀM2ݼ·¢¤áqÀ]Ë™±%Š!ZJ„×p_6Ë‚/M9m)“-míO»ŸŽ{%:—ËÕ¹½Ù´U=79©;®‚ÚT¾ Ocƒºjñ”}{.¹"{fI€ Ü"È‹´Èåp¥dKußr õ¦ÿ¬•>ÆRFÖ”plC»ûñr%A=Ð`™qó®‚¥¤åÁKE2ŽÍdý€tmØÄ …„öHjÚ Õ™¯dÚy3‚= MhlÉt .lü²Ë4]0Òi7`…»[’i0m¾'š{ßo)úkö³²B¡Íš(¨ž›–Nhn ’P±ŸÉLBˇ6,ˆØáõT Ò¥¿8‚Q ŠŸàÑ*eûEýw„ tP%ÖÅºŽ ’`ëûœí¸¬0`êËÉy“YLçl˪ËlŸø8ÉÖ¶ ìÌ¥Þz# Ïˤ’ WûAR%_×s_ÇUo—Ó@ ÒÂ’7m‡Ì#­ãÍ#ógj6·¦œÈS •Z[L$Ð%×üK,L6R‰ (%62ó6R öÐ8±‘ÓHëð‚4$+mØZu‡LêÊ#áær ÇŸ¾ücdè¡Ùüm¶]X¼½È\œg×HH4`^u®˜}PõVËNFªeºø.¦&;YqÁi ³#)ÍÓÈä,8Hý0wÄðbãäzRŒÂî=±%ï#¶YPÖaé]÷#5ak&¯÷ÐD«ÐØC‡³Oƒ2aYèõØV²ø¯;”"×®ƒ< ð”©ìÁd8µ¢ /Œ3h¡¶ËPÏ÷Ý/:sº:Ëõ”¼YZý÷ÈFn€¿ªêZ¬Zªç¶ºÒÕ Záî¤Ë½¾Þìò:N6I6‡–³û¶¼ä€é`ÆÉ– “W‡6¥iWN•6³ô¬ÐèØóÑOµë’î”Åid8]û@‘ÜŽHÌ®Ñ8º‡ù4j³DjqwÁŽ¥‘*§ÃuRä40fÁiì´æ4RÈ÷ÂIŸ LjxÈØÂh¨z&:®ÖU/Ó6¬  pÍ èãY!S5~ÁÂVüVBHMc6y¡šŽSÉYYqôRq2štÒÁÕ.ê·-M³y˜ævŽ­FyUt­yMÆÙ}Ã`F`¸9°*ÊùpØŒxšÍð¹ënc •ŸFB¬\Œ^ŠXG)A/Ô`ÍPÄ'÷„w¢ËÎDä–¦šÀ0IüѱIüÓŽÄì%žÌ•×®¡2ö|®Ä® çŠÁù =Iĺ+!×Õ ÍVH«’0WÙd[²<{QQ•À LV*rXuhÕäý/ŒI% 7hb‹ö¹©þWrTTC±~Ö¤lXZ„™{ŸÃÅf©dÂB3 VÉ·mHípÅQdIa¡ŸLÇY‰‡¿6l: ÙCñ!&WòÖ[änœWÒתŒMœ&ªÇ÷üÊ)Í¡ñeBr$£q Ø&ná1L‹ðŸ4…N¼C …Þ¥4 wæy/ë0!¿ôTດ%H-³‘ùOô*aÞ·(¿ªa2p õÒ%¬¦’$‚B%‹Ã>ø­ƒiôœÌnpÚfæúeÜó·}â”N;ö~67\Í‹1#Ÿ%±c× ERI&ìv?·†fÅD‘©ü[ õŒe­Á¹t @9RXçzläTI×þÔŽµ´ND“Rö m#>Vnó‹[ʯ5fÉ¿›Ã8-›@w·•—‡hÔþP`¬Õäšù¬/ Œ‰I³Î 3åÒ,9ÀBøô0ÊŸUV¤3¹VÏ%êò•ðÅø·‚ê« °' ƒ¼‘á¤ûPÖµ”Øñ£]ƒÈ¬p};Û꓇Ãù,[–åŸîÌ©–LœÎ &ÉP®’ÝHòMÏKEÃÕ)'åVÿ®ŽóÄS@§`ü%Þ,Åщ!®âÇmå1¯cjá3ÁÝÛªyj%•‡bà3TC /LåäjtëmðèfÞ7°ïUÃ_ô_d“¾¿âÞjÐ©ÊÆŠ@q6V¨°Yb4Àêêºb2s8u¥4Ÿ°iD=tdt€v®êZ|%+©A,à}YÀ÷ë\Á1À„ã8›I  ÞÖµë3ÝB6(¸LÚWbBÎ…0­ÿÈuNÔÙÙ³ÇÊäÿÅ‹ËNhŸWW¾âŠé§Ç"¢ËÔ`ÇÃÈÆ!óG“üU–@˹žô¾ÍdîÕŒ„ÊçH ´Ò´ñ’‹°ê#¬ú«†°jÈO0_ŽÜ ³u=Ý©Jo7ˆ=ønn'b"Ãýv 2í/öîJ¬½»¤åC Öé>¡ÇlÀ“ÐqÙJ¤6TZÿ€Ÿ Gýž}S¡Š’I=¨dî¶àv¼J7ÊÑø$‡w} dzl Ây†6afô&È’Ÿ°Æ‘,’&|™R¨³,²¨Np¶-t>‰òþ+Ðô e|:ԀNJ/™Cuæ·0»ðøŒñð†Å)¦Nýì²›ÅãšñÍ#˜Ûç6#Ïmæ6’¶ ‘»8ùÖ- à]Ì#?##«ñÆ¥CË_æ/"àÂüv›1áSÐëiã'ÏðÔÖ”ŠËuðYèbܱè“u˜æÉâÊ2íy†?l¡—IðVEphvÙØü„KûïdëW€Á=»ú㯤«xEo=’’ºû+ŸÉ$€d.MBœFìÌÚéæ±xro,™ wPšm¡5W²J[YC$ËxT*\IׯŒ8é©íýȧ¾­ÇáœØ$=üÀOJ_(> stream xÚµksܶñ»…j{ÆÔXÇÀ‡§ÎXqšÄ×í4ÊäCÓ™Pw8Ç<òJò$+¿¾ûÉ;ó,eÚÊ,‹ÝÅ>qVgüSgi|–f:Ìtz¶Ü>‰úñ‰’ÑŒo®ž|õUg* ó(WgWë)‰«ÕÙ?ƒ·›b×»ö|¡µô«ó…16øÛíyœ®½-ݬ¨,µ9ÿ×ÕOþr5fcZ£àÈc=ÀV–„¹1À]FÖ0k?4Èűr¾P0uŒÀþxºß$¡ÍñPÚ¹*×kÁ:8©k뱊z5G*ŽÂ4HÝ¢¥U˜&±G[õù"ÎÒ >WAÓóø?È{œ%Á¾s+÷ CÊ›ºiÃ~UÚtÛ¢ªžòZ²î·$w $Ë%ŽŠŠWW寑ҮuõÒuË“ +a"lÜ=²|¶P&‰AûJ‡ øgí4|Û5ò©µ k¶fðÇZôNkw›¢gx!»Nr†«SÎRv!ñ¢ ÝðB%¡Ñsò u¼ÃOl ¤~+WŽÑ!2‡x ¤Á}Yßð¼/«Š®ì>íª¢¬;^ºÛàÒ=OÞ1ÆÊ-Ë݈–`¹ÝUnëHÄž— ¡î„ò®mnÚb+„Ë~#|lœ×¸ˆ9Qø²Ø×eUö†V ©•¥‹/v@u×–Eïªû§¼¾l¶»­ƒ"e*×ùæä#5 BZKiË%Ý„ìqÕ ´¿0:ÞÕ ¾kË^¶!×eÇ`/Ê ÷Ì<ê+‰Ù ‹Ž'%Zy‡÷¾C hI¿fgœ*Sa–NUŸtÐ,LtâÑвӄ®ˆÿ÷÷/ø 8»Y÷àŠÈ‰zM¶Áã®êššwþ2ì²ÔM*%û‚µfÍ_¸Håa?UÏ£÷ÅGo‹0{;Ü Rû¹.oñ@×vžé 3¡l”ÚÁÕ å Ç}¿iZ7ë9}%Ù£ôA(Ë}mŠÓìýA]±•Ñ  !Ù­u訞äë7OÀ ÆÍÇIFIöï4œ#•†©ýƒ²–žíe¿‡°y/³‰°iÀ"¯øFt ¡0?º‘^´‚>“ä”`¡Ñãœc6ŽÊž¿k¼6Ä(x~·)+æe-˜×^d÷ªjh‚N]9ôržW¥7/œÑ­Qò5,&§ÓBÓ~ìØÍÁfs"Hj¬»ßžRí£Nðxmr ÃM[c8ÉUpYïo6s窓Nüð…Æ¡1DëE’YIB“>FLwcñC[Íé¤à€jŽ.ÂàU÷cæÂÙK2®­ÛfË##pŒ¥ÑŽ•R 6™Y ‚üv`fdt–È Ã köíRÆK1S÷jNô< ³<Œè&ÔcÙ²¡‹ê“ü‰S‘ M¢ý»÷ËkÌè$.2I™½-ú%îÙ:¥<F´ãbµ‚´Ò/î ™O*Œ2c³¥dd"+zÆÑ÷~Ææ—p&Öl¥È`òÙT•×`ž‰ål‡@ÏQˆYÿ¯Š®ç‘•]I!È=~? ®ýAæÂf&Cn©"”EÓ–ê:¬~Ö®è÷-¥n–eâœÇÄq˜™ü1§ƒÇ¬X½®›©Tû©4•Š+Ø€âi|å‚Ö&“"ÖE¬•’ÉNêœìö}Ñ—¬R ɀؕ۲*ZF œTeíçÚ§Õ 4á«õ» ”ùW¨Nˆ¹žFs"k³)´÷Dõ5†/;±-V¯ºÕµ4À"‡\F¤¦ýŠÍmÜ0†ŠY².¶E?A:2¡Š³Ç¸¶ ÍÕz©I„©kN ØEß´Ò@° •ú]ÑÞì}‹ „‰R NyìŠ~Óñ<9ǵ~hÉŒ¥)® p‰žÌÅ!؆жühÍ'`v;(‹¥ ås¶<’ *Ñ(ä NzÂÓÔE4j¢) ˜ù‚˜gÅrÙ´+>¦ ÓºQÁM9¶D­Ê®ç)d$Æ“•«ÀÈA&T¥61çkXç#¥ÍjïgHxºNJÊ{píf"aÇ>ŸÄì-ñ(Ð|%k±§è :p%é«-ÄGÓ±ýüÎAë±1©ð ÎmÛ­9 WЕ›Áp—çP$ÁÉøÁÓqÆ‡ÏØ|’CÊœcãZaÂ}‚Нò¶ Ù1:¶í­+j*ÀIËèê•@(E%Æ×ZØõúq²+:©ø,[~=æŽr#7#© ÜöVJ2K7‡u!´^¿ð°nøt9ôbÎ~gï&RƒX0ä#5¹/˜Ð}MW‡ûÌJàÔÐ R—€#9¶óISGØ=³ò—Ôº5Ø=¥Hì7sr¡>M”ùœI Ç‘t¯è’mZ^äžÍlæÜ·,˜¡—õÌ!X`U¾>X˽wÊcx “[!0ÊÄôÜ 4ØŸ{ä$òÓ# Ô ·ç˜Ãª=¿Ð¤T‡Îgÿ( Ud“bzD±í“ ¥Tîlvü€ ¶äžØŠ»h~b±¤Ÿ­p =´ca0¢áâá™\ÖYèÕÑÅQôˆŠô"aÌaV@N(ZfAR I}¨ûnÏ»¬äûÞ-x°@v‚®P£' °,:Ç#޲fÊ–hFø™æ¸CžŠo)ŒÁf™¸)0JÐí –û7ɃÃrÍøÜ•LHPs¹õ;}™ƒãHn‡}•F@”ŸÙpFU+v6T†-DIðKÐD Ý•Ã&cMœH':;6bMÍçß4{[C /L(\ -±(2Ëaëv@ggÇÑû`–£ý5¼ìC½/щ­llÁõZÒ,»¹»=ÇÐt—kþ‚žË–‡ÇN  Ã÷JÚ×ñ÷w×6!7-©%bhd=ºGi&rÊ=‰°¢?OÞ‚aŒ/’å²ì©,NDeªl-‚?\kà¨Ú^%3òŽ•&5X އ<(©!Qcˆ°qÿ6–’,Ìã!{/º¹ˆ¤ 3·Cèz!¤Û/u˜$#ÕoAõb>j†ÑØ }¹1Žât¦zF ùŽ™4QŸiU2|„ΕŽÎ% ?T*6˳»ƒ±Î³Ño§~³ÀwàúQº¢:¸üéí;ò¹w|ÈØjÓ4ú]¹ꂧè‹~÷ÏÆÃúâz_IúÔ*?Í&¾hä:2Úÿ/ÍF}qð모?NõGý3[è<3!ÔS‡¾ 'ñã OO‚iô)Žð¤Ó¿F|‡ï·üu&>]ÈknìÙ0ÔS0ž÷8!ͽZ=ü:ú³NŸø} œœ Ý]1ßñÛ,ÔÑQÇN¹r5v¨q*Öô˜mƒXÿØt›=„Û(Ð&´Æijƒ—ú¥)1‰Ú]ÑϾz¬,LÀÆ,jC+!¼Ä3Éðˆ–’4s‹\ÖÂ(Šì" cíârNpHÌ5üFw¤p3¯p£ÂLeS}Çÿo}§Yüº/O«T1Õu‰†_jÔŠB•Ï…øÏôEyµ¸Eð¶è…üË]'ÎÔ¼ˆLŸ?>s—Äÿ¾…ßq>p/TËÊ›–Ü T»=¨O~Tä¢BjÄz€~€A¯¾p“*Ñ!,‡v"Â~D{O^1ÔÒpÇöèŽïè—BÜ(¿ÿÌ>·.b‡*É/uqô7£ÇgÏ”\Ó³W0RF~ýš•:øàÌýÎm|ýúkÞxù…oP ô²7oàGó3¸þüèc~؈ÿ+fì13làÄsòe§y#ê»îšj}Î\ÛbtÇ¡­†ü¹…¹`è?æÅÛ“»âƒ]öËò~Ëûy@ÊKq¥<-Õ{*-ˆþ`׋ßuYÉÂSrާ²Üñ·ƒ2€ÞpBOÑ,ৃzfõ'ÿ<þÖ ¥€ endstream endobj 131 0 obj << /Length 2471 /Filter /FlateDecode >> stream xÚµkoÛÈñ{~…/P:±¶\.—£9$=œz-Ð臻JI+‹E $e[ùõ_2ýŠ:@¸;;;;ï™]é3þé³88‹£Ÿ­vo|~}£e´„Åã¯7oþ|mõ™öUê§úìf3&q³>ûÍûi›í[W_,Œ1ž¹ºX„¡õþqw$ž«ïrw+:‰­g/þ¸ùåÍÏ7ýa6°Ê†æŽ:¬Çlc¶´ï«˜‹”oCælqò‡çÍ…6JƒL„s~°w~#maô—/ðXoaBk• ôdçÓ?~üqºÑ÷ÓdîÔOŒöyÙTÅ¡u½Ä…=åBÌv©À¸ ûHÿsû¾O÷Vùþ÷ë>‹Ù( tbüçt¡VPÖgû1:ìÝ»wÏÈô·¼Îþä%7y! o‹¼iõ[YnøÛl«šB'í6“]îaïV­[ÿ0wä³ÁÕIbžTDT}*êgþ”˜@pP p¯‘ÝüÿdFt«“瘵NìÅÜâùy(£ÈrŠIUy>|ø:ñ­ï]Ï‹°Î7W‹›ºÚÍ ¼Eâ§YYIl_«âDXúŒI»ÅL‚*.´çxÜd;Çù½ÍwNÈM²o©8ˆA¢SvÈÛܹ¡#ÞçEÁ„÷5Øk|º¸©Š¢Â…û¼¼e¬h¯î(ø{çš&»•U)L·kˆÏ«9nZGʦÉTú÷ïß‹¾.׬Àjó¬Õ.[màÞo{¤¶>·4®zÜõÈ‘i*²{¨ÈD»~dCšl3±ö®ªÝ@­9õÞGü^ÎEΈ‘iLö‰xÖ´¢‰uã{=. T˜S!{Çt²1`e45ä–§µÛeõW±|Œ¶söÔAªbˆ¯×¹ß€¸ÊJ&\»:Uu[‚[åßpìxeUíö…{`vÈC;ü ¥ œæ’—ö5yé]¾F@1+l»#òšSØB'‰ “djû:o[‡,%1¥/ür$À`SÕ;)‹”Æȶ)›“:Q6ÑƇ9"Z« M;”e>GECcõºƒØ›£cT&'ÌDþ“ÌüÕõâG©„œUVüumñp…¶Ùfu)&ÂÄ‚-%êVÝ©Êï.¬õ²â6Ãc c…úY̓«G}¶»œ£+“öËyë¥~ØŸ‚©©c’\)¤\f'é£ÉoQ–0kÓ§³ÖÔ!8!ԀǶ8Õs˜Ëú¬ ÛGÁPsòE¾Š’Þ#f 1i“AI cïÐPÁ˜@ñ[»}í×W‰0õz>ò]v›—Y}äé¡Ì[¡Ã!öËñ‡ò¶;d‰Ù1ñæ·Ù²èn!:±Ó€…ä°#ƒ„:–lŠ£jßæfà!„¨oœ;½ú@[IðÌ\ÈÐÍ” € Œßu1¹•œÞÌ)ËŸß¾ézVqfE°d¶uþ»¯¡Šïb>ööTX‡¯Ac)ÀU ¹g,Æã \‡õ‚§Ä:oÓ šÈÔz_6ÌÆ‘X?ðd]á7‚˜oðµäng÷R0àl¨:ÄÄ(JúÜÄz6·ó $íK„„táâi8rU€óãr ÞnsټŠMÕg{l[ª%¸Õ‘ LLÂ5ꆘÍmŽ\£ ¾FÆÀ1Ø),\wHÅQ‘å%Zt¦ÔʘAQ㑨±tT ¯r†ASq#Õ+R2 DÏ~ŸGRõd&¸;t £ÉA¢Û’ºéïv Ÿ Bï mL<ëŠG8mþ}‘PÇgðbZ• Ôךg½¡qB\QÛž¡ <ŽŒ§ÐéÓŽ†§Ûñþ¿¾O'uô ãK&RWeþM(sâº/ÎÖÎ\#ƒ h¨ Ø Š*þQŠÞã‚(B²õ:§ìÂК¡kW¸Tp©g£q׈â `­ñn¶gk€P3¥4V€¡YïH‚}_,–(¼ŸP­’èDˆÄËW³–èkù†¿Ì5,WrlQgñ 3 :ôV€èêY-[ÆŽ ÑÑÈQå„räíòõº-Mµ“Qg\D¨êÙË'ª!ôAŸpá7áóÊí[oÈá’ŽW‰£øC£Ç…LQQ@®2¸ÅHƒ•æ^¶¨0ö(QgÜ@²G[Ä‘Gš®@Ê;àYß—5²0.öŽˆë¤(„B®’”¸ÊŠaK9w… L¤üÀ¼æ Ù$îG1ˇ†êÙX³ü}ïj&=¥v£o]1>gN  u³}çÙô ©JÌýxN߈š83ú$@8uú31$+Ê$®vàðW‚ ÆüJÐ8hk”ñ=€V‡–!”bì@1=Ç”žû»[Öb¹©æ*}šÝ#’Vñ<èB¹Ù­Û†Yrb‚㩜Y#z1±Ò@j¢—A ä!Šuù¯œ*™K¦•B*/$|c¶Þž*xEÎÛäË.ÎŒd9|9ôUf]CÒH!–ú 7£œ¯;­”èŒ?dyß'%Õà{D¹.:R]ijfbŒcŠMW©p ÙŒîë‘A=꺲:¬²ù½é”¼Â­¶«g%Xª»í^“lØg¢VÞ˜úª=dµ2€Ò•¨F™ñÐûÂsêÑf²ãmÞeæ 'ÈHcA£²îdjaÑ{ åGDqûZ;.àào2@´ôP â%Ø·Ä"'D3Ž ÁÅw»noºÏz»B ´9‡‚œÐp?0#a“cg…ïAFKë’á G#ÁW)GÒ]HëdìJ:ån®¡(‚5rVÒ± Çûä>EãÿÌÇtªô߸÷üôDRKtÛüÉœÒåâiò¡Š†7Ë%x€ž¥ÌÏxeQùÏS”¯l<¡¼žr÷–š@…Q<ï’ä~;Â¥÷Xî¹yë¯U‰O)6À—Ї½+'™¬Ã}æg€“GñÇ~ÉJ?êïä½50FÙh&m\»å#äÄÂMwö—•_³z‚?'è@Y;‡üy_?"mÁÒü‚·Üÿð­+ª endstream endobj 135 0 obj << /Length 1378 /Filter /FlateDecode >> stream xÚXmoÛ6þž_a *ÇW‰ –¡ÙÖ+ØŒ~YL±™X›,²”—ýúÝ‘”#GtêØù y<>¼çx<†M(ü±IÊ'©D‹t2_Pßûï ó­âÆÏ³“®›0J2š±Éìvhb¶˜üý²Ì×­i¦±"çÓXJ}¹Ÿr™æ¾00Âtª¢dú×ìÓÉÇÙv1ÅQR|Q¯5†Åw`¥$å) KUÒA»ÎŸh6E 4z7™©&\!°3AìÎ*êªe _.(¡tG»W.GÊRÂ8 ™¾ìîF8’”$A˜õH™íñeÞŽ1SFdÐòçú~¤ÍƦ½ö¯f°M O­v¬¬¿‡hâ}¿ùYÝæ%˜Oa{ïì2ÏF æeÐáä„(¡Ýä¼Zx­è! 4¯ëª]ú]||\›jc6Aöóû2ìöë¼S$öøñAxP\½%RŽ"ÜKŽÉ÷ÚÇSP¾—|Fµ&B@~c6ëiŒéeÞ.Ï”OS-¢3—ƒÚ¥©¶-lÈhQ|£L˜ÆTs ßŽÝ8-ΰFÜ,ÙÏ‚éÛ±Ú€YöòÆœ;´ ¢Õ$“j1ÌKCcr€‚ýY-».×IT@6mQW(ª¨¾uÝÛñYçMÞÖMè 0I‰¬7ú*-#<2!ÏAÈ)}t€§ ‹ÖP11: ½†ß ×2Nø1^Cƒèüæ~ãüÛGц,6vƒPÐP×úüÐa‚@Á‡”K"رÝЫù\†‚Øé7¦I˜¹M}{ˆQ ŠÕ£bÚ… ÓQ¾X>ó€d# {½lVk{A=9Ó…kÙð„ïž´­‰âòˆÀÇ¥o]¡‹ô _uv‹¥âÈ»èûN–’•ècœ¼=cÁÆ¥½Ÿ*åejZ®ÛçW1¨\Eƒ†6ÝjOØÉÄ¥ØP%°ƒ *ªÄWGV?;°k×]ëÛh,é“tÌëÕÊí„0×àBý\ TÝjQÜzLñÒ/~õU‘½ÇíÈÞÐ`R˜yï|ƒ ñ7×\æè@W˜¹dã.Mã;ýFdT¯m»Kžr’%j§² î ªíç¸ú„‰Ï õâ–µgCÒ®t×øŒÔ®Ú^|n`³¬]ùg¥‡e1GqéÄyÝ­AÝÕ‚ [rÐ,dÏa¤@½à×)¼ ¬Áy)ª;×mò­YDW¬ 8’ ¦ Îc>o˧í…^õòÖßÒ’H­vÚ“-[;?! {)Íç!‡ÂO3¸éyF…là rzÊ‘E¨ã¼¸p•üë/• òEö½¸øÉ?+ü }+°@°…¢°Ï•ð‹N@Â[è÷`^³0|q>c8=þ5¶õÉ! ?O³Ü´=/ÐnüòfS—]kœdšó6ý²´ÿ™˜¹Þß±œ,î÷ÎbDk¡µä<Ñ&!Ô‡‘"G¤\™›‘Kµ¢$MûýèUË endstream endobj 140 0 obj << /Length 799 /Filter /FlateDecode >> stream xÚµ–]o›0†ïó+PSi ÏÇÆ¢ej÷Ñ‹J[¥)wÛ¤ÑÄiÑ(D„tÚ¿ß16 ¤EÕšÜs>¿>ÇŠp$sdÄIÄ¥³¸Q;û{vä£ß²ø0½½à%1Á™¯Ú!æKç»ûñ.YWªô|ι˧ž½~ðXäªò!Uð DR¸Òû9¿}ž?&Lðgˆ«.kcˆÕl,$T†m6{¯“bI˜^¾äÌKÿàW[RÇN@X›ñX ~ˆôïf3Ï*¨û%)iìi.êžâœÀ·Àˆý¸  YžÀ ¥M€6åŽ`<åÖ¸fA÷!iw^5@íÕÎU{§sóúâfSdÛJ™'U–Ei†6i@m~ʇ33ûMeI•>õâDD"’K*”Ïú ‡mHØÙ‹õ¾žzN° Yd³÷­•ö×€ÑPDŠ«mÞ¡`œöRÀ+O º½0UKŽím§¼BIBñª¬Ãq½¨º‚P Áë‚OjÑB1Ó[»kØ«$×:wt,ë0Œ§pز橼;§ÇŽ5=ëÅ–e2B‹óógäè9=hÐszì/üfÈùÁˆ|Áù„‹|~ôt¿`¯ÊŽ´TSôEu¶ëP¯`^TI†C‰jžZ)âHHD€DZ@£•éÿr<2ômþ Ô}_ýŒ/( ‘äÌ즚ðÁ @ă€EjÒû­œL&¶;/ÓÌ:¹I³ NÌÃ2]­T¹1«²¸·£}kv¢ƒÞ{ôJñ æøœ!¿½ü|ÝÞ/Ó¸¹þÜ%=ÜR­ugºEY©¥™Ze©UöטVwÊ VE–ú¶„%pSÜüÖx˜ÈªTùBm¦†)¤{L‚ÄqŒh1Š$ô‘}üxW…@Éj«:=Ö€»Q‹"_šq–æõ,r¯Ì  2kùËFÝ¿vQAB€&l-v_v‘‡ÙÜsN7%Šà…‘³O‘ÛbiUª$ÍS­ˆž³V©×I™TEY²Âk‹¼°ÞZLTåTz¸±û‘/T󬹊þ $tA endstream endobj 144 0 obj << /Length 1806 /Filter /FlateDecode >> stream xÚ­koÛ6ð{~…טŒÆœHŠU,C²G[ Áöa0Ŧca²dHr;ï×ïŽGÉ–-»Ž烨ãñxï‡ÂG!üñQ,F±‘ÌÈx4]^…úÏ÷« Lv0¾»¿úúâ#²$Løè~¾Kâ~6ú#ø~‘®['RÊ@¾O¢Hï?Œ… lõ!³a‡›Xfü×ýÛ«ï»Ë”PLEòµXŸ`+‘Loš…*"ÆÊêš˜ÊæøŒ‚ òT® ¸ªìܶ‹´&”‡ñDĵ½Îln;#¤yU.iõgÈ£ÜÊß(0#v™°ŽŒ'Yž ×cZ¦¥nѾb„£Ã]œ‰PœÅ±M¸f2Ñ„ ,ÄC¹`Zuß/€ËˆË Ï [ãR•ÍÓÀ<˜ ) §i‘—ešj5½¿MÝû:­6t"-f´óKZMqkA¯" Z-R“¤Õ,^\™:Ïî¦|ÓÞ X&˜e¨aëùË Dšpɸ"ÉÕ.Y(ÏÓyÜé=@EA‘.-r!'EHÿJi¾FÕáF9'x‡`ÿ]9†mQN¤•%ä¾t¸åÄ’¶²¤^â%:xW6cdSTŒmé§ÍÞMh@¢û1kN!VLëØ«…“ði¯Xs~4ª¶Û‘ŠÅEÄLôLΡ ™P_ìáRó¶s“zÇÅŽ.îž-¢ëÚbêÚðýÍØÈÀ>TPåA5|Ã^G›àÊRîÖIðv ›…õowëÇuÝÐyR-,ÞO›ò¼ªò2f&Ôd«wàX0zQú’]“´ï»òàޜހóSÙHp¦¸zj6ôwR£´‹²éF‚Úv†u}ìzÕéƒçògjóÁ¢X^ÜæKÙE+¬Hqz˜oe˜J’KªHLí§[ù2¢’ìÍ©ÆÁvj—¨ÒÖƒL '®2¢²«mÛÄòD V`yYC×tH«A¼~Gu¿6úd†UÓ?g³ ‡/ç1ĺÅLâ?ïü„Ž!ÔÎÇx™–ËåOqDÇqÌ’ˆ_ ¤*pŒ² /iA‰ &¯rÝÐ˺¦h†%9,Ê•âŽÝÎaèæ¢ëV&ÿ‘&oY™á¦"ÞÞvZçžgH¯XüäDó¤# Þнt´Ìêܦ3`þp­÷&vµöÕŒBüXߣ#«3X³éܘüæ‡WgE:ªvÎqBØêýõð« ¡Ë‚¢ ’ôºÜûžRÝ|#ÝÁ±áó—¹H@@Î Å>…—¯¹Ÿ%?“•-!Ç"žä¿Å¯h0noªGã>òtòÒoÅþ¥ÃÂïÝŽˆ?»lƒ+A̶øœg¹ßxá|å…ß®éY/ÊÊåwåB.õ§ BB®´³/†® ëy #:pŽ7öáÀ9Œ‚²Ÿ¦°ë›çˆ 4ŽÃÎwâå䵃α¡Søï”ÿâg endstream endobj 148 0 obj << /Length 620 /Filter /FlateDecode >> stream xÚ¥–MÓ0†ïý‘Ê!Q‰LlWtÕÁ¡ íö†8bEÙV¡-ÚwóQÛiÜKšdÞygæ‘ùÑH²H*N—Ñ·ß#8Ýý5¢§«Ô¼6Þx³½z4¢@4h-4%–ߣÏñÛŸ«í./’”sói’ ñ§CÂTœ‡‡ü¯yB•ÄX'_–‹Ñ»e• ü‚£ç·\[¬i‹eÌePXgó$eR1Œçócj#—RN¨)§|< c-3ÎÆSž¤ÍÕëÙ,9fŒ‘²ŽšÍnl”T„¡/×Ü>¿ýúg³Þïrû//ŠMa/OY%‘ ”+Ÿ°—öî]¾^íÁ(M”d"ȸÎ'àËŸž-oax*¬l„øÃª]&øÅ©XÊ¢¿ŸÏe?JÅ~Ý8ÞÂU.ÍÀ88 ã)=ŸˆõÒ™·Žª&b ø'â…ÃÕtØèÑí²À!L£¯…ƒÁ!“’iPù„zjíd£ª,sà¸ÝÎl‘ ЭPÓqŸo]¼ !І# Ãa½t¦õÀaó€# Ãѧ:Ze€ ×ÂÑŽ‡ôìOÎhƒ»c-P³ñqspè¢pÈ®ã)‡ Ãa ¸¹xªÈ0=:àcÃ…ã*6L€ÄzÊ=Ù0 µ9\ò”^}ªT•)ŽÅþÑ™-ã"kƱ²z4[é™8p°sÖK§qß±R‡ Ãáé@GXe¥]÷:àj:(Á:êèÐ:.}3´èÐM:ŽÖÒÐò³¡»ØX{·_Pÿô}§=ãvîÎíÍñãúmõ‹ú endstream endobj 152 0 obj << /Length 1329 /Filter /FlateDecode >> stream xÚµXmoÛ6þž_áÕ&75ÇÑ’‹¦HÛµе6ÛL±éJ›,’œ,Å~üîx”-Y²“mXDGñ^ž{#O#¿bÉQ+«h´Ü\pÿö á©)0L[oß½×b$8›ó¹-Öm‹ÕèçàmšlkSN¦J©@½˜LÃPŸo'2Ly›™;Ø*Òà“_.Þ-öÖ´ÔL‡êH W—l㜳ÐÍ×!Aç“é,–:¸ºz…ÆAáT(&À#Çp=AíÁYaˆšÓ#+è¹Îr¿ñä&ËsùÄoWô¬R[:×qQ§‰—2nͲ6«o:&ÉâôègÕx ¡‚ i¼¼ºšLêõî 'tÑ]Æ¡ï5Çs©žÓÛMžÔÙí#¥ä¨Ù«Ï˺S!øNrÁBrSGLâ)ÚŠQÓÓfOÍÛ—À³gϼ’wÅŠÐÛõÙ¾(M²Lç½K÷LuyŸ_ ïÁ•ui7ƒö®‹sãY;Η——>Î'|\eëµ)«LHgâøRD÷b±Œ˜Vþúù´Û¬²_¸€®±–v³MJŒ® ;‘QpG ç6À–U U.çpð™¥-VnOV®ˆ‹â'㙫|ó›Õ¹¥áâ”}Çù:ÞG˳}Kï²:},8ÝGY˜ÇLHÙͽC<Ÿ#šñ¸X>0(L°{¨ ôñ2²ƒa†’7»šv¶¥½Inò{Z抨æYXÏx—&5)¹Ç9Æîük\@©Ã_¿7˜³¹[âÛÔC¡Ç2© ÎC°A Û¶ š+[¬P±HÄc#5Øk ÒŒBøÄ®Æ§/%ZTfÆs•x8âùÐqYD¢J6žÚX’Li鈄 ùDÔå¸J¬Ø[wĨ¦.ºs‹5Ž×™-[?c³†^\…8$Šê©Mí6ïÆ©4%Y"dó0<Ùg!HºFÆU’c=„2ÄÄÑþÑ][z–»‚˜~ßá¹6GXö¹›?œ¾‚²"º2ž%µˆôŽ™W­~_PY”¶È¾šêHqMBX`T{çZû’Ñ( ø”œ—űGLj±¾q½²¬]~`E…zOrT1Ye½ÕÓXXÂ)Àu*wV‰`‹ctÓŠ2,îèwiTÁÂ¥^Š­‚ôš 6yî…Z5í[`öÖkß~¯{S¥¢¸¦z™®iIçÙž<)𣠄ÏÃQìÐN¸¦3Íæ2êÖÖG[`¸Ëþ œEå/=>¼E×<‹œž3ÓÆaì€yjá%Í-A’ûýaC)¦gþ‡Âãa­¹ÞÍM;ÖœEQÇ‘ÔǤìÏÄ’ií1 î«áyñõ¶ì!ÐÒá=‹à¾g!Š™< 8µ? ìÃn(dü„F(ï Aý3ü–¡DœfÀpú ëLN›„Ç}»xegÆØÓQødo{B¢ á ÆïÍr‡!ÙcøË{Uî?»Œ|ÿ?…¿ó–ön endstream endobj 159 0 obj << /Length 2282 /Filter /FlateDecode >> stream xÚ¥koÜÆñ»ÅÕ6$²ûàëŒÚ°$€RõCá(u·§cÄã*|ø¬þúÎìÌòHŠ’ŒVÄ}ÌÌÎ{fWr%àW®2µÊrå:[m/¯Þ¾<  Aüxõ⯿$r%E´¹ºÚI\íVŸƒŸÅ]gšu¨µô›uÇIðÛ×µÊÓ|-Í v¤Î’@Êõ—«__ü|5œ–¨$Jbý Kê!_jÌ—"Ê»4IL¬…ý“Jˆ'öÑ•Ìd”ËtJIÐ#ùÎm…Ó=Úº²]Q­Ã$Y_¯‘í@mR¥‚["Ï#8¢bêMƒTŽÜÅÅÅ:”"Á/eeüåuYUò%Mvå~oš–&ûÆy4…V/‘øÜˆ¡ÊAY¡L¢ð=Z—Ïp¨†V*W'ˆmqäѹ!JbòÛW;&pÍŶ®É;èF‘$Zô4¬¸h@ÇÇ¡8,©CîLˆÞK“Яù*‚ñW¶Þ«ÑÔ>FŽ–Ú±$ N†‹No߀¼3Uy,Áª-Å€„LÏ2ábÆ*ü#VzÙ¨p-Ò©þwG]—d‡’Œ“½­*‹zvƒŸ@È™qLhØßôǡÒw:Ïü2è›%Ù3^=@#ª¹ÁÐÀ…»mœ¶¥\æ§œÀÑõ`Q_bßЄ«“ÏeÕ3•?†›¯^ÅðÁ›é“…Ÿ@ÃìRÝŸtlþGkÆÞ2Ê»CNàÀÌòà s다Þt¾‰(gÌ÷Bñg¨gXžs>³çzÃ^té˜òmûæœæš¶óaqÄsïðºm¸çþ8ÍŒtu¾ÿÒä9¥!ö6C«Ê¶“K¢¨Gþb"`ªñÁÒˆM•^¿~½Dÿ=ÿÕøôŠ|&ûm@ãÃý$ŠôjÈGä#õ,\~äד¥¶yk]0‡–}9Hö‹Œ#þ¨‡Kƒ‹'3PSß,»µQ6wëÅçà™’_½’lÄWo`$!6‚¿½}Kââáu ïíÛw„÷a |b ß¿ÿ?zÎÏŽOó£çü‡ÿÌ$sf(<ÍI2çäéˆzÏê»nmÕwüümš»uòÉið ãKZý/Œå×G±Ô+yFÞwé\Þ‡In„ä2Jù¸TŸ0|‰ú`Òž½ô»ààÿ ”ü/ö`÷º€“îP04àf÷—¥#—<»µÿo¢dž endstream endobj 163 0 obj << /Length 2148 /Filter /FlateDecode >> stream xÚåËŽÛFòî¯˜Õø@Á#¦_|ÈÈž Ö@‚’¹­÷@K-‹E*$5³cìÇoUWwó¡ÖŒK±w³ëÑõ®j™_1øË¯2q•å2Îevµ9¼böô÷WÜîV€°aüóþÕw~ÅY¼fk~u¿³¸ß^ý;úa_{Ý.WRÊH¾]®”J¢_–"tûPêG€p™%ËÿÜÿôê_÷þ¶D$q¢ä "9¬s¹ÄX.ÎXœƒtiÌE¢]_ ¸<…»¯ßÂŽ'°ûþöv‰,£•TIKÁQ*¸iÅeÌAÕ‹”··ï¦”Œ­ó 1Ѿ'¬»O]SzM_ºm›–¶öþuÌ€ýÑ+uC§¿êªèˇ‹T"N9S)¨)¥^e/É.çZoŠþki¼¾?Ìh¼š"ËüþýK“¹1蜬ÒXH-ʯ¥ì"ü&Û'1cßnû<–¤¹à¹dÏÙ>E« ®Ï+ö.+öúõëË:ý\ÖV2AKYÓº++ XTe×ó…w´vû¦5ù‰ý¾°Tú¿G½éõö!)W³?aMäUGp«)ŸkzGKÕ7*¸äLwù×èžd±ÀÒ8ÒÏi½šÀ¼q”UU¶·Èu¬ f„7oÞ€MX¢a¶ån§[«Ç®mA…Å‚d€»ó$…5‰³ÜÊPŸÈæ5\©˜eÈd-˜Êuß¡ÌiTà’D­>BŠç˜ššÖ~¯ ±ë‹z[´[ >õÇ“EÝaê Š¶à‰Î?2®tµ%X³›ð#hÛõÅÊ÷åùì ´-(Ñ:ä,¥|ê²¶$â.U´iÚVw¨SªlËú32¶‘i ’Ø„GzôMbÅæf®âµRS«(I™ŒCÜMM)Sˆßm ¥XwSÓ¦j €Ê¦¶@i„dînð3êâ «'‡³ii>Í¢ÓíöÉp5á4pLG×B~YØã^·Ú•Soz¢Þ‘H$ bޤŸ.ZÆ\&étÙ’5AW:ÝüX‚‘jJˆ(MŒs„ˆîÝ}b:"ºtÉsTZö¹T˜Px¶Ë4íŒÄE\  a±NÈb°´àM`}ʹB,蘢~íTMç"gíM6¢“éÀ*­»º¶g…cÔ5Ó4¤±3¯µ&©OÝB mC*Bþ¶=åZ»”Q¹Ž*½ëi·§ÛhL'™vçØÚ8Özëù÷ Êóˆÿ@Íèf\ÚòóÞ!øk‹a°æÑ‡e.ÉyÀ\cF¾ -=lr·¡yÅܤ·òân–!1i ˆ1dVªV£íi¶4€OxþD{Ë\DÝÓ(ᚊ èëëëz¼ŬÒ2>ò°~'îù†çÛ(ž'µ-ô“¡xæðçZ‚Œ3á[4N㬎J¤I5(~û¢ŸUÕ-ØžÊ1ÙÎz½·1¥“ð! :èWÉk5r(ÀÊÉ2* ©B ؤÈ^_s?òùpYl6åV׿ÜsÂa( ‡Ý¹ñÀIðö˜ˆxÐ9…ƒGïv¦îÈQ§ã&½.¢º§l‰S&¬Æ&N\µe£Îo¬°‚a1|ÄžaBr T¡/ažŽ8—A: ÈdT˜•½ Š¡tO]0¶åÒd‚4qÓj b±iNÆ<°µ A=F½!Ý`üTÚ#Qž ¤ÕÊT‡² ÚòGl!02 ‚»^'0޵«§ˆ3WØaÙ±*Œ~pD>PoÒƒ¹¶' P¶C"Zž¡,kÒÜ¥ï÷¡ MÆ ~{kűÒSA¡‘vÎ<…¹æKùîEÞ–so†>àÜ7tðPv§¢*¿ØñBf2"Æ›™ ¾¶ºˆéׄ»º¨šÏÍ©ƒ1'WQ°Nœgàßãõÿ ¥ˆûRÄ]aà£üærT‰¸­D—0m!â¶qJ+oÕ……Õ3Cq9$ /ˆ šxròkF| N4 ®F‘jm#ÜEqAË¡q¿iǪtÜyH ãÉO0ÊÙ„ûÑE±šD±HãÜGq̓e fÚ8—3ÿ˜Ú’Bœƒô#A6ö<~ŽòGš’?R÷ÌK³K?,d& ȧT "‹È<‹yž8/ª{Ÿ‹z&–/¨^*É²Ä 6c\þ&˜…[‹$°qbz§ ÖQ^ᱟ‹ÆOóÔ8UEÈ\1PS85ï‚Oc•I‡ó¿ŸÉ„Pó•·é´‹gØ=æŒ.7î]BóëX¯@y3/”–~©Ê×q½G :]ÄŒ§§gcçlfç·DŸ²IœKž“ìçgA‰ á'#V2ÉqÀ……Ä“*ιË`:rö|*‚3sáǽK-Œ‹yéég tÃP‡n‚Æá °”êÏçÇ:ØAÁ¥0+9$¬Ÿem*_ijôÕI“3Ac%iÌRþzzƒ ?NRzá³"Ä8á­ñ­ž ~ÞS¨Wºèìsœ~$ò¿_š48ŒkŒ¾è¶¹qÿ÷Šà_ endstream endobj 169 0 obj << /Length 2953 /Filter /FlateDecode >> stream xÚÍZëoܸÿž¿ÂM>DN¼:Q$õ’ iqR= uq’*ïÊYõ´Òž¤ã¢|çE=vi;Åõ…Ñ’Ãáð7µ:‹àŸ:Kã³4Óa¦Ó³õîI$½??QB­€a5ãøíÕ“ï.­:SQ˜G¹:»º™/qµ9ûün[쇲;_i­ýê|eŒ ~ørgAÙ}©Ê[Q:µÒç?]ýþÉ÷Wãn6¶¡5ú‘׉\I4—+ÒX/ #kX¶O‘JqS8ƒ™óª8L¬…å‰ëOç«8ƒ7üyÿwUó)²‘LçÓ“84ñ8ý¾l˜Æ™ãh”o¥Â4Ê]%u^QÂ$µß¾Fÿ;$½¸-M˜bÇTÝøÖÉÃ8V'zY¬¢àÍx¦¢ÙøÖ‰£Ðhsr¬‡êJ¸Ø$®á“í°åfÓ6H¨àï0®‚®åÖ=ûªŒ1QÿÊÆ› ÌP—]ÏûÝtíΫá$LMòˆjú–IÃDØp‡YòaÂ+g¡Í³³•Ò¡‚ÿ7l9{Ì–3@‘‘iS6íPâæ:¶% Ýj‡8wØq[V9`ß-`ÙÍ)®û¶> Òúrn“ ¨Òl½O&6Y¨¢ìÑG£3=4¿z_«Ðä™ú©EÂ…Ú(´ [§šÇ~¬ðÅé,B¡ú’ÉM oÃ4ÕPµMÏ] |ÕLbì¥!Ñ•u1Tì^¸§ìº¶c²xîpèÆåƒÛµ|ÇÔ:‡—0BÉ{|0M|~L8(²•‰úE C|Ÿ­Ü ³¾ÎУŒþh!³“ID"Ø– &1é^1XÀÎtC«4Mƒ úiƒ(ˆ®I2ضÛô¸d³éà€»ˆï–ªÇ!Q=’›–¿ç&¼&ÖȾ-šÏ2…Ý*% “,^jçŽd8À…Y¸¹¦¾cj¾¶I4bé6y˜œÍf>¶nw{Àü ·F‹ïA&7ÁŸ«f]º1ŠUú =vXþ5á·ço±EMBÁ†{v#}_]×N®–¿uI–:çÓñáþxر+¦('ùؼ¡ÁR+gÞç …JudQÓ=8zl=O»åÇ ]Ù³dåzµÛù@€.¬¼~l’CZrà£ìúajÔ2@bÀ~“Yp×/+W)ÅÖI§Y£Ý⪱a©`”÷b†IØ©Óqôåº%š…ºÀFTM?”…Œ!À´C_5ŸöØwåºÜH¿ nÚn‡Š<Ô É ÃÄÁÕ–î¸×Eã;™ <𤠘}#Ô°íÚÃç­kHo»ج€þ«×_™(„wïsuyÊ;BÔsÊãˆ:¶qeD¨€ËiBuÎV;‹Bmçqµã]͘=ñþñ’$ÂÇ÷5Äü͉ာOð‡u*œ¹!ƒ™+„;˜´B÷5çaퟱb{’töš\TUÂ3þ邳}A¡M ãcͨDƒžõYîÄÉ=¹†ãZÍØ<:9^lîüRÀÛ<õ‚¾#ÉC>Üàˆð@ô­Ë¢’ì‡âA— ÆX2=ar Í—õ¦çV%_BZ"8)»j]Ôh¤v\L 3q@€Û†ýÁ‰S9!º’ŸjÛ ôJHhçˆù. ¤Yfqì›AÿG¾Y‹ƒèy´ê×¾.Ö$”Ì»&ašÍ¦ö%½Úî•ïÙD¢` .Þ¡¨¼Ùwï¼ïG„^Ü QžÓ+'òXANé ˆ¨‚?¬'¤*ai]Yqî ‰1l¹ƒ«—Qé” –ª¤¥kŠªÖ]ëÆ§ûéšiÏûîfÝv£GðdèËŒ; Po9˜ÍƘ@g‚²Î‚mž?nI?4ƒ®(÷×X}é öã cý)ÍAŸxsã»3c¸Æ¸… ”¡?Þ}ÜsÍî‘”¢5d:éQv1”u-ºPîž1ÊäŽuÙápÃi*¢ˆ«‚T*º JGþŠœ&*÷2ñqÇt´§³º¢“‰dð½f¯É~ Gç{Qîî1øý:zûrsásW;#‡§E  /«jü7fËGõ슘¤6xö6 °@½~1¨…‡v[ 4žýhV‚oñÍ›·ž0èÏÿi)ÅÔ7~oªZžÖU?ÄOe¸çï¨K޽Y RÁo¼¡8lŸÙdyºVJV~m,fw2-'C-œžŒÆE_Jô…: ßó§Ázdõ¨G?¨õŸRfZCX´÷¿¡Íû m&FË{Öa’É;ÈIÙó.a'™:øý©Øo²ö­#×)„g²$·8t܉Z¿`ÒŇÚå оÔE&ÐýIióÌkyæj<Ë[áÉï/UøÄNB;Å}OEè–·®ª×…ó¹:ÝÁÅ,!Ìσ.^²ÐLE)¯D@*“/MMY4Àqã„uÒyäp(ޏÝVkDÑí8­àP¢¯ÿ:Þ¾j¦íIa :™£Ì{Pxô(SÈ¥êËsôyÄ+_‹Ý¾¾ÏuýJ€| Õÿ O϶+ .¡ØÑ?&T+Uì‘$pÏ\v%Ñ‚Ä'÷ ³ùdvtŽIÐ…›Ø/iß|^_}åÊQÌ·ß"^Á¥x”;ÙMš±ÝÀWRlÊ0Ó^¢mäÏÞT&v„?º/DAž GˆzŽÞé4gœ%ÈôZKX~(ÑËgòÝÍžy[{%Ât-·zýúÅÛ·>‰ *J'hÅÞr`‡zø;M$`ÁQ‘óЗb©0‚Ôp‰O-VÈR©"-ŠÆÎï›ÍꇛÕeE9¼ÑQ‡ø ÁCà}" [RTbšÏ&G@]hdØSpsšÃ“!ÂàÊL‹r• ¡u#3‡£ÅËf³\Û¡Jôx` È2š \œIq,¥â6)eC†-Pæ S!YPÙí*L¯ÙŠOKÂà<Ò)Ц B1ʼnëÀõŽ®Fªi]pÐIÒ y^¨õQ@B&’ i,Îô-SËTI¡Ɉ´¼íòz$$#JYe‘]ôÂÔò‚œ íöX˜éJ·«0Aå(8±›¹urŽ;ºL†ÅB¼·1>¸Ódiô©\ëS’À™`Å’ºÈ%Y’T®¢U5öÆS¡8Ü"û¢ï¹)žÝÆ®> ƒ]û¹+v~W,ý¼õ`T•O¿¹í»Š±CÍboŒ@íÍ'^ (šß6ýVzô¶zƒ—ÃÃäÌÁ•ç3ì¸(±ä‚.ôL8ný„9²è˜2gD{þ!À8Øß-pÙ‡×ç¡K³)ºs.5@Çøc0‘ÝÕh£û©ÏSŸa >Q6ì±R¡ [Ïž4JW&;/âG¤±:¹+†CW’š`FW¼q¹yõHD")Ê‹/àP戰ìøQÜÜc[ /œÔ1 Ýi…èväÝ̲¢ #ˆ8¸¹Ú.ýq  .l¸Õúã€åD^ov;d‘Úiq*µ‘&ët7üQ•/N2qhòx‰“i2=+¢88€Noä«0µ#‚¯~¹·ì;†ìÏy5Wõ80´dšœ··œÀ˜¨0OÍ#µ`æ]͘½µàå’G²Xîã‡fôlíÏò¼´ƒ!÷3TºÍWºžXÄ€ÖáE-rZºu\áx±ñGà‹{~M¶³Ÿ@®V¥>æDcfiº4]öÆaÔ†[®.«-G¶Ð5AôuÎa. µÈ'ΑvÃŽ‰–½,~à Âi¤þXõmƒáh”º_?ìXq‘~é)+çfg`·,.1Ñ8—®ƒò—É ¤KÁ` )\SJoRí÷¶–È,éÞŽaÖliWs·Ž¿¼mJ¸½Ï¯¾-|ùò¥î¥_Ñ`èo?¾nÐèÿ yÕYƒ endstream endobj 8 0 obj << /Type /ObjStm /N 100 /First 831 /Length 1842 /Filter /FlateDecode >> stream xÚÍYK"G¾ó+ò8sØ$#òm,ÙµeÉ»kÍC»ëÑ0T·ÑÐUŠéñ¿ß/ªh¨ê1PHö…ÊGd¼¾È̈Ä+£œÊA‘Uä²"£8E¤“¢¬|À«hŒ²AÅŒyR9'Å *²#–yŽŠx8VìÁÈc<}t SR[EÉxÅ’Á“±QYGo•ÅRyd­b›œ²XêEª°"¯,–Ðy|#䈈ò`¡rÀúDAA_NX¾ÁŽTKФœMRò2”Õ2˜DQIæT’ùŒ/”JŒ/˜&¨f@”T%%Qóð„¥`T†)Œu*³ *CU†p¸È2›ÁÏŠ3 ZhOm:Š#2àí<Ün@ì"¦àrëà"ñ»qÊAL{Ò˜¼ø®§Ãf› À"Pä@a¹&†cÄ ””s?V9á°4 C@ܘNàìb”FPNüGÚeN@Îå,ì’ò$ì<;!FÀ‰åEBÐx—$¾" “à°‚!Ð +Ñ%¶ùè 8ƒaD¬Tñ È!’pVAà!цˆÖ@IFºD ÁÄÀú L‚ŸÂ,7"$š„`¥U„Ö'ð  È¢Ÿ‡€Ðö6À;Qè)ÂÄ‘“½z5¿ûcY¨ñ/“»b4þ¡*뢬×*`_½ßëj³škl²fàŸÅl>ù¾ú¢>%±ë5îäH§üq.+,W¹!þöÛ†ÿ xªW¯ÔøpD™Q˜ÿ²ª¦o‹Z}€ì×7jü®øR«‹z•"w¬¢ãlµÆß•enä°m‰Í§™>V¡!¿¯V³bÕ²7E…)ToâËiÅØdí¼ÄRÓÉÛÍouÃâçyù Œ¼Uã÷o~j^ÜO拺úfþy¹šßÏ_Lê—‹ùoŪz1«ê—óú¥ø©O™ÎÏéælÒ8  ZöBW{„eL:±ÕNŸ«w•¿V/~ü×{u³* õºšnîá°I=¯Jõó|Z”ëb˜6ð”÷Úb'àðÑÉI£4P‘§Ø’8÷ €hc‡m‡ÅÇqÀ•† Çhýä6ò˜Ûm?®ý´Öpk·6p«>·¡jÛøµ-Ûr±-ë¾Í'Aæ)jåtaÍr“n#(d§s¤^ähX”ìDºŒy’Xû̽ùJÙh¹bv"-úÍ6CE:ä‚7¤CÞI¤mêßDבé³ÑðæN¦Ï8$ì32Ý•dFlü§ðñÉk“b¿È8P¤ÂH¼óýäZï\ÛêQ¾’Lœkì÷\ËAÓALבé’Ñ’Û<ÊtÙêÀ¡W¦ W’é’vÈ!v2ivýxºt%™4áßÉdÜb!÷Êôæ:2/:JB·•is€Ý½"ƒ½’HÀ?mÌî?÷‚¿’L&ŸÏ‹‡–|×ëÒmêå¦V·Õê~Ro‰†žå¬î«YqȾꬸAº$«†ïŒêVÕ¿ê¶!è.ü©\דÅb磽~íçêf€ãýl~{û¸âh´³®œ­‹B«¥Û´e¤ Oš”3hW,fkñG£ì´º_NVóuU~M‰®Ýág|´³ôýZÈŸ|#žzÖ„ÿLV%È·¡±ë.ÈOÿŒ¦ÇâYñåÑJi~¥ "Û©ƒÚæâBh[ Sû3Ò@ˆˆÚ›æÍB[+EnÓ?©þù½®—ߌÇú®Üèju7^´þYŽj+½¯ž5'’ýé‘4¸L Š]€ü0€ÜÙ1²f‡²(@†GâP™r$yþ9j‰#¬)J«å´*¥P½Ý¬‹f¤,êTá4¨Âß*¦.TyTél¨,ª$oZ1kÃ{yNjúç@µœ—“ÕL šo6÷0vULMo:9†‹ÍIp@v\h7ï®Ã°óÝ÷ {vÔ–Õfº Í<°m÷q©i¶–œ/1m/09 }`c´¼3£XÎòl›¢ÎÞ7Icbß›4ö¦{þ¶æþÞ%ŽG>ÃcÌvcÌ1ëNÚqûdÑN±cT>á\=9åâ§WÓõCê‡|ì¯`Z÷YÙñ@Óœý{˜–º¦…¡¦ÅÁ¦]jŽçŽ9ÞœeŽwÇæxúëÌÉ]sâ%æìò¾½wäïž¡‡=;-÷È#“ü¼N1+­ŽÜÿ°uX}].Úmä¯-§MÂ}#iP …lVçÜÿÔô~]> stream xÚ­XKoã6¾çW¸{©¼»bŇ()è¥ûj³‡¦@s(Ш֢camÉäd÷ßwÈJ¶KÇN±ÒäpøÍðãpF|–ÀŸeb–å’å2›-6W ~¾âÔ‹A Þ“xswõÇ”ÏxŠ¤à³»å¾Š»jögôvUnÓÍc)e$¯ç±Ritû0ydº‡Ú< —Yq5ÿûîãÕû»q·T¤,Uò $/õ\€„+&•—Ð,Iâ’LÌãT‹èvóèa.Å„ÐlZhET êØÆdó‚q‘£ªßëfa¬aV³«¯Ûƈ(egʆÚ5x£)‡EQêÑöKûï+J -¶UÝo×0‘+ãgþJ¸4½{ú4­ÊÁêy´kŒ¡MýPµ¸!¬Uk¿®¦Öx˜§iTÖëòÓÚ¼¶Æ;k%ãàgíãª^XÁ8Héha ³ÚÝþ k Õ4˜ ç‡U×îîW8ḭ̈£ívp¾²ýÈ×bß×Âös(Üîñmè@8g*M½Ì÷ ìÉEt³ô;[ í¶û»á˜Ž¶éÁO€} H_FífS6ªX× úåh,„`Jä-„Òì6U½\†0+É2‘yÌÛ®F =Þ”Ò6*êëÊÄŸ1bÛÇÉÎl³ÛnÀºéSV¸¦]â â‡Î®ß•kšk s‡ Ë\›2•âÃ<— W™/åfk9€;,QAðŒ²œI=Q¿2fà!“%\G-ÇcBÍ ð7pu(ë9𷱿Ëô6Ó?4à'p O’ˆm€ÀohRP«BBoiRR[¡Ì»Q€°L‡4½'©”¤D’ú@Rš¤¤lø3 e$¤Šª_H*')4ðf4 ¥rØð£·,N’‚C“äT@Ü;¼,pzá­˜Pâ€-â$[Ô[ˆ*Z¶ëuëÂZÝÜ㜽š},iÎt¢OrEòôSr¶I` „·ë«W¯ÈÕ§¬´ s›ˆ¡èe ÌÓ£ëÖNQÐÁjm–Qj½¯.Éß¡æævÞ˜ƒµ…u¤[ÆÖ>= ·|Iañâ³},H#ÆK³°eˆr9¾-aúI²ë œË§mÔõ{û|ÚyJ´B©Cæ`ŽK Y:ƒ„üÅÃï…‚¨Šggž¤Ü!K½W ÓÕP P%ŽnÝ— ¦Jx'íÏö²Ù û£· ïRòQÖN%étˆ€»#¢ºGÿØ\?ðÏ¢ìÍS¨†Ú”_˜`ɃªI©è¦9JÁ7uU­Í˜~u”€Õc¥‚ªÕÁó y¢G ÷»Á~al*ÜöKKØÁU¹­ ÚËÝ_×YŽ ½+6e÷™ªïkº¸"àj}¥‚¦ïAIx÷@ ¤²ß–‹1£<€­µ‹ czT`³>ˆNwΉ¹­!;¨3)ɰW¯ÂËSžRÐ-ssâAŽ¥gÛÀÉèD€²r éÞò¥("SÛAY<°< („{TQ[/Ê5-n»ÐÃjà‘Úÿ¸a;r˜©ïÝþ°u Üõ´ÐŽmZçœj7àêpÒæ0¤ìŘÆýU¿µ*9ñÛÒ|<âøÝIuêruÓ7‰›o¡nB÷Ç·5¶ü¶èº‹Ð¹ !ó‚åî#ÿÎ^Àø· v ØÓTO|–®;ªýõ?0ÿ ò_ûpðY endstream endobj 180 0 obj << /Length 1691 /Filter /FlateDecode >> stream xÚíXKÛ6¾ï¯ps©œD¬(’z,ŠM›´É¡¹ì- PÅ¢×BlÉä,òï;Ãêak»‹")zXññq8CÎ|3´\Eð'Wi¼J3%2•®6‡«ˆG?^In…'ˆ7W?¼2r%#‘G¹\Ýl§"nÊÕ»à—]qìm»•Rº^‡Z›àí§uœ¶ýTÙ;˜‘*54ë÷7o®^Þ »™Ø£Õ*yÔ#ôŠMzý…»(ž‚”ˆHu€ëï®2“#S!³Øƒ¾GíuÜì,Z¨ƒMÓ¶¶;®C°¯©Ëª^Ëà–¦öUm;:‡]öÃ!¤¥‘¢§ïÞ]Oø¦æ¹?#©í¾¤ÎÝ®ÚàâÊ f•m;Ê®Â8±„K’¹0QòXSü7¦¢Z{o‘׃­©KoÃþ3 õ»‰5­·‘dÐĦ©Ñ°¾¨ên¶†ŽnÉ@óXú ì,XR>lŸ†%à—&'™³0ÉÙÂ×5Nñ&ylŠÎÒP³¥ïâ!¤É`a·³¶—K'¡´P‰šœJ$#a³åó…2ÉLtüxÑ$ø`»®¸eCªŽ¾Ç¶¢ƒ²¼}±u2ØÖbŒ¥AÓö4йú\Õ·éB –ãw®2ËE–áÉ*!AI§uFJíοtÄÐîQNîÚ»¢£Æ§µ5u­=ý©µÎ#` µ…ª-(¥2v-ÜÇï0þ›é,¸tƒ*¨›Þo‰P"M©êÒÚr¦1xÞ:”Aq s#¶“Ìt'z:àÿŽœ¼';³çìÄÎ=‰?§ÝÀâtÊë§æ'ÝbÓWŸÖ&VCÓQ©E®5¨”#95p åAsì«Æ­Í–}Í`°çއ·‹Á,…rŸ³Â0a±}ñÑŸ Ó(m !ØÔÅž'ÚÛÓÁ’û=‡!Í û}ã.¯£~ßÐíyÀ[uW• »çutÎÃ4d‡S<õä™™3Ò¹cº[ÐYXºwRêû¦qÜY§9Ýú ¶:‚vMnšÃÛîjÁ#PÓž§Y)¡ W$p‚*Í]šq3€€Ÿ&[ 'à…d{.r^  N†tÄæ=»ùHÁ Ãnðt Î]‡i¼wú§Á‘è0±<7DçZD™™rY/xÔ&œ s&@g™vŽëîMÇ1Éš^\i·ÅiÞ°Ì𙓥î¶ÁŠvh€—8Iç"㜠ºª´áÇk!^rç<ŠfÄ€ˆFþÄ ©"G7&ø£á=ÖTØqóšÖ0KN7EÏAß»äÓlW¶Ý9„ouDtÀi‡’ã½yBêX$àmÓÆ´Û÷Díœ4 š˜›…QE¡Æ4ˆ©戳˜Þ®— %pR–˜97ý Â%¤9~M Uêd\Iƒßé9±¼`PÌ_Í‹'ãn±^Zü ƒs'°ëQ,vG€ pK¢~÷—Kì„™LÄIì&.¯û%ƒ ¯ŽÍ¹&BŒ¨°—TyÅЄ*96 ij é7Æ¥ŒÒ4 Ĉ»4ñwFfŒKüMM&Ü%‹Wõz¼"·<“çª 1bD”/ {ã/ ¢FFèZQäÅQ}Ž+à £"^ñôéS†¾Ä\û!…àw[aµ‚­'qO¨‡%ÉÎ22›Gõ-UN®Ý XbðP âÆig«ÉÙŸí)yOW.`ãдvȃÀ@õ}:?_¸²©.ô­I^º{B¹ãðØÑ–mÛ–÷}é…Á¶)p  ·ë³gÏø¨ï³‰žam?Yâ>403É)Hƒµ½-°œâê%N¸HA’£š€FXá@ÖQ—™+Lz¢ÄžãaÈ?fl½!| BYú¾êz'¼¤~U€'CVJ!+a›F'|Œ…´àÚ©ìö¥ßÄWºQµ¯‘àÏÞQ\ Ñ3k{6é³”›]LL2KD§_%7-'EÂ$ñü¿ ÿßùKòñ7Fýƨ_Q_ãO%Ži¨NÔq7lÐo @k\’ãX³ÍešÃ·O6ô-Æ."H˜+Fðj£îð’ÔFËpUlÀ#‰~Ù°µßº`L×X |EàwxÞK´´q”{Á&%¶øç”éô ¤Þðcv}Š–µ§zSô\0®ªÏdzþví-}—Ÿ:ƒvvSÇzÆÔÎR¿â,§<ò'¨eöÎÌ}ÆÓâÿ2Š&µ½ÃŽýGÔøŽÝ\0L³Á?Wôn—±Ïoá¿ s«º endstream endobj 184 0 obj << /Length 1849 /Filter /FlateDecode >> stream xÚåYKoÜ6¾çW¸¹DN²ŒøÒ#È¥I“6)\ÜöШ²’¼Bw%G’íèï g$Qk­½.Š^ –š¿yp8¤åIò$V'q¢E¢ã“õîQÈÔ?I­@`åI¼>{ôâ•'2i˜Ê“³ÒWq–Ÿü¼Ùd}Ñž®´Ö~yº2ÆŸ®NUíUU\GêØ2:ýýìã·gãjVYa¾Ò u—òqÉ0  ‹Dh A{{ºR@,ÿ¾üàÉІGX ­¤,uß1;º5qäˆh6‘æ}ÏÜøÖ¼‘#â¥`vî‹•õ¾„ß33½µÊÈéº e1á0ñÕËA ܦCErOŸ>ÜTç§èÿ )é·¬¶w›¢èÕcúj‹l½)Xøz3JõíMUŸó¸eYp[Õ,qtHT""ÍP¿Û[Rò’›¬£Á®i‹IûMV‚ü|É©>ú­FUƒú¬ëÙƒìdKÙ6»å0®·lÓ©0–]ýìÙ³!±˜™WeY´Ý}‹(·Èþ^E ‹þŒ„Ñ §ÄÒhÜàm.é£+zh²)×UÞohØð æi0ûRf·=sú͈O», ÚS Ñ»l»¥áÕ©‚l{Y<‡o›/wyõ[(5±«óbÚñË0‘pÙ ,Äã\+H™4/ÊìrÛS]‚í° ~W¢X©L 5§Þ¨ÃsÕǦ¯Öh32 ‘˜”ݤͼÜmµ&NÖžÃ'ã€ewNó'T»]‘WY_loˆP6Ûmƒ"×{ª›‹¾jj"þÁ¡•;m#!!BBºú´)!ÕÌ ó½§AåpCÍf0äC(aõž»‹lÞÖ!·‰ nz¦ŒàÁà"•³MÕ‘`5ÌÜv œ}ÈZcrd•M;ãk°]m‡ÕÙµIÀ«cVâï÷ é£wÊã¼£Ãt¨^ËCƒP:vT¤@Åž£h‹$óLvÊÖyCܶørYµñ2¢í ±³¾ioès/…€B[ ¢U1·!pÜ&‘AQ¯™2À¨HÁbGåh.T¿Ï´FÏÑ„!@€âöØŽöŒÛ€z(ÈC¬¦ap¡9¼—Îh–SU-ÆÎ¦BÇæA™Mš×«esˆ õ"§Qßœž{•ë ëÒ3‡ý†ÈÍ á#U”mÀöŒäâ뺸à"CY ÄåŒÄÎ$ÑNÉC^’JÄ2Õ}9¨Îzê\ Hf°ŒY„àŸŽZªWr°û§°¾ýwÕý|„ºÙAr¨p€Í‰Õ~>"JP÷b£ƒ_6¸g*¶¡¡<"«÷ñVÿ²vÜr´í{⃛(IâÿcðŽˆÝ-­-76ÔyäQꔬ•$B§æˆýgnÇ“¶¡N€Ïš]¬èÓ!ÉÀ•Ÿ(äš „u³ÛQ%*5­HöJй´}º’V(=(±E1â¨ïÐ &)£˜äˆØµ  u €U4ÅpþC¯”˜À­[IòTá23<”dRÈX=¨â 8ds˜T*Âýãþþjy¤épJS_lyÆÝå­’Áé*æ4Ïð ·ÉPîªr'ðsnÌ‹:ïˆâ&ðL ´yѺkºôˆÃIc¯gqðkÍZÖ  i±«–@p 9uä&±s§M© »€SünÖVhº]!ÇGô]ÖCGÓÝÙb´œÂX#É›ÆZ3­lá°œ+ZŠÄŒå¹ÆS¾ä#õÉ„hź¡ycµm ·ýi›=!,yÕ]l3lÏn:¢0LtÙŽÏ.XHȆæ34ÂJùÀl<`Αf×y%À6‘ûäYnáÙÔ_\‰QÙãa,’©™C,Ùß õŸ{—¯8iÏ+º—Ö¼±a7*9+¿Ÿ©\*™‰H8ÙR’ý–Qäô+M ¡¥ÅßÛO1¯YFñ¯&{ 7Ù,uëoXHOApé¿èI`ä‹Q’aIÓwÞú–ÞèˆÇQ‘^ïöÌðØÜte÷øïlƒˆï{ss‚:ÚÓå?½" мG8'eöÝã¿Å "¤÷¼Ë9Áh ”Çqþ‰Ì‚¼—:7=‘{Pü»AD„‹Pü×;÷bóm¯† ÿåÛ’·%¸þŽÅ}ÝTõºÊÝËÝ!ëùË»D6µ;5h\Þuá‰a¿Æú΂qd™€b/¯ç÷¹XØ0ïrwk5¡™d`¼/‚¡ŽÚ߃6wkÅÁxkźµâhjíð‹<èè4<Œ·ý àžâPmsáë[˜—åy…F½È‹m1Y×”äp‡Öv–Ïî•ÎÞ—cpÉßFqGãÔ·Þ…G/yI¡#=»ÛcJÑ“FVAºÔÝÞÚ}ñµ_Zr%ñT.Ý+ôñ5ô5î˜Ê³W9Ž* dM8Vˆ:Ö%ÑY4dÃAN ÿ”ùø­.c endstream endobj 189 0 obj << /Length 1898 /Filter /FlateDecode >> stream xÚÅXëoÛF ÿž¿"ë—Êm¤éz۶k»t@óa0ìL±Ï±YòôH–büÈ#O–¥v±C€ˆwÇ#y<’?žÅqâ8‘ÇIª‚T%ÇóõQȳ×G‚)üÇ«‹£¯ßFâX„Afâøb9q±8þÕ{½Ê7if¾RÊS§3_ëÈ;¿™ÉÔ3ÍManaE¨$òD2ûýâýÑ›‹A[$£ ÒjIŽë»d„‘&»º•©Puêýz]ŽÙe$B‚Ë\õëE±\Ò!üs"¥½veL'hÖÒŠEíhZ±Šœ¬§¤uÓ:¡kiœÓç¶©«+"³™ùÀQ7Ý ÌHáåÌ[°åp"ÌßùzSòà¶èVDý ]šöSÇŒD)gÚeQ–bê2…ÄÛ˱¯£0ˆ8^¨@¿]Ë«ùcZ¤–cuòQuÉ îtJ”²Â$íIJI¬/Áa" =±ýF ÄÖh^‰¿x‚M§½¯˜GòWÃ7–‘wú­ˆ@Êk^Qb* Bµ#н0p:¾²Þð Ä.Ï@‡Ñ”°ï¶YF?öŽY hyFgÎ&N9è´>v6.ã™Ta6eÚ[f™Q=4í½s}èÌà §¤ §Îð@ÚÌòE‚(9qÊï™-åmñp™/N;rÜ<{ö 8CøãJŠW/é»,0¯zB)þ„FÉç+ÃÌ·««kî Ì`K×/3–EÅ|i` áÌÿöžFÁW˜þH¬ëÆlÅñd·Ê«Ç,>™òöÈúƒ$'=o;v†cÝždÙÔëi}`¯­îh B1bG?þœýØ)±Îš¦Ý§D=™*xÀ4Šw‹Â9øE+>—V±WÕÐ8mÅUÇÂ-GP™Mkª¹c^Òìd=©ê§ÿ‘jß·“E- R‘ŽP¥®óë™L<¼D~@œª­Hw^Þ"DäøïŽYæà?¯^of ÛˆuÞ” æ ‹co^7ñù.À!QíF@ËøR-lÄ¢å6 Nˆ¶hcQ®Fn+š¾´ÖÐLÖ}·é;¦'yQƒ!ëõ\Ht ÓhÜnÝ»E\1Bâiô“ L³=`¢… ’D 4{àd[F9¿0ŸÇñâžjq0$‚VûaZù5ÿp‡×ý‘±g[o3Îý0|?—8ØÇó)Ì„íwD~³ð|·Ïâ˜øÿÊëÅÂøTüh04‘Þ²nÖ9„DY`Á9“·wD!0â  V›TBY^ï6tÄf‰²X]ÞuÕ`&Të3f½2•iòÎ0ãíèçøE ·`RC‹\¤¬÷„2­w½Nª ÷mŸ—¶éθ£…É®é«9«ùP*Ádƒå¸e†•=1P¶2#K,M—ÔÛ#kMëX¹»EÒ{Y¶5ë,XNcÊÂé«Ù6Ð[81ý†×z0…+0 ÿê‹ÎL…èÊX,¹)Ê»Yª æƒ1Z† µ%Å×Ã’qÍË›¼éŠy_æ 0$;y‰•‚ð#2€0 ³ƒ¾5´z3‹"Ïn¤6 çàŠðł䲿G›VÁwpyÃÒ»ür"‘Û®Þ8ت‚غA=øÌ‡GÁ‘7ùž¥m@q¯Cˆ¥c‰qÂUhp[q£XyçäM —pS„}káCw"oÐØ,2%vOoQèMC^^ôsì*qêϾåÅs†(ä€AçD êy…õó…Æ€®„Æl]9 ŸbÌó i“¾9}Ú‡Uf©™1 µS*ÆèmíUp‡¨P³¢äØÄ96yÐðoA Û×m‚r¯íO ;›Sj\qfQ´›’)Ë· õÁ±ÀòîÃOD´d6Vš$æÛJÒ]}”á ÈI+ÀÆŠÈζL3Î}4ÅéùÏ”ü(HäÎKU@|Ûä“JŽ’/ÞŽR —(Èâ‚\*#A-²@6܇mX K;ä à¯±"â2vSšÎШžf**ÇÆžHƒ$J?Ó/pÄXø8É÷ G<þ> stream xÚÍWKÛF ¾ï¯Ð-2°šh^zôP -Z E‹\ô° Y¯l +K‚$g±ÿ¾äpF–leí´—"@<ÃùÄ!9üH.bøÇƒTi&Y&Ó`s¸‹ôùŽ»U€h‚øy}÷þ7ͳ<Îy°ÞNU¬Ÿ‚‡ð—½i‡¢[ERÊPþ°Š”Òáǯ+‘…E÷µ,^à„ËT‡<[}^ÿ~÷ëz¼M Í´’WLò¨ì ‹µ"»¾àmSd±­ð£Ì´h–ŠÌ#Þ!"ˆ2–ê,ˆ¸dÀ·)ÿ;Öüý‘ây®÷†OÁW\UEO±|*a+}dMýD˜¦®^I4Ðg2ì‹MãIÉAŠÏ0˜²îgŸ¨°*ë‚ÍÝËÓntKõýîmš®+úvQh0Ëzw²çÌïû뎣³]?ÐU²tšÊzÓÚªþ‹«ïÿ~N4€Â+ž&ŒgÉÜÑŸj$"šÒZºˆ¡°÷‡ gñ°…;PŠEXnÝñàp•éŽ fØÞtfCEÑT7cܾx¡´‹”L!Z·15}¸‡KMKq+œ¹.xù–Pûš\±\©91É%‘QhD¦)ˆ¸ ›ñ¨©¨Ù:ìàÀÄ´LøkF๩þ8Øà¡ÌßtÒ2ÞÔ—OΈGŒÎë¹Ô¿|‘Æ×Üà¢ðzûÁ¦ ~ÓmG¯Í! ˆÍ½õ>žû=àÑ þ×@” ý”y °™w©ª)(<”»½UJÛG =mN9Eû—}Y¹Ìƒå&,Xu~áá!„‰âá‡Ú£W|<Þ˜þ\Éî8 -SÉ¿ƒéžmKq,X¤­â,Sù-5*p×ògKjGÆùb"Ãm‡Œ˜ÏYÙ™\¢£š„Α{Ñ\Á®¯ša¬¢ˆ;{Oåcj.RÄÕE¡9 VF(®þQRÀgßp Ƭ¼uÑÇ%8gJ˜w÷vp¦ƒÞ¦ʦ~ãŽD±J™¿c{äªJŒíI½#^J›ÊI»ÝñàøEÈv*m¸ÍCSU¥Xï”6ôÛï<š”Xð÷ÖLEKä,ÎÄœ½c]Éê¸(h†"£Ž`À+Éñjüím m¦§$܉kOucë(ÎÇ.)ƒ£@g KÓÄŽ] ÚÄ4ˆ™ÔÓáËc£ xaø:W9Ÿ Ñ&M?¬?Öµæ™êˆ­ðx ¢µ‚I/üììoÍ® Œàóc¬X*ó™# ó£C]qAÇ)Ë“tî>ÆÙ¥0gêT²D¼8¤'¸åÕì]ŸzÇâæœà#K` ã#}|\ÄGpƒÌÔÜËð8ÐcÏTYƒ™Ïè 2:™?ln ÞoWÔEg“7“!¶“_*Vá˜ÒÛÞ×Ú’¦²ÍÌØþÙ“ìà‰¼TŠàõ´‡¶si»X,”b*‹®9e#ðÖ^ƒüBãZè–{ÎêÖtCI4DXÓyø0sŸ¸.’„å62“FŒ…'CÖ*Œ„hUâ¯Ì±‡§P°Ó>щm°/%&na p¶À'ýij:·µG¨³4d¡ØFÑcG©¡WºZãTŒS ^×üÅÇr0U±4~`õ1¾ÅœqÊÛþÞO±¥HÄÐx8Ar˜Xõ›ŒòØh^ÊÔ3•—¤j2n¡áé7JÑŒj—¥HÂߦIœÌ¹äšG]qá\Ù‰mxå?©…מ endstream endobj 199 0 obj << /Length 3037 /Filter /FlateDecode >> stream xÚ½iÛ¸õ{~Å|( qÄKG€~H&É®¹™¶è¨lË3BdÉÕ‘£¿¾ïñ‘:liâlv‹1I‘|÷Éáü㑸ˆbÉb]lö»úñ·#6ø£Ïo]½Òü‚, ~q»_q»½ø§w}ŸÚ¬¾ô¥”žzzé+¥½UÙ´iQäå¬s '—ÿºýåÑËÛ–ši%¿Ûu‚àÁ#&¸V+²gˆ•ºôu(½Õ%÷Tcj‚ _$,Ò–˜ÛËXzà ¯é6›¬iv]Q|Åîmªý!/²'8K¼u—[Úš–v0š¼íú~›ÿpi¯¬öZ"b¯*{Cm?ÔÙº¼Î¶ ‰w{o×áU7-MªÒ®æîx‰Ä!5\2®‰˜gooVðYIïš~6—>÷ €X†“À¨Hsî!kš5÷Ugˆ„qŠÀ•òŠ,5xàpè`Ç­Á¾W‡6¯JZü·å¹ó\ É"X@húÕœ`8g „i÷<¶0*ñ¹Î["gykq¯ºöе㭀¢a (§fB„–?œnmFÙE¤2¤3æ†Ó$äÄQ‹*Ø1K‚é¤'êÅyDÁm»ª&ûtSW -@2ĤÌî)6@¾CH, ‡@ªì1*ÎÆÈð®m²´Þ\‡î0Mi~Â?ËjÎB€2au‘¯ë´þz+i 4ÙŒHb"J$‘eqC«ó$Å+õ$­IÒ#’ð:0îm¸ZŒ‹A|¯Ïb–A¿"ìÓ­½>¥ù]þ Y—•´º£Þ´°`rÊOxspÚÚ‰a<r$Ø1šp·Íu–÷< ˜ õÄ 8ÖMÊJ&•W;7` [D…‘3—rÅ¥àÊ…‰u¯«’LˆîõS…ÞW<\udyef, wÑÏûw7«ß¬ÉîE¶ÞÁmêüøŽý"[f„$BÁ"; ìÓÙœœ „!w»º6/À]¤¯tùïV4ì‡ãšü1r§?½ý•ÈÑêv ˜Äh4â/9a¿×L×$Œ!wŸÕw4¿!Qç.DZÀ_ë€iò¶ëãG#âœÖ{˜)ý8Ö¢ŠÌ±Ö k¹Y@þ$jpÇÕrÛÌšˆbJöê_ïgM”…÷fdõòDŒœý=»¼ß4¢À¡Û…qJ&Þ3Cæ±W@B½õ.&½ã‘Ó;NÌádJue}UMk6P;þÀ1ÃøB’‡“ d_òrWÑêM^Ò®ªÞÒU n¸’%‘LbÊXâ<¡½,p[ÃÛtF`‘w¢†-$j) 5Crf øÔÜû¨-pf]d3Æ* îH‰ð‚ûÔšÿšŒ=”¹mšïÈ>pð 0άiÝbU>%á…ÁXx¾fI’L}`ͪŒ€pÑûë›"5¶ññ3þi‘9i"K¢ÀP Øà…b"Žé̇Yîò&Á­;ô,Ô¶J–h»”àêunl¨ûB”ÂAôΗr(yͺ!m‚? -‹v“ÍηHJËè‡Ò2{Ai™sÖ:øéúuáÉ,‰‘ö›ŒÍµºù1Õ€’#àÏcf¡fÑ_„™8•H¨SgàöWqM>€(ǟ͵Ù:§"`j+r@ÿßE±àú¹“›‚sÔ«;ä½u†Fæ< ­[úÌ)¼€û‚/ÛE‰Zý pä)]ʃ “Y7zB"¦˜žÃYÒ'?^Fù‡E¿„rÄøG$Š9„ᓯÏDøû¬¨+ßÝ̨*hVUÎSÕø»UU³xÊ 5è%ä ³v³šùµ)#¿ß¯ªÍåšñ`àz.ãp÷ç® ¡€LB‹«æ)9ð!kD>8r]•XÜuuêy-©·A©©Jlä‡ÁQÖ¤›°'“¦£F0 ´:£Í¶Ê¨¡œÙ›ÖÚûºÂ>Éݽ›gt •Û´v…Ëk&ùTYABrhžÎåš"y4MˆØÕ¦*w9МÍ'À—×±!5NõŽ…îÏ\!—9ÊSa^§Ÿ\ÉKY™®)ß œPað6mA:M^§å]—ÞÙO7ÝòÚªniźœ-ǨٱÕÄMs fŸñSZºt:° “@ŽZXc ›¨¦Eþ_ÿ ƒ†âR'FµMËH»š÷•«Lh^•&ׄ‘Ý{+€N^V ª›F`ͲiVÁÞÈ/òlK^Ê—¡Æ{J;LwÔ—„ó%¿Ž˜äß,&'uÈc{÷ I¸ýsnø£û±H©bŒ!oäÉ‘æVÖnQ _­Y¥ûuWž«Ï'Šé—E3«œ:aa$§yùs”€¼m¶K»‚Jª…Î׉˜pÌ4‹ö$ŽLÊ2 Fƒ¶A—ºUR eöÒ¶ùÖ P߸êšúª¨@q®Öy9‡È…Ç|"×%²Ñ‘s5sµ)äæîÄÑF”˜æÓÞAÖnLe«½˜ÎsG½1Óá16“¡Ë¶CIaÿåÈ×CßÒAÎÁø ­WÀÑš†í½;>K«£CyJì°W ÜÇ k(pÚ¹pèž.õZâûîò/s „pþ0k­‘åå笟Ñ>:O ™z¬*kl–@ Q°Z#‰rcÍažÂ˜É¡{âHüûß~~÷æåú9Ü|»t¢–Ûñ ß6ZÖ1¼2* ê8qָ͂T\ ÇræuUGB=Špf jº&£Qô½^œÌ+¢¤¢¥gØñ6¯ÏÐ ‹Ê¼)‡àGR@ ^¸Uƒ‚(}|«ñψtSYJJ°`.¸ðnMÃÏZ«õþ*bqßµŠ9ŒXÐÝD€¨P¾Ÿ‡Ù3L§ed‚ÒÆrPËjݦc3èsÂ"km¼)ró˜3J&S×^‚D”÷a‰âšç“˜¤X$F›^‚±ž*ã3£!_©`6áν$Î?€–mmœïŽ—qß²¶GòrSt65©)?Ø´¢§‰_›¾ƒ³7”ât&{2Û‰ ="#–ä*̃ž¥ð]»3;à$¬Æ%ã«S³œ‘bÎóóí›×ˆ+(Ä{Øýâ)®sî  ¬=»¹^ºWô©Í¾´.•á¡‹’x¸püV6´¶î³˜Ð³D bd<1©´?îµÿÅ»ë«ó™ EJLîw»óLÏ`ÑÆyR=ÙÀv=‹ÀÔ© ¦gßQ°Ä¬OD6;aâè–N_òðûšôÍŒélu¡\„fb‹¶Õæ!¿߃ðþú â¢Ø9t âa2€†UÓ…ÅŲjiÅ–J™Ý0~?Bü«ù7>ð/ ?/ŠMüÙ“"ç¬òŒÔû/_­~;Cs(Mž‘=`"ØÏ ª7Gñ,S™à£gï§*qz@3…dNØoMHÌ›+jÏ—E•2B¢GÑ¥#•Š’S!B‹øÏÍoªú¨ø· ü9HÄY¬’?”ÛYÏÁíñè¨þxG™O &m€À=5j¬Û£“*]5.‹•mÀ¦:ÛSÁ:)’•w\œªQ•`í§Ü´Œ˜M}y ²œ èyv4æålÙ¹3lõPW>PE1Õ“ õ!7‚8±&÷ÓAa_Ñ·1=qè"i8[1ÃòÀ"Ü\Wé·Àx^_£p¬…'…ÞR} À4e"í…$HÅòä1 ët(7LÌ2rojBÚçqøíË™ýD ð±ÏÁU]¬J“(à­[›§0HÀÄ¢[¢ñ4ãB Žˆî‡ËŽ–æ+ioZü æw¥`Z&S‹|ž™oÓå1VÇ¥´JbF}úmfôg<¨JfjmcöáBã€Âƒá&Ä—·³5 …Ö–|T0úC Ÿzbþ6[wwgÕñË:÷M î¡!ö£N×ik7˜xÇ'8].X4ú›bA½Âx¼ûñÑÓëÒŸ®Œ:T=€»ýa@8Õ"ü³¼ÿ'êÀ endstream endobj 208 0 obj << /Length 1991 /Filter /FlateDecode >> stream xÚåXKÛ6¾çWøVˆ´|I¤ ôÐô‘¶HÒÙžÚ•m­-Ä– =²Ùüú΃´%[ =(X ‡#røq¾™‘åBÀŸ\Xµ°N'NÛÅúðBxíÇÒK1Ä#‹W÷/î~LåBŠ$¹\Ü?Œ—¸ß,~¾ÛǾl—±Ö:2_/ccÒèçºë‹ý¾ª· —ÚªH‰åŸ÷¿¼øáþ´WªÒ$5ú†CÁê†W.KrcÀ¹,©aÏîw%ìžé¨9öUS£¬¢¿Ð x[ßÎD"´ é½8.ëbµ/ãM¹¶Þ~º›H¤“Áþ+Þ¥Úz)£ÎïYó“ÖØ2°ýã®ôëæp¬©ÖͰ߰X7¸ªtQù Ý¢KõŠ.£ä©¶\7ÛºúRn¤GYºp˜6,̨ž’ç϶6êʾ÷LqrЖ`ò©j›ú€2œ›'>-Ó,*Ú CtîZÄ4¾õúÇ7ß¾þ0w;&ߎ?ÜCÓ–Ìæµ§ðcl¢…o®›ú¡Úm9·I*Ài0MBÐêD§„,‘:V™üDX”gC/µIšfW„Å÷Õ—‚Þž‹F% ìޏ·óûMWE‘qòå´&i˜Ã(Á½.c!<=•i=:F*ùÀ¹J,f×ñÝŒÉmàj™Ü*UQxžyŒ£5(ŸxŒä±J!‹€'¼»Q™,XýLû$•'`â_Ÿår: \V™ç2jO\Æq™â™} Ç Dfæf&É3;…êE]>ò¯ïïÿëÌWZå외 Ï×%Ú¹+âÖûnÎÌ%VÙqÄÁº®¸må¢w(‹=+ß@€ ÅÖ{ôa8 ¦í‘e*^Q”ÂÜ9Ja°iøI჋Ö%ÑÎq•ÄçÐ2mÆEÉ­ð’-Üþçã¾ZWýþiéL„UªRE‡ù“³88;‹#ï¬EgYC•%œ6<8E Èž9ØØ4ú©Á©GŠ{ŽþÖ;p®®ðWW|»êB,^ŸFŽö’p~ŽuŸ»\gGm”_ý¹ÛµfÒàR}O/6¡%'hÉÉÕ²†Ñ‚ ²ë/I ;ÀÁš'$% Á·©!¢•›Þ&aX‘qq-|¯”G÷¶ùÝ:¶ÀÖ²ñžÛ²ãC!m4ôÛaå`¿.ºéµúsñÞ"ü1|]ÓÚDÍÏLΤ}°€pΠ`\¬13î«nWn^ò<¤ÊÏL•/Ù’jRÛ ÛÝ\Ì@dÒNû€äðà:”.Ou(>–Ïêi‰pk3qÏù𠫬ˆ|ätœÙ zÒD%p(Á£\h I¢c‰Ò<9HËð9°†ÂÄpèéÂK”JaYŠ Ô¼zW'ÞC骂+"ú¶­ú]<{ô²ÇF+½9” âY컆GX(ø+Aøháí{,WÐú´~âí{,/yT=ð3´áb°‚V"T(xÕž’ M=?WCµßÄÐZQïc„ÿZƒ™ ùL>âx/Ûšò¼…”:I–¨¡TÖ¸÷6‹”9Ãæ°÷;òi–ô~!@%^kÜò£·ðo¯Hòd .Tð"6*V¯úTp8+ÛèqöšÆizJ»ÒxZ=FPjÎC0…Õˆßw˜ ŒPÓMS$h˜¤ Ðö„ï%#dœŒT¸Ý*´B‡­ïªtøž=Â1s>Çyp"Œ­Ñ(,ð¥èàc»nJeëª )•\ˆõ¾¾4sçáF‡{¦ÅÕY’§×ùÛÃñ›º™ýʇÏ[á&݇#N<¿´™».€°Ç?(€Ó3âɨ<™CÏ4ý…üðΘr»u[{N¸+bÅ©4Ì5üF¡¢ªÍ¹ÛfÛŸÀ÷ÕÇå9ÃWõ­|mn¦kð›éúßfkïÁuh¬ö)Ì$ È bàÔ”¨!b 0M–ëm`ÇŒ Õ;ÖoJ4,z*ˆ7)Ë˽à PgY¢„¡ß»h;àt -õåÏp#»ùŸá‚Aðû#8µŒ3ç+Gæqè >}‡V£ý\´YLÂn '3}é«JóD8=qøúº`uÃßËÅü'´Ò.çÜC;};4)»8‰ý SŸQ^q¦ìà»E?wð)#R}û&Îv|2uyÞ€õп¾»ƒÿɶ’¦ÝÞÁó˜pw°ÂUìÄ€½ÕµS€/; ¬‹>”H¬Ì·ž(P¤ðÍŽ¢‚?V<à°@é8#€±Îþ#ô‚í /—$ßw=¹Å.sE8^ý‚, –ì-ü‚Õ üR©ƒ:¹KH œ„ ÙIŽqßĈÙÐRc‹wê¨ýÀÚ„>_#ØNó—4äo¯Šý˜ endstream endobj 213 0 obj << /Length 2715 /Filter /FlateDecode >> stream xÚíÛnÛÊñ=_a ¡€‡{á-@rœ¤ñAⱓ^|”–VŠÔ!);òñÙY^½²d4hÖ0h.g‡³³³s§Ø‘ì(âGQ,¼XDGóõß@¿>afä‚;ÀøõüÉ/¯vÄ|/ñvt¾’8_]8Ç«tÓ¨jæ !œàùÌ•2pNŠküW~ÍŠ+š`älgÌY/²ß}&f.}Àælöåü·'¯Î;>x{˜m±îp <²Èã,-Ç<ô||BŽƒ™„Â9FŠ™`À&ükÙŒn[3ŠÀ?ró¤0ôÎþ~úþÃÙÉ™AåCTxI ¬";0£ñ ¤½\ÎÇ]ýpÝ•Ê7?Ük]«ªÎÊ ×ôa“DK­²²­:´­záÖæ½xø^{`ú“×Ö-±Ø“R¶H_.Ü—6R<öB¶X/_½=yg¥&/äá€ZºŸÚù›Ÿ_¼ÝOí⹃£ :þ?¾8ýË+)žxq’´h?%Åö³e%€äã%¾“RЉë â€f€šI­fÂc 5´{·²Š’ãðQ”wDyár¸^[)‚E¢E=ýôî »øÓ~M>”Ô¸Ná:iÄÅX<=ðùþ?þôñãé‹wÖs’‘çǃUû7pÌŽ­ÂåÒcàw{ZÍ¿I‹ h] Xvz_›ŸÈW±“Vô`Zê§ÉÞhLBˆ ŒÆ´ “ 0‡rü7 -Ìj“Ò÷pô0OÑ廉>œæ+¸>Áu ×g¸Þ_X÷ÁèÙ!–:r"ÀuÖ ”( ¦fúý>I é‰P<|Wß÷Jê@ñ=À?~Ö™ZˆòŸª(k¸ÞÀµ´f$!ºˆž¥9Ã0ò¿ãjÏa­_áÊ÷çQ^œ¿9È‚Êý6/­±Íßa_Ÿ¼…높é!·fœÜ‡=ËIúz³RUë‚IÖÉúøA X¨‚‚Ç}ÜM‹…_˜åо\ž§Y™A‘®UCé”ËÉ\ƒÕÉ –$% Ý—9¡Ã¬ÎËõÆÐ•À,Ô v~ABIäC½eõQ§·Ïl¤BóÄš)%0d{ÄèJÈr’p¢½£œhJ4îºIQF·¸yæ,¡ÖЃo¾³ÁòÍ)ë¬Ét¡§h6Ó¥_£®”A¿ž¡“æ[3OTü 9æTiq¥hŠŽê>Rõ3(Õ|ßɳ¯ÝÒ¾óOkšÇC*1×¶om=}†ô;=Æ=Ñ£ 7°ÒŸw‡ót¼s+Yº¬¼À¤GþI î"—…P»¼@ÙAaQ½«º¡‡yZ+Qàñ¤ó#mÍhÓªì7•9«šÈã™F¾S¯ÊÊ,ˆ%.÷¿( ¸.ï`¦óf›æù-M<t†×Ì•L€ AU׈¤uT/k€fa»Æÿ—Z9UõŒ„Ä„€`²Ÿãr£µ»Ê®VšwÔ)&·Ù\ P°ÄFáÑÌœ¾wÿ:‹øPVýŠ1Á|p  °°}mžfkÝš[ÔåÚÐÌ ÐýuÚh¾5q[nzÖ. 7H¿µAýjC‹Ñ„®á±14îËm–7HKDZ  VóR3ã]*Àx–>c½_d蠟¬'Kv^j§Ö:€ bÂþŠ$ýD¯ª±/íHŒ<5Ö Õ´)+ƒ˜VWÛµj<ÞØ¤"¾YesDZÑkË2ÏK"=\W©œÑX)7xlµ–o蜷`Ü{®óþ&Õvgö|‡Æ@"Zñ·y·y—œ>\¯Zhå Ф´še•šë­ÏÞUªU,äZñ®í é|®6ZãðI1¼Xd¸!\#l/d(ñˆ”¬4ˆ#kÐ<-:ò•Zj…‡aS+ÃKÝqE§ñåÖ¼ZR.mê dÖÔ=„õp µ˜P‡,ºòaâeuõ£îÀ3"=T X@簾)½¸kËn0üg…gk ºô¡{ùá÷ÎOÞŸžÙøð1½ò¢Ä´Qí± "W·™Ú0뺵CCý¯ÿlKôðá}.ØwñØîÃS²š t/ÀÅy5Ï–hn y:YÔª¡Vq@"!oó†ˆØ%Ý·µy+­ y¡òlõˆpyKx“gMC Ùá‚Y±Ùš%ó¬P† =¥M}PåT¾@Ì„ëÐC6 ™ÝB-ÓmÞÐ m%á´Ìû¦[IŒUÁ\½IuL>ð†Î'ÉÑàP7ÈÆ,°¶sçdiM—!g±ÜsNø½3Î '›Jáξ©EÛ =ÉÙÈÜdÑg{ÂAÕeEÏw&ÑÄJÝêv;•å‡S…#.ˆ.é hpÕå—â5¨Óz¤Óƒ—Ë"½¥‡eYM(µJƒ“U¹žÌv ’¦T‘d#áÅÓΪyCôáÔ¼8DÁÖjÚä8¿5&y¡¶|.ù¡–ÿ²³üÞf°üQÓín¢ãBOðqŠ4¶}Ħz 9Bt²Ž€rÀ«Ú •Ô‡‰ƒÔL áÆèqj`ô8cVŠ[£G.!>uv¯Ÿ:K·zc÷ôvzÒDi¼Ï1ò ìa™¹wv/Ù=µÝã`b÷Q¼Ãîy{KöŸ’UIF¦ËØLŸ³‰Ó~´ýŸnûÿÓO;ÓO/ë2ß6ÊmÊ\Aý1WVÀ$óþ÷?ïD~Þ §1¶“’ñ‚O)HÆnPû:PŒ¦´´—ôMùŒ~Öÿ;áO-[vÝrt@}~ËÖ¦„Õ€öÈ鉾G«JÁÑÄ(ZÖ©=Âd[C€þ¤f•¶Ü›2J'õ0õ²ª²¹Qø2±+ƒâ17-¶3þ«´Z ª73òò0Ù³JU²vNXc´N_»žAÛ!Š)ÍBðwU•Æ›J®½)-b?ƒÀc´ß$ø¨dèRqÁa©Å!»ÚRa ¾U$Ë'–è/Yät†® Yµ h³°*só^é–F7ÚÍáˆ*eéð±—0¡•µY +ê›2ð<ë Öl2À6|`Òô ¥ô&FJâ0ÕV ñĶ*~1Œö7+ß d¼¯ç >‚ «eßG 5íNÛ|à«´û-ŠÁ$'8º¨£òžrU\5+t¸AÔ%À¦ d^£æÔI¡? ¹m€Ô¨ \´:C€‰” FVÚÓü¦t@—²‚þ³A~kVâ;Ô¢F(ÅÉ<Á:×Eií³5™@‚7‹f^V]X„ Ùý¨Û->ØwËüÐc1ßÿ!2ßþ«™}ŒïŒ“Ï­"ü%”ŽÕìÐX]u±ºRy Ñÿ1Vÿ'c5ëÈ߬…ïEÁcuÔKŒ‚uä·Á:¢` sæí爈Mväß Ø€eºY&`ëž}Úî`Ø…CÀÝ€ ¥„'+ñúÿ-^³Ç€ý €ý¯ã5ÆkÞ7Ôð¨v}aâ0懓ôï¸,êl¡›ŒM¿X±¡çNsõ³ñ™S_àêm‹BÎGÙ’îæK¡îî`ó©«EÛŠÂÁ8!d‹,²…ùÌA_t ŽTßæJ™£îš»£KsÚ®JkDægÝÿ\]Tø endstream endobj 216 0 obj << /Length 1997 /Filter /FlateDecode >> stream xÚÍYmÛ¸þž_a ê*V$õzÀ}¸I±EoQ¤´@¯@‰¶…“%C’›ì¿ï ‡¢H­\{w{m æË3|æ]Ë7!üã›TlÒL²L¦›òø.4«?¿ãfAàPüîñÝo?Æ|ÃC–‡9ß<îÜ+«Íß¶ïÅiTý] ¥ÜÆßÝQoïÛ;‘mÿ‰ÿu?×ížva1ÝžïøöXÕ?…\Þ" Zˆ»¿?þá݇G+G,bGòаÕ ‹„…qDÿ¹‘p‰$ %ܪ ‚¿!ƒ`×õÇsS|oŽdÞ½ óéÌÃç Ç›g ð˜ˆ~$› â,OâMÀ%ã@®·>  ã|;ÌY#€Àž궪ËbTM¿àæ“a{L£¸¦WD“‚…"›ˆÆŽn-»ãé<.eéUSŒµÖ§YQ}ßõ» ’4ÝÞïVÅH2Æ“üEbÔ]R0NÐ&5TDrÖHÉÔHƒ²)†¡.iâÀÒ¥q|I:1ž]NrO6àÀ W‹”+Ë)X!¤hltfηC]©ÝC?–' ¶Ü7 }¯Œ%øRœl‹æ¬š×àFíÚ»’ˆ%3žïÿø¯¾,fkÈ sëPOæ(cLÇ8pÌ3–r~ GÎdî‰Ü1²@âšy°X‰[¸ûCÉá&dÈD(|à\tµ/ÓÅ2ò‘„zF.8 îâ(.à(éá(=~ÌÈ ræ"y!€dâÖ ô+”ªz_ÃzLƒÅùwA)Z%™0!Ôõ´?«L5•V ‚§ó4¹îAihC¹Iê¦|L¢š!ÒÐ~·£_z*AQðÍ— õ¾ÅD•E["ˆ‘‘‡è¡ c­•‚d§^•õPw-=>IY–I߂оG5B`Ñ4qÊ’—êìOVg§n¨Áœ(o·S½jK°¿5Ý@ìÎxºPN.˜ˆR_¾û}ÛõÚ520¯†¾šr+Æhb;é¶:ZŒôø«Sôù.RÒ"©šj j@“àFstPàVÕLÝLWŠÑ2IÔÐ)¾  i'j¥_.=¶ïÕp¢` \ܪÁ‘ 9O·7ŒZGûp<]jÂ~çSz½*¬*[µ/~!U¦Â¨T#Í:Ä%­Ã”“aÁÇÂLë~ XÒfºˆì'9ö½*¨®Ó­§37;(×t§=MÓQ¡“"°¢ÅÉKŠ“·*îÞ*®Ö0e1¨5}åÊç”8Õj!Ä/¿±Ú‡cøpöjñÍD?æë¡n uÕYdšÀ-šéÀ²`ÑD˜aÖjÃ~µ¹–öÕå¹GzZÍX8ÏUÐûÏŸ>=üðã‡5t¢Ø/ÀI&¡ÖðlY' òKIƒ³Hˆ[&9ÔôÜËxíôšµÅQ¯ ¬û ߉rDãûŠ êh,i°âÑ}Ýñ>Ü`ûlMf! ÆÉø-Bæ!¨!ò1¡ü£ ZD:ÛQQHD(Ö7ÌZ8ÿ IGñºŽ¹[5óïV`;ù]_¬áßÕk…`™Íäâò¥ñâR "üׇœº{2;ó@G_03ú‚çumcÖv“höÌìÿ$8•Çqò¬°È¶Ë‘þæ€QÍ…<èX4¼ëv\õÎ…‹õ{þ~µJÐk¤|á=t>qìW\>Žn23‘¦/J&Øô ÌgP:ÊŽÏ+]#>­šà\±¬¢™Éä2™v‹¥a§µ­£½ë2¯Q£zàan°à!žy€ÃÚ à°jØgÐÔ¾…nÖh{äÚ°0£»´ƒµzéô&ì÷û}ßOA£ÚýxX=LX*æBŸ?\]Ü’!<Ì#a,6Âð@õþo¢dOºN?@qã¨u€ª ¡™~“ÒÑ .ëfBÇ*%õØMxÆê#¢X÷¼*uÖ~C°9ÍBs0¯]ýí‚`œç7Ùþ35„, ù­¡æ§0»ÓÝQÑÀ˜S(@wïu%g ðoÊÞÀç£;©q—Òù’@sêÑVKv?gK¹€¢‹¨ßlý­E,èìžõ¿ ö«Öï=ÞÖK\MÇa!}þ㩲ªo§®Uí1e„Ð¹Žª0Î^…j.YÌo¤1m‰šS_´%Ùè½%#¾ ½znRŽÅ¾n‹þ)8·õ¥¢#cÜ©G_Tt¤PÊŠ›Ñ{EÕa`°…W,±5_dôß‚÷¯Žq–͹RßÛÊÙo‡rÏŸë?ýððûÕ*_@k’/›¡$bY*—ÍP£Êq¥»›_Ý£_k~ EaŒ,P3n”<Ù~LÓÊнjõŸDNüß"77+ìߥ~QÔ>̨ à)c Uø ~÷mЈD´H¡o"Ë IÔŽç‰ÌT¬¸µøb„{¦ŠšÝLßú§¼ü€ ÆÛ*šY‡ÄCá#j=£Nß1]FßuªVŠ¥ºœšÆoø¶ñynÐÎÇãÓêÇ=\Ú“2¿l¸6µ…Ï '{ñ½.°¦¼×Ç=`ÓÜ6t 1Ó½#þ8_…ÛÓw¾ÕN`«q•8DtÌœpó¨õ ]¡®éÌ_\ÿm}Ö endstream endobj 221 0 obj << /Length 2260 /Filter /FlateDecode >> stream xÚÕYëoäDÿ¾Å|;GŠÛm»m$>,·ËÁIphÉÝIH8㞌…ƒ›KþzªºªýÉf EÊô£úõ«wYì|ø;ìT"½DªÝ¾zåóèϯ·\ pgŸß¼úä‹Hì„ï¥~*v7‡ù7ùî{çïÇìÔëöÊ•R:ѧWnFÎWõU8ïñ_ósQßÑ, *g¸N•?øB^¹Aâu ¯~¼ùç«·7ã=¢ ò¢P>qYKõŒ±çG!Ýø'< ˆ‚9‘ô| »÷öš.캷m¡L¿Ø46M»âoH²scOÊtç é  63ß §S«»7NV–Øœ †²;ÍÃû¦Þë¶f „Ó5‘NºÕ0Ï´yÑíÒ  S9õjm׷þZ»°9Lx[Ÿ/J÷ìq·{Ã0$ 88,a­yX¤¼ÈO%ê¹ þgñ½no›NoÁ¨OÆr£PžJåÇ/®é4(f*vô{@·ÔÝ7éÄW+E¯„ß²¨Íáy,öø°#us@‚õÊïhЃɬçå:ë¸ÙÔ°€wGPt™SçÔFÌ™.«i«£Ù7ËiÕxBßYwlês؃´tš€´O‚fv:¡ò8:cÅ#ûòœŸû¦:e,-òã¹û¯‘» °÷}¡ï¿ÿŒ%óEI *Ùeßüûë­áè0 -Ñ[‚y*P+9‰RO„ñRNÞÝ©ÌðÝ ¡FàhC‘k¸MÚÑ¥¦Ñ\Yt½ÑHì Xá¯ÁéøâŒE”NcVŽëg2H{×–x²! h3ô(]1œR—Ô2¬6#štòõ¹°Ãœ•hâA¦a÷Vvo»ã-ÈÈ{œïË«o&¾/ìüx£–ð[5«·0O,¶„†H­u×è-€EuNãtyeP‚®E šæòaà;ŨW„N±ÏJïÊU~à|e u4œ@*/MĹ.ÄKž£9/øÔGÝ6t,>GìLÝô4ѱ"î ó¨üšD3P¾'–(4C2 ú)™ëð)ÜÒ§é}SUÝQ‡h‰1÷†R]x¯H…LO¹ô^h 9¯¹Öt"ÈAWôZ:šÜw…°ßòPè„ÜxZŠOë·îç`-ƒ…¸_¾e2Ýr†ŠÏw$Tü y•4†3çAIÖ øJÇõ]fðHŸð?vò†)PJp±Û{äxSUàWLŸ¤œXbµ2hF9ÐÒæsˆÝ i2Æ›á /}òé“’LHæ3ùc'äñmSŒ²øPÏñËè9~ Ý_Óc\·+J]÷[—¢·³XKxÑRˆæ¡–´¡ÖÌ%v=`™µ '³äÅð»ñ°o¾bßm]~éùò2ôR-ý:ç›uM¥éê³É©7ü{œ~Ç'=Nao9´nqp롳 &ö3ñé–w÷ *3úåw¯¿ùÇÛ-‚ÔKÒ5‚Ñ3u©÷(Í‘e\Žî{Exëé¶ë§N©-EÆ£ÇlŠ˜y®¡_Ö\îÀ³)D‚N>ÃZœÕ=Ôä¡ZpCM]<ƒ@‘7œÞ ]l½×°K ;qŒ×£pòDêõÈÆ9»CöËÌr¶:È–?†ÓÁŸËéÀFUQÄ逃®Åt§!SÊ'ÒR[‚ŒwZ2ÚÌ5ô;2Út,£±ƒŒn"¯g§Ìk¥Ú¿.£ÿ·dôP#€>ìãÃ%­Ž¥—NLüm^'k^ËÔ“ªojulóÓ˜hc¹£ºŽÆ~¯ I¿cÒïØ²[Çl¬7ع†~'H¡³z>S0p:é},&½Ïsefù–d¯\ÊÂŶàÏe[! %>ИT4ôÉ/¦­ŠZÒR[‚¬§%#¯ [Ì\C3£Šâ௠…Õ[¤`Fmðgrù£¹6YüŒW!óJ9{#ù`dàå,«F–UE]TYùQåŽ7VÇGœIØ”–MÊq l„€ÐSàš¨·;•6ŒëtO“T’ÕwEø¹|9ÅD'­s·ÌÚ;í ®4œÅu ‰±\ÇF*òü8zY× •­•àÉËRÑØhºÊêY(Ýí³¾×cuÄ@5⢎;ªÆ¼\D#<½îzÄÎÜ.›?†Ø:~NÝ$úຉŠAÕ“…ª¿Ä µž Z¬Dlr©Ä Ä ÍóSíP¦p5®ƒÄâCÙw¼ï6+ì^z^ÓÐ,ð€U¶xÔ«=mÙÒÓ-Åg^C*ñ…T ]¬ÔÓùP.SÁ4äz¶LÉ~íŒÉô°q^[5%€H’ñ/çmТÄ? g‰tf).ô8ŃK‰¿«f‘xêuJ.ª2!;‘DœïÙìŸjNÙ®²>Õd»©šÞ‹ÍÛ’ðbö/Ôˆôiôg÷›@IÂy6 Ç(6„l¢ôbQćTÕ?èØ JÙTâ¥ñ2ã\Õ‚‹5\S@ #)ˆ°… ã®`Û–ì 9êZ^P|$àý-™ ÷ix –&hmVdÁõŸ¼˜¬ŽžÞÏOWvùbmà%æñf4úÿ'xºÛg·›~#<ˆÏWF-D/ÙóÖlƒ%*ˆäp/hdk`¤;eôQEðǘy"LÉÖšBÌK/ä†p›#ONfNpð:Ÿýˆ$â?ò+ág¡ÃP. pþ˜€’Kš>0#¸F‹ô§)8Ýä@æP%ÉT×ß.Àxa4óÓ´uK¹°­7©›{xƦðZa‹#Ò“Qò¡âóù3u¡ÑÖW»Žø,;…».“ÓüÚÔj[a#Un,¨³ˆBBÔÁ¹zN€lœØf ¸@5Ô¹Õ 7Íã'ÿ-ê¼yœàx‰*•#÷™ù®Ø¹}s!ÐðçI÷¯o¾ÜÌBOœ©œò½Ø_U¹ßé¼h)ÙCADCen€ñÓ*ÓmÛð»+S¶Žý$*CÛT¶lð°¬­ `øÝ+/ v[~Ö²_“°Í endstream endobj 226 0 obj << /Length 2707 /Filter /FlateDecode >> stream xÚ­koÛ8ò{E°_jã*H‘z,°rÝô.‡6)Z·ÀÞ«Ø´­«-¹z$Í¿¿ÎPGNÜÃ!@L ‡ó çIŠ‹þÄE,/â$ô“0¾Xî_ ýúJðÈo€ñ·Å«¿¾ÓâB~¤âb±’X¬.~Ÿ½Ýf‡ÆTs/ Ùþyî)¥g×Å\&³{üW~Í‹ Í0žµs1Û¯ò"œ{2 [ªù‹¾ºZtrh©}­Â„uXgH,#?Њ$þ¹’"…~U‹à•oH`Ï+ÛæÐ6¿ðŠdLÖ£nÍÇËÅ?kÄ\*_€ŒõQ.<%ü4Òž}èvê“Yå•Y6Ä™øâXÍÖlY¹§ºY•-#5%ÿn MæÅ*_fYöXí ±Ô±ÃÄO¢äÜmØvÛ°5»Ã”vZû"9Ö.ð#!ÇÊ}Þ–h $æô‰ÅlƒÁö¦®³!†Y±"è¡r¨+7@¥`\F©MÓ€…Õÿ»š÷š÷¦ªó²˜Òt|Ú¬©ˆý8 ŸSÕºSu>ÌÚ=þ¿Cû‡Ifÿµ+8óXå›-žû5¯›*¿k›ŽÎbž„°v_íØÍ­÷¯y¢fYUe–WƒN÷È*…C•&6ë×ëK\ó÷›Ûϋ뷟§6B(?U –G±Ê‹-Ÿ›ùž7ÎL³¦eÙrþl¤ë‘Õ†$áƒØä´m- 3f"9ºM žÐ|ä ©Ø'Ì·6C;{CŸžp¾¡©5ü0 gnˬf¹J&jÍ®²NXù“9Ü“ å­¼z7BÌì†~yǵ z7_>\}º~KìÞáôí§—xh §°Ö%‡T²’²Ù}º¹Ü@aTæç3Ïìm[U¦XònÙž·ë—)wIÀDTêŒÿ§Ÿ¦xxŒäÉÔïYæ{Ø}Ëã@Šäl•ÌÍNýé“C£Õ‹mÙÖ`جlm@Ǭ¡}é—¾™Zz3ö°áy*0¡M‡ÙÔ.hò1gK\³%h3f¾©Êö@CfŽØò®¾7ÙªKw¬p7lÏìù¦QšŒPB¤p”Ûó¿LF_?–ñqH‚œˆÓÃÝIU˜Mö’@ÞÔž~Dê;átö¹2KôþœÍwV¼0ýQ÷´Ííσó*™P[»ïÝÊecŽ“Þ>ÛÀ pùG‚´E~Ä4ý¢ßºð}ûáŠ]ýöñýåÍ¥uÜëÛ›ƒ¡s| • –c¸®±"J§9Š|ê.}™d!|¥;;x aLÅ'È4¡èP½«ÿ¹>MÞ$§{´ŠÛdtRé0ô•êÌÖûv†”LC:’%Ã@þns®ðÂDÃ'°¦;HKÅ*«xu‰µ(ÕY6ÝrÍ$’Ôâqz?Tå¦Êöœd–˲r®Õ›i]îÙH«vglÊ8m)R+¶Oîfê(ú!C!jP5l6Pði+ÕÈ ¡¶‰·rÕî÷èˆz¶/çJ/3ÅI!Ü"¶N$X÷3£œY ôéŽÆØþ!Æ]ùX´Ð¬×SÌ”„¥C\MÃ, &ÐàPuÉÅiK¶ïØ› Šãm(?Ggëj È‹¦¢Ó7(¹²IH° ‰ÄZ.[ÜoDyØšÂÜ#wÌA!K\NÙ+c`5»UMsM[·¥¾•àŒF@üˆmiÀu¨ŒÍvIx,9‚¨$<ØÕë¢hÙ¦"qq5 Lô±®l2œ¯Í²,V=îŽáÛ¬¦AF?÷s­gÙ®åé‡mÞåÙ¤¯çê“| à@¡FC=IMBSÑ@\;2ÍWuCó$/-F÷i¯ÐÜJ¹EÖ-$t$†œ)×€¶ ë¶üê’xÃ1ìlbCXnÁ¶ ±»ϺŽP‘¦gùôÆQ:á;È}‡[R쉎ƒ×Oì÷GEûÊ;îN]!0 •¯d·zRS4¹õ%Ÿ‡‰¥á0†© ‡ÄÌž)ñì™ÆÂ×±>ïHµêËb÷HÔm»œÛp× ô´sã8@ARqÔÝCLÄ@X á“cNCm-mgæ",ú®> ÅbPÑ)µe„W1fæ˜$­#3Á"H¢;ì’ȳ¶¸ rÃH§jæÔ:Ø6ãÇí”3‘kO|væ²^J âOã<‡™df’n'ÁÛÌ÷¼¦¦.¡Ý„_¨Ï*S»†Ä•jÉ [Àu€‰ nI·o0D½Ñ›ÁL¯×z´ÛÒÒß3$T… V•EÑ±Ê ºéøîN™©=¶[š6D$åB'{j©” ˆÓlíE»ÙºoCh]HàdH•R@1×åï·3;a‹å‚¸0;ýÄ‹Söâ¡H¼Î÷‡Ý#E%J?ŠnÕÀbêÜfoö^+ùÚFR±!ûrºN×~ÊÉ{7š°Ö ¿ÖÀÇ4IZy|C%»[Œ_RÓÁ”ÅÞ¹ÛËip¼-&Ü"£ÄJVú|jM{;ÁéÔšþ`Ç„©UϤVÝw§wUnPMõ|—¡R?êó1:¢ 8­¦.­Ê€Òj|:­FqtfZíóï°RfäßÀk˜d¼Áã–b7çY8”¬§Ázx1t‰Áíc7?Éã«@º3¬»?ç‹”îÆÕjYÑÝÕì²"믕ÝJ÷Äð@áÜ^ˆ ®Vñ¦ñ…¾6Œµ58 I}Nß¾ì §3¯ÐÞlÈÁpâÓ.Ë}|ûÖæ¦¡¶‡KùIÛãaƒ«#jp-s|ðÖëŠ:<ûôë×¢hÊúbîq‘× ÇE8§ð›)ÂaC†ÇGLÔ'bp"i[Ìmƒô¸¥ôJ3ÕIP)ŠwSÏz²VPkªaS„r´µY·;’«E„uù?¨¸ÅikúY×àÃ\SÒÌ×Â=¹ ŠJ8•lY¶‡«^®iʹ¿ä¤¾Åx·ln—P¯Ð‚¢á/ˆ-ò°v« Àò%ö&,3tm»%q‡…öD4EùÇ; cüdŠô>™ ²7CczeÁY÷Êb©®é—Ž8 ÜMÕ]?…§¯ŸtwAäÝž}ý”-ñªYG ‡yá*ñƒþ}­¼7Õ}n쉪—ú.Õ»×Ü¿`X#Ú;¨ìëœ|i*þ$¾ £3ï tÇéè®)£Ÿ:_È›ø„çᘠ•á¾j\ã%l·8Q½»Ž ÜuÃheêe•³­æÐk³løÍrø‚.ÃÀ‰ÂÚº|@÷e€à‡zøŒîP½wâýˆ ]–3o+HèKü~˯žt‚a÷ùùÛBà통Oÿ•~ ã¡èOßþÒóB‘r‘< BNR Y?Ý.úœ\ÿ šFˆ endstream endobj 231 0 obj << /Length 1576 /Filter /FlateDecode >> stream xÚ­X[oÛ6~ϯðš‡É@Ìñ*‰ÅRì‚h1lÀàuÛ€)–l µ%O’›ößŴ#˜"y¾s¿ÈlFáÃfŸE± ±ˆf«ý u»n˜[-àÂbpã§åÍwo›1J4Õl¶\!–éì¯àçmrh²j¾Bêå|!¥ Þsñ_ù!/6ö6£à8gÁ>Íÿ¦LÌ<¦p›«ù?Ëw7¯—Š+¢¤xFØöÖ‰yH¨’Vâ¤Ú÷™‘°Á”’µÕ@ÅÁ¿( ðBLX¬€©¡_üæîŒ¸0F$ppw¾µh{£qÝØ§|¿ÏÒ$«¬v¢Vn³([á[ ü—¥dv¡Árë&/ ”x¶ˆ5 …ž-˜ ¤7’z„Š êª¡º’«¤À еAfwu–Úí¦ÜdÍÖ˜öófkW‰Qû³½Tö7œìv½¶Ç¿»èÁíìÓ*;4v½.+{ǯˆÐ½Zë ^D·HéÇcœÄ’upÿ}]¸?&ýY¸íõ×@ë…{?%LÄIE‰bÂ…œË¿ÂAòÐÏ rš÷©ö0ApˆøˆóàÏ-T9uà•^jÅúÊTFaóÚ¢æ…}†¨¾Ãb§ý|”&JEÜ9ŠŽ³p`>G×ús*ÜûÉVp¾SçRŒè+ç`±ªënв2E ]úv}!P★Wåߨ“‡ ‹*ÄLÛ p³tî…"d#X„‚„”‹æªÜï)SÁ./2»Ô7xrõ1“”H]Š˜£L£pÅdÎâkÛ ¡eÌwç)âàM^@ù6áa—ÃAáNÀ½¨&Uc+Lg¥¹&äHØß' $51´L-%DD ‡`F ®U§®ýE1&*äÊÎÐgˆÖTùf“¡ Ì“ÍM ”CJHT(-åǬz˜+0Qm´=ʹâà#ÓN;¦&î9±Ž]î:£Ã‰”DºÃ(pLY{ƒ] "úÈ=Tôhf˜–ÂØ¥»{}bÜ”Oás o¥$ÊwJc ©€Áš{ŠçŒ FÆR(îá1ÁW5_F´=|ûÆT&Mí³ ë‚Öö(N¯Ô˜ˆ«tæ“už¦§ÅMËÍ•¡é¹tY5¹yCÏúÞåÞµ;»² ¡ï(°ëoò †±èií3÷¡Ê›fëlÜ2ñƇ‹×óÝÎbtm$ ¼G»ß ÍáØ¼ô†5—1‰u8îb‹'ÝÞb „`ëïïï­žöžæþþUKãAO¨n_2çß!Ï‹Œz’1KÑöøÇ‡ºÜñç|ʪ ‹!.GáÛþe vgwÏv „ÐY*F`vvŸlá ù‹6ïôO~¹‚œÐuV8›…cÓ‹ÎŽü©é'pë©:¾§ùùš_ëÒHÇ©¾Øüò4æ¯.Î=Ê $Ï–»±;ZÊÛWâ©;.ó cnùjî ÿ‹ysÕ´_Øñ{ïÜÁ S¬^¸ãÚ~ÃS™_ ñ¡Ù&Ž*ût€¢š¥ßøDšflublo[;)Lêļϵ‰ÎÐ|€aL†¼/ñèÑq‚z¼·³ºhgövÆŸÿùZW endstream endobj 235 0 obj << /Length 2966 /Filter /FlateDecode >> stream xÚÕkoä¶ñûý ã¾tÝ»UŇD) ôÒ¸~hÔ}¡)yEÛêiWI{>÷×w†3¤+Ý­KÓ€—’ÃápÞ”¸ŠáO\ye2eÊ\íö/b†¾{!¸µ… ÛÑŒ77/~õm"®Dåq.®nîÆ(nÊ«¿o¾~(޽m¯·J©MòÅõVëdóöp-³Í{ü×¼«÷4 @³9]‹Í¾¬¾…ºÞÊ,†Ù2½þÇÍï^|sèHd%Z}‚X?ëœb9¦XÄq”Ýi'šˆ~õêÕõVÄI¼ù¶ªí5bÚ¼,‹¾/©SVww¶í¨s×6{nMgË—HøœC[Ô$)ü¦‘’´áß®3µiNć=òåÔõØÓ›]ÑZ‚÷Eï[–›#°«¯šCGýxÃé“4’BSÜ^ÛÛ%ª„ˆt’ø9¿ }ŠCù¼Ê5Ú?¯¢Õ3´U]Þ[¸c³ñ‡ BaÛ¶*K{ éÕÝÇgQ¦*~¼˜ŠŠyVÔ]CÎö.¿‚^„ïHкÇõLnŠ}srŒ×wÇð²¬ð2ŠšúÕá®i÷‚pl+ZgKÜbï‰Ú‹Ç“:‰â8}.“qóŽ~û¶z_uýäiÕJNö°#Ô„†Þ±9’T9nHÄÚI®H˜$Ò€”ÔNÁ±éÖc㑨ÐOKÇÊ žâÃi µt4­¢8 ·{D“Òlíf;îšý±h«Îénir”8r, Ž´­ËÎ÷’R§:t}¼¡Þò•$Y$µ WR\p%¯‘–dE‚e$^lÛ ´óèäEèÜ5k ·’)¾f[Vü(Vaƒß_F/ê×½FÜüî2n~]Ðýés ¨ûæóöíç=ì_/@Ò.ØÈ GLçÄÈkÞê$%½Âƃ-Jçê°31`¸]Uq¡D”¦é%:&. Ly|°LBÅ¿ß ¥Ù-N7Ó¶o\¿´/©¿+x Ùt×:²Ñ(ÚÙÁº§=O.¨©—ΰ9˜©åûòË_~õÕÒAd¥*œ8‚mT^ÃYb¡iÃŒíRSãÅŠŒ¼Œ[ÛYb®áuEýˆ„ÎN3¬¦“ï r%8«§_2áаix‡‚—VžÑ7ô»·È7%X ñaJLÊ@RÏžN<¶›(Þ_ñþCÔ‚¦º…ÃÒ½4‡2€h—k€"±a%Öv'6=1p¡Üq'Ûî«8^ÀL÷¤&öK˜Hd! :ØGwÂ…Uy”™à~v¸ÝCÑ;ØÀG ZFB˜…HA¦1»Qh'ù²'&2Y°Û?^äÞ3ÄáÅ[DyB +‹¶dNýñÔÓHs·ÊHåù%š*£\Ó_а]_u}µÃ°wi-_mËÛ>B0½©z¸Ð‡1©Ð¸kêÚ…}|UläQ'S•ER_ai<‰'¢\'“ˆdÉ,2SFé`¬‰,Þ8Å; ‚‹h2á„w4Á¶ÕŽÓx#‹\Ƕ¹o‹=­(x¸l<ŽGï¬ö~<¤õUO„dèßsz÷Ι½þî´Û¡.ˆMW‘]tœ‹§,ƒí:'äNk¥1³Ø!l¾]›#)b?èd+~'‘ÌÕN{œQ n—Q¬â•y”fù¡ÅÔŸÍP‡ƒ,_*Ìp—êŽì\ ‚fá£?„c$’BG¸û”¿§ÖØY.AÝÖÖöýu’lŠ&P~ëE¨àü‡]Ûâ•DK‚½eyEÑÍ{®h«Ølꢽ·.›ŒÁÞvM}êyò, |±‰Î'„e Ä™o, F‡¤2œ FÆgë哱!?Ã-xƒ±8Ói`sÐ~–vÇ:¢]l^ÿlÓc¶i3ß^¬ÓÌ:K‰uÐp¬Óu©cq¬Óžuƒ<èsžÁÚ¾¹·€™÷z¬€u÷»ÿ¶K`ÑÅŽî]4â'a fÓ yìÊËYŠÖ?ìm¶gp¢Tˆ _!(nᎱº±Ø1¾þî’öP™\;›ŸíDàgZOWC1o¿Ÿ…ÓŸ8,Ýt”ïj*\ÿÇç £Ëfü¿yJ ¯l‹OëÉU¡Š÷3‘7¨Ù{ˆiÎ4b™v¯SØó‹<âÒì­Èu„88ó´Òˆ¹eÅY0|×@¢!âhä-èÔá„pѯPg…q<eàâÖ³ºšãƒ »k/î©°Ä\VE3C2lD;ìu Eä•Ð,ƒLϨ ê*³BH¶^¹ wŸÛ.¬oûx«õí\?»² h[f+gªXÍ·eDe‡Ïóqu˜RÉXD¹Sq˜–Œ• !ûjQ(I]°ú¼”rĆüºµûQMž“q/=¨Ügä>ÍÅqÃ#ó¼!‚ÁõÁ¬Q/ ´Å³˜jö Mé4 $f§ÉHÀÓtyãTCœ<·ª«ÖªÄx‡©znU÷RtòsP§ŸUt%>’ƬñK~±yVþÆhqÞõ„»÷·ö‰W“Eê² #äo&YyEÀÂŽã40¼ M•ríi!=÷<é†\J}²Z™lþи’Œñ¾æ‰:”—:r\€h©ËÂûzM_£/|JɃ•ÜŠ »¸óp”fõ áÙ„ IÍÌZ¬ü"ƒúÜ^ØŠ‚ÇÞxj6þmÛ†:8Ç™:k•ƒƒíemITâm»ÄF%d•O“Ø!c†-¬¶9 Ú-š¹—0×s3."hx|ÂÞðÖë÷Ìüžþ†üÎÄSÇ{pƱ:缆¬»n0ÈÀ–‡0Ûõ$û׳!C¡»Î`Ã~ØYGâ ŸmûÂUèÝD?4uù%ï¼¢Z) WŒóQ»«!¿?.d°TªÁ´÷ÀD•!„y箄ñ[ƒVâ±ó£¼ð‡µzgžŠg™zBGbjœ¦9ö—É#)êú—ðÜY~ÇpÂg‚>Kkn‹ØG"x%-’I)×`å$& éúŽzT§‰] ~:ˆ6]1=ŽÏ* V鵯Èð\û¡·‡Òùî8mFgl…©ÓûÜù‡î-®æé-¯e s±fQî}™¿ágÿÜû¯H(%#ƒzf(Â3VÉUh< aÀ'pRUF{7ƒ:ä0d†¡ñÕ§8Bu6‡´Š’Ì+5 Ù÷âd×› ˜>µ´“,Ž7~A4¼¢*ã}4î¹puðpVVêN!K‡eƒ¡ÂÅ´&™˜%·%š¥_C;G…aÞcÕÙEW¥á:Q¸ª­Ÿº £Úi–C­ò9¿aÈ&©ü\z“0ø&ñš˜~:Ô¶ãÑÎrqAC*IÙy¶û@'ØÅþXó6ËAPª'æå» }Oî”d­L"ež[1í{¶A,NÈ[ü~aÁÔ.ÊîéPíçÆ`²2üŽ‹UäïÁ%·Ø±uôÊ¿î ŸÓ,”}C»¥8›N qUPoÖ·G2õ0âÞRFêDúc6ÿBz^3¶Ž5¸('¨Ò½וÓIn\É„ë'2Öÿ°ãáȼŽ/§Žž–›÷9 uÖò–”.Á¦#:âKbµsš'ù%XzÅe¬õâãÎ'?ËØ‡§îÀ,íX£2@ÐmWŸ.*¸ÿMY¨öôà_É ~723À¿Áx̃ÀˆnQDÒ½*Çq¿W{ˆˆb˜fàìв[±p™oŸd|2Ò¼Z|¾%õŸ\bá׌P1Bˆfyyú–ʧÕÂß2BÍu”á#'®ñ˜îá@x5A©—.)žD¿óZ´¦ûBßìâØq†‹ÞÕWÓA=þ”o,<òbá 娱¿Qjß ŽŒsÈàÔŠä |ÿ¢8š1Ëêm» Bb&C(‹n¥ŒD¸‘(Ö³öã•z‚YúQÿ»Ë¹. endstream endobj 239 0 obj << /Length 2217 /Filter /FlateDecode >> stream xÚ½YYoãÈ~Ÿ_aì<¬„1;ìƒMÒˆäZ`ó ð[6ÈÒRË"–"µ$53òãSÕÕM‘TÓ²=I<À¨T}ÕÝ_—øM ÿøM*nÒL²L¦7›Ã‡ØqùÀÁ„h4ã~óCÂoxÌò8ç7»ñÛ›¿¯þ¸/޽iב”r•Ü­#¥’ÕõZd«Ïø_óKY?Ñ(0ÓÕiÍW‡mùSÌå:Y ³EºþÇÃ_>üùa# K”¼"¬Ÿu)±˜K,4‹å$itš¬$C ´@J(Gæ,Îäq¼‚ü8p%|QØg±‰$Š bD\2²;ÿÉí¬˜ßN1)Üv\3®=Í<¥€=ß[áÞs»ãQš)™ÑQýÞÔdU P«æÔѺ½ûº›ŒËÕ¦9Ö_5LÚÒ¤ŸÝQƒq ¦‘ Ž´GÕ'ð×Îí´0f 1EýüÏMSuÇ/Y"¤‹‚ñ4÷|OËÊ.$ XT³”ƒ—EÎ’,§%Ÿ>}Uâ$^ýPV¦[c,¬¾›Èò1‹z~´5D˜_OE’b”eSÛ? EÏWûòioºž¾ìÝ»!ŠpƒönÁÜ–@»ops!Rê1U¾àýj÷£ØF™jK_vms°¡vœÇq‘y»N]Ð-…@MÔÈ öÜÚÖ{57MÛ¢ùêh%nê-æ4&8.¯ˆiœeNS/3PA™ÈᜇD¯6†È±ŸO¥-9Ö‚È®·Æ8)±ö<£=–L'C0þ;tjÂR‘ú”Ó¸iDŠe¡UÊdúò¾HJá§ÜÅé²ëÒ Nb¦‚â …æMÒXåp»[È.]dŠREU¹8H8„ŸÆ½NÓ–ª[ÈWú! ZSo0®0ù1Às³<À5Cý:54‚aVù Zs(Êz²YÕЊÙ6{æ}Sméëçue :¹Q¨kÌjÄË•š&þ_qÙº§”Fº["÷` [$}Ñ…<Å¢k톪-œgWª­ü¦r›ŽË-sĺTÚ;¹ïȉìLª|êÄÁp­9Z»6mŒ¯‹:ÍþBWæÇÒ]šï0* ~{OEBÿµkîïç×{ºœ¥…´î÷C…¶¿m›–Èóq±ÿ3¿%îßLUôåçÅU÷ì"KŽço±†4sk¨ÉŠåƒ)†Ì-Á_g Åâw™b²jÑc©/œîªé ŠÊKE¥x¿¦ÙÙé€5eÌC8嘂9oZdèÊ´TxÀ—+PÅ᤮„ †Ë|I¢x„Ä·×ySemƒ|Y\UU*0;“¯¿)1#—ÄóͤfyúâV9PWîFÁ´~½8p5J½x5ò·c †ÛÝuƒ2š«· 5€þoìÛ­3µ€C®¨6¦m&,v¡?Á¡ßнpçÈ]Y˜m2›ÔŠ<†ÈüŠ R«± ž²·°ùº±xròªºÀ2¹%’®ý1ôðXAΓÍN³o‘0|ÁóÊÎïæð á”(ƒóiÖÿˆðA)À»ˆÖOôÅ"§ÂB2|!»»ß=‘„@ttÅ›Mi1üÖOª²v{QÅV ²m€9]EÊÖ®Ü73&UfçdÜSÅŠÂê¯B? 5-â9äEcm†— ˆMJ$[»[«"‚¸|ÚÛ}E01ÀÍu¦lºã#Ô|-ÇÊØ·©XjÅ,Õ|TÃÜuó;%¡ÕHfãW%ˆÐ™¾£C!ÇéÁóÉ…I Rø 0eööÄã©ê» δ+×™/ìÀqÜQ<ÀȬ™ºfŒŒ:EE«G±’aÀ—¾Vá óÈætteŠd¡A t² s;âÄ™¤K ´:9 ÐÙ46>´r¢ý=¥©²ë÷ô…*¬È_:Wðž‘)†ƒ¤p¯÷xÈ© Ï“¦—¿_þX¶—™–>'€:ÕdNLü-±œr˜mÛ6ðéá@aeT{Å'Šõ̰—;|þË´Ž*wîÓ·/ܦuã8ÎÐÆb¾ZÙ”½ 'økm$é.ÑÚáûKEÃ8`Ô`{{ïUúfµj g°”gïo•JßðÆ\‡ B¬88–5ÒJ†ö¿6ŸtB[ °Hp€î±^jlQÖç_µ˜dFÌ’;é…~—º®8Ï5Ü„|öó¶쎕…‹ÏÝ —;À‰è~«R禽»oÂ=/@Ý)S)ŸÂï;=¾Á—=<ÜâËÎø{ûüÓé¹:½P“ K_Ð5ëÖ½C_ñ.}'«>ÅKú¾®Ç'–]/^»b0‡`âÿkŠW»^\qýU]\/ü¯ÅÿTØû endstream endobj 243 0 obj << /Length 1909 /Filter /FlateDecode >> stream xÚÅÙnã6ð=_ì>¬Œ¬TR$uM¶èÛ‡(òÖ-ZÙ¦cbu’rõë;Ã!eÉ‘w‘Ý$@4$‡Ã¹8ÃÏüòó4>O3e"=_UgÌÍ~>ã !aüt}öÝÅÏ9‹r–óóë͘ÄõúüÏàçm±ëu»…º\„Rªàc½ˆ³àÿ4ŸM}C«0™· Tkó‰q±ãŒvœ-þºþõì—ë«HIñ ³ë)Çñ˜cÎ’HÅ)pžDLIbûÇe×”·½^ •@·mÓxEŸ8bÃã÷4û‡.‹Þܶ낡XÀf”Âé!UÚÓËȡ¼} úIª‚·—ñ"ä  ï¯Ü9b²ßquõƒÛÑžfžS…˜¨‚Ÿ¨ >ÝõTO™NÅ:|VÖôPÖp´ï äš^¼”éO°ü œ˜ÒQ{Sõãß+પ;þ†&×f³ÑmGƒMÛTšß¿ÁÃ4„Ö(á“HŠŒÎïL½Bò ßZ  Õݶ)×4·P*(JŒÑEŠ–ŠÝ®4º£ÙºÁÐ~O+M]>td9Äy;Z5Õ®h)úÃ"¾ÔåÚQ0µçÄ´ë÷‹`ÓܶýÖ }Óo »¨£õœ7tæD°Ã|4éMƒø–PLY½Ù`‡°S€Üœã¸kêîi¢§xГ[5צ›XëMq[öî€Z[VT`"A‚LEð¯n›hNž”" mî¼Åˆ€‰³°9µ§å¾¡•Ž„Ö+³y¤•‚jPÛ]·eéöíå@¬¢ìZØ ^pÊÊ€3{{áÈÔî@½jêµ;ʶ©^‡[šDÎRoP@œ'(UŠR=Mw«Â:D¬úšžÌ·Ä-ßvΛR¯j ¶³æ¶ð?î&LÓ¿„ô/œG¸˜».œGR 8ïˆ\Õ´îÞTºCÓe*¸¦““`…¾ÞT•UN9^Œ¯o+¼ÞT/ð•xÉ.E˜Œ'LÆ ‚¹&‚qKdZD8D I #!Rš„ZžÄŠ9Ùc¦¢DÈ‘ðP–M{kzî=‚M‡á%HÜ%°h M#ß9Ÿb{ NexÉà*vvT[ÈŠé9™ˆ¹$ï)â ¨ÑÜYæ| ËÇ¡¦[ö®Šð$6€3J“ûZ: }Q‘YÎ'GLC¬4› Fv” rz=žzÿ„=ô3)ƒß²Ÿ½ü ˆ¯±á@”€À¢&ÉVƒCÂ좯=³£EýP¬z¬í¶jµ;¿í/ç\x”JòÿQ¿òg²;ŸÏîü¹ìÎ_¦°ã¯QØÅÏè$>uÛNâ©x¾i›Ã¿YŸóªmÿ*uÿ–ýüµê~[óW®ƒ]ðú}Ùé–"2&Fgâ^’F,I}^¼œMž\E™â#ï\åQžŠPz¡ÖñV,—­¾3&†Ž¦ óÌÕ ªˆLí¹ ç“} †HNá7ÞóÎrÇz,Lª1ƒ\b³:zþ‚éKCÒÉd™-Q2øØ“ Æ 4Tväsag–`gª r¨¡¸œø¾MÚJÛNÐõõÃøèŒ«ã³ 4Ÿ½qäë´lZ§ÅQ‡*¨šÓ 9³/$çt2ÁxGÇQǑ͗‡1¬4?¤™¥YÏšDù@â-S3_¦R]Òvý¡fh¼jZ;•×k§.¯Û¢„ڬܓñí”5}ÑöXŒ[ûðœE<9¨ÛèÂÆ9•Hĵs …qƲC…OË#†m,räSð bô´%´äA0Áq)‡‚Ýv<9Éâ™°€¶]KN~KC S{$ëľÕÁ±.Á™;žö¨E‚ÑT`Ë"€ ­úqŒ¬SXŒ£ l6QñlK³†êµcŠ›¨åˆG°d¢8$ëQ ¼¤ÞŒd`•è r§KêNáFF1;xH°=jÎF=* :Q˜ÙWì MØÚÜ8ÔžVø×ú­Ã(6öYÙR¢þ!Ÿt 9·ávõ£ˆ¦ÛÂ=D§ö´èqÃò\T*u}ã*óË(—ÎŒ®F56Ä/‡ ° 6æ úø ¤Ü£€’Á°½u«éFy3`k“Ž[X1¶dWؽ=˜Ê¾›W4AÅýz>S›ŠÔˆàý\˜pCÙ>Îø.tÆsàVær@„èêz3) *ˆ³—EÙ$dòãª}þÁ©‘­px¿Õnaô.$GÍᬻK4@­ MHCó¨¥;¸|t„˜m¹w`j²ÉYî ZÏÓŸy‹˜EzsHÓ=‹8°†OýCDšîÛM‡iRŽ¢Z¾ f«4 >,2Aé Y«v¥½±Ù‘ä!’$Jòdô´aï9ס¼¡º”a2gbüo e)²¯‚ú‹ƒ×5íýpðb{\–GÞÄ`aô`74ôeXrBq/…J¸{OWø@ [³*Jš:þZ@Ô6$†·D•ÞaàÊüÓ!‡š" endstream endobj 249 0 obj << /Length 2270 /Filter /FlateDecode >> stream xÚµkܶñ»ÅþP-zbùÒ˨ $i¸ƒC[ Zy{«zWºJZ_®¿¾3œ¡^§Í]6ö°†äóà¼8«6þ©M¦7YnDn²ÍîôFòì§7Š¡â Æ··oþð}¢6JŠBjs»Ÿq{·ù1úîP>ô®ÝÆÆ˜(y·­M¢õVçÑgü¯ùTÕ÷´ “YtÞªètWýS*³u.[ÛŸnÿúæ/·‰NDbÍ Ì¬Wp¬S!Ki»ïÀÐÆ;ÞÑ ÙÓו;dQŽUíڷ͉ þàÆým׃#/碬™ƒ®úy•³Öu¨®ÈíúÊëÕŸæL#P#¨&VF(Зv×´Ãæ¦¾£Ë(Ò @,U‘1§0Õ¹]ãY˜„Û856ú~›Û¨iè @-»æôP¶U×ÔÝ©?‡æÈÇ~Þ& ÷ñÌ«UÇl¹}?ƒ¤8×t#e}ïîPM:Ó¹ñ[q¢ªé ôûjw>–-­»ÿžË#-õ }ÿçÚ†7ïysOßCÙÑBÝðÌGÒ»ãÓÝÏÇjWõ¨~w®ÝX@¹=N‘×­ýiN4зծ_»(RTª¢ò)”}ÕÔ8!é†q†SEÂ,(2 Š„¡W$|ÏÛŸ´£ªi.õ? Éñd6RXbê@ì!,«èßÈ'¸“žº“É”0Iì{¶ã0ÒÌç”üq~‡6ŸfÑã¡Ú¡VDêT~‘ëÖÈÄ&×"Wz®¤ú ±c¿_#iÈtHV÷uÓ:Š;·tÆ §a‰¬£uö„q‹!ÝÃèIE| Ù8Úa8âè:áïnY@4¦SaMN¼ÜÜ•YÕ-È MáTÖOÿÚ5Çó©î̚ę)ùݪ•ѬsÎÑ7`ŽJÊèÃ6V2‘‘ fR$óTŒ'ÇuœUhð0ÃÀÅjÍš¿…““ 2A ¡…æ#´P)ƒVH;°afµ‘Ðk$¾ã“? 4Œ0|†:WY 4а³¦˜Ñ0+açÏAŠ¿1;pi…Ñ|,hÖKäa ÓKví%ßMA4}ò=¤²‚Ùt}¼/ë•dòϪ}©LŠ4ËÖ,L½ÂÂ8uÕåiÈ>í!eç³"úûÁÕAŸ ýŸØD(£æ7ºo.¸Äk&¤â(‡Ð:¸'}µ×ÑÁ˜>ü·£o]öç³z¯5ŒÆÑ‰W D8\9‚¢×Ê3Q¤jf©Ãf“;ƒKY §wh/pF£—:•ûìc±?"J^ˆñPv/p@Üâ¾öÞ—rà‘óå^O úfÔf±%¤$°~y ]òŠÔ’LõïENäûg>þޤ0SäsC»sÝ®­;\DÙ`Î@ú\®x=âŒßwƒn@ïnY¼ê,:5Dh£}ñ* ƒ ©sZÂÜx‚¼RÂ.ôBüøW—¥«1^hè;-‘ìXkv?ݰwJKlM•öPÞ{KM#k—2+Y"0ÙFæêBÁ°â ÚŠ´ËøjO¡©Ž> ÷€í‘QÊ4¸P:q¡t¬Ÿ­dÍÀäXÙãˆj`„hýBÔÔÊúçÅoˆPàž ªs‘ØÝ/X+D€Š,.ÖÚ™«SÈ•X“T-F\9I0íK,g†¼³eË»'UŒž+þTÎ /‡l|9ÈdZ3ͨñ¹C"xÎÖJÿâ!ÿó3³£ùEÜ⨳© 0èYFp`a”LÛìB&M3aÒëM ø« ªá*Þ#†Td405p yµc»P…Ð˨æËü\òUx€ ñp9¿'à».{Qüõ›Bñƒht Ó¬Áyx(ÇãN0®ð,y+rÕýVˆƒ -Ò’ID¦æe祾Tžq”ÉC4ÊÖ;Q0Ϻ¶\ˆ¸ðŠV©kC.Öf§ág¨¾‰»Ó‰£V~!2š\$y¾b÷àp ›, &ðFÿì÷1¾ùã’&¤HÞ™8åfÄÌJ<Þ‹²Ašc¯ »NÕñH/^Bø7%6¢&½#N{Gyþ,|²ðCÍ“ZôÃ[î’+ÈauaG‡Å÷êìØõ ï‹8ðÙ¾%}È(¢¦ Bëf‘A¨“ùõ>‡'“ÏÍd™ñ?8%_ EYªgŽ@2tpœÈW\òÄó¢Xó<ƒ•2Ù²®’d“žb íL ‚-ϲªyôè#ÄS`Ùg:R øGa>Ð:£í§ µ ñÓ‚‡ÙtéaŸœÉg2kÎ4ñ|šþ *.&µÚ„Af½½xñ·Vã¾}«|ÿ3‰Þ"ó¾£ôÇ÷ï·øF¤^ÚaxÇû÷â‚ö$¾ß95Âo>v dïϵ-8Zà)áÏÅê†fpÇLòµ»è²§ÄW˜NŸ‰ §¼$iöLRj6.…U¯•VMøÖWIkžK{™ïQØ‹mÑé¶|)î´z…¼úªÛíú½¼$ïëì\_¶sýÒŽgvŽãëì\e;×—í›×/IúÌιã}­°ök˜ù/ð=·ó/ö‚™ËÕ_ÊÌÕ¯±ssÙÎ×~F˜nxfæø£Å•o¾²›ËvŽ? „&àÿqËëŸ endstream endobj 255 0 obj << /Length 876 /Filter /FlateDecode >> stream xÚÍXßo›0~Ï_Ú‡¥x>ÿÀ-“¶i•ºÇ)“¶i£ iPT„´ê?“ ”5íR©¹³}ö}ß]ïì‚EÔX’ZÒcØcÒšÇ#RŽÞŽ ”µÀ©¬ø8½½`Á>ñÁš-«[ÌÖwôiÜåaf;Œ1$&¶Ã¹@W‰M=t¯¥·QrcfÕ D[P¼ˆ~`¶C=¢V3bÿœ}}žíýT`ÁY³»UMiÕc {ÊoÁÓççêpæJÎ'Òv@(i:}oë-ó1a¾vÉXRi9À0( Ó×›t½ÍC³6̲43â´´Vçî>¡C/Ìè×päÑ}§`R±bÅáNõôn¿ßMŸöØ™’ºÏU3ï®S±;/­{>oÍjLºð:Ÿvp|ŽrÂû,Ø!óØà5&à¨ÈC“‰§ÝLPÉݵ‘è…UK¦Ÿ2Ñ}̤Ø[‰ApÛ3½7´™~lxë‰ÎŸ!ÑUEb„šÓÇã±r—‚.£u¹ÛY$¿æÊ«8ÙÀ™\DËe˜mŒ²ÌÒ¸”Ú­Ø™>ñ°†«º«*¢ VVÄEª«1 ÕÆTJ”¤¹6«TWñ£å«°âR2¥<ÌÂd^ެ£M^Ô|­¤ËËy+Fù]zW«×Tºª¬ Ú³dk̦…8þæˆ`1aŽkk4†w{Ô’£ºŽ¶ñ"Õ¿jåÁop-«e5¶®”;’Iô° r-¹èQ÷¶tk”­EÌÍÂhcfòÔèéuD‰‘ jô¤Z¨ VkubõÂ=±Å¥ ­2ÕÃ\QX`d‚c—ý…/hRÝJ!ªˆâðBÛÆ˜ì%#dÑͪdH«û¼ÐЦK·‚Î0•¼Ü7ŽêVð„–íÐN¸#Ë ñöÀ«•€Àl`¬o@Í L޲ðNç:J³Ü Üe‘ÉŒpaޏÖÚ£™ÌW:Cë`“©Â G»é(Y„jƒz  Kå‘ÉØ!tW;¡»‘B{µ…îF ޽SÀi:iÓéöÎÒ‹µ£³ÀóÜ¡à5îP´;ô´Ï¢zŠéËR18ô´'ô½X;BÿLxék„žu‡¾÷5Ñ=Ãìèûäi¯Ï/÷rzÕ‡œäåtäà þ·—Ó§Ä?¼$à…Ÿú&mž ï endstream endobj 259 0 obj << /Length 1577 /Filter /FlateDecode >> stream xÚÅX[oÛ6~ϯ0Ú‡ÊHĉ7]‚e@7¬@÷0 CÞ¶aSdº&¢‹'Ém³_¿CR¶9qÒts€ˆ"Ïý|¤x]DðG [$)')OEu¹ÙÛ3êF!„ß_Ÿ}óNÒHetq½>q½Züü°É·½j—!ç<—ËP¼¯—, >šÍ­®?à*L&ÁnIƒj¥(_†,€šÓå×?ýx=Ø!™$RðGŒõT÷-f‡Ó(")Ø“H 4úüü|ÒHFÁ;]ª¥‘¼ªòúîÏ¢)wUÝÑW8¹Òëµj;|Y·MåFó\ü•qd1ðô‡4!’;ýy½‚È,ØmñÙ7æ™ýFáÄÖ'h:Ýë¦îp®Y;bOAª\¹å5DÖZh^þr–Œ"Á"I„H!zÖŠ‘és–'‚™#ƒ’‹F×…^)§õ“î7#³ÀêZ ž5†rN¤¤^z½«L° å"”ƒfÈ,<)ÐXŠ0GED^ò06/bäÅõÃ)6磔ðxÐü† RšÅDÐdœ©këTJƒfk2aÆlÞŸ8‚Ør/ŒÑ Š'ÉEîÄæ[“õ$4È[\­šÖYÐëÊ(ÑêBESU*˜-u­À3ÍÌFt::ïÇÚsÔ©‹¾»€™Œï…•y×cHÒ˜¤‚ŽÓЩ¾·[šÅ"ÐyJä56÷fði£ ³ß7øZå=œ˜% Þ¯‘íΞ;$)Äü-¾æ½ ¸V8n•ÛmïÔ­ñ9è/Lì|0ÌÄl®¸$ærŠ= „™`fá0Sââ8ÄÅì—PG8\tŸ»ÙÅW†¸8q?™{§1q\OO:%ñ{ÊNòtäâ1o€\¼ÈÅ €jP±¯Zƒ²SkÐáî-XtæÚ¬¾ôs÷6#sµÅ‘½O u3¬I˜À¬ôù­©jÇÑyi­ê6Méø?.eäåÎéZ›èYnwÍ7c¨f¶y«»Æ‰2·|åö…¯5 žƺٵ¶4…;ø¨šÆr ’ 1É;]çey·Ly`j¢˜ÚV°É|!IeöÔŠ¤éŸ6–¦bÞ¶è<…êʶNz$°u<]iÔyÀužgsæÝ”c¥Öù®ìýì ó ¹.V›söÕ6Û$#LNö)T©¥¶…(Tw¶oOö©³) …ëÖ®R­.rG{о0"¬[v`Hï½¶!ø½š|غæ ÛIªUuáf´ÓUn§W°²šù"„ttúCm$S‰§.p~W—ªó4M¥°Äk ´®Ý…=Gm‘lês^mKG=߇‘’¤tœ_NCŽÑØ>$n[û¶Føó R/|zk‡¬ÎˆŒˆTÎôi¦²·§œ#„ bëäëÞõXx6Êx\ÆbEò}Eé±È â6hÛ£ÊÑŽã®ÇboìIàôí:µÂößÄwe“k¦ì)hGzŸìq‰S,ÃÔa+âi :Çã»:Ö’="í»ú{çeäÝÐua4Aµll5sÇjç%lýÒ-¾µøQZ:߀n²'Ì öW”€‡̫υ²Öéø(TÛçºvšü¡`TºÎNj:;fÙn5àéðU…ÝJ^àßËß3uÞ~€XúcOD‰ÿE)lª²llø;¿¤pp´§È6V{ÒÆ2âzdÆq¼í¼öv¢Õ#ô ¢É)y¸ ‹÷JîÄ~Á Y•\éÒø‰›ÂHµ›ÂˆÝäC»^ùVü¿lÐQ endstream endobj 263 0 obj << /Length 2582 /Filter /FlateDecode >> stream xÚíÙŽÜÆñ]_±€ÌEvZ싇  1¢Éƒ±@â¡f8;„8ä„äX–‘OUWñTÏr´Š`ò ›ÕWÝGÞ„ðOÞÄê&N´Ht|³=¾úî…äÑl&+þøðâåwVÞÈP¤a*oöÓ#v7ÿ þtÈN]ÞÜn´Ö}u»1Æoª[•?âõ»¢z¤YÆÁùVÇ]ñC(õíF%!¬Öêö_}ñ燫¬°F¯ Û¯ºc‰Ð¸Íby“•€—Lƒ}Ý[˜‡ÁÃ!oó ‡I5 ëð{¯(ʹÖ÷Ì™¹š™ûŠöGátÿFƒ mªÈþÙ‰Z±!°BkG|6Ú&Á==BvÚˆD)¼¶-ÃU»NFM¿`3J %ÕŠÉàAöu€9ùÎYyçå‚AtsßxsÞT{/©ˆFý!´aQ9?YtNF‘„–ŸYBm$¯ s`X¯d¬Îâ}'B‡úS%A«#/ó¬í†àƒýÇŽL#òsÞÔ¸ž„B?OUªPññú%=È`ú,:RÂŒ qkð:)â0]=e°‚;/*"Š?õ˜ÄõóÊ9†Eêi£M!úÈUmüsÍnCa´YÕçéAh·*RàÔ\pëôZaÔU‘ÅÂl¨L¸¦™Ka¢‡½Â–&wOl ¾hK‘ˆM´Â™¬„ï˜XDrXñ„+%’èW¡Å£&É @Ê•;§ìÕcélϘèàÛ$±Â×ÚŸÆšDÈ0^µè™—ýÜ{%„G“®…Ç5jCa%zãTH¾›ûGF§uØgóZ;°7gxÍ` ­py0ÌQ?Ê€hW«°}ÈÃ èø‚sSñ 5·»ƒ!tÈd̘Ðd*… ,p©’]¡ìº§-wôV©K*$9vŒ4®òÔaT+¤ÀMWU™ñ<†’&ØÕ¤f¨Ž1—nßâI‡¬zÌi|°ƒp5ÿ™^ê K-œž/W¬*0Q7»¼q¹¿Û°_LCYrwº#0%ûm8-áµj(aºpnßXÐ|\JrèþK=šå¤ h<Ùyr“²K‡Á6k0ýÞU$CØ.ßgç²#0×—¬f8í胙¹š!$ošš¯=fïxB|lUÓª6¯Ú³vAÖN—"N;=q£DP³“]ì1X°Ð ¨Ú.#9Ã#—¹ÁžžÄ`Œì¨HÂgF6;žÊÙ:C¥†ÄtYQ‘”Ç-e¹Øô¦ü§¾ªuýí².»Cù"¿ R#Ÿ„·õ™šá²=¶ˆ®2&†R½áêÝÓ™º6ÎIäu“wÅ–›ª›a!›W¢pቊRs×ÕêZv ||F2ã Éººùp›˜¾æzSÍÝSè4ËG™ó3PÜR êQ»² U¾Ç5±°ö­iºoj 1 Ž ƒc£d„œ@ ƒé^ØÉ§/‚NLAg†Õ“êoYuÓ =éU2ø6m@%œ«OWW2Š-A½;RG!ѽà¦ûzuÅ1©+ÈŦ›;øD?†/ç6_ì¯O;`ìmóBLr‘ÍwÛ|vló-âÙ´/W?æèŽ0„‚±‚NÈà@/uÁ¬0¡|<<Éê(âJšÇ@âŒ@.Œ`L wMú÷óØ™ÅËI¬%ÛÍ,à/8µˆ$xZ;âëQsV2^ÊlpÆ]ˆƒQKðm~™›G½zbÇ$'ÁWÔ«ÙêA¯•oh‚ti¶vh¬õ/¥OÓ‘ûíØÁ‚ñØÁÒQ0tÄÀ2?KWq£Û°að72~ØvjòmÑÂ,v&y÷{Îzì…Ö³I'i8¨¤«r½Ù=“®È·tè€þ¢å õ>p"V«}"½èÙÑQsÒbE’,;œÛ-¤Ãg†Icºí[Ógˆ[ÞæRÓ~-%óé%ý[géù’ë=¾õ^“’€Ž?GG½¾Š¥ø‹õœ/Wå/}‡¤ÂÄÉ—éÈù=züjñÿ°È^|üIË89rÏѯ"±#ˆ)%öÐ:„T%Nüô…ôFϽ%êÊP2ùâç> stream xÚíXmoÓ0þÞ_uHÔÅÜ‹;EĤñõ QhÊ¢õMi:iÿ'NFú¶Jc£`KÍÙ½óÝã»VV¦ik»2æ"çq)Ò¦x"’emñÂùXdiY#ùrShÅÞ#U…‚iØjåö‚ÕaÊ©œÙh8ÒÊ?»°*+½ê×ÙY3Àíýþë:Ÿ%"¯JaÓn_Ñz)X@´£€¶À¤6ÌXÄû€R¨9&ÚœýzOàà÷$ƪÓ0¹ „Ú“Û0­ ´™:*¡tRÙF*%ìC*ÛH%À±@£¾X@\÷6Ч¤¾ü:qŒ3_å‹Uî˜m^1ÝF^Ô°“éY1݆š„Á QDuÓ'̆$X«‡‘þ_ʆv"ÐF2²>i6<µ‹ V·|«M,ˆX\ÈÕƒi[48J—‹É°¸Þm!DÅ‚Àü¿>“²ÎFç.uöwœ '“»À°¾ã”HH’{NÚgVv„$" uì;ËÿØ õTTYvôeWüðh¸Ò endstream endobj 272 0 obj << /Length 2712 /Filter /FlateDecode >> stream xÚÕZYÛÈ~÷¯ÖáÀ#¦O‹ul² ’ö! ´Ô¦H-IÙžýõ©êªæ!S½F1`öÅêê:¾ª.J®ü“«T­ÒLÇ™NW›Ã3Á£oŸIn­aÁz²âû»g¿}eåJŠ8¹\Ýí¦$î¶«EÜÇÞµ7k­ud¿½Yc£×õÊ¢wø_ó¶¬ïiÓèt#£Ã¶üIH}³V™€ÕÚÜüûîÏÏ~¸ø°ÊÆÖèG˜ «á8KâÜ`<‰…5ÄõÝÞ§*‰šc_65¶môdÞVÓ·‘†þ½µâ5³$¬ʼæ7D¹ìˆjSW4rpE ÂØ*šy¿w5ÍôÄŽNЇº#Š'r•qL¬ Éº©×¿¸¶á·›ÊµE½aý¾uݾ©¶Èêj¥q&ìj-u,mÏâ®A…É ó1ÜËž8(Áâ:¾¥`Ï©ž#Tw“Mé(;$;í÷Û'ß³ô4ã9ТÙ%I‡K’ž\’ prÍIîì© ·!dM_*˜)úo‚YiH²VZ¼à%ÇöpL ï6§Ç„+–±.Ó1ä8Ÿ u~~¸sÍ‘"ä_†ÈõòàŽ¦’¯ y(ÿ¢€{}åhasÜüù"ö)yƒ«_-1µOHLÏÖþÏ2SùÔÌT}¬Ïÿóì”#J#Tb‡ .úKL©ü‰eE¤v(ÞúÒBw!sÌíUPCjç>Rxwc!JV'ôìü䊙?­/•à –Jð9)•àÈ ýÁ¿À<1g1ù(ëg‘Ó[¹LÁß ¨ÏÌü¼B¦©’n½€ú“[óY1Ì'?÷!Ä„jé<¼„8q90ÜQFŽõ2s!·µylGE®ÿ~•²‘²WvvIÙyœHs]ù4KØ¡|J;Ìëg0êN‚º± £p6¬W;*lµ4ÒtnÓPÌ—D1 0**c_N’¡H Ìc=Ä~âhØÞ²¨¬iÇjörlÑVРú µÏŠä[õ>xVT¥µ˜=œá ÍëJâØf”áóÁ€{¾,Ï O©¨kaÇ…À"‘dXnPÚXC–ö–‰@c* aGYˆ€x³Õƒ, ½ AÞV¶^Â’8¦tFq@ÅjÓ6z½»Ä^·tÌÞ;cŽäP|Gð3Ÿ^£©Pƒ&•û@£\­Åÿù~Ùv·lRŽ>Ðñ½­Q.òmh€ÕyL µ.XÅy"ç·kõ^‹0Ò°Ñ¥þÀµf>v¾OÅK™ày¼\Âá¶´˜âÐGÌÑ “œb¯5{­È{— –XÌX÷/ ~a –pBÜåQÂ]qwE:Ç]1à®ãÞƒЏ°;…21Á#œåg°n¢W_>™Ê'âR9“‡ÆºùºóÏ×* .|º†F*ÓÜÍwóqçwóÑ?™`Ë ÆÝ<5D¦´p4æk”tÅ–„«æZÜÕ—pwáCÐwÍ5¸K¿ˆ°áëoGåŸD$Ó’Áúû+`ÎaòK•_䆚ÅúõÙñÈU¿.wͯËÝþºŸ“X¶è‹*Ñ:NƵ~w5Y¼?á-Û-xkÙ²9ìN-Õ»°ã>«¢.|æ  U¦„7ŠEFÆVÌüÁ¤ô¥Oð’2OSÿ¸‚~NqéKŠ€ëú“tÇT[~Þá­îtt½;pÙ²!Ó9²ü$¬¨Ê·\qVAþòÏ?5Ó1Ô´aèDzÞ6¿8X-où»ý§·nWœªž:ÝÞù>vVWÅ®>l@zÖP‘Àw)Ô[±-X͆ –0ÉÓìAKT`€Õ—ø_ÿt›i endstream endobj 277 0 obj << /Length 3336 /Filter /FlateDecode >> stream xÚÅkoÛÈñ{~…° X,÷A.™+ ôŠK“ûÐöƒûér@hie±¡H‡¤âä~}gvfùÉׂ ¹»œ÷cÅUÿÄ•‘W&QA¢ÌÕæð"äÑ/?­aÁz°âÇ»~‰+i˜Š«»ÝÄÝöê—Õß÷Ùck뛵Rj½ºYk­Þ–72Y}Â?Õ‡¼| Y4«ãX¶ù»P¨›µLBX­¢›_ï~~ñÓ]‡G$£ Òê ²~ÕË8#Mgåð1ñªiá1«Ý›YUˆYûxlƒ›udôênoiYõØæUI‹Þ#¦°n â4Ð*¤üõ[^4ÂBˆ@¼æš@ﳆà– X¤‹Ý´ŒRI£m‡Ê±ÝT˳;t´>lo²‚¦`ÑcVçMU6ˆËÕZ$a¤@*¡ˆ9$î-1&ã]¥y;ßðÉáÙí6œ„otœ¿¥×ÆÚ)e"ê dPŽ‹L`V*òÒ¯]Ïðr òTBó—×9"——ÀÔ‡_oið1{`ä£pЬJcÜe„ì©ÈùUgМshÄ ¦AGÀ IXãæœ°I©;aÃçYa‹ |e:Yke-ÈB«íÇc^Û†Þ2ÿ[?€è8jy„~ËïÈxüÝàš}VƒPغŠJ¯žö9Óš§¼(èé•{Ňj³¸È–ã½Q‚l±¥—­-òCŽ ™N Ó:ŒÇû–6gIÅ]ÌʶÌ}Ø©¢Uˬfåõ¢<˜é÷faþï±ñªÁ;ååè0fösKSösvx,lójŽ]2 ’1«Ë#˜¿ æ ùç~¯éçPºÅ?åí¯‚k˜Œx«D`dÇÜ]^Xq³Žµpr‡µÿfDËËðÀ?5þÙáŸO/ñï«æ1‹á”Iú<Ìø›ó˜½?Eíúz ð išœACŒÑˆt`Ò £Þ¢˜Drõʱ#½<áKæõGœÈÁo^nŠãÖúžÜó <8á‹Ä@æh<+ԅǧGÒ¢Mî ;Œœ(¡Š@þƒ‡~7:ž[£4iǘû"+?Ì‘œ¤Ò/càí,(à#ÀÏ8½Ô@_-Ęe=„YœŸwo^á1Gß žrõ–Þk Ž ¬Ï–^@"+ f‘ÿ|ihìØX^´gÈ …=ÙpD.z’퟊¢2:H#ÑÍE Eé@‚@zT-H@5Dì=¸ÞØ$cz9’GF)™WøuGÁ‡‘1’ˆÀÙ6<‡b%㘂F_ô¡Uñå Y—Ãrg™aùcm?±5f£«H¢ùûæxß´y{dO„HÖô»‡€©pñÜõ ò»JwêËÇÀÇæxo‹"˜cEHz8±3üРµBy† 4=”ùoèâ4º”+-R ÜàèmCc \µ«Š¢BüžÜ¹´s}ÀK‰ŸLŽéÆžòvLÁuÈ‘O%!D‡4yÌšÆn™&Õ$¶êBNxž9C˜(¹ èCNöOq86}!h}lF$ÇlfÊ îãŠYÄTªN‰ÐLg—Ãèj [³KE%eß^¨h·³¸Ký-1"~Qd…ˆßgN4>4ÙÆžÅÔ»—oˆêîbTwU} ï¬Ý~ª–£ZÚ'05ß…žõÅHn²ºÎ9«À»=Öåw js¹¬¢óÿ4m/Fq_Õùo™O÷ eÌî¿Y?]Œ3yTtµ5V )‚GB^]„ü@qüÿlØ7ˆ{‘5ûï@ñ¹€~u•å¼I­§gêB ›?ì8­ïsÎ릑!¬zÚSðæØÅÀ¾#Oéæ ù«\\¾éij_O¸Eã°Zª?æÂ ¤‘ ‚˰*í4<¨-mó‡¼m–=£’*HMò‡ÉÖçÙÌk$XoÞ,ìe„–&RñošL…sFá*fÎ…3.$îB¸Éùò§r W|S© "yæ2 LŸåvŒÂÝ*F°uñ¤‹Âi¢g—/Å ¬n$A3~Äâi ©hêB}K£M[Ó <ÏÇ„]†}þ6®%̆ÏÑPä® ´+xÀ¾ãÂÎìðxʧ*¸¦ SQÒ(8êYÕ*Ì;ãxEÒ»AØÌV ;F|=M»˜”Òõ”sH<(—H!§\Í(Hï*TJ„ãŒ]xÎ1IÊç2p¤ƒÑɳ3ðPq ãŽX'®ÑÊf#×8v‚v1h¿æ@)ÀR?KLògÓTI’Ë5öoª¢š5 :T¬ŸƒÕ ™RuÇÃ,rX4ök¶Õ|tžËtÂÏš¯£0ˆÄ¤ÿo—Â{­7ñ¼6Á uªNõ{öÒ Çíê6À/)¨ÞTÖa7)ǨáÐõ>â% s¨Í³Q—7~/*0¹ŽLv°cT˪¥‡£'N´Êx(+ŠEt£yt¥Ðî-üEèÞúÞ;CÆQmfN>âaÔòÿ)|›E…§ðr´ ‡‚%1Ãý¿¦ói˜ZmOJè»ìX´}kˆÌ&†*Ó¾01hÀ¤ÖŠLÓ‚áiÉ2rSéêIõTû:«žØâyÅÕì¹ëâÞrw xgÍJ¨TÝý¬`™@9ÉžÔ{ËDM•<<ÅI­OVÛ¬µ|lWVÆ…ô:©ÃÈñ\ L´·92›3)²»êv®\@ ¿èÝÅê€ÁÕ•Sv!݃Hli–»è‰X,tõ2oF`lÄ$Gª*9vXUí& Æ¼pC¶Ùd¾•¤ DAÎf}<öEiä9<ØqáqPguȽʨ'Uu­i±J\é­¤e9ÛB²O¨P6ùÖÖ ÙÈÈ÷žØ$ñÇ|õ¸hÈx”Òž¿†€¶° |1²Cê´¼ .%$[_PÌ8aq©Ú× ÑxâŠâ)!jÛÿ 0ªŸòÆÞöÚ=ͤÆ5aŸ£B}úà“)ßcŠ?”× «aÕb”aÞ^$tˆØ¤sÇî4™ &G_ÔX]TRòŠÙ»7$QôÕÞlËÌÿù•Uúû[T¢7Ãsüö¤ß$Ø„!Š—|D{½lŠ09 úâ`S]ê¼4‚©NÏGw n«ã=ê§Ô!7—æŽ ÙC8lž¹N ·nàÃù´Zƒ]NWÑa:ñE6¼_j='£ZüËË!×– çÄoêØ-g¯BäÐLn“’Í)QäV]¨©aÐäØÂˆãôó.[?Òù…ë*ÆÍ/Ïv¯}PJ–cKñ“o´‘™ãko¹Ì™¡MöŽG¸êÝ[óþRCß_Ú1¾Ö »k c›Ø_]èz¤0æÄ¸é­iÍã]`·Éëïé ÕzÌl×ó ßÿ0xÿ_»Î£%_Ááî2¾ ?m댂 \‡Çà —‘»=/õЇÏÜÕÅùII‡ã2¥@T¥xC),Ã- 1ÙÓÝ î Gw©v¬ ¾©ž4z»¨U‡“Ö®vŽ÷\ol”\ÂàÓŽ[øÜ=Æ8„å}Ps´6罋üË.%†¦¹‡B§!XƒÝöAŸPÝ5×âOVoª®†ýfˆ”jZ7èò«• 0ùª€êî Ñ›žŠÞ²Í¦:÷k÷YÛ-ä[’^?Æ®Ý̳Ցj:°¿ßq&vä{Fô qìºã:7J‰¦_D0êü™féÇð…¦ìg»9¶˜ÎÎZm ‡ºÄZ†>uå…uÅ«×ö»BAãW7.jÂPGû3x†$ÒALUÍð?þù¾tåZÞr”>å‹ÂMÞò]OÝgõð|ÈxÑc×)ó¶Š*Ôi"žË¤éÄ–:%ä½a=€=H|ç¥!Ù¦–¼é ˆäk!<âÛØšloCÓܽG½h}rQc˜£å¨ÌŒKèF€¡c“,Ü€`*ú‹Jùr…ІVØøÜ †y>AÙØî&@ÌD[¨l@¼ˆÞÙý鼡»%¨óÐÀ›Eé´%ðßÊÀع.@U` Ss‰Óú×µŽ$߯…Ã{ˆ¬w‰Ÿwt tI’@÷è È2:H´%Äâ,yÌè6Þ•A*&úqUFÌy¾¼¦¢ò$·‡ÉƒÍJºÏJïHÁóÖÝ^¾§+P’ËYbäƒÑi~ C´yC[æî°˜Ü;;5þ„ˆëOD`‹/T±"ccýgø·4Úea]u?ßÑ÷¢é}œk×+0táB¿Lz›ø™J`bAÛ¶cG‰›\NÜþzAV#’ÕßèUo¹uþ@–}ð÷Üð¥«Àà‹[´¥†·²z@ÑÀèNqœ¢™îþWÞúËáÿÿx endstream endobj 281 0 obj << /Length 2830 /Filter /FlateDecode >> stream xÚ­ZYÜÆ~ׯXøEÜDl³ï¦ž"Y6`N´@`DÌáì0âk^+¿>U]Ík†Ü†áe³»Y]]çW5â7 üÇo¬¸±N2'íÍîô* ³Ÿ_ñ0ŠaC<ÛñþîÕ·?h~Ö&)¿¹;ÌIÜíoþ}wÌ»¼¹¥”‘~{+¥£«[á¢ßñOý¹¨h&mÔßòè´/>%\ÞÆÂ%°[šÛßýôêû»‘-4ÓJ¾Àì°ëŽy’0|–hEL?ÝxJl”áÃE÷Ù™ýÜ–Y‹+ÆE ØS‚Z›èî6æÑ®Ówí#^"ÊwEVÁǬÉN9H¤¥÷¿ÐƬÚã%71çM(ø€ëx¶þ¶,ØOY↠Çl”ë&§<«HäðòtÌ+¿‰…Ö ”Ì%ãpާº¯ûû2'ýÖ×]ެ§jvu}ï@˜1·Lúúî˜7ù¡nò7È‰ŠŠ<­ˆºc޵(³¼£—:¬îó²8$&|/¡øOöôÉ=^÷ -ÿJ\¾gýº*Si˜sjÙ'.U·&XΙÒã¶gIrÁx:'XmÔWt Šk5³bÔýk’’ËúÝS¦ÍÈÂ7[Dí9“ª9£Ïöƒ’vÅ>h±«i.¯veÝæd <§gæŠ?‘š ´=©¼VÉÆT°±7´ÍdM@’3gG U=ÄŒÃaí>JÎ/´«O'¤]U8²=Ö}fïÉcÖN9ø£KÌÂÀ‡³1ÞDqûú5¼]y[À?çÿÛè·¸–r0¹=eÎoc£¸еû+–YøfÎÓxŪîVíàÜK¿ê[ÌK .¿Žyc˜€oˆ—`!?VƒîÑíQ?v;šÛem>YFP^^–4÷DæIªTh`¬4ÇpÒäe¶» Ñ5l…°ˆvËK•ZÈgÕ› 3Æ.âÈ¥¨VMR3Ç'#_1 <±TJˆlK«¬HŤ‘g¬@ H­Zêd´¨SÆÊÉà‰á_í õì3¢€ ŸY8G-­ÞØ*æ”û?¢9°|gqõùp®fá 1mð*ýð+Âo ¼@‘ÊIM’­†*!8KZõò5­(føxé&ÿ­/LôŠkr<Âøð†¹zX&ŠrR&&ðRåO>Þ®0;Þ“ÂâбÁü<ÅŽ€£v„]¢~à%3?nŽšð}—õí€ÖÂWu[¸ú€RgŸgl_t!>xóš53ÂÄ)oÛì!ˆ‚ƒlªƒ(.C.pt*ª¬+êÙý‰Ó –U?0f—ÁnÈ ð…õáÂ|iúŠïÇš_ ¿[‘Ò8U?Òé8^‡F‰bV¡0~•Ï#¹O‰NÖmÍ1¡Fwã{Aóe3#LP(òÀvE÷@×/Q•8¹kò¬CkÇ—¾Úcy…›~þžˆOÜB+ê‡oþøÏ¢Ú×ÿE,n¤¦Xk«'\‡/ÂñcßÑ`Ô…P^I¾Êš¦@ëðß4y×7«ÁÓqfùܰ‡#ˆ<Šv‚Ï1òáËY䘙`ÂâKüPkžŠï*Áf˜ ã‡ãNéE‚W„€”„à¥DÛïóýðFÏÌC˜ÆAà1ò4T‚G{Ú. ÕŠ§Ñ-H¨ÈYhÁ» n¤GÀ«8Aå"ð ZãƒÍ/„¯>༻>å4‰–Ó ¹:NäèAù®¹ÆPyG?Üô‡‚Ë/0Ä©œD–š/äûþ ¸9l÷vƒƒ,<)žã)U`ÊÇsH4>¿Ô @ÐÐÂÀÌt/Mþ5¤#ØCù’ċǼ)v¾–zžIÍ f]Ä!˜2WU ›û¢Û˜Ö`€djŠ4/@¥)€œIbWWm±§ÖŠ")]­‚{®ø*¬§Ìê3G™\–ðñ–ËZ\¼ˆ%¶3:Šñ!}VF\4`zP• ÝF—õׄ6Cç!+ Os¿DEU]Å ‡¨` V§ËRí—[°\Œr2MáÞ |Ä’ó트ø§JðBp_ï¸ÔPÂädO}»Ì¸©ïOøAH·0Àݤ:šC¹_ “P—‚(Ã'÷(/4?ê ʾ3º€ÅÒô¶šÄfÎGœÁß^“Òáh\. Å_Mmu, Ó“ˆ·WÀ*¢æ*<M= VsRlQrjá˰ºå-Í=‚¸2¿Û#BÜŹ€±sü D¨æˆPYãAÉŒI@PÍXáÚ=Ö…‰Ë8óU`”È'y€¨L¡e©6jã˜vî K˜÷§È¦N^ôpà0n.sÙò*“.LÎÌæÉÔaº'áTØ8… ˜\¸,ÖUù…VÐMëñ”|úÖãVnÇŠÀsÔÒ®7¾“àiM__¦©Q”rŸš°€Ýï ¶Öuß#L0&Ú75qcðN¾ðNî»—øÜ°?ˬ³W¸Î¢|ÅcCtœÐ¸è ÂV˜ÈPt]i0“DEVš@$h%%GÂç ‚—*;u–Fªr£ªœ 1Ñ 9ÊÍô«S‡z î.h WsHsû₌éfnùÅã–>lÊÂgYÙÖ4ņï“ûæ¥_ªÖÐTþÇcYì _}Š¡ ¡ å‹ ã¼¿&þÓ·mñ)núF E­ð-OßÇÝT·Š! Ž%õ°ˆžŽ¾aSÖ®c “2—\.„„±<§Bqà‘<ê0é–µÝ>?d}‰öâÄÌUÝ¢c¿Ö à‚AU2œv_fÕç5¦„™÷ Þ¬Ï ²ÿ° ÕUwœ3&£é·•eå%ˆº²õŒmM²f1˜!(+I"%š¡Ÿ™ÿò!S=„h'¶;ÚšsÍy¬C™\ê˜4g õ×üíÛ¹°WµÚ›… >ëó…Ö¬RévkÖH•‹ö–Àëuzy*|1dµï¦æù™ h–1uâËzgŠECoë^´%™ø.Í‹V ¥»Î D²Ä¿F.£¼£uÐÇú¬ÜUf¼:Y ß0\™ªÅå7ÐØö}¸†Ÿ6•õÛnƧÌuGÏHXbär ‹3 즄A=V.%,^–09%|kÏSorL*P¢úfU82#´U÷½ãTþ§…‡¡µ¾ÆAJïwÇ‹kާ_kÿEº¬Xý-*N¥OwóÚ?ŽßA–„b/‰þÊYÇñæ‹ã÷îX<³ë»‘–¼Ü5lú0’RÏú~$¥ŸÙõÃHËŒ»ÎE•\ü¼"›äL*ÙL*|óøû™TÄæ®ÝL*rK*û™TÔ&©|&½¹ë0“Š »ð ý§I ô endstream endobj 285 0 obj << /Length 1233 /Filter /FlateDecode >> stream xÚÍXmoÛ6þž_a *c•&¾J.–aI_€íãàoË€És‘%C”[øßïNGÉv"¹Ž±¡K€ðHïž»çŽTË&1ü²IÂ'I*¢T$“åæ&ö«O7ÌK!(„G÷ó›?+6aq4‹gl2_›˜ç“?‚ëlÛ˜z !õ~J©‚_Ë)Oƒ/ø§z²å#íÂbì¦,Øäö!fbò4m‘LÿœÿvóiÞãP\EJŠo€í´.@Ìu+Iˆkã¶è:0ËÆ¶M±Ÿ¦"ˆ|Ü9·Û€ÌY`Kã ËsÛØª|‡SìÛÈv¤ó•&ENª…}Â8 ÍšuÖZ³öKyæÖÆÑâaÒâ}.Ücï»Ì•ãÎèvªf²21¿ ÔPpõ”ô €•xN§AVZjj“5&÷«ŽÆÜvcPaA °é Ø÷%-•æ±€$vò]M\£e8¸6Ï/03{’«Ëj³ÍjëªP*æÈFuET-š¬M‹N†u$Ø€É2+˪!Èó“–tàeiWû.ŸtÄ€6ÖY-±˜Á3T?®".ÒH˵HB¯sRi³(¼ÓxˆU¼±m#ìLáë³L¾ä;%Ûtk5é~±Y«!¡Úb’ü×L–¨HÏ0ÝNÆ"©T§óšV1X*¢P h+!Nkéãxä¶Á~`²+‰8õHã¶6²¶½¨`‹Úƒ†|‰×Žt³-î{2ó5„æK{› ž¥v£¸Eda¼•¯¶(Hòæ»CÏ6«YŸßœeþ$¹®œíî–³åÒ uV‹ˆ§*è Æ©†%m”z08©!+uŽ ƒ³ÌËhÚ5^œ¹ß{'Ùd¥£)4{;ö º¢@y°(Ôn,t_/( 2×ÓŽ0¡µ¼gÁ øÑ"šé¾ÊÜó«Õ¯PB6¥'ÍÝT6¸©Jgs|RpÖF‰‚k°2Ü`у•Y*ûø›“éˆÅ=8¼Í†ºœGœ‹ƒ¡AKœE)Ÿõ–áÃZ4øधÒo.v íÝtDUxù‚[ˆA{«³·ŠžtPJ çÝJñ”+ý¼²Û[Uiê>·ˆÆ.ÛžÐ<(*j–'Úmß$åÃA¡Ú5Û_ÄJ=Ù„›~CïLK•+ñäE µßP·0ÊöÂjça7†´ñÀ„t´†bù–dh:ë ¡ŒÂî\œÄÝéðÁŒBžäñ}9<„ÒI@)„O ³¾€N~†î’7oèePÁ›÷ 1ÒO··Sü¼ î.=q{û3ÈÚ"™Ÿô×/þéÖ€IþÄ,Š¿…ƒ?LJ(ßTŽÇ@î®*vøŠ¦®«šDïÜõ?&dïhõwSàƒré) öØù«8áãœÜ|˜ èS± „] ç$äÏ8?Óã€3ü%ì2Nø÷㤋LŒSòa˜D1ÎÉò•œ¼4ù²MÄX›ˆ3m""q-'âûs"Ç9ù8œ 9ÎI~%'òL›È1Nä™>‘‘¼–ùßpòš«KsòéÒ}.̕ω:Ó'jŒu¦Oàß$W>'êðœèqN>6–§duís¢Ïô‰ãDŸéé+9Ñÿ'ø¿Fÿ¹…^’ endstream endobj 289 0 obj << /Length 2575 /Filter /FlateDecode >> stream xÚÍZëoܸÿž¿ÂHq°ŒdYñ¡—¿]{ ÐÒ¢¨¿5Jïj½j´Òž¤ïþûÎK¯µ”³/.p`‘Cr8Îüf†}Â?}•˜«$µ*µÉÕöø&êç7ZZ˜°™ÌøÓÝ›?~ˆô•Ufúên?eq·»úWðçƒ?uys³±ÖÑíÍÆ¹(økucÒà þ©?Õ1 Î7:8îŠO¡¶7“†0Û¦7ÿ¾ûñÍ_î9"©ÈÙ_¶ŸõTb3•X‡¡JAîX…‘c¡ß½{w³ÑaŠ2¿ANÁÛ&(Z8Š~Ë„]±ßçMË}S¥õt…y‹¸ÔœöÝèDEVö½;ÀRÆoÎÇœ´Ô1å?Âb&z©dyõæÖãõ-~]°ÙpÓ7>iëZÃfu½$V–*Ûžç5ï^Tmל·]»$Ed•qI¿¢:Q3K¬S‘Nû‰]ͼAK¾Ùq;'›È›_¸ 3À$¶ÛsÓäÕVtSïEGüÙÖe]án ÐD«,ÕViØš¶ù׸$µ¡M/Ëí’¸‘JÌ -°ÑïAwÎÖiÀº0¸/}õ™›k{űʲh`E×°°¡ÖÊ×¹¾c•?–E•}Ï$V6›nY½hKßò–t!eÉ›õÔÉ=!ï)ÞÎa¡Ã ;ˆ¤°V].¿hIÚz°$0Û%‰#¥ãáZ|µ[f¤LšŒ9ðû,8µlDÎY•¤±Q¯íòlÔ&q°ËËâX€[· ü<‰ÀkáHxÆ$ Ž9í¹ån[ƒ‹Ïe@컕ñ=“¡á/8 ±ñ‚l;Á”ŒÂ‰Ø8F^²ÌÆl¼C‡€NŠ!‘eƒˆe¯ÁÉÇOã´ãìôwúo™ûVš°1a+µ÷ýš¼I 3Ð!±d'’ÅkÜY´qãBfþÌ0y >§†QåÞí t-¸*gMPˆœ~"ã¶ÍT‘ípALB}¡Ï>Ò›, TäºÐ,B\Žø‡£ãѱ7;„ب«ò—¾•c.nâÐ\ŸoÆuË*KœŠí¤ÿ°®³DétȰ®Eàeð7« ·ðÝw«<çnÞóDË^—7RÖÍR¯çrg¦ä_بjÑ­/˵ôHAš*ø쓚c& KƒtŽâ „¼ÝúSôHëUì-ƒeìT2ÖFÏ|X´ÉAÚ4&{(=PÀF£@?ûã©”Žç§‡ •OécE„ùKÓKŽ›­á#T<é ‹üòwmgˆ/†n‡‡9û$+‘:•¥d-´¢OÚNMNïä7íú ­§|BÌk|Ç^æ8õ»ÿúíÄÉÀnû¨]¢—{Àì$gÓü<¶€‰r¬l£:ëŸÀÓ%ÉT °dªaðØã÷Y:»¼#%¢^»ãTꢗ¾èÞ €?’æÆmæÅªî‹X Ã±@x23~yÜÉED#ãæ!^ÆYã'P ”Ç+PžÅ*ßJŸ‰pP<™àŽË/`Üñ+éÕgÙ—BN<Íá€xòMWlÏ¥o¨‹1´åûsÉSñ*û÷Uõ<À^Ùœ`vrعmKmž*“]IêÜ ¥ãB¤L ÉèÎH¦„‚ŠOyÜJ(…ÔL`eÓ4íÊ\XÑyéÑë§ÌQM:¾o™:@ N\n‹]¿éÀŽWm]ñ€h®+®ü·½a•ùî!ooDÚlq×·‹oø¡ÒObȨ]†ÁßáÂIõP;(/àf” E´=ú¦ŽÂ@›¶’÷z À…D}h…‚å`aù¢¡f*¤Ãufó-2Û«•5 ƇüsÇ$ Ràî~³¨:„zxÌããhUTë¦?8½@Ô¾éÕ|Çy%µF¯©Vžùý©­&ñ·À…V³ðu´JÆjä7Ⱥ£²¬+p6Åéߤ×!d»0úº^_"¬˜Àô,’[þÍõµ«#*¦ãÏKùòó°…œU's?²î•GDI0cVaæë(cS•™yà9Èèo÷lùý`Lòšóÿ€˜Q©Éë+u1ÑïbôĘä!ƾ"ĘˆÙ$™Òk G:ßÿßÊÿ³A›µ endstream endobj 294 0 obj << /Length 1470 /Filter /FlateDecode >> stream xÚÍXÝs£6Ï_á¹{žªO™¦Ók𛹾´ÓºO½Î”9f‚Áœ\ú×w¥œ8—¤S0ø=ŽfGß|”tBI“˜Nf‹þ³tò‡w±LÖ®¦>çÜ“gS_é}*¦,ònÍ_y“×8 ÊÛL©·J³Ï„ò©Ï"Ü<žþ9ûéèrÖé!™ ¤àO(Ûr=¡q± x)Pëß²b®A~,½féˆËMU"U߯ŒêWFA¯Ì±3«ñ4M27ÃKºÜ´$w¬·SBk£ëS³3PˆõbL,†=XUŠ ˜c±pŒÍ8éçIQ” J˜—«uRmw°r:;{ZWåÚî<&@:›QPfW¾3ÛIÌß=0KXgáÞ{›½KáU›;î²f‰Š‚±T/’Mî&€{…ÎSl¤:ÏV ˜ÃgŠxI=˜+½rÓ¬M`¸Ùåbg¶»JŠý5fSÆxxר6îr^늢ZF4r#u ¶8Æõêei"ù®>ÓħÔx×§*Ü ðw« èðþ=ä•ôÞŸ±©O%PßžŸOM”{”Ѓ 8J¹•'£ØÈ£R!­Žz\'Ç4pû˜ÈóóïœHú2‘TD@GC‰ß;AÈûÔD¢S˜ïÚ(”ûõµº¨'L䘞”Ø™H½L"ZQ¬0j ú Éý¢òU£h¿Äm©ÿ*ˆè3-ÜŸh*|“ ÷çÙ«Ñk¥Y´ßB‚GFú«EÑ~ ¸3^"ò¹GQ_™I$ˆ|“£8ÚŸE‚ËÿáQL h GÊXœpþ&A2"³³’¯â€¾íi ’†c''' ƒ÷1Ë5ªðÎ!wØ4@6U¹rÔ.?{7†<ª‘ƒµÎ,ÒT™… 7®i(g^ õeµr#8ƒ9À˜ÕeYÑ2ìr«öÁ¢íâB蘗EÕMk¶kÔnÖ<[Ü[°oä1_p%IÂ]_ ¶då!™‰Ó¡šè(·„î\ úûèG§&7MD™jÁôBÁ‚ºNc#- Ývcdqy›ËDè¶1kˆrv6ôø^ x·WÿÇÑX¢¢àa5,_z ̫ëÍJ£³I …ãízŸ)_.™}EøúpÑ£"º GU„!$.,YŒúˆÂ™ÔÊ1XöâÕX¼ NP}C,õ—$… \™@,ö*½®t £ÔsŒÆ4cåb45QA¨ÏL„²c1î7ÂÁýRÆõFÂuvkJ$í^™Æ=ÒÊèþƵjý÷F›}a™Ò wÊT–6éE€Š:êƒYæ"ÀæÏF ‰½U+ú~îI” „-8G/úƒ0ynŒÖVœ¦c<øâ~i8(8!­_Çãsÿ p߸h?ëlp+Y»ú#¹M ^f½äV ëÖêVÓ a¿IƒöH´=¶ÐW&uëñ[’ Pâ ot{åöo&'>+Rm¿ €¸»l BÂífÏ[£ÈöÞrÁµwKgvÌe°Ìöû ÌKûé©Ià€N±Ëž\Û9@Ø’Þ~±r^›%×ã5þëù0ÌtX‰ȼ±:}"ÅÔ x>\Õe¾iÞÐUUVH¶Rajûèvн¿jsÅÝîCŒ¶?í3ôL_8}õšþAwP]>QêmLB!"Rø—Ú§/4ÉaEü›V‰QØW…w3ŠùÊû/×T6 endstream endobj 172 0 obj << /Type /ObjStm /N 100 /First 880 /Length 1694 /Filter /FlateDecode >> stream xÚÍZÛnÛF}×WìcúÐåîìÎ^ #@ÒÀA€¦5rÚ~PdÚ!"‹†D;Éß÷ UÕ²¨4©@,qI-g朹ì,iXe£U6á‚rqn”OçQ11ÎYŠÊ³Š”ñQ1$\õ*™UÊad#ÆÆ¦¥(ëe>6árrÊã+Ašc|% { 0Ç(„>"z„û‚·#+³¢ÈÍFà÷ŒŸ³˜ITa‘—Ã@Ôå¤Èù¬|TäÙÂTEBƦ<"ØNâÈàž-dðÉ$VÎÀ(2Y¹V¦5äDaáÀç¼1*y];0ˆiD7³ˆ³Q¹ –ÁBÃ2£\“D’Iî‚‚ 6 <ûV%9å…ÆIÐæ|!O|ù °È³ ‚,\Ì€ …„Ÿ¬\ÀÄ2r2x&o/ÁÁ&ÅyRlá á.Çdo1˜Ç.É]A1‹@°ÉAødÈI‚$s‚·‰q{† ¯ÁˆÍ ÜNœT°¸•2ÈeB¨ÂíÁáw ^ q—Ϭ ,*›!ˆa +D†ÍˆÝ…^„oHˆQ’»2ÂÀш©ˆ¦hH–¸m+á ñ8¢Ù‰v ‰ GS’è³v„`ÀàÎQ”L°WB+&QЏ…rÜŽ˜J†6Y‰%ÄK’È!x(9Ä…€LŽÍèädT¼ùrSªâÉlV7£âõíû¦=ÿ­š}OëùE9Wï ²ÒœŠWå¤Qï®Ú$¡/kƒ†ƒ4{'äéÌ óž¨“U¼VÅóúM­ŠgêÑ“iSÎg㦺+Õe=¿¾Ž2P͇RMêë›Û?Ö3U_¶—æåt9ù¢º¼,çålRþ¤?ᯟѨÁ°NHœ&±×ŠñcÚ‹ˆÕ‘³ÊYK8{Î¥²X£Q—¶ÚübvW¬fWjv{-f¬ðL½³ˆT£^©âÏ¿þ^Í :0y:=_M;­gM+÷”¥þ.矶ðïey5FÑL«1Þ´cˆ*Îæõäu ª8{vªŠ7åçF?dãl|UŽŠ_¡±œ5 hhÕ þE};Ÿ”‹¶¤·—^–ÕøiýyIgÖ’IÉ[gcÞÀ®åô5È‘¿ yÇiÛ™‘ÉÛÈø¤¾d$Ó%#õ!ct (—QL:ï”Î8…H*¨Œò­¥˜J%à`{E%Š[?îï ïM²ïŒš»É)lF òÑàä.œ8NÚ)6¦aeÓˆý`¯eS_2wÈ®kY“—UMš¼å‘gyd‘C‹â—ë§ñK¿t*_]?ÿ/‹z-† KÇǺµD˜íºß.ÊÕ2Wß´‹ÞÏõ“±Z:W¦¤=-—œ¨+謴 ±WÉþh‰—»‰—‡&^Þ-ñr:ìʵ¾ÔË6ìæ g5vu‚ÔÐÊȤMÊdK3(Seß$&ɶiyä¡™ ’šEe—fÅÝE$oâ­!ú©j>¨ç¿¿U/ÏTµPïËMäW3åë*Ùè ›12:Ù´µççF«{ Þ¾z±üztÙÜüRøÖW³[]ϯ ‹«ë›bO;<–zY>Vư ðÃ~Æ|hZk }Z½oÙHZÙó)iɺNZ;,i¥¤í´»LûvÒÊ# ÚÖ{8Smèò´W[NKÓÀƒÝ~x d»@ó@ d~D ]R/®Õ^rCk­ôŒÒ‘3éà±µ°ØðRT(¿ÌÛwÜ•ó»ªü¤®ë‹r³²ÐN;¿Ó\„Ê`;êŒÝÖ 7=HÏ¡ÛArÝØ¤¡±é›Ã¡uzvyB8š?´uÞ÷E½qæ.Î8g:Úòé»Ë§ßkù$Ï›p<ý€ÕÒwýæc kÕÒ/ —'×C«fD[°ó¤ ïêY,3ÚVë·ÖM iæÕdýñ¥<ÑÏ«®4µÂ°©&·Óñ\]Våôb1|·IØØI­0YËs}öFÌþæµqt¼´àn5c70-ØN7ø9…s<ï„nÑ C‹VØ­çߘƲ­ ¾ÿr»ñTþ¾Î=¨€½‰Š]¢x(Qá°Õ½/¶HlÑì…-n¾gW~Àv`'Æ®#÷º¶r…> stream xÚ¥Zmsܶþî_¡‰?˜ëâ…éÖqÚ¦“Nzeú¡é´§CÍ#/|‰£þúîb— yâ]ΩìØ],ž}%n"ø'nŒ¼1© SenŠÃ‹ˆG?¾ÜÚÀ„ÍlÆW÷/¾ü:7" ³(7÷»9‰ûíÍ?‚ßïóc_¶·¥T¿¹ÝhßÔ·2 ~Â_ÍG[?Ò[4Áp+‚ÃÖþ u»‘i³utûÏû?¿øã½—#–qkõ ÂŽ³žK,ç‹( S; £X“Л“ä47B…¶ëæ¼|™€Ø‰‰ƒ—oäíFÄÐúíÛ··È60IFÑbÙùUoßþŽWÅ~Ui– ß=tM5ô%Í-Û¶i©É<¬Ê×âŽFÿVVyoº°JùŸr#óÍ ÷‹*÷–ž×ˆV)ª|]“éyhiüº_¥1SмR)2â$‹c)V•ò\põlÃQü âüºiÃêÿBZ àÚ ›PG†ÿ_Øðuv!"؈£5¼Vê< VzµlLGùL+×)Eÿ*Ä¡H•R& VE ¥€·P‘$î¯_¿iḃ¯mÅÔ¾¨ÊícÙŠ/¨»µ»]ÙvÔÙµÍ[§óåÈåÔ§âVÓ8§ M”×ov ,)ƒóŠ¥Oƒ œˆ¦²,k¤5`-ãÄWD2¯·hÃ&‰XÒ–giŸÞçLú½{P–5u»ÜG„’g Eˆ|=T½Ý<`ë Ç˺h¹­_A¤lKiz$Åcëûû¯ ¼ Ú,L"±„b QFýÞÉ—(laC]ùãü¸×ìè9ÊÓQ÷ÓÞÌöÔ-š¶-»#ˆh‚¦Þò¤¾!¥ ¡œÖâ4C­I…:öú-×4+D˜©tœbk&¸·Lºq[j²n̨ܾª-µ÷£ÞMPÒN§ƒqú‘ Dl¡ŸcÞuî˜ jÃ6à©×±CPR£œ›?œÙ‹Ž=T_…ÄVÝb‰øwfQ°C;ÅÆ:<ÓP»Mw–§ö<á´ub‚O¶ß_ p™ù¬Íµ'—ç Ô)ò"`<”…Ý=Ñ«9f bÖ –•=ØÞ9Åæ"]ÉÂ% ]•<¿çÁ¢9ó–—\ÙDJyrÀ‡2¯€TÆAŸŽ6Žm‰~.yºŠPõG/Þ\¥-$çœÏYº2 ÓÉ©È7×®Œ“ ²wA⩳™³L4Äá ÔÃÝ7¡ŽÝ¡ý•xóƒPº§QlÖ¯Nf€p4°™&uôn>gÛ®ÿ—‹t™qZYœGWà8ü¬Ó'2̲lfC›L«àÞ!$Ë‚Ve½…p×à¹â`N†Þ °‡8Š‚1ónzç%°ß«»’g p`I¤„°Â ?Ý‚žóÊn©›W]C3,;–sºMûS÷ΟÂ3§Ç5ØPl¢à=Hh]l‚wý>ïÑM§I`y•74ZÛ8×f·L ŸåÏÇʶ§žÛÝœõ|wØw‡ÿ Ý8µ>uµ’ÑxCTšý¤Ö£!Þ­/•¡œB뼵ЊM2N:ÏÄ…)à²-w9hÕSE)Ó‡Y³-mµ0Ÿ¶`|ty¨òúãš I!Çiwk¤0V?£Ä­YkªÄo­…„ $'Å”Ÿ*[¯ZDó,õNšÎnÒ‹âÈèÀ¨2@c¢ÖŽŒ‚Ða¦õó¬+SBÍ8¨a§j´¸(øvð¥+ŽS@ÉFgCÍMל„j4ñÚß|u…‡#r?@ºN2 ãxŠÂ›[çíÓ*¬bH½ö^EA´È ¾G4m™÷˜à›¡ÞzÅ‚B•,ûþ»?4_¾ÿîï`ÀÍK´\Ðàd±û¼Úyå"šËNž:³uQ ΚeÌ'*“ À)û¼Í ºf€wgÒVjðÑ]p{•n‰51ƒó3&Ï!Ù Às²1x;Ùg42KÃ(‰N‘w.ZÆÒãÛë™” ùYY £pzŽª„¢JÅWä4§d]ãè”0æ- š–÷š'5ÎÁSk|Ç™¼ŒhÕàëµ0xEÄŒºqén\Qƒ¦c[ôݪÝ©!¥_Vˆ—}©ö˜‡Äv88o* €ñ“NZPTÑ2â8ù\AGK•LM]²j÷ =·)Ž Öaa†¶4Zå.࿆ õãJ¯57Ïi@–†±L–û ÒK•©1§Ã¦ÛG6ºE`øa{=ŸœéÉ-½¼*Ÿ[ð€(ÕRˤØù$W® ®ÐãB¤]мµ¶wÛd•óÕ}¬ öól·œYé4Túä>ÅÑ€ékËcÅ!ô'™”ö…fçNIGò|û¡ìmx5 Y2Wˆ¼cØåŒh`’®>ƒ§ŠÑÿédŠ×UÞ>–¯Ê·Ûuö¡b’@%öT”§"Òˆ™³[;³èj СV>@ìì³tQ¢C`öÑ×çÐÏs[;‘¡ÃGúö{j¼Ÿ” ½ IÛ1ÆÒàWõÿbZŒI®ƒŒrGìyU'È‚. ¼ÿ€ñêŽ:\¹‹Ð8ÎD€.žiOMΟ«aðy:ZdŽR ìí#ÕŽf~J}Í„Z8åG™HR90ÎgNSH€¨è‡¼Âv¼ÄÇŸ Lñb§0NxIÑk{:Ÿ-†FÇÅ+òU~Œ‹©î$ˆÀ›ˆ—9Ï}9œgâ7Ä:ž¶åX?¿J>ѦK2ºJÛƒÑqü¥RHA ø> Ÿ£†ŽèIŽ{"âlVŽfÌMù"WuÊU\ýH׬uS#VÀ°ß¹ €'G–2 ÛTw|ßâT ((ç*Q cü¢RÒq¶4 2·n$’× ršƒŒ´åƒmÇ뇯sÖ¨¦ÐoažÏ  ùXhC0@ÿŠp õò¢h†ñJ°ŠãW5=G;Ãöl[Ø=xÊÎÓzæSþ\Cï§6«dS“\S`ÅîkOìªf;ì|“BP¾w×mn'¾& 3µ,oóœÜîÝù™Oë -»*#T%S ~9m1SùE'.ƒºé©1Þž*9›ËµŽCï.82h¡þ×ëù‚t¾†Ü+4Þ gÅ®šoO¡bHåÇæ:|8Иn¤p´¡§‹¬®¦œZG.·sàÈ1,㤜n îžœ'8(àzë¨á®F~‰Cê½I4å’H=ßnq*î¯üD:•q¸j?»ƒ^u.§ƒí…+®‰¹ÊLµ1”EN÷Ç™œš¹ÓñI݇OÉRÙbœ¢7S ï-Oww™t‘DÑ‹"@%[Ÿ·Á¦cáî1D Å~Uü,”Si?OʨèEö|çž”pw œ°‘Å(¨M£åP1´³k{=sn.Û1ädø6…Ýð|¢«-áÔ·%ƒscZÏnœIlÓÈ¥OÚžIº”üu@ëiß ‹è_욊] Z-¥ò2 I—€jºOB÷'Œ½a&N>V}ö™zÈYu]—‡ãŸý°ô<$ endstream endobj 304 0 obj << /Length 2249 /Filter /FlateDecode >> stream xÚµYëÛ¸ÿž¿b‘,»æ‰©Ç¢)kïŠ+zEÐî}(zN¶åµ=\=²ñßy²¤•/Þõ9‡3¿yP‘7>üÉ›HÝDq â ºÙ–o|KýüFÚÑÖ#Žïß|÷£‘7Ò‰ŸÈ›ÇýXÄãîæßÞŸé±ËšÕ:Ï<¬ÖZï§j¥bï þSΫ'~ ÄÈëWÒ+wù¯¾ VkûÀ­åê?}óÃã ‡QF|CYÇõBãÐkÃPP<¾Ñ¬5lá¦óÓI%Bc@BëÃ2kòmZ0 l©³bÇlyËO$6mÇ]“Vm‘v™c"xú0k·yÆD…Þ2µªYg–Vv)¨nIuUœÚtSö…û·‡ä3~Zô½a⼵˟؈€[2A€~Kf<Þ7éÕ##Ï1mº9wÆ„2µ§kÛ”_¥ÍYÐÜ’ï²&Û öI•€¶‰0IÈÊükÞ®{ˆ­Øx[M§E³ €ÄƒçC7<9QövVÔpù çžYÓ’‘IÈ"Ü•ö…Ž¯Â»Aìø(´ÉŠeÚÁîD¸Æ3 ®é…ռ΃ *wb‹¨Øˆ8Œ¦0;f[Œ”œ„lmâKB N~[Œ_H¡2ó‘¯Ö_–a"c鼫u¨ ÙAÅ"‘ÁuÖ2¾œfÔ™m° Xè~8_åFy»pÔç¼(¬¹@]5 ê]Þ‹”mº¤oÑ ƒ=@±.×ÏœªýÄ+3ë“eAçà³Í˼HíäWßøœxê¶Í7…“;u˜BÄžp$mR3T‘¯H«§v±’)iYƒ6x¢iìºE୼”Giâá‚/bXB¾V¼ø uÃkë}÷œ6vvH[l243ŽŠ¼úŒ‡Àqú”æç•™2“G^ÃÁÏ}ÑåÇÂ’?5Ù6çÃéÇ&ïeÖå[žÿÓùýD²ËÃ.4‘p´ÁS㪊Ðb RëÑåï–0_¡¾¤ P< yÇ‘ª #Q°*À(Æ8“P_|’98ƒXqá³ïÉn8pÀŒ8Y¡Å‘<à—´‰¼áýy‚ìVrmåZøåN‘\ïhf‰äœ$)YðÒSLþ>¼äkáµéó¢ãá3`b T¡~¶‹ò :-*9´G<Ö²¯-:Ê þŽSü¥þ¾‰0ߣcMÃò >Ù‡H8Z{›KWjaÔPBÖÛ åWŸ[¯÷³= ?6<¢ú‡[ý·O‹|oõKùÑv å0"µÓW§=ͪ «zòª´´íëf²lÛ7MVmOX‚!ñk™— NXI’XM2 A„MAÛ¢aLÚD \ðíµQS»Q`;ŽƒÂ8·ëò§ªnœ°su|I£EÊëBÛCÇ}C•ÙŽÀnÜYÅGŽº´qª”e¶Ë!Ç®@'‘ˆÕ,®l¬‚=©;s%'”ãÞÐçF‹éÜjJn5}"·/ÑRÛá „qˆ× bĦ+ßöP“î' DÜ·àµl,Ø·FŠóipÎjøŠ²ÒAÄ9 ‰éR¤ž;`¥\¯†lÅÁ›s«ÇsRKî ØSó‹Žò¡mëtZR "3h…Û}¤ò™ÕYç ÔrP&¾L®J= JG ‹”Y¬Eà} |¸Z.õ—¤*V¨«¤8µñ…Žl¤„8ðmžŒpnd2&QËÏ6³¼lg fœ9¤÷Ý‹ü‚oí%F”W˜dåw&‚á²–2:`†^.2º²™Às«µlPn1.@’oØ€5®ö®ÑãÅ£!}+mqp²—s8‡½ï°ª»‡â]…)B}eÎ%Cûã D—3: ×ÂÈØ÷¡ŽÚi w+Òl‹k¹í€vŽÅ~@¸¤²L´õ”aäÃ"% Á|µM‚d._=\€ô¸cÈÑá͹×ÐTDfšê¾;ö“Oy£:8|q¹˜7¥L h¢åK[–‚æœþôÎ"ÈÞE/ù\& 8}ŒyúÒ.f_•@:4³ª·žý–’ã»w†\a¼wj…¹Íxøð¯’“BuÅÂþhNS,'…qÀ}Ü´uÑwö›5»ÚÚ%d~÷ËÖòž©ÿÈðÚÿåâ*%ü8°¿l­í÷€Ñæ¯2L4œ/xi˜Q žõK φ›Íþ?vITÇ$ #†ÙÚLì2®zwww¶çø1w_Þ2Zßò ž5ö›ß‚h4cWo¯üôÚÆ0·Ýk{¨ûÂÆžMVÂýÇÑÿ$M©, endstream endobj 308 0 obj << /Length 3089 /Filter /FlateDecode >> stream xÚíkÛÆñ»Å!ùl²Ü— êij)P .Ÿš¥%êD˜e’Êùòë;/>ºÈÁŠžkwvvw¸óž]uÃ?uãõOM”³9¼Šúñ•’VáãÏw¯þðÞ©GYœ©›»Ýt‰»íÍ?‚ï÷ù©+šÛиooCk]ðÃñV§Á/ø_ý±<Þó(}p¾UÁa[þ+sê4l«oÿy÷×Wïî:œv‘³æ7ˆí±~ƒâ4‰2kð$ŠeªïöPšé oîχ‚Èíb‚zÇ#ÿB¢`-=]+SQš9ØžV 7‚3ÛO©ÈÂ>‚ó ¯vÈq‹GÞ"¯ÚšÁà |PXPó\ueøætBjÛ5p”onCgtPxÊ›®Üœ«¼‘ïÖð—×@ªoB¥ÒHgp|ÊD >È-Ž›ùl‹-pM;ÚÉhüt÷>L#ä¯~ØñØ#qøÜp¯â™›¼*pn‹–[4™×É4îÄ_e€bY6ù‘ ÈLÙÉ¢Ý^sÖ!d[6Ŧ«éûbù0þ.ü z˜]Âb-wvusÀ/ÒYðþ6Ö7O¹íò㦪t–ŒTᢠ ‘„ø«¢¢2ÅÆ,eE)CX.ÍËEqÖãkâä£,É&ÒD_QóÆí‰N°Ø”»GÉ[Ùœ›NX ÇüPôß/4¿;75ƒÚG’¸´T]É‹IJ´ŽB=—’ ß­_ð[ó¡{¬;n€@F%Ç…ø•ÈFªa*ì+í–ä‡Eĺ¼â~~Ürc_|ηpYáaÑnr93vBmñé ,"Ù46ƒQßË_‰W0<È Œ±¥`}êÊúØrgUÙµÒ‘É£¶ƒ›¨2.Ç»­®k¨9,û—+üM$zëT¤“NÜž7<8X9ÇÜáT¡‘s8½c(}46ÀCÛ ‰ 5ÿnêxÁs§4·øKz!;ˆ¢#Ê@€BEÚƒd=È̪4Ie£Ë]5‘Àp«K› ̓ ¤ó0`ŽM²°clKF¾;p,Û-ë–»`Ú!ÜðÎO,;qò›Ÿ•±ŸßiúIùç»ï¿Y#8s‘†@j" °ž1nÏb8ì‹@«ò(àz·ên´ž:Šã‚¬Ýnms‹]õˆh…Vc#ëËþî‰jùÔQ l™Ú‘¦85E+n8G=A3«*섣˔}ž›*JÒ›~X–$”’”»ìTp_²ý¬Ñì+ù²x}:³]Q‡*–?'ShG3×28^ò@ ììaß!Ò÷ü­$öXT›¼cL‡Å4EÓrg×ÔiͱõWÌU”ºdá«‚r ; .Ûr‹ÕxìqN‚­õ6v´Ê³a9 œñ·>VÜ:55UüKªÐæ5ÿVE·?ÛÇàø¹tÕ‚yÒœ¦¸ÏÙ"ç,TUÒ()tª)72À5÷Ø šÎ@šU2—`Nf1Ö™#+¯3‹;áϤ¨ ƒRTxy8Û2ïŠJ†¤¬¿«YˆBDEb›¶cè¶¼/»oW«Ìmêšã1$|‚8©¼ânT"Å>‰?ò9GÎt÷Ã]¤° Hf¦H¹T„Ïäò†’rÉ™Õ>U°å6—ñ‰‹²aY4XcðûÔ- >rælñ¤ž#¹4á<Òøþ,;Ìšh°½À;SùÞY¼p"–n0}Ãs¸Ëбì5C³‡Ç†ÌX g-ÒA¾ë¸©FäQh* Á©¢ë1£ÆÖ‹»âÈk”‚1œvðòˆ¶*ã#Dh¯^z˜„Òƒ§žÖë0™rðhMª¬’QáŸ*5ê_yxß׊¥·©‡<]û$x(»=ðbŒú¢/Ø÷k”ÿæ'‘—M#FΓ7h(H• **â|–E{¶ ‚ÒH4‹!až»†¡üI‘ÕPþÄS1ÝÏ ¨£^VüÞýôãÚé m™­¬— ã¿Ž“è¹7ï«AžM¢T ^ò5ЦtÿƒµåÚÚiäPÅÈYSž¶§þ–¼¸žsÓ°<—ryñéœKi&4ÞDÉ"¡£›XãÓI‘:«LHìT|Ãíþ ¹›füXN3XؽÄrcQøþŠrÜ,wzÙåŽ/{vÅU¡2–ë —8l «LÇëõòº’¦OÅÿøi):ç¶Ý¨éSºÙmΛ ! |Tj® IôXÄžøI’r«Ä«O*¿HS–ΰío¹#g%2Lîc°ó°/ù Ž»hFéW†ïk¾ÀÈäËáWnnÀ_&&­Ãa 0µ]Ùf1yÍá`ÄaµÜÆbcŸnœ! ä[ÐqlÊÂø†˜ElÚËÁÈTZ ]ÇšJmd¼¾ŽyÞšWGFíœÖùÍ:B¶øp€Ÿ­(ð2}¡ž ›Î"¥æ#sFëxÂh­°ÃÐ>ˆ±qð.xªÇE:îß;Ä õr^ Œ‚ùŒ…œ m.¹£D™+,äïZîþe—;]iÒž]Î~±…¼r¹âúåØD^â±1ÓÛ±kM$¬&ÏiÔ\AÙbA&˜ØE&D™”²ËR©ñ&’+Œ±yÍøŠ€ß!„ó·88{;ÐbÐ+w088{ÏK/ö²sƒ…”D ­xeCHû~éÌšÝâöÒÛ°Ù5’:½v“ÄP"¹7ÿžì)Êùp?¾øæ„½·ƒÐXœ2@š‚ë„Vó¯x U±;Øê)ŽØj> stream xÚ­koãÆñûý ;µ6$—Ïú!¹4èE[ Š" ZZYÄQ¢ÊÇ9î¯ï¼–\R¤M§Öîpvvö1ïõo<øóo’à&IµJur³;½óúù/­- lŒïîß}óCäßøžÊ¼Ì¿¹?¸$î÷7?m>óKkêÛ­Öz}¸Ý†a´ùt¾ ÒÍüW}.Îü€É¦»õ7§}ñoÏ×·Û õ;Ô·?ßÿåÝŸî{>¢ RQ¨_aÖb­à8ˆ•…Ìñ¯8 .’Vžª„pî€ÁÙÞîüÔÅC˜:²#Ei|\zFÍ@FŒØˆµ uhG¼¿t/Ü´Gsžå'R™Î¦Í C¥ÃØ">e |gÞ¦;ïMÝ´ùyÏýö˜·ÜzÀ}ßTí‘»…?rÉúa Ò´gŽ+Ä%Î0ÀNø©Eìç›' Ëò“tL5x*ì"ÝlC*Á%õµòa}Ýá=;æu¾Ã‹ÈÄôhR –Xb¼3»ª6sG±JƒÁÈ›½.‰ ’þ¾ü2KG%A?å{ „÷Ã7Eÿ]cö9óï¥Ìw†›ÕqÝÔØ›CÞ•­|= t‘=?óTØÏ®–øKgøk+ËÕ¾Øå­™0ráËÓmQ{fél´g¦#9›áà`@ اۭ¿ÉK¡‚4EË0܉ ‡Qô±;™X)ùÛ—Û("iLd›ï:;úÀ¿2:ÞìªÓ‰î#}m8/ýÀr’$K àÜH<¸Áÿ¥øJ‡‰ S=¾ÒKj!@ùIÖ©/Š&j!Öcµ‡V-ÀÚ6íAC<*8±\†MO a¸£ˆooÊžÁˆòl©¾*¢ZÊóÒu2 šÓWA8Þ²=¸rø‚ó3P,ýáÜñÙó6éÐ.jN· åðí¸]UVçY}–Â!‡oÓ+Öêdu~ùV±NVèÛñò_MnQàÕŒ1åoŸP7%ìÞˆ;þ¦:-ƒIÀ/è7ùDÚ • d]‚€ *‘†ÑôX¤¼aÛ¶ûYÖ}F#ÃyÑ=ÐPY/Ûöë’{\$É…«È]¾.wç¯ÁÝpf=9’¢Å3Ö‰Ò^/@ÛbýªÁƒMunëTÏ#qsM(“Ú4¢È@eY¯4oÛºxèÐÒaWT%´Úü3:¬/Ú†½)F½Ð[#Q1S_ÀÊ—"M¡3M¾¬Ó ¼ñØKÇ£µ¸[yÆ£’¤õýôýÀ˜Þü­&sùÃm fº>åíÏw ¹ÀÎå†;A8å9Ì2S¹,_»ß‚ô ¯R®z A9gqÕ丕£ÆÔÑ&¯á)¨j‘±$ò7÷G!ÑsÝ0ˆô¯xg?N/yF¡§Òèm:ŽÉÈwkÚ™õí‹G'Œ€âÀJ1»Q À˜Ž¶h²û´{Ö½ðK‚Ðyí`’o²$LN\¥%íå«È ÞdQ˜Ú°=Ú½Õø …³;ïÚ.g'›Ðóú³¬‡Ë ßA&†·‘o^ î’\{æ®Ì䪌¿ ’·ùöÇŸˆÅOü¡1-8 !äéX0%†÷äÉ×Ìë=ƒ?2ð€ìÕ|äø ´…Ý®¢¡µÎú¸4K¿¯µi»ú, Èyž3môÿkêJ®X©(JÆw¬WãèO¡Šôá²+~ Pc ] ÌÂËC@ó:ó¢ ¢à­f]ûÉÒMþ÷šõµä̺ ì[ߨ_ð4 ñ «MÈž(IDrákG. óXç—#G‚8ïÕÅõÑOÑi¹ÍZ†Ot²ÊôDù¢ ¹4uvM`,OØ(‹OŸÑ“):]i$;ÐgÙË4\ÙqG:²½2êÙñF"^4´ºÑqˆAtÐb§€Eú$:Ô)‰z)qM’N#ÊS’ê@)À…Œ@EV½)J¶¸ø…³ï Ž‘„CÀ‰<‡@ÁF ˆîQ±Qu ìXci]àdÚªžâ99 v¿x<;¨‹6ûlóadyvde½OŠàKm0âú{tÚØèW„ó›¬é,–yË6—s8Å3 ÉÝÉ`òS\, ûXœstežÒ10 8!Ç”:{×°—óÏ‚ò>Èí/RŸŽÈÉÝÉ|YFÊ#S8Çüd¸…k…‰KòÈ»E’D¼b$;ú„¡=C ±ÎVzm’ðó®²óTœðáPƒK@óŸ./ÉMKÀ*dtÝ•2:/›Jp¹”…iæÖ[X…ô$vNEÓ|î–Dþ –Å®hËgÖR)Í·@TXÎht€‰øA•¨°öXWÝãÑvĦcu…N@]Pn°3¸.¢?¯i'5%êPMìŒ(y{u½IðcSaY:¯°Ñó `wê+&À´£ð‘¸°u€+ݘYöFÁìK‰/ˆ3†ÄyþpƸ§,Ÿy ¸O'–ä%Ùä*]à—K-É- Eµ‘dW‰9ÞS׬¾áb˜¦`êÃlÂ.UéX;’‹.‚C4ì(<ãvs q(0OÜhíȆ¶Y ¯:ý–%(¨òn^Ž-…ª,«'ŠiÆçÓCU æÈѶŸL6pÛMmÎíÌ%3f™iŸ*nXÞYÞ rèWsâöSŽ>-öH’?ØyÀ×àÂÒDß[ Šh0²äŸ_ïÞÏpw?XZ¥µ/•}û«É÷ýf]ØrϨûÇ$þð: 1!‹$¶s øĺÅo“;±w·TÚ‘Én˜Y~~¤#g®EСT–,m3¹vÖºÈù°iqg*ÞÏfk¯eàŸUŸa$6„ãö¬‚J1õ½&8ò(Ú“XjlsTÂ_H[•ûÙL¬¯Öé›PùÚ)TQ:èçÉÑ<’ØÚNi&ýYbç*ãŽ4KÛfÜYQa’ÛŸ„46 ú6ãêMüÕ¹lv*oH@“Õ˜[´÷1Md9bÐ.ã,yëN öðS[œöÔ{^Jºùâ@ÄeD? &ŒC®˜9„Çe·œôm Ú'G½9?Qi<É/ˆ"0£ÒS ÁFÕ]¤fÄ.J<8˜äÝD®ßŽŸ¹à׿”g³Ÿì3‡DólˆJ¼)”Q³%‘«ÚéÛY7-v«½Øå‹'Q‘Nñ8/€nM¦q:ØàlôŠÉºƒðÝõ€a´‰˜¤89^`“Ø I.L/–0’ÈêW*ÑCMžÅ*[Q{ŠŸøõ}NA6† ¼û¦OKIÖ9‚“ˆ§r8TÛSG_ë™(Â8¬¦2fo¯°ÛÛ+8‘‹3V‹³$ûKâƒÚäMuÎJs7¥ƒGhëÔøóÃê \2™•®ÐƒÛ”L–Ͼý™ò“éæž2ÑìÅB_{ñJ°ð'îSyIÛX‚üì:iÅ"¸ñ®0v?‰¤ÌÆ‘¥NFþ:Ïil£ÂÇ)æ˜ÕÝ7v¨u®r¯f“É©š…þ™8ļa{!ã»Ò¾*“ø„SKi'•¥/8ôä¹n[u7çÚg±J‡¿£¶Ç ÁßevUW7¨ïÂh°Çø!ošî$í£©mØËT$×1(rX¯k(Âìkâƒó3غJ!!žPCÝÅDZ$))›ë˜l?½ßÃ8°÷N¥ 4ÜÅìjY|v\í'Þ2ü‰“¶Á³>wî ÜÉubRÅ©Õ~’ʆŽ‹=Í&2kŒd”LÄ.YTX8}Á…q¿#OÞïR†%ƒÌÙTP# ;z7ýŽ:—è[k³Á4òMÓPÚ &™nÀá¶;ç¾h0{ÛÍ‘1ÅÂØ"øþ–?E·KgÒc†Q y;y†ªS¯gøNB×–±[Ia7ÜådDÀF‡å;p…{{“Ú:yê»O]Àá†ÑȰ½ fs!‚&S3%o3,·x-ñ½ìÌ:ÿ\õ4qKpYIÆËJ¼>%ŒmÇuÁî1¿\lF™g¼\g=ÇâðÌ:³djw"&[Þçhy0¨íƒAí>ÄμVJcÇñ[ ®uIÙCtíƒÁµä¯ñXk;.+m‡ç/ò –àͦèEro·EžuËÒ“¬#Äþ[µœÆiQ¹%yèrb%‘ê¡NSÉ™L¾YUI^/BŒE§ƒ‘.8÷üôÐNŸÉ`Y=/ùJNsâ1ô²èÅÓAèònAGįºytXÜÑ©~¦¼(öøå‘Á,‡€Å1‚®b w Ç8`TÆO×b1zPö1âÿ4!{ endstream endobj 317 0 obj << /Length 1845 /Filter /FlateDecode >> stream xÚ½YmoÛF þÞ_a ¦ õí^%9X‡µÝlا6@¬¦ÚçX«ly’Ü´ÿ~ä‘zs¤&)º¦@tâ‘<’¤RµðO-½HR#R“,ÖûG’©ï)^-a9àx~õè»_œZ()Vr¥WÛ¡Š«ÍâÏèÅ.;6¾ºXc"wy±´ÖE¿.t½Ç_å»üpM»@L¢Ó…Šö›üTæb©S ÜÖ^üuõÛ£Ÿ¯:;œvÂYs‡±-×=,ֱΒůwYƒ©è ò´ÞeÉ¢£:Ë7´—uI4ÿáXdù¡fù²¤­fÇš²êú´÷! m•[ÚéXÊc“—Úü›õÐf£b±2àf°x¹fž‘_J ë\Ëó i®w婨æƒ'w*ÚZ—€&Ë>¼ðk”(+VÖ‚ŠXX“’Š«àò*í]†õ¤Ë±©Œ;—ÿ˜uÙ]mëŒÕ¾Å„Šø¼Sí7´jJzV¾nª|Ý0µ5l]îY•×åXKƒ¡» ñF ìb |E Õã2Vè+ˆ1ó_WåéÈØR¨ÓDhiÇ‘æ¸B —Ö8ˆZŽºe܇M:pàßS^ÐNVµK·$¤Rˆ¡Êמ(!t ¾•uÞä]¦9§dõ×!U€ÿý…5ÅÉó!€‘ŠØOYQ|$ú?§ºa{Ê)É.’‡SG»ÕÙÑ@ï§=þf$*ŠÓ’S XÎ.PjÒî×y$ZíZˆa{pvyx#¬á—"¦àé˜[(ZP,¦.èʈDë6'¨iÛíTÎZ+¤ì®ò` Y`M Î.\È$g£üúWý–IôÒïý(ÄÓP +O‹¡é–=³!àQäfË*^p¬C.W€[Ö„å†vë&«šñÄú ±EžrO/Ý¡…ß²»ì°LÃT`7Ù(!$…媫28¸ö~Ã=ÃbDÚ{˜UÁ3â:j£*¿ÞuuÖî*E6=Ï›DǬ¦raù6Û™"¥´éÊ=´JÙ¶JÁY!¬D»É›3"+~x‚áÃþ’¯ÑÊí†$ ›f)¨{Á‹M!1@פáZ¯„LV­Qêò~T—ŸTk„IT+¡ï£K\:£`³}ø„‘ƒèÒmrR8eÆiVù-ô& ¥á›Õvi `œ OÄ~ ‡² 4ܯB¬*ðPšÆž³]‡t~Båb:H±Ö&÷ˆÒ(if­6¼žÕ=¶'cŸk-ªˆŽ^c®…XéÄÀ©jTùFÉ.id˜tÇiaVÃ(¨.¡]ôs,dØNlüRøv”© rYÇ Õ E!öNÉ5ö››98× ` #,¨þr-YÆ0]Ú³†ý &Ÿ"«À£ÔDO¨üä[z~ sï‰J•®Ã J‘…m‘'Z3 ‰¶¡,î¹€í'2Hðup¶égZžrÛ³ NGg:‡À›ià­QpÉâå1‡ÐÂx)uÌÉø¹ ƒªnf2I)üfìrø÷¼nÔ¯±‰GÌt_Ph,nÐ&k²©#— ðT©'ÿ·8Ô†Y]AŠ i%é½N„eß²¬fYÍ2ýs^vͲ†e ËôÏÛ#<‹nXÔ²¨e‘þ9¬gYDzŽeúçr¹.¦›­Úê!¾zßä ßn®œ…2h7lÏŠ[` P-˜BâÒ%.zÖ“ä`_n¸RèZ¨š¬éyO’ƒm|™ˆw‡«0-ÒBVõ¢'ÉÁ6¾L¨êp¶E^H˪~êIr°/·ýëP®Í!kú¹'ÉÁ6¾Là·ä :Bð;œ!Yžš#þÉ©á×í'Rge¡Ï¯Îësà‡žäÕ¥Zê!É@´´×Ôe<Ò—nÉ$ª7Ýr:5ìv«³ÜÌëÉ„4ð©u:¾!˳Ÿ)T?F;büãËÌïŸ>¥kªî’h“òéÓXBL%ô´ùìm]'ü¸ 5 ªð›—íq3ÿø¥zBÔ—¾Èšüý}¥î2Ù=ØIsÛIùżԟååä]¿Üzn=áÔPàÚX &¹g ôÿ·ž‡û.'Ím'å—óòkÁÝúeæÑ6Ó¡3ópcùü@˜/÷m“݃4·”_Î˯ ·‡ÛNGÂÎÞÿCæ?#C.¡ endstream endobj 323 0 obj << /Length 3185 /Filter /FlateDecode >> stream xÚ½Zëܶÿî¿â£°±Tñ¥‡Ñ+šuš¢õ‡ö MT·Ë½¼+]$­ùë;R¯ãún£6pK‘93œÇo†)ü¹¼È •*¿Øž¥®÷í3áZ1Lˆg3þ|ýì÷¯¸iR¦¥¸¸ÞÍ—¸Þ^ü}{Wݶ»Œ•R‘yukm¢ï›KYDïðOû¶nny:óèx)¢Ã¶þ)ê2–E ³µ¹üùúoÏþr=Òa¤IŒVëg=¤XÎ)iš@w–¤F3Ѻė£onúv,?Ù®k;n^ñNÒñŸÅKîý§ÝWCýîä[bùòôÆB%DIû?®A$Yn¢ç¯Ìe, ´þpåw]¼ñðå^¸ºúãH¦íòY\ÊÏâR†öWÿ‚|™‘/½„ ‹nzC®%úða¾øq?$ٜͤzÈdúå¸üÇ F¥R·ÿ×_ ¤¦&^×{·ÐW¯ûA|ÅÛz·³]Ï»®=¸Ör¶ü _»p`Ä ‰Dé’÷{sýˆ2&Ú‡[YÔN¼ vþ×­ºt ÐÎ :Z‘ˆ í›g*óÓ^ðÚÃå¥a;m÷Ûž»ëf5|~.jûz¨ÛÆMBåR™ˆ$?VÍ–çf‹çGé—Ê$²XÐ/ýx¨±Nœ©^ê1%”{Gè‡LÁ F¦D~d&`n–@TP9Fzîj÷Æ{Œ†‰ÜQd‘E·5a(<šèÆY Y5€qrñœÆfÉëš-ý ¶$€/1×s$ ¥¬›e‚éÄp¨¯?  `j²×_Thö¼ƒ?çŽÖcÅ,ÚÁdôˆ$9 çZùÂnoX©ÉÆ{€=yåœåö¦j¸ÑÙƒWp.-w‘Âù`ªíÑ=T<ç¾³¸æVf¡“RëeTú†|VÇ„„ù·ƒFo-¹¯Çs7nfãl•vSï>rOÅ?]ÕÜZn²'3ó°½7£Í¢cÏ6-2ï:³¨i‡ }5?yí)†­Ê¹Å‚–är4ý8´ Î(F iL–”“8q¼¿³u“Í|²ð>M?„Ö21j$ A` FÊOÒöM†Ð±:ÿ‰Ñÿ‚EG䦎üËÊG§á9=x¼ƒúq¤íÜTg¡fÂ&ØVÙ´H ¹û?`™±ÐÃ/„qFÖ^‡ ;ü® ZNP úé à7Ènþ5{ ‰}³gà0S‚0+¾È³ø@¿ãZ#ßÊ!cuÊÕ ¬•Ÿt>E4ä ›þE,W ,s—Ô Úg¾@©…ŠeNŲH0/mC :+à+ÕŽ+èzî*ÜM¢YÉþ%› üpÑ "¥fJJ®îH´RÌ¢-æpvLBý˜‹ÖRLª¶Û*MD1-NÃÂE•äYöì>%μZØ/B¦?UfP¡tÊF+åd7ØFŽÞ“O\q¦8“Ïuýs9±FƒMi¹Š§3aâ¸ÆóÎeŸ“D%¡mÖr*w5áºS™=Å‚AªrœhOŒ«>Ánwüj;—õz‹Ò΢|H)ŠDÉUåõ»–Ýz)£›jƒL¼å' ž“°ju¸ß»·ûI˜éD”ÅgÔÕ`m.ZZIPGynÅŠÀl61ïþ8Ìý݉ŠS!ª3@‰ZX¡,f,FX0yP˜ <Œu¢c¼'“%UÚM¨¢ßJú$öyéž{;ð˱Ú?±œïJE”Z°yPvÊ–ÙFPð%do“£8Cƒ0qÉÅ¢²Í]Šj—¡0WÒŽ‘Ö1OY^7«©ë2,x'²*—Jì²J“dœ €ž^›O©]ž«ôè Iôm­/— Ç®±[~ºAÜÿqtZܸïÚÛ®:,kj“뻳”²ÁXÝO>h°à·äR/®}Pb8è\tu »#p‰= ©ô¢ü$OÔ„´?-÷Ÿ' ´3–;|Yêþúe—Û=YH dr¬ k$D£qáë'Ðé£-Ï£‡)3xRmœmJ爥\b—=Ç\œêÁŒ×®;‡o%š…ÇE­ÔiÉA U ºßoºÚ%A[ÝW°ÃËõg ,…èRšÄ”’>[€ p² ˜}¼àçÆ³ÉÏ-ÖK.¿¹@R ¦òGpÑÐùgŒ[@ë}…c3éšR°;@JbAéÃ,ü¬Gh\/æÁW–«è[Š,Pô°HNØv!7˜2Ú'Ù.¯K'|rYˆü&‚ ¯Wm¬uËήx;­ ‘d¦X׊o‡ÙÍ89ôêkøWœŸÅœWDÎWvXRéf¾•ëùê”ÁöT³+H¾¨Yu6­[ï¾³»%W·ººœê÷r}뻫ð½‡ÈGwØ×·ó#_.‘ÿAgð”–™‘ûFN¯¼ )ƒ2¥x–N5¾žŸƒÆ‘M3P¶âê¹^à SúoÊ“æ§'®ã¸}g»wµ}´¶<‘¹ZÀ·,suWƒW°õ¨usN‘Qú$Å!FI#ܬ`© A¡9¯l*f8;âK”ÙÂø=’¡rä§-̯éü¨‰w.è%?^qˆ‘)*}—Uœú¤G$ù (ÌOê*Kƒä‹ßT}€2ÇÍÀ¾$~jó"K²©¶Ôþ#H@Õ s‚45w/r^ÎÅ‘Ûn ÿÚ®c endstream endobj 327 0 obj << /Length 2929 /Filter /FlateDecode >> stream xÚ¥Z[o%· ~ß_á··öD÷Ë-M›`‘<ÔAšœ#û |ÎŒ3—µ(òÛKŠÒœ¯Üu¶XÀCIÔ…E~äY~Áà¿°âÂ:Y;i/v§7,õ޿ቺ†ëÇŸnÞ|õæœÕžy~qs»^âfñÏêχæa Ãåµ”²2ï.¯•ÒÕßÃ1즶»£îcÛ…‘ȦÛ#¡ªŸWá¸OÝ·}Za:ßõ§‡fh/y,¼ê;øk„R•2—ÿºùîÍ_n–Sk¡k­ägDË\ŸÈq[ ®U–O˜ša å3—×ÚÈDV-Y$b%´H" H" ’D#ˆ<×+»¸¾æ–Ó¶7—NVý]€Ù°Ž0ªzl§QqEatõáR¸* c‹ÚÁ]?ÑHKßϧ} “ÔlGíö {êIkªêaèï†æ”Ž(ÖG”LÕVk8jnŠ3Ô2%·^ÁÝ#AÍÌã…0¶6F´]âÒGÀkéÄÚ_ˆ¢¿€“žýEtîì(€[mbލA¬Ì=ÎíÔü n«X-9ÏœÍÄ<\ù Þ:úHŒàÊG‚_ à@d‚tô(¦ÄÛAP‹Åýõ´²#À‘¢#ˆ#éÑ]sÀÒÙÍÕ' ÉjÀ/<Úìò£¿ˆgâ„i>NmŒØE‚¯üŸŽÄ¿äHcÂ+­™ãŒ½æ‰ƒÃñà÷ðhÊOüÙ“åÀŽ5ìÃá-þ±æŒ×F Þ‡Dy…UÞF9°òåCÿ®Ÿ¨fΪCƒãP™zÒ½ÅËÞþg´É°ÏƒÀø‘èy$ÄLd@Ü6§~i0@ß½M[6Ç»~DrºÂ¶>_ëUAÕw-Á‚< ůþTœÒ=C¨®Ýãš’Â\­ùòð(ØiŒt‘^«6ëǀ͊ñPt¦ÅþmThq(žJ¹Z9Ÿ7}*K×V,/<Haõ<:[öÌ/k éèŸ*&ñÅËŠoMX% °CÊø®ãžMéôÚÕàÞÏ:ÏìÝ蚥ŽßÑç'¦ÙÓW þ>½Zè,‚&xx5„5–6¼úGDgx0r+º!$‚=®êzl·á‘ÖŒÊÂBŸUÉ``t×$äš±Í3Q×wóWŒšÅƒ,1IeUð‰@ ·£”áùK€Ma9³k—I„¾+_þ.é=•û ƒÁ34t;±ø{W2§ ´Œ<Ý~¹.y.Kfƒ“ÄØß~RØÌæ¦rð'C£WÍاڂЯ;¬Ša`H•¸a¢Ž¿~ÿ#óˆèE‰KÅq¾» cb§: rµ©í¿´n?Žm4ÈÜÓ·™§þëh8‘;öŸµ‹,4œa)Á& õ.a­ï1šÒñH­ûŽ‚G Rµ® cºu•ñš}Ñ•ØZ³\œóÌgX¥æV-)a(®ÄmÍÏÉèV°É)­UÃ+ð°ðÊþ¥;Ù5c’µè9î}†mQŒh×™ gÏb´¬þC#cذÂ7û9fkÇ·Ùà[þ«$®‡·4ýÔ|ÿ’¶~ã„ÑíÀ¬¯acÕ/3&¶º§f¬°òêØt 7KÆS–ËrZÃxö’@=z"öéÛE «ÝŸÑ(tg@Hë$^°ùréÙÔF™Ï…óσìÇý&£x—P+Ö¥y1CχZ‡–²;å×Ð kµFapç ÑiL>•œ†z¡®ÊìcÄ„UåÏAQÐÆT«ˆ†§RÐÃ0¤EÕ5§+I sTT~]{Y5ò~å€@Á­mÔ²À%/¶p Ú.ù„‘(¤ˆ‘Ü**•„ ¬HÄy=}¿"Â…:êz œù>M«âyܰöD¢pDA4Ð/;غM»­N·h/ž½ …ÍWó*ý"éAu~$:nº*[ãÐRh¾¬Bx<0á…ŒTeÆ“ÈCxÁÛê›ÍO*8 ¶‹h8g¾F ‡ñ0´t¡yëø°ÏGå«äéy$.ÿP³¥þÿþ•vzEŽŠê6—¯è.£gLfs?fOI¸X¼XcþÿZø”©CYùÕõÞORBü@8ùu нàL¬®…0_rG\q$¬NPù*%C,Äž ü6#a>¿ê‰ÜÿR<[OÈ?§ÌF|BD“Ý‘­²¨)ÿZˆ€Á1ó.âoWzÁ.HŸBƒU¡R‰ ºÊšpõ®˜P¿uB½ù™ vŠ?¼ébå@˜Œ3q–ŒMò"Hî_›DøH؈ñ—܈Ø:ðoÇã¢, ¸‰—P›ž '” ä_–E,†4åE}®¢¼^ ÍÖµÍØnb"Í¢»o¢clý-}2†L3Ú4c9{RT¤RWŒÂSýÀÆúAÈ“ *‡n<×Iõt°š³ÚŠ,fQį¥ÅôºhÆûÿÃ8yPY endstream endobj 331 0 obj << /Length 3239 /Filter /FlateDecode >> stream xÚÍÙŽÛÈñÝ_1À>XXöÅcˆ÷&0° ’ áH”E,E*$åÙYìǧ.ž¢lN‡@€Ø««ªënê»~ú.2wQlUl£»ÝéM £¿¼ÑÒÚ‚íhÅûÇ7øÉë;¨$HôÝãa âq÷·Í÷ÇôÜfõýÖZ» ¿½ß:ç7³"Ûµyù‰‡‹¼Ìn¦ånó÷@»¬ØËð¡í1ãù]u:§u~¯7°DoªþCãÜÆE÷ÿxüÓ›{¬½ñÊ;ûÒºU+è3¡ ¼cúÚ ðÑnÓœï·&Þd»üðÂ#H·Òý¾Îš&koãÍã1my&oøù|ï¦÷&ÚÈËüؼ}¶çN·U~:Ù)+ñ‰ÍG“8åºÅrß¿eé„çU¬ãnå;Ü Þ<ó? úEQa÷¹ãá7Õp¿Móßm­ ”u Ú* »0{ð¼Lâ7Mz’°âR´ÜNy>÷h›ÏÈYûœ·Gn €ˆüš; 'ìük‘^«0‰®xAÒ´}baÒÒÍø©ÞŠôÙNL›VóÌw<òFت“øv»¾e9 "&À¡Pi›ðÜãQv=eiÙ«Du˜È;(FýéBgmZA뜂Líe]5[_Û¼*eå ÎÄÊYÛá¼X"D+ç{Izûî ð´Q‘ñ=¸ì&8?'J®µ*±Üfš -of<9T$£É@ÛQ~‹D ˜‰ {§ÜLŒ³¢X¤9†Õ«-QÆôÁ*d6ç:ç#ånö™Ð¨É ây½ç™Î˜ˆdÀÈ"ãöòy8@®Û°¸%©&V¡ Çœ#Ø>`®éN’¾°QèU»ägÛ 6“¬}ÓQ-T5mvL47mZ“Ëà32FÙ°36 õPW'<͘A8—“ê¦åѪ̸ѓG£B._æ#ˆC¨£z2¦A_Ó7AŽm^ö)/KE ‰Å)Ò\œ•{² ØFc˜—3 ­øã@#1H‡à¤¢™5f|ª¦ÉŸŠ¶dy¹+.M΂‡C~tú0ߟ¾õ·Ä,T`}WèýT?=³'š¿õ¶z$Ø‚”`*Q9Ò}'×B1;“k„†´÷99š´-ãñìhWíúw2ÊÐ1a½Ñ;ŒeÄ«tÈ<~êBXìpLÛ¹7!ªêöÎäå>#Þàžeó/Üa;w…W*ïx†„áé¬]N‘ðÊ'fóx[Ò+xìéiÐÏ6<ÒSƒ:NldqRÜðÂ}ÖGx±7Žñ­Ëå¢Á7þ´Î8ÆÐÁÀ™|—¶Ùdg;¥M9ÌÖôÎg…,ä#1ñ,ÆÁMòAÞˆNM—1æ*<:Ùº‹4Cèëa¤#ùÃ:’Eɘdåp ¹"Ñ9ðT_‘½:éé© ó™Â8_Ý™¦lOÛaW9bV+  Â)Û–cV õú€(ÔÌx6Y+„Fˆç–°ÏùhèùH–‘–¤þ»^¥!4"¯óéC—Vû.iF•€S~0¦o‘a<ìÝK9´—©+hFRþqÝ‘8>h Ƕ“Âö ÚN}Ã4ãÆ¨‰Ì=hx¸±,@gŸù)oÁ H¥VXbN=°æ8¢9o|ý¢Ï)º=ʬÛÄœ8G”8CÀ²“Ê„°œqÓ#Ʋ6ÆV9ׇ OEZþ²è¼™}t±*Tñ´érÈš(gúÔC@”³&a4•ù2{¦„dªä\¯ý}ôæ6lØinUÉP±¸œöùá°b€ &ãÈj\F'M´¬º\eÍ͹ÈÛI°ˆ.é|i¯êSb«.$a§¤Ä>¡²dV¯òûh”GEîFZ&+´hb6";ˆ“™o†+ö8éÏ "äêS™ÿF$®œÂ6én—[m;²¸°ƒCY³KÏ]¼ƒMöï †ãòÊ2šÆ‡à‹¢G¨Ÿ‡5_-t8 Öɾª€ðÕ:Çþðê:‡ûBc8þÝ ¸½ÜEÊúdõ’º%`M±^†ð~À¨|OÕØ¤3ðÐ`É`áLÄlŽç¥,!Ó£Ê,̉án¹¬‚M^׿ŽööÝó`Ú5†ÙüWL^qlH^»(~°öWy*X #É@õ¶Ï‘nž_†/î™É×Ë?éoW—S¹(IDÕ†Ùy>«¦/GKÁ±ubr@IŽ\w’Tæ˜ÕÙ·K¸m ˜ØEÓ£D7í7¿ßc¾ê±4,]|h¥§ÓZ14Á‡ôhŸÒóE¸ hž[̶z!¸~?ìŠP¦Xe¦X¥ÃÙ†Nî +7[d`•q‹X™ Vb ¾Ÿ ñ0C ²¢)ZV™ùŽ ø—+´’Ù" «l²ˆ–]B뇷þˆP–æ…¬y®sþ0õoö–OêP‰ŠÂÙå¸\JYöÆÆP9Ç‹;•Íæ¯T½ðŒÔ°Ãþv† KTbÁÑTV]š–.ÛpaJHw%ÔíÔ ÛâèhÇà ¡Qamª`_/¨ý¼*5Ú&΋ßö`èPƒq~ëÍ) Nôù-vOlp~‹-Èo©ÈÞ3†¦ÉÄõy.ítXNï ´íš~ˆÒ«`Ÿß"èåü˜“ØWÝ¿¾“^tØ×4W¦¼Îr‘©ƒ[…CÛWf¼Û0 !>ŒÁf× šD”Òܮĉ››×¹±UáýýßXgjÞšöÄ‹O|¾íòaO\˜œÓ“¸Ê‡#—.AÒv©h«:ÿ­â"WZH•,};ª²¤‡þ‹®ÑÅA é“ Ù²ä&¸Å}Ú ø’ãˆ,&=ä2hé W1¾ì6úq(jÄñ&§Ë“®Î‹ã¬Òî–EŠ#qLµæ8æjs_*— qøíǪâ&’K²VJ°BÕêklz´‡©/|Íëázæ/+o¤âÍ‘.÷>>”qG¡ž‹å>[þ(M%Ú¯¼S5QÏ…nxéÊê.ˆ7EÖ S ¬ä.·Û#y® !¿Ë#¿pN›–LB,W}4[ñ}’¼Î~7m^ÈX)!{í‡7ñy¼'çQÈ‚¦: _bØdöéÅp[jå,^/òÝàò_ÁàÍ?ÞÂ8"Õv«eÉ€t)|³‘'?¹tÝç“Ø¨€'Ò<×Õ§:=ÉkĽ% æÒûÚ¼õxì%¬®ž9J‘³¶Kî^ÊêÜäMÿiÇbéN+›¸•5í‘sº1ævé*²y9ûV¬Ì~•þ’¾bUݧ¥ÿ¯W endstream endobj 335 0 obj << /Length 2130 /Filter /FlateDecode >> stream xÚ½Y[oܺ~ϯð[µ@Ä#Þt)Їö$F·pã k (Ò•µ´W8Zi!iãcàüø/")™ëÝħE‹"GÃ!ç›o†\|•À?|•‘«,§(§ÙUµ—˜Þ_ÞaÓŠA ö$þr÷î§kޝp‚ФÀWw¾Š»íÕ—èç]yE¿Š)¥QöÇUÌÖíŠäÑ7ù§û¥nõh»D#ªq“,ÏHÄòÕ×»¿½ûxgçç„#Îè#'©–‚m8Cs6YJR”È7ii¶ŠyJ£õ GíŠb0þLæeÜ™FÁª©¿êä*&¨2‹ÞüëÓíçÍzcD‰/Ê8*r°§ˆ¥ZÜ-LâÝoq¼Íá·ø´¾‰~¨»Ö¨šíuL1J`}¾®®MœOú%¾7ßå3o2Ä`ýɧêÅ$ðõK,BjHŽRš~šá÷Qsýû¨¹ùq5¹¯g}ROö]z6çíY_чsè©úp^Õ‡7뿵QŽRbå¾Je8°Q„°jìK|œˆÈæ¤àvóñsh†huFÿ ÿ›>Ž!ò-^?ÿùî¯éëÎo«º°ÓÒ„1D‘ÝôëõÍÇ 4žpÉ_söxÚ‰~Š:¾zÎÒÀ´3À[<³ÆÕƒæâq'dƒEm¹º«{X ý;Á¬1ƒc§Ÿ½(·zô¡ïöH#‚¥°²‰} ÄŒdZƒD µõè{«UŒ£r¡}Ê ÂÌîÓ‚•gKã b¹•<ôµJ;ã ',õTîëGÝ#IWwvýOe»Õ½*MVƒJËq¿‚æ½ÌU0øF8Ž~î²÷¹¯wj*ÓSW¢Õ«]`âéfÝ"RÔÄ$cÑ§ÛøŸ«œFeß—ÚrùçYKmë¡jÊz/z$­R9U ¨ •ATݤª:±—$eˆ:ï¿¶™,G9æ¡Í”“uóÙY4Œ°Ž²ßšáãx8ކ事9=€/(!Ñp¼Ä(ÛnÐ×Ô­tSíŒlH¬ˆfkº%ÒBøÇœ¢ÂEÔÉàˆ&t’BZç9˜QuûC#F¡»å¸Ó-0/4%&ˆ‘KbÎK«€ÀccV&hÓ/µÆ^û^¾ói—¶u>êúg³Ÿ#YÒÌ6Ô…­Žh&!¦;ʪP’m‘©ÅLX·&‚ëVzJ5]€3K ÃA[XÕÊ Û÷3R Œî±/÷ú#Éæ;å¤98ˆØyщâÊ£»ÛÏwëÛO›Ð¶JÁ¥P”ä‚) 9_Ç÷Æú8¾uÛB­÷^ÛÇ`]?þ)Hç4‡ò Xfl|ª€øƒöSY`‰ûÍ„ö±;ÁàyÁ^—çpã[ËQù©Þ+ê$-ïNÁf ROè“4OlllÅCyl̈™fWªÒ¾îÌ| 7V„¸döjì²7>ÕS:O0”åó 2Qb]í* 6a­²cª0ÀØÅ¢ÝýÍ9Â99çî|éo°%Á3–×ÞNÒÓÞæ8=çí´ÈæÞ}ao'\{[N¨%yÔ”ƒ±Áìl"9»4}äÕ0;¬_,ÄVw8À×î; ‚lÈ(Øu+GL) ï Ýi·Ž5€¤iÌK· Ñš2cQ•L¤õ6L Ã(AP¤‰_¹^ʰ`J‚âS¨ (#g8´&xŽ ÐW·U/ö†¯žB=ƒ‘â±Õ-ùõiWJNZ¦üë}ís¼:8À‹ƒC*Ð<Êæ(l˜> ‰‡®_d…¥Õ^ {c¤_[¯>ÔÀxðjˆ0Ã'É0<Ô'>É^‰ù—‡¿eÌgI¾ˆùìŢ&æ3ÇŽá¡×”N6U§ïÐy|g/ã{Iò ãÅ·zW¹S7gìNŸï޳æÈð7Öï’ý^q{ÁÉÈ÷zÊù´ Á˜¦¯ÄtšžiB1}*¯§&¯§ÔI¦O‰·Éj¼4¦i²O©WsÂËXW¡!3|¯Ø÷“~Nú© Xðy> ø‰É_Ò½æzºäz6q½;Šo+…Žgý*êmY[„Lì®ür8+»Û“‹‚Q‘ò@9 JÎá#q3é½uŽ=³ÈÍOÁ³ªú2¢†ú¡%©_Hú¡G-ouz§-fܽ>g0¿0„1‡x$Àý$À_’äÿ3 l\n‡²/á 5\Àî> ¿¸OcË

}ï9Õû)Äìâø2w;£¦— µW²!÷JuŒQƒëä3›­ì/͸ïvùnÜ®ô8·Ï&4n—MãvÝ»"ÙÒíoôú “ÖãÔó8 {üíL~k]­¯œ\‡ =R ”òÀ4>}a<ç DÔo*'ýMXa.Äx¢Ý«ÙU¾JËqвCzVvXƒu·q¬yêkíÖ¹^U·ËT-»ÏüI<#Ì•K ÈÍ]L3¿¤Ïü’^Bº«®êAÞÊ·ºÕÏ^óûÙt¢Pú´²´/±©ü6¨üê ÖÄbŸcÁ*œB;_` -¥‹˜ÿÐMj£†ºŸ)eõ™‹\9Ú(T¨ü;üøb»˜§²—÷XCK¼; ³Ü}©ç’l¢,0…¬ÐF¸èû)ÑïÅ h­|/.‡q ’'þu»­«R—¦îŠÒüNü_^ž• endstream endobj 338 0 obj << /Length 1112 /Filter /FlateDecode >> stream xÚV[o¤6~ϯ˜·‚T\l0—J©”&½dµÚ]5#õ¡[©x‚µ žbHšßcûÀ )i¦ÕHãÛñ¹~ç3tÃnr¶É‹„I¾©ö1î~¹ 8‹@ :‘ø~{ñÍœnhLʸ¤›íîTŶÞü\7â0È>Œ’$ òoÃ(MypÛ…¬íŸþ¢ºÚÕF¶²ˆåE΂´ ß¾»øa;Û猞&o89Iá)ËHÌSïéÖ±S¡„Ä hu‘þÚ;Ezãp‰7Š¥Z’dóOWÛŸQjaœ¥„‚(õ•ÙD)%eÆ7Mqwô‹¬Uï’b-{»vž»>¤Þû…j=¢Ð ql¤?T]­*1ÈÚïŽiÚJo’ç$ƒ%¡¬87 Íœ†F¶‡µè8'´x]L2Ê08p×h 'ïåá4Êø…Óì¬ì¥1âáŸî–çºû8»û({£t·æñ²jè1ÍI^&ÿâ²C0*õ¶ãÞþߌí!Z¿#¨ÖÁž<÷ꡱ“Ïn”zu?³žmX$pwoüRtµ7øácôkX¤è{ál !˃ç×’óÉŠc|‹eyÛ!ƒ-û‡q/Q‘pؘèz‡«¹†B–—sºß¯¥—R’BŸÍéõªû¥ÍõRæ$Íù¬]ž­Ý! ´Ë?Gõr¶]TïÕ0Å<Ý9aîaÒJ¬J}ÆYÊH–-A-;qߺV+rL#Lj¹c;ø……èh„Uõ°W.pò9æñS£*{ÐØ­,¨tg¬_Ô5ˆñrªó£©D×ùêZkªmq¦_Ø—z¤w‹Ku(#Ödlœñ’’< v{iéÕ |?´Ï%X©ä´RVSF(2îÍ핽ðÓ‡wÛÛë»ÕÒ¦¤LS+ATo=¯Aƒü¥†‰þÄ0b³(ã‰üü²¯¹ðà¤Óý^´È•Ðlª¶ì]P/eKÂ8·!¡þ STh¶×=AîXqüʬ7ÉY>¡·÷µÚíÖr‘f¬L‚µöi7ào–°š¼8<œ Z²Ü@#­Ñ«$ð ›l~‡×˜‘8›EUÉÃ`¼V[Z3ÀrV0nÀ–f *æxqrUuf¢ö÷ô{‰Äʯߛì~üfp5»÷ÁJEXpŠPˆ‰Z ],òw~ç½ÛYƒaY‚æ'Sdx×~ÀŒ~h',xê•_úÕ:gÆ”°ôµ "@s?\¢kQ½{ !¸,%1D_.“d/ÈÃåÿˆ Þ øš£š §$/ØZÓ¹*ÚרMîY‰\b7&Þ„ùzà,&qq|›o^¥s~Jç Îuµeoo« ŒØ£UG;`Ñ›eB8eçôøVÒIØOÕä÷›±e9Ûl'º;ï¥m•îgÕ€ Tö¥çÉ º¬ýìÔy½Y2RθÌyNy’\«_yš¢ÿKüÿÜÕ endstream endobj 342 0 obj << /Length 980 /Filter /FlateDecode >> stream xÚµWKoã6¾çWÈ…"•CrøšmÑzÜz{i{Ply#T– INšþúMZ~Hö&í®X| ‡ß7óÍȧ?˜13VfVšÙb}Ããê_7G)¤G?Ìo¾ùa图h“TJÉì}’*…ìcWÖŸÂRÿT„ÁT-kVaµN„eÛõ²¤m™¤Bq­òäÏù/7?Í`(0C%?ƒ~o5¢@ ÁdPí)q?ól’¢–ìc,â6qÓà7Ív¸éY'¸ íyœøŒÈdáŠ_ËzAþ{öŒ‹¶KR`%]ÙÔ~]0 ÛeŸ]XÞPP kº®|¬Š°Ô7Á$_ôås‚šå}ÜÉÃÆ²Ÿ½<u-òªò\q WrÌ”t{‡·öÔV«)bŠg~ ïȳ¥¸EHýSÞïG‘ï¦m>µùÚ»š¥RQ†(A 3ÀàÁôY5íºó¢ bÛ¾Yç}éñ¾†¥(#ÁÍz“·eçÃæ7ÊúÄØ²èʶXëìܽ&V²ÌËS²ÅÂGßGƒ”*Š¿óõ¦Š“ Tº×;9h˜¾ÛQâ‘LLtuýêÍ›m{»­ÏŠX¬óz9• —€óL쎥ÿ‡"óß³*»–Š©¼J*µ÷{°y¤8ôyˆ¥:À\5UÕxסžÛb§Ü-¨úû)¤{ª>4°™r2Ü—ž}¦‚w{ëIh*¯o_Î D\‘™Ò 8h²–Æ Bk8žx9wòððÝ%'‚sá"·ÀùÞ õÉŹ—Û{: x ê XಛÖ4˜aNh}ÿØ5ÕÖº?Z´mÓ†aĤ2ëÀp®œâEêîÂꇢ¢:z¾x 2EZ!œE:ŠôørxOöÄ({r¼æˆ‚‚¥¥³N8 "P¥Æì_;G\}„’¸wœ™«PöH䉴ÚéH‹hÇHà”wEE°à€ÅŠ<•IÀòÁ^íAÔç^HƒŽ8)p•=õˤ¨ßfRÔѼ_Ô˜ e4—9ÉÓ¼YÔt¥Hí èÔÿ5ŽÒ§ãŠúòúnÕ£[ÍþVz;Hà¨j0šêJ9ûKɌ؉PBÓ/6kè¥%H.¾ŸMó‘#ùžy¡j­HˆÖ´|Íeùþ0ò½‚fBAŸÓ/7Ô”• _Eªß¬_ä`IóÔ%éÔX¿ï’¥Ï —D’z±¢ráÚHD!Ô×ì„î‹àeHt$fçÐ8I)ür¢öÿJü Ü7èU endstream endobj 347 0 obj << /Length 2151 /Filter /FlateDecode >> stream xÚÅYIÛȾûW4ìC(Ødj_Œ8È‚ 09äôƒL%•Z„)RCRmØ¿>¯êUQ¤Dukæû ZßûÞRoaÓÿéƒfÚðÂpý°9¼!qõóG9È''þòøæ÷ßIú@Ia‰¥»)‰ÇíÃOÙ_÷åqpÝ*çœgæã*Bf?ôUó„KÃÞáà?„Š:žY»ÃÕfÅLv:l+Øæ«œ ¢D&éêçÇ¿¿ùÛãL2YHÁ_AŸN]‹À¦"PB ‚¨‚HR¼{G ¢’døôiå)eŒÂŠÒ2…4Lj©¬°RAQÒzˆÀ6§¼  ¢HFÄ;Ÿ>ýq‰Š"FY©$£š[ʉHT 'ô Ì»l•Sà}†õ[МɌ¸^€# Ít$…”þ¼îÛú48¼êº®íp1q0¬Óº\~ÀÕººªç›·tÁÀè‚qN¸ËUàO™G9ò‹˲Rze@6ª^Y"¼üÖ0`zR£¬Â;ýDX¯"„÷‚mØXF(ì ¡h+ l‚Ô”ij¥ ê } ʯS ¿Â"F,Æ«­0R*Å¥¢`@{?n !£^Þ¿F€ÏwU-þ¶®ú¾ÅɶÚí\×ãd×µ‡8šŸfo=‹Ë˜ãa©àׂw(äøsÔàšfû²ÇAç6íSS}s[œûrH#‡ƒºj\<âüþ7ò ÂRJ ƒ8Kø˜)WéØïâ—jØ_ðí9•]w-D;“µC²ócv:†ÆÓÙÎê,¨ÏïPþ-Á„(„½°ðþ8±Ui ÓÀÆ#iÀÒÀë‘ð¬l¶8n¿ûÒ#xö`®¬rçœn]ío¡eýhY£ÊTMÊn*T - «@ÎxÜGQ30=®hVmü¨¬qwÓŽeWõm“裶¬†×7lSY¸Í¶mãy°þÇuõ9ˆß`VƒWnüÊ>í‡[p?¸¬, Oˆ¥Ì}ÒÏÜ (-r@÷83…æR»ÌTËžõopa üe_MÅÜzU÷Ç:8Ä×þÏèÜ0έÁ¹Qñ² ÊÕÜMÑá ‹`З‡8ª‚…÷äâ™ç•T`à“W–FW€ö4ÖiˆÓõP‚^¶8ëNM4ٔͤñ7vø PŠVÖAÌ%rk ®Æ¸Ðø«»XÐä»(s<3Ïdßð˱ Bs„¥›Þ`Eˆy‘צm<þîЧòªê?.aÌ•,,»ˆ™4eD^%(¡  q­!M$<3 ‘øúBf…”Ä@í´ò(o("¥„Ì&äc™åçl¸”¡¨¯jH…Rs£4T#‚rHKæÅ«r¼j4³4 H=c$5IšËS ©‚Z.…Y’F¥ aEP_|-²×c¥ŒCîS R¨V uÆ‹ÈÍx• ¦ è5šR˶×xB~q ,d ~‘` | Ûñ ‡Ã`B¥¹”,DôkLx“‘ñ&0§\Beb­•ÚrÀõ¢4¯Ê(Í…ðŒð+Ü Ò¼\oáÞ²0¯TG<ÿ¿5Ð÷>è„(åK‰“Ÿ¨˜ÿî`Ôó«>E¶‡ƒÏïK¹IðÇrHû†Ñ £ÌÿuYôÈ£•D4MtcQx"0HMœú·aSÃ}ˆÙ.æqNi¡)ŸÛm1ùñ‚ðÄz]Õõ©OšXÁ`™.-„SÊ÷$r_iAwÛ;wÙÞRK ehÐ<ºÐÞÌø/yÚ䦳ùäðBŸ~I2@øiƒðs„r,ŸŠ©.!1C ðþ¤ëŽ;zÌ%±&b8û.ÀèO«¿â¸i‡jáÅ"^&—€¥I‡–ÿ0˜tpÜW±zm±ˆÛÆb؈ü5ªû ×9,CÐÅ¿øqªÂþ.…LÜx)º6¿QùBD:Cªþ´è7¤0ÔL=’§Â¸‚š»XÙX_rdù"KU@HTܱ¿ð+›_{!1£À ¢Gùú¯Ífß­$ÄèÅÊ¡‚j|­6…`c!uŒMÑÆmO!€š¢a犜¤&‰ÌŠ9â«Sü]—}h¶8yÏSc¡™õ³®O]ç«Å˜ÞƒXl‘h¬—#´ø3Däßi–Ç % u¿(c›5­²kZ(7²öèÕÕû‰ºáL0†fbڥРAJʉyr»g²×˜y¤úïû©v:ZË/ù~Åÿö®¦Ø 8Ÿô~êíçêm×1'^Ó1þãÖ><ÂÔúÝÄ+¾}T8U pMçFvÛÐP2¯qð'fmùÙÛÒál[ó=NËÆÿjò šÎüNw‚;úlaüä°®uî—“ëC‡ì7’û­e#@v¡çgûãV=übfàºP1ù.Â0úbbIGóóÙ…P~AÓÊ}”ÚwSAŸI!èËñ @óLBnþcÈEŒ§\ÄX&ÄU~d¶Pž (Moä¢t(?ŸZÊ‹sRc&‚êkºHPn6î8 ¬r»­¼eòK$lõGô·M>=°Ð¦ÊЦâôÆG%Hl´ïbðAgñßé#¸õºsφ԰˥ ²®l’2CËøù¡a`WöW–O4¿Ã}w®ŒWšéc–œèÊÙ”1Âù37Ò%¸§cý¸¨'ª jØìy‹ ø½MGÙ]ô†{-o–‚†¼nM=#*³øP¤üKá ¬\ÙÄCuKç(é—ñ›åD¹ç:$ž­]TE¿F0P'QbnóñO3½Û´©ºÀrÛø7üº$â7Hбøé\°)ÍÐZ þãÐs¢ðPŒÈŠôˆÿÃL%{ endstream endobj 352 0 obj << /Length 2927 /Filter /FlateDecode >> stream xÚ•ˎܸñî¯ø²xZáS”Œ’ Ö@rØ\&H°r7gZ±ZjHêõÎ~}ªXEJêQ{'00"‹¬b±ÞŶ¼ðOÞ9uçJ—ÚÝíOïC¿¼“<ÚÁ†ÝbÇ÷ï~÷ÉÊ;)òJTòîñiIâñp÷¯ìOÇú<ùá~§µÎÊ÷;clö·±éž 4= þ-¤iy§Éú'‚v÷ªÌ.§CËú~§Œ(LfÕýÿòî‡ÇĘU6·Fÿ÷q×o\¡,òʸI‘ kè?œÎm¼¼ΖÙOÈàª%®-sWY8.`í~å=+úRæèòžïˆZݾAVë\˜™ì?ßL¶éèÄl´Ê†æùˆ÷˜þÇu¸­7#-ø_¦ÁŸ|ûÂtNg~™õÃTw ü©§oë'ÂçƒäBŸéœ~øÂ—ñw;©ª¼¨À¦¤Î%Ü&p~ðc3øC~¿³•Ë>Ý—` h¥ÅÛÈ „sïQd{ã‡-‰IQåZè(Žmè‰j÷DFê ó?ЧmÆIÒ Õ¦M™k'#ÙS=íñfG?"‡†ÍXm¯?^ & ߟ¶ÙÕ¹M &N6ŽWe^èb¡c$Lç&e­r!Ý’²z å cEn¥fýÐZÔÂqM6Ö'vá¯CÝôí¢]m0§•@ÕåV³ƒIˆ…³™ÎMa¤„vÎ[:aÁnœ²»”ª2ÖŠR ¸ks°Á(…°ÖJ4 ]••ª4Ò#Â6í*ªJ ‡V…sFVÚšr“°I(°­°N—€ +#Aÿ¶Œ„KÞereTaà.e©´¦¥tÅ&ák^´kâeie$¬d"lKUˆ²¨la•¤fE˜é¬ÒHü~óx—K¥¥°…²° Ò3U‰ VÜ@½º¬(J'e¥€mT×&*cV Sƒ€@;ä. §­UÊ|ëP%*Fj[ŸUe]¥áäoò»–¡u¶¨Lº3BˆÂVßàW©„YTÂHÀÙh£ÝX÷ÍCuB…TQÂF¥Á¾“ж1MÂD ¹Ê€¡…õT`Ñׇê ‚"Ô>€Ò,jZpWH…ÙûfÞÓ££Fš< ý‰GëÝêýVìØ½vçz¤8ð㜻1VP¸´Z=ô-šéØ_&Úãשv³HÈÃ¥ ‰zuðŸ'ÌS:k(SàУ§œÕÔ-€`‡#B.Ý®?…XŠð¯Çz⻚U .Aø.ÅÓÏíeˆO ‰>È¥‡;nˆÊAà2)+|Ý1“éàc¸û×Ä'Açl˜ýHðt~ˆ× ȃۭ­fb!S®rÙñJ¦©BöZT]kyÇÕHhߟÎõàoëàOÄ©ƒrÃׇ `oãÔLv¥Ã@k|M@„ñ3þ‰ÛÉ6qäkʽDygr§xŠón€7ÌTsªŸ#9LgK\œàÐáå¤üÀEJ¼áB¦õ~ºÔmûG`|˜Ñ€dÇ—+i6úÖï' Ùg®¸VýyjúŽÆ›©\)q*•x»Ü,S%ñÝ–xH¬FÂPÐMtÐàÏm½÷Ìe)™‹tëJäZ… Ct”°z¬—”Åö¨M.tµa…ìÂNš é@}Ÿ¤ 5}F*?ý>¸0n"ÝרãÁ¬/{…Ê3°„¤úéHÓhª©¾+؃É)‘~8F¼½‰¬ô™`ŽæÄ+ ûºëz†Õg¾K=ð¦„æ 0AÁžci`³ïç˜dH€Æ$Õǀ׈í`ÍBRn$Ùt„&€`` !ò*k!Ý{KµeÆp «²Íi ûrÉ~)Èì°ˆÕr3Ê@™y„®km`m¾,k–­%ìØ÷ÝT†i$(ù/l† S7]¢Ç ¨š}ÝÎ䨱ñÀž 5MC ©‡Á~NA¯xBw¸P8¦ W‘s±ˆ¿%mL¼4ëæz¥óÏkØ"5Ì6»¾mN HeD³©TtØGÌ4cF°5Âÿ{'Ab2pýJŃ>CÁîbä÷cCµQØ]ƒ3Œ2¸‰:GEy`À“â¤å ‚_ îDæS?ª(œ¯ˆô}xÀw‡bÍGÊ|8$&Ì5Þ†'†¤c†d™š‘ž4x ÑÀ|!€ö]D¿,çŒÐÐP#ÅØY2øÈ'-Ìáñ x\O =ä܉wׂ3wS¿Ã£7”µï!ôr€…;{h«oçö¿vmˆÌ`Ï}90ÀˆI4¬ VAršß1bS¾ q¸T'5]ŠÿŸ5'œíû˹õ4Y+ÀV×"w(,‰ìò×xn›H‘ܤŒ÷ ö]舡[ /žBD|hÆ©™.³j‘‚Z¤5ñÙgí´Dr {R1Œ<-¢ ‚ÏÙ1?DCy¶^Í\q•±aÛÏùüˆò¦‚ƒ£üϬÛVìZFRG=@CöÁ/×0/gÆæÀSrÜuû('³ ÌÙ2;afq†Ïªéó*ž—Ëpã34V+§ÿ ý Ÿ(W%2ßAsˆÂõeÁ€Jþ97?i&ôó}È@?n8³0guUññÐl.ßó>sƒ‹ÍHÐ먢´…K‹8ÀD×ÄÀ‚C®¡—«+‰çREÛê3Èý<ôç¡H„FŠP’ˆõø<ÈoœÈ¥Èè™ñ…&×2¤PÁ 9| ÊÃ4¦]ö÷ÔK”•°äöÚcÖÛ6É…*%º/õ©0„4³ô¼-?1p cõBÛ.n]9 Y«/_”b!-$U‘ŒB|éRjÛ`[ÃtöõÈÆþä_!ÆÅzàÆ1­:4+¤A´¢ñ‘¤y>ószñ{•d0+¥†BãÓe¤nŸšiîJ›!:–'zBœ[€ÁµAgPsÿ$êä·…ðìàLgãí|¶(–±6 ·Ţ9±œQ­¾ ‰!^8ðPÙ)ñn‡c,ÅK¯×°M±[¬bÓ"%Ô]žÏ\±’*@p#Å"kžxÏt»¢<†pªè‰¿ó•”\ËSˆ¨J&åJn{”\z„RËò)¾ c»uVŒ} ›O°©…Ób_ciQ Ýú¶’ËmµRA-RÌ.ho&³ÂåF©7ü:³Jg@­ìÉa¶”ƒ«°!W›ZÆ?ÖsBHAn¯(Fð3Z8µÅħ^=X©9]&¼_]É#ÙZ„×l/Z[¤sÕ—ý ½…„$F0ûþ¹k~E Áy=Ò†•³Å§› ‚-:“몚;ºPhÿØw»Ûdè4ŽH8nýÓD£Ø÷¨[¯$Òª¼0îÿÔ2’¾pwáßtó;R×óé«÷6­ËÜ ¹–cxPÌöûË<¸bo²¡!8aÄBÇWÁÐ;Ú±}YåU±ü-1Ä5ùÑîÜfɬs§Üª« g|‰g8寲\µÄU¸ÕÕ;¨ú-Bl†5zà€#H¹l(+Ž’Õ²2‡f$R…^üØ·páåI©Uš_ù‰x«{Y] {Å ÁoÌñ%zalß(²€¢ìB8ˆ!Ç›Zre®g/|ã/³Hí…žÂiòæJþ‰YYÄœÎ.‚³u$ œ÷ôM'—eÚi™p¬<àIüµW'°ÿ¥>©´(nøˆ*]®”Yˆ?èZ}Ô;ó6sjh»¨Ÿ‚ŸñųPËœLe¿’V¾ŠŸtºŽE?9 @L,of‡Ñšß,†Ÿão¼Æó›Dr”–ô…ÿâ¡}ù endstream endobj 357 0 obj << /Length 1353 /Filter /FlateDecode >> stream xÚ½XËnë6Ýç+¼« T,‡äðqÑU‹>·MÛE[ ²­ÜÑðä¦é×w(RŠì(N‚è^d’ž™9iŽ +N°2be¬dVšÕ¶ºâqõî â(%ƒtbñÍõÕWß#¬€3Ǭ®o¦×»ÕÉ··Ù¾ËëTJ™ØëT)L~m‹úcXênó0ø“ƒ*£¥Jš›°Z¯…MŽÕ® Çr ŵJP®ÿºþùê»ë10ÈPÉ¢¬^HÁj攢L4ã¨B?4}Ä M²É¶>¨;?³IׄÕ>?Ø6Õ>;mS‡¹Ï¤7 úDó6Lþö™Pb€Å¤A º÷]mÑî$Pa™–z0û" fõî´”Lƒœ"‹W Iˆv’B³ïŠŸw£³ÊûÓÿÂaŠtÖ—¦CÁ³,kVÚ³J™3«$è‰ë*ä+Ÿ é ©$#xí+é&–VˆJù¨Âü·ð?ÐÝ?z–PŽÆv4EPew¾2ú³•.ÒEë¥ígÝ!«Û›æPÅi°rd…¼Ê«æðl›} ¬§£gApÉŒ$ß´ŸvB|›ÖÂ$÷>ˆfòVy?ÉÚÙj³Ì#ê>¡bΚŸP tNjH™€ÍZÍNÎ äÒ€j)Àˆ‡K¨—4 gl—Ð- (ø² X:À¥_!ÎømoÉÉ.µœÉoòaðßÚË_·ôäS½ŸK—ÿ«ëe®y»'ÁCídÛÿô}¥|X[™0j B'?æ‡|Î¥5Ìr|É¥eÊÁ`´Ëë¦óMB˜Ø„qIïÞû"+ãÊCåãØôa5e°?¶ù.Œ6þáC0(ÓÞçgE}ædSZ…äcXØšÞí– Ùуã!'ý!Oò@Cz¡ÓL8}R&…oí ¾ð-Xz²_,5>§Äà ÛvǬ$†{€,,nŽdY–yç9W"ù¥¨}\=F}î*ÿ7«öe–Û}¶õaKrÛe›ˆê¥ŠÔù}YÔ);ÄÁ1„IÍB¿¦S:©4Ïh^zméèÊ¢*ˆßÖ;3:êi=œF—§¯ ÒažNUj°îÏúQ?äy|2º…¢¬Æ(õDÏz£p|×q;,mVås Q¥Ë.H”]ÑîË,’h–‡ÒšübPêϯΪ?Њi±ÎÛ‰øû}î­P¤®„™¨:ozÛSA³ý¾ôµK3DÓŒQUf¿`ÓB-'±@‰©ø¼…/~Ê„BæFYý~µô‹~8 f_‡WŒaÂ,'áÞà—ã—æYàÕÊ—tcßáæŒiûn¦í«Åé"¼¨X—dú‚Ôx+ÓïšgZˆÏ´üš1›s+ÊÔ‘ N¢²sÙ踃B¤<çÝ›ÁŒÀQ Ô`41 œ½œ´· úñ¢¸¶À Û3>D~fE'd­HGägØ[$Ó(J’k#‘Q³1ëa§2$:ÊÂ94NR\³0nE+РvÊÑÙ)ιF³9µÒÜj‡ÐYƒäj¸Âþ.u^ endstream endobj 361 0 obj << /Length 1255 /Filter /FlateDecode >> stream xÚíXKÛ6¾ï¯0r©„X>†”XôР½ÖE>€2¶œ"K†$g»ùõr(­äÈÛMQ=t÷À×pÞó e±áø/6¹Üä…b…Ê7»ã »ooDœeHÍ(¾ÙÞ|þJ‹àÌr+6ÛÜÅv¿ù5ùöΆ²K3¥TR|‘f:ù©¯š7´5Ü•4ù ¨#%$ív›TÉù¸¯ðX¥™n Ñþ¾ýáæ»í¤˜–šiP¡ýHõ± rn‚àœhˆa\Y!%ªcr3–ƒÐ¹¶…T ­Ö s´Jrž|éÕBQ™PL [誚®æVJh©”¹°„Á›¹Ô7ãE˜.¶°¹…Bkc”6Âe/e*ËíWoooÓLpÍ“WUþEÓuÕâ-öÕáPv=-]{Œ³%µ|á™_F8“º'“–éÂ’¼«f‡AO?Aæ")wm³§µoYÇEÕÓèü`Ç(—]µs5¼KµI\}.‰¢jâ…º¾SWMÙ‘O¿õGT{UÅS «‚ÊÁkæ¡uF™‘ì³(v´bµd¹‘sÎòœ_"Ge“¡%åÏý̃>¦QÅ4—ËtjOCÕ¢3”W”É™á0JÉ~YÓDÌ=³Ñs«š~(ÝÞ/$Õß5F03Ù‘½¶„£{›Ê<ñáò˦%YTÜeW†$"Uèd¸«"íÎõ%K3LýdÃëxNçT$Ã3T–€ÕÌ'¥)‡ˆ1Ù0}Ö2‹þ7ÅÒý”6ìjœŸsÛ‘:‚B0ºÍòõîX.QoÕÁq#ž6áýd¤£ £«ê ° }Y/-n+Ka¨‚¿>Bƒcƒ³ÒWúŸ'ŒDíÓ yðUÝž‰h皸ºoéüÜ샆P[þäþÎ_x ÅzµfJ«g¹à«Oñ` ÅRƒÃ7ãë ¡Ê^Ä=3± $°`ùJñez¢‘ÊpS¬ÕV«Dãg—`¹’\‹5ir¢Á¶.¬2Ñui<~­ÚD_TcX$¢ §”‘ÍŠUD¢&’çD6ižôò?bñÒ“¼ë¡7ÍJ Eš|¢1øiN¶ùß >V]ìA endstream endobj 365 0 obj << /Length 704 /Filter /FlateDecode >> stream xÚµVKsÓ0¾çWø†ÍŒ…vµz¸ÃpÊCOáÂc 4 ÍÐ:š^øõÈÖƒ8VO§Iv”ow?­¾]-Ü~¡ÐXh#˜º¸¾›q¿ú{þ­¶€zñv>{õABœ5¼b¾Þw1__Êw7‹ûÝêOU !JsQÕD²üô°i¹¥ÝÍʽ|å@·IåvíVÛ Mùx·ÜØ¿EU#qE¥”Õ·ùÇÙå<“(™$q‚}@·€‡[@Ÿ$·…ºê,Ÿò°,m䛥ޙ±@ÎKd ¡`¤ñÁxÿI¹nó£´´ PˆÚ$AA”B™1¤8¦=kžÇ™g/"{Å¥”LE&P²Ïù¡n;ÅHg³h—N€?'6²¶¶ƒnhûßãîþÑ*d7l‡I56Ä 5Aem×-×_ÿuöp~á³{¢[ ²öÈ^İ÷ž4rdMc½I‹UÃ8éaaÕlÏIû󤺃le´GakÄjA Û,_çJ! ÎÇšZ""jZ ä¶»¤bÖ“/ Ápb0ˆöìÑqCØ' ï sB>½ïfv žÉÒ¡!?†º‹0×7|MOŸÅ 60êÃd{Ï$#Œ\ÿ÷> ¥ÑS϶Dg©£¥"©OõÛ5Žú„N=švrjM=.Ì´n?š†Žku<ù@SnŒ³$ø<Õ;Ÿ2)MQ>%ÉûÑ&˜qÓ Ã½±íŠ[dæ¦ì†ú§C¤i endstream endobj 369 0 obj << /Length 1365 /Filter /FlateDecode >> stream xÚÍËnäDðž¯å²vmúm­8»áÀpb8㞌…ÇlO+>žê®rg<ñ&J‰W×»«ª»ªÃ ~ù"‹4“I&ÓÅzwÆûç'(†øˆã»ÕÙ×5_p–ä,ç‹ÕæXŪ\ü}¿-öƒí–±”2ʾYÆJéè—¾j®5l-ŸW5qª¨Ý ¶YŠ,:ìÊ Èr ÅŒŠ´Yþ¶úñìÃ*8¦…N´’Ox?r=Ü‚8Þg,É&Ï“TKÜÅÛ·o—1gšE«MÑùª¸¬-?ÇUYm6¶ëq±éÚA'ìâܹ~´Xd`1æi¢¥B‹7Ûjíö¾…8è<ªzüÚÛb žDÃ’Gõà Öb8åÚC¬²È®[&Î>~j†± qÛ¢)©¬ÛÝ.`ÿ §'a’RœAh½ÃËÒ†ÒÆ4 Z#æ”-âQ<æ2á¯c4"©iähì ê+«~_.Lwýœ‹1ä„&Û~ª#‘(•«œ-c#‹þ¦úE;ü^ÚMÕØÒ{̦®Æ:èN“êQÏÔ£‚æNõˆ'ôIlÏÞʃô¿z„P§îLÊwÖuxÇ#ã]?9IjN4 ¢Féô zÅ:È‚ýLdJ¤äz\wh“ωæ$*Ÿ®{>Ö9 ŒiFf<žkvŸ+U„%7FèGëZfegb´$‚%ÂÿG~Ó+Ã. ÓúѲá*ð¦Š=¦Øã1"±‡',˧澥»ö«™Ÿ?`à ’2Oô™ÿÁ`¶‚A Gp_tCUÔ~,€æxÓµÍU‚›VI®é¡°A;©Ö®Ùg®ëû  ªÁïlÇO5l<{ð}3ŸíÕê¸WƒÆ;çt{À…öüpáa͆îЬ VÈŸvô‹ì«Ûa‹`i×Õ®¨iQ]UÃ'ñNùÿ:Á]ëg¡vèq £%æS¨$5餖PPQqÙ·õað+]/µ‰Šú`{¤úéð½òsê`¯üDX§0·:ì%ŽbÉÒrp¤÷ÇÚ)±ì Ù÷Ñ@°w0Ѿ>†¾Ý‘_°µ;Ÿp'S––¤j˜údîd­pÞ68o{XÏg[Á½—M’-ž—lP¾n1 EÕôh‚œZ±ßCJ€z yª9Œ¯ƒöÒ‰ø]€Ì¥ âÂöfh›7Ä»³ÃÓZRöeÓvH¥7…ËÀ§;M¡K©i0ŽKC±Ôç^¨À!ìµsÁ%È¡ç“ê('IM1©Nƒ'‡O¨C¹1:ú¹jÖd&Øs1èlQã¦f¬d{wÁË—yÝŒˆÒúseÉ’‹ÇÃë²±Wõk_yxoÐk²­w'¯38:œX¯Û®³=¾2Ú¦¼ε4ñ›w¨Ü·€À‚v<Ÿ€è,ÌðkKdÊùÜ{Ã@3€óÊÂýu<Ÿ–¥Iž‡» B¬8 jBL/BÌÃŒA‘'R«çÚLÌ>5\Rj(h¡¶Üáâ áRîEs€û¼óátd, ì­õï>Gvg±¾^Ùê¢'ƒž{|ÃyÜÒYà‡ŒÉI]¿¿®– hG½eö†€W´Væ™ýàôíæ; h¶G-Ì_ˆø ›}ÏeyÂY>Í_lÕ°cVÍÁ·<Ø\:ÿ@D¶É”¤_Jßý ï…ÊÞ±xiù +dÏ×çþ-ôxüW# endstream endobj 373 0 obj << /Length 907 /Filter /FlateDecode >> stream xÚÍXKsÓ0¾çWä†Í`W’%[f8íCOaPm¥ñÔ±3~L ÃgõpHR§¡©Ú!9x#­¾ýv¥Ý•ƒ§¾xši£GÉ4[N½™`+ li¼MÎ.žb¦(ÅÓÙ|b–O¿xïbÕÉÆ¢(òøk? ”yÛ¢º6CÝBá+´´šÔ«çf´ò ÷úe^Àtä„¢˜z,ñ¿Í>LÎgbŒ°ÑèûAë® dÛŒPÈÁ‘8DŒ/_->åDÁx€£C 4Vƒg1Ú6Ê0P£ ªUÀÛÄhíR ¬šÁ3ºÄœ¥9Æ£nÝuº̱¯±[_ÇôœÆŽ»õ5uì+F®ç-&ÿóžº.)øa5e§A…‘daÂ- ¨rÓo~Œq 4$” À3qUJ2Ñ0Š7^Ä¢2­[øØ+ZÛÞ íÙžx«:œðIâ­Gý'iÈQ¼K7ˆamœ0ï²î¾çr^T2ÝDzDϪ‘j`’$»£YEYÈqrt+­Úq…wO³y½Ø1wë.v½˜¸|ÌŽŒTÍ—#ŸóË÷£™N8Üãvçc5¯›®¯D'Ë5zFíumÚnm¤/!TÚ2æ‰ÆŽÉªî¯Vµ6Ϭ®æ}+÷PÛu•©ä^4uUü]QWfbÕÀ:˜ÈdÞ7ò•Ê@äÝ.ŠLÕƒÅX6«âA1ò®D ù©E¦žÂΨµëNF†ßf6«—+Ñí°è¶€š¤%ù3+û¶&Ôå[=µJP¡‘¥µ™Ë²XpSo4%©',/]É䀸*Å¡²tŽƒ&l… õ<¦aº)ÉFç³Ï#¯îA3޽LTJ€`éàHÑ3¤ëªè†*HJž¹Tä«Âl¸Ó^i0ÑZÉÄÉÈe­ÙÕ7úEð­…uß­zkQÅÊX––k½\êv¢FGÛ Ei˜ÆÑpúÛ¼˜Ïu š´—AÁ§±ÃqHÙ~¯©7½Æ¾Tu¨ZˆóRæ[oYRíœÒû{ÜL«jÇèâúåÝtrGù6óß~€C‡[Z€1„+å{AaÎ Ð#°é¬®í“ûí§{8|§b#ðæ>+äI­X#ø9\A§I1Üë6ùz¸åò£ sWªØÕU; !ëõÞ•û9BJ\…”¸é³$uå>uæþS¨£•œRõçÝÕ endstream endobj 377 0 obj << /Length 1761 /Filter /FlateDecode >> stream xÚ½Y_oÛ6ϧÈ[å-bIJ©bØC·èòäÃÖ“mÚjK$7K?ýîx”"9t“&î ¢Ž§ãýã¸äð+.µ¼Ô&a&Ñ—Ëý÷ÔOÂb`ˆGoç¯ß+q)8Ëy..ç뱈ùêò¯è—mqÓÙf'I™7³8MUô{[V"u[Kƒ\¤;Ï™Fõš¨ÕLšè°_•0Ìb™ò,”™ý=ÿíâÝ|PLIÅTš<¢}ÏõÐ96ApÎ ’1®R²"Ã_¿Ïø˜O –‚hÇ jâšJËK²¤ç J3Â<&(Æ0- &ÀëŽ[?_³Ì°T \?! È9Ësã¡©x†®{ÖC‚3½h>Uܜ˥æÜ.Íÿ— ~.óÃ’^b¿ßÅùÑ*òä*ê= _ììûçûw ˜øl'>!T~‘ôl‘J_)¯ïÄþŸg±àŠG?~Þ]ÿêåˆiÄ“” ©a±41$胫7<ºIYoÊÏX}Ü›è –°fTï÷Eµ"Â?!u…äL«Á?Ö°µ/jñ*râô„?é)‰F±çœ‹£± ™$¹tã×zEj•UÛÙbEÚ×ë¯èªr–e'Uuy‘ä)§Þïµ_“ÒOS6Ï ÚzÐõ ²\pònªUÔÚeŽÅ1¶vç_Ð|zÎ4Ú••m§sáHhÁ²tXñ´f£\}E"K¿D±»Åd(ðϧ-v‡¦±+6‹M–GóÞ„¡“!ÏApŒK·‘约¨ÚuÝìÛ¡ ªÈ‰AŒd OžaÊ.+ÌénIÜWF3“eÓí¿ á‰=ÛýÒs ”/èGO@îtÕß&nØç•—žKÞc}èóÔ3g–'øyí率xI@B ý-%Lf¦‹q¦“Ê ˜²×§™)Ù¸½«–[7®«ò `h` ­YÿáôfÛ¯@Uš°,Ÿ‚­8 UéTù’zBtâ†ÏGA'y0¥)7[óŽ^]á'tŸ™4bÞ™8êüéU*CÒpp¨°l•]YWÅŽH®: œXGðÙ6 …yåÉ=‹ÿjY´Ö³Þº¢àfýœmº¢ÿÂG¨ŸRƒúÛr‰ÊoiòÇõÁËq¦Ud,uy)Ëó¯«ÁZ‚FËÝaeûz’×`°¬÷7ES¶µŸøÝסu“ɉò }›V¢GüG(dB@o§Æ!ÃEëû5w¶³»;z¯ìfg—­ ŠˆÈ¯_7ݯÛ«çœÔ‚š<•éS®#BitÃ`p 9Çp&yvä—7àPßf>£2ݾn]i #}s‚Cj½2窺²÷DAT‚>/õÐuVýWnÇA‘*h«¶¥—º,<Ãb¬Ó ÓˆH–müÇ·Û^h¯zK­¬ë8eThq Ç]/a«~çÑÙOŸ#ü¾mCªÓžc³€gA;ÍMDjÑ»Ð|/KÜAH‡Æq~ž)ìÄc îÛ•Ÿ¨C¢EÎT>@؇j]Vewʾéä*$Mƒ7ôHV0‰Éȧ‹ùñ„Àœ<Ô©›à®J`S ÆÅ§$É1b^Q~§Š3%’Iy¬ýK`A(9J ;ôº¸~ŠÔ‹Æ~. ÄF¢¬›&ÅÊdp¼s]c~øáãú°_Ì”ŒlZ9Ó,»?̲~'+§=Þ¹¿¬+ÀÑŠ. …öi+ÌQ¶ BXA: Ü.Ha-¾l@Rå4Êxéh€.Xg=˶ð2¶¡±û¢ùäiÛ¢;Òit) äÒŒ =Äq2¶èM°ð·ëéÕ6ìo‰„8JïH˜øg0T"Ú£ ŠpDs½µk°øÿRúÌélLƒ¸§Ùû²q…7ÀÉÔ=BØè™Ûè-mtò±Ö=–4®Œ"¹¬V–ÆÞµZ¬@Áí «(Ð ?Ç.g‹¦9ûš&jòÿº"¢ý·ÀêCDª©²uå ÈvD;´ÄÓn¨LÔ­ ƒiá[Ž`¹Ä†#6A»­›N<¹Ééñ›JWèx šÛ•­_·öçuüë‹H㣷e·Ú¥ÒcîÞ@»í¾ _ÏÆ“i£ÄçÂÝbñ(NBÎá¡ün`èça:K8|/‚÷_XEácœäœû¯“€lœv©–ŠD! =W"ÀŠ< þ°™§â«˜Öb_ù¤þ%wm±·D¢°".AÜÖÒÊ3ƒf÷¡ÄëžG‹CG3yw šzhœòj<ÜÅqKŽ®“i¿½ 9ƒO¡ùá(˜T>$æM0±òL2 ÿ]ô»rN¤ endstream endobj 382 0 obj << /Length 957 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯0öR*»bøÔ#rhÑÉÙ=µ"ÈrDÔ–’£ýõr(¯$S²$ò›áD1gš‘7W?&À8Ë'q·1 !íŒÄrH]d.z.Ìq0€²’©/I­ÜëbP „ 9*ñÇ­Ïé¥tð¹PKC8ÓÝ!ƒK÷Õcèµ3$‹Þ®:6üŵ-¹™ø¼­™Syužžž|?šCårB±„ñËV\Õvø±oOGÿ6ƒ‹ÇP™Å"£Ù´`m ìì™FÓDœýð Iê¢ÃýcÑ—V¼®vžRä`šªÃ5ÓÌöZG|­#‘’·ÎV Vz”IB]l¸¢¹RW ñK²‘Aö«,û’“ê»UR5¸\ÍîàúA²,º Áçz^6»âèß<¥V­)‹â¿G:!Åá›G˜ŸçÖô}å 0^ã®*ÍAש/b߀ƒS¯…Ý›“2^É©{é­_¦¨®4•³²·´¯J\µg]ktYõŠNàm;„ËBM!ȧý€ŸXÐáj˜…¤‰¾°âàx üt_ÎG$gðn-(ÐùE·ó¸7{S†Ô딊tÄ¡.ÞJ3àl9mÔò„q+ endstream endobj 386 0 obj << /Length 1131 /Filter /FlateDecode >> stream xÚµWM“£6½Ï¯pÍeñ)ú‰­TIy«’Ã^âT»© bLƒx“Ý_ŸÖ6Øàñn*žBjµZ¯»oèŠÀ]I¶’ŠcÅå*Û??ûçõ#hdñÃöáÛ·]Q‚’ÐÕ¶»Øæ«÷Á»ôÐëv8çz³FBDÁ¯]Y?»©~§Ýà¡¢ò–"h 7[¯™ Žû¼„e¾FLX1Yÿ¾ýùa³=±G‚¿ý`u}6¾%«Uœ$XFÜÝ" Ã5¢$"ÁÛ²‚€ÁSð˜ë¬Ü§Õ£{ÍË¢Ðmç^жÙûÑÙ¾ËJ]÷eQf&þKäSp,¢1¦*vÇÚÆÜÿã­´wÍâÆƒ¼T ;_ãÍŸuïf²¦.ŽÎ± aEN„ð‡FîÐwàBðÄþTé}çÞ²f¯MòHÐ{7•V7-k÷´AYë´óÖï´_,šöªKŸõš&T3~ªŽm ï°DƒÜYšKê*¿Üo5õ¦-ãzÎ7bƒ>‰§eAñq[É$€šLA¦˜ b#`Ãl6ˆ‚‰„Ž@tbrö~ˆwC|R)ÑER 1ÞLLRFÁlH!±î6±?1vU?vvŽ+$‰7K–B齨k×ð_ÿ˜É%™fÃTÇLêÈ”?^_þlÌ‘-É‹ÛkD@Éé­ôê—³«mv­ÉBv5ñUä‡3¤Í˜ ÅÆ¯‚N3{}Xâ½$³”;xaÖêîà84ëˆ]tõi­xðÍ©û=YÌ6¦J°€$ùž«Í§«ð¼ ×Ðè³{gÈ= +Ø…¥6f1N’äªÛB„ØìÞ¼ìUjÂýÔÍ75ÅQM«è{ÿQ›¯D#c]¢>á$9 î- )?Œö.ÔÕÔܲ^‚:ÿ­ÄæEÜ@EæÓ”`æÛÚï±LÆRHÐ µ›Ö®‹ýÛ¨ÓcL‹rbÇt½tª£uÓÇÎ;¶jTzåa6^)»<¨ à ö:­r“^ýØhþI÷`Q« T‰oî&0 ß<×åg}ƒ€(XÉ[PÆ!-ñ&œ¥–Hb&ÿ‹ò ˜që^ÜïÞ &ý×1­œ EŒG˜+5e§ß ëú«ž è´pÙMÅ›×e«O3ÕK#ɶ„ŸRX01ýKYUm\`Ÿì^½™g].±älú‰AK¿Yîc†¿,õ@˱ž³\Ç Í–%-[ ¦³ŸiÄq,•£b9òËïËà1™`ìØWc)“x eöŽ7àðh0 es`ÃÛ` knð©ÿ|Mð0ÿfþ P\m@ endstream endobj 390 0 obj << /Length 1914 /Filter /FlateDecode >> stream xÚÅÙnÛFð=_aä%Tmn÷$)#(´ÍK•—@iie±¡H‡äë;³³¤H†ò4­ü°»³³³³s-Î8ü‰³XžÅ‰b‰ŠÏÖûgÜC?<~B8Àx½zöý#ÎgK¾g«íÄjsö{ðã.=4¶Z„J© ¹\„Z›à}7jv–&p¡s©ƒrKÐb!“ Ýo2ØV‹Pjé ‹?W??»ZõŒi˜Ñêî;¬GÕD¡[e –$(«ærŽÏP(xôô& ‹AtÃS? %8^")`N3aèŒ`òŠ/Â(‘&øð"ñ=Q £¼ Å{CþbÉ´q¨&Ž¨Ò“‘¸ jŽðpÜœ¡*ÅÉU'u<¸TyJ!gœ+D9G…áOO-IôÎÏÏ¡à€ö&ËA´`*ÁsRÙsZ¡†mUÓb[•{?› Ëçsj ±d¬‚»]¶Fîcd5öcºnòO¸€“6þ„¨eK‹;Zä›îš@"X7t4+h³n‡·¤4¬ÓÚ2àZÉàU^—‘!¤–®×öÐÔ¸ˆAu$¤¹‡vÆAs%&6Ä_w¯»$… ’,Κ’(Aqï¬Êœ6vîN>LiÈÚ<âezò²QAåäªy Ñfâm™{¼Ð>”1tÓÈ%/ö9‡Ê±{›m,ܳqKHƒz×iå‘\ ʼn“Œ¹u\u†é QRÆE}H×î#oCRBÑZ¥3VǶ7V-”s½S œ}Èæ%:Þ ™Ç“f òˆÏ ]Jœí®pÁ4Ž@ÓUe]@°—R>{_3-†ÞäãÄ­”÷frë>ýà„SÓòݱ™À%”$û¬HÏBº¥vUFI­ n´c«ª¬:oQʱÑìm]§7–üUh¶Ô“„àŠŸ$ñ²‡ÉÐÍ âD…;8Ä/ñë¬Éú»¾9Âçy窼XÌÈ ÝN'–wï9!;õnrÑsXŒxƒ <¼vA2¬±ã6úÇB­g9Þ´k@“¤+ÀÜ|>J¡¨7ÎL®k83BµpG9@F}Ü™‘ ´F2IŒŒ/{[^—y»/j"}p­ VN@Ø'ØmÚæ !Ü. ØMÞZZB•D“¦Ã .èÌ•HnoAº 晿T(Žê7 [Øp‘‰bÖl¢hÕè>ÎbŠÑ±³0š*Ýd]`G@oþÎgUxÜW s,ái÷˜”…ŸøÌ©‘IgC0;QåAvRò‰1ÉíR{Ñ=eàFžÓ²š0X·‡CžÙw_ˆ.I-g⯳õ>0ýl«Òi\o _qÿ}ƒ³jS_ÜS ÐIÄ£¯(Hîpå|6äØngC¤ˆ]M<¡[ùâæï¶ndÓ:ë^åLv+ ¡Ò×C†ª,¦±™s¢ŒÏF „EÇÎå…¯w´„oA_-ÐéƒÂޤLj¨±+éqœ•è®§AU–²˜\&B8!òQÌE]wëLÔuøT¿ H ïJ¯kˆ 5ÉaŸŽnÙ‡ ´Óù=$îÌkìÄÒ–lQPBÃí‚ÆtCŒ«îûÀïC{*LК9ç ÓUG±ÒÓ@÷dé LjT_i¨òÞ,Mî(öcº?äÄ99ÛLÓ{ìøNY‰‘®á™mø>“•‰Ké¿Ñ( ­à6DÃrÀUz[1˜Ëù"ÅÀ<~ü·¶m™çT”úÏ—°g?6³_¤^BÒØmhº.I1 ñ}ÚËùO\]‡Èb%¹³È·ï&¡eÃß½„©¯úšá4Ñ®½—BU=ê=ïú–¼ÏÀ½Z Ô¸G´‰ÿ^—žõ°\EgŠ)H2ÒüçÌ~ËRý³"nÌD˜M9t·CAüà?C|7ó»z÷S÷σߪ endstream endobj 394 0 obj << /Length 1566 /Filter /FlateDecode >> stream xÚ•XKÜ6 ¾çW r©Y;–-¿Ú[Šmíezj TëÑ̸±-ò³Ýþú’"e{v'Ù-ÄEQ|~䬨ÅðOìŠdW”iT¦Å®îÞÄLýôFð*†pÃñáðæýÇLìDUq%v‡ÓVÄá¸û=øþ¢†Iû0MÓ üvJ™¿Ù¦?iºhZü Ù2§ ̉¨ý>)ƒ¹;6pœîÃDƹ òdÿçáç7?Ų$‹2™¾ ½çznB²5AÄqTî ‘%%+Þ½{·EœÅÁǦ…ARðö î[-ÞÒîØœNz´´9¦ãÕöä-ªþÔi¡}²¾y$ÒŠÞü©È<¨Mÿ÷Ü×Sc! šéBGäé­}ĵøBxâ4* !_Ü…¢ßEjG húrtV¡Ñ>ÌÁÚÃ¥±$˜¾q0[}š[Z£ŸÈRmõøyŸ0wrá…j›sßiW¾IÂ’v<Î߸BßnnÁcýqG:O ™Ge%ÙÓ¤ C mïš¡E3ñÞzPÀË=£ ¡ùP yÁgH_óΜžŸç €)rZ URR¥JÒéàøŠ«Ô‡B´´¿¾2ʲµd~|]úI úãWĦ"*ò%Ža÷ªBi }£ë‰™¼-ä0„u<™±Säš‚]³eÛ 6é8 ~ñˆ é”åIðafñƒ«ŒT t*#‘?)©‹r(‚ÎŒšVÓ…€r©gÒ±$³Œ}1ûȱBD™×a# kºRã3þ§ŸHS–tø}¦7±Oþ±½ð²jãŒR8¾Ê]ßÓTo@½ñŽss\á#gñ3í†ÈÚÓךŽùje5WÁÃÅ5\^°FçqZÚîR1,Àid_Hñ² P%åkU–œ@ÚäìFÚǾÆ+P•}ó¯Soº u}`sNKÂb Ö¦ÔÈ’U»yß. ^â<Ð]nx>½VcèA…[ãÒ5}Ó©VO´ hÅÁQ·Ú%Ðû¦´ó¹´áh›^ƒë`²Ia²™UÛ>ÒAâ¾p¦ÆÀíhº7óùBëå«‚~_{†y¤r4.¶"àÇ~:]eÅ¡Û8T TŠÚÕsp®è Uã™oñ2Ð4¾þÜ ¾Yß!xgØÒ jép±kÀ(Â~¼Maë7ç`tq†ïlù!ÅØK#úè CU{6#„F-Yœ‰¸Âj˜—¸FÐtíÉLUÌ ‘oÑGn£Y‚ëUð%Ó#6 qgT xx‡3‰2oñݽÉ3œ{wÑØ«;AGþŽR8Í“(—â*‡/f©&M ñ/¢£eVÐ%³Üf'9¯ãÒC®×¼q'†®sOÂc$ÙÖàS˜ï¸'|FžËàÎGƒh¤HNìý5~ø¨Ojn§[±¾'g\\nÌ—»1E˜düà ¬àf™;“LWJ ãÀ· KÃѰ³à‚U`hFŠ+L#ÚžG3Tøˆa}UöªØZáX¡^ß‘À¬ÓÏ3 “:tª(W;pl¢ÐÆ\DWÕíiÜËòÎ n†ó9‹e ìԧͨèp-<ãÉøª¦Áú'¢Äª6 ŸÖêvGjZ™ÈCIeð í*Q6É++t–m¸‚y$z0lº‘]n:n®,3²Ib§éí´€R,E—GC&?çÁð{5:€âޱ+ J¡Õêå“‚öVÐ]nä¿‡ß ú¸Qð€RP‰"*øtX9ýh£|躥,üÈÂWåa©p}Ô¸Ñ OЖÆYn&ŸÒÿº1÷ŒÛYc3WSó-Ï"5Ö‘²ëhƒŽ^L-³ ôk/òFFуøˆ¢P÷ endstream endobj 399 0 obj << /Length 3465 /Filter /FlateDecode >> stream xÚµZYoÜF~÷¯òÄÁjhv³y%X`eÃN´ð!È2Œ`³­ކ+9ËÃZå×o]ÍcD9É"+îêî곪¿:8ê,€ê,ÑgIúi˜œm/i½¡„ZÃzÂñêæÅË·‘:SŸ™:»ÙM§¸ÙžýÃ{½·Ç.oVë0 ½ìûÕÚ˜Èû²Jg›ª¨îZèQ¡Ñ^®þyó÷on†Õ"ù‘ cKŽëɾ`'*ñµŠŒÛ—Žýk¸¯lµŽâv’;õ_¾ƒéqR?3ÑÙÖ0IÆ# T¬ó“+íÇQ›"®Wýœ5ɼ&?®Ö:ñê¦k¹eoW:õ¾â9·t5—·Ä)m^!K7eê^ºívÛäm{zi¡ŠüPÅgIøQÑ¥ù:…àðÃhzuŽw=af‘êéÁN§¤ó_Mq(~ ¢Àvð¿*‹Û¼©±¾­©¡èN÷f"í'q6ÛÛS:®§»š]·‰?Ëæ›òWë4 ¼«2·m~V‘wìipÚØø!L«B_ÁT4àCØÂTZ˜%^QqI—f©×ö ’(òþ•o:î²Õ–» ”Wll'¼2(É6mQËtõî„£F•@Ûâq[ûØvùéGœ¡îy”mdTÓW¨§tš`~¼vÚ<Ø6]±éKÛœcCêmkî¨êމ]ÝÜåBwÒÙÊ–6Åî‘[Š”ÂY´\Z.B½f¢nfí±Yߺ!|&TÚJ†·'”›}<*Tî««náóÙYù¨|‰QzrÍQÆ×¥#Ǧ>‹’Àj}›o…¡æò¶/JiÁG­ÉD…xÞ‡¦èdF[¶2öaŸÃ:2µ¢6–¸-ÈŠ¶ ø7Õ½4òzÐ&¸aåå-÷ó1€øñÃgfy,WLÂkklóÈ $(AÀ¸}P•W9È8gVÜ>k‚nÅe~°EÉýè`¥íY•. Jкq? Ç)á´ã{ÛÙÛLJæD<ÐIçåÜp>ºòιû’ RV(YYýØN|-¶¹,ÒYWQ¹eW‹}©Ë-›šÙò­¿„ìkÁë5 [ èö°}"9Ú2.Ör•vŽ„Ýlò£Ðåýÿ¿•·/ìøl±l7…>Nm6Ãd€µð<ìkTJ$óÿÈ%T2J¦+ a¨û®¥;ÃÊ3²klu‡qà­U„‰Q©6œ‘F0ÕFŠ ¥QX|;z~;Ú7`yåzþ²tƒ‘Ÿ€Žq-Dlm¼Ëï¢í7x˜=×, wLjHXîjÐQåm¥µ’Ñ4î‘+µ,Àæ¼ã2— @×ÉD(ú*Žæ—„( ·b‚ÃQù¦ïãE»¡ú°£¦¾kì럾‘Zô—àZìŽ$ Á¦Vˆ>¶ †€ö…{^PË›†´úàØ»|+isøª;x aCê}®ø‘@»@ `wÛö‡£œ†ÞºíNXD ySl¸_òø„™™u™°¬•AÅË"o›ïl_ÊÜ »çlÚŠn¿¤Y'úúÝsš5èžòƒ PùZ+“˜L~°4mú€nÌ⬙Æ¡ãàí#:í±´¬Wš[nvÂÒ cMhŽ-E»´…u’ù±6sø©Xv;ð’Á«õ.¸€Æ[ÒtODY.ººf¢=زd Q¡ãÚÞ¶LÜæ€Dá{Ùž/BeyùÈ\ß=½Ëïü¥Aod½v²·aP$Yt0r´4tÀZ¶Ê€™oŸ5û|ºáÝaß/$ýG÷船ڶn‘‡E+`”o+ü+@˜è™5€*Ý7‚Uxé\Uø×XHð³ë#܃:é>³Ê–Ü1·~ØBÖ BHx\ÅA[Ž øsl±jÁØrð—ÄXTà¬ÙíÎç\Ý’B°2Õýj aw‡Ï 0Lj÷W\¾¯a„SPçOaQ}C>òh@íÖŽ¨‹ÞøS]9䇚|#ƒºìmßÊ=721UlÙÀ‰…ó`ï%$ÃZqknÛ‚A׈³  ÔÛ2w <5ÄØN7cö®*º~+ìJÉœÅ~–„)…2 |Iž…~I/é_Hª:aû+Û-£CÐât.OП!wèÝì ‹aƒ®|`Œ ]/ þómR$‘Òy¸<ˆEŽÒ¢UF>[àåÿî‹#‡·<,ÅÆ–‹mª‹Ô†]R Ð§Ã;ÛX‚¸àѱŸjíÞÚß~ðG\<ÓÈœz?þô+:çÄo@ÈFR?¾b‚ˆÀ»¾x.L¬ž@]rÑ5E.p8ÿ@÷B NKâÞ:|´œ¯UE:ð7îë©&O8¿_º)pYÒ9|Í­ÈeÕö»]Þ¥À¬{l ¨«üA@¸,ë =±ÿ+ ÏE¹~zŠKz£)æ9yxCpUz2šÄÛXá«Ç¤JSÖ„cƹk@°;6Õ:j-jÙCÇ%ÄëF¦åÇž²×¼ƒ×íÿ–×­Ñ(Ò¹Üñs.÷Ú€—7>ç4ÔÞ«Ñ?Éõ™0^•&‚ûX/Û–ë‚\.“Lä®»=E‡8âaE‰*¸ªû–Ç¡›\Éf—U €¦¾Ç§ j^Õý!@ìÙ–ÛÊšìPܲšÒMˆ¶ø5gNz“Ú¥d€8X‰’ÀÏz†åQâLKžê8&¡,H‹DtÎyË©|4ËGSüš†$ô°ã¢ohJ èf“ïú’+|¶$ôšü@ötØŸØ×†»ÅõNæ ‚D(é9P¦ CI·}G]_.o~úøù†+~^:Ï—•RÊ»¸¾¾øpó󸢨­¬Q£°’sþ¢âšZ„±ì‹XQlÓˆ,œ‰ˆ"ÁÐÈ{ÿæy^ÿË ½¿xuùîòægìŒ9aLo/o>¼ùôiA«Þ┯9–¿`GúŠæ¹^Áeß\¾þüîBº¯>__ÁE|üôftO'@òº®ðIRȸ NÐESø¡8M#²@eHÓJr$8 \ÔÁd0{жÐ>"CêÌ‚H®CÖ³o†Þ'×$CŒB¼ED|ñ—X)oðsn¤ˆYe^[ƒ(ï^a†«HvL“ZXã‚EPÅË Î|á„Ã!½.$úv˜šîa…l7¶$Pµävš„J ºIy: ›â¯M·`ÂFŠ¢ ¬.­Zß;©#D8Нºn*g±÷kÞÔÒìöE‰ÍLâZ(ü8ýó¤° ÜÿÂ!åU‡Î;µ@òK±–/myW““μûÂåC(6Ú°m¿áàÓLݺ(•Õ’cOâ‘lZˆC‡{NBCSZ£šþÙI²ËßË,Å.á(¶OÂ#¾¾iDO# BÐ*Eì½âì¿ãì¼ãª¿’¥ÀK_,¤´ÁÈ7²ï¯\;V.^q™$$&AVIE ì[JäÂŽ Ý:¸Ê#7íáö ™hBrexn“òh‡ÝÎY|ö¦>.&˜Ý×I0U2n ¹u uÓ‘gŽ_Wʶì…1Y˜7™«x ì×ÔOùáì Sw?Ra‡õÐÑĈXFˆ6tœþwŠ=²™O^t%¸™û©l©“Ët‹HF!Žˆq²ìÑJ¢窄ùÙg£Ç©qëI’qîýÙU*6£Ëİ4©§[ø3XÚŠ>h„ÞgCiZ‹èç¢p&F>”éé•D‰'^’•ó™±ÄÏD‰ •» ä<¨Á`±qP%Û¸]L3¼¾?›.8ãªc4(vK`¨cÊ´bÛÌÎcɬÄOW:I§ˆ†]ÓWø°å*åsp2QrÒp¨ò#A,+ÚÙ2ó¼6v  [—54³O±Qæë,ò’õ*£ £Øøœ6û¥Ó›Øô0j[Üá&9X"гgw/ÎLÖ&o%¼§ïŸ¡â¨7tBøÛ7MÎIknô†2Æ#÷OFÉ9§Œùð ´¢vfÃ`¢pœhv AâgjæÕ¢À•Ç'ù[5l6u› ûùU0Dnø©’>/Ïîg8áù‰IßÕ<ÓëíkO_´Ç#à~ŠÝÔM{¹ôiEù¡2ÕÙ/ŠØøÊ ù¶²‰šYÙDãOÐÊ¿'. ‰l¤´Ø4$!©U’ e±[²‰|{K$ûˆÌóì#vMÆì#8D¼¾>ûê¿ÃøãOžQƒ—„ôBn†;èeš€>™vd€ Ý•V' [8ÞL(Ήê0“¼É“4M¤}•¦¿G’ÚOFå~(JYa#q ¢P”ɶÊtîS3‰Â“K•oªì‡Æ!Àä³ìD‰Ôïܯvð¢éuEžËÄëDá±i»¥§ªUâ›ô·ŸjvN³/ÆÓµv Ø(8.i¤lî‡Eówæ§áÿª3€1r%ÁÜN’A…þAM¨±âƧßq±×}Ç¥_?艚ŸhI¨©’„¾1'J‚«‹€‚tP—“£|CVJÇ~™oÊ ¿#öždW—…&|IbϰNs;¾ûõÐÆ8Ú¢ endstream endobj 403 0 obj << /Length 3228 /Filter /FlateDecode >> stream xÚ­ZYÛÈ~÷¯ ¡°—M6/?%dYÃ,6qSRKb†"3žE~|êêæ1œXXx°º«›}ÔùUõ¨»þWwix—f‘ŸEéÝþò&êÃ%­-LØNfüpÿæûcu§?ruwœ.q¸û—÷§sqíM»ÙFQäåï6[­cïçM¦½¢­ËúÔÁˆŠtè%zóïû¿½ùó½Û-c?ÖÑWŽdg}å\yä'p¸ÄbÍ'{Ä a^8§”¯‚–¦9õp9”G;q¶ Žü/NÑ\Y¨Hü¼f::üØIaû»UA)_ƒʜߣN§°tËÂÐ*ôƒPÏ„Áû—æX UÏœnj¡~ â Šá_Åý'Ò2'3TjšoS˜¡žò`)`Ä>: ¦‡Þ±PÊ©0]éêyª\ð—MJ4 3oÏBʈÕhÄÕ¡g"®Úrçy²iéU 9‰=è,õ7ä2:§ͪ+ üÝ-®LO}±viMõ Zv£³S95 4rFf& ˆî<Ãå˜ÏŽùböCÏ+ÇÚú³}Ý…œvVL…ÐΓåHvÛǵ›ÓS™rêæo¶q½âùÃÐOux£ç_xþØ:|¼±¿u÷«y¼?kc=¿êSY‰/ uègéÜÊîZb:TÌ/‚'k*P x"^âØÅ€O:É8J‰]y)«¢e"š ‡œ¦ëÊ]õÌä©›ÇoF7££6bïÒ°žâ¼ª¨O˜mŠ>ÌÐ:¾‰È‹KCâF*JNf炬Уjêw«¢ÍÖå¼â=rB¿×5Çþ‰0öÎEÇA®c«*ë¼¶‹SQÖe–Gìí‚$ElüΦ¼VBþ>¸d‹ÃîÛ²?_LÑ•úçØþvméGkª8ôj‡ À¶öC_ûk*¶}yãWàJàGIt›ÒN,áÀ57ÌÄbm[š )Äl8¥ÆŽÄrnqcª¨XLv*‰RuZ~Çч;¨”ÃUÖkäW4Çø%˜§çœÕUkâ4¡wqš±šÂ)¬~~KýÚ %%l>N¬)¡œÐ<ÉGe ˜1ï1\¯M+‹ MPã2Ó¿ë\ÿ §ëKcœý-ëªLÀÀƒ„c–bÁlHÚ±êp¼ßÁN`Jo¾ôÜÂ0W™0œ 2AòµmNmq±³ÛKYƒãé¸_Á P¾ÀSEÂìápœº¡ì‹ðfÊm /mÛX°ºGÞF…C#¶sP‚Î+TôFÕ]®ñ@/‡¶üÀ¡çŠ:Î(ä±ܼÁþHË>¦AÚ»'t`ÑMoöýü¨Åô\«Š%'MÜöò`Óo×t=SÜæ0Ò1¿Ù£΀ÁÄd×£ÝÊq””ð©©÷3&G’Ž õSÈMô¦1\ð%,ŠÓHëUñ¼ТÔð8·áÛþ=žP…è=2†jÐaqCƒa 4Êz_ F-ÊfyÐèþpV|VÊ{BúìÍÛݵØË|fdY„¦‘ÿëXá™ ŸùÆU²†"ù:s¨í$Ñý«ˆ;ž!î×–ÆŒØ<~‹ÕtÅÇ’à#N ‚ÔÏ£…ç_gÉD³q³ö†ã³Î…aø Éò9¨tMσ”Gfj’1ÃèÁT€­PŽsåÂbˆ¦‹Ó[STÜâ4GjÙîRœÄl±+ù:þ+n¤åQ™ÈøÎ²\k¸ÑðM܈YJƒRÄs^ýg蛣ƒ‚ž¹ýtFí$Í$À¯m~2õcС±AweOÐá\²ñÕh—þÊ€,\Ø›ÊØ™Xí ÓÝÕS ZűÿHÞ÷ŒsH" \•/IÙaUw؆“b”¤1Ry`¥ˆfJ‘d3o×T ;–Ê@!MG»]UÄÔÇYïV“év¢„x@Ñúåù"pYyæ¼¶yTkV½v૱ÂF­ÅÎKÞK ¾KñEȵZ¦@€s“,¤¿¬Õ‡nð* xÆv6cHìÏE¿Æ®y™äü–¼ýÄ`Å«D¦à95Ncï;íGzJ UxŽøÁ<1Fú¥i°Æ§`*Øpc•+ðã@ *R¬Vs“8œQ¡MÖ†;„ abâ…² •;kcú ˆ,Ðeĉ”ó,Ên¸\OyE$Ìêz<"~r N%W •ÅÚUt´Í¸uVˆÔÔ çôÌT §NµKÂg’ZãtÞ;viõ¨ßz‘{ƒÄ\éˆÄº†Ó!óNÝ´ïÖVšéĪG\ìQèl—ª@9«D)ʇ=v…tRÍœ0®>³\$X¯ÌuèŸ1²Eݤ¦ä X@¢_Õ"H‹³d)ñ‰›\¹öÏÏ—ƒdëíüŒ ‚Å`äüž…€XŸq>ÎcQäžÅØ.ëÅ'—òpp~~ ¸væÇ*šÏmúùI6/^†€²*àØU.Ts\‚ƒÓ審»1éÆ8‹²:[p£ÏvraìPbòs t+ØQUÜNR´Ã-‹Ó¬IO‘ Ò]¡þ×¢Fü„[‚«;xíG›³p$•)³X¬&Êl‘HtYÂ,>!aÌ¡s-:* ÐÌfÝ‘çpúä¶Út˜9ýfˆ ËZˆºîWóÔëö5ô•M¼”cý½äÜŒ7hÍ‘1Q&ù=ò¨Ûg#ôÞsuE8Øõ`³E{à·¸²¾=‚;t«°ÇûZÿÎò”ƒ/uÄF[áÅQf{¬Ü“ž{RìQjŽí±š°Ý=)ªI½;…ì9‚úéŠÍÐ_©Œmð쫇½YÅîY(KÁ5Ùút¤žý–ýÚôÁ©;ü®'ˆ=ë(]yv;–• Ù8þ+õƒY­_ &;pÂã'ò´*r•#(Ÿ=$Aìýµqšl©nÙÊ-(¢e©« °ØAƒ@-¼ô¾/Ùh{ë:Øeˆ|øù;T#ÿ¨TOUïZô`âQÜÇüf%¾j•}ašœŒºþë ¯¬Ý~ÏHÿµ¥uìg#ÚþóÆÇ¼PO+ˆä|IÉÛöÜ`”Cצ¢©»¸<A›§ õ°¸9Ô`bJc :Ññ¢êšÅÛ¼{Œ_ã,þUA4Þÿ–Jˆù=˜…<ÀÌìÕôÕ'|Å¢„¼ÊÿµVD|Y éØW„~ÿÀC_µ™8ŸÙŒT*ÇB¿}\¥Úð¬誰ÚUaW£¾ì0fr‹w ‡·òû¾ªÌÉÌy¸!«C‡L§P`o|âÑ *kiؘ<6l‘fØ7deMÖ–”•ŒëØwîM*ŠÊV•«Fà.õl¢œ”ÿæÃ´¯=¦íъϯ¤HÁ7q¨ ]Ùoó³!¨p¦’…Îp ÕÚÊq!¿æ‹üù˾—?™xwÂRÃ@ý–Êî=gIdÿdcàt,¶wû¶Ü¹70¤Éß9DË×õÈOÈ Ò øuß“7Û²iíÜ//V‘ ¥”Åä©<ó)—É;ðÚËä‹x (-´µjô´ãß•TeŠýÞ\·âš‡‚!œù̵ñ ¢;„JwpšqŇy) í™zâܱR¬¾°.Ÿ 4°¯¡÷íŸ~ýµõ°. endstream endobj 409 0 obj << /Length 3178 /Filter /FlateDecode >> stream xÚÉnÜÈõî¯| H4÷Å9ÉÛ@Ç1âÎ q4Y­fÄ&;,Ò²òõy[‹ÝœI`@¬zõjyûÒ¯ø^åÑU^Ä~çWõñE ÐÇ¡ŒnáÖÁx³{ñêC^…_exµÛ»Gìš«xw§ÓõmTxªoÚ×·q{w¯ùûÓ§¿ã ñ>\‰7*ųwlȽz>ªþS5µCÏ[>¶µê5 †e„^–^ÿs÷—ïwö…i”úiÿ2 Ö-ðú0÷£0M -Qæ8³´Ä¡¥%O½»ëÛ43¤ÀüÃuiH’øL ,)°fHÎy¦©_Àê(ö³<ä˹.bOÚò"ôãÅ̸OÃ50ú;þQGüû9?2VÞvuF¹àùaêç…œÿv8ážç±}8à`"Ü4ñ#`CàÇQÉx5¿8 Ü߯~ìtоaºI[œÏ@ „o nìóÂ&†ÑÍoœ÷oèË—a ¬EUy‡W£â cÃÜ7Äu9徯ýs¥ ƒÀ/®²<öx,ªŒGºSWqóÖAeˆV$®Ž#:ÓtzýêÕ^ïýa|xuñ€"óó`ý„K­5X—ׇ×'¹¦|û{Ö‰ñ?C/|k5sDìs<¶Ó¤†MkTŠÜ{æYÕËrÓêil¿Í“pú;"©ñ0úh7¶J“ ðòÞ"¬iñ~@âuƨéèž#Öj(rƒË»Fè¡êÚþ—ÚI¾r^? ê:2 R Õø¬ýQäEºVþÀ¿¾Í²Àûü·÷w?¿ùøž0!³ˆŒ·;à3“Ô;Í#ómÐ!ºà+t%‹…Ã$ó 8 ßcõH¯âÕʉæ¹êê¨W?&¶bvŠÃ#-”Þ0Ê­ÓAÉp?÷5*zÕñœ¥ƒY«ýÜmÉâ‚Ùb±©«Oi11»G»Û°kàj’E«•„໑_8ÐÌ "£’0£“šáÁ #â ®VZÏ£`ª ½]©ÀÇÄ hþ.œD œ*¨rh-¾ G¯š­9!ª]‚[Y)w€zÝðà©<"î2BVÌÒƒ;CSÓîŸE=K³ÂFk„À‹ŽG5Ö-¨è3£ ²Òƒ‡A‡98àñü•ùÝ_T=€ƒ‰=¸)*sÑÁ¨(ŒŠÒ;p2OÇÈL´=ÞŽb.âV3&@bNó·®ÕDÁ•½.3˜xáAM ¨‘«ÓåUí¸¥•tÞ0>J4x:´ðìN·7뀺mÔh\ØÈ„žØn`í›9b?HD<²ú7-(RRS”Ÿx¬e®aºp#›^Äà8[}éZ=LÈö ÓÇ–Ô¬o߯aœíìÔ~zyƒ"Ñìèí¨ª^ΟÕÄ# T?K_Lá†z}‰Óœ'X[B bÖ(4PJØ{Ôª[t`"ž[ š~úÌš]Íã#‰w?1Z=ÝœDÄ¡g\‘¶73"¥XùIõjD'‡“Ϩ‘5…ó7fâ²Ó }•åD[!Iéö¡7z%Ú“ÉÒìã8ÌÙ¦¢üJiìÔC…¬èP—«"cÆ_” &Èa\ƆÜIÄ“À ÎÄ8üZ,¡EŽ´+{û`y“³dSh‡QIò§[Wö ÎuÇᇤcQz=8fÍCÑ–<¸Œ@d…¯QGHf…ÇöõÌ“ÅÚxN²IP³r¥>¹¸1<ÛêLŽ(ÌGÂȽe%Ä;´½<¢âX ¼s‹Å§®ªI·ƒb âd8qPZ¯¿¼´~:v«0ÖœÕpŽ”¬¦g[ Ç–‚©ŠäZ(=ÍIr+jéHî†d/´F<,Ïý-z¾Ì6‚!‘_†|ƒgäp®y.(ä-†±knŸ =BΖ‘Çžòêª#§ò|+ñ ïL %ܹ_¼QÁñ‘šy´uuÉù;.sp(BÞF$%à=ƒr3“V±sÚVÒ1œk x?":AÒçs„Ø™˜G½;%˜LE©•’ƒÕ’9¹xàS¬*Ò¥Èð޳ÅÍnµ(械ԡ5‚dſt9×™Bô 0AŤÙ5I58ׯˆe“‘”-.ZÓ,I>ûv„Ê*r‰‹©ù¥<ñ7n’^]«Óf:ÈoKC'3J#¯Ý3PÎd -¶¸‰!A=+x›WõVš«"GULz—²æ›ESt `Tÿž[ ¡÷À¥±¡¥kÛÙ&/õrË`"HWbX•ÄÉÂÄrœ"y(Ä““í“Sb:.W›.“C×(a)‰¥©™6sjXéñ4Œàv€n¤5!h¦l–z+¿¨·ê,½2øø1ݱÁã\¢û`09¢l<¿«ú‡¹zPka-²Š3’•)™ŸôEQ~É3Êb*Ø’2Ð¦Š ·‘…W”ÒFñ+žîG‘Ë­I{ª•D{Ú±ç/K ï¶1—6Há°ÀÊÓøò£îf-õõ`]X^˜¢ðFÕqóüÒs€A{â5v@9]ê|Ísvo™i Лÿ?:P”i` =¸ìøÿIK—k© âë›ÓËÔ¤—ù¤{“ÀNô² •’jÀ y•ýfœ')…Ô|z"±<Á„ÅÆ¥ßØó»ÊÔòʉDP²Èe•‰S²;z!€.Aè•a)Ú(¡ÒäêKöµK¿iáKË!õÌå§jœx$MˆuOSd^anõ*¬ýAujzHB™W¥žkF<ýŽ2Ødœ¬PQƒPõr2ê F®_#|{‰ÏBÊ¡ àŽËFwõ4vã,J—„,瘙çKõ‘só— 嚆±­)]ͱCØ÷†\ ÊMT†™ &,«êÏÏ÷,Ê—Fùn$Ø ò·ÅƒAEÕݘ¦uÿðRì äyh»Að©-.TRBŠSJH竃DJÖ,L·¦òH¤Š³q3¦ètü&ζî{Öe`E5¶ÕdJ£ š¢ž”Å¯Õ8± ’ISP@Ò$g7ÏžÐQ ZÚxÜÔN’U9Ú4N騥e€)φ¦¸MÃ$†¬u}zŠkŽIæø˜,ŠÁsJ…á»)_a ÿÊf›.6tÜ[L¿-Ø«ÿQãðwð’Ñ¡ÍRïÞþDö{?‰¯~+SÒÍ´­q¨ósmúåζ±czV~i¹¸´Øž8‚Þ¾Äüª*?¯b'¾W¿ï&¢,$7ñÖ„¼œêï(/þ1¡ˆ²ÈvLql]"jH6&ž*­!µÓ> stream xÚ•ÙrÜ6òÝ_¡òK¨ª C<óæ3ö–ãx7Ê&ÞÍ>@$4ƒ‡œåÉ¿}äHTœ-= Ðhݾ©ø"‚¿ø"Wy¡ÃBçÕñY$ÐÛg±Œv€°[a¼¼zöÝÛ4¾ˆ£°ŒÊøâêf}ÄU}ñïàÅét¹SE`ÛÚÝ_î´ÖÁ‹ïù÷‡¿à Þ^IÐ[˳×lȃj:Úö£]×ò–®²íˆq™Eqe—ÿ¹úÛ³7W3…©JÃ4Ñ_aÃc}…—R‡0”…Qš7@F^¿Ç:¹º,tЛv8™ -‚ñ9¯VÝ éþ³î†ǃåñWxþ`ÁG`*°pO@M…8×Ú]oMm®:¦ä[ ¸d÷-€ÊDxêí §ÚšOp-ã°¿‹uŸÄÏM× ÄypwèP²8Nô¶r¿GqRÉàŠø×à\¦i`\ÃD%qŒ/³8ØÛÖö¦áÉiºn\Ä&QüÅþÌar£?*n.ã ëyÜÛ?ÜàÚý Ìݤ€¿ú±XUÃØ·?¸½Ãéëæ ïºsã‰RW1x´÷²ßÖnìúÁHÒÈÓ‡sw4{+8UwdiÖ¼Œ*€K'wo›6Ç[o1 uœŒ›•§}·ïÍuCGt-B‰ ?©{z“;_AС;ZݹÚ"×xÀÆë=8‚ñÐЂE ’i˜¶æE~@ܸÁÏú9“à†ß2 מ¦‘g¬0‰\A%GÛŒÁûæ’ÀLc()Ú‰6ØÌ*ºiø‡ÙìÙ\ˆ/²\6lèÕB½Vš/×J5éÃ{è—HÇÅ…ôŽObr€1›*ÍŽ¦–SÉ4Š”ç(sçYfâZœLÈUh—+âЈ7ž@LZ¥xk;à UV°ÞÐ\ƒ·¨ƒ´4UkÌ28˜W¯Ù‹„dzûžuR²>‰_1oøw"s—s6Ê´žjˆqÀ<¼ë€æ5òÂèÐKbŒ3ÇnZlŸß÷ ž‘^%¤WYéày{ÔL<¬3ñø“x5£ƒšš¦!`+îøédà}ž‡33i˜ò6oîÍñÔØc Ǹrm4y¼qÑ[ 6蘚³ƒZU3ÕéN :C âs¾ŽÏ`a+ %æX¥i¨«üôñ‡'^8ÊÏøÁ1Y˜ªrVO¤èÕ¶ì’P—³ª£:lÃe©ÇùÛ§MŠâ2ÌãÙ Bf“} ‹b,ìtR›åçʸ¸­4Çœí„i‡éÑ<À(ù¥>ýÅQE/  ±<Á¸ÆÛXÄ©¨•q×’ÑÑ. ¯”PÜõµ_Æœ•Ód;ì6“6Èu·^}Y”ý·£tü5·£’ìënGÏÏ5ç^wÈùÀÃxŠ™ÿ†ÚÀÖŦŸr/)ø t¥3ßù;@‚^>âì$ÓC96ƒäk½d^`"eN#)žÏ¯gG(,ëÄ€už¡'R €*ÁUÝLJãÓo‰3 c¥þ’ËÏ|Xòÿù°ü/¸°b~W/Æzª¬°7ë)Œ¥*ûV ðµô±èb—–%¡ŠÒG…«dGÓ(ASC4êçÒKR HãžÂ÷fsEBW)§HnldJ²Ï÷œ§Gò‹¦õIJPe^5S ‡ðÆ·*¾U*&-êsK»¤8ÆÕq¹ï$^òÉq°Í\pj¦Áôè>…¦éVµšœ°Y‡JeÑZ´ÖÖ>W¥"`‡®©ñÎ8 »w׳ÔÈ4"x0¨R)WPgœþë1ˆÔA@ɽë­,û{Œo™žTEÉr ‘¥p#•~‹„q9Xz ºxêZþ-áç(Pz8­;þ%óÅÁA –Ý/Bæl'BùCÎöó-GØ•áêJpzäÊîëákùÎCÏdzqG°V¥@†³êtdkÑ.êHEÝúˆ;$¶Ã@pû –vè#&³D1)¶*Q‘-.éÖÙn Q{×¶óâúŠ †Ö&€­©€¸ªÑòîZKy³6ѵ…F\’P¾9@•ü\´Qf ÉK}…šÃtöC'êÕ‰º‰Äܸ*!¡jÛ–rÊÔ±w׊„$" ­¼TloðK´¢eΡ°äJ×¼$qr‡ˆ‡¥œ!à Oæêéæ Ø–a°eË¥ž= ¡’³€‘“ßÞYsóAë±£ÿc#F×hª 2")µ¥ÏHžÒ÷uj‹*¦ì(½y:±I²m»Î°çá\¶j·àäWŒ®ÔßctV¯ÝP5ƹ7 ¨-wmaDM׬w‚KÝè*¯wœ‚•° â¾Ãvç’™MâÕ'œ`ŒƒÌ„<1ι׫ý÷ýøãlV(‡?ã þpóxYx¬Ð? ®ƒ¯Ïï«Üt„,Sʳ Ì~ù‹Œ{{'QˆÖQ)P1çR¥g™R/¸ƒÒ[KͨF{»7}=0°êYq¢Ò÷a=£ ´ï±÷©Ö¡²ä¦ó†–b×ÄÍŸ~¸¹Ëa’',OþŠ&.×ä‹<Óø<©µ<¯ª‡I@œ ¬s5ŸBoÒv @3Ð`f‘Âï’Þ’ÞÌx­Í£•Öæ1ÞÝ1¸±äQòh1K]DÁÔÖÄVîÕeã¸ýŒ&\üwE_Þ®B·‡ð_.üe‹\ÎI‹–(í^íÔ˜Õ>¯ÞPQYæŸ+-úàCðþ#Ëïøxõþêó“ µH•ù¢E8Á‹¹ü–ùºÙ…¯ 8Ɖ¢ »úN‘ªÌ)8^fWÈœäàì> stream xÚ…kÛ6ò{~Å⾜XûD½,÷[šG»‡¶)mÃå>hmÚæEW”âî¿ï¼HQ¶’"@L‡äpÞ3ZuÃ?u·Iî6eº.ÓÍÝ®y ôó+%£ ¬ŒïŸ^ýë}®îT¼ÞÆ[u÷txÚßý7z}>߯’2ÒíÞüy¿JÓ4zýÿþðËo8È¢÷÷eõZóìm6Ñnlt{ƒ¡L×ò–ŸÌN·Õ¶ˆUTlîÿ÷ôïWïž<…y’¯ó,ý›g8¬¿yË6]ð bç¿f×ÝÃ[¾àHDÔß«ÈiªŒŽvÀÙ&ªjÛñhW몯_ÜîyPë£yvP³Ç—–Ñ`yÁi7Ê&¹a8iœÇç.6I8ÁHh¡ÅîÀ¿€m×¶ëûU–n£'wÊ¡ïøVä!ðe¥Òµ|å¡«´TøÈ<fç^ B=¡Vc] È µæáÅ 'UnõBoí÷–§DxN°[ÿ1¶žœû®1íìnf/ ¾ ìÕëÙÓøeÿ¹/SbmÇQSá¨ÚïÚÁÝ=Újн©jYhJ´!`‡ÏXÕ[F0-¯Ã‘µx_dEô¦;Ó}¦=2³ƒO‚…SÕµQ›Æ Z(º%!1‹Rµ@Æ.$¬:€Pwxc½/ A)êÞ‰ZÖxɱ`$–4™î$3-™²R'X·`¶öðâwYGk×2O€Æ%Å«ÄÔŸÙmðdèuEÌ@ÁOHÝ[Ÿá¢†Wv!ÅÈa"QÄמÉÁ^ï;)I¾Þ%“ñˆÏݤò\ô {¦'¬ÿ,]Ïm䇿# ª—“f\Ç3ÂéêT¹í„¿Ÿb• La)K¶^G3švW{Í“Ššj‡DœÀ¯®@¨{© <¡êõUkÏ ÈŽ­Iëì|(\P§y&î ŸR±ƒc¸ã×l?©ö ˆéiYH$E`³yÀ\¢ @¦{îå’æ8«œÃhÀ\t¿jõ€«|}׿ÕZää ƒfÃ'\Nfº*w~1‹ŽºÕ=èùmä™îÀx÷y5ZŽEÁZ¶ÃqAÀ2°Úí´•1º\ÜwHᥭ»jÏù)÷8v+Rò- t¾ßóòÕý²§ïÄ!íºÚò‘ÕrFМkMÈ7Ëê€ Š<«sIHrgÀ0x{£þŠœZìÕz¾ "(y%6x4Åc|U 15‡4æQ'«Í1E¡cÊéÒº`ç¢~Q¼˜eÓ)™J%Ûá|‡ê³„ÊLeçãÕs?î'ópªg+‡_Nºe´àšÌûÑÈ¢÷.¤uˆÌÀÑç[ÕòN'/Ø8àr%ñ£C``ÀfÅP —ɯÀüÊàFFŽúŠ”‹Ð˜`v1”ËÁ¨×Måî“$×Ã3VfCþ„æþ²Å EÆNÉÏ"h”—Q^–Óa„ Ò!6^#VC Îàê0hJ—ƒj¸MHhM Ü=<ÙS !Þ“ÅSö±tóxùÃn ôSñ]à ‹ˆn<ŠÏ’›{Æ‚€ÅOµ¼Ú ¼×CejHô$àâw ñ š-I¡:·,9ûœy$ÜJ$¤ˆTR…‘Æ[*s(pþ1º& } S½ídà’%AŠbä úב'.ÎCbÀ& է®—û9Žz„r1ùŒÅ}kRÆØÑ†Î[“ò¼¹t¼"$å@]õG’lq"2‹Ì¼@†+±?4sµe_ ‹Gã’jœíÜ—ñï‚l;“> !_ …çXM| ‹L¶—tmäŠ{ï2fŸ)[ÆXWÒInÊzZQ”ù\;2¬fŠ8úùÃÛÇ÷o^£“xzüðËGÚ2ÛQ^×\©¢š‹™LÕ€Ï\ñ€ ðs,Z㟟¹;°7˜jAÿÏwïˤZÉ\µ‚ƒ›¦ãížD9¡†Êb´ Â ‰,˜2áÐ,‘sIÃS^©žéb–'‰áÁ—¯”Žo›Ä™ Œ‚Ü>EE·¦gõˆð„Œ}Ç Dø{)^Ô€(OÄ!Tz;cuý²\L ÿØdAo]äC’³mé¯lÓGÆ$X‹¸X×’§»ûŽÒË‚3eÊsN¸QH¢aDĪ©„ßø<Œ¦Iì* (ûCª}z $]ø•b#¾}gï#ôŽ/'F×Så—¨ˆËÍÎ2/­åŠ+¦~‚Xš(O°_“ÅÑc»\Þ°Ž>°ùN Æt¢`iïü>HóÄ®ÛÕæí¼Pöiì¢~<Яïˆ0 ª,çâµ8ˆßð¦lçgN{qð„t }S!ÛdѯH4•gU¾P€’3€Iw½{Xµ:rŒU^”r•ã"ø‚av*@£pVÏwTëÓ­ä×Êu¦’™†-ê¨wc*qçRìˆ*ñÉXãÓIz‰€ÀK ÙpÁÚÑpYÆp±/wѳ¹¯^ó® Ÿ#×¹˜b“-®³² V® d% ‰íI¶~„Å®a¨ø?žà“f¨7îÅ ­ é*"ún§¬}vŽ­âV±>¢_Æ>.zë›Àg®_×H¼©/ár"ë{ES˜t)ÕÍ.È‹I³»oŒµÔ÷ã(ºYoór¿#ùÉPö¹Q¢ç®»ƒ'#úª¼y²çÄW#eI-$çÅ“0¦mbé ÄÑeY·<ŽoÞ‚7Ѳ"2k+ ;B±ÏEvàÞz#&ãdÎ˜Ô ßò ï‘çK>×26 .3Ô›ÀÀñPƒ^÷¨¥å–û@žKiá«âA¾Ã™S¸ùj?Uå RàÌ™´¦ò<žpÝü Ï ©®“ «ëù&3ØoÝ@ùò–•”°ù÷TÉ®ƒæ ·w$,'€ÓkÑìXQÑÑ´57ì­7‚WN¸#¬qÅ5> stream xÚÍYßo7 ~÷_¡Çôaw¢DêGhWd° EÚÝ‚<¤‰ÓK|sºÿ~ÏËêZNfŸ\´/¶tGQü>’"ïÎåh¬q9²ÿÁ“ñÖõ_ŒÿÎ09üG#VçÙ½gƒ ÌÆã^t<ñdMâ€9›œ°žHõZ  ˜VP2ä\4NAe±·*ò$V9§VD ¬!ñyâ 8(ŒVe 0fo«S“ 7{˜‚M(«Í¸lÄ–À(ªºlœƒ%rÎe™D<È`¯7€›‡5jaÆ>kBVu”@•?.Á Xê2Ìgà k8­ Ê€UøìÕâŒ릸Ï:Që8¬^ÁÊ€]äQQ n']ó| f˜°UA ²UðLPep‘‹¸"Ù°:ÈÆ A!XfNz|‰Saè‘ £°€C¢]ênèI"–gÒ+„¨pP˜€^ÉUBq°×ˆ :ðF¼²‘¬V6dX ƒ)"PïÈ  ›$¨gÀ´ÄWŽ$Ĉ‡?%©BpK± NV‰„·‚M~âs2”Q¸ h¼"¦kØÀ0Ù‘Ô}ðr¯¬A&@²lBTFN!i„[èË”&ŒhŒî‚'¢’‹8Œˆ%HDsÐ ë£úÁTdQ'@FI†7LQ™dbPÁ¢rœNÚ7ßLMûêìÃtÒþØÍû鼿Eü$dáñ¤=žÞvw‹óéíŠÃ¥_§³³Ý'sbqA²4~HLMʧhZ@âñgφ]^š7dö±ißýþŒV °ÂÌï®®NïÅŽ`€9<4íbŠÂRþH33ý;&às™îïxMÞû rRîÇŽîoÀ‡´ÜÛ´¯ÝùëioN€úå‘ißL?õæ? 6Òááš5:üRûx:ôHGÇg8_R³‚y4ÎTâ µ8÷íö±àÈàˆÆ€kŸÏç4ž­/jÒÚÎÃýIûúî}?Ì™Íÿœ´/ºÅÅt±Üžªç€#¾¡¤ç„mÎ)ιÐ ÔHˆ=˜ymÚŸº7¥/§—gwW½ùíîzº˜›£nq}Ö?QbVx'·ÞEÏÚ”T+©7Ú!±tˆTFÛ=ŠGPo#×d$ä£rd¹Ñ*’o´¡Ø‰Ê±¹2h]mкꠥ”´Fhl\“´¸"ˆµf:ë›ycÔÍ®z„ëüÃz º¯¨£y/cÓí›.­Ç¦Û.6·Û̇ ?^V‹äXf<•ÌäJf¼ÝGÔŸH^ lÞ×bã­¼¾…Øÿ{ý‹vè+f‡/ûjyŠ{?ê‚]”m%P¦­b ±ŽÑ”ç :Wê/;_}]þçêz”© (Í„®É¿KÔäáñÍ¡¹¢õè¼»¾>›_¬V£Ý7f uH]ÔA‹ÇWqÒàê µ~ã¾oo§¦»4ýGüÝô³nn~xWg„:<5Y÷u¹Ás¦Iˆq£¶B/ì#«+”É'»%Ÿðzò íÚ^)sL¤ç>\XÿàÊfAr%´`¿he¯|-4®†6N.áÄZ8é»ðT,Ÿ¡"UB‹îû€Vq·£#æÚ~Ž}T‚TV‚d+a&úf¹–B ‡káÈ7ƒ“m 'ÕÂÉ[5É«b>§Æ¡_eÏ ÙÝ‹zýcQ._gWIDößίeIÈq œ•Þùá^ÿ7¤$¾ˆ ð/Î×€­NO×zdó¹å}{üóòçàúlvÕwOgÝ,f׳ƒ³þÉÕìýtÑ\tý“Yñæ4§­bo„XöMÐoWMÆá¸Û£ÜCoýÙ°µé¶EÝd»SÝd+káÌv//û6Ýyð{ÐhrI@CÀç`»{µM2!Rc] ¡‰úe0 ó­àcßß endstream endobj 421 0 obj << /Length 3093 /Filter /FlateDecode >> stream xÚ…Z_sÜ6ϧðäåä™x«¿+éî)iÒ^zMÒ™¸½é\ïA^Ñ6ÏZi#i“øæ>üøµ+7ã™ ‚ € :ºé/ºÈ㋼H6E’_ìöÏB…><‹´uEWÆ«ëgßýEQ¸)Ã2º¸¾õI\×ÿ ^—Wq˜¶¶_/¯’$ ^þßßÿÊ4øá²HƒÞô^w4!vǽi/©1V£íZLùÙîL;bTnÃ(Ø—ÿ¾þéÙ›ë‰Ã,Î6Yš|cë{‰¢lCÛ‰·›0K±k;6Ìg¸ ~¹¤mUwæu£(ïM‹ª®µ¡;š=Zõe0÷Á°ëím©{‡šŽÆ»NäUÛ?Â(5Jé7–é‚Iø$‡de,›IzóÙvÇ…D¿Š’MD;” ,Ü"M»3A¸¢ÝÉ–¾[’@´Ÿ6—WÛmüÒ›ÁôŸy OI²JJújÍÈà/üÓõm°‹èŽ$”fE`o1VÉÊ—EèÈåm»X"IÎ$ˆk€o»Ãñ¦±;¥¾Û™AD¬D:…Ë&§=²(T¥ÌH_µÃ¡ê=òa°ë`Tzp9¦Âs¦d3)m¯BcØ~Í;è”iî,³ÜÉ,\Êll!™P%B+J]‘S\d7&ƒ(‹Q)Äêá«RàM5°…q³kÉRšu}oxO ÛWŒü¨¸rtuäÐT;7“ç¯H .¶ÁQ’þÝc×?>_·Ï‹×ËÓàw¶ÿîHf&²¢¨…;ÝžuÍŒs¯Â§uÇìÄ2yl!e€D>Þôå„ñ¾=¸œ¼Tmn¸—ÃÇS§1Õ0:²Ç~±5ììQÄ^õB'‘QŸx0àøRcE›LÖŽƒinÙë¤$“¸|¶“»ÞÞÙ¶jÐsÌ*vwŠýY Õù¦7âÛ›[ã8¥“´¢(g¡¼÷Ðïí0ˆþàZŠMNû_¸–¨kùÏŸœä<Ÿ|ƒtÔ¸So ö¿5†Ù„^îúÐv¢hº3{Ñ<°‡ç@uäyÊkS[=cÏIŠY”À»ñ¬ž ²>,5à÷Ѹ­x2ߥ„Ãã¶2ÿ. N–:,i¤Þn}2:UÓ`.¸ááã 9~òÜ€+q"ѵ r™Jt É™ûÀ.v„F7ÓqÃwÊâ8° W1Úú;`§A=˃žÿâq·GHZ–“™ä›0-—fòóê oé$64µA~e›o…·Ï—Ý‘½­A`è#„: Ç²àï4sÍŸÇEÙ›TÍhzá·¶84L·½6ÍW]IrŽ%æã¶è™õÀ®ŽN4q)žkŠy„™ãžÕWô*\'uc˜OG‹­7Æí\TÔ+BÛ)DÖèxgƒSB=o1è6T\ñî:æõ&ë¨2/ ŒÃMœ,õ÷Nõ÷Ú4fde@-èÌÔ¨³<åI™É‘}ÃŒÖ]?ñöÎþž3i"ôñ茜'T+dç+ƒ ‚ª8ѱí®9ÖXU%oÈíÇW–öy FÀߨ™Á‘ή/â¥LÞ;™t¨9µ„ìnG`Îq’tÌWº,m{¼ys!"þN—/wNIR4³{ä!1¤0ž(‘' Mev§lY·’ï±+O2_ìxï\‚㜬å‰ÉxÝ%ÿä%ñaõô'Iꯑÿd±W}_éE9¼¶Ã®©ìžtâltS™˜êv«žï-ûÅX£“4^ ÂyÔÓ-j2æ´æ À·½:Ò«}5Ž|çòð0yÆéZyéÑÎ Ž Ž&xøÓQ|½}TôÕXžÄصuÕó–ó­çç¸'¾ˆνW¢M´¾Ä¥!Åp¨gõZ£Sh'{´`õÔXó’I‘#ª‘M(: 0#¾Š±uµf0ÉÓÞµ•¸ êÝ^Z1Œ”ÕÌ×!7Ä/â—‡=o1õ+W ›o„Ä:ÙVV&H:]½Ãbã½^¨?‘tëXåNOÛ«a‘†Veˆ3ºp ÎxЧºA3Gâß‘;÷:i槇ܲš)s‡ü‹å4B™ÒÅîBØmƒÚrÁ¯Î5®ì¬G´Ó#¬&rz »Áf’ø·Eº¸-ÂåQÿ]Ô@—ÑlAÜ Hƒ?ž÷cØÒÑ1dÕѱ2ÃÂ/ d>ÛÚaKÎCD½ã1`„¤v/—;¡a@ùjÅŒýÀ(Ž ï8œ _ ïPÞðHÀe~O€'KšO–’±¥HâÆ¾š­þ‡¼…ækµ?4R‰ˆÔøž\ð*?‘ Ñ2Ä9!¹®M ùmè2 ­&¿’X‡[÷rʶ‘3 õNžMe-N»vHº/Æhëú»ªµÿu  na”ê8ÞSFÃ¥ é ñÚ°[;Ï”=ò„Õœ’bfr“õŸ›_•³ùqGÌOì„YüÃPÝÀR—Áñ€¯”èËŒMQ>MÒœ²”Ô° ‰ ˜»6¾ïà $Öžø(’9§iè"þo²´æ˜˜Ápľ>c!²~Wø¼Bþð <.OÄØµ-xâ[K 㥆&©! ù#ð‰þГäÙŽ¿’ÿ•?É–|ZÎ!Ž;Rç's–‘ãàCÛÈñ¢½sÎÄIˆ½ÅW²Ó…fŠY3Œà4ƒn[Ÿª#t.ɧhÌ·çò+õº>Ùž*u:VEH–—…rrÉ×÷}w¼»Ç€ÄGËô ûª6@¾‘ œ¦GèÏаjço§"_£ôy{  ÊÕú³Ñô¦ª•ìB­lŠùœËpKyå“÷¡\à¶t«†ÁPíÍÉD¶)öy1UÀDù„‰Js’aúÑL¸%n\ÒBíYщrIk=ÙV6ÃÈ(Èl^Ÿ:ÈÞ¸±s€änòUû¸¯š[ÒPX,iÌ6F.݈\¥š­\ØãRvŒ»î„xI¢7RÝCç‰jd×hRD¶ó׿KÍ×(Vc ]Íè4°˜2®¹|™$É¢¦•Le:DT§sÊš,xYuÿ×ÀÌõªáC4èQH\M£Ó¢ „\sd''ùªñXâËdëñ|¶”$— ­éƒ;wóÇ, l:s5=J¶ §"EQ-ÙÝ(ÊÂÔ Mq%Eâj¹å<ÜéTvðÜ'7iúq9f)þxÈ,C/ŻչΧð¤³X–1¼Ph~—Ø'ya¦yá÷Þ½zûþíû5Ûûðý¯ïÞ¼¿þèŠýg§k^bÞ¹’̉j,V<]ºCx÷"Åw'd~šúr¯/5ëSÐH»7\$v±û±­1a‹ê˜˜uÔ¤Î[(ֹѷ.>õû_£"äý¹&ï…_3ȃ° 5/ÞÀ0Ü*!슈³ùAªX¼ÈXrZ O8’K_”;ŸÛ:ÜU2+eª×Gš¦Ñi;Z©5¨ŠâEjåfž‘ŠfR~=ZÑ¥à¥:(±Œë_è³@»z_kRʽµG ¬„¥¾í•On††¼Í„øøë%Ôóì¹DŸ›ˆá ü’ŸИ³Fê kíj Wãb¹µýÎË5²»d΢¿Yµa™6•Î[?<í¸Ó":Ù/C¼'IêµÆÁ;‰ý0Ç«‰`h¢6=þ°þÂCsk>žY¤aƒ‘E7£=4JˆŽƒ^ð;2¦óÊ-"õE\1¹E䤮/‰§Ê//Ó°Õa÷Ô¾@¿Óé¦A KÀNq‰wWÞ/ô©ãݤ.,o@PCc&Xÿç8Œ~ÿY¹-.s¿6„ªÐô—™2Ÿ'Às 1Jñ”ßå!ï i–ºOÆ…ûôI{˜â¬rç¬âœÕÆýKËÿ¦^Ü endstream endobj 426 0 obj << /Length 3135 /Filter /FlateDecode >> stream xÚ…ËrÛ8òž¯på2t•¥%>wOÞØÉx7±§M¥¶6{ )ÈF™"5$eÇ¿ý R”S>h4~£åà̇¿à,Y%©Z¦*9+vï|>½ d´„…ƒñÏõ»¿}Œ‚³À_f~œ­·.‰õæì¿Þå~¾X¥ž®6æçùB)å]þ¿ŸnÿÄAè}›BW- Yì^œÿoý¯w×ëžÃh-£PýâëwÉÔ2† ÅK? ù67ÀÇ øè5V^QïÇ{S1z ‘ò^ÏáÒõÑw89´ÏhOŠ{4ò ç¯ïQ3q§ £•#ö(pÅMŽ#d<áJoLAJnß/ÏaxÿAÓ%5Ž£f ±Ñ¥î4ó²d”þ˜LŨèÐëjS7­¶ÎÐ.ßÓÞE-ã4‚o¼ RC \űï}¸ûüùúÃúæîöºû(¾u÷áÏ/×·ëoDcD"fp!ÅJo—㙯v Ä?E]–Ö©€»ÞÉ`p½Þò—®¦v&äH)¸¡{S'KoxDZe2fòÍ[-û°«ÚèfN°Ý£i™–Ä´„,°‡ú@j_æ…pسj d= »9䥽ÞÞh¡ÅWó©ÛÝvYcw´ƒ@‡wEöGÖÊ›_ ˆãØÜAø*Á È`õ€±AeÄ õ¡ ¯’wŒŠ,Ò·*ÊÆì+cJ<òv«NQè‡Þ¾!wz6ýžfâ¼…ìy’Í¡Ôr8JŒI˜Yèå‡& q‡mö™¬®¹ÇÛñ’½¤„¥ ÂÎ)<Ž¡Ì æ, dòR€ꆇn%à{=׎Óõ£²Œ<†Äú¾§vM^t¼’óg¢3DÛ»bnˆ„Ðúk1!ŽUÄÎ(;IðÁÆÜ:Í{ŒÐd“F{._ç4p Z¨@‰Yãhp¤S‹œT‡˜ ž„tå@¹6 3ÒŠC?tÔNûIµEÒŒƒ¢Ä KÎÒÙ“ßò ‹¹û‘dzu9æ & ܸ%Y*Ї¿4FkôCÞl¨xxÓ~!®²L•ÜkÎZ—§"ÿ?}úzýé­3û~³þº¹½ºþãN†ïíšaßqÛÝןN —`W •;{SJA†d¿¤(ÌÄwÂkøkPN8;3;ó,y%ðd‘Âïcaã°Õû¼É;9‡4Ia cOÖ•¦=ú8rΆp 6šP¨›§–œ*’™Ê:àÉ\¼™8¯K &Ë[ÇÙS  üA»Gd½o×RBaÜ€Òâ°³‡ S؇ݽ{Æž±@ÈÐè:ýžC¶A•øâ;°þÕߣU‰–ÚJÎÔˆnÃMh7ª‰¶‘tË U-4”iSÍK¥Ù™nB§öf‹Îž#¤›²à—w¦ÑˆƒÀû­e(œÚÈŽ{v?Ad|!r…NàÚzæ©x1Tºàe‹4K¼ïºhÒÕ\ÐŽ)`´2tR­5$ŠÒ4ïµF:lŒ!šØ+gЈOdöûò•a+$7êÀœk ³å‘äÇž'Ž /fH§°Úœ™àĺkuÉî+ñoί‰˜Ã‰RÓÜpÕö]UßUá ¯™èñ»4/mãLÑ…4Q1ú‰S¡úò„ÓÃýTú™6u~N¡ÔO-~:êÿ*ûVõS÷J0ë3û¼Ê\6X _¼Ù¬šJÙÇc®äSpkSµ]Î/0(Œ¹„„ÈéScp&µˆÏÄ!ˆ[ÞÍQj ‰”Aâ_[K¦(I=íM¬ã' ¸Œ³€ T¼žl=‡«ÐÃ÷3Óh°“–—Eg ÏCÃÄÒˆè®÷|WÄêËê¼—ۨ#ˆGIBÅñ\SÀö>Hu ©«•õŒÛcâܾŽÌûÄ/®‰)lÚÙŸy•ÔÚÜLÏÉ7©Õ' @Þé¼jûGhm½¤æÕØ—f9Qñœ|Û î$ä¡îi‰‡Ù¦Ò—ºÑî‹ %ymì±hCòj‰ù Ÿ‘}Çó/˜x0ŽÉ”ãplÊHjNŸ¼cË;N¼gµ8ZõIkh‚loίx¡ÔQ¡­Îpàh.¤zN7«À¾’V>i|ŒT†sRÙÞʾVÜTÑF.šÙ6Dgvšþ&h¾ùÐj²¿ÝZ:òk.<áx‡)3ë«u®ã‚íO¸NÙˆËèe[®ƒ|ç¿ðwYéf² "¤xL/ïxt¬­±z¦ÙeÞh½‡FO:¦#§šqå)_ªYÇ9Ôàá())–ä¾s´NÓ†Ëä¥ý‡›ÿv¸R endstream endobj 431 0 obj << /Length 2513 /Filter /FlateDecode >> stream xÚ…koÛ8ò{EÐ/§±¢·ìý–ͦ{9l³@Þáp½ŒDÇDeɧGÝ쯿y‘¦muâá g8œ7_Eð_•ÉU¹LÃeZ^U»w‘`¿¾‹ZÀ†…·ãççw·òø*ŽÂU´Š¯ž7¾ˆçúê?ÁÝ~½H–nkóýz‘¦ip÷ÿþúô,øp½Ì‚^k^ýÒCTÓN·×Œj4]Ë,¿™J·lŒWEetýßç¼{xvæIæYú×°»þâ.«4,àBEåßæùz™ºß™V”Êò4è6ø›o¨m7]ÇAψ޼n¯áîãÀë©­µÆ­ä ++* êŽ%´du£pÈ±Ú  a“‡Õe¯úÑÌW^ÄiÃÝè‡-’®â`«P¹oøO3¦×•6Œ¨Su{Cp×Ë.ïZ¸ÞôÝŽ¡7Dƒh!·Eo‹80¼^q± †n§ÓËö¦9ÝÂĽ öÎøiôF5ù^d`’ØÈ@øÕ8«ÀF…´P­(‡‹¿ߨ1~$ó CÒe‘ÄaœBE§+V2ÜVDÁ‡ÏÏŸ?=0ó§‡>®Z³ˆß?0úùïkIÙÇû‡§õIõ„Ú„"+Ĺ­Ùa²`ÝmFT÷€R½¿¯ƒØ² ¸².€Å~zḭe­> DôcŠ~üfŠ }C±º@ÊÀœä™Ø¦ ¨@É¡)…¥¯ß/ì‘j1ç<.^KW¼rW¼pÁI“c `¸ïD0’Ð/ôkv˜(«" ÖS…ên™@·B€ýnƒÁ8CH²ƒƒÙ™Fõ¼0¢Ï°7½Ý™3IÄ5& ö½ä>\ò¼ƒÑ¶Ë$xÁº'Ô£?€·6_¢8店ÐÙ„Õ£2 Ãx_dS5ˆ¨á¨×tM>¾{iônàU'¢ª®­tß`¢%ô‚µÖçÍ€êwg᲌©„ÉÐ@ÓÜï´qáíäf\4»…̳ÇýO··‡Ã!|m§°ë_o¡¼5z3Þž«’äiŽ<Ñæ²/Ù]—ªœô¥sa¤äm\ÀåP„Ÿ¹ªB`Rä¥ï߸)O²(0#æ\QÛ-bO»y–ÅbH u{©•_7]ÓtT^ÙmYtÜÍs`û&mµ¥XÂZØÞŸÊd«#tæ•z¦¸œ˜9YE”×ÉrEÒpíz.l†L¿`äc‘´U£Ž£á¥' ‡‘ú%Ê#šfY/ë^mFØ[A¢È>ˆäv€ó*¢/úÔŒëˆãصbÈÖEž<ó\Æ<¡ýîKR£7oŒQüsÄÈr™wLèœ F¤Köß`”ÞL$[Ùg®È†õìx¢Hüù#öãZ0¼òœ„¬ÎIHSƒÈã¥ç$ľ¸C±$ì9: Ñà$êOpÞwÓ<„Óy"ÄðÍØ-)gÐeäÎø(ƒúE¾(ýJ„Xɉ˜tG43dúþÆËJµL®±ÖŒ)REâ9$%×ƒŠ³Ë@ónš¶zä”ýÛ °"ú©â%É^¨¦ÜLðWU•Þª­ÈÐùÏ˳`È0Ç4n»ÞüÁ³oî&Ü”H:yZâ‡dgÇ[{­ô,;€´¡’¦6|ÒK'ÿÉ\Ë\üé‡Ýǧ_0îbwø¨†á8±—yðqjF×dÄ=ÔfÅ®êzûúüÚŒú=ƒ˜¼=c¡ï½=’°Üi…q‚à1añ/ û¾©eI¡çúe&ìÝ‹Ý@³Âš3)R—¹/éIÝɽ7LoL¢Üëú¯‹ î‚xÕ Èˆƒú O9cÈ·Q•i ÎÔPe'y‘ÄñU¹Ð±#ë·Æ $ˆ®qN)‹8^tÊbUHËàŽÑ{ÿ¸Å|5Å6¸â䇉òÐ?Oæ æbÊwµÛ7¢å ü“-)B:8ýfnxqÅŠ#çt€» º÷Lp¡V,m¨Ù ÌìcpQÍ ¦e’4µ%¼>Fø™Ã! ËcHâ.=2?Üz®¿ÈCû,ª0{½¨â¦^'¯Ü“¶Õ²=KtÎ؈Z†îd/¿ñÒ÷÷‹Ÿÿ½Xß‘M2—V…¸û^ƒÙŽfL·Ûu¼/ï Òco^&4îb½Uò¢$jc¾zœi1ÐØI<õò¬ž³k‚«Õ¹*ˆqª¬–°è¹ÚŠ£oø•«˜ Mw™´€¼ÃF62–: óùU D`ä=ŠûÞ´•ÙÓ— ÀîU‰gžŧb‡}<DÚZ øÃô3TÝ ¾VÓà^5¾ ek”àÔÀŒ4†iúÚ‚&b±…â‡9ÍKLøVcÌY_å0$ÒÁƒ#¼×ZgœplÇÁÄï>ôÁ‡ƒ±U­ùCF/ô¼vñØV¾»¨ÀÔi#çߎÝ—¤óǺn|‚VŒ½ènjyËaÛQ~ÉdŽÌFHø˜"¶ºEÉæ9+ª­îÿ´µž^ýGwx$Qz"€…Ñ&º1¯†› `¸ìÐkNxѼ&|K”Ë«­/DÒªæ•|©D‡(„ŽS0?Fj_⊿ç!à·4 Æ8¼¤®c^õÃèõ‰XÚϦn¢Ky¢“2€…¿ã2zØ:ÖºÄd[É‘ŒxcÛLm[ÊË ÿ7G­™h6g¡gM@¯*!ZX‡B†èx…-{+<¬BØabysÁ’>öÖ ·ÂXuÇ×m/²ôwü’yv<}#ÆÏ½Qnd€-ò™}¸™»([B5IìÃ"ó½vÑWœqJgj7½q³¤ £OVw¨Kç0 Ç7ü›DÑr¶ÿÐ7Ò4Æw<ïpË·‰h%ãlG à5·] î”ý­N*‚ÏIlÑꢣÇ'~$/`D N´ ×(à9gßõ¼5۳箔BoF€¬¼m½á ¤o¡¼Qž0ô²ÿnz(—€H¶„)l¹’÷«> stream xÚWÝoÛ6ï_aì¥2³¢H}¸{j›¦ë°êîePE¦c®²hè#©ÿûÝñ޲”¸ë "wÇß}ò,1üÉEž,òB‰Bå‹êð,fê×g’W+`XM8^ož½¸IåBÆb¯åb³›ªØlE¯ŽÇå*)"Ólí·åJ)½zIßw>áBG7ËBG­1´»v GÕp0Í}Ù[×Èo¶2MŒrÅ2ÊåòïͯÏÞnF„i’ŠT«˜¸žØè¥JgI°%ÉDœj¶åúúí‡ëO¿#þ<~qK%£Úô޾¢ó„½íhE —2â“À\‹P‡Z:Ú¢ɶâïÐÀÇ>Ž`¿IA°6ËBEè4Óõ¸ ëq5ú 7¶¡oI¼‚þ.¢žÈ'\»6ûw÷ø•<´¶ïMs»T‚ʪ¶f¦·rGä?ÑÎí&óÆÓ§ ÀÞh%$xÂ]6[J‰ãÐÓÂËcí\];|°Í<­½Ûûœ"ò¨¤€P¾q½…hU&ÓÃ?Cdv½i‰±ßsPqmûÚ0¢òμ¤¸)¹(Ä:Ë4†M"‘Ú›¡õšÌxãŽ(‡¤Œ>ÇiüþI{1Ïc‘a{¹“)„”Y|ö tSÌ…{s)2Iá½¹’:IšÃ":c§þaÚƒí:_n¨S¿wmÙôfKÌtü‚OOW´ÜÚ®oííÐÚƒ__8up[»;±è>hÜ:Þsh'(†fkÚ ÀÁçÅlšù>‚‹ßCpuÍê¹u ‰sŽÿiÚ³™R¨K8‚eÃðë²Àî§òÇá¶¶Ý>8èöôà×G·ëÊ6Иê!þ<»Ÿ®°_Wöøûæ¾l-„‚•™ e»«9×Mëš~õÆÝ¬ó­L>ã§Ü¯Ëê+3_ph—Ñ«sÜ¿‰±Œ¦ÉÃýavd:²‚62¬#æýòC{Öÿ ôóçâRï„#LûLHÅEøìÈâ5¶½Ü·=ÜÌÛ^&cp?QÒ,òaà†‰G“PdyšŠ ž¼{ÖÔÿ_<ô-m}TðRˆ²}õ2ùDÎ|›çPâ%­9ÖeÅØÐ\×b­õ¼W~–JS6eê•èdò‘IrÆ#~Z®´ÆH6ÜÍH¬í.õ5‹,YS_Kçîçï$/—ŒÁVý´çÉ,±.Bï‚*ëGµ6ô̘î®dd¹<2ï©DÃ94ÓÌšÔì¥*úZ%EëÚ§°d! p×ÖX—<7)Ñ Šv ‚R³¾ñ=t ÂáwÏ¿¿ï“Ä endstream endobj 479 0 obj << /Length 2323 /Filter /FlateDecode >> stream xÚí\]sÛ6}ϯУ=³B‰o`ßšd“f'“x&ÎôaÛEb\NdÊ£vûï €xEò‚HÖÛ$¶Æ¶ì# çð~W¦³Â}Ñ™f3m81\Ï–·OŠðÛOOhøiîs€xzý䇒ÎhAlaéìú#¼ÄõjöŸ‹Wõªüïå¯×ÿž ÁˆâÂ]¨ùƒfþ·Oþu}¼ºd’HÁ'^BD ^‡c¦š0*E|L‘Â?:y-P.óÀb6çšpÕÂ~l!lfˆUJåÄ2ËKf/>Õ›Kf.þX—«›Û²ö¿ÚïÚçð\-HAm|Ëÿ¼œSMÛoìäþÛwñ„ž¢Ì¢…œ)·ZóFQÂŒû‹C.¡®;àFW¨Eÿ‚Ͳ²!­uç'´C#EÔ€ðÔî‘‚ŒôtÒ!OÕz5ô„róx¼p¯O(\¸ÅÔ3Å}ä™2V‹ðˆ±N/ØhD-ê,À›rVq謂+ƒožM:ëÙšß}ä)cñ†sR(zöXæWI§_®©:,ê©i$Q³ M8*Açì$µ!RÉ`–Ííí¢^]ι`ëª.ýOübs·¯6õ®ýõG·›mû ^íÊu¹ÜmE]ê¶Tÿ¾Â¤ ï0O›Œ‹—LTÀ›’'ÁèõQ†Ð/UÇßõ‡ÛKz±ª~)(S© …cùûï~L¬æíæI¡¸PÝÚ1ŠÊtdL‰„ry‰¤vUjw ÝUër$ÎJbµ=ÇÙ©'`Æ‹œgŒ›ª†§mÈ›2H‚Ñ[DhButÈOÉVõM{?ÛÔ«ª½‡®1ŒºDÊÿ°`YÕ‡E‹¸þx$è8SJŸ² ê3é;ÊX}=Ÿ¬ÏžW‹›z³ÛWË]ë†_ Y¸ˆ3«{H‡¶°nU{ ¾Àîø‚“ÜŠ*Bñ»½ALeì#cJ”ˉ/,#&TÚ6-‡œ<׿b\dÇh¨zØ"ÇË’€Q¡OÀ³>äMˆÝgÜíî'Âié^LÞí/ž¿éò "Ù¹2¸Ï4Ü JgÚ«ãö ˜¶3“¨½oÊ^ Fo.nHQ°`j½/·£{D¢Pg÷Üg>Ï6· TÒ%Ì6€7e›£· ÓDÆÍô`›¶S<ìï.í»tÔlCƒ\d‘\d%¡ò»/80¹Ã‚åÉÝq¹¡T£rÞ”Ü F/·+8}RQ®ÿ¿]7ÛïûßœîaÃ`[Þ]Îì›íØ~ cUÅ/-ã’å ÞqÁ¡¯:oJðã êàÆõ ,Ô³/'«Ž—oÞ·Ê–Bû`¿×' îáš–›uOÄL7ឣ÷Ž«XuŒM3|ÜØ–e»qø|Óˆå!žS.üöD‹|]-Ëz7²ÁE¹%Ú˜og/1¾Ó<:0®\º„N€7¥S‚Ñë$a1¤uzéÃx]nëöñÕáúZ¶ªáÊPCŒý¶oqd(®BÖF£;A'ËŠjH›’0Aè%”˜"ÞjWc­%?·~ÿ—`ôä¨ã‚¢â´)õ‡™Þåq#ÃvÆO“™þ§×„šoÓ~?ìJxä"È-vd(‘Ê>Âýff-±\äÙ€Q›DL³è .¤MؤO8° Ó”X¢Ú«I›¼ªwûÅz=´ã9RÝÏÁ3“¦­Èª?­?"fâÈ ò¦L•`ô–®ë´*¦)·m]¸:,›zp`ÉIq%É 7aqóÂMÆÃ T 7€6åŒ!/ ¡v¦Œ!Ê èŽfÆhóéx¬Y¯\¦ÁÆC´«}Å#pJ^•*ÂÞqùRúGì€rô/ˆœpÅ XÈ›˜“M1Fh÷M›¤NöPÖ5%òѺ• ™g…Œ[*3<;Zð¦¬Ðc<-=¢\À°11½/?)XˆOh£Ê]ž3çvè^vA$+\-§fŠ»Âoâ„5bç<ôWï‚ã ÐÑ^€6e¯ḽ I4 Œo&íuJ<žrTñÔ½­`̱‚9铪½OXÇžiü „rAûŠ© #ÒR¢ŒÍ #Œ†‘ˆi3ŠÂt†¼ SŒAeéšOôßlöånô°SÑs€¸Ÿ…ëžçœŒ; 9œ^>:ð¦œÓcRú¡ø@ùv2B¼mGfÿÑÞëË‘£µŒÖ6'¤]‹EW,}•¬… ê^e:SÐŒ 0Å%äM š`Œr2Ce_ Vï8­¢\‘¯ù!+L¹ð¾ó”ëÀ¸rp!ñZò¦”K0Få¨vU}¼Íü¼AHÇÒ,*u:›ŽÏÐÂ5‹JQS9¬QžÊW.:ÅU¼)•ŒQåB:Œ·íg‹œÛßý‡*ÿcؾ ûEaÿ9#L4†´°DšïbêS¸]Ÿ:ß!1‡YJŒÈ 98’n_gÂ,=¶Q¯0E] [¡?Of±Ÿ}HZlëfcø™ ÷Æ•<¤Ï :9sOÇ “Cê_pâ¬itðé//îd endstream endobj 499 0 obj << /Length1 2041 /Length2 13921 /Length3 0 /Length 15139 /Filter /FlateDecode >> stream xÚ÷T”íöÀ ÓÝ2tIKw‡tw×À0C7"ÝÝÒ ‚H7ÒRÒˆHIw×ËçèùßZï»X îßî}]{ß3ÐRªj°ˆ[BÌ­d `WVv€¤’;€‹•…–Vè ²úWŒB«måì„€þ0t¶2s}‘I™¹¾Ø)AÀ7€ƒ ÀÁ#ÀÁ+ÀÎàdgçÿ!ÄY eæ´(± `+ZIˆ£—3ÐÆÖõ%Í Œ~~Þ׻Ĭœf`€’™«­•ÃKF 3@b´rõúŸ B¶®®Žll¬f.¬gÆ× «-@ÝÊÅÊÙÝÊðWÃe3«:cE¡hÚ]þ‘k@¬]=Ìœ­/Рìòâá¶´r¼$hÈ+T­Àÿ+þcððïÙ8X9þî_ï¿Á;›YX@ÍÀ^@° À²¨È(²ºzº¾˜-ÿ24¹@^üÍÜÍ€ 3óƒ¿+7Ȉ«Ì^ü·= g £« « ôW‹l…y9ei°¥$ÄÁÁ ìê‚òW}R@g+‹—c÷bûçfíÁ°Ï¿` [ZÿÕ„¥›#›èäf%/õ¯É‹å·ÌÆÊÀÍÎÎÎËðrXyZزý^ÓËÑêoåßâ—ü|!Žë—&¬ü€ÖV/P|\ÌÜ­®ÎnV~>*þ—P88–@ W€¹• Œò;ú‹ØÊú~¹|g 'À€ýeö8ìýü÷Éèe¼,!`×oó¿ï—MQYSOQùŸŽÿ«“€x|Xx8,œÜìö—ô¼/~ÿæ¿ðŸæÿ–ªšÿ-îˆò`k€ÿŸ^ï?}¸ÿ; ÿ® #à3(C^fÙ Àð{ô Ù¹Ù-^~qü^€¿]þÿÍý_QþßFÿÿ$ãý­fø[ÿÿ£6s‚¼þ5xe7×—µP‚¼,øÿšêXý³ÊåÿÕÉ»š½,‡8ØôßCºÈ=­,U®¶ÿLÐîà%8¶R…¸ÿzÕX8ØÙÿîeÝ,ì_^'./7õ·Êêe›þ7¥4Øbù×Úqró̜ͼP^.þ…¸>/ûiiåù÷`ØXÁ×ÀKs~kˆ3Ê_÷Éà `ÿKôñØ$€Mê7ñؤÿK¼ì6™ßÄ`“ýM\6ùßÄó2­¿é%ƒÒozÉ ü›^2¨ü—ø^2¨þ&N›úozÉ ñ›ÞØ4ÓKGZ¿é%ƒîozÉ ÷_â©Åì7½Xšÿ¦K‹ÿ÷‹Îz¹¤ÿHþº+6Ë?ðå¬þÀ—r­ã_üCûR¾ÍøR¿íøÒÀŸÆ/UÚÿ/¥€þÀ—:~ãËË€í"_ÖŸ ò¾Ôáø_|óbëøòYY»þ–rü+ýgmû¾Ôìô¾Ôìü¾Ôìò¾ÜùŸ¾/-¸ý/5{üq8/½þÀ—"½ÿÆÿt 7ç—¢\ÿ~½lÁøï++O+ ”Å9ˆ…`°]mpûMµ8©ËÖ„ð í–N:#‹Ï¢s‡Ûb ãç¬À5ç+ñ”ᬕ i†K±%ŠGŸý–zİÖ$µ¶{ß“õ©­6”…I‚¯EûâuýäÈd,šbÛ¾N¾Úö°-Ð ´yNn|ª¸7}²žuý—ÇBç¶Ô¶?ó¼E}ø8Í£mP:K›ožýˆ Á•…‰ çÄsöòj'÷ë3…B3ŠßA W±þÎØÛoÞ«•šœ.]Ä4ÄúDä°—8cSt>¿Rç}ÊJ¢×„çsx#↖‚û¿½Õ&¦z§Jä\Î"œù^±—¦+×Ã"Ó¤mñU@GOQ‡äB[&kTE=\f’Mô¿}¤&×HÔ…¶dîè~Õup¤ÕÉ̆y+#>©qŽÖH‡•2«¯ù¾[ªxE('Çún•äžïqš^p nÊU WEÊΔb ‰éGyõs‹)¿gÉì ýXÍCP–¢ÛÑ>V%§ohš™ ô¨ÕR¢…‹žn v=Ä”°ç(Ò`­øÕ©Ñ;^¡ù)ph36ÿíªq¹vóQ*fUu [1çAÿ§ƒÖPØÅÈ—fw¢ Œ à× ûüO uQäµL,g–7èhÑ*Ë%Sïb6Ýt mVwèm|é…+G7¬s³še†Æó¾Y¶át¤AREëˆ2ß1Å”SöË o¹¢ùÁ¥õRÙDzÞ@Ý‘¾ŽØËÿa9ð¬àGIµÞó½Â “~Ú*¼œ&÷ØÍkÕêS>µ-Ö°lÉéýˆ‚tYЖþëϺªúsu‰¸h½ácgº>E›D­ææIð„ÝÕq8RŠ™”5é¡y ßàplê߃Ué?rz<˜ ! rŒ“Ìo)P#(½ZŽÍÝÏDL„Ï¿ØWiiB¹((DN;žÅÒæU¼Ñòm°ÅÏŒ ÝHiÌ íóŽvrd‚„:}•0v­O–"R(ö¿9c¶)³Õ«ÞÖ™­–— Îç|±K§6³mÆe/k/CýGʼnyl®A[='ñæT5ÿ¶>k; ´ŠVÓ¦í øjÄ:–ZìËÞKò?õ„ãÙ÷0`ÐÉ•ž«( ðú3»ñNŠ;¼Áûšì¹…^®P¾äVÑ7´ìgç a"&-0ÞH‘¡ð/}ÁVD›ë69×hŸÖ9s_v®`X‹ÓË—QÐAÍ‹ÄaäzB Ë–V4w#E6D}¯ZÕ£Rðæ©˜+£/Ë Ó%m»Ü›Æ;  {¨÷“ð7b?<ü}«ý‘tGÑ s¡©áõ‚ò”» Å/Ùýo"1éŒÑ34ÖÒù[gþ,×)¾ãš#­ø‘ÝI{<Љ_ÁÄŠHê›»¹iwj¸üð™WWªä1l,ðø§‰%{ÒàÇmKQ[ôy&‰B ^Ÿ²5Éô½:§à¥Ãx ƒ!‰ì¥¿Ð±®ÓY©šÆ‡u‹ˆKPu·¯ÞÂÍY´|Ÿëfët¡^=Æã+h¤¾êhª„ɶ¶8$Ût6ÍH?@ ´)áBê¶W“êMÿÊ»g;À£{ŽA¸FpÛ’ä~ŸÚ’wáwpt1cE‰ïûýFsÜcÏdÄÒÓ×t"OìÝ~úÈòWÁ5%N2&FK¬¦‹ôÈpøÖ"¡7ywõE¨:šÐK!³¹T£7*`AFL»öÖD?*–=701úƒ+O¶†„.lqͰ³±Œeù‚v=«ªt°µIn—T¾'™/qˆ))¢©}H>Åâ‘ò)E–ÙüU]3¼N{ë´dqjmcõÑ^”$ª–ñªÞ©d9—¸8¢A‹–§‹¦±ßWÀlêÔ.Ù¢™øÕ¡„ˆÝýô)o:|µ‡Yº0íé¶áÜò_-ö§+ø^žÃ˜\¦Dɶ[ío Î1äÒfËaMiÔwнØCÔÈÊvÕ«šè&„¶|²Gß1[×Y u¯tÔø™¿-wñP€mN›Bà‡g™_n*r¸Ne¨¬/`³ãB½¾{§ZyvÙ@KµuxÜk¾q|cËý~+x˜jT'Û¹~-jFCGˆÝÂPš(TÇÎý!i €˜,úôÜÌÕC¤Þ¶u›;ÉÒà±›¶û®Uº=Š­?>·3Œ-!y‘HÃ4¿ôsŒZÈKL_‡ÅÏÍI43ùZo¬&¨óçÉ8åÂŒqÁB•úÉ‘×ëLξܻ¼w¥ kV$Øi¦Ü29±„úsšg{ÒZŸ2“÷—³HX³Üîžœ<;6ôæKþ=¡é}ñšW”ãò+)ŨÞŠ Ø ˜0á“&›(YðàQÕñTlÓRލ¶ÜâĦ¨Ûª…ا¸çÃôËŒ¨™ ¶·ðA­h¡}ézasþ*]‰|cÇseN‰^‰&‡z\° ~FÐÊ}<Å©ûæÇÏ ´¿® Þ|}çAÜ&Oж{¦vé©WM5MF|$Q'•·VÔ¹2hìjDÃPZƒKKic‰o?--‘‚Sk³ðø÷´ýjÆ"A Nh™1ðÀsÜN-ÉêÒE­ ïñ®¹OÅ¥ ,IºR< :øñH"þÉÊé"‹O#,_¯‡&F8HŠÔÃáÍ9={m#b„a4”±RôV'¤2ƒþúÚø09¿H ïC²ÒÍcüê^6.ßÙÂÈ»aŽKœ…y\Pûp’Æ:xß÷*™ÝÀCöq=«âƒÃX†$¶‹’9`Çc’‹ ™*ÏY¿š¢è²¾Ó(7õ),’³?ß’ïLÍY¾­&¦¶£/)ÒRíÅ/ºô4¾æ´³R_óhy8îïI›J“™x}Ñ4EY\ÛU ”öÉ£{òÈ€¹ÐЮoŒ“2–Vâã¢ù5-˜“w„„ùÎxß§b?.Û»ž3ÚyÁN¢˜/4¡;@PÊVÜ í¯Ê‰x¤f’,É&zN*%×{­˜ðŒKåé8À_[7Eo…Ú a®‡~20PgpÅ|y(—-Â?Hí é"–~MtO²¦M9q&+Èô*À½Í^Œ4Ž ½ê×ò¤ˆ®ß`k)>9†U Œ3!¥²uÌó‰$OJ+’…Â5>…²b­pß7 ýQZ}7¥Ä/i1¦öd‘Ï1Nʃ~_ÖUt3«òÖð öÈH€+‘¶V ‡5„€TªþÑ’¼VGdyJ‹KÿÝ“ªîîQÁ)ù´\z4OEl^˜ahŸDí¯ÚIi{"b¶¾_ï-ÖܵË åAé á"˜WÕÎKÞ"£r½ÆÅ—ÿÑ_ÁÅRft¶Æ¦ÁÑžúhÚ hj#[<3ãÈ„V_$O§#$RáoN`¢пÖ")-õwú Šcñ¾­Áù­YQÒñíç¸Íþ^¯.nìhyÁ•Àx9ìD²&Í„Ø;â-Mþþ2;X¬ LvdW†p¨;ܳLÎxåWܾ±"6‹ɦJ‡×)šŽZ˜ëúçK– ú=hCõ¨ŠÙ·‹ƒ£cTñ‘\çsž5—´bÁ¡¢Dn_MÈ÷QD‡åšæÁ g©ŠÎ9iäQ&üýÚ;‹›ˆÖåy¾%ñcrdêxêι&Úcòᇡ;©¡Šd3&D­òÇÔ]tÿ榭PbW:5€Ö×êˆGW©ëÍÛ²šŸ×ÐLƒÂ‚¶;ägá5,³«Ÿ}¢‡@7èðÕŽøïwŒÂ¤ñû†J…vivw>;†”LÐIA‰˜ ^&'–—ËœC­ÝÞ5ïáô[ $Ì êœi,CÅJ§T±ÈR»ÿŠe§±–€%æà¼ušr&¾h¸q­ØZ¯ÿJ²7µÙÐiú“³ž.%³NÙ¥5½Èº‰%}ÀI„>:Sæ¤J å„ÔÂÏ(B ô è}jçÕeö÷.ï¬%miUjÎO{|rø™ ;ñ3˦þ‘€jö m,évhb $öŠbTy­>+‘sV-E¯ «KfmýIŒñ1>Ô…r1ñD]$ÉåC@ù û :|Hšß õ‹X¬2Ë’ç"É«õk 4PñUEa[&èV‘1È[´’äQ$W€w€N›ˆ-®Œy%Ó! ®=Ƀž¬áâ ƒ)_‚YA½PóÍ71>L‡b´Üæ³9”°Ý¹ž{«&éýÿ1ÃyŸ£’ìשéym¢+½|5³²ÕÍHRKáѪ§×R ˆãc“Õö½PH§r3‹I&?ç—h¹øéõ~>¥,4ày+UÄÝâÕD)÷;Ï:ó¼5¼4ŸÐ6¾ÚŸ³ŽªçV%D]ÿJÝûÚ)ÌGGʸ®Ùkú!ݳ½i _/দ‰Ê¤>åG¢ÄwúS»Ò5=^s›’O´¨¼¡6;ÐéÕoá 9«ê\ßEÜžàVfC…èÎ0Q/™5Tø­ÅDå^ñY Ã^ úÅ«¶ZY“Hì/ê6[ÆXÁÑ6[ðœ_z¯( ÀŒT"ýòkØ¿ú ›øÕ„&èžhl‚´Ÿ‘¥@³~¾<ŸI8CÚõsêµ¢ºcì…­^Ý-i¸‰ûöQÚLî™…:Çí°°%kÛ•õáV3^»¸AÈyKNOþ\(ôà§Ò'WñZð+æû/$£Ä6J¡¬y,¾b¤|D“í6Z ‹èõå`ß 8 ¾³QªË£¤º÷lÞ[Û‰ÓÚøïGs2æØ¨UaLŸŽÚva`ÆÄ rˆ’¥th¿gߘ_áð…˜µ|à0Hš 'ÌGÌ‹ÿ]pJ}GëðZçº ê9pvcs‚ “ž§DBʶ ØPÛûZÃb°í—|+¼ìL¨ÿ›b$þRœ0zË“þÙa««R…Ö#æH©ŸˆRìÞË¢1'Ýa%Ó|Þôy³ ºR– 6ùqØc66Ή.Oz´2Ônk•2­'¯¾PÍj˜Í+P‚”š˜z“ ‚šyý"?WÚž>–ôyšM1Õ²­7³òŠÑÆÓýÜö]Ó^§$—8‹Aˆ6‹æOÝOÙ£áªÉ˜ï.¦ a ô'¹†¤„óˆñ 0ÊζGîð¯Öѵ¥—YýÌ}–B–ȧ¡²:o§Wñso )qM ,¾NNóDãò‘ v†ù–Ç TŽ` "g÷œß5•tç‘íqžÁ;Ù}F‹òöˆâé>‹oÂ'à]¨Ì—c„UúY>ö%,¢DÖTŽ69·‚‘r0Ú}^¼j7<5ö\f]h†œ½¢†WæHÉ“ŽÝ1Nì…îÔùDaø‡¥CJ”¼xE„cŠPÍ×úÒêЖ.ZãÞ›X¦<§MGžzo~MzÌPßš•RŽ_ôÙÖÇ }¡·xäFùÁ°lÔË|^¯Ä eQugO9àacHãèŠ1–îöÉèDìuªwÅöI=œÉÚzáIp¢Õ‚™§Å[p ¡¢ÄÂsšì:¬5+¿ø¨JbðA%À,^Ò#ܼ«Ú­’´ñ,ì’øE=}Þ¤>ïvÆFmÛè$7Q*jÁ aË<®l7ó¨Šù¼[ã‹Þ*Ê}\M|‹îd@ªèmÏgi½… / mú\\~«C³'e«jEÙÿãuíÅV#Ì¥:A…±¦øF‘çI’HMyÔ–ÄЉK`£J^z×Bz î÷³j/¶0>sw™ÖÇo¹—컵h-ŠˆK#M e¾úîsëä7ëHЦ”ä½ös¬±‹&☇MÌ¢XÜ]õª1«Õ€2Ô¡$÷)ÿõшgÀ¹w¶Å²iI(ÜrDîuª2¬‚ß^jʼJ——ºÊqT£?m ïଵ½ÿJ¶ ÌQd¤x×¼fˆa@!Š39—CY:ÊìËAŽŒNÙ»Ìì‰ÓÙù‚9¨ø–ÎLh£“˜Ó2Ûq¹æ•£º»^ë ¡OND¾~Ô²‹ËhóŒ"Ÿ”ôRP<%‰>|³²IQ5ðÚMÎJ.Àš8ýRf1áš‘š¡ÅoW§ígR’ý1[±¥)bdû±¦ê£T{ÃëG´+ÖGÓ˜÷¹á¶gêáHÍM—ÑA'L4·i¨Å@Â{¾¤† :˜À¿)… ì?Ÿ€¥’]è†ßM˜¦†ýàu÷¾y¹=H˜³(œM–ërn0ÅõÇ0ÝMåÆÞ.k^Ï•é½7Ààƒ÷ˆU“dû¹lÏ áÒ:죌P‰§(sM û¤Ó74®øÞ~G+$¢ wØ\²¸÷îwØú öŠáSˆÿ<"Õ¯£åKk çx–ühíšuˆ¼/À@Û°Ùàüæ—*‡ÛÃQÁ½®§j$ŸG픈F‘~æÈlIö7&Æ„KN6…ø‘»x1ÄDÔÁêU! ÝŸ­Ñ)[—øL¹!¤_"Ñòáh ‹$·ÐR¾åHÄŠ,ùÔâ[Ñ”Èì²çßKÏ|à…Må›Pl±+Ó­Fm´óºÂ-7¿IÕh€åмÊDËŠz+v4”8áé-¯©IIª:5\aS ûvZ³êà[~*jL¼L¦11ÓÆøó­ê…6sÙ?3ž~û}° )±M®7øÃÇ»Ó÷5!+èvÏ4Å&2—!»ÌšŠ¡mm¾éºqËÇö0•ÜŸðm”dßGèS\x[ò—‰#£`w´>ÑúëG±}>ç™8³ȳ…¤.‘ è{¿Ý=Wt}"L[ð:f Ú ?¾WZg+a·îÕk[ô9[?¿ˆ]Ù·1SGsA”†‚ ‰ôDœ›í\cô¥c   aëeŸÛémHéÕ·x,ÿF¹Á(q`ÁÕ;1}kÁ_9Ÿw›©Ã1X 6—²·5]Œñ#¸°áÛ£%èYÎïšrdO½o•Úv•Óp]ì–ž­Ë…hRýø„esB¼Ï>2‹‘ÄÇýás#¥ßò|UrAàd>.U Êòž‰´ë\Åz? ;¦˜Ó?_œkFßÍÝ:ê«"ùºÑ|鋌®ÝÜ;9¹oÚ~‰þìŸXÔ&sö߈ⶠ•â×z‚eÂéשR‘mÚKºFÓ”‰‡{Ô”q³Ë‚%ÈÃýÁX5·AëúëjRƒ¸r§ì¡m,(~d­q•ÑìTÕ¶ÍjÆ,¨zÛµ²ËÖœ®„z~ÕÕ“ataJ[ç ¹(xÖT.ša›OWo!š.Evõ×èr&J¿ Ó\7:?Þ­'øëèwÒ³` ÙHÚÝÙ õr!ì’`‹gôÔ—ö QÛ”þ%>KÄ™CvÂn}q¾uÖÏGïñÐß²YêÆ\«¶@# ‰?×…Rñ4s¾ &Éö¬äøÜ¯I”>_¾ßïä4Óxõ¦š¸ç6"i:rzhYL¡F79ú>ù‘Ò2¦O9 W,f&Å~A98[;©UÏß|"äN¡cô$ å*jìÑbòŽ¶Ý¿«7€Úª¥‘Ó©þÊËöRf—Á‚ìâ†ÐøÍsË–RGü‘éÙÝ8EkÞ^°cC©¬ƒ¬N¬` £S>×F ·»ƒ hÈttB=c;׳»¿„Ñä—e  ½dÍy•ž¦a‰Uø/¥íãöQ…‹XþŽŒ¢Bß'„ÔÔDÝâ†Èµé·ápgm Ë4Èݰ™S±ª‡ÕIZéâscQ‚™£Î&¤¾ùlž8Ô <•ص¥A}¿x—4Pæ¥í³ ñçóþJê†ßñyMq—q*Ëgà"ŸþÍýÜ>ë ”Ðpáö“yŠ i­a€[䯸À„ÀìKŽV‹H3Å©ÓrÙ#i¢8;5jN‹ßh-ÜW¸xl~ó$™0à—¨È8Y¯_àkœù¡e‡~u¬uŸ™ù  ÚÜÀ;‘AF$=å|çGY««Œˆutä\…w@ éü¶¥|å4ò5Cq:l69*i…¡Loù§ñõ `Ÿ¼ç<¸Ì!‡ðŽ:Ê~‰ D6ÊpL¬ÜÀú>Œ¹‰}’AW?„³Îu}€¸sA_KŽx_Ùœfßÿ‡ðãós3)é¹ËÍqAÐÄôk*òS|ùrî Za†½Ô5kYãNW4ÁæðñdfRåéW'ü!Nrú>5%\ùÚ‹ÄN]l‹c›ÙÙŽøb¸v¦ˆæùI#e>Fðg¾þkwvte|¬y?Ìq?Ó_ah¨|@ÝÌQ/ˆùi´úô™œWº#Š,ó'˜Óé]Ÿf¦@:âF雪y¨±ß4d‚;gúG0¹+ì6­²yž”*Óbé€<»âe»~¤ˆV—1€£jyI%>œ?ZnRÜøžÝlå~¾ˆ¿7ªKhÐaŽfõãrõVæ¢Ñzñ7†à7Ѿs›ÇùìŒ< Í…R9¸²éU-Kâ {Ðá· gÒèô+g–äeá-݆í¢c›hïmýø™Ôx‚2¨ ó7Q¡»>/e¢j ”T2YbäÏoM¯nõ‘1‹ÆµÎ-³E˜µÂì0sÒ ÏܧÿpqñÊn Õ@Fçì'ô:g‡Q {v6«;óÁuñË<ïº)>»ï§ÔŸ.] ÿè;Üòƒ½ÌQ¢ˆ2c,¾9?YîM¢ö-mÒ¯H9Œ…É%ø¦£wÃðU¤%"ú ¿µtó¡½7fˆ2øüøq±ÁÔ¹èM`ň=¤³Y~Á@Ç y‡îñvnOk!bªöÅçw©FÜo¾•4ðJ&'!v!!uö5?zts0 aót•ÕÿÜÈo{~b/…í/2TýØ€_2‚^oxãɪÁ'ÆSøüÙÞ˜`ÝR±¬]çÊqXeû↼J‡åÁ·!PKð]¶((8¯ñawƒ¤Ûu\Ó¡Ÿdh¼òàPQ¬£kØKW…)ð;Ža”ce•íMÐâA€}€`å„Q´òêðŒKCu2͸ce÷*¾ZÀõˆ¾ÈösñhÒA®‘âcàô—/m6e¿–{dåÑÎu¦å|‚edæß9ˆILæ,'ºñP.§‚x%ÔÌÚµÑÎÅÝ¢\Ü»´¾ï :uj=z0_ùɸøŒÇÌËö¸v{¸¢Á` Ôá¢G+yæKÖ^ƒV|6—#î-¸ *Ý$_3¸j5¿&ª0ÝGVäqö$Z̦8Ë.Dï~ôs¦#¿T`zÃæÂ*O¾ŸZÅÃú‘úí¾‚”yS?¨a‹:öUH´ìíÆa=Üj7Ô\[Z&¦Ð¤_ˆô: 9彆 ˜š Û«ÒwÇÇsÎÜ»ÃÛ3}D&ÃÛ³„3#°ÅûR—£™‡HìšÏ ŽíØ‘Øêb½$ì>I´ÓíJ—oü ÄP23ÐÕóÛõ œ¼/Ѱê=bb5ÉŽ÷:M»Ë¢tBDzº…Htsà}›¤Ìý|?CMwbro›;"!O†p$D pT„4YcV÷BÿÕÁÝùÖÂÖSÁä@"t×TRPýá! þù&¬õ›¯w÷¡ƒ?£±ŠWo?N ¦à*7ÙaÇe°Ùbûu(*°aÔª!Î ×~ _ Ì,—Í]ŒçŠQ´¥¨Öç˜ÛÊàà¶>ÿjƒâ†’4̬ñ% “8ÝȈ•ׇ ]Y”zÿ|ŒY<_PT_¯vü©ÛZgFÑ:£Da«Î¿ÌNmër2´ç¨µ|O5+sÿÄnªí›Ï|ºåÜTíò§eWÛµ­(H¢¬JjPyî¬UçN Ÿ¸vC#J[µÌ±Ï÷øŒüd·ÇjïÓåƒÕŠgùef%Ï>ùõûôˆ£ùC²GŠ {ð‚­4§u¨1¶ÁAøœ³«ëaÇ§Ô DË# ,6QµC¼LîÔ:ÏŒŒ¾_ä%U¥yóäñȨOWèhšô¥; p¯.Шì¿(Ïõ±XmÙ-ᙢq”?åC´‰ Y½nÝ´…à +A ¹4϶2ò`ápY,´÷3sYîó×ö {»Ô S3–‡çÔ”Zl'“QCÝoÝhÑúp[ý*Lqš2$Žs ·{”óVøÀZtÊÍ„åÎ>ÇÈEËØÚÇiÍelÑËÅI^’Õw?¿ ÀЈÉë¾C2Ãí=¯lª›îkÿx›ð*Õbï‹KéÏ̶ H¦¼ô™_ÒÛàØÙÿòýö—­æœÄ GI!šnNî¸ññB3Œ¦úþP︾@Âíï5ÚXÚrå›ÚËæŽ‡Øu¢·Cą濾@ Ý5¾ü`¿ÈE¸w#*ö{ÖÆ©\DEèNÊDU2¯ò l\øýš# ›C ü-ð£Âbmù86É {û^Ì'6Ým*CŸCŸ§PÍ\lR-ÏÞ²‡Ûm4T“LÉ C›ÃÑo¡ì'l£Økš0Ü·+– —L¨š¿sØÊõ7K!ޏu_²¯å…Bãëõk™õºp‡É3Æt3‹vÚå?qWή'ðrÅ®òéE†Soèý ͧ§ÔÓŸcXwÊžª·YÄqQO)Tc¸$ÍËÊ}(ìlvš7|yš „•üé`ëùºa¢_/ôñ‹=VŠÆkLAÝÊêÑ:¾‘N=s¶ƒ%TÇ<Å-ì5š‰¸ø6Ñä˜vØP¥˜Ì(VÕœÝ&—À4-&näW.…»1!„<­ÓÃRq‘¡˜Šhò[àÙê…5~ƒQFµ÷‡ÞR›ZîcåÔ ŠŠd`=|±;²=–ÑòÁç¨ìØ‹ÖÒŒ“Z]›+I­YÄTâ¼™´gj*oè¢÷é’Y·"~"|J[gªUúE_Bÿâ½¥O* ‚¡‹Åò ^R]VLÈøHïñ¸Íöh¾[Èrg#žóŒ/v°±Ã0i”ã:ôÛçã[õ.ð)—ÝT€Æ ªÙ«v1‚$W@0¨À‘î'¤ò×D,ô­]"uòzê ê)?ÀY²¢÷ÑŽ:“ýéõ˜Ÿ¦Ž°4öï™pÓÇ¡ê;¿H|œ“tô÷‘ôÑ›~4toö çMw˜ì”K ànf¦Â9 w™Ç¾¡p8aq‰:üìžùµ•à$«ËŽ*9XðÆi[Gú|Ô Q1,²šÞPUHÙowF)å`SP»V®e¤&I¼˜po!€BW~’Óæµ]+Ї™ Yl_„A ¡1a'îÖçSsÒQ¯T<.mÊ?Ùõî¸4?D3ØOàçvóÏÎÒ÷ļo}jÛèq¥ª§<îÆH³L4G¨˜‰9T£s™ß:ýB0†ž$Yÿé" ãã?Ðð vÀø¹M†i´üQî)CØ…´†³—[.Ž(¯’ó•÷ÆÕåýÒ=¯ -¢oãÏ,Šçç‹DCÝ'Wx×µ;ûDJRã[GV'ªãšèÜže³¾q×EXÁ™ \y*R ¿«{ÀcIÊŠÇŽ[•i½ãŠûé­Ÿàš3Ø€W•|§Ë3n1sOÕà²%4hz÷ ËêŠ\”ÌÖ†&`¾¿YüUM, ùiEÀ«Õg×ù#ÙN§Ê€ö½ÏM…9Aœ#¦eÕ}™bfrƹ «Ëj“2!žÆç°A£ ²+ ©‰Ä/ý_'¹mâ@Ô57_¬)¯ã÷Y6l„ÒÜ8’¦•ÄZÔ•ð4¿¹j p>›ÌóP ¦qãØmÞh§M”Ü0~ï<å ñuf1¡5ù®^yá÷‹”…”Hø d%Û™ßC«çc`~Z¯°,‚B´Þø6ï…¤íË!îl6–é-<9Õ}Fš¸Ú|}ÞÊr®“¦”AOÈA¥xçCV4MÜP çÊ4î3w<;~Þ“í@Èð­&n=:LwÄø G/·EÙ`àkߦyñA˜´ŽïKfÛPè x &GÍöÍ5rº”Û»~ts9 nþ±W÷ih@h˜ºÃQtò´*?<… ³öª ‘öü¸ö·C¤@l$ü·‡;¾-‘–´OSðh’ _ª„wppsct¯‰ 4äjÆž BÔ“ K÷ÆI §UVµæb¯j|¶dé@ûdØ=ÚClþË€ka/|aª²MLÊ/©Iß%bS;—E/2> Ï"º>3Iæ/Ï×<>×íL©ôÛ&C76µÍŠ¡¼ó#/ Äã¹úªÑ~-w$ý¸lÿú î»Ãùø%_€ü㷆λ“h@²„ÐT c.ë¶Žrm©sŸ”1tFÀˆÚ„8Â)yDi1z÷FG²¾L#i×Èkî Õ=íæ_Š3t/Úõ\ÕÃTz®Xh·ðT%“£#TêK¨§D ~äúW¾ò×{—jœ»œL¯lÊn Þ„Zvç Æ”{~kú ‚ç4l-d Þ˜˜ÓlõHIE6!=bä Q'HÞw¯4?ç``§sIüB ¨V1/²/ žðÎJŠG 7s¾e¬]îè¹£~5RS÷ÍÁ“:"Ù—–Pk›—^ËUOœ°?¬uÚøœ·4+/mC–šaGó­x@p³ŒÙa¤(C~‹U'G¼ÐÞÂ\ͤŠÔX AØÝþ'1ÃÍÝ8z‘XÒÎyF%‡»pÞûÈ•x\™´*rB}Ú*ÊÙw寸É|­ùÔŠ º#™7Õo5æâGY+4¶w'/ÃÜ sŸvg¸XØoz*Èåwí0F;MIT’Æã–¡ü„ÑøAW «mû.H±¤Éàþ ‘v…ÕN¶0OIßµ±ÌA³¤õ,’‹el]þO矕Õê–[+>#žô¥2ί_Q˜ËàaMc«ÍVŒó <ű€|Ð¥²¦øR”8zÇHaš¿%¾zðÉN{UyŸðŽgL•Â/´{D®m>j‚AÔOù-{0…‡jr¡:J!óm)3i"ÀÑkŒ"Á¡-qž°}±^N²|¦òÞÈçÙÌ_õ©Cšš2Si[˜OE#dåî—z yÐx9Ú“ `_4r½Fñ¢&’ìd=éü‹"Yz"}s¹òåÌËÿÑ5~ì{{¡š$ãØ”Ô¬X‡Ú¶do'–ÑÌÞíÁÇÀbac ÷ãÜÖ¨ÚÛ2Z|4Ã)”»Œd* ɉÅíì³ðîZ`É^RJߥ¬™,—j–˜« P›}¡ÜQËrÆÎš\—ËåЈÞR½ÊRù9"@1žleè¹öŽ+¤ñ‚Õç@‚†±cþÇÒg’0í ííuÿ·¡ ¿Ù*~ÌŒM˜óYëz²gõÈ‚ÒâÅÌ^Gî3;WUÏßóO?XÝ ’H­„õù;%ðaz‡‰`L7cl&J}Ø ÈìšÑÅ@ŸJ ô軄™( ãAò‹B-™»0 ¯RnÃüZhÛÅà÷:#M•žH:¢­áa¤îõû`–M‰ó¸¡¹–Ø.·~n‚…0;²) š0„Ô±`äÔï{µç-(Žškvu¸™cÓ«!îýrAïj×TIµQ[Î+ˆÖ#{c…˜gèä1ýv±›C.ãr—,ã¿ýLH ;ÉÅç=+½P*,Ì-Ô6¤ÅªóÝB‹Q‚W¬A^xC@†e6µbjÄ´}nÂÐrWz´™ÙpS2ßV¢ˆ‹µIä¹z`>ö îmd/·ò»ËD"ê“=ßJc%·ÜÈÂ![®ÊcËe J*S÷À¯ÊRiáX/Wh-“›k6¼+âï8çúãEšaä?Tn>œ5¾¸÷PM©›–jŒt%$ ùVåþòœ5Á à}KŸDUg2‡ÙK\X}’ò€¶·§ØÕ4ÿ2ë]ÃcD ñ©ÍjW„?¸²"µÑagzíE½­·oö­AUñz?qúù3¦´=âÍ]!»ôÍûäã«JW¡]+Ù~¢œnö1=üè÷%¡øA½ï|¡·°¾!êªH1½søxþÈ…žUÝ7¡Ãç²$®N5ðV”‰óRX„y¯‘@fÆ4ôQ›¯ |sΩ.ßçæ(u”&Ôr³WI<ž÷§P?³«]ê¶Äc2€=ŒZUWæÖb”E» ¨MzÀZe) jÛÒgtsñ; \߯dy _·ùº>¿ Eð«l¾$¼ç€Ýj0ßrzP‡ L¡åbM”Ó‰]™'죸¨ËÍ—Ttªä²‰EuÎyØ´³ß¢ÊÃ/ý:²(}ŽÜµ¾{èí;v€e®Htö¶¼í 0.õùt¶E¶íqC”P@0 Ù@G†Æ ãT-“Ûçø«úѱ'© nפœL‰âÙ|¾†Ú÷¿ž¿½Jz+»œDIlÖôhä‹kçºWE Ôm‹Œ…zi5¶Øùjlù®²¢ÊM]D¼Ü¯ðŒçp2±šU}Æ pÆ"–¯ÅX×j‡42ó’¶’}9qöÎ9k‰ê]m›ôñž•¸nc‘åe6õè£ïg‹0Û}mJ¸í…‡HÕ˜úÖÑnv÷ëÎ V»>‘–{béZ]n0“è§|ëj¨Òëu.¨@U騮t“Å.Ÿ7•¿CÀªJrü8§/3yñ-¶ú”¥`Ž_²ô=ölB›ôh´( ääü59”7|×ëtWøývͳŠ*ÃHëy*ÃÊŒz¦`E¬ZrvrZƒ@®´Åý@Æ×ŽàA¤º¯ÕÓ†îÚ§ÛcÆün¥Å?°·Ÿq «á}㣮=¶Ã’C‰> ªKöûˆ”obKÈvb¾ÍçèK3¡ƒÂüjU€] ¨ïMsWIúÜð‰ÿšÉôe²t‘ V§eY¹ £Éîh›…¨Ë‹L_°ãؾ§^ƒ|ªa?ÉCzçmÄígiKˆ‰I…÷äü|8ÔÜãô²^ô710ضÒ6y´I‹*t&^Û$R¯#eB¸ˆ 9:ëV“‡ö$ÁúþÒýþ=aj!¥nF“³ƒŸ¾êuhdCku‚ŸÁíaÕóÔ¯O@Q~+¥@_Ì2¤’Â:e-J”!Aw­8ž×‰Õ+5‚'Ÿ$¸ªlï‚•Wó31ÅÉì‚ùÓK–\ÚwºùDÞâÌ%‰Ì”¡–™!Ž÷ä5ž6åoj‘OÁ+È3O>vÖm^Ö 1æ•òýòßâ$ÍuUÇF®öDDLQGÍ¿Çöç4ß¼ ÇT³ëÉ@‹,ÜçEýˆP¤Q8@«q ¯#e$„t±ðˆ¤+= àÀ¾šÎ™•ƵOóÕ›E•ÜKW«&8¥-~÷}"¡:¢ÒëCí{æU qdÙ†®<åµ/5¶ gcx‹Ü&Ißup‹¶ç%»\(„ ;‰=}puµ•nT(YBSOU‘u³`y8 “­Ýdåàà—™GBeæp$RTÁ¸»@Ze°¦ƒìà|oÕ­XÈ…Ú†¿¢™ÕÒ~bn•OS>¾¦»Gv×ó*ÔSb-žº_–° „ŠqzÇÎÝj p/$Ù±è·\Brúx«Â·²QÔáxÏq²#;æÖöi¨%k2#¡˜µÙMŠ×%¾ÚôUfÖ’-½±?`»þeÉ‘í]G:à|eK3þùþ³aä(ñõ%VªPýô³Z> stream xÚŒ÷T%zû ×d7Ùí<ÙÖdÛæÎ¶mÏäš<Ù¶msªÉ¶ÝÛ9æ<ÿï[ë}WkÕ¾n_7~{EF$¯D+`lkµµq¢e¤càɪ32˜é˜`ÉȔͬ€ÿ‘Ã’©Ímm¸þa!ä4pú 8}ÊØÚ$­ŒÌF6.Fv.ç m¸Â.æÆ:€¤­ ЖLÈÖÎÝÁÜÔÌé#Ï>¾Q99ÙiþvXÌ l2Nf@ëŒFV%[#s “ûÿ„øÂcæädÇEOïêêJg`íHgë`ÊGIp5w2(.@cÀ_”²ÖÀS£ƒ%(›™;þK¡dkâäjà|¬Ì€6Ž.Î6Æ@ÀGv€’„4@Îhó/céÐþÝ#ãÃýÛû¯@æ6;ÙZÛظ›Û˜LÌ­€9Qi:'7'€ñ_†V޶þ.æV†—nP|0ü7?G#s;'G:Gs«¿8Òÿæ£Í"6ÆB¶ÖÖ@'GØ¿ê6w}ôÝþßõ´±uµñü21·16ù‹†±³½Š¹½3PBøß6"Ø?2S €•´ÝŒÌèÿJ ìnü[Éø—øƒƒ·§­ÀäƒÐÛÜøñÖÓÑÀprpz{þSñ¿–‘`lnä0ššÛÀþ‰þ!šü ÌßÁÜ  Åð±~Œ†¿~þûIçcÃŒmm¬Üÿ˜ÿ=bzaii%5êSþ¯RPÐÖ àIËÊ  ebe022sØYÞÿç¿øû¿¥òæÿ®ŽáOD [ç¿H|tï?D\þ½_þ}6”€ÿÍ kû±Ï@À—?ë¯ÍÀÊ`ôñ‹ñÿóüíòÿo÷ÿŠòÿºþÿ·"Qg+«¿õ_þeðÿ£7°6·rÿ·ÅÇ>;;}܆ŒíÇ…Øü_S5à¿ZÐÖÊøÿê$œ >.DÀÆÔê¿m4w5wË›;™ýk‰þ3…àVæ6@y[Gó¿-#ÃÿÑ}Üœ‘åÇ£âø1«¿UÀ“úß”"6F¶ÆÝ+ÀÀÁÁÀ–ácÁ˜XYžŒGj tû{·ôt6¶N.€rÞ[Ø¿&ÊÆ  øKô/Ä üƒØôBÇÇâýAœz‘ÿ"v½èÄ ûƒ˜ôâ3€^âúÈ'ý}ä“ùƒ>òÉþAùäþ‹8>òÉÿA1•þ ½òôÁOåúÈ ö_Äù þ |†ÐG>£ÿ"Ö‘­ÕÇþ#aaùKbmýÇÿ¯éÑÿ~tø'ÂÓ-΃Ƙüæ&ÿ€)Íÿ¸3ÿ]þï/½­³Ã?Â}˜˜þ~höøÑóÀê–ÿ€ü¬þ?È[ÿ£²b˜³~¸Ú|ìæ?ô¥Ûþé̇³íÿ¨?Jµû£þh„ÝÇÝÛþ£UŒµþƒ ãG­Žòý…€.ÀTðaîøñhþqøˆù§± ½“™ðÍú àäjû‡Îÿ€ô]þ?¸þcÞÿHÆôÞýW Ã¿bÿÏe9;8||kýýv~œíðß_‘@ ÐvyÁÖˆ;È¢&¨í¡Jוvw‚w–lW-…’ÖsÙ¡Ýù *‘²òGÀo‡;ÄáäÕm‘/·_W_=›ë B[âZŸ½^ô¾)Nï¶Â.Ma Lþ<¨íLJÁ£Uþºçõjï¥êo Ö Ú)I–mïÌ(Ÿ‹úàÚ'æVÛ_òk,daWa¯’M î¥d†6Z%JÛ¿pŽ,Ç0c‹Ò‰š å iîön%kòPò5¬÷I4s¾§æSÌã¼ÇZ™2“c6)¶&>Ø-ÊØ4¹§àA’$æ¢gQA¬dHd ¾îB#_;’=K5Qç2OÉèäæ(Ö¡ž¿P ÒötH¬‘™àð¡•RVJv-{áÌ+£^¬£BÇþ+†Gdù܇@þK§Sy¦ÐÔÞïVA·_ø!;B’Ù–°sú9}f(꾿û~ý¶Äd˜ã¤Õíià†pÚñ‰ýáÒ{rRÌ:SëFYã”Oy o˜Ä`„ÑŒ(‹Rÿ4Smh åÝ’·8zú“”ÅXõoÉNÄ÷^ÙÌc£@þ]ž½Ç¯ðŸ6í•wƒ–ŒK´€Ó1i\’Ý6à£RÏ$LJ¹UZ Çý‚†(üce2 ¶A5ì•E?“Âs)pšBMo ïåñ¹&ꦋgÂà+¿{MK”L‹ëº†É U”NI„…Ï3J™ÕâóºÂ鯦®;%é0Ø+æðyR”±e†Oˆëù‚°¾`—É ¢g&Áo’¤ó5jZtß™å×S§¨¼¹V¾_nþԑÆíôNmioªÉÒ åQÑ>—ÝÛÃËnïibþŒ1'Àe¥‡ìØ],"ßx_×ãn¢ä^´¹Ði¸ñy¼WŸÓß.fàN~k(®JÖÙaRš×Ù¬8f>`fHxb9§¥[~.R·Ð«±‰¢«kv‡¶hÂC…jüsÙ¾Ïݶx¾+f Ç®×§ùa¨VBÄ…Íqº„it#·–Œ<¬äœ/i(<š<lKi¬R¿æÒjAg©=^>‹µç0€Rvù:h”ÅGp-V¢ å‚b"ç°K¨Îû¿B,ìf«½7§+ê ÔÿàìƒÐÔLÇ·ö2´ ­Žóж‘ ñ±IM8Ú=…¿ËÆfÐÆ~5‘†Ow_ZOló—ë{÷^Y?I/ïBã ú2B±²GèŸÜmRˆðBŸo¤–(œ2øŠ]Ä8ò¤8ðE©(¨e5¼oy¦3í…Ôî5žhŠõš³6JÀË®yå]üc5N‡úØŒ¥ ¥•:ƒi]OÛAõ{»kƒ¥t9AUX“¶2©»"uNmE*É®¾þ,·©!ÇGÙù>ÿbAý[Ñ£?žA:9;ËÏÀ}ˆ¨ÃÕ™Î~(ÞêÑUQL£=æ~æªQìAË~8³=ˆSH«Vô}è¸ßi»õw²]ƒs\9…Z©¤ãYÆ\SæFè ©¯BÏ2L;úc¬Ò±×\yX;µ?‡ž6Ê;Æ}6ÞŒ²QeôaŠ6ÂQ‰L8õøä*½¡Eß•óA,í¥ &6¤@íB³Ä·ásx?©@SKbB¦1ëOîº:K D++*Q켺P:d•ä]LiG#²öÒœŽzVKA]Eú˲UÓÜ.—^=-žÝ0û]b“tËsÝà’fæ Oí ÕíãmYJ«q*ãÏq.zÿ'€) Ú lûªwt¢Âõ'³ª' #Q!ÚjáX¬¢¾a „ˆ›ð¨»=õæ^é%ÂŒd]¢¯À1$̞˽½ÃÔüÊ@M|ydJ–*“j9;u½0'k’V¬¢&)Y¶ÐºkJ;áå3‹¼j‚«™a§¯ø#³¹ˆwP@½R¾õ‰Ç}¢"ú)þì ˜–H6‹'jpŸ‡"½Úã!"-L«‘žÄ^}¼µY| Ð䊢­Éo_Ë>½±š.cAˆÁO%÷ÿ¤¼d÷À4Œ+-15K-éz>ßLóÏ^’ àW)*µOm"á•Nàzô’í ƒp†øy¡yךƱÅf¡Iq5‘±}|n²§Å¹ëvÛ±Ž`ÍbÒ~Ërùf|×Y³¶Ñ7³ÇÙE8] +’Ü’ÔÚÖ°„x’ØÏlX#=–ب1 ÖþœÄ²ð}á™n­ö À›«§’ïz…‹wú’<ˆPþoèª/GÅä©ê›rF"ÿòèÂx%›ÇŸýÛ>$ѾzŸ©Btð3ëµÍ/ˆÐ%Ç͌ئXK¤j&íÙaîTJ ˆÞwáæbªl® ˜›¤Ö5!.<Èš ¸ºÒóû ²GŠöiwD¿¨Ø‡¥åÚ&x }Ç}Î^ôÖ$a^…$øyX/ó!à”á= ëN½¥õ“d–üJ:ˆÙ3¥:fáÀÎî÷[¯vBÖ8Ü呞WWq?½²]ô) zè„Cðð˜s–÷¥H±Ñò`RÛ4̾5iI3k޽˜­³Šïáñù=Ê ~cFÕP¥L'ßÉü_Ü…µeê>+qŠ/](D·Íg8˜Üˆê¾h³²†&’l/» kkLÖQ¢ïcHí(åëâÕùØ4§–Ëà¨?Ópç± “¾%¯%Âé:Ñ«¡ø/¹OvúvöaB_—±4)HyR.󎃫 ·óµÚâV4Óí–q̃hH_å¿K¿Æz•Ý‘ØA³uJE#JÊ«þö0D,ÈÒ 1š¹÷~÷?¥$Ô^’2‘cBZ«ðßÚ|‘«S‰«¤­¾·;øfE]9Ã+–6»G)[ZaðµPlÔˆŸÎ¯sNÐ&P>v>;WÃv9S£YÕßî°Ô6yI;†Æc<(KBjqA”¹Là¼ïEñ«…Ë>DÊ Sµ TÉB˜ŸŸI›\›ˆÎÑòÃåŒ%Ø"OŒéŒe¯"l 9éÜzh·c¦C”­'(Ò§:°ü<>8Æy*J˜I_uõ:²RÄè\ùÖivÉØ Æ,.68TòÉÇ #MHÇSЂáöÃN¡.‰\½góÎWÅÞ§H[ɉµé"Òåû;“½@‘M›Þî·î·*úÐá*#§W)ì(™2ª€ÛR÷Ôè óìß®¼ÞÑxÃT¡Šý­BÖñ÷LÌó’o™`àŠYÔÕ/R¼EšÍk¾¬½PœkÛC©äbñŒÉJÄ9¤l@S)Ó„ r‘Ê8;…dõ—†óVüÁôé«r#Fy‰µ¸Í{:«l…9P‹aQ2‹¬"ù:XƳVC¦áŠj5¿ujk©Æ æAâUzfŸ¼¾Jîç»$ö\zöîrÞQ[Ú}E2¿ˆ½ ›$ù@h£Ÿû䲈>OÉ”–ø+õû)É)Ûã´çÛ9ôKéþVEƒ¶¨Ë­Ê‰>\§ŸÕ,™„–iÝòi°›O>ŠÜú*ñ÷ﺖVB5çîH-«dxo„”Sd6 jó¢?äèAÐdSÝË}‡Ñæö}®5íÛO‹WÍ%rƒýI ²„F•Ó©ÜKúužKö“(oͳ@AX4Ó“TAæt¬wÃýUgA¾­È=ÇûûUܶQš‚˜¿5Ã^‘Ñ~’TÈÖ2©RVgŸ£§Ã 6 ňô‡V£¹7c?çÉe™<ƒñ8àäÚ«Ý´x³vp¹M—¿‰!Aàûž mèçvÕº­wßZ0*ÝÛÔ—ç^RXu3ÉŠ4­ø•ÞÓäXAèÒ»Ôx¤ zhñÎgiÛ¡ö¨Œ¥õ5k:î¶5ÊD>϶ñÔ¯Sf–Z—‚&ñŒMþ—š§ÙÒøðù0}øtÚјÅ~­’÷ÌÛ©d¨Ü´cHÄ|ÃNÄæ‚&LÑz­Gº´§½€6ˆâŒ)e$—‡¬’¤ôš;ž…nf_Âàwüzи<Êå)Ÿ))M0ô'yˆØHIy Ÿ/|>œ[ä½ùë.Ý[ºïÄДí¡ê¬û¸¼f`²3²ÈK5ÅdÑŒ[ .Œ«¦.üû~,lµìþâwß0Ž‰Þ®ëeo^»-r·äXð‹ÚÑ–; ×Þw6Gƒ:åˆ^¹_íÕîÞ^’Ÿ{^»*hQkFH~ϵo‚¥nÞü w¾mmCóÛBÆFÄDÞ®HQ ¿R¼¼N±’£'íA6³(ï=C 9‚ W§ï§ QI?¦,¿Ÿ$zÄù>Å¢Ýe—'üPO2ÿ.)½aî6™‘bȦM8UàöUZ'Gáª,’³žrÆQc¨Ñb,ö|hÛÝó¼Ñ«Å‹øXn«Œ6­®/·)«"eÛÁq?È뤈èœ)ËòãM.nçç®Ù!c¬¦mÒd\wÕy~Ày #t>ä4]¬»b1‘´ŽpyNµ±­ç,²ˆ?VåÏY:\úHˆÄä[ßÌ]¦¹”‡WÒôh¥¹•øo!kmLÙpÀ“Ælì¢x"dåÒÏ`ŠõQ§ÖÛKéP$ÛPísÒ‰^7Fè¨#‚Y`ðÛ¢òwþ ñËãÆp³* ¥ ÷¸ÔAcú´ F6¢*«ìzÛäjGEÜl<Œ-nI®cÿúicNm‚©Zwë!ÑC¬òô`.›=3QúúênÒ®§ôN¼Ì÷Lgª‡#È&¶û:t,˜Hð2d¬~WvÓ¬.â Rýã48x¨†Òªwee¥PŒÊö in[äÿ]”§6‡y.õEìmmK– c]R×uk-0²×3\¤<Š+×’€~ˆ{™†'XTÝ(ᕟ›å3¿’^i"Ulné–ˆ=óè¶®oÀÍ2?-×úXŸZÂ*æÑæû6n;´ŠW;&­„¯¼hî–•Ðë¼uë`æò5 ›QŽz½ÒM´ÄÑK¬VC˜ùhýõ@ì§@žj¼¶&ÑO‡j_w²ÙF§œVÎ-u4ãˆôp€ˆÍk!Ï "šÔºõcW×ʆGŽ…:4FQ£`k•(z»•¤?‡#õÂ!ªÛòÎFØö—‘ª…hÔäºËÆîèFøöÍÖm¬BT!g+R) #¾QÞL cboÅ¥ù5M%ϼ”£k弎MG÷>áBb¬·­,>Ð)˜*M‘§û÷ÕVñ9رÏDê4yùsÈr½2Lˆ4®,g­˜/µÁD»AýÓbHë—:ØwØN°‘Ùwγ¦É¡=ü­<›ö28)žÕQ·”-gwY’K#LŽ)›GÒ$-½‚€žò–7×p­nãýÓc…ŽÔ·u“ºp¨©zW®µ5’QDr™îtªF¶o·/[º2=3îÏbÆÍ·Òx…lD5dRëvßhÒ¶mìº1¤}Ô„©½GŒÕÄØ*jÜ¡ KÑ ÔY ¤ÄòkHúÎØ§÷™çi0‘¿±Û L$I^/£àB&n¢sÓù€Æ KÍƒŽ®ÚhLq繺]·c½õ¨Ñ['öŒtà&‹l´1:c  aºèÀ2GÊÌ_Pë²Ý/MÞ›eöwÕ)ùJlH+7`<1¹КA£B•ÌUÒÕ‚‡éV¸8p·o²†ßToµxÄÆá¶Êíü¨o¶Fn›:fβÿB-‡ÏWt”ºxCyœ®ƒöîˆÉšŠD)mhåŸ&£«e…Þä7þ=¸×`£œ2¯Ï›~ï—:&Ô°ë£Õ6=±`x…7Ü—„%§½Ä«~]Uë’ƒ]²ŠsÊfZZÙà!´…ó†85N;Ó^kélòײºSüi¿#ý<Ý,vŠ ¡p»P1ŸûG3_fÆ£ÑÍÙ rE/Db0îî÷=¯iÂËBgÂ>{´ (ÍrRYÿÂlaô¸c²›åwMÕO:«‘ù9„¤êÙdI2‘&!ÚôiXßË©jc|ƒñœMZü1$°Ì"|ƒt8EÛº„§®ë£)3­m¯\{‹é²'ÆÊTµ1êy¼tqôJFá4voô|/¼·½Z–³¬o“9Îä!r Ê):ø§”›eÕ6­IÙpæóoØÕ©ŽGºg`tw«;Ø1žOýi«¿Øk*’ɨ‘qm™ïxZÚ‹\ÐÊÈPo°°3BÜYc^}…éÌU¶k @A-õšr)ŒbðÎI!]Õð€Æ`n`\tOC}¦ŽÀ›ÎÄx™‹Äø¥|jô:û+ç÷¸±;÷ŸÒu-Iuþ)4Ažó„ •ÙNQØH¨’aVƺDb?׎ Ê&#¤sÓa¶¿6¢K•X¡ÝºmNqf 9ÃSDä³'dÍøÎ¶©{q–àøÄ5Ùku>[;­ @ži¢Ë=Ôá·]­Ë"©þ”®¹*æýê®jmÄ(wdk«¤Ô„°píÖÇÛ±_°?˜ÿ+¦›î~»—ê¦¦XÎbŠpÊãïÔo ÅÌ W¨š¦T'$ËCq­ÐyP Σž¾Ñ# K%YáÛ\Ó?:”zÊáM'Ž|Їk×_B¯PïpœôOà,­ »¹ ,òEõòq\hÏcç ótj’ÀIç%!mtûZ&nó¢°sOxË~‚C\Œµv’᪒Õ?ZTÞ·jÄóœÔY†óîSt¾Þ}ØØyŽÏâò+¿tÌxªVÖ¹jplÜû(>SYÙMYS¥¢=ˆ3µwh²4×nñ*X º5¬¬r£2 ,3¨|mCôäîßÇ5ªKFøñ Ëü$ÖÁ—ÝÕx“-Ûê±V?i— Ÿ5ùuÿ ’ ÆE3|“yý:v4¬¢õÚ8“7M¼5ʼš6¤ã“çd&øfëí9©ju©Œ`M\Žzž1‹±{7)GãõD¿ÙšÍA&›ÏÕÛ[ìÆW¡A‰®äšŠë>aZX«vBŸ‚p¤½<¯‰Iò‡dZŠhä„—Þ Gx_(âd—Ž„Ïe\ … Ü¢lñ5‰ttúM-ZÎÆË§NÙ<ÛmÂÙkŔ󛒗Ã^À°,¿ŽT¼ëJ¾ºúcô¡T«ÛñJÊ!–ƒÖ«BáŸs#+Ûu QP€âO ÉU7¿ˆCËÀ>Yl3¬Nji^r$õ²XÅŽqfsþöÝò«…›Àóü%…¨e¹Ÿ`ë‰&o™¬AËÁI¾®2¯¥_Ò<ïÑ̤–!en¯»³³i„Ýo6k•1:¸Ö*ŠìïëþøîîùDN=¬µàQªcA–9 lA“®@ÉA0:”#7~¡-j†„í¬|ÈúèÜO %`-/žÛ·Š¥dñ¥+ÎdPÑ}ïAƒ"Ñmr¢Ãìq«ü‰X ¡¶àÂk÷d~ö;äy©¦!|·sÈbü—RN ú[5plC|°{Ë!–£LìóX;o»žœ8ÌjOø¿Ú‰vªämkhÃäÞÕÖTeðü åŽ>ú=ô64C“Šö"ŒecOÖ~¾ÌXf¸¹FœúªèJ¥º>ðu3bI½Í>Ùô„æÅÙ„G €¼U ^˜ë¯×ç_øùçõ ø4m,ãÆt¼#m;Ça2¿¸+s`é¶ j?LÞóútúóÆàmÚQ¾Û‹g¦j ¥ŠLINVb (ÂÐ9øý±<Ó¶áV¾IXÍè£ßµƒj™\%|˜52žÒ7‡ÈžZÚû-š›ŸO¿Èuq3Îê5H«´y©£le÷¤àÑk"øü9¢¸ñó|•‘h4¤kˆ>×| ñœºŠÌ±%1„è€ÚœŒý4.0yù±5eF’g¹<;Û²€bT°Nƒ¾ݸIZ³ââE¥IÿBI€]H%©¼á¦5/+²d¨X/KŽy??aV¥š!Úo;&žà•¢×©>&VöðöGçÌ–WBŒJÈWøÿ¦¨~/w m´­÷qŸ‰Èàí4AÑ@AÑdäÉå?^¢Œ †8 .ZPy½Û×À` ¿{,J.u¥Ð±–à ‚“.ö&@(d³΂¬>wUš®ÆÇ§—"­¸µµ¬þ‰—÷€ç¶J‡e‹^á`R¤·Êü M+¥ÛµÊè±N¿0ør¬Ð;HdWˆÐ³”‡Ð­ˆ¯bQtJ…~ü2Ù9ÂsT(PóšÿúÞgÙ,cmÏ57³Feþ$ø·l2ç])ÆÔõ—IÌä.ܳLj6ñ5éG7±„ÃÁÀùª¬漆ôÜ‹;pP4~– ­•Âϧ\{ju7Çæ{ë,îYè?ã­‰d§ÀïÓŸïnˆê²™XQßä)¾ZÌ…ÃèÌY( ¶YsÅ _¾ü¬5Øöípð+ké§;,A[ƒ÷È_R;QTçé¶„N”ö/¬Ú.¦oSÙß§rÇÓ‘øÎ¬^ú]Þ%‘Õ”LŠk, ²ie'êg¿ óLdîàÜtã4QÎU^ËÖ┥¸ÅØÏJÃn AùÝÔMìQâH­¹«4úS²g¡¥qÍ­»Þƒr¥¯›ÐŠ(È=¹ÙÝŠZ‰_ôÂ2XoZ³8¡a"–@{Ã}£âCØÖìŸ@¯5®2Á·bçŸ_{X£gè‚Y¼Í/×±Ç¹øFÄ>ж¹¡ŸŸÁ¢沊”Ž—þnÊV‰9!»ôáÖ<°´{Ëù-WýMŒïrãI -<•šóiìµtP68ÂØ¦Ô¸=«YSG‚D™û,Û9Ó`»"¦@¿Î-=mÏ—§kkà‡š9ÛÓ3m[w¯/Z,&ÑK1Ç?EÀ—¿ye2ßrº÷³fq>1Xe'Æa¿˜„ôµÁ=Þ]-ˆ'~Ê4jŒõpÒ+B?¤Çëï6Ò ÎŒo@nq+¾?µX¶>°O³k†LÙð(Q²ÕÀ ú&Ïj|\|Ñ Î΄©ªÑÐr"˜Нým÷Y:ã 3ª3¶©ù@_ôvK˜»5ja#Ÿ\i×\®^ÁÂHòû´$æ¡å5ÑBnSšû/ÃþþS ûF&5‡ÃÏèÝxa½RéùëÂÅ" (cæY¼Š°ÚÛPj<4fr±p‹¦øæ9VXèw|ôÖ*0Â9áþPñ/è×$xVç,:ØA7ý²¤xD$KajÔÖîã©è9BLÓ „è³Q´ÉCk3±¡^»‡@R» tuA7·0FPñISIOÈÍž>¿ ÆàÏØ¥FC¿àj¥™Q‡¿ËV#ôÔã={ŸêbÊ`/£kæ›§°³1\™6ÆxP!#–¡±§¹pîeöXlq)ÝqvIˆbr îMƒe¡¤,+©à79OêWæ‚Òƒ[`l™ ƒ}¢tƤã.¦C¹ûÎŒvY+ké\C‘‹:þŠ1KuÓ&wŒ2ÌX#Ô¡üyÞÊ¿™ˆ‡H°B©¤¯z;`Þ»2I‡“©¾Í£NtžÑB5¯Ï%ƒþÚ÷xFN·ÀïyDêÈý9þðÂïnX™ñ·„ŸY÷ú¡ƒ»–¸‡ŽA)ŸägEÎÝßIOû ñ ʳ~ÈÊù[š>…­dH}åp¯ßêªq´CšÂá8% /á!Œ¥à?Ðô§‘휂1¡_ã,ãÐïÂ:¶éæ´v±“ùE ànÛÜ Ÿ^s­˜#câõé‘%ûÝ{~N-œÔçÔ'›]; YÑ #¥–„ÉK!S\ æÑ/õÙï¶ûÇ(â,‚kx…˜†ÛT5%E4YF 'Ykµêiþò¹ØÚLva¡á\Šï5p&+>Æñ~‡¿”Ø©uý”3¸Á#5Æœ™´1ywS„è,¤Uj^ ®ˆ¼ŸyX'1ÈŸ›®g±ôëÀ6Î'Têê\Ê?š5¸ªÊßzÎo8Â=ñGžSh—´,Kö2z›k®†}[ÑLç äüÙ,Ë)g,ëî¬ÀïÊnÛM¥»ŽÃÕ‰¯´Ìàˆ*žó3Mm,hߤ¡˜'ýP/34_î}…›#Ê]²Ü ÷M»½ïZ…X=´Ã½ÝKåc¶¬Kæä]½¹ÒM6Ÿ®±ë«@Æ\E*÷ <<(8ÐÞOõ¥¼’óûnÄå–—{š2o1.q/G]Î9£éö6 ¥yZè_vºY=IŸV©1“M‡çJA½æáš`<«Ì2 ßR‰ào|(»”±0ýÃñ?'Éê,Áµ\n­î'É ÓF³é×;J0 ÆÎ”zîZ=ÂÀn(­Ä¡¬¡½b[m]|uK¸dÂñYžóœ¯mz„Ueê²±„9ÍÖÏTÄEÖyµ_½dk~ºauÒÍhÎ ìŒðÁYHaÚH„ß-A :ç¢AÀì1Ï™uìöeÖŠÈâ :ÜåÓƒÉ}N %£ŽÇ²ù´û4Rã Ô¯2µèç¨äz®OVâv6¼‚Â¥%Ï9ûÝ f,ÖÀ‹ÚÙ„¿éZg&>‚6¨£:pË òp†Á¬–ÞÂz^(â¬"eÕ¥3 j¬ÊÏFíjÛ(U)a—B— ’;‰p+FoêŽ^ú%8´¤Ùý»¶-©ØãàrNaß·Y1þÖPý´º[‚b·•R½¼§ØüB—»³`ûÃfq ÝŽ`½FŽÛ)¿žBú^n`p(ئ¯À-ù°üª­ ÿZØëË~æA=Bý"#xþKµhù²¶ÚûÊŠ z*­§Çf±·½P€»TSwïãÎHû\%Ò,A"¬žg‰6†0§kŸUŠTJǯ­8O›±:ZWS¬IÍß6Æ…úÐNºŒX &`Fï‘òô>/XBþ‡4¬E/Q‡ìír% ñ¸Í7œwÓnµð@°SÍQø¡ŸTLþ&š8ÆEX˜ÒÃi`Ærƒw¢`±‰…¶ =Õs÷òw2ý¹–KŽÆÃî̉ëj‘éù³1ïrÁ`™ yä0c<¢ë-«uÙY¬Tžó¬lOxlM¶›•1蜬KZÏÛä][Õ°ÍYødL¦ÖU2Ï$–(cAhõvøÌ÷CGºùaxµ¼oãîä³é±Þ•¨«¶&ó7-°×¯ö_5M®Ë–wíÄM9éÄc{¡çUÁ¿5J×ó‚/V÷GíÖ¢f¦®Œã/äðÆË Ðx],û¥<6?O»H¥›š&K&&ðƒ0aGh,2P×4¹ˆ¨œ-€EÍ5ìzÞ`âià ]Ò±¤u“—­ª‚Þ“Þ‚©…³‚"Ô#˜=ïõQ•_@~î‰:+ƒ2ùi>~Û:Ý5íB“Ô~¿ ö2Üʸ)>[ü:Ú$Ûë•â÷S°¡^©œfŽÓhó$Z9·T,pˆ R{”¨±¨wÇc séf—%mŠÓ#âÝ“#ž7rö{¬Ô6Å# +]c&©óåÆœ¦º GšD»Ñ#Ûš¶F³,¾w¤È zÂ/3“²O¢Æ ´ŠL1e£ÚcÝç_W¥øU,Å¥LŸßÞ£çd0àTY-æøG;”2Ö*®\ ®YW!Ð$Múòl+ð¦ì—4tkªÆ®ìÕ‹}´>ƒý:±ø.{=p;ˆ6þvÔúüÅç~-œTßœkUÃ2òwªiÙWº¨¦{ i/ÖD­ÍÈjtòŠ}xš.÷æÙ ÁÑ"S.$ÞTx—ùý&‹õ¡[´àmC<sZóÝ d£ò×Ö„æ"¥g7güh×Ïþ†Gs AD 2Eõ͸Ș1s?ƒ~©‚ú*:¦n!TQò¾ÁOԬƒT¼T¼´%¶dŸúÑO:9cúƒçº¨|ADJS3L¤F=OlO£|DÊ«_åìhgEß½IU¾<ÀBu=hÿdÏRÎßÇä•*yðèòžhº‘|ØÕÛ^ ¾ú|óOª4/éÉãÉÝîœBî!tô(Ã_#¾: þâD§˜@u?øq¹/kT{ï»HPƺÅ ^~Ì…pMÝä7›u÷À•3•ò–‘ª]«·³`oĆÏÇÏl8ëÎa°²QÚ$dÒû¦45"½¬f:—SãÂêúé•äÎç2Ån¢Û ôt Ækå.=êÍ¥Ùlž/Œ‘‹kÜP:µÓÙz®¸½ÑáDʪC”ï®üv§í¶Àƒ/Û$Hl½Žc¼^ë×D§úéíÄk?eþ—]×Ý’í—Y6Ï÷Q¦ óOmƒãmœ­ôâ×mÿ¼šy2©¶“+ŒÔÏ¥#xR(X5¸6 Î/Ü 3žŠ ÕY-¬rªÌ©ë 's ÜöÞGäÄ W>=³]¿3È‘//ñ-(ˆ|'Î`›Õzaµ{cC.oØ!-­#ÌqüßQ Âín¶§wFJ®]MêÛ$î}-Ž£:$ïT•‹?¸ïúŸJ>Ag(ø¬æ^ÝU3Þ}Uv$æQÅ–Ìæþ…nêÖ‡áíÏó½vŒaX:ÂeÙtEƒSC ý»àF:ûMå +‡Vˆþ&aQ}ÆÑïêzH˜A hò*b°(Ê(úüÔÊr0â2XÝk'ÿ²x;†ô7ŒœfC’õ,SNŽ#¿Up=E“ehÛ1„¡S­1¢óâ¨r.á÷ˆ ÁL[gKY¯VÚ‘ÁÀaÜPäÃý5vùãŽàñˆÄn†ÿúum!:žÊÃ/)Ó‰Y–Ð[|¨$EÂé2ë1MÖxY@97zª<Ú"\±YúNÐgvÃ2?‚€Pf{ Söi ù€£{0¶•*›°ªHc‰_ÇX{kÆ«§g‡¢<ç5Í+Æ F»ˆ9#î>jÚˆÉdóØ Ç7ωõ!~=gî s¶ ™ó2IdSd•:–K¨¯èvú~ò‹m¥:sÈ7–y¶ìàø“ò@¼™õN•PÀnzä3§ÝË3ÜómƇ·|"'Àò±<$¹xô—¸ºÃ… ñ殺9H%\Í[ÌÄñÈ»•QŸÞ¸«†í)0k´œv¸±‘î ¤d˜ûó›žs(ƈ?L‡ŠâbÄôf|D½BâÊ¥’Œ1ƒƒOŸxàn¾‡Ö ­í„–Ç$NnJ½Çîu{<çPÑÕ1ì~b ñd·éø4C*MÐ[c*žÒ6¿Þ|Õ4ðæùΘ¥´P’æ0 +5ã ao<]Kþ ÉÇuT¸sz³µl7cë·êjì}•}!œçÒÜŸ\ô^aLDTsëã¥aœ \“Tå¿d–»ô Y%7S´æ&{ÆXp¨ŠÄ0ÁÏ;¿$¨Lc.ÈÞ:? И[D­4tN¤Ø6ìÍÆñ½,P)æ[©“ ƒfW½ý 7È2_£Œ†õ csš°GåpÏôÍÚ7–™£äÜeÒ´¹õ¢ÜzVÓ±ØÅ¡KÏ(h£éMo[÷·ŠWó·Ïü¡ûþ.óº¥S/6PGÓÖ0:Sþ2×SÞø?AW¤ÛÇ8SÃÚL ûé—îa¬(ÅMÛ¯GàúŠ˜D4«»"âK%O ͨôN¾Ž×ìM؆ڜ~îë-œÚüTо8àï›ÃND Úò¥l¡¯8ÖvQç¹;ǾðK” ':_ÏgÎ8ßH“]÷ÊêïyãÅçivQâêKÊÏMBsÄF­øÚ¬÷oÊ5T„ïð©*ðö?ûzJzí™ö{ÜH-²Ã2Ò) 0Êé·Ç'*bbyEþOàb‚t“}$Ò’óª’‰“‡­« ŒÏZ¢ïÁËäk) t¦Ô”T‘u.VÉ>Ã]Æ¢±³Ý[fà\ïÁýhÈ™C­>ßžu[?ѱÙfÊ7~+O¾DFÊ7…ûŒ0ÊVÙq<¯W ÒpƱ—•ù#Òƒæ6`é§a[UÚ'ò‘‚²‚$£-«ß'I ÅT¤¤QšêD/¢±ÂVêâ[q&ˆFÄ{ÉôLÎ,.ÂivûqtÍE6ž’1¡È]R=_ÒŸgMx&R jµhhàÃìk®ì„¿•ªGZ|ÞuðyŽ2׳FÔÓ,íµ-öŒ+NB<ž–JÓ~Ùj· Û¹7’Q`ƒxAOج˜^ª»®íÃõ¾\tž x’š’¢¾ˆÏØã)K(Q "l±<ðÖ·AMæzèÛ”L‰IÙþº…$Ћ½(Ÿ`†^WžÃnè쾊|~!|[³÷šZŠå]Øw©ÿnŸ}3+iŠPºkÇ“6OTýÞ3Ö_N˜aÈla‰HóýPs—ÀG#P²*½4¡út -Ù×8©á Ä´PÉÉQ<3†”6¬ïýÔ:Mì Úɽsl6è[{òk'7õ‡¨‹Ä¬J!i ³ÙþùçüœfÕæáPÿ~R¾nËùiôO…#l%­{Ððû¶Öx;idþ2‡Îi(+·Åãß©ÇɹÅè–Mà¿Ãè/¿Íè#’Kå¼—…<ûšW–ÓÃ4Z ’Àð3–¬$›EGç$§)Ùorž¶ý__h#:{ÏRaÏ*àÈé~© ù =óçHìå®õ7·G7µò½—ÇÑ¡i}µƒ8]Áˆ fŽ@L¡œä‘øõˆÈئ¬s =ê5i²ì›D æ[­;ZrÔ'–`¸®Ø+ãj'z]SÔƒW¶Jy/¦£8M¾˜ ÂBX™:mƒÜ—‡½OåPu¸•²X†®½9ÛæZÛ  ð°ãϨ1%û›rn×myÌB­Þëejµ€ÇýÂpQÊñÙ–€ÓߎÌŸª'ø‹ËhÁ’ªˆu`ÛQo+àÍÏâÎódØo,š‡AÐö"j»<»ºqV?sm”ß×¹Ò-¨>…Ò¸³Qž”rû2 XV@D……×½ž™¥9Úàµ'ÀX[ë×ÙMÚTjŸäº =vµ:z‡ß«ÅX3o‹x 2 ‰ãqq¥Ã9Êâ”*5Õ*xŸÑ"&‡™X@v˜m7]mQžÚDçÃfFºøÕ0Àô•ë»Hûìkhèô7$¹G³D‹½1z;±T»”&̤EîÐJ£†Ìë2ŒU38¸nÎÙ‚öq¦|T²óŸÁ†êþÝç´þOnìyÞW­æ\hÔ1³UöH˜åêÛ:óßêFcÛŽnÙ.ÄMÍäòN-2ë#2B.oÔn ¤cgµÁ>ϱÈnSö+B¶âó—(î|ú‰ðû0åÈúGò8!T'Z"ç²hªè9±ëˆ-_^‹À.7ƒÅ bxU8@àšó ÉÒÂ$u=0Ë ŸbZÏSÿ*ù>ÓÜnHógÚ’8¡NKª«Hk!ñÒA–á=¡ €’ /ABÍÉ òËüï”1ë ÊÊ—Ë‘9Ðà³êN3%ÆþþÔô=ˆI0 £Õú™+kÆ×@Hy‰LÁ=r×´O}zA09®ŽT^÷¶¡(3n;Qa÷n•[§J6)FÊå*F”„âÔ^ËžßôFf”=’ïŽx@”Óõ9erCN—~.ÌgRÈ>dK»ñÎ^iÚd Mîíßõ¢ 8MV…©û&𹉠ÚÄݺ“íáµÓ4¦h Cbr °³¦ŒGQ˜G~irpà²Ë >Ó~od}n½´FÎ>ñãew«O!õ¶‡ŠÃ·îw¿u1ôâ£ïN»h³3B¹g ÉÅí~Æó@ö: âm§´QÇ‹`›Ϭä<·scÍŸªs¹‰îw%Rä‡äN©,Ùä9ò¸iጱ—“:àÄo©‰Åé Ãû”|OÄ·Ý ê“ZÆL1à4r€><“쩎°vΗžhðÚߢU˜ïÍwƒúkQÛkº`]ÉâA<£ìÌ—1Ï%o1µñ”À¬b‹› ƒölÏHg te©tuÛø„‹y‰ÛãΠˆ x ¡Õ/\ «‡€7eaw%6ίr¼À VÚ[ËŠ¤/ýŸÍg_Ý:èzÔýC­/3 -xL"+õÇÜÞ'K¹¯¿—΄à‹âßÔKLÖ‹óÙ¬¦±zœ'B®¹5|«7|éÆ1 XC7§\Þx(ùŽ$—5’ÌoŽœÜÄ”óöÜö“+?ùÃ>…ç8,:ÞŒÀ¦câ³½ªì{•=«îËIC¤D·-¢ü´Ð;öÅzd‘ò´Ü:ÐG›7O;+õÏRª\!±†ESiª×žqé¹J³òÚ n|íün…‰½Tý-f°Æ¼ÖÍh3í(ãÓ}ƒAz”Ãíjbl–öo¾Àâ4«•©4±‚;ĺÔRµÝ~_§¦œÆ¹ ¯Àt)Z? -%±ÅÔïÖý樽سÞPÁ1P„û'×vñÍ_¾¯ÓTÐDX^êé%'t­ìËmÜÖ™„ÀðE+é˜.LÒ¦)lÑj?.¢Ò ÜÒ½{ƒÖG|—ꉻ^Kò6‘²;• Dý[UXSôPW Eý;úö&³Š.º¾™/L‘¥sºN\c TùæTï Å9”ߣò—f8=DÊ^²½(‘"¬ÇJ60ö€1,¬$‘‰½¥=Ýêñõ( œù »õÇÛ 9Ã0£å&¤ÅI®]T¦°y¾ßµ@Ûªµ ö„òH‹ŒµÝtŸ•×P’YÞ¿_ì݉†^w¦€ðú{$Š"®æ.Ý&cÍË yšœÑ“0*Ÿ¯ëG½–2 ™_—Ð”1¡¹œ¼C¡%{læÒ¥ÄUü½ˆkU~4L»éu®í±YSˉçPaÚº÷ C Ò­ä9â|dŸëy˜R” R"a`M¾ '¥- ÖzÁ ù·m‚ž'qø×>lSm®cèj\Ö£³³gûàüÎÚ§_Yò¿Ut }ÅQá{Ÿé…Ä‹±m•ZŠm ‹J̼Ó#®/è‘Âã~Ò;Ì2æö…Ȇ­¯2½a.nØŸá-HfOÑ,ä_V¶¸îÒAž™FkÍ7¹ ŠBdt'/ÁGš3ù3ä´°ÒLð _ï]½å2-¿&à)7ÛJ#³°gaöMîç4_a›Ï¾Ð-¦'?³ÀÓ: ò~óho\ñë7K81ŸRýÄ~5ÁwÇáGxŽ7$ÂØ^¤9L%hê#®×Ô†rÒ=ê|¡¿o5Æ™‚O<kÖom¤ •xËÈÚÊqQ ÿ¬1µIœï.ëEñêŒ)I$‚ç)çôެL°˜0Â«Í ,!+WgÓx,ñºƒÝ³di;´èÇÊQsš‘¾léZ‡‡|dêÐf#§¥ÙýÓ# ø‘sñΔºWiɳIM©ÖÛV":2ãÙd„¤vË”5½Q-Ylœ+ÊîÕŸZ†Ö£ˆÚè>Ïešbͱy §³û|bÛöÁÒ²N‘òx§ Hk“üˆ¬TUlN°ˆUšÕ€odçmde°âqÙd ll£%{b`÷Ú‹…¡ nŸº-gÏûv´gRk9&·Âæ®^¦‰ÿŠó}Iwì’ ï[»?’ei÷ùä-µ*'öý¡óç‡"÷Úé SÒb,³¨*WYå[Ù$P«ØÜö?ZÙÙ}ÆÌ'‹ªÂ—%{¾Vh=… ±CX˜.ŸË„IÇ„í Š€fõšR“éÖÓZ¸”« Ö3c&Ò™M£üù‰xq¢Aj ¿g+D÷ØÕëâu· }¬a`‘f†*zê-p ¿ôÓô3HÇâ%/yTKÛ&ØgPrHT Féb!ƪÚîêÖ#‘7u:ë©5Ú~ÿ\xªç"|°¿Ÿ™HÀ‹¯Ó´JôdDâì[Çֳͨ#¢D6nm ATà6Ž3¹Á¢Ø­=ÝŒo¼)©( íÛ¤#çu •¨FüÖ:–VqæžWCtq˜oð© †ÃâP*I¿;}Õ‘¬±?]uè¥n¬’ÏŒ-žêgˆ1_ôXóCþÏ™yq–5[XÓH ‘gï˜[Kg"I¶­õW#™ZÈZŸüôhj.¥ J=çc0'ÝGÈ5/7æÓdªZŽÆ%üa%k^žkE؈ T›ž2úŒ¾fð6>ÏgF×ÇTi¦îqDï¹{V÷üÊmL˜ >WÌhŸªi«I#Çű:›‘Û²%n™4D¼v‚pÑdM)s2åMõaŸâ@y¬Éâ‚Øþ…>Ž{ òËà3y/’Áb0W[J4’i¡€–iˆ´Î@²û­´NZ'Îóóot^n º8²ËK·o‡YáÐFß®-YF×ÝÏCv¯Lûû“"Læ¾ho(<ä ßpÇ’ôG.Ìí›´†dê$¬ˆÕz»ºx¢¸—Ns~,ú{÷ß6°è%Bž£D`5-jkùºó»Ríß–f6Ì<ƒ¯ ÿ?½BþXñ×#øó°˜ýêí–´Â!»Æ9ýÕ‰]h7‰ìŒÔ‹Åî!tÔÌ^9 ý'!Öâ¨g‡嬧…SÜf®þ¬¬Ä*­on2ö^¬.£GJB˜9êl&ü ¯øE$½À¸éê[ž­µúѳÏd@{š@¾—¤ŸŠ¼ÊšG ƒ NÁ“(ìø ºÇ ®ðA ~, ¯¨Âë鼇ÔKE.‰­é·òׄد¤òD6™¦ÆŸ‰ÿ :je`:ñ)¾ŽÍþ‘^*wÂ"e^gï;+xCš±ùèmýævèÅ®\P#©ñ°ïÐò^¾qÓ3=d6ÅF%°)ÚFܧ’†©¯óÔΞ _Ú´…„8îó ÐÔx×ငÔÁKÐÇŸtµÙ¥Mßâ÷‰ê5Á=y›+#²xé®]SU(#] –´sÁn©D¬‰çC y? t¯gð0VL~œB™œ‰>g`ÌÒç£ §q“¡Éc¶µ[ñƒP!»÷S˜+¼=$lN”ã|²éø)Úx¥-CÇn¨vϸ‡´Ìõr¦áåƒqôw Ž ºi—½#?a©šp™÷ endstream endobj 503 0 obj << /Length1 1461 /Length2 6774 /Length3 0 /Length 7751 /Filter /FlateDecode >> stream xÚt4œÓ¶ÞE'‰` ¢[‚hÑ{”è=¬ÝŲv…µºè¢EtQ£Gï$ˆ.Ñ»(ÑEKˆˆÞßMþíù?ßwÎûž=çÞ{f®™ß\ó›ëæ`}¬Ï/AÚ@U¿P ¨¥¨¯(÷€@a ý;@Âauq…!’ÿQt‚PŸ…Aj! 78@è>@HLRè$%þ"]$J 4 Ðh PWE¤³§ ÌÎ…9è¯W˜ $!ñ€ïw:@Þ êƒ-Êê„9 ‚ô‘`åù¯\Òö(”³¤  »»»ÈÉUéb'ÃÍp‡¡ìzPW¨  ü" Ð9Aÿâ&@Â0°‡¹þÑGÚ¢ÜA.PƇ¡WLŽu`Žè«ktœ¡ˆ?ÀšøN $ ôw¹?³‚!~'ƒÀ`¤“3á CØlap(@GESåâ€_@܉ɡA08ÈøÝ; "¯ a(þIÐìsF¹ ¸Âà¿H þ*ƒ™³2¢ˆtr‚"P®$¿úS‚¹@Á˜Á{ þu¿Ž¤;ÂûoÓ†€Øþ"qs4DÀžºAÕ•þa\$ÿøì (€(PüP} €z€íaàé ýú寰ðõvF:l1D ¾0[(æÄÛ„†P.nP_ïÿ üÛ"@``ÀjCüSã†ÚþacVÀæ0b6Püõûûͳd$îùü÷- ªªi«*ðþÅù拓Òà-$à„€`^|ÿ]çï üÅþ·÷1ögwÿQPa‹ü:á Ìøþb‚þs9¸þ”7àßGh#1; pý#  (ŒyýŸ…ð;åÿ·ÿ¿ªüïøï–TÜàðß®?ÿäƒ{þ Á,µ #-$F&ˆÿ†Cÿµssúï¨: „Š<Âþ÷,a®*0(ä1 ¶ÿc“þº Ly8 }Œt…ýúðø…€ÀÿŠa¤vÄ|\\1öGäŠÑ!ê÷Ýþ²¡¥ý»e ù%IaQ1ÈÅäI‚ÙŒ%ŠYŒv!Pß @ Q˜†®/ÀéBòë–%A¿\XAðß–P ûǘ®¿ÍµvsqÁôø{q0ýýeÿþD@¡P0ÉÌ'$X*Ø¡:¸ù¤RžÑmH7åÄD˜(ï ª[yÌj9N?#}öQ±ÊL—ʇVm…§'™ SûÞ_jXj=EŽøYT6íXl^~º>žˆ÷>¾Ãö‰â-V¶q’³d¡K7Öc¦HÊ6bYˆ]·>…ϽêÎéxwNÚ7*4Bšµ[Ú*ߤkÒß‘0Ú^ÑC½³é1X=¸y/kÅ)&h5Ê"P.Ñ¢QϹ¤E—,wˆò«¼èbJ_-^,hL+Ô‹®ÏF÷mÜGµ2®Æ¾ û3ÿ ÏT¾·4‡Y3¥‘wñ7kî’ªêKdÙ Á^’&"\Ø}ô 3x‘ˆzùÝœ[Ú¸Rj@{ùjdÀVÎr˜ˆ‘û¸Sü«¨‡iqCäN—þbÁþþ–w;=‘}™0R“÷æög•–å÷#zKÉkMe+Ê„Þu©ÙëƒE/ë2ÀÒ\tYF^s¢ÍÁ²}g¯¤½õ »ƒ'w§¢Í@D¥#EŽÕGQ™Ëm”Á`ÚŠm³ š]Ò é(×ÈÚÞÎýŸÒlf`oIÁ£½~§@t¤T!D>%ÅžJÙ*æÒ‰: ¦Ô‹«‚“Ã675èv´€’ ­cåü^Yƒ-߃¥bBôxP³iÖ¸Ut‹C(UÃw¨ý£[,wQ#§«ßèæëW–Á·{GTR¼ªuK”ŸÉæ¯íeó PXÉ&Þ÷>iî³ÿüƒU”þ’ê•ÀïGð}F”;S¾wl±.­...üTK¤Lt߃]t¶µ|·¢!æ;1•4EÒÛÅÜŸ[ò_«Ṫ%ßo䲩8OÍôº5çì©•ð-#áÀÍ­2É+˜²?Ô>ÆÔ¢ç‹­ßiâÍUãÃ5];}6UÕÝ%\?æ(|÷ѱw¾Ô´ðÏÏ!Ÿ§,gц"”„ Ö‹ oa"òáw„šÆ8¬Õ0‰ŸFªŠïù]¥©î½mêh‘qXzW_&²¢/6EE¥Í e¥CrŽmø€Ä‡"m…»³‰£ëÓ¡ Šž½üaÓ&¹ÆÚÕ„õ®<u”ƒm´ÐV‘`sÈ+TNÙ.ÙÝP"©ôVÚfâÐqŠ>J¹áȼ”©e@ñåÚP˜%›A­¥3ÊÄŠw­ÓñË£¸€ØäÖMÞ¼p׬Ïq󯓆çÕ+´ö^Ò›¼Ó{·YØœÉ#¥G†â¿ß2¶±Y:û²xsôÂêj¢•öqÓ ¶ u]Ïö&Íóq9:ùëZä-TÄðŽ3³}¶¸Þ=ŸO]ÐÓ0våÛQ7¤íû_¯Ó^D}¼ºsË#)@–:ÛÙ]ëÖ”DíçŠÉç_a¡Êà “ÝD(hYY$7Öcð»Sæ¿[%‹Ÿ¶„~Ó>¾M»òP#ƒìq9)¿ðž]‘HÐÆ­y×™Àõ ¯!_ ïíæøi‰TLÄ¢•ÅGØ0Ð4(Ôxˆ]îyGͼ¶µQËÁaÐF3â8Àåœ8hQ6Œ%‰Ò#¬ûGî¹ul¤Ô*P¥ à”qw:Ÿz¦/¶hœŒexÈR‹’»=˜IÈÞ\~#Ï•Ùþ M:Éž,ÿŒ°÷ÃØG»^° ÝMä{ÝÄÀ²ðÚ¶}UÁ’ÎP•ÀÄ¡oo§’ó¨šÄ¡aåÓ`;IiŒþ{FûÜQ™rÎmnr5ᑃ3mËMgÕOû• N¾Ì»w;ŽG>L{?Ge³Ç’ÕݸöšÎyøÊ×ç`Eªu›uè ˆvƒ_i%ýþ ¹‘×ùBóêÍÙçaš"DÔÓïý˜Nž­'çq¥i>Ÿä’ÌsdScxœë^,jŒ6!»Uê>%v[lŠ¡Ä]ðçœÞÎzÉ›l(y£OĪêHYq;ìº-VÊè¦ÏǼSHq£ƒÂdÒ§&È#óÖ‡¶äyù÷LÝ ŒGø¬Å4 I¨rKÞ+®tÀÃÖj£±¼¬µ£ñZwH"+Ìk:ÍÇÅt¢E¹”Õ¹#¨­ûq…rK†Ùehˆ0©»y¢’?øèâ4,FŸËZR±ªq:ê”9ÀrÉiOhÛ¡îûg™K¾;tÑ2.B~ªß ‘©©váè[2Ø»¼úv@ÃÚÉn»y+ò¢¦Høé‹·ó÷]'ÍL5nøŒíz„<ãsPª—bÖt‡çLmݯÁËæ{˜x\Çó)ùSáºÚ Òs2#›å¥Löy÷Óæ¤‘OAz “$‡ŠµõI. †ö%†Ò7—;Ìê `™7Ôr ”¯"xÄKƒZû­l/÷¢ïkÑ®’ð°h–—€ÅRºÞ—û"&«Ùõ™£”c = ³šEÒŽ†²­Þ\Áë ±šÄâÆÃºff‰I1‘?$H,N=LϘ —xÊ">èOy |t¥0ÄwCc ×%Ë.7 .N7º*æ—”)7ãKâpÃäÕH÷ô[œÃÙ­²î(òßT}õ{µŽNá|¤°-Èö™;F•lņz1J€æšTæ-ó½@ þË—ËC‘—³¦†2ó–ž…[eÞ“Ûƒ>YZ@LA2ƒ=XܯÒÒN‘Þ¼b° k} ­ÐoŒiÔºøîLJzd¥Ä¢Ù¬°¢ï-©÷m%±[ò³Ó¶‰¯¬äèm‚} zlˆh?Ý+¼¾Ó“ÙæÓ=ج<$q·êøx¾\¤ÏmI+3J“Í\\R'Û4æÈG&Ø·ù\Š*b¦Ö-Á|‚L0÷H%²$›bÚD#«GdÁ¥Ÿ·ãâÇ‘xÕ»ï‡ 6ÇY™ÕWÅËgÓ¬îˆãiŠg¡lO®xT9ÝñPÖEÆÏ“H²FTèÛjØV˜¢›W_僸ž³…äY[tì6„Ö¨óEÜžÒŸÞŸ2ŒÉëèô1X"j}–Ó縩ßnúÍÁ&€&(SU«µô¤Ë™bœáMíVo¿øC:²+D(ƒ]x+ç[³¥"ÀÉט*ROF?&Ø K×U²%*µ§sÔèD¡¥Üþؘ8/,;óö\Ç_ÐÚÅn‰¼ëÔÂÍSκD®}Zîø"¾(ob©TuõEØ÷YÉxÑÙÖ©|óê{s©¦yû£#Á&ðë×¼mÌT)£î$ϼ2&‡Ç§¢»q qYè™'hŠ‹ð§a,g–™”Cl4XO¢ŽX¹gRnLW– —)»"ãÃTkwè]N³‡ÅeØ­pk…1£•£Ë·,/ØÓÄÞH €Û=ÇNRØ õ/;t'VÔªe’ÕÔÔ&‚0Ö‘YkªÐ Š«ÇÁLéšBÛq‡””:2ÑPv^îÎn«fã,/šÑø&£ ¾!/JÈ`/ø#KŠ¡ö}=³œ—úr"©Cغw›{\½ß/}¾•XyÄ7-ƒÓrÕ!sÏ·n-½ò†’Õº­w²Ž#Enlø®?m¬¶×°Ê¤‘¸ñhú£ºÏ=b‹‚JðÓØƒ€;žŸÉÆf$Jirøýsw-øÆÃäÔ~ ̆ÆhsòÙÙÔHvjãEÊó佤QÐõèaÅ-ÜEe¥7¾È‘ie+6'£êßç9K»KäVEH´½¾EŸÌÔàœ2äÖ¬­à(PÞ&~U÷ü¡v¯RÑH΄]’Ð0qªÌ.Ä Ô€l§"(gd¢%½RDÜ~±ºQaG ­ëêe-u¼ƒ‡u¨¡ Ö[jTQï)4xCªÅØÛµAùrOÙÖT´ç&,RvìŠã V“ÎækOÃ>žɽt ‹[,Ú^µ©}^=0'ûáòy¡á(ÉâÛû>¹^ƒÌU­8=÷÷ITwn¸¶àgAí§ÞV¾u”icS?Mû¬öEàUNöò—'ê'¼AjUvúÃD“¾ÝßB¦{<Ên˜ÆG®âáÓñ–}3G+wyŽ Í(qsÀß“Ñn‰Íc‰x¢¨>Ï»^ŠuývÏò^Ð{¬eaÁ<ÜÒ8ô›îðãt.Å×'ÔØl„º¢oÝû]ãSµÅ£šN•Ö¹œ õéâÞ´0‹Âµ´Kß¼‹úÚM œ ØŽGëö;C)ƒ²êH2í“õXÑ™¤˜°Þ¾"ïx-,Â}ðíC•½½"^…2Ÿödœ8*&ýzŽg³–ý3dÛ©è6 [\¶ëú]©ÓŽ6LôÎS'dÜç…á tRmôiàÂ5›A—ækékÜ×IK¨KÌ„qºpÖÃë;õ âb¶Œv Ùbb¤8ŽeŸF20ޝ‘láÓAÖj——dÁ _žªÓ¾XWÐîWö‡'b)FI'‰a#ÀÞ³Pª^Rªöî®7*|¾þ¥kòOGºfú/åNâW,Ôè~Á W[*ÐL¿|åUЩPŸi#QÉ"º—èr\gQ-#xÞ¨Y<øø<¨úTá’£~L¿dÐðÊ>ÃçåÖ®±%ˆFŽ $îg&¹SØPã©ö„¹˜ª T›0îêÔ¤p¿‘šÈ7»éˆyp‡ —ÛŒ;4‹:>¬ø‹dj‹ÿùaÙý ¦—õ·Ñ¾4éçÜ‘‚GÎÍÃŽ4£y.å?ÂßSIG¾î èYgsÔ,ítX1? cšdVÏ¥ ­ÿ,Zá ý~Q›'÷®¬˜EZ'@×O= ¨†êÅmÝW»(šÙI©~ã?PaãjÍRY@³¸´“CR²  ˜½Xø²û°ê¡ÿ¸Ó“ Þ.—Ko7‚|N 󩃢Ö~iÒƒ@1ó™Iñ€ÒH- ü„#á‡{+%ƒt¶Aóþ,¾-oúnW|snLv×ïÞCÉëY‘çí “˜ê> <+¬Ñ(¯›.–«ÇV`O ±®’÷é‘Ö³LâĽÿ¦uzoŒ­qEå¹9”¢ùmíTC±ù•Á\´¾I?1·ç-ÛÈÒµ)‹äû‰ Çc:þ¡ bb÷ÜäÀ “ÊoÞv;è줂Ëh…®Ý’\V«™—(‚¶Òdl{'}tɻʼnÌ~”ÇØ)Р½uôa¬¯U2×CتL$w6q,ÙGUIƒ~K}ï•“*’OUÌ_Åä C=¿â~Ⱦ ñ®+ /gûÖPÊsAaÔÊÙñn?n.I5èâd6Ýlê2”çÓË =½¤ÿzÏÀ`F‹N'ÞÌIwâv_×€hÂë¾o-óyuQ‰ß¥ÖãkêŒêË­Ñþ¬±±ënž¶ëŒoÝ켑MèÃÖ}YA"”p¯à .gF‰ž!/Ocܱشܦ÷¶™îPÖð¼é‹ïÎ_Ýì+ ÑV9Ï.iMMzÜóÍÛ-¬%¤ÉÛ.–Â,C —ij{æœæ¿&ƒã?“A“Èîp4nÄœüNÀAPβ=Ôr‹Ïzáaíç§£¹—·z>J·rQž~b’9f„/¾Î´ˆŽh]q±ÕZ‹˜Ø“ãnœ ÁѾŠËµýÞ¥±Í'äÍC™Açf›ÅÜ>ÒQÃIí‚êW•Þb#·wä“'¿99Œ O)êêI²šþ ÎÉÜ/÷¹aª3m[Z/:¶nŸ _;Ÿ$Ý÷°>gÃï7ÀOOá|ħ©K:J|¬Ìê6@åšCMÀ |`ú:sƒ¾û‘^ÑQ]Ãk'¯»†.““µ ù]ÿØm>35{³Ä‘L­æ:¦/¼lO¶n¦Ç+¢éæj ¦ðâÜÉαû‘÷>æñîÚÙ)ÒÀÍáèOEW RRg?…àÅ^®ÒǦüE¶_/_+ÇNE÷äÖᘤ!c®öN±LdÛme¡Íªx=‡û29?Eqü‚DËØ¼âO¹'ž¾‰z\BÞ®Ó`¢¹ —"~ˆ‚HqWƒ$¦Ÿ¿Y) Ë'’ëLèx27ª{Tã §úº×"ÁÇŽÞ¢ÐòîÏÝvŒñ–õø–Û7ÇŽT3öÄ êtVÏfnÄ®FrŒ–ï.޽ÆJWwþظ¸Ç.Iµ@CdãÄò¦½… ãýxøö×°"wŠ?RI¦‚¤õSñ»û~pÜg*¨pé¦îú¥ãcßîQw÷wVe°Dûà“9 `î½" ží¯T_]]÷ä¬pXbFý,^Öt K9?IÙrAx^'§¹d”¢ç)òÁà¤Î¨}¹¾pAm>¢5¡å-ê› ¡»‚&ŒŸø‡qÿ«¬ÂÛsIŸª óÀÙTíBV´„3õNø¥oc¸*s#8c']¾ªù;ó³ÕŽ m¿…c#ì4}[%%~ å'â|ß( œqÑÙ[°Krú|4%:'ðB¶1Ѧò/~ ô©bÉKT:òN˜Ò櫤!eW׈,óàüéw rüHó&­Vęדj.°ŽiƒˆÞŒ ‰}d{´f¨4×Sx¸=‘›­„.Ã76"i(îH&®ë@g6ÒxŽŸ†HœQÝñ‹:œ~§‡•“¹öèû¡I2ŒÜÉX.í˜m$‡ëåä.úÝt¯P%·_ÃÝGÄíÏ8Üß;H¶¹(n¯¥ßÊ|êTº7­¸±·XúqHÆu½/¹oܨ4»³©ç’ÅJŸ¤?lcŒÑÍ61áqÒíI2.©Ê*RSâ}|ÒÀö¨÷CkFº²ØÓ—`¿›i©j,‡J7 (gFŸæYïšVîm}&ö0\hnÄ›îïóRªj”V8²òö;…÷†É/$[\¬(–˜¦L–«è¾´VÓˆ ÌÔ>yŸkOЕN/Vè p“Ü*6n( E"ü]ˆuz£·®bðfÇúÎó…÷ºÙ•ý•Æ{ÈjÉ¡­±iÏJÜ]w!Æ×ý_î”csoí÷g0 ïZ¹RHä•_|6«]¥IYׄSƒ‘uÕ«¯_é¿3±çXâï ($±–ÜT ¶#/Á›\nJR ž&cÏ5v?…Û[)3àJë@3dœØ7äNV~ŒsÌ¾ß ®Ðeî¾’^ ¾oÃÖTNUž“ºT„²“æ…•X He¡ ª™ðÆËdÞÝZWµ'dÎ3UKB r+t$®Î1Ò†þˆŠÔw'1óó J\ÖÅòÞd{ž°Î$l®‹kS0@Û¡ò;Ê?¦(J'á’P ™¨~`àªnìÜÇN…Oþ®m¶¹"7¾sÌÞW%o”)ÄsûSó1G¿ñåWÏ5¤ôƒ3ŽW=ÝÕ›‘åºA”ùùp c¾ sçÍð[iÜÝ5ϧTsffÑ¥ÏÐËU #öHð žÓ„Ï€Ã3ƺlbQÖ¼%ê 7ÏW-òIù´¡ñå{‰%wãnUº$kL{ Í0ÎqßìuG™Š·ëÄD UUwNÍèÛºPFb-÷*™&'›1=õ,7 ÎUÈÅ)\rtÜÒp¡Ì*|_á߯æ¸.)§1 õ’MÚHVÛ_2f¾V¥oª+'E5W]„扉ïù…?¼´Ù˜&°àF(*>¼¾™øÙœP¤MqF븒ûÝHjtHtþÍéú‹ÕÚÑbŸ ;½­u²ý\q‹)7ùFŽW‡¦mjåÌ´áw„3?ytpÙ¤*·‡1E®b±uŒxºÜð-VÖ?ËY~v¾ó=ÿ$÷"tËi“ß}… n³eUù•ç)·u…:hÔ K+%(µæ,Î*Ì H°W™Ñ ±1!”x{<Äxr«™ †aÃåU/5…8r>¯ùrRY0³ÛEv—°ZÙ¤±‹&}eÓµÙ•Í4ËÏáI ,ì×sª¯Âº"?> stream xÚwXÓí÷7¢€ˆ4#¥7Rº;¥ArÀ€ÛØ&1BºA:$%•FR¤ Ai$$”ÿôñy~ÿç÷¾×õ¾×®k»Ï9ŸS÷ùœï6.¶{Æ‚JNpˆ:†ITôô´„AHT!ãâ2¢= ëÉ¸Ì H“þ_$ŒÆêTÁh,Ph?ð‹„%¤…ïJƒ@Hêo ) P{CzBm8 ‚"ãR#üPW46ÏßG#/@XJê®Àow€’' uÃz`´+Ä›Ñì0†;B!h¿…à‘uE£Ò@ Ø%GºÈó | hW€AzCœ¿Zèƒ=!Z"㘸BQŒáÎh0À*< Ž ëòæA°ÙÆZºöX÷/€àÏå„…„ÿ ÷ÇûW (ì·3ØÑî‰Ãü 0€3Ô0P×Bû¢`˜Ó/ ØÇúƒ½ÁP°ð»t0@]ÉÆvø§?”#Š@£„PP_=…Á^³ÌIîé ¡Qd¿êS…"!ŽØ{÷þ®; îóÿ[r†Âœœµáô4…A½@´Tÿ`°*²ÿè\ h€8Hò®¨¤8â€ø:º%0ñC@~…©±=ú#à€3¶ H Ô‚ý óG½!4ò$Ðÿþ-‘ œ Žh€Ä #ûOt¬âü—Œ?ê °aé' ýzýs²Á2Ì óðûü÷ˆæjf÷,´øÿ´üQYî ðŠˆƒÂ 1IÀ]ì!ðßqþ¹¿»ÿ­½†þ©îEÔ‚9ÿRüê{}wâý‡<ö†ðïúp,¡!žÿðß$rľ ÿoÁo—ÿùEùòÿ¿+RàáñÛÎóàÿ°ƒ=¡~XB?@c—CŽ]ØCÍ!m´Ä úÀó¿­Zh0vI”`.X¢ ‹ ÄþÒCQêP_ˆÓ=(ÚÑõ/2ý= l( rŽ‚þzð`½@ ÿ²awÏÑûpAagö— ŒÂ."ú÷xÉìªý»5˜#Üé×NŠˆKÀH$Ø K ¬$ðÆ.¯Ä÷7ç@!u`{8Ñd¿-uÿRý%I€ÿH qúK ìQ‹E`ç wú­úWUŽHlÙ¿é„-ùoù÷cñ…8’}š‚;Ê„»Õ…·Ô(1ú®ÈîfXˆŽ”Ø’ {ÕÆí–SŒórgtž«êV·uëÐWö:É_˜Þ÷_­g}é'v$Ȫ¾áÂê4uu„;™êÌÄ>u£ç‰y†2‹t²çse'©‚“K¯1×€;uÝS}¸iÊÕïjG´é·wÖ”çêÒ2I™}ýl„nq0Y? »SðÙóQØJ¼uL¦þcvÙöS²ŸjÊ¥þÁ9ªæ7q!ÚÞ¡kß9#ÑTj2LªbÄÕfsE×”yo?¦öwи©¸íÔûb‘7ã¤NÏuuoÛ†'­ó®«}šs¼ðWÌ)3bŽF9 YX¼ë4›ÅŠßÔ/ŸzŒ2ëΆjv-T~fv׎ŠÐñ›™ì[úù@'SËj´/œG@/Eî²bõk`×ëoçH¼Ö;5T«jü´¹¼[ÎaE}œysG<“æ"V’Y®m&òOç¤Â[ƒ-¨DE)¼¡YU¦× _ú‰K-ü1b—EûííÊÜ3^Õq°êxÌRý\Àã’'g»ÂÀ·/³kãU0>žËGÕ¾Ë6ºýžðÒÀJL›§ø·¥iªÄx¸4€5ÿÙVGlxPk {åìJOô!K^’N¹~ዳƒÚw}ð6Q2ïòø³mÌÅ6Þc€>â%†ðù½[2fã.ýE½äxòŸ®~È·fk‹y*†/ŒD§ZøhüÛù‹h[W©¥¨–# ÖFõÒV o¸ ÞœåI¤¥1ÛLyߦ´tÐRÇ;QË8ùíZ[¹\‰Ô³/¹Û¢.Œ û¹r×Y­ÚíX¯®àv·¾+3™•,žõ…7³~£Ç[mÌËéZïmÂï«£ ’yÃÓJ¸vDöZ|âõ_UNhʪ~'™ÍKîµL¿Þöíe­°Ûýª0—òëDÂí-¹ÚÏÁöí® eyßøX†í:ZqƒÜÒ¾×YàÜõ;q!»™åJoÜQÄMø0q)8¾å]:;ÞiX”W¹9³úÒ¤ðã|ÇÈçñIJ4YK¤e— ¸GÓºÁÌô†ŽÖïü[óõÀðÂ(ôúŒEQX+ûÝà=/tø’óY`'õúXoM¤$±Ñ„EºßmjÙ\ÔK·tÛ¶å°VJ®ÎkLóZ#–üå'€…ÕÏT<á‹k ®ŠÀ'ˆÙÛN_ü]iÅäc©c‰m}TŸ~W„8]ïÁßC,Çl—;H× ¢2Lu!ʽ-JÌós–þƒÃkøcì•:Ž›ëvddò?ßþ4É•ð1Ýl~;tæWü‰q“ˆ3Ût„ ü4¸.8OÜP侨4]^〬¥Æ˜¿ðÉ•£™} ¾Rý$á6ÿ\;RÄÆ ^>Û¿’Ûe~‡Ì~åí7[íjË÷FSçSm€õÁGËŸ› zÛÅ¢| =±ÞâBÏK¥žÞ®)`—·½¤º±Ü|˜„/ñL$P' ´cgVC;ò*žxvX&Ñ4ÚsWN‰î»ôØ‘÷IY°Ø’ý¬i™PÓGàëMýúf`𪺠g{Ž OÆ]ÕÐÈ-Sß}Ó­¤¹'Ï|UŸþH¬r‚Hì4û`±~îÊM‰/ÇÞe<Êðym)ÏÓ/2C!5†¦¬á*‡wŠ2'Ý*8RMnu+ž8²¢Ÿ§I§OFè8±ß²ÚZíª"ˆ©Æ HÌÞã­””?8Í''¸Sª¸«Å¯½/?møð‘4¤VpQ×Òìþs‡¯bùVàÃn´òj“îuÁul½ºIí'Oú“M3kŽrVzQg&šL°ñK¿œˆi_ßÕOT„Á\n,m6ýÔÁÃ÷˜v–ðõZ*d&õ#«ó ¬ ÕÔÖóqÍ:¤»§Vÿ´¬õƒû¾ot«ÚÉô-®3~…oí×À »­Ðšo¶ªÝHÏrJÄÏ:ÀèŽ(´¢ÅÌ ;gÕSgN;kñÍ[9ÓËáéQÓŠNðrµýxVE™êõ¼ªÑ€‡°ÃZð>[<=Kþ¶v7™&/Òð(©ÙPü¨ø¡ ƒn P~DÜú+ݱœ¡O‘Áå]ZñŸÑŒÒéÓE¦v´º÷’úoë«T­ë}€î~ ˜‘O¿NÕ7z½vmí‡(ß´‡ywžê–äFçÞDÀ^>[“zìâàpló%ÃæŒnªŒÝC2'à m-ÎÆÖŒnËžt´žF^7‹µ­èR‚œ§(ñ¥2^HÔ¾m'|V<ä µýŒÉX€PAø‘B ùþ”ÒdOèŠ.nË(úU!+þ®iõÎ× ÒNúžŠã|´çI&4RI³j-x¥æ.‚3SoâoÔhn"Ö鮃5‰XØI¬1%]”Àñ –p573Bÿ<á˜}áá0“Út3Ý‹qq?sLðøþJæ÷€™F4q‰›²Óf„™\æ“èL§É”vPÛºU]{ÃåQû ïÂK fzMÏÌüyΑЗ›–‚èì¬ÍšÊ:LÞ‡Éá¥8Qd²ÆhážyûW×cq Zq´¶iǘíxóîgïOÚA(Õ®£)JMÅ¿¾SYVŒ …÷ŠSöûꪾëPÊŠm|xÑ«ÿ”ù½ @7î[®sŸïºˆ*OFè0¬°nf*w:—ð|tìY<Š¢ûS[BØç3!äI >˾šÕ3AüŠ‹¦¯‡×7ÂÊC0¯3Ö!«ol-s–*?'×ÅÆ&}‘nV¦=L-Lsk0æ?Ù ìCÈRÒ·¦òÔÒŠ,–ñl~W®»¤ro{Õ’ß—á^º|pþJ‡¥Ê3n^qÁ®DéÎútçýÖ‰NjN#©ç¤ª~eBg"hè{Õ÷r"‹¹T¥ IO%̧Ã/¹Níú2ì«ÙAtDc)åíˆÅ¶£Ì[Íô*O¯§ê¿/¨IìY èïHPv*-OöÛÛ¯¶»IÉñnãܯ|uiú”‹ïL‚Ñúã~£òúrêL²ìàÖÚ½xN¾[epgߦO7:‚Z¾­*Ñ~>™ßôsðÚ´´wè;jò5Ï-"°ˆÌº ­©²E¼;xÊ’ $S]^¼$õ‡BzV®eãWÈ>©flß½èòÏt¬‰ò8%Gó”ÑΟAàöÞ)Ë­H§Û…¯£“UÕ¹ÎTFnÕ>›j1'„Ãy:äøm4än‹xôZé;žkEñ:ÚžPû]ê¥{\[˰†šë$÷†Â­°@ñÍ¥*Fûô¼E©8¶,¸µ¢n*Ø$ÓÆMþõ¦£úß›cS™HAµ1†µˆTø+‡Ïóâ«ÕM?_‹¤µË¿øªãë%Ú]ºôÖ]Æ\™³™ô>`Ì|š+T<,·®–¬XÝš&´+b»„¬/•.àaÖ”¯€lÌÜž¯Ÿ”©>þØ?ý$<ÐÓü•¯¥’\T1ˆ‘¶·Û}Mz?¤'ÒÏ`]œŽÆÁÛŒâlÏSò[A鱟g#Ø2ƒVUI'8$e®=|²÷òjEÀ\`»U#ç¢ò½(ùeȼÂéÆö4†X&ÁÎ&µ „ý§¨™ZDÿ$ïÞßPyvWÃ%±%ëô-£ôSe9)ÎCâýÛtœ9|Mɇg®È‡la¤¬ ™¡ëÁãæ½BåNAÇ— µ¬åRœ’EáÕÆÒ_hM¬Ùs¯kÉÃÍÕ/Ò*)§_\Jôq}ül§¬sçP"^ž;— ùBKuÏŽdüMZÄB)#; º•éíNR.µ»o/õ8-ù¾ÑrU“ë+‹.µI±ALR:)Zw´BÏ¿åˆÌÓWqP”Fd_nõZ‘Öd’}Hq|pá×bj⾄Ÿ„ýEÒ0Ãøâ]HGdx@›Å½ÉB³×½<›˜…±-Oï׉Ýúh¾‚á)qT³k‡RÈídÐî“ ‚9y[bÌ\ee„êå§»Ùô×Næ¿Õ1àâ+ðTE¢Þ:×rñÌ#FTg5ÙE¸ ³±ä:»A51+¢lrÔö 7Ó2Ix¶UeeêÝjz›Î?i­Š h˜‹Ï•^ºDj¤¾Ó7îuì™üÙ:¤Šœ_¹ûA%ÑVE¹p9n£†Fn™4fŸ±G“ëáUÉ#b3ß‘­aÌÓÙHÕ3U(Ggÿ ·MÈÚ»Ns‹Êþ^ñ«œÎü•‚ÚéºcNw=ÿ~L1ÒšS„”Ój:è;…mÇÙþliú¤Â+Œ°Ͼ xv¬D^™j*Ù×ß OâC ®1R¨•y¸—9( ù÷‡eŒ’ãaù)1"~£‘Õ´áŸY^mèl~Ô13 ãx!ɰŸŸŽP“n÷ÌË£Us¤&O-è®è–Ó:ÜŒ)Óî·ÿþ6Í‚×Èww!e3 ¿Ç—T|LhƵœƒ¤UU“~«àhϱ!èM ­véµ•ÈæÝRi/Ú¾W?ù——ê2²–Wï#~uì½hZ$¤ºy`Dv\>µ[ï•»J¥¼àϬ7Z‹T ¦{bM¾ìg{C@Î×.þÍ SÂW:ŸHD¹)ϬH*D(„YS%|•€“Ìd•xà§šö©ƒØÓü©GŠCø*#À‡—JË~éFe7 ÷¡^ iç™ ØE”¹×ý_£ý< $"ŠÀëÌ€¡ÇÈ}ÉÓ÷ù‡iùî6îjŽÚÊÐ {£ ‚[ÂLpëgÝ?ˆg:Y Î24kÜÜÍw×¼üŒÆeûY–}Éås½£ ~jŒÒÖX¶ì`³'ªGy¡x?<ͦy*tg¬˜»Ä=ýDŽÈkotp «›ªÙüh}²XfÌÅÄ­×ì—Pl©R’FêpºÒü4ŸTÉç–N1ÙñkSer.i±šÄ*³‡92J–HìòDoÐŽÁÆ$:;èN–w5󹂡™ÛRÄûü’å´‡oȳku) Â^šPì`‚¨¨ðr¯uÏ"ïN–Vjðßï*Pޝ]ŒíØ’k&áã1¹ûB2èaTGÖøR_‡Gz—$ë­FÖºÞ×Í®ÚçMOß2ñ¸%\9¬ñÑÊ ãÇSAÔ½ ¦Ýš—ïP²f­>8ýÂãiÇOXùX©Ó‡íe –wÏÖŸR=ÄÀÅÃJç^Ô;UàSª=L=äî¦ ýHÔWVròP·EHôr^ðÃÊŒ±½Ê5œÐ»^“Ç%´e²¥äº®ia¼mbn`É4þ]LÈÀ—Ó7Å÷ ÕÄ‹fúŠ!I »P=[ÈüóÔ<ìûðTºŸÈ¼ S§¾­ãç” Ï—g(¯(“Šv×P äÌÖžn*·´¹elO[v2`ÅåyIƒ®“||Lžq…â¹èëc}iÉ'Å´w\6Ÿ.’˜*,ð®N9pÏÀ㛂³6äc%(Vzúƒx³H RÈ^<ë·ðdZpÏ.çÐsé´_´k7/¥²ô¾ÉgéÂ9\c&›\={k¸‚F…<ò¥|#g¤ãå_DÄ£]Û6v[´„ļ±7¼W|<ÊkÿãY¦¡aã&ÏOâc±TqºôzÛ²°…ðP½Åjx43‰¸Ÿ½Â;#u½rŠ¥îàËÃ.+‰[ˆNç™E<þ%N»xŸð §Š’–äo:=ÛÔVºd~Í^¤/•;9»ïÐGJl²™o/‘$©ÝjìÓjÙ•88×2yÕp9â—ó)j'W3mY¿2stÍ·¡óàž]|¢Þ=/ÝÒEiP²ÉÉ1K¦*]ŽG…ÁÅ‹GL¦[ÉÑóM½èg·ÓÍ‚ï£y ê£Í¦}0ÝW¥*ÃDy2r÷Øé«þ¬bÎ\{ORïÉ«ŠEôC_È¢ùbÆe1×íŽúâ§H|¾‘låU¼Ní÷ê¿«+¹+²sªd ÅʨHôŠÓã1últ™éYpbìžg£µ6¡RnBmù>&l8ˆÛn°Òƒi2ÊÅÏ^ªƒNò_ÐGø˜âºVÜÇËêö¹:üº¡Ú•ÐØ•nH[©bfç®»^æÍz‰šXhÛL±Óè7ãÿ`në vqI¸¯öÍtÀ]-/“Æ´¹lœ± ë‚”bS­?rÍ×f”$¯Q™GU(²Èôs;¥{ûÓQÃ{)ùôïìšÀ=Ë0¤íÆÔ`8Y#Üêܳ·Ai4zä·¸¸ÿ6xw5¶ÝŒ%`摳whY‰ö¢ú-¹4W>bÓ„5`³ÔUݹÓ}»Œº•¾ö¡Ë±Þù„‹léÕ5$ëQ •Ä^ørM)Ë÷Ð1T¨}NêÆ¶hŠI"£ðÊ0J5}éűWäi¤«–k¼w¯ú¦é×Dt®÷a@ý*¢Jû¡ÒÆΛw¸¦qþøÊÄ^ÝšeÛ¾¹ù?áHIJ,W<÷¶H»¿ç+ªy€9çœòñâ¹*±Jñ³MMÑ3äÛ½¶->­6ÿÃN¾Ž©ròÀÆôÑäHÐ\Ul9ÿéÔ Þ¨úÏŠì¨$‹Y<ýޏ S¤‰°câù\™:Ç-\á“wÕ´Q4/ðN0|ÿ?ŠEÿÇ endstream endobj 507 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6852 /Filter /FlateDecode >> stream xÚuT“kÓ-("DAŠJ‡Ð”¡7iR¤wAš„$$AH ¤7Þ{•"M8€4AŠ(H‘^Dzïˆáå|ç?ß½kÝ»²VòÎÌž™g?³ç '«ž!¿"mSE£pü !ià}mmu0PHHD@HHÀÉi„ÄÙÃþö8Â0X$%ý¿÷100ïSãð@m4 ¨ál‰AâÒ i!! °Ôß@4F¨ vABÚ@ 4 †pÞG;ºcpßçïG „’’’àû•Tt€a0 ¨ Æ!`øŽ°=Ð AÂpîÿ*Á%‹Àá¥]]]ÀX4.ÇÍtEâ@†qA?)uÀ°?Ôœ@#û;`ˆ¶Å¹‚10 Þa„ÀPX|Š3 Ãñ݆êZ@]Gê7Xë7€øçr€ ÐÊýÉþY‰ú• †@ÐŽ`”;Ú"ía@]U-œŽFAÁöX4>ìFÚƒmð€_GUõ`<Ã?ü° Ò‡À"írüYÍ*(è}´ƒ …Ã~žO‰Að÷î.øg¸OPhW”çß–-µýIêì(hŒB:9ÃÔ•ÿ`ð.À?>8 ’”‘œ€07Bðg#wGد è§ÏÁÛÓí´ÅÓ€y#maø€'ìâ0Î0oÏÿø·€P$´Á‘(À?Õñn˜ío? Ò h.„—(ôóóŸ'K¼Â h”½û?ð_#TÓSÔ12åýCù?A%%´Г_ä‚„„Åøï×ùÏ üÍþ—WŒüs:¡*ª£lÑø:¿Yà¯ïo&.¤Áõgo¸ÿn¡ƒÆ äúGÿBbBüèÿ{ ~¥üßÄÿ³ÊÿSÿÿ}"Ug{û_q®ß€ÿ#v@Ú»ÿAàíŒÃ/‡6¿"¨ÿ†šÀ~o´6 Štvøï¨:Œ_E/t~¨€èo?«ŠtƒAõ8â·˜þž¾‡=ÓCc‘?_<ø,!¡ÿŠáwòÿrÁâgö;Æâ÷k¼?m~Õþ} ý¹“Âbâ@0và%·Ä€ž üòBan¿4@¡qø ž³7Ðü´˜$PÐ?4ô§ð¯Úg ßü—(ðÿ¶-? æƒÆGЙ@»ªÀÆïŠ ®ü‹}²W¶“¾› ó÷åY‘à:T1LO›Ð,VRµ²kÑQrúž13ºï¹PÍòÚ]ô?‹ê œÅæÅÈÅ7ÂϱžGŒl#7ê²M”˜¥ 1zLá­¤òPx‡!ç ¯»Uíc±®wn©Jh5ê4·V¥iÝf”z¸1g€«·é6Z; ½›9ç0ÿÜ",Q'…MS¶ùãZN1ÛÕÓ=EùŽém¸Ÿ†‹ÿâG0ŽRE¦›QYôjùéò³ÌB—õ*O5êû· µ³Y hÝ÷sâê·i-ÎØ¯šÚ¥…!bë´7šrR–óhßÄc±¶ÉÄÌÏl!ðgžPÙiUßæúÑžAš£ñ+³= ö×Zûßp¥±{!J‹ö|ž~P4 ·Kz1ã0É‚Pg¿£âq…];ªW%ʺetäí%5I#Çce8ZÿªhgXY46Uoë·<>[TW_€©ìŸt%àÆ‹ NϤûJ$Þ`¥â®ÆÅÇÑÌmEy ZÕÊÇF!H3Ò®‘ `éB¿/­íI8¹à(®+¹/YX6©Yì'³]¸u-¨Ê£—ø´¹¿½7Ò|ý{²d•Ñ¡b¨¨mù’u}F^ï ]mæÞ¤f¸ù=ŽQR­†‚;k§ÃðäáÅÀÀ;â·îÈíל(s¥zÇH2=‚®tóe›œÅ+asþb›hGKU¨>üXÏz|«ß´Ös‰Õ îUær0òôot‰¡,ûXÙ‘¥HºT3™îJp)¥+3YÐæu„-Ì–Ñü!^båJO"¥Rƒ©Ü0^ï'÷‰(¿Ôd¸‘X ©"Øúåæê6•z¢LÔhf,A6×òüÐKüÕ¢Ê1¨s¾Ë’iœåîÉ7}gä+<†™ 8(ÛdMïǬMìõò0:&Íjà„92º%õbŽþ<®ð¶.¶ô`ª¢ îsúó¢‰Ðä ¢â«Ff/÷cæWæ2O›ÏâïL ¡µr.Ã% %÷èÆt¤Û7Ùwd¾œÝ ½:6JÖú>×–I.E¬éà×Kêª6O·aô™¤¡(…iGeK˜¡‡¾ŒwJ-cThvk0íz 3a‘(.÷zY™ÔÛbyßIuE´ôþ#ÊK—-ìšÃ§‡+=©UÊ×'Øeœô¬’0“íæ¦LI5޵øMä?Ù}óh‡ªŒ÷2 qµñŽËvzjªÊKŠ X‰€òpŠ+NÖ?kEsr—™© Ò¤Î>«¸ûnÝîZ=©÷I –>ÕamÒ÷t˜kÃ&*™ `ªcDü+Yâ׆ÐÔr$qãðO´ð'‚OHtšÅè™/õš8&áK¯ú. ¸^ðŠÛÔm·1vTìúô¾Ïè5/åÏYkyÑ_ØôI“µ¢ ZÞ–døÅ¤¯úÌéB1¸ªO$$–šFy“ä²pq¦ü|GÏoWÌ‘ XZfæ}Xs¿¹öÝ`g\Æ©ö¹~„㙄ËÉðÚ󦦚s=O÷*µºšÛjin½øXl²ïæÆîå;DÕa×<&srëR×£D!uÆy©ûíNt×ÁdºAZÛ†Ž¹‚t¶ð² -½Ï ›—ÄJà²æ-ËÄž)FDÿ…–œÒE§Ò©²8<}ÊôÉ›”UD>OƒR7Ônlx*:ë]ºL¦j®˜Š&ɇàq_Upqì ÷‹Ô­›KGO-©kä®èî,Œ©Š®•pÖïÿBt¥ _PrdQ[dØŽèj†€'”¬½—€ûÿØí|¼±TëBz°Pm´‹H…£².j6rú˜8§Ÿè ùƒžP€Ä÷>[«¬ìOÊ¥•·N¸¿‘¸n„¹|CäÆ-ë ‹Úü¨‘žÎʃ ò ïK=ðNsW¾³IŸ{¦ŽææûZ¡>ŸáyBúHAXŽ¥ÔOÙ5$õšåCåiô!ä‘äã{Ñêwy¦gà1ߦÍê-ê?âVß3ªv²vôÌ'ÑÐMŽ‹kHù TйÇ;бûMjàä=†Ý{'ås`™{kç#µRls߯‡°W™s7ð`1m“øBËpXäÁ'z{±4 ÓDt»BÚî¥^Œ›Yz”㧘c¥¹¿*ZZHïc :½¿˜­†Ah ³Ã(fŒ“vOGnP%¿$Vµÿ*xàpý¦™Ø$IM g{_Aì-ÙƒÙu;µ„ -M­ªc—ƒÉGÞ«}ËTOUèzG=&Ý÷Ï Ùw¾0äße4Êò¥C\J9.t ØvZŠØ´f©Ph7N:] ¢h æŠ1 07sÊ÷š×’.芩/K¯»ëYh§®ù놮[ Y(\ü^ª3)ñrîɸ¾B眂‘&C…}rÃRЇ‘—ñg î‡èj8¡ôN™Ê6Bh¤bV}ãÙ&ߺÄ{ÖÜÇ Ü¯„Æí'\ØŒ…#¯­IÌžÛPJ?Ýçæ×†¶aN–_Þ ÷.XÝÕ.æ)S»ÓhñÞ~†ÚËç!Ë´øBŠËÞbÕŒ=¤ L_ÎË䋿l.ÞA¾Ö`äŽúqΗ­ kRP6t–è6ûTü| “õ–%.Œy»¡}D_¡²1”¿ÒÂÚž0Wz)hžÃ¦àÛkÀ³¡žù[}é ú&ÁyA2Eº®J±¨¢ÀöŒriQU«v•GcÔŸ±ƒH :«…Èaã×Ô:uFñ­°—;ë Ïgxqeùöx ÄD´†P¾NŸnZeÇÇË„œ ‚ÞÇ‘¨æ<9²‹^´Ú¡Ð¡Ù[–0Ûž¸Î#Fâ„Ó¯pˆêA¶*NÕÝæÒˆo#Î"4xP€+kІ–ñˆÀ¦Á‘Ç%³i…k±‘b®ÇTñ÷=Þ”ú,I³8«N •샷0ýÝf录:-ÈBQ½Ÿ‰ãïb «ņÑ!¿“Œ”ê:¹$ÒM,n¹ Ò:DÃSYgëþù¥R~^`‰âê¢ä Es¶¸]\ —nþn"1o¾ÿÐ-"‰"÷¡ÜÈŸ—(±÷ x³s•ø˜‹)øõ1%úÒÕ=Ï¿(¾á  bþÅË/:ö=µa [¢FìÑCo#I#͹hÚ ìW½¨êk·n!ÜXÏÊž¹=•ÿÁ¦§vS7@ÅËÝã…f¿RÆi‘þ&Gb¤áجgÁÆ^‡TðÊâÙ°B9qõº¬#î‹U=»“ÉŒõmbƒ0¥zn%ö1Ɖþ·äè‘Ð{V?¾0¥ï‚AdÛ7 Ô–üÓ’J)ôïn‘O?Ó DB±êµIäp›Wô/{Ül)åvp‚ôßÄeÂÞ„e;ó÷r]°¿Pø|›>8#4(ã­võ#†ÎÜÁ®x@ ÓåáNõ7K‡{†åÌëqæ>\’óOî$5(ó#mÒüÎH9ëLt’ÓêÇË(Î’–ŠˆÐsŠh2Føš$d®”VÙ•øxãÊð}I‹„ c ZabyM›W…pº¬ªÓ³!˜ˆô[d`‘¸ÞIJøºUÙΪºoá2aÑÆÇÊ©Ûû«^$Ç `ìÍ¢kƒO±meâ›LºѶ¶›öû- 1ÍêÚ™n‘í¹¦b²ÖþM@nõK¹6Ù+!nëã&ü£!ë윥š«etå%¤…W‘w]¶ º•<=ßê9~%ÕVzÒNvbܼ+»ã’ómû²ûÉîydƆÇÈË«wø™y“&9o|VGrgmN²å°Ñ&ƒ¥!³ìZ±&Á$Ìþû‘ê{‚凮Û)oîXMˆ§žtÒx‡†KécdÇ-ÔTž‡˜®w<º´×øtM%ývš©W§²,¸l½bô AïªÁÌRC8³(µN›WÃæ CÓºDÿ,|XÎa¸`k|¥¿øõŽ@2ùp3Aʘoè›go›®GÒû——Z«ÔöJó9‡›ø™eDõ׌û¯K6ÎSñëYiï¯Â.ÞV–ù:´—‚ ®t.^Æ üà?bdgµmÚ'¦ˆ˜%ø6Z´Ùxyr»X`þéIˆõ ¿=ås:.K;¢i§|Êö ú ”Ÿ ­Âû Kò¶­1CËQ»ñ”œ¼TéYå³7SbBÆUBaz’;ES˜M ¬‰÷W®IftUó& OÌÖv¯Mò™Öh/\/«ofñ¥/ðæáµ)Où } «bßtù\zA/¶ëù†JÖ`ÜĪa¡‰8öè À•™Ðûö˜1ðy[-,UL%:Tñƒµ^Ê¿é“ Â“à„JÇQî¤%®¹§LîlC‹ùcôi;^Øæ¶Üüb>“×Í &qWÌ"þRC‰°ç@SzÖ¶Gæ.èYU„O˜Zð*ÝÍB¹v²y+ÈòûŽÓ"}øÖŠ_¹¿VLØé‚r+N©å¶fC6†š¼·–LZ´ù'[4VS<Ë-?æ»fæ Èú–$Ω@.SŽWœ (-oˆ‰Ä$X],½ePÍ^˜lÄ›¯¨ú±‡*æ¯*]Ás7&žæaÚm°¿Qä³ò"üL|Ãþ ~‘ª ~i²s¢Ö^×­¬ðœÎ䂤PÞœiï>Ú‘¿7cÑNY’þÒÅûè~á×F†ÒIâZÐYÕ˜ó¨' Ÿf²5Øi·v,ž/zÍ÷ñÖ¼/˾W›>+€¶…$¬¨hgð¥äÑ0ÓrûmJA=\çD'.“À³gÇ€ R¶<Ý?.ÞRW¸èÔ|oë–°5 „Kž—J8ç$8\>ë )]•”©ù’ïd6' ½¢|} FâU³»"ÓA¿µš®¦MÐÖ·Iªýê¡T(&*KÝöÂÊ%fôÉ\ËO¦«ç›d´‘m y ¿@ô’ ÿGðX«¾ô›Dð! û®½ƒàÁµ·Q­÷cÉ>IEËW‹PóÁ¢“LâsŸ®•k®cì-Ò¾äêˆ7×Y[+n>îºuyí™6n '”ö S‘ùuƒÄ,gþ©I§].#u/}eí¾ý•Òí©_¨¡ÿ.èÒd­@$šÑÑäô·Áô¡Z¯?÷ü¤•l8ù’Ãïý¨ÕÅ”È<,%¿Tw[+¼ª²ùÛÌÿÝq endstream endobj 509 0 obj << /Length1 1412 /Length2 5891 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xÚTTTk»¦S@eHA†’î ‘†a€!f`f(iéV:D)é”n$•î$¥T:îçœ{þ{׺wÍZ{öÛßó½Ï³Ù™uôxd­à–%8 ÅÃÏ ÈkjªŠ€@A^ P€„]Šr€üq“°BH(&þßä ãS¡0yšp@ÍÅÀ/à Î/"€@±¿áq€ÈjÐä¨Áa$ »<Üɵ±EaÆüõ àsøÅÄDîÿ*È:BP0Сl!Ž˜‰`@†BPÿjÁ)a‹B9‰óñ¹¹¹ñ‚‘¼p„×}€e xAB®+ÀOÀ-#ä72^v€¾-ùÛ¯·F¹ÆáC`HL… Ì ‚`†ôT5ÚNØïdß ÷îÀÏËÿw»?Õ?Aa¿ŠA`0ÜÑ ó€ÂlÖP@[Iƒ厺Á¬~&‚pL=ÈuYb~P’Õ€0ÿÀC‚P'’ uø ‘ïgÌ-+¬äᎎ Iòó| PŒ¹v¾ß›µ‡ÁÝ`ž k(ÌÊú'+'>ÔÙ¢ªð'ã"ùÇgA„¢"‚¢Bˆ3â¶åûÙ^ßà ò+ÈÿÓAàíéwXc@@¼¡Ö̉'ä  .oÏÿø·EÂϰ‚‚QKˆ FòOwŒbýÛÆ,u˜1Üãþþ~3ÃÐË sðø'ý×~ùttU5ôU¸#þ;&'wxòˆx„~ ˆ0@óâýï6_À_àyu@Ð?‡þÓQf Çôù s{qýà Î?šáü{„Cf€óî›…`̃ÿÿ­€_%ÿñvù¿¸ÿŸRrqpøæüÿa#ÔÁãO†Ë.(Œ.4áuÀþ3õ1ä·–5!VPÇÿŒª¢@}ÈÂl0çáâþ¹](R ê±Ò¢À¶¿™ô×.03 0ˆ ýùÉÁTÿÃÈlù¬ 1û!1DýZîO‚QÙ¿Ï¡í~ÊQ@ø„@€º«ÐÄêføy?”d‘“R»Æ26Âm »%–6ápZm8[-VÀæÕ7 Å/˜›QaRz#És€èxM  [ãdÏ·;öZ±38ézi4EÌä#¡i†œOLÈdxIÎySI¥ã’ô^ísÙØT‰“p÷Ht|„QÕŒG~ˆz ΰW‹²E 2ëí»Tï=(îžTk‘I˰k×¥'§Ó0Ì÷›ñ5Mûbõrø¨Þ´V*á{2ª“2"Æå@°›º¦)½NïyÒwwž÷yþfD xÜËIåK /¿ßN£veÞô€lyF¨˜ôÛjù²±è’%ÇŒ²9ÙEÆe¯MtÞÿ1 ³£^PFF}êáD×ðØŠÓ >©8a1wý²“8’wã´îzãVïMê/W)} ›n‡@Η/z¢úu¬Nm?q³,c‡Ü`Ö ]„ÅÏÕ–W•Ðë/;HL”4»_5X¶âÊÔxE À)ñU7¥¹/žy;{µ°S¹øe'[Oÿ,½¾ÒX°â3·6»ôA“‚ÉÓõyÇAù›”ò½¼«Û#gJC¨…&ŸnB÷ŠØ,Ó\óúµUŸ$ˆÛÄKÑî¶êN¥Ö|ði½¸«Së -Zc0bÍþl-ÀÔ]ü>E ‹±hÿ¹Á=“¥ú×QŸ™.åóT …]Úìß"ë<É.Yv“»¯?;Ψy“7™ÜNƒ©¦S·eíöœtÎÅ¡d e)å°ÕÕäñûj$tunâxÎ 0³L[]'Ës HÊ¡ƒ ke oÕÝj·Ø^ã=¶Â¹©OFò¨Õ>7wçÒiåØ1Fin½‘‚­/2ôV‚#"î1s-r4°ä îlAý ;F7œRãx:;¹€D¶ªø|{qæåU£/H/¼Ešva·Ö°c±g“îˆë·÷»Y°®ÇÆoº¸4r$‘K€béxÇÂ.Ü˽·£«[Íç£öÎÒõÇ~|\ð ¡ÇWüÀ©ØYx5ïøÒà´‰{=(-¦¹•]Ø#Èá’ˆµªË„yº¥F¥¤3¢ß°é˹X¾—ÁœÍ'³ªÙ×n¦ÕÅ˰Dž޲’"1çF[ɧ z¬“G9(e˜1ˆš¡ -ËŸ/'3c‹ÞTúØ- P¶~„è+ŒæEó|š%¡3f·¨—nËÒ³¡f‰<ѳué²»c·c3;§Øo?/•‘å"ã"‹m^ô ¾‚ÃÓ¢ÞuYõ6VÂW Ô¡ª—0¨ og"ê½Ñàk‘"ï@óµˆÅåË"{‡tLR!˜c¼áiOç}Ž·1ØÐmå#Jšý'2œB’_ŽÌ®Iá{ðÆJ(×4`ëBW>õÝ«TG¢g¼’æd§ÞÓÞÙꪗï22™¹Z•ý{¬Œ[ïÈ~ÇÏaùrñYÐPªµ{âg¼°OÓ ®œ%5d¶eìs6ˆ¤ÐI*À 5L7{K°ë[²Z¾f·åŸ-s=±MS]ú¡RÒü¥PbcÍH§ßÍá}ìRZ$gŽNåè¸Ö¶Ÿ+w<»M¶ÔÂ9¬³p~9A%Ì3s`Cs_PÌO>¤T=}=p\¦x¨­!¶þB>ðaÁ5Âl[ÏÌc¿Únk\š¾<âÓçVø‚ÒWØÛ‹›R¾[ò°™÷4¨wÝÌm<2¾Š‰zç¬ó.g¾8òÅÕå ¢äeØã ÙwÎ$®‘¦"žÂ ðß°Ig5Y¦Zoسf_QŽ_ÄÆMÈâ‡PÔ»jáߤçXÁsæõMšVÈCOË©Û|â)À)KHG·¶[:ØËòd1Xp€L8ŽD(,$!|$cð›Ðg^ðýóQì7·)6<æ@´Îçk¶éïPæËÔº~ËÖ½mñúôðòÅøóg–ß\àÉÀÁ£bqÞö¨‡ù⪹@?ºM/…@¥iK /ï÷1ó&r>¼W›P#\©|{)RɶÒGÂ×”¸«,ôÖØ·É/3hrÞf¥¼‚b¤à­nÖ3!a¥IÖýÚy#÷·æRÆç—F•c{|lÉ´r<¤xtmhvfÚ]wˆýƒ]Bîïâ8uáÅ®´"Ç„— ¡º*Ú`»Ø•ïÇ %?óH‚Žd>ÜsÇ @€º+’ÄS™(iõýÙ¶4Ͼ>õáHkôÒ9Lªî?>Æ“bÄ£>æ'v@î9lšõ8]û.ƒ^{$ÎmÎÝ~+&“P|É¥.Yp9º^LÜÇa¡c6-!O«°±)PÖhnÍRµ·„E”äÞz-9‹šÇ·,í#5'»Ä·bî’…²ÐÞfÕÆ¹ä®T}oR÷Œ!yŒK€Øw¡GÔUoØK¢žüŽÄüáŽþ­¨\úFÜQI%¿Ô÷ϳi\où‘ÁëIÇ£—þÔ×®b¹—Z/!5Q5ò.1NâdÆ¡_9¸Úë¦hpO|ýöᇅzæ6¹¯µÄkûlá€d\ùó’&¼‚ÀÄüÏ›5s±át%Iæ…"òf?€T+8ßç€uÄœ†‡æyHÉÃGЭ–yVÆK»v¿sû™º8á]cáÝ×v8†Ýk4[Tøqw]´øý”úöãªÑ¼ &ázÑ8=ª¾+Ÿ=¦_ÙÑ7‘wÙdd«d‡“~gbCò5kiHçr¥Æ‰ËôÓÓ”ÌSž8«GžRƒéw­SÉ+RèÁñ÷몆©¾ÊÄØ]Åáïj-g®=Ì07'†¿=9²}>*³"~ê²ÿ=R-Äy0ZœŸ[%þåW¥~öۜڈ *ÆÝt÷̈ì¥Î“𨬕êl„i ï[¨£ŠYXýƒ$Ä'sN5úe?œßœq¡a,•H¨9TE·êniµèœ`ÁD‡ä&cë ÂÏ} Œý/:ì=OyëLUÇÞTðÞEFãµdQbñ2KîE»*Ò̾{áŠÝ¸jvÍ~¶¿eá/cˆog0¬:œ•bÉyPS“£wÐPС¸¦_FÓ¤úðÔ,è§JÔ´¾>ÉRb|òèúÕÚö‚l/v±ùÔËœ² â2¼!ýÜH»Ä²¨6fÆ„¥B)“†üæGÄ>ø¸ÓfŒÕ‚blê†ß…K/Ï8úù™¹Ç¢´U.Jaȳ¥‚ƒD$oYì'?8¤¬vêkCÒl'&rÜlj·#N}—Ü(üÊ,VÉC®Wj‘<>Ònæ@²sö“É÷˜ªFeëã¯Å‚ g æúú÷ÌÙôøF¤ÄXY¯«Nx¡¸±tÃÇ `Šnޤc[jî©=^Y"ùk™âì³öô«Aä§4óžºò5vé¾AºÝ‡{°9Ç*c*¥;DNÇ≣i»µ~81[M—^Wt\FÌóRCŠr$Jdœ^-ÙßàÐñx Ò·r¿ÄÅJ_Õ`h"÷™ZpÊÝ‘NË0k[ôÙgÜÅ2jyÙ!ëdb‡}?MÒ8–‡çfÅoiä ˜„ypg:ÚŽÛ»ø;_%ýÀól1“ªæÌµ|%‚8ŒÝ¯óä³}ÑÊOqµ\$ËuÛ¦TèÙ?>O©§ÔPtü€" ÿŽÜC{‡h=#1Te.PûeÛs+ž×|ñý¡Ðð²:GPÖø8?·Ðª[iG󙟘yÃH‘¿8Suòq+X­*ßà†ñ!:åå+Ï<Ýkõ[x±Ò¨·ý/‚)Ñb&te{ü%ùT_hyž~ƒsÁš“©ñDFÆAk•C·Ë%»(» 0‹K>¸¸Õ™qîKÌòÙFU÷ËÖG„Ç„Zñú—j™ü§4|+²hu5Õìç=Ò_Ð41–Èj ¨¿z¾„îFߎ|:µ¥Q.ËÒû»õ/:‚¨ŸD;ºêF ÁšWÓ³ƒÍšœìæãx,õ/à…¥LŒX[Êc áh=‘ˆž€ÞcÞ?ñ툈}ØëìÍâId9¤£tytÚ98’}"µï©âñméâ«||™)Ø5Ñ4½pFÍ -x‰lÇ×çãa´B6žâé$4ßÊMǵÎÕd_swJÞ}wúíF~åö¸¸ÀJ†|N/‚¥õÍí,ýϧí'&…ݯAááô½Ê~ÙT ñmãÃbé‰%Â2Û»A®ªË‰$÷àÂßñ •È oö‹)ïTÓ%ц¡é'%|IdÊâY+8ó•—›sÉÉül #sjó(òúw‘,Æ€b”u©‡V4Þ` ßÌ"ñ…£~×Üø‚Áq¯/' â¼Êf7ÏQ®SÀv=ùÖj©|¼EÀ÷6û5ÕDïMç®9ÿéÍ"izû‘,kF€ m¼é÷²uá X%91š¹ìÉ ~Æ15Ð(*hà¥ô½çP‰·èãìº5î8!™c˃Ó;8y^½ïý{Ró8§ÆkûFšëTÚ<ñÀdÂ+: úp{ý›¦›.¾G—äR¾âIaym4êìŠ'DÐ9ÕÐë3*û©ï§Ôß  7úpÇŽ_ßë…<ÍŽøŽ×Ò$ÝåÈjÖÌ(Öû‚räC˜@Ï ¤lƒÞ«V|)Âk8-îÖ`š›ÞU²ÅX•á0$rléºMRÅy¾Õa†+âUñÚ%϶ËÅêãÀ‘²e2—š·üðI)¿ò1¿K¼°eì¼Sê Øÿ|áî”÷A{ùý“\¡ñDbÿyÊ~pV’˜ð±*@ÀçàÍÇV^x°kBZM%g´o^N î+{‹'—êœe@©K2²aO¼EøâXGÅêî>€;KAÌÅû-6ÒÃ*¶wÖ>ˆW†mGç~4^$¡–šôQ J»_};ˆìšÌ©ÊÃ) ãÓ“éHº®®¿‚Ã'„ ÖTàz;vÇÓ˜ìŸ9û´ï©ƒN(Þ0º>ªL`Ö‘ll±35EJ}&Š·o—ƒßüyÓçþP g~ñÇeÅ!Žz)ëù»‚½ÓÛs˜I•´kTçÈ¥6¯ÝÖpz±<»¸Íåbágðx:#Àe>Û ¶m;![^Ñ%ÁOf”:tVÔרš;()…ÍN숇âÔå¿í•:’g?kÍì2éplúòཽÒÔà •O&JrÎc¤pc’Çç'èÃñ¨ÒÖ1ÜQ~ï¦;é׊W®$ªó®Þ㪶•ª Qaøf/sirçèØM“ü­2ØúšÓØyÙý]òõ ×é ™ô±û¤O%À*8Ù1—«pÙ Od`ìBÏ[Ž$cýfÊ:.›SicÂÄ)n$¼=Éá 8 ]E†¼1” ªŽ‡û6£gÚ2ÕLÖXtµf[ÅôÉYkÊ^dN™•OÙK~@êmu/<ȫᦀÙ£¼ölýÍxÉ>º‚he0k„›„h¿æWmÎziDo‡:©ƒÜ(Bv56ýt±‚{>ÃH÷Ò Ý.{ª½˜·^öèsœ¦€ïõ+}õj2ØüeÕÕË­VýþPÜŠfÒÝ'¨wÃBßRLGi-jOCa±‹Ÿ˜=wC×ÐTQîrf@ùýpæ:¾Œ^O×êþçATÉ¥,´ù ŠÖŠùGfµ¹•%jk’ŸÓ‘)R.¢êÛC¹ƒW;5æì›\‡¢2Kc…\ ë”S+Ó}®æ‡û¯9 ”ê=*¹szfÏY=®1º=ˆëÒ -r¤nݤ€,<›{¨{8‡`•ÊYþ¼Û^Ù,F¬‹EÞv=:Ú.F´ò™®¹ûºüÂÒÁc s¯i;‡JòiÓFO‘Žö~ð·ºÙéŽ2Űæi¶€Ï†ã•Å—$œ×†¿q-U¹ŸÞuX/÷Ÿ»'õq,¡\Zs‹øÍ˺ú9‰šI1Û÷ÀCFáx±}Iti>ébö÷ŒÊGò!D÷$Q9ج”w@O’nÑ ¯r!˱ϼo9XŠ ì©U¯$ègdFš%+ñ´qEÌà Ï ¯.s.ݱú’ZøÔù§K›”qw±ã†`ôâÖ¸3òèƒIg5B®Úg™ZXï®|¿ubHŸzÇž·#¯;Å·TCUã5ñpìÀÉøªËW;W}²[ÁñÁ3/Fá3øKy…ÏŠ'ŠÙ C‡÷Š¢Âè¼¶ KPÐèú~whÖ‘Á$Af[{íÖ™ÛÌ,µSXñBsãÛÝ"Æ^4I\eUËenÂKWt;ÔUT@Ô(•K«N¢ÉzqKwþ]/å§71Ñb{ý¦¦†V}©g©—7ª†òy$p·…„]¥_4?‹6vôýÊ‹.-]ƒÞi±:h©fÿrJÀÔHq…þºÞðC¸ý5™ÆÔ»À/½q7Ü<+ÓÛ^×køŽQ׺a-¦‰ñ~)—3¬3íú,Á!°˜Ž}›²*X뵑¸\qÇ,´¸åôTÒUÔ¡¨r²“I›õCVoVz¢ª×’œÌ(azÊu}Jýêú¦¶(CÖ†X!Ç–ÜÉçyÔ™vÜÕC/GW o\÷¤Ð¸üþÑÄÞZÍ6›gàFÛ«Ì»b!År¯>Oç» àOnÙ› =ë´×p”+žµG¨ÍƵ+ùš_WÁ*5ÒÀyHxÛÜœ¶ì(Túi‡;W—6•æ¼é§¤9â¹j/ýQ)BD¥µw{"«Í’p”Þ®mÐ.ÕByÙ}Ÿ@¶¬Ó°øQµÅþ¹+PõÖ{7DiZ*zù«ÖÔ-oŠÕ):ïLžº=Ún1/®ŸÜëIá™iû©wg·m!eŠrË?â‡ùÔÂþá½GILc£³^JøWf†’uŸó±^ösæH4&ªPKo\q0¹àªêe¿E<*}ÿ°Íâ¡û¥ï˜“‘(kük2™JJ”Ø)t È€…E¢90ûL!ãÒ‚m3ˆ@“dzÀaÛ-ny8 <ð9OY»q7T–a”éeD@+Uç¶ùPß½A*ï‚ÌͧÕ_øš gºØe¹…ÊsßÈš¬lûsÉëÁ‰¦æËk;\3…æïõMÞ»à760û/&“H endstream endobj 511 0 obj << /Length1 2794 /Length2 24282 /Length3 0 /Length 25838 /Filter /FlateDecode >> stream xÚŒöTU‰û ÓÝݤ»»¤;Í¡»[J¤éAº;””n¤K”¸Ç™ùÎÿûÖºw¹žçÍç­½7 …𳏥“9PÆ äÎÌÎÂ&T~ÍÎ`cãdacã@¢¡Ñ´uwþ#F¢ÑººÙ:þ0tš¹ƒeRfî`;e'@ÁÃÀÎ `ç`ç`cp°±ñÿÏÐÉU eæik Pf(8€nH4’NÎ>®¶Ö6îà4ÿû  ·`°óóó2ýåwºÚZ˜Êfî6@GpF 3€†“…-ÐÝç?!è…lÜÝXY½¼¼XÌÝXœ\­E˜^¶î6€×@7 «'Ðð«`€Š™#ðïÊXhš6¶nË5œ¬Ü½Ì\°ÀÁÖr{x€,®pr€†¼@ÕúÛXéo&À?½°³°ÿîï_lA9›YX89:›|lAÖ+[ @UF‰ÅÝÛ `²üehæàæö7ó4³u03üÅÜ #®0øOyn®¶Îîn,n¶¿JdýÜei¥¤“£#äî†ô‹Ÿ”­+ÐÜvÖ¿'kròùý¬lA–V¿Š°ôpfÕÙºxå¥þ1‹~ˬîn666^~NÐô¶°aý^ÓÇø—’ý—\A€Ÿ³“3À \0ÀÖ þÉÏÍÌpwõøý©ø/BbgXÚZ¸ÌÖ¶ ¤ßÑÁb Õß<|W[o€x÷Øl¿þýû˼^–N ŸßæÍ—USRYRSƒñïŠÿÕIH8yü˜¹ØÌÜlö_KÆ þðß0ÿ6àÅÿ%U3³ý‡ÜåAVNþ¿k7ïuxþ³ôÿœ à¿TœÀ» Ðÿ^}C6n6 ðöÿÏð—Ëÿ¿½ÿåÿmõÿ/!‡¿ÔôéÿÔf޶>ÿ€WÙÃ|ÊNàãý_Sàß§¬ ´´õpü¿Zyw3ðyˆƒ¬þm£­›Œ­7ÐRÍÖÝÂæïúßÀálA@5'7Û_3x`ÿG>8 {ðÅ <«¿T@ð=ý7¥4ÈÂÉò×áqpóÌ\]Í|À£#n€;øB-Þ­6€•ääv€Ë X9¹"ýš(7€Uü—èoÄ`•øx¬’¿€Uê7â°Jÿ‹xÙ¬2¿;€Uö7â°ÊýFœVù߈ Àªð¹(þF`.J¿˜‹òoæ¢ò¹¨þ‹øÀ\Ô~#0õßÌåõoæ¢ñ¹hþF`.Z¿˜‹öoæ¢ó¹èþF`.zÿ"~0ýßìgö/âs1soš­›ýop0óßLÞÜÕÌÂ~aY¹ÿ–sþ+ÿû¼þU€³[ü‹¸ÁÁ,œÀ«õoN®_GÇß,~í«å¿\¨¥“ƒƒ™ë`ÀßAÁÀÿ$eçG:Zš¹Ùü^_>.àsþ72˜3xÌÿˆ nÕoö±úrý‚¶¤ãß›óôüMŒý—àw>î_æNÖ6°þ‚ãÿ&Ìž·³ ô‡XöG~6påv@ð4íÿ€àf;üÁ“ø£Rðcšõwdn°+|Þ¿›Îòp4ÿõ\µþƒÁ¯–8ýæŽéô‡û¯–8ÿVƒs8ƒ_ñ ÿì û?Òÿn ¸gðî9ýž=¸?ÎnÄK\~/8›‹‡“;ÐÒÜá?)8¹~+þÏ>òü£ù¯=ÿ?Òÿ³ÿšøób7å7n°“ÐÑö¿ ÍýËèùÇÔ¸ÁAÜÀ/Ô«÷ÚÍáÏÝdg³úüNbu·qþ±âàFº{9ýáŽáñÚófæõÇš‚½½ÿ€àð>@p}“Gòºþê?Ïu WðÌÜÿzó‚úÿÃ}]Þ@ ¤å' Áp»†ðλâÄ^Ìß&…gi¾éd00û-»vy< Á§2Ôå„nºÞˆ§Žõc¬íHÓ_‹­?ù·5ÂGµ'«wüô4I|=ó­iioxªøXüã)" ³¦Øžÿ“‹¿vˆ=tdM¾‹šZ!ö× ¬÷Ç¡ÊÕñÈ…oê{u<ŠÈ•_˜ãµâ CÊæh Ìsç (áÜ™I^a]x£Ï]ßÌb½Ÿz!WHdD 8‰ç,ñÓßâx{?ï»^­ÉáÖKHM¨O@ }5>Cë'q¦€¿èW^²6¼äÝ&TBþ•)}ƒå€#»Îöu,¨e Þs|¹›}7?NG<Œ½›\_Ñ‚câJ©Š[×a‹í^Ïi$=è¶’Xï¼Ñî³²K'Yáÿòñ0‡ªgsÜÚç÷³Ñe}ìÓ0ómdzûÝX˧¾2Ñ!Qk/öWÒ61k«٤鰕îP½:@y ¦ÏT¾GX³!¿ÐïDìÛÅllú|°ã$gÜùþßßÔ4]¨toÍa.:xa…½„ñ¨¼˜÷¤_\ÚpJ›æDÒdK÷El$Щ 6›æÂ*Y/¶jðX¤*|È•’¶¹—¾P—pÉË|[¬‹1 õ±»ç/b9Ó®ÑêxÇ]¤N±{Ë.æÙ*¦uCËK¼q…¤>{n¸y2:#AßÅɆ#2y"(® ËÙP*aÄyYHγÛöÍ{ Oh®u3lØÀ¹Ѝ6ìÕƒ¤Þ”}£u„8½÷È“úþ‹·l:h¤Š8+†p×¶Žf!%bqI‰¿Þ / óÇNIEœU„n(‚Åf,ÄŽÐ<ÎhCBÚ÷רjœÒáÌõ˜t˜[ÏÓâh èu,°Ëƒ ’ “ î•´~¼pïxꑨB´§¦{ç俉“¯bY+>¡É,Z{QÊp§$x}×xCí_÷â¤.4¹?™ŽŒ¬Aj÷Ÿ·šû<é•°ûÔÄ :ª Of[k€«¢û!çÏ,-IXÛ,¼F9÷š†™Ù€²…ç@ 2ÃM—ó`Ãöö=.U.O ƒl“[ùöÂçëq‡÷,b‰Ø6I«.•î•ßë±U'xúñl¤,Þ  \ß»ŒeQr ßB§äj~ÑSdYS$8cèc—ý¤ègöFR_B6¯ ‰ŒÔg•-F‘.r€C•mV;½–G^šÚáçáCu+s2þ–A/Áñpb,ön„Pq|‘–ƒÆ:żÎ7êVaœ0“ÉÃ)P¹šcÀwÃ#)3?jŽçUVÇ«RÔ¡~Ôª™þžÉòMÑÁ"Å< ‚ÏS·_ /¬ß»×ЊVì¼üñ§yìÕ•¼×Io©b(Ùš]<¹¢z³0%V¢ÃáM~ÀçB¡dù¥v‡Øé8p—]›5nTBX¬þÇÃ)[RŸ^“ï=õéýôíH0Í`MÏÌ®×ׯFN•›€Z“'Qy›ÏèŽg2pøMìhKi–£><·¡½+RÔòp%·Æ¥móñ쇺¿×KNI˜}ƒšøô»&:PæâÏAŠþNÊÈ&Ø ³é:˜›Ï$‰]¨>»Ê/<ÁUùõÆ]·fîyäbªìǬ¹2ßÉSš9}Ȩ2w,Е•§e‡ôŸÖ  «_Ú}§âd‚à±*ï«(ûDj0KÚ :$ûÚ ï`Ö4FWm ™ ÎC6ÊÎ_cáµâ•tuÈÄ@Wv©å²t)ÁÌ{ßÁ”˜Lêj¿ÁĹú¡ž_‡ª©örí–üÄ”äü¼Bæd“üКì÷ý]xœ)£ƒÂ-Pývቘ>'‘ܦš™çŒ/¡Ö®É‡÷8ÃúUìd¯*wGâ±ê”G̃#ýÖ+ÇCjÔ9ñ´µ— :'ÞÌ¢¡bÕª²¨æmÙ2uòñU-… DFX¿6Þ£”ÙzP”¹Ó,0ÿ™‘Ø­òÖÞÁº¶/wÅüKMü:EëAå|ÚügïO÷f\êìøÆUüÛ.Ú%­eã%€$7cûÓB7Ë·Ù 4ßÄ>øš¢ýb¥<_B£·˜•®È1%…•až*Rݱʲ¼üÔòJ¶Ï´ÉâKÖÄ_A<>Q ˆ 2ªM—BŠˆßŽÕ&ŠUߊ‹|òŒLÚøâPH»ßt§÷m±‘nyBgeú[mo![ˆ"à™7‹ÕÑvù‹¢yQ¿$ßÈ ¯¸\Éü{NH$–Kƒ|ï¶íuwvqšÊ\gñ)®"%s¯F €{Eñ™ ˆÀ†Dj¼ayˆ2“‚,p·J‘×Ù°ØË›Ko[Éx[ºvbí ‹ä½ÉZ[šlÓí׋Ã`z2q‡ì™3vÓ5>–+Ƴeʇ+Á ¦ ß±Æ$§ŽºÍ|oèQ¶ ·PÌ…QB,v侀¹ƒôM€õ³cb|“·¶ÏuÓ æL.¥•o Az™³çej.idbæÍÒP9‹«45.¨UO²F’ýaнÒRŒê¶œbÚ^%j.Vñdþ¬`QïÑ\²CˆÌ=òRœÊUL)¤àÖ×ËçêþŸ§I5›¯:c„†K Rw†°Ã±+¡ÝzKù…šdP%¥M#´ m¶ºÆipÕ“'eJœÔº·g0¨+ßuQÎprvÞªñ/òŸèÇ»ñGAÒ™îÔ¡ž¸®èÜ ¨¤”œŒºÍ^¤´‹ÁY…¡ä“ê¬GÐrpyaU8ø"ïQÏqèœc7x­G Ÿ¨ò›¿}£T-}ýiBgà• –Ñ:k©©Oeœz=â›±CõÔ~b™W•k¶šxßãŒU7–&EʦaÅ‘4šUÚyê_g.œ¸–d?Žê]aŸê¹:ë—HPJbo—ô¢Ô~ MÊ@jIž\=Ç]Ì*†õΣËÅÑ54‰@ê«‹M¢Ë/o¹Óí¾¤åô”3ðÒv?æÛL‚rQê õèæVÍú›5¾ÓéºÍmf²‚L@©Ð JxÈôibH ûùŸ§³jšTHýeš6W/Œí³Í7úAGx§¦JuEF«fÅZmC~o°<·Ï•6×Ú÷ ¹’°gPa»:Š¿œ¹¥âô_]‚ô7¡_evWÜ~r»¾pÊÆ1óKôY@F ”$õ÷@`Ñ Òo>9'ÛcÃ!o™;GX»©eXR3ÏÞÔMÎeÓ* 9÷À`µ¢;`£ø·f7ò<°Œ ¦53ZMŽøú”{†‘5ið­ýõ>ò‡¨ç\'ÔÑUçõbÔ€.¤Yá|±#RÚjµ×2<Âï7D=1 £Àïï¡2kîœ$«“ÉÓr=)ØîZbdRBQÖ7Î*¤7Í Þ„ZÝ©ysËEäãúÁë<6 ®Ê’-à`èaSrJüà^¾zÜ»û*gH9[ewÇž6™yjÁ­rÇ_é,ÂÁ«Ð!ñtÕäÆ }ÓlMÿ£ÂW Í]Ä v›o"YÖm¨5D€ü55¿í›GŸZÛ&ÂϱC»þòX¥Á×Ƥ¯%Ìz޽?šä/êå 4p+—ÕÁlî­âœÇÀc¿í¨Ao"*ÿÉjW±5´\@°ašrv,E«Cî._\Ó‰4:ϲ¬Gò]l „[嚆aòã´Ò€Ú­ú¸ã.®ˬ„ J‹M…5ÙÀ36‰XµÆIj ÌÃNŒ7%û0}Z®(µqÁlî[#¯KlEI9pèQwNŒ$ª* šeèlνo*¹d„× ¤C1n»Øu‡Q¨·;Âñ®ú&MÏ&ûIp²wUÝêmÅHн&]ÛE†`žÐ;bÐÒ®Gˆ»ƒ’${²î €{‚(É%qqÐåKIˆènì´/»¤c/I‘û@ p Jƒc™³J!MyåSxªý÷Ù&j²và˜ú7VGgnE^H'`Œ?ÃÀêÒ†YŒ\ZÍ–~Ûl—G¼V@ÏÐàþÀr8-À Åç4½Ô“#ˆ{Š9Hy„9½oå³ï i,J¤ëZOÈ~f K,ËkÀ±ß¨®fÛ1mÐÆ Ô#•l*õ˜¿…j¸>û˜q”Õôd+æ§ÉøaâIŒ`*fðõ ðb#ĸƒ“Ö7gè‰îrEsÂZƤäì¢ 1vÜp]qC½×ÒöXúEV¦êê ¦ìÓkWiÓꨄöW²>\ß1XÍìÊøf›¶Œ´ˆîÈ[@ˆiÈѦ ½Àv&Á=A|Ø!¹2¡$†;Úõ•œCWf5â>>;ßgqò,(м/`ÓBͧ”Ÿ¢¿²Zpn¦e.Ù¡”­Hì٧³Rv›Ÿ#×ÕÑz x¼ijiÕlŠ7Fž[¤±›¡ë>U•{A›xKnrß+xÕ0y”¸­ÐêY€Öb´F…D½ _‰¾J'i#Â)®AðDÚqúùCßw±ä‚\Ä,³êÆ`fœLñ ‹˜ÈC'ÈFeúË8Wˆ–2ªUÓÅižŸÝª)§¿”'i­i;¼CþSÐV=Å·ÆÇ‚ëYµþO'~)…pÒuç“ÎfÆÈ!K6ǪöЦ¹-gÙ;Îw(5|>kÔ®—iëW©HV.ŒÜ}>OëFó¹Äw½'hZL5Ýîù {¶r—ùݪƒ«ôµ&@ÕCRíîg—i8<‘jƒ­AfY7_¿ú†åEdËéÒ$hz.õB¡Nûîl}–ˆ÷¡ VÑÜnmæ&¨Õ=ÞítÄQHºÃcžå ¿%µÝY”[{b5ödßúšå8ûúÉ“.xÄ‘‹nBc§_ªc|ÙÁ瑜€7¯EïzAòcÍãa“qs¬·‰l6ü]Ó2{éOtwÖ¸9äç­øñí ¤-®èzöГŸR"ÎpŒ{V•Öü6Ô¤åCFbçÊ÷¦KÆ_Údo¹«àнFŽ;`vå]]ÎÅË9­ÄC7õ0m=ªƒû×w.»fÎO¾`é¹b’J]ß$įX’Á¿.^$‹»c¢3W¾cÂaØn7«,k·Ùžâ7˜+óxAÐØ'àWL" ÇÔT¬0Ó¥Þõ²KnV 3؆òŽ%v +ò‘§O{é´ÃàV*«”ïµh ð·!ë¥Nô•ÚÆÖšêçÕ¡ÏØõT­/0y¾?8U<”ÃÞsÙä´ ì%4õ¸ƒ"ò‡©>!Ç]X{sИ5l¼ÂC|Æšç3óÓÔ좫t5Æ n2ÃôK÷¸t^Q¿Qì‰1Jïží¥’Y8>V€Ý§ûcb?‹b¾ y£ïë4ÃÂg~E¹½Í`½BóC«sÕ¯ð½ŠMý„+ÒºÏwJî̬4C;Zôú\ÑT`ÚXNÓošVx¶Þ3æV)Úîù¹cØØð1úUî“ú§¯å*æVŒ«ÝáyN”ˆñËeZˆ¾3WÖGÖf»oßy4ÊäÏd `ë>ø¬·VVOC=¼ê„µ¾yáÕå0êÇU.—5Q˜½x™eÜ7í¢tjÈÉÐ:½ D¹-IJšæ9a.¾Ê”½Ëƒj/¯ç¥<ô“Š|-ÄÊáþ¤<4òãÞí[iðO{~yÝIVE93ÐÛ/SO?±—Ku¥OÊÒ0FY޾RôNP¾RXÕàEë]Ñ#«C 9€=·[E%¥ý²,~ €ÂXµ÷¦§­kKø:M¥à5gƒ‘¦f4Õ*A­Rú ×dÙÙ¾h6ÄÝÍÉíÀ} ¾¥¶¬Òã>žnµìsñ–1kk…KãÌØ ¤MÜzõý½>Yµo¸T…» ç-++ûýò’˜ˆƒŽé®rç‘—ű—À¯À­Sm)…yÿôöv]ô€™2IטQüaÍQñÑd+‚'¨Œ¢¤µAØÊÙNÅ›YªÉDÍü4™ÛÃ}¢§[ã¹dhR"hdÁLÄ^ÿ£×)ÃÁPT99žõ¡§é º\uÎQsAoªÖ·äœWäã•v昧«4­î ‰ð¬"Ÿ T_ÎrH]µ7Bú ½>´ÁuŠ0lŸ¿ïk2 vȽ‡ævêÆ0Ø/˜–Ä`R¡-§Ã¶­ˆ1¬WQï“¿”››ø1MÞ+ª)p*¶$sŽ¿¯ò‚ ¯¡Û·ÎV/TÍÐa³¥³ÒÅeÕ&#Õb“°Ê²ôQŠÁXv†™,äðÄ„üF_¥UwZòGÝ-²rükX`“oÿÜÍgçC¤æ%÷Óçg½¯Ü¦ ø2&ÙÞ}ñaÐZyþ±tºIM#Qá²bèZ <òȆä™áûk7"cÚ&?¡ÆDæKù_ɳàÍ6Rú-á"œsj­øóؕɱ‚_.ޏVÛ,ÿÄ ýî zè£VI΃Cí…5vÌg\—9-K;ª’¶º5Ü76ð.#È%9nN¨ÌmbIHŠÐ²¼ ;”5þêÓQP{•ßú—¾nþ¡EƒJóØ1%ÁV•óŽeýâœç ȃ„‰ -[–’r ×>â‘Õ\âYœ¬?Þ£ûÃ}vï¶cŸÎßw}ŽÁ­í©}&WðìgR$÷‡D¼lŒ˜JÕÞx÷.)ã1[=¼Ñ`mCH«OW€&teUÔ‚ñ†f«ñT¥cMBƒ›?ò.¬ï#d|eåÀÂ`ÎGëÍÃÎõ]có !¸Uú†WÔ€8/¸ê»ܘ¸äc ך=ß¡’HZ|×tAqKyIbSÖ7!HÌvH_ÃÏ—èãO19Š\D¯&B™ ×uJ4¾©ÅNÔŠWÊÒ… â ®=àœþ2.}α4-§ÆÛ‡_Gvª·«3ÆÜ 3†%­œ¸h”5*½ýž Âè;zÛÞvà´ñW²Ãñ“AE#T+#~–¥Î^3ᤶ¶GäNü®ÉZ~ ßÏ<FWÂj&;§x!ÑMš€NuMgõ•×e1·ªNÅO:ª<•,–Ã_kˆÄ(öÓĉjñ÷‘k×$[iÜׯ":Xa÷4[uúP Z± ¨Ç(ö“rTæ³lHä²÷ÈÒ‚o+ÉF3aTÒ¿Ètâöþصtº»·’Zò”l‘ãTmCÞeG³1À“¤EElzaûÞÿùù xØè¾MÅÅKUûæ+YÝ›íʉx“³…ŽäÉÒ´8j9»ó‹³¦ùñ™ôÙ•¸4âXÍ1»ÖbfSõ85>R8ñϸ– (ý¯Æ»ºšJ9Ò?œa×ïKêùafŽˆsõ;žP/ë4ÑzaÒ‡¶„ˆÅ%v®B )´\ût‹)‚¸™zrói×|çŠãíïQooîã+&v×%$œ/ÜâEŽÛŒù©P¢QS5§r{ÆÓšp =21qf̾r kh Bµ@Œx…§Í”a f%½J8òåર¸½Qâ¢þα*SWuì%´dº]¾ÅË€V]e2°ŒÂ–#?}u¾¤Öá`Õ–Q·ÎÝ}¾expê~¨-Œú©“v8¡èg»S;ûwA*vÇSzßâ×{ó'øËö|ß' c¥Q$ o°Ø×5X³O»°ºxhvqv»£ÐÍRt=qCßôAŠGÜœ^}&äµüœÝ&3Sêt{å ÁLoÐò|ºS|†èœî@ß »‘ì¨úL„>O«â4LÅTÜ)·&Q*’ÍëìnॕY_Kò¡#ð’öÎ|ìdÕÓñ35ž> þ%ìl1äõBÖG·ª8ò{" O'H[—GSa.ÿ€ýûáŽi !"Ñ$ ³óC·€§¥^‘ª¦­C˜0IÅÅÝÎå«o–ˆ'Oä‚e}°S6®´H(Á :ÜYuv̳Ü-¶#ý€]û¤|„ë&¹à[ Ö@‡,ú"Èó$ø5Z¼Ó‚0½b{ÐãÊú sùZFÆþ"TÚw¶Ÿª­Ý)ïÇa^žˆc Œ4ìD‹¨—T]à¯Så¯'§j1IÅ(TÄG/é0ðÅN¾^gªzÒ{§·ã6wçôßiX¿ÚØã[âšúÒÀÊoõ°àØ‘¡FñÇè‡)w³fº _Ë&M°TÑBÂ8I¬KŠÛ€}úLZEç ®ò•¬hö2³àî~ ”ãè lˆ:½}t“jÓg"Çú”!™SüêLs+1¶‚èwŒ-ôTäþVO™Ctôkcó„Ч´»zB»Öt-Ì?ƒ"ʪâ—.1ê1Üñ4ĸ+/‡x|Di·2à¶Ê.MK© ð;4“ã#‰›zä@ù2;aEQ.Xè¯3š?ÍúšïWhwÇÎopÅèp—`GOûÓ»^¥xWÉ.øY¬mÌÄÛû–ÄôWS¾&Œòu Lš<›ÐÓü°‹`Iìå©ñ‰‰¼Ge˜Î?/¶ü¾€Y¦õ±Ämì[fа'3 jùqJeú«úÚš}£ªgØû’/qºïöc«€æ)õ:mŽmÔ¥XºÝÒÊïÅÐ5¬Ä’!$ÙÝ–/Ó>®8ʼnFêŽë Ū7"Æ×ÜK¹jUäLªôÚŒ<½:•Ó †¿bh¥Ô—x\¶ÞeÐÔvd÷sŸ |}ÿ‚z¿½Ë± 9æbD}æ¼eŸ#!Jv×'P¬¶g¤Î±5v˜¸&EžF& ÒÐfg/ÀIÏ!™4´>b¬=„ÝÜ&Zþ*/Úg=n“;g93[Q« €¨ ƒ“Ñèá!ï"KN7SEbãÏh’|cÖb"&]†ãÙÇÞ¼±»Žixù2#:"’õ¤Óê[RšÀiV5 ûú6¹×+íŒf¶B+ÂÁ®×‡È†ïâ/§Ê SeúÊ*xXÞ®cŠKÿ å‰ ´y<ÁœŽÚf|“Û›–¾?gO ¡§ôN¿]>‹,¡¹€À‘ } Ç\H®¼E¶[±Ã𠇫=dÚä´À Ã…ÆõÁ„MÐíþãþÄéyBYáãW¹ Y–ÊÊõþ]Xàê)ÚßëÓ$Š TE?v¦ Ù×íTŽ5óú1¢¬/vE~IÆëØtÒ—G'èÀ’mÃî†F‡uM©J“š\½ûyªûÔ‡A´ÌÖ°•—»íY{– ».Z%!£üJ­¹RçeS/ë…7¨…²¬ÒÖidözšJát™2Þ ¤ˆe±énT²çÈ~²Oü| 9¶ô¡´avñœa/üáÕ3õ±.šVW?ǘêšJú‡ï¹½,mñt×ÊlÁÃ…)ê•Óîèw÷s3ÒY|ÙÁüJvwï(4oŸO¥{ü:¤­&bÔ´ ¨ßÇ^•ãíŃÄ+Û'§ÓØŸ÷K+ žYäðíš"³‡›6–ùYÛÃ)wàEÚì švèCí*ÏÜ8ÑçipV³qdÄKê‹Î2ý„VÑ/¹Ï]—Óðš°ž2¦š{U–€Ú㦮¾âR§<úHnH”E„âºVºë5qî [3ÂâèVƒb×þ†¡[\Qþ-£@ÐËAzòÅÈûÖ«bÈ·0†ý1ÏýíïPå(èUoIð¤ZØ›¹fÝ¢;‹×ujÕÄHïXÕá»…X '…ÈËÓLƒK’7Øøæ„ÏrÄ¡FH†*ôb]ºà¨%trxï`]\DѸå$ñØ¡¨Õ÷±¼¿Ó¼!ÐÝä¤Sõ‡ûx<™„ )Ÿsà VŠHQõ·X~l´P²4å@ñyO׫vÄäÊ_»…J¸÷ C™‡½óŽ9žU1ÎzòÆ ›8ëèµQã½i ©’gÊQ 𥬙yg¸Z¥iá£À0ôrA|ÀIžäE/¹ +H'òÚ![ÝUõ9@Õ„G¶ë¾2“½öG$ž·nð:-*1ä–ï4Í¥tâ·~XÁÂ'Síœ\ôpݨ´‹ Ùôè+³É¥ì]†Ø–®½wVOÛ%tT_g—mÒ|qdq?:ë÷FšÑ¿’±+%£$8ô :¼¼c vËÑ_4cÙP&ºè½Ãu¾xøÑX⤆è/¿Öm,°Q:¬dðÚ·‡¨LÐddPƒ3]Aö‚#ø$p[¶Ê4øº{µ$£Ü ê¢®\§$±¼´€â«E@ïR5VkÀãi“ ¡’úc~Û¢w)[ ‰éÆÚRŸé,̬ NÂïͨ8¬Ð‘Òæ ´Rzy)'‹õÁEKÙoÒ={>TuÚÍCË#åAÑl+øü’Ÿ¸îW+Ô… _!|‡£µF µ{f¨ˆBÌ:‘Sµ¨šŒ”çYC¶+¸™„§î4Ê™úDHÔk8I–¥yQ)'ÄF£äãgë0(6lˆàæç?mxÈ«âO»ZtÃG¼ñ/xö\ä|·„Ï›n–ƒ“¡Úã€q[eÏ|.ý\6ÎZÇíåïðÜÅÁ×éõ.q)°5£ÁY§¿¥×ûÊ-éiëuˆªìfÿüG¤˜%-$bymDAƒX÷µe™ÈõÌeerLç†Ð “%uÂãÖìâñ0 r[ ¢Lô:ù¹k/9+î=­1d•½›Se .+øâµ+°††ô«vâWí}?s|Éò5ݺó#Ї~ÙöîYJIÇ6©„àó›¯(79³ö.^šôÇŸÞ‰²ÿ üøékàcYöˆ(À—¯ÏK0ëK##—;+WPô³¢üÊÐå#=ãˆçO–\),<î¹¼Ib®ÊÀÙ æÃq½×h÷…oý3ξùP7Æ)”Î=œöiSßy2~Öùù<\Ýφ|æ‹Á½•·³øèUÞ¸ÕDÀtÞhŠöYg¹­¶¢qãæÖ]SmüäZܱC~Ïk0uæGîêÜ#ÛõJ>íÎf8Ç ¨©±üb,É~…oön¯ÏÕ¼{Yj£®K1ëg½›©t{ŒinLÈÈ#ßcwëŽ"íòº{²Pi ò˜[m.¹„ ö¦ÎN½ãtsZC :$k˜Cf=—„TTÊtH½3˜ØB‚üóŒ=ˆáßÞ§£Ø¿gÞtßÇwâr;Gæ]”Ÿàª`îÂr¬÷?5Ûk+êÀ @XN†}AZÈ(ˆ‡}Lµ_Ý`”Æ~Bç2JßUxkòalgGZp1<#î~×yº„¢ÓF¥(Kâ®ë jWÄ›ñ‚sA%}Ã#Ý"5Æ‚Ž`[¢!ºWRÌApnRaV/¼Àæm;Ç,o Õ®GÚKbm:tå3û†_;êœKP-6ª­kæáâ¬Í;’>Öé !Ákï;Wjb^Ùö´z'm«Ú¼^Ö}®¹Ýïº{QMñ†Ï_<ήÓ^…6-šЧ1V®˜)ÍŒ $Âuùñˆ´]Ý ;}lü&Яµhi&”ÅBˆ¥ûýÛyÇK¡ú%r?’*êzqô·N)ÓŠ3E·íîK;Kh©0.H_§Géx¾§k¯qŒ6ñ>ÒËÀ#6;1XTc¡Åç…j¶¤,oûƒ`´—Çr W:µêM!£óáËò8,CaÜ ƒ† ag¾3[Ò̧YŸ·G‡CI‰f¼õ”—(ã~*äÝVC³ù=˜5_6™Ç{ †¯ƒVR®‚^诎KéÌ›x Un—JÆQ=ŽDÝLÂÖ}L.¡ ¦Í>ÜЂi)VêV6zÅó‚² ÎJâZ£[M¢ò´ðûãʵ6¦ÅˆOf ™Rž¤ß¡àfHü0ò ®ÐB7˜Ý„λ¢ûùÒÂáj ¾hòከg…´±–)ìM"…8اÛEäV4êÓUuÖUJõB³'L+2¥€µ½A@J`Ä"µmc]ŠnªŠ†¬ »ó ÙŒ?á¹ßÎÆÜ§BIWmôz–w³³H÷òæ‡Ñ!™ùÄ„~fÂÙåo|“ù¤:Cd?îÉ@KWuˆ™Ý‹‰Õ6Ï»ßÓÂÝoÜ®½ÆU"rY¯iꆴx³B†¼5û)çãg*uÉ2†@bÃô©H𬻏C‡,F£%‰T7’üV¥w¼nØ-AôGÊvÚÈY&·d—9jwöÄŸ0›ì”ïÐß«…%4×ÃÌWlz¶¼?‡4µØM0·“.XK}„vÞR¿Ë„ýlÂÞú´r ¥b̰£wÍ^ª?=‘ÚÛPôBgÄRRïíŠðå…Ýf_¬Jxžº 1mË>^Q“A›Ä¸ð>ÀØfQ ãûϹ¯?ù÷4}¥ûïpçJ×D«^ÏÁÄ$G†Í¾L)c®TqZ,º»1(T­K(c—ï{QšfäK†•:Ç7/‰Ù¼ƒy#1yöM{Ç­_©ƒ-Ù™O<ÐÌ=ßiT¤æþÛÞ#ÿ˜Ú‹ˆ·j ⶸԤ€\kåíšpÒ@t¹¦J¶uÖÒ;j¨Ð°C ¸~ÃfR†Q0Ryù@r×Dm¡ לúÅôç’íÊ Ež–ŸKŠ’¦“·»P G$Å“Y‚»"±a‚¼—‚Æ nD-çóóx,R’‘¾¤¾¾!¬]3yB¿ eùé}Í5-—RKô´;åO ­¦ˆ´Spõ~_S/A²m2N‰ºýÈfO­Ïdö4|¼Ú%€"üŒ<0ïq´4øbq EȽÀE•¬=íÀ¨(læîŽ¥Á/.ØoZЍµjZõë‹••‘¢úSrµzAÐE³Ýût´ìßÄMxAÝûsÀ«(Æ©2šZÒ4¢|»£ [8(9!äa?©ãÑ{mkça›Õf8¦~*mýÕþÁBÞP¡[Ò-f¥ØßÿzSpä¥C8ï¯ùaÃ4ERo}º…ix÷`ÓJû¢y´÷-;¦RÃ'tqhR.Î<ÿr7*³“SŠŠ/˜ ·°ü݆±Ÿ ]·3ëo¸…@›„#å¹’½ÚaSf}îÖ¹k;Ä+u´´AW%BjÇäl.¢¾ŸÇà¯v´&®…ˆÖâ Úã”6lÆd{L5”½­ˆ§ÒŸ)[^msËÓággITq+~í\BjêÖk1-:Kû˜§)6€År¨‡k,ÙN(Žs_M{÷SrÂElqýá.•A^´)À•Fn!Ag³Suèk/1†B®è0¯Z8)JMv–PUŸ-I•[èÓAXÃo¹/ýîñ¹ºL%oò³‘‘]~PlŸk? DZP\£DÛ¥¡gzÕ „'ZØbº‘8Žm¯9ÀÆ3±ö4¾«™³}Õpqݹï¬'BŽ{åR(þ [Ið$uµ±Â8.ËIï‹f£õž$+Ò°0§a0Rt¼ç÷"„Qr綘¤*Ô’/L[´â£RGEÙÙ¨T)¦žg.()ÐM‚«éñû¸ÙJj^@”8ÊE!)>_ËY@ùè³ò–N+ W Ñýüo’Åí¡ŽY÷úÍ¢8ïÏ¢¡c$¿‘ÓkæW š ì@w½>»SЩ^ÔâÅ!nx9/,\n£%iñN7$’*?XÇX¤÷2O`p¬g«'˜»ðjUîrÌŒæÆsã«Z%½ŸM”²ÙiüѲ3³VH¦J}ú6¸^èz)áÿ†DЛ>ù«>7áûr~Ø1üÊWM=o&õ§! \d|³„9ÖP nBjq¢S‡GígbìJSZ²†¼!uš”'ñDCî¹**ù$Æ 1u<ߺX4«Èˆ Nõ°ZÙ!Dè£xCI ÒäI»5pŒ§QáW)‡Éló¦lVYuÍ&î^uE1ˆ‰v&–‹’ljfº€ÂcF.C冨ÄÃÆ /‹eŽ!Mµ|˜xx1œãCð,³a9j ’þ!QjFÙ¿3zÃÕ‡üà†Y•ßìXÞ7Ôž÷í{«%Oð›Ô싹=„Î6Gêâ3Jêè}j²}ÖÑÚÜ0ƒ/îÏ_ž+sD‚Éf’ì}¾èz %Çž›C Qzo_{›¹®ÎtyçÍÁ(b´Ø‹#/]HÆ+Û ¶lxûF‰(9ÃÇe %ìõôf í˜!ôB„«‘µŽ:dw¸tx×ñÓ?»0²ÎÇ–IðZœ,ÁöðÇšn ýT†6.‹ÃX–?åß´§ +`’UèòíLYþø–åÄW®Î*rÍ sùDò¼U‹§übÝ:·AU,pK§(’Ñ¿]#æïE¯C:Zθ!4|L,ØŠ­°Iü¼ •>‰ý09h†€ò<=–!KP׎a+Š{F‘"£Êtò¶ÒMÈô“ûnõ'‹Qî¾"ª"Òõ:7¨Úü[ÁøŒhbboG tnYjLE³Xä‰ê¨Cníð´©³v†??o&ªOœªõ)Ðg=”ĨG(3è,o¿o¤Úì špýòÅH䀵lÞ[;¤ùûí“sc4w~¤ûÑHù`A"U§ßÈñÁš‡w¥ùÙœPg+ë­é:ÙR…ç$bHé5íPEÙÞÕxÉ€ 5¶ÚŽ5gëë–»¨$zÛÕ³TB¶’㕜Ö0îÍ+/”=œC·´'Ìðœ"/¡ÇA)vFŠQ Ž-gdë·Ú«çSuž J‘;)?¼À]³˜¶Î¨³ä|~û¥™Šjd`(‘Hº×ÈÖQLöÍ÷c¸OéÑ #×cg¤¹ê¸ú©ÍlÚù§±òLþÎ*9Ã1i«­†«%Zç)Ï é%ácMüÁºëÕÍÈÒóøü° ǹžÙã‰J«ž›•Yóº?[2/íöbr‘·â* ©Ó¡rS–¡.ò¯™ù’…VŒÞ&©Ò¤n½›6³…Æ òGöŽ!·un$»Âh»X¿Ôw@³¼¾2zð\ê¢G!ú ê(»£5G=w…ë¯Ì€c1êØ*z‹¸î‚ºC²®²À/Î8>Ðl”ÖÃS{¸_²Kñ&ú0–IÝ1¸âúµ%33jP½«Èqq¿Avåªâê²$«,¥’Ô •câWÞ£ŸÜ²"€Q¡#ñd3 èzD«-yX¸IýèoÔaU+mwÖ› _È®K9¡Kpzí(ÝÑi—Hqu>:¥«™É£¡J³MŒ¹eJ£!çzã“o«ÁGEòL©_üáIP×>›ƒ(3¢ï§(õ¡VMë9¾zd»pJ~àØñ”»°·´jf'@—ŠÆ+µãÙ²ïêGŽq/^¡ÂÏ˃ït[‘³t„?Ôƒ–€ˆëÃÁ빟I燨Lrß%"òls&#Ðf/ ÂLy%&p¡ñ¹aÝtJd dz¶cåqnØ“J½º™ì6ŽÉ‹)ûcЉ;fá¶–BZJ4, {Ro'æL9 %àÊ_©ôéþÀešéºð÷´NUA¾©Á¯´ÑN á’Å¢“Ÿ-0aò!$ž ¡pœÎFðé?ÝFéðÈæD¯íhBÔ2º™RÁ’MyE+Âäó %qzñ•jšç¦¸À}|ûp¤åáÒ}b]‹¹§åi°ò[ÆÀé—à-»M ÅþGµI{kýféä»n–®›Ž ?À±íµðÇ# FbéÌ =+LŸ[Zp«sq÷;™Êj{ƒ °ô”Pfý°±»R»yþNað ànsk¹cjq¯ä‡ú„Ê6a` ™®BSdØ8cFmù+Œ:l£FeÝ»¯ CÏñJõóv1œ)HÄ/_¿~pAüaîIçȪ©Qy¡å)@T%!6æl–ìônõæÝÒ> ñ)ìØi·l"ææh42™L4ûþ¾q†ÓÕ Ð(¤ObJÂ.Mò’0ÙStKÖÞ¯ÀxÅò&µ¤Ò7Tïçóçýo•±2\<¬·±µL»ãUIneX^÷ôÇM;Tä¹ß;Þì Õ ¿òˆr³U«)û˜•&w¯ýgúJ\Û~‡ â—d‹i²Ì„‘KŽø›t—ÆÝø£¨xÞµíìY0«@0vAëÅ2kï×ý4Ânu<ò~®D’m*ÎÅ—>†ý ó÷Àû„’Ô!È@RV뤷‚Û ¨õGöRöBË%Í…?­Öø aPÄÄéº!Oíæ%ðܑ´Põ¿rúbÂÙ°3T^æÜyê©I¬ï’¬Í\y«µP~È£Æ@gLÞ4¯/g'”©J!‰•¾¯¦Å6¢ ž" ;é^º©^© ¨v 97>×Ç™çgD•òßyÜ<æ;f i6À„ßHâ*¨µM^ö ÷=:ß]l\W ü\kŠR!CÐ-y+­ÖW’_Cºéd| u]_­†ÙöcÚ¢ìHK–Çœ÷*뽫GP ºëá’ ²-Ó’ûD=…,Q\$Ñ?¾„Ó++ìåC²‘Í2°núß1ZL°p/‡Ú`…·Ä±÷`ªI5ÖèN5—IÐÉdEä’ÂÛÊùä¤ààoá 9Éö²‚¯ôÂ>çPMÖÓ¼HkZìx…©0¢{ö®LÕ0—*ÅuSÖ?ݘѨs­ÙÈÍž2 ôºl¤mCãw¥ìo/ºzn÷Òp–<­Äø4(PQ]¸?¶Á8í#¤Å0Vªä¤tŽÏŒ#n:e|2‹©——lÖ»ž oã•=rêwØ&@%ÑD‰æ/,Ã' pWÆà^Õ×.³ñŽÔoýi¿æ¤Õ™>%¯#¯…7SrUå?%ìÔ§âo asÇ@†âRÂáöˆŽS'ú.aFa?~<|õâM™(MÇá§'Ž?çdÉ/ê°µ™«£k,‹f^œPžQõ‘öELýDîÈN°¼~†;§ºý$£ýˆÙÉàækd£C„ãØ¸nnÚR%¾…Ïì6 BŽÐ•zqRÛi)*dI9¹ £—OóÚÄŽ¤yûå*`Â`0çú02ëÃX‡ •™ðçäQÓû£ê$} ÖoØ®²~v› Lu¹…$_Äëµ ¯1ƒž|hšõP£2‘JæÏsÔ’â>Dï6Û|{), åG_2 kÒ}×pÃd'à@áv©~>ŠÛÛfMw›E¡„W÷|}‘îš¨Ú ÖDŒùVç‡Ê4'Ùôy?&t…(*B¾ô§Kle»!ø«û`J¥Æ-ãN%)»éÜ2' v¢4R'ø£ÓlÑ€7pÜC«H»[#%;•ÎïEÒÅžŽ‰S;ï;WÔB—j_q¿ð£Îö»ޙؾš î¯S šÿfñɽìÉhÓæ@ƒ•(çê^t@a8Ë÷¦™ùRŠ×·×{Y$Êž|Br1÷o?u'É Wò—¹¹H¡ö¸êgiÇ{f!ï‰ÞRÇ‹&l{„ôdz*G¦Ú̺:5Ò~å¸ î1Ï*Þ&ogú;œñÉ©ÚïÖþeäå”l24›t<ûªQZ§X/Ú›)/¯â»R ªvApÛõœ•NÇùê`ïì-3ÐæÎt†ªuµ DÕÕ‡¸nBz†EWš-Xȳ^ëÏÅÝí|üðU)è\.Ò)2lR¬/Wz.oŠ^ôŽ hP¾h¿ºŸ¨€ò#UëAý0ÕâcPŽçh/ÔzdÁØã&ÇAí2ºäs‰?U¾9y3¥Ú6[êf<ò€p)hÕ¾wxa(i9hó |Çx}T” äÚ&Áx Oµ@‚D­3ú¢÷ '¶½(ÔqϬ›x3)ªãPrD^˜T¾µˆ}†H%vtÛnLóâÕ‘y/ýV©g©^a> {FñÉHB„~¶Ö‹ÆÆ¨Âé2—ŠE0;!†"0g¦èy×Î;îÞWwVfC@FÚØÚ;_!ùŠø®dvØ|2ú—<\-ÞA|ûÚ»Ûº`‚·’8– îA߉¹MRݧ™1ºSlŸJ~ÂRò 6³cÇʰ˔»°¨Î©©M™ÇábÐgI ß^ûŒÚÏ\Xrã‡wêSgwmÉãzo6[̵úgÐ`Ó”©§ß‚Áp–ÍšöãSÛ(Qø¶‘P^,4‹¡Ê(®Åœ¹[ž)Õ´`\:¯¥¿ Â;1g…Œ²šÏ4¨s)ò¿ãåPÝà«´”¸—›S'Ó‡(z±ÀKÑ0£R6Æ9`x™WoOcÊ8'?*Í£RÔB“B¹{¹û‚ßõ¾©/¨OÒ®êÈÕ¤Þa>8Ëç:A‡æ)œIãhÛ©}ƒ^0 PU™¤{PÖ4^T@’Øç-ÕLµ"aa·x6‹ó%j;3*s}%¡6áðMrt`¼›ž\kéâÆ]ÜZäÚ›"ã–`ëóûÑœe¹ÿgŽíÈ›ð ”Áz3 ÌÔ¯Ûb÷÷÷|ßÌjUóЮu‚༧Ôuä5 mêh»hJÁñ§trA…¥ñ;ûnuž>×õv*ÞPl-23P1ЕŽÏv¯Á»ˆ3oÏb`€†ÉnÇ!G3‘£ëf…µ.âÖ¸¨Um­€$àcW“êpõc wàìÜÂ]ß'¥ž3ê–íI)u”ä«åNhßÇAI ^ÚÐÁ·ðÅ PYÈû¾_ã΄J¿ÓøÐãuNŽá*ªZÌÙȨÍ:ëÏ”[bduÍͧ¯ö¦‰¥ ûÿHáRfl÷LJݜ ü¯âXö>´.@“|#äDG¬ž,I‡0ð„èÔÃÉ?U2 ªbFO‚íÁUÑ+YÄùØÐ”ó½„]—&pßÛƒò*˜¿R*U?ƒk;›O³#9£lÐ0!þ‚dCë÷ªü·|[—qÑj Åô´çŽZN[ée¸•÷?M«1¾•uް¾ƒ”\tï²(ÊÒŠÿG£Oôêey´Ž!Zy$ìá„ jõ†rI’¦~‚Ñì5ô¬÷²˜%CÌ´˜æzÆÇ2±ü(ÇÒÕÚäÂÛp^»:5¨)]eŠ`ˆr C°ß$6ñáˆûàxy“PmÒP¿gý„6¯g-*^áêoN£º`÷{) &=C( ±¨Må;ÖÀJ¿g𯸉&zZlÁÔâ6Ãò°XºÂG®mSdzPÓ#£µh#ZÊ;3m•¯Ýs7‹¡E†¦ÌF“[›AìÕDZõ}Üð8'ÂÂÈ Ðv éófÈ–76¥ØÎÉW¢!®E„;{ÃŽŸOÊXðÔÕ2ëj{¨‘=¤ÂÞŽ¥¹Ø¯LmkÁ^¿¬¯jRÊ63aˆ>Gþ‹Þ^4ËDsTt~&\ðë}Í“Á–xEð_©C£ãi³¯ö{Ø?sM0ùV@î©¡x\5ÍödëðvÛѤ°UÈ|ÎøÞÝöÇ X‘Ö±¸äÂÈ^H‰“xðÿ9Å~Cë—ú1Ê5QÈ‹ã2ï+¡æ¸)Ie(™I¹åHé¾Eò ŒÑ0áÆuï—M¤d~üâÆPßUMb•”"í€âù¹íÙœú5®7aÏ?ø‚íØÔˆ¢{ªÉ3I†Iïîéíë(-CÆÄ[=õ¤$×Å:Ÿú<7¯}¼éZTS¦‘Io#ei¼ƒçma™i(¾CÞx[bË‹óçÜ jKO‡::ò´x™ÜCÛ"ÆSp(±/þÌ™¶¤ß?ß'ð¥î"ŽPt ”©"S`޼pÚK’Ñ_¹;C÷$Ä2^íPÕšŠùÐóÏIk2Îܬk'8³ þ’éO¢éôÎ…t^ÅßG¦ÁõÒZp˜ýð2Ǹ'ê²°#ìêKö»på"£ ¨˜¿d÷–§SyÙ#3I îÓ;GÒöÜDŠ#^j<©$•ÙŠjRШ<ø×Y_y5NRþæ±÷JŸ–þ#Õ0¯¶Ôz”!Gw=)ãuïê`òë¨1Rx°´ÑQ yEÎyØÁÓkâàÞ q70Ò§ÛÎ:.MCâÕ"ìúGɇx2NË)ñQâZºvDBÉÑpR¶Mc6ClN»˜pZÑdˆ•vCs3Y‡ê hâýªi=R!t(…ù.´Û2Ã1A×UB¼j÷Þ@9=mK ¹ ²8á#¥|±Àñ%”k0ûr†¼ÌëB”gñû`+Næö$uh­^y^rN£WÜô‰µ…õ¾¨›Ðï†&súƒG¸]ÈÎÎÈÄÉ-³«6šµ¥R޲l*íèåBPC‚ m^G°¼)y‰\ýbÙgîDµ© Ô7g.´évú ªïu?š©Bù?+¿r×b9)ÞüKë€ÜµºbÿÄSà“Ã> Á•oê°Š÷»«2W¹Ü®~……#Í“8Ú˜oíŽ%ûkå{jòŠRø„¯÷[p1ÉYž½.­üF˜$xîÚá”'‹­zÃHDÄRjéìg†tÜqySSÇÁ±á[ <µü}¹Éâ®?ºvE«W¯›ñ±›ï“Xhл1Ç‹Ýë·{D¬,$«Ÿög¥vJ­œ­{Cæiº~ˆ°mP¿ý¬OñŽs6ö—ÐÓ&0.Çý—WlÞ”/t§u_³pOêY|c}n“Z1Ñ×·À‰< *òݦƒz µ}ÞôRãz¥G†² ,t|ºZ˜½’Œ-” Ý*Ç\Gä7:äÍÙ¨.ÃÑGölÞ‰yU!8;—2i9òáGÆŠ‡Oó¼ÈQë X_©)NžØÖp¿§Ô犚™\þ¾ÿaÇØ‚õò >cÉŒÂÞÍÇÑCƒOÞŒoüùMòÁ2áTK5ŽLpSÇ`véÝ$FÉì\ ¶/2çBCÕ)©áç¥e › ×—¸ÌŠK\~ŸgÜ^*¹mðèdºŒ/šu.á)Q-Ç”`ÛÀ÷Á`ºÏK§¨ éç?k÷ç’Q)«–û”œ{®¹¸”œ{(&ÏÏb?G.q¼RC6Å|X,³ÚÝã$¨úvL® TØ4 ¶î*ðáÉÎÓecÎv'ϧìJ0?!RÉt¬´}Ñá £÷ΰH ˜’œ¦o3uµÃÌ‘ù„…{+vx3$BãÝP–VÆ`Á¤ä\k€²ëçùkÕÂ<ÀñÍF¢2°$K+qÀ¡4éöÌ>þY¿x…_òuÁLÿ)q!q—ש$B+EnI8„²ÙYCþ¥xË™Ä(ÙùÍõÏŠ;áb«$(Š·à£Æó„rcU«Ô蓼ümМá: sÍ꾃wø¡ž|Q*F¡^ƒŠÈö:¼‰qpÿI‹Ï-Û‰qÝ"½Õ&:'èu¯÷¨.˜«ŽqA¬¶KÉ.„øŽSëíCØó]PÏÄ,tݱ‰jë ¿æõJ¢vhìe‘®Ëš°Õi>`S0Uúýj5~ÛºbãzÖÙøý*(lÃèû÷zŸŠ%”ôÈ£ç´Ë‡­mFh|®Ô˜î‚§‰Ôð~à®2‚Âý&š’XvÉ’QW€¢·áÖ?!¹Gìá½M3ކÒÚuäùêÞúˆ¾–€`c·5šhÇÍ8Çr9mK ¥×(ߣè&ÁãˆwoSó†ÅSõ:lMÔÞƒ¶‹¯ý¢æ¦Zæ§ {óNÒ8-×¢ñe}öäv\ä÷ö!äFx^@º±Á›ô;;®¤p2•Ÿy Üƒ 0Éß鈕„(êFt»tÁ&`SÝíõOµ¸±Ó€5î±ÂÊÔ½Sk GócYN`¶—¦éÂéAZAiÑጴì]3Õ’WJÄO:Çÿ½…#Ñ­VmÜ,V¬'o÷.~ÊE]!ç¤>Öyg¯÷YÉ6°=þƒÔ^Í1ÓÀ›;ÜâÕRÝÈÞŠŒ‚þ‚Œ¼¿-s³¾@’‹®ªÕÏÓõ9krfÅà;;¹´ú¢¶N»þ¼§áõûº×pÇ>‡Ò¯ÿ÷—FŠƒÞ…”°K"–(Í4Ã:HíØ˜—¿¬À粘¡Wí\[agßÛF{ÂZÈÁ­ÍòeµÐø'2Äë¼»¸òBo.¢ý-Õ:>ô¢mª@w'.×`W4!Á¦W,YÎ'! =oØבË>gcéÍêFÏò’Œ"ÝRK删°eÌsäß‘uÔ•²?…nêH'©Åz%¤ÈÓÏñ0 &IbüY-æ0ú›©Ž­è´ŽªXŠ šx­,LŸ=JD¨® U#ˆ…3k¨#êÊW˜G¡È9éb˜ †’W~Ê…J>XMâ²ñЧ´C&Ðó ï›] 9Gë^ýi–‚î’ædÐN dÓƒ¾)B2 W€š3¤_Û£Ž4AÝ—/*×èùBè› òl¦A™Ò·cžOd3h°µ @¨öyŠî[d¢×ñ=gèq_ãÈí{-F’ª¬ÎÁùrñ"f¼ÚÁÕb;:Nuf¨“ÄX%í™äà»rdJèE×–`ùüt’Ëe ‘ÛÙu&v¢&:[t¤èh¡¢¦~ تuGN›¯ŠúîG³MóVªR'eNI—5ÁdyV0.µÆÊ Fðuzö¥%ù›§]Uê¡2ª¥Kö}±ˆÖîó`‰eÎgmÎ ì÷¦WZwh/°f"û=Ú®ó:F+EŒ.ãúƒÇš¥”Ò¡@Ý÷kŸÕ §°šÀ÷Œ9ÀˆøÞ5¶(S\±Jçç{âyÉ$ ›OÛØøe#íÞ¨À†·‰œò„J§:Äc1½ŠYå>%}›YøUŽ€Ó~['%%ÒÓU;+f4’Ùƒ•KH3PžÑ7~ÄÒç¨Û{¦tÜd}Éd’Rü½šЈºg_íÕëúþy²Ý 7¹üŒ.ýûƒòzAÚyüu¯kG}ÅÞMˆ*"¾ïç\Õ£vLdz1ñnfã`ç„Ü/"ƒ[+Û/íy}‰ˆ 8±ÐŒî_µ“U%©ÀŸ'o”$¯´³lÍä4¸Ø‹z?NëÉ•±ühù´B=d¦;ÈÔˆaÃbÞ†çÿó–%!Õ3ɯG96 TW ²®ñl±\§ÛvGf5'o…"¡âN©²**°X*ÉIݳÅx>…v,¦Ï-.“ÈÞ8ß AÄôp –Ù´òËo8G-‚k–6 HQVÙÄßÀk!¶õd¼kÀŒÝµAV¤nWQ`‘ÑuŸ@97޶ô«ÐMúóÁ#ŽŽz>„‘HŠŽAoÖ'è`Ÿ¬[ÙSZS¸tZ}{üζ•Ø6Ï;xÆÎfï Œµâަ]×*»zg™¶Ç;´ô(,‰ï¢½’JR Q4¦ÊÜRš+7„\ ë…BuC‹øvjÉ1­ ×”NØþ?ÚÕO‰‘ÔË'ýx—e~yÿíIflzqÏûäqnŠš£+u'CûgÜ8kQæØÎ±&'$œ‚eÎîÞ΀þuz än5Ó²NbUÐi¾3¢ÙŸ”è§+øÁÛ¦–Á ÆÐâȰY&~Î[K5qps~—ùañ|­lúag‹^ѽDVqöYÉ ™á §tã¿èR Õh~À?A\³™ #¬óúÛøÁxiF˜,ˤ]W—Y2ж4·!‹fú¯ýÜ‚ÍZ]¥º°S~9þtÞÝ{Ö<æOä˜m{¤Ã %ÞΧÀޏV10Ù ^ÅCpß´;éSÁ¼óï|áO&¡Ëáª)¾Wj¹1N; êýí6ˆ1}l°TÈøÅDãyîðz‹…‚  v˜hz¦†'|Ç.¢u Õ™EòèÂø›òμû‰ýñ; Q’¥=UÇ'BÛ­elV—Ï2Òð#'Fx_‹þT…Öl-Ī‹3”¾HA+5‰¯féä}ó*€ýó 8â‡]UxMGX^ÈZЩ3Å¿@dÔZÞÉYM’…òU-BWÎÝ™gašü³DeÈ .‚sçöFZwíÑÌ+¬UoñqH%]L,nÖ^n€ò:+ŒNX¬“…_ˆ>BBˆ™¯ÁÆcåL,ºJŠZCLYW'ë0 Îþ<™íQÂ\ƒ/.8Œ §à8úÃ#9jhÊAÝè of­² ä•íM†nhT'̯Wƒ‹­Ìï0þâ®ÐîEuØ{ï;>ø»OçͰ®aÀæÎÃ^kE*ÿ2(81oòÖ7ﮓ٫—‘ýRé„/á~šqað9ý¿»Äwh¾O%’:ïÛ^ÌTÅKC Ž{ÁšÆ‘ç[«ˆó9¢rõEmê²ïKP缄B2]ˆÈN*Š íÊgò¨G%sQžS`nYmÀpú\‚>¥²ŠÚÅ“!Ôö—T=šþÄ_jý¤À4ÿÖþ(ñ—89>öÔ+\« ·4š´×Â{ÚrÁ±â0N]IÐÇég ]•bm¸Ôè*90|ž„gjˆjß#qØ ˜L7Íì³ßÉã 8{ \’Û:3k¢ßç_nñ˜sw­„U>#Qð}%2ÀÅ»<ÎØu6/óÕj÷R/‚iÚ´-Ï™C$6 Ç9¼f5o ò>·Ê"4D§|íP¬/'t㯌ZIþ‚ê¯Ît*Ž:ž‰kä…óÿìÇâKDÇú x«ËµñjxrrɃ½w|‹ìÚUˆ‘¾Y!éÈI,‡¼‡Ø%ÁHœÄy2*÷Ö˜ä²êÿfu9 z¼ó¢3j“úöb•,j웵$ÆÊ·Ùn°SY¿ªÃçÐíÜlÝý9è­OYü)Ò›ÃÒï!éûšüÎÌPB‘Éõpõøá®$ÈùG¨ô üÂCî-éR&^.êÖD_—&¨dLKL£m 0Z4-#j¬¤²Öܼ†uRªç¥©xyÍöΉ'ú2è=` ã$t071öm<\c5Ú}.¤däƒ@ÒEäýÿ€Tá 0S8íús¤­e× Žv<2K±tÕ%[î•×"ZRÙ¥µëÙ´lðhˆÏ! ¼:]ëÚpÿ ëœÜòåË+¬1€k‹7ž¢Ñã!y½¶+nèâdC:‰qOE%%xyÄ% *Úœó§Ge4®¦õ—›E¾‚^"hØAWVÀèA)ì©ìÞˆîþÃ)w»}Ãó?;òyUõ­hÈÂâÿD<€»‘öß|“á'–—÷Qj±™r½½ZÍf£Wˆ÷û­cü ›ôq쫊ybÓòKÖ$1ä„ËïôËØÍdäaͦ&@‹(s:®Ö€N¯#+mЫò¡´:­’ì¶´yRC<‡EàÏ¿¨ÀéŽHÝ ÕÈfÎÍö!ZÕ uê§²˜ò_×\ FLj„@ëæ¿¸_Yhwïº`¿Â˒˪WÔî­›ºÎ×í.ÕçFuœ×u”³m:W(-DôT¿a‚Ì6ÍŠ'Dxc ÇAÂQ‰F“æOWî~Fᬙu×mÄ墰ÁŸ`WúARǹßzÖD§à„qâBÊ Ø¤Žo¸Çݯ–‡²›7+§¾ãÅЀ°NnE¶Nª"l4ä,Ú–*-ÔjBüæ®”ò¤(#—ôHÄk¡d{bœõ<ÔéÂw×\ǘHxFâáçÁ×QY›MhæÓt'f»xñòK¼8‘Ÿf˽ÄËÒ-Ñ‹:,B˜ÀÚ¿^!Çú2Qè…g¬ Ê9LÉ,}ĈұWϦWÅ“€'oD–‘™$J3ž1X”yçþÌ6¦ÖñR!n÷œà§ð\¬æÜï™]Wê‡6XSl¶_·:¨‹Žª†j‹ˆE¬ØE+FŨRiËÜQ¾‚U"«¥JŠîÔQ]/TB|uöN÷õwŸ€3IƒUÝaN¢“ŒÚ˜­Š¡ò™ øŒ¾C¼ ?aýÒ¦f9ÆÈHQ0Æ%üžy,bjõ²À=‘-çŒã÷ênÝ«/Ë'Z½À2i˜÷òµy¶¿1G¯c~](P,Øï!‡ÎœÉG]Ljªjµ 2¬Qö 4È‘}“žŒö~7§Ù•à©l¡,²Q~ñ¡Ð¡-"¶c¨jÁL¦Bù;÷•j®íϳ±W{ ƒ€[`l)å¶èw¶þ(¬”‰¬øb4˜ƒ&ˆkHz+tÖã&4²˜Àt(ï lá>˜sêÌøêç0.Ô€ @#œ ð¾æ§nåÛ¤»ÇTnÌ“óÐoÒ¤¶é<U™ë¿Ò„¨?ÛM1%Áô5h’Õ³áooà¢Ë÷ƒKÎÁéà±öT9«A[KV6ÛŽUÎíí(ÌçÏ;¹]Å mææÉiR—êóèçÁΔ ¸oú5— êÀ¹®zMÁÚ¹ûkË´‰ôœÛ)ÀÏLᛟ²“Fü°Jò=½²lÈ‚VXµQîlCÁ—D³ ÍŠ¨íy¯÷Å”):Š‚qZ¦Q Û:Ã3°`Ùzä&¾ù­tЃæê‰qÛºZ¸ÚíLU-¯¶{ûL-ÝŒ+$R‘æ ©¤{3½Çï…Î[¡÷ì‚( Îçš% Zk©@Ó10f!Œ¦©êÏ:@SÏÕñÚ‡égÖCBË+$A0Fä5’Ž+=Y?ý´ i£«âÀÞB0_2}õhõ¬Ma÷/¨0Â(ò\vïºk5Z!Q™>0)ZèŒOº^x6üûOU*÷ÊîkÊá:X•ý¶‚ ÿWâ8°Ô8«ä.yô­Œ6ûÓ%ÖìCš"Ò0›î†“û-„r hÏCì2Ð2iÔ ¶ëuão;‡Éhf”0¢ÞßDAжBG¡[P¯ÃÊN;$ÝŽ„Š;ŒÏjcFþÊqf‚&0®‹Ýëß› âŒØZß8pˆs®nT§#Å(ái³dÎã}2Hré< ë[æI¦qVÁuÆÛQt=û<ýc§²"8áêq «ù+’’i×âåäe[¤T³>ðOA#©VX¹Õ«Ô{uÐ4?¢©–IErqôè=ŠgxŒ]œˆ#ã¦V ݦ:õèBkpÐAa@-]=DÙå÷‰·‡zIpƒÄGcj´”úpxbd1ׯÝÅI|<èÒ”Mdý\@ñ‡.°Ð Cûú+Õ_á M¶ûÙÊ+J_þÚZÑög…ο¾>ÐÑÑuoQ,‘úoè`›vN0̹9e‡ÎuÏ£”E´ tpo^Èãu1Ýb€sO‘/=ÄÌÖ0ðJ=–^Jུ­ÑçNgûŠI‰Ä4—Tž·UÊrn ÇC%œÁ{¬ÃÚ ¸×(•7ç´ôç'pÄ;Wƒj‚±U& ÞÌX-¬úF _‘ ÍÊPêädȨ—ºÐp"LÝp,¾„ýâ›ô³öT`"çB‡QŠÓÖM¿ªÖÁaÊ »}Ç ‚2&«öÆ~*íÇ0ãNó¢ˆ DîÔNÀ#ç3p[—ÓïjòŸˆTåS9/7óøŠ­a6(å‚ôžÑÏñú1ZR¡¤Že[iû]¹sÑ«`vúñGL§¸¼$2ÙsØ…«éî_— ½}¡~Ý|rx-Î~v¨r[ ñ7ÏBܸýפ0¾|oÄ-‡ð£J¢Ä‡º,.´·qEW½` ”F«¾•ùXCÐaoWÚbÑÁÛÉ© ”#{i´ÐŽyÙ…\bÙ ?jXò®ŸéÓÆÔ?ÍЦƒüÆïNé6gŽ_HÞ;=]²d_]C2Ø‘\v=¨ññ€-†=|èÕçð¥Ï£+(ˆ*Ór(µ*ÓíXˆ)f+•Ò@ûãØVñ©IA¥Å0ÈÐô¿?îüuÚ–W¸ÑvÒ7àœÉ¡öÔ~¿jÖL¬£Ò?LÛ½ê&ET¾¶›Ô›ÙÅÙ§ÈšlZQ˜ÇûìÌ¢U2e0X:æá‰Æ( ÙNn/º†ëÓ®ŸÂH×vÔ1,ò¢×!Á°Çañ˱†÷vË¥åf(‹ªux[Ðï†Êøœrޱe•öÜô>jÔTíº>ˆûYfS—ûJð4°ÞpH³-<$}#^è­ß×iVÄS©aIÄüË]Ôt*Y"™gã U$³ ur+´]uø„¡–cÂþ…Î ÌÎB+ëÕá(ZJv±þX”m;ôÅ„8’þtv¶0H…¾O9ùxw r¿/ýRîsƒÊ@¾¨FÅÿÌ |Á¶7hu@í"T¥¤Xr%'˜ñ ÁÏ‚ “ÅÈ„˜Ý§ j‘5|h=k ÉÝ)ŸrD'ñö—0ê®ÌH]ŒpØôË¿6 ç´T`1¢3å¡ ¨KÈÿsX07½±.XU4@Xç ¹¸×)")› #¶8ö}yè¾N;dÖ, >¸@´žùáI²+hHþzÁE;º´pAZ.-ITÀ‡ ¹²½ê-Œ´Fß)ÔjQ¼²µSÚC8|:s1Nºnr:¢¯uúàF;ŠÊᬰAC˜pç|ó8ž-~ÝJ|› ”‡IÍ6ãø’®!ž1ÍñE¿[h¤4;øˆj·E—IØ endstream endobj 513 0 obj << /Length1 1379 /Length2 5996 /Length3 0 /Length 6932 /Filter /FlateDecode >> stream xÚVT“ï¿§$F‡42 ¥·‘‚ÒÝRcl0`l#ˆ ”¨ ¥‚¤´"Š„ "%!JŠ€¤Üé¯îïï9÷žóîy¾ù|žïçóžWø¢™¥¤º;Æ ®ƒAã%!R`% ¦±… –‘ƒ¥ÂÂVH¼ü+@ØŽÅ!1h¥ÿæ×Ä¡x¢M Š'†cÐ@ D‘W‚((Á@i0Xñ¯@ V ¨ @º¥€4ÖÄøc‘žxb—¿–@˜(¢¨¨ ñ;¨Ž‚c‘0(h Å{ÂQÄŽ0¨ÐCÂñÁÿ*!rÍ÷U¥ (œë¡"* Dâ=pwþ‚ 4¢à¿I„VžHÜfK ÅÂDƒG㈠þhw8Hì ´Ô7šúÂÑý üój€)ÈßåþÌþU‰þ …Á0(_(:‰ö">p ©Ž‘>/„¢ÝB}pb>4Šôº~ ÔQ7B‰øþD‡ƒa‘¾xœéó !èWâ%k£Ý51(Ç~O ‰…È· ú=Vo4&Møc@¢Ý¿ ¸ûû‚¬ÑH?¸¾ÖŸDà›”ƒÁ Š` Ü‚y‚~· ö…ÿvB~™‰ç#øb|"x'þ8hˆÇúÃÃÿÝñïº#ax Ü‰üSh†#þØ'E¯ƒ‰ÄƒÁ¿~¯œˆÜrÇ }‚ÿ ÿ=\™…®¡øoÀ»440A@‚¤´PRZ „@¤¥ ÄEØ¿«üÿ/ì¿­fPäŸgÿSQÀÿ€@¼»¿`üÉ ‘?å" üw ‘Çp È?´wËaÄäÿMþß)ÿçUù?hÿŸçÑñ÷ñùíùåþ^( éü§ŸÈbH4Ü ƒCþzÍ%!`ðøˆZƒy_%8â¤~»àD)ý»¥6†qÿ¥9i9y ‹…ˆƒ'îä€Qœîð ß¼‚¤Ð<1H„D`°€_ó”“‚pDò€†ùc±D±ý<±ë_ûßʆÃà0Àø(võ–׫[o*Ôy%—ú”‡„—lŠJƱ þG T©¢/2#g±ûê©Ý­LS‹Ú"{jü§„µ7¯©bê’ÍëCO\’,—êcìïúŸ®©WvðÑðJZ©-‡žú…ÚÜô&CÚd œãç…Á,õ °]7¨²£tòCôè’ùò yCÚ“Ò’w­o çº=á ÄKòQ‹±l1ïí±d÷Ÿñ$‰ÂÖïÊæ¤ïŽ„L?³’Æ5s q9pò‘ï±|¼DÐXM3àøD(.˜Évô/Œ“™j&qÒ ] Q¸ŒLºòRµ‹üâ²Çüõ&ÚÚ´„nlùDÚÓåS‰²å¾drË+'à½ì®L›„Q¾R–êWM'O4^?:¿ a x‘[Yyïr ÿ6öÎD¿Ê¿î.WZùÅh=¿9½ƒñëðuG,yG$Kà"²¤%`!ǪBבBãž,aà\Vu›‡‹Bb»ß)Ò9²ÂÁÁýQŒ‡f§J<ÖÛ³dˆÌË4pµaÊoŒfÛû’Dò²‹jÄ£?»ca’Ѫû…}#¶±É¢YÉi#wøY›¹ûøÈ iîz·¥-ǧºnÜux^“ÒÚ½oÉBO›&Ö«šZEyJõ9eɶÃÓ˜´™t:Âý¾ü•[ òŠ'wÐXaΈ<ºÕ]'+ª“›tÈPû~ÿq„ÍæR1ûXb³/Ò;©ÖÕkkdû³ksFU‹v™µ(†zók•í6­—† âNËdsm”Y·UÂe]áG¨‹ÐÖ¦çôÝþZîlÑc2÷Ì©÷Ó5¸,Áþ²t«YÅA­s…uó³ƒ&‡×~f'@Æx>.äÚÍ{§*p ég¼Qæ9Y º»<¹dõèL´$ü¼¾pß™ßÜ3}ÁJIc–äþU› ï>†Ö Žuµ™·Ã“™¬³òž[Ï&”=Õ'*fû>P*15 &bÜFêfØÀðFÇSþ]ÆÜ ÒÖÜ>pr÷ê¹=˜Ù Bw‚Dyö ÚÿuZ÷ñeBäS³š{ŸVx°¶1U«ÜÔ!±X»[ª?qJy-YDع¸$mÓ\Ë!ZÛÈýäëÇŽÎÏ"³Û¨­:.DÕ9^‹{Ò`N×™¸+#Ô.ˆtÿ³9ë=£ïy#éC ÇŒùP/ù{ ^dnŸŒÑˆ;© P¯| Àh÷üÔ â/ à]ß°«ÑR'ëþnû:û)U×шJЄfkiÓšÜ ETÊîÖÅÀÜ!ç/Ét‡lcíc)"仃²’ù‘ðÖoo‡êó©UAq‹ëéª÷´*ýà~-i­ÌOî–ñRWJææSiol…ö¦ÞeOÌ“Á¼/i?,&ˆ›HVEt¨ôÇÆ^VιYÓ©opÌÛ@8}ˆÑÀù¢#+r¤#!4™#eí“ ¯ò52Ù½a“÷Ò’{†áb7ëT’î²?]ÝL{M¡XÊ}uðšBýœèc³`Z…ذ)ç*”?ÎfæX§ôQ|nÊ³Š p”|+å5gCrþ¾›ûÁ?ÊŸ h\aÔe:È]îøÜ^ÓÞ¨ëÕÀ°ò6¾Íò¡k¢£3#÷Ùãcñ§,!h‡Ýe3M¯” ]*u¸8@Ñ^ˆËí¸´úSß@êÃ-ÆìOk¼zËŸ'ŒmâÊ¥ÌÁ[g7ñK=2’e¾ü¤}d6€9ÎUK ù~AwÚ)(¿KNñÕãê0¤ot—ê8ç \à}p‚Õ½ƒ†ÙÅ)kžJȳJu‰Dôñr»ôm'Ê_j¶“äÞÂ.ƽìK=Pù\ÆÈ/{‰Z·C[à*ŸQÌð¨ËHØZÈ™4ÕöPC;¬‘[™ÌÊ‘¹ÝÈHŸ»øú™˜àÏe¸Ð–7 ~jÒ+Œà'cë¬ARrùÉ´È)+§}I—'2 ýzqä½òxCíDNçCѵdBî…ò*Ê1òfdj“?³³®§Iÿ¥ÚñÚœoz"Ž>ˆ¢þHþ|ò8ïK ·#㘛—YľRW_&/-ì_Rý¼´†nRÏyCÈ̪xÄ/QÿKÈÐÞ]—µB™ÈrÕyÏ.‹°‘²f¼ñ‘2•’7eO.Ï;j“ÄsUbg«d¯g©íùžnôâ7‚§i¸g1Œ*‡RBÑO¨Kú‹Ëýæ–RÀu­GeRi›øA}懜ÚC ›¤=´qN7ï":ŽVl¾–$—Íx)Ø@] ÝÍß÷$ ‚CËE<’7Îö•VxÝLÓ'¯eÞÔ{þ–jXÝŽlB{­>¥ý¬è‡µGö5ï*¿"#®¶J²åÑ÷b^φê˜=Fõ.Ó kT›PBIIEƒüÒ…K}}€ zGÄ—%Ø…ôÃì¥íÇž)w‚œPd)rt+bØÍƒ´š¦„«ŽW¶äüÃ7—®+ñ‹ëjF(í¾Ò0a qßX‹qxˆâJWÇ«Yö‡®ï÷g£&Å•+JmÚYõ(msÌædvBÉr|QÀõÖî +ÕŸ¹º®ÛØem¥Jâ^è¼o ÃŽT¿±ÏÉ͉˜¨j>ßu¿w[×xÎ<|XùžYÏ–V¿Éç]#f+ßNûw¾‹ût\±.°ó'J›³$^É_‹g•FŽ€}eY9qL«=ŽrJŠvÖƒ@¯x2‹ŒYA§-2[¿ªÌ-‡Úâ¤ÅúˆÇ-=è¡¡Mò'«[ÁYqÔk¯¼Å;:»’{Sn§®”¦: 40šrOjÃøRÛ?¾=Ñwrp¶’ ®ªÂ4.»Û©•‡nݹÐÍ‘@+öµ˜»1#8p›ý”‰™Î0›±ÿâNÞ¸|uMæ€Ü/€"]J§Ü…ÏN=-W'lÿŽœ­F°3SX‚­Êðtˆiªß2EQÑ ¿Š¨ü,àíŸXýîðî)~¡"Ü2ÕÌÆ^>å9p…½Zña]W±ÜQÉ*S A¿áÞ™ ë‡às+‘¯0š¯§×£øÕ¥•›5U7óß¶XÄ2WZ<\º%«øIi‡јýéVòW‘ªvñnd£¦wÃð?àYÍ?É9Ɇ'ÎjŒú!ák—’ÜzÃv¥£m¿g0K­ÉÝ‹’Ú¬wî+à«dïÑÝrP­Ü¸¥pëž-d›ô9½Ö5³EH—ÓaÜmˆA#ëAjÎ4å×*|ߨ´¸³UÍ\ζð˜ÜÞï†ñ©‰Fñ—a¥ñ{5|${34S¼³19wPœl–”*l-’OÆC“îÑ]½Ñ·pÝB¾4‘w'ÕuP¥¦†©îCxòn¿•î°Öï ”aÎNÿ,jaÇ(ÈW[x˜§X€ ‘ýf'ðJÐm1܈#‰Ö‰0yNB2ïE}9ã]BŽyüpþÍ>ï¡4Ï'« tø¦ÔFYðVSOjh©KÇÖmÎÙÄÚŸÞý"ÏuÎPôⱬ^{™C)’ð/2–cÏ.ö¦ïôâf®¼¥ï[œŽ¦OKE>¬ÿ¢¥ð¦›]ë¤þ°ü»àÒ‹½ÉfŒö±±xì[‚.ýpGÛñfûxù±øŸBÚ{ÚzóÔ!QíqôýœH-ŒÆƒLåМ´¹´Ûy›¶ŒF[þÝ­*6‹mÿíÇÎëoœ^+H F?oŠÙ~R`[ª±Ôf¯—«ÈO5Íز~¯¤ŠyîGWÉdëÈøóýùoKüÙ~ñd…f³$ïñ×öÎ{’.VµvöÎ[H¼P¸Ã¨íFÙ±\ç Ǧ̽§Ò–q˜Nõh»c4“í _ð|½§%‹…z床tû eµéˆª£€ßŒã ÖWÓè˜=ï=rY—0þÉÎ,Á:’W“¦Ø#°IU$S½‹æÒ³qk Êek†¦ дáâÆÅ˜ádWƒžçŸ¸¥b:-ò{Šƒ!T^T…ß|ÐéF•?\‡ý쥑œÏGÃ{Kýëã ^zjõsB·» mŒÎHEª>6yë­^ÁvÜàX×%°wRºPß.û2¸x‘•®áV4Ä£ÍÃXóÑíÛ¹jÿ4šêãwŒÕ—2m¡è¢hà ‹‘ƒæÚM·¯ sL}÷9E‹ýÂóW§ç¨VÅ®å1¡(;Âx(Ï.„ÅݹvÃáu „áÙîAª“Buú"zõöiêrƒ2“|Üþ,ü‚ ës Œ±k­þÜ纚ñ\°Ž9ý»­"fÒ×tFÕ…Ô/*âTö†T<šl·…KSpl¢¾ûÌmïŸé™rhY|ò¼etL—3ɼPR¢ Бøº¯6Y“ø¸³ÍGrA8ˆµÊvÎåY³UzNZ¬4§W°4ÈÕõ3ÎMys0x½¶v73ú°Œ5³÷«®ácmEðœÏ“±†f™Ë{= ògÚŒ»XEŸTˆ¿±do$!¨ýõg@TÏèiíÕFµk_˜ÏPª%[m·/´Öž5Ùo¦s4+Œ8[ƒc:¿»6ŽÛIŒwïcÈB ÓÐMš8Eÿœ:¦dдÜÎóuíjê:sìê'ÄvpJK@fó­.Xliú_¢9iݬ€7ö%‡ö‡]08¾õeaHó„3#Ä´ÏÞ*MÓi9Ü :z÷õhÈå\UcN íÒ¼€Ì%$P^%ZÂBu˵(fã*@­ÒVsºç‡wœ´½ÞSJ¢®ÐšÁxûÞprºi•Š¡øMz^qÉïR´Â†SygŸl'&¾ÌØ:œ£Kõ‡ñš3åXÜc+L\±z ɪz œVÙ®Fíg¤mÄ'\Õ¸ ;Zôíòi#ŸÒ«Ž’|÷óëìv1ýèPý·{N½ÅùA~ NuÌIYh"äæ›ñÑ·æšµÛX°;©DOgmû°òrç©=Çý]E=¹ùíìï#[­ /_©ïöM}Ä¥Hn*¶+SªŸR(R_ÕtsQ)þŒC_òî(ƒ°Îàï®$GωŽ]`öe«†Ž\tÜhæðl$}³Û›n‰e#Ÿ>¡§¡ñw˜4n¤Ð|å’÷d`—´•!Ü:K›/©Vîh Ü—HÀu´ZÌK¦ñÅCš*f¦×zDeŠÜ‹ùgšZt(ÆÓ×·¯ol7ºŽædFš®FÒÖy8í!‡ŒÃfÖz9õ¼=æ~›TõÌkÑcÜ$B—pÎb.÷W+Aw<'§Ù·„8P—P3W­{N±TaYç~$½}vÿŠodáõ†À/µ½b"eõ×/•ùç)u‹‘?Á>öߔ쥉W~X\%€ÕÔ@ãpƒ8Ðrg„Z$ìÐ'â{ûÄ[h¸Fþ©s,IM/&„ɺ¯‹Óƒì+ÓC©]÷¼U†;üÜê+ç…ei®M„û ²ºH÷l¤ØVy•Ö»›¶5ñ&‰_²œDÁKxZÚfiû•óP¤¥ŠÉñ°ïˆn·ÐÛ1ª³tK©Õ{>sJµæ(2§Œ½×\fÒž O¶k‘¢vß&›’íÝ'ä;ãâÍÉWц™³ŠµF7[XÊÅØÊ\ë$ïBè"Ä_’·ì¤glq–{u |˜ÔÛùn‹wLø±ùn`G·Ù áõ¾Ô¸¦þh±‹PÊii2 •È¿YðñHlä]2žã)+ü‰Zp¢ªL.b'PÀ—G} Ð©“òXzžÍ@™XÇ/í²Õ»š2nÈf¸~pz±‘š½5! i½O›uz;Û½AžBJA§Î[s4G3sÏXæ„gê¶½Œ;âŽò‹,O{Á?OiÅ3Û<›eÒÙ¿ªæØ LþŽ*®é²®ÒÆ*d·w¦±S{A +ÈFg›_xå`òKcQy]fÑ™¡Ò¡_þòˆÃe 3áÓã•ÖIÆ!jíü=o¯åþµ)Ú[àÏ'¹"¯}tBø³E·;÷÷´Ëo+~lÑICÙO–¬„‡šhù>O·âµ’wþv< Gc:éÀ{•î„ÈdgN8žŠ¥0U‚Àu¼Š|×3ÞåÉ´€æ`_dÇGK7’H gN^8WÞ —qÛÖàV*5v¯^º"²†K¾cöÞVh¶­$:hriÇ™¢wJöá^¢P. ØÆ> ²õ^5åK`$—.–V\õ~Y‰|÷g•aûRMy‰½]3ÝçãW‚ŸƒXôôĵ„ÂmMïªÚPËtÈ›Ðêܺ™©8@J•¸.@'P_…E=ƒgƦ¯=ì!Œ ÿ”1âçV¸¿â‘ù¤³2ýíš…«¹á•—üŽÛ›©°ç^ÎK`ĵò³+l¹·éƒ£ÆÞc{ߚͮkE¿q~Þ 1š|¸åx[ˆ„©B³QÇmë»±9iÈ])þºž…ÜmýÉ$Wjte’ã}sdÂY¦7‡4¬lPpè•LÚsˆ7û„Yf»_¡| ¸d¢‹»íoŸBóptÓÙ­Ub–æöFuf.×#õl)4XÚÍ=Ë@×íFÞpæâ{ë׃>L’ßQû.’r´µ*!\AïYÆ:—üz|ÛÕ ú\“]tc’8‡ +õ}ÞzÛ$‰PØÍÑŽˆUC˜äÌy0äJñ¹º tTE±p?ÃÒ.,1qã°u²r\ –’mÖlÝL.AÉæÎ\?è2Ì.5%úHî_³ž)¶.ÀÁoˆñ`^¶ NŠx»VD½¬A…“W(,F;ÎùÌî¥Ì÷ÊÈKưú” «rÜÜrºKF7BÚñúû¥øXÈ÷7½úR–ÆM“à/·8P´˜”JîÏ«‚;'-rRn•øJ]ÿ¼iýRÐ+\Qd/¢Dî4:2+'t4'سÙ’?€q6çã$®Ÿ<èuÈÍZÕÿX÷j8é+ϱ>MnØWžwœU;K—”_è)'ô æ˜L÷£ÍÇ“ G«‚Œ©‚ž •¹-(l¿2•ïÉ›µ¢|QÅ/òu495òÍCò 'ÅLé°éø%ÚÕ¢oôÐ4÷9ŽÑÆ·Ôl¥Þ{èλÇï…OÅÚ4ª×D q´L0/34ÇfSÖ»‰÷Ê9iS³,BrŘ`¨þcÄï×úÝ‚÷íñ¦¦ë^ÔTæW°™‘x =Ù¸;\þÝâ"|°ûöz?H¢÷•¹½•‹=èHŵÞxSãå—'ÓS”¶ ÚÁ¡66ο@HÄ—£¦¨ûŸuéÖò÷€²rýË=Öߥ8¢É'ôÅŸ|›L³¥ŽvcÉ6KYÑ} a»,Ò›¾Äú‚;Âkþ”*RFöz"íó‘’ ƒ¾ÿUZŸ endstream endobj 515 0 obj << /Length1 1377 /Length2 6205 /Length3 0 /Length 7140 /Filter /FlateDecode >> stream xÚU4ì¿¶÷^5+öQ[ÕÞ{TÕ^Aˆ„bSµ7Uµ•Ú”¢­=j×ÞEÍ¢(ªµ÷Mû­ûýï=çÞ“s’÷ýÍ÷yÏó†ƒEßH@ÁfR…A@Aai€’Ž¡$@Xøž °°‡1ýa%à0Á=Á0¨ôó+ÁA¶”MÙ ÓAš^ð(. ”ˆ KýƒK”m½ÁA€& ò$àP‚¹ûÂÁNÎT—¿–n{PJJ‚ÿw:@Á ÛÛB:¶gª£½-`³ƒ¾ÿ*Á}ßp—òññ´uó„Áðð|Àg€!È÷9~ÁèÚº~$à;ƒ=ÿ0Á>¶pe€€íAPOT‚Ô zŒ4´zî èÁÚðþ¼Pøw¹?³C'ÛÚÛÃÜÜm¡¾`¨À ôTµH?Àêð+Ðâ CåÛzÛ‚!¶v¨€ß·¨*lQøþDçi»#<=Á_…~•A]² ÔA ææ‚"< ~O Ù£nÝWè÷X]¡0¨ÿkG0ÔÁñ/w¡‡P°‡HCùÏ”‰à›–@ÒÞYèWqc_wÐoço3êüþî0w€# (ìBýø{Úzƒ¸(Ðÿ¿;þ½#`{Àä†üSe9þ±GMFÌ…QÄ„}þ^Y¢¸åƒB|ÿ ÿ=\!-SÓGz |¿ÿíRT„!þ÷Ä"b °„0@µüw•¿ñÿ…ý·UßüçÙ„ÿ©¨u„¤þ€€º»¿`xÿÉ î?åÂøw]ŠÇ ÷?´·¶G}ÿßäÿò¿qþW•ÿƒöÿyU/ä·—û—ûxmÝÀß?ý({!PŠÐ¡týÏÐG ?D¬r{¹ý§Wa‹R†Ô ò÷%‚=UÁHƒ>aïüþšª< éÃ<Á¿ž€PXø?|(­Ù»¢žOÔ¤~»@()ý»¥ ÔæðKs"bâ[8ÜÖ—5xÔN àD‰Ó„üÍk€ †@¥PðŽ08Á¯yJŠ„ ™þUÖÞ GIí÷ØQ=ÿÚÿÖ5„ÙÌÍÀìežºÔ>m9«Q`ðØ‘äØxô‚GÀÞêuA‚›ÆSýd~¢6ðìóîcùyækÿoõ¸‘M©Í—WÖɆãÍŸÆhzG_}S¨ëaÂg0–ß ¸ö0 uÅlDo×äÈ÷ð’$Ñ/ <óéVCÖõ”/ EÌllV‹k^•OÄ?Œ³-™âxi—3MËŠƒ`Âã¥8@’NŸLRäÞ2k&óîÆß+ò7[I8Ÿö[¬4ñì c§3£eÂ<¦çôWÜz®ygÖ¿´h>”>MÓ:¼êö ÙâöÛÐ5<ƒoÿ´âä•榣¤҈[nROq+aIÁÍ9ø¬¹ŒÔø)Ñhçɯ—¾ÕƒHÔ’Xw:×½hõ—ÙLû Ÿ’“^ßPˆ @ÖówhxkÆÜë~Œ–»û±Âç'Á¥ìç½ òwÌÔ_sÔ×àu|é!nd²¾þÀå³[í †Ÿ}ÃñFg\žvK Í…³AÁé 8úí˜îi4ºözÔ ¯«†KŽß(Ö˜ô~ébå1vN.µR"'Eb<§å6üâ›ÆßáÉç¾+óÅ í﹯Գ[Y#‡8tã›e$¹ìçñÔp(ãͺÒ:RíúVˆ­À»ìU MGI`z[2ÐÉ3Ïü÷ÝK«aª<éÀ»·Õ÷ÖM ’±‰™t¼Ï0K9ÔtÚf{îðO· ÙŒEŸ²fíbjb“%é‰Ü“œOãâ,5Ԟد·:J¬O…ý™¦Ož/ 4Ü|í%.ë’?ÄçDRS1Ñ,×QH:<¥žów²­c\Öé›öá Â’Õk<Ò¦µw:Ó_{³ã,õFu0ËƒìIùùSPÀu”^ºÐ¤Ý~X5]dÛ§ËüŠP-⵫ƆîÉ©Èæû<:Uáq_îãa¸-cÅ—Ê }}žÌ˜BZ¨ç´43¡úz×M?ÌqX´fª‰‡éE Nt–~ñÀ–“ÈX-è?´¦z<²Iò}©À8Ýí}àÏ8ÿw%÷ÍÉ©ÅÀšzË O‹aR˜ÆP˜µ1†°ïž,ÅR¾K ¯5Òân™å¢a0–ͧx®Ü9î&‡qo¤~·ì)Þî9]T[aãZ)¥ Ù(ŸáC°Úµ{®¯òFõQo¤¿{…½6 VÁ)ЧeëCÛâ}7u4~ƒê¶Ž®·zÌ RnŠk·IN¦E^‡r¨pOQw¹R­Íô8QLº#Æ„뿞3jù`dº Œmîúí$.Ñ©Ï|‘ÝÙuHùæ¡\òÁÇqG‘˜†ÜÁ§'Ñl!Ƚ‡h[]­nM ­Ç6.Eö®õì^Ò 8†åTsá1`•¯›Èš§_ŽåÝßmY{7-hõ˜óÍ‹…Æ$؃”çƒWÄçƒ]ÍmÉMÕ’.m~t“ ÛJ鰿ɫЄL=¨$ÃOC'¶ç2Ê-ÏrÇÈD’¹5ùÂæÆ;ñÔ²SK¶¦÷²¿Q­¸JÍ×΄Q‚| èɯK…ú¥øøìîù4J=J:“ÀÌ™ÝYï}ó›^-ldl(ºž,£è{mì~ј½lHˆþa}•&"ZúÕV|³4%ò+ Δ^€m<ǾTg±¢pègOò{VjA:è‰Êz z½rw0ß܃¸vb³@ w×½†ÄŠÆY#Ã)Z¶¬ï²Ó㘘¿ÄIU7»Î=Õª¾„[ø¿lI öâØ·®ÍT%¶"l”-\GKÞ¢J›ÊéPŠpl}Á!0»ð¾½ÎðAËZŒ&Æ)Bþh°¯û~c¤¼þŠve߯ps=Uy<ü7å (°zGšOeMN%$¼í؉†H–ü°s~‹ÉîD˜5|¬ÆÃXÝRÇ"¤€Ja(ël¼g¢[g8õX'!-VÁœ‡Ônj‹žò¸kÖl=>>ÿ•JjLp \~òýÝL†Ø>!Øzo®;ƒyÁçÇüê1Em=óD2çˆx¾å_5•½¾Ó^Tß䋌o/vK §Á5=Q5‰yv¢¤¢‡ÔŒ¸ pQu+~êÌCg:Њù’qz,2Vò]XSìüösÿ/^¸]ıáö…¼2¥ƒ ¹y»å>4ˆIåMÀé¹ü«îqòF—o ŽkRoÛL®ìŽ^ÖáSHb_.8ԺЊ²l›´4½XÕÃc̼§ÌøA&ÅXrÂf‹{zÔ^áœ{ß.@ê)ƒ¶÷{ç¢jÌÅàÚ‘xÆÞn.J3v:ÝÒN¹«{]‘'øÝ&zߨÀ#›_SçËIïV±Œûº ˆ ðþÈ&t W=A>º ‰o­h}ïîÙ`Ê/î!øT‡”kŸòúeOâü2+°¯—ÿ°É9ðVè0+«;ûŒÂä–ÕjÏEbã^¶ÊGoœŒ n¬c«}­W¹¸ß3'SWeüy¦WÝñïàñ‰Vn%z=Ä'ä­­ØÂX•¾pK-’¹ÏÄáùä ‹AÑÚ€¤iÖ0Ÿ;§è‰Kõ:Ý»=«à›"cwïxåp«ô$ªîn\æ¸Ìâ#$û‹·{|Ž£udJ2ÝËM‰ÎjÙ5: ‘ø†8õ…C¤@teYØò–8½pØ4#\©xið33åN'¾]0vo“µç­˜—r¥Õ—Ü—eükÍÙnçÅq 6QM 7å¼ÖóÉÔ9/Gä‡-n7V]ÈÙu¦j²ìµ&^³¼æø§Kù1dj°8Ð)J¬2¿û.`ôðÅÔùÎ)j4]=tk¤º2IÂð4B¤>K3çW«ŽF¿§â°áw£©¨çî’m­¬yÑÒu@‡7“ /ÌÖ¦óhpv­š9Ô}¸šG¹/Ÿ¹zõ+úÖ²ñ•×”Õwµm¿Ù}ÔN<ÛˆÎÈüv¼ÑKøÈŽ¹Æ’Ç ž|ÖÅŠ›8èîJ¶¨Ê±Húw")½ÃïU[+{©Iª&bþèµr“¿rÄçf&©Î.Í¥ÜÓ±K6àÑ(Ð%]zÊwŒ­VÀ?Û3ÊŸF½A ñ¼¹×²øDUãÖX}%Q1Ü&í$Ó;»-í[Ù†,Ǥ í¦/ºVDbt•¯Žâ9”¥ÕÈËÕ×›UìÍ‚²ÁLÉg.QúÓå´§Äœ3¥Mý“ï› iíï¹rN¶Ìiæç‰ºšê0Oíw±dʦ[_"Ò|×ßx·ÿxzf’@¸ŠdúKžÓÏuºNkFèj»ÿv‹Â{l(fIY£šSª†úó8K\âó’ÃdXpIÎíûQiîH¼A‹/Ư3ãzÞo¯ËoXyÞ¥Û(·B “×O´G¼ÍUóÑú@¦1'–›’…·û*ÓY¹Ø»ê ë: bò[A/ÝÁ;E_#䝶м2 6m/OÑô7T¸] 9„v{¬Vv$¾VúþJb”¿Ò­ã‹JÉNƒ¸Ôƒ´É«R õz…ôiÚVÐøQ•ÿ—±×ùñr&“ƒº…üîú'Æ©K‘±qÔÝš¦ñÀ¶ØÅЖCÞ£¤¼w,¸zVbÛÄ2Åâ˽S݃Éqn½HùCŒÉ…‰žæí"h-ÑøqºŒ‰JsvÏ_ð‚7ƒ›³ øâÎ*æ¡ä^+9yq¯âö] -TÏž)¿•°ÆÌÅ ŒžküÌ Œ¹'·&U6›8¨N½oäûÖÂîá€9æ.X¿­×¬C_Ü/á½Qþ„ú×Ð-pìrë+á#äë€$ã“nºI¶‘þ…¸9ƒŒÕrÖ/Íâ/J?‹ÄÝl~Š!ÆA‰”‰ ,ïÚkN[nŽZð Ân©éô •QQÝv¯4ôú«)Çy>¹‚\\…$è!ßÉ$ü…fžŽ1¦¥âB³?ëߟéê„TŲmX‰ÄkùDzO+Èh,MÌɾ{ÚER+ œí^À›ÛµÐ~>ÊI!—6(€ ÒY¿ÎÄ©zQè„8ï­e¬*²ç ñXbgS`mµW™×UµnÉŠ=X·øXô&¢]±à–1zYDt€õ»*Û«%­ì*í[^Åm·2ÆÏ>„‹öü5Îüy÷Ù›‘7|w—µÅDóÓ|/·Û ÑðâÙÒ<ÂùÆp\Ê9Z{ûWg.g·ºàyš59¡íIµOjH;C×I>žÒmàžªï¦¿µùŒCnvÌeKÍ"a~2cÆ"¨è­%&ê4\Í¥òìdý¤xyñ\QŠHÜéC Ôˆ”3poHU;K  4ÝÊi–“Uï«^fÒ×ãUå°žÆ 5ð¦„ò[ÑÃ>.…Ë X½€h©ÈW~七ÓóÊ€u w}épÃDù°,º26¡)‹:bb³Ñw%JF˜¦ÄÅF°Œù}Ú÷¹Tíçµ+|–’gÂ2‰‰Ï…ÌÑ»c°yÀÖ,sôtàÈú ðTÜV¼s`:+vz €†àiO×âÿø¢š¨¢>‘eáb¸%™xš2HÕ¸úãûÈF’×åñ‡e âž«à}µ×ŠmÐ÷‰´t†¢s®ô˜.ã2AGW‹Ø¹!“¡ÉߺLäœa†b¾Oå3¼ó»Ìnä¹ê÷ù:Ü|_ˆ­Ëß•vÏ î9ØÆóh~hã;L ²‚÷ò&ˆŽS~¸^!—s&‹9RCx8 ûÖÙþ˜¯\«w!+41Fµ«î×-ôÞÏÐ5$øÜÒ?Ò%uïg=¡UQUü­ïe7gC¥ÁËÈzo¾BoÓʦo^J"˜¯óIvq‚òŽèÂ2R ÂCöœì«ŽlõÜ…×WÑ g [µÛ2ô™ç¯ §3j®í$?HlwoíXS¦Qt£+üì{+âù@~þÉ5“º15É­šk·¹¤ŠmqÐRÖu Ïg®^î ekæO=®•Z~=4ys<¼BñÅTíµÞÃ[£j“0©²\®LNÕ8¶ƒ‡£«ò&qG­p¬s.Ï¢$ó£iùðÙQn;š?“Ýjüñ&´Ž)g²wåÙÐûæºU%.=»k«QÍCJwöò÷×kÒQ"±ä0OšBjøvÄèšpƒ¦¨ûÞNhTSß)–å5^YD¹!Ánкíº~¯åHü#°ëdm2¯(ÛhÇœLƒp?‡ú>eI¸z²íÈÛ­èWhhÍ'%2#/Zh3,Â1‹[ö=>2¼8ën«ÓâúB¦¤Ç¡ˆ£hI`yËå7dÿm¶ÈøÁ¼à(Ї9á®x™Ë{Nù`ÄèkZ;&c«rlÛÉ?SMª×oôIy¯ªœ•F÷O0Ž›×ÖÖz÷Pú—x<ì´Ÿšìªy£Yøäë¿ÉŒ†Sü„66Äæë¨ã’M‚ ƒByÍæ!_øC6JãqÅ®E”™d‘æÃ/W"v[^Ja'“NǯMîR ©];gl ;èPþÜÔbWáN4Ïà86#ª¼oʰËÁ);~ƒÚ[ð‹¾Qˆé¼ ¬˜åß“ØÕ¥ ·-$B÷¾s3½$ù ƒc4”5o c]ªWL!V»fÔYj}!5Aÿ&3ÑòmJÖúÐ#²¦•ÁbôswÚ¿I¯=™½í {…¦íx#lJ­Ï ‹ëuh‚jÁ|?açÌ÷Ÿg³Á8*W䣈üÊá««|4èÈ©mj¶üt&f8×Ë-[Xíõ¤a¬¡fÀ7¥ѽ†ÀHnÊ¢¬x/ßn5Üå*ÙõUgkÈܾ”úÌT¨® ˜¾âvÓôñúøK×”)ò]ûr©ãO¥4áÄYKÈú ü½½Ö•¼èÚÇpkœ°±ñ¢wîfxrø˜Äz‚ãÓV”R×åÒ© Ü+…Ú4táð0I ÚgàH+~ ã;…Ef±£ZgK,r¡‘dŠì&é³±‹éo”5t—ÞåÑÅb|{HõÔK’ù¾Z’ðs[ÛÜ endstream endobj 517 0 obj << /Length1 2196 /Length2 16955 /Length3 0 /Length 18265 /Filter /FlateDecode >> stream xÚŒ÷P\ÛÖ în»Cpîî® 4îîÜ]‚»;wînÁ‚{€`s®äÜïÿ«Þ«®êÞcú˜kε«)HU„LíŒâv¶Î ,ŒÌ<9en33#33+…*ÈÙø/)…:ÐÑ dgËó½ˆ#ÐÈù]&jäün&gg v±°°X>ñ°pò03X™™¹ÿchçÈ5r™äÒv¶@'8 ;{G¹…ó{–ÿ<¨Mh,ÜÜœô»„l€Ž #[€œ‘³Ðæ=£‰‘5@ÅÎtöøŸÔ|ÎÎö 3àûœ—“‘+àìèôñú§â Àdâ 0šƒláþDÍþ…ßOÞäÐa~<ó_Ÿÿ>é½Ï–©­µÇó¿—IL]]UB‘îoÂÿU Û¹¼ظ ¬Ìf¶OÎ÷Ÿÿò_þÿáþ·TÑôïÚ˜ÿD”²5³pÿ‹Â{ïþCÃõß3Aýïu¡üoy»÷9¨ÿŒ½.3³ÉûËÿçáÿÛåÿßÌÿåÿeìÿo=â.ÖÖk©ÿRÿÿhl@ÖÿÖ¿O±‹óûFÈÙ½ï…íÿ5Õþk‰å€¦ ›ÿ«•r6zß ![sëÿ6ä$rš*‚œM,þ5@ÿ9ƒ÷ðÖ [ ¢è¯kÀÀÂÌütï»fbõ~•8½ŸÔß*àû*ýoJ1[;Ó¿vŽ•ãÀÈÑÑÈîýàßÀ‹å}9MîÏ5€‰ÑÖÎùÝðNÏ`fç÷×y~â0 ý%úú`þƒ8L"€Iô¿ˆ“À$þ±˜$þ V“äÄ`’úƒÞ3ÈþAï1åÿ n“Â×{Å?è=ŠÊÄ`RýƒÞ9¨ýAïUküq¿#£?è=ŸñôžÏ俈ý=æûfóÇú¯ó`2ý|g ü/|o7Ó¿†áÁ;q³?ðÝÜìð/%è;Û_ÐõñþÒÛ¹8þ#Ü»‰ù?à{Ê}'máaoñ~]ÿ±x—þß¹[ý¾“·þ|goóbß¹þ Åñîjû>€ÿп³±û“ýÝÙîÔïÕÛÿQ¿³ÑØZÍþô‡åßRÇÿmË;±Ðfygáô§’¿Ðõ49ÞÍÞïË?ï'ñ'Üû ÃäláüGgß«qv³û‡Ã;;—À÷Ƹþ¾ssûDZ½ÇóøÃáÝÖèø¯`ÿ³‰&.ŽïÔœÿ¾)ß×ô?øïW!è4[Y´3á ¶¬îx¨Âwc؟䟣Ø×H£aðZqìtù“LS“¸åøK(y´e}WŒúîó*ñ‹×I[#Ì—o‰JíOÞÏñÊ3ûípËÓXCS…'B ƒ„° ªŸ¼_¼Õ¬ ÚÀº¥)r\¸óÑÜ$ÜËׯC÷•j>ÉÀ?—Ï2D«Eé”ÌSäg/àB;3~¤E»tGž¿û5‡–3õF,OçsÍV䥽Íó¸à¹Q©ÊêÔƒKŽ«Cq‡6>Cé%ü3E{É«´h}hÙ½¯ˆ8‘>u…ñ'kf H9Ò¶¥¿Îu|¥‹e/7L…?„¾—XWÖ‚aàHª€YÓn‰î\Çf$üÙe&¼ÑñK½×Ì2•`•{¶á °ÀI’X‡ø5ÜmbC“§-/§PÚíb¢ð,>MJËrçÉ WãûE ï”ÑÊUdl\Ã`ƒ£.ºÄ|MCû.U㗳ﺉ ©ûHÿðrøŒ£Ë©ô|Q” øÄê§“Géll‡ð…WÂú3fHT|¬]ñÆñ{ *UОXÙLmV[F?F»«H-¯úÖqœ·}tÐVÉ0Suìâ÷ àaήòÑ?iÁœ­`ü"m{ršF$vñ]_‚d ã’‹°ÒyÅ/ºã “Ó6žz=­‡ZÑd·ÔŠþ>E`™HŠPKéD'€u{¼ÉEe’Fp¶w¬'º,Èèœk~¾¦Í пºK­eÑ*0‘¦ôÀ·À9³ð’[ŽŒ¿Q bòŸìÉò„éò}–VýÛŸ0©†êê‹•Uôs‹°æÇšÒ¾ˆßÕÂPwùf×ã4þB"Cjë) ÞÀ¨\ë._¦ž‘" „ù܇šs°;±Gìΰ“Æãµï!ô¼Õ†ç20œê»Oñ\ º¥¾îñÛÀ7]§—C`ʈùàŽ' ýzÓS’Ëe w³‹OB0¾IÊjÊ~®Ù‰œ0ÆôpdI^‰izŽ»’ iÖð¢ÑÀ08݆w•Ý%ÎÈÒÝ±Š¤{㣬0‚HOGœ )ÒTÑãE»”™“GO>+UëîhAܬ=’§ô¥5–¶ÍÝ×a¢èåæ`óं¹K~–:¿$)îß$†OÚ”yjy¨˜*ZYJcv@Ôý‘zØ¥îŸÌÅ€—ºLAžSÆ«ƒÀ‘¼éPž^ f÷ƒZGME9ÿy!Ï,äCþƼ'ñ'äølHóu4J¥ÝZm)&>dCÁfòþ|;_t’=ÅA°É“3Qþ ›Éh¤T××õaÒƒ½»½«Xmuã¥ì˜ò?]´µ›³‘e•í•ή; ,ªð¿[òÜê©×›&Bp÷«aŸÀQŒ7pCŒÚ?Ò‰Ž—Ë½¬èóR®Úº˜«o—n<@ð;åÐÖ~Ò­÷Ë? ªùJ}cö´•žÒ‘Ûk3º­¬ë&í ;¥lÿ«öjŸÚ7ô`ÅŸ­†|l h©­ÿÁ³9±“—jl¿-¶Bw†ÁŒZ&dbªù –]‘)‹nf s+Ó|v¾ü#ÍfísÞçAºjSÝCb@¶Zân<{oÏ!¯óJ«ìᔚD~ÂcÌtÖð •.ô]æ7$º—YéÊ–ogõñ=ìãÇ,šÞ2êe°q ¥AØðýO„mÂSÍ4"8fYCÖá=æ­üÓG¢^ü*‹¾Á Û“¡‹å†œÄ4‹M±£^“;U¹>ö¹ÒSPz}Z&•"UtP³F˜-¶Íô¹øz”ócx·¼àfÉåøãOK¨¼u¯È’úú_3ãýI£¹„êúCÁb¢º6e^Ñ, k5æ×&úÖ©5ÊŽA`­xì9PN±›]Ù¤•LÇ£Æô»3ëXåл?=3¾žìt©ö™X7=à®q´AI”ZZN¹‹ˆ«Vhv°¸dS¦&ªcöæJÒ()Éÿ6êœ ÅmöÑÜüú~sÆi vC†Ð†0ÞÇ]çn˜„Q[Ä|C(çq­’xüâ–ÛuŠH”zÆÔ‚{Šž(ÒNf†}Ú_°[¨1ï‹E4 vÑ#žÔ mRšÃø*ûVš•Iô|>zS éM}‘Ê*°OB€O…Añ3"O>i‘“|>ß^ñZý›¦sô¼¼—ì ]­@ÿKÑ DÿDJÊ]+ZÌØ/š‹ë1¾’ çÕe_ð"K¥¯Õ l>éÉÄëªp*. z8´—h†^ôM~ÔêÍÓ퇹Ä[Åô«®ÝýÁÄ$tó‹ÚzÅ·Ôg¤š¶_@}5AI%ZÃ7òü¢ml†²Ø.ÐlxKmcÏ«íw‡5&Ë<£ª€€ ç”Ô}ðãÔZŒLØwÚÝêÞ‘‘tœB3>ìå0ÍþpO[GmÛµmèk³l”4Ë»ˤ jöÞ£6 yÒõï埘(%‰¬™òqëOÁê5a¾¬ÇÁlbor-øÌž¿AVÜv:¶º(EäÌF­82YÊN]uD1ÕnV ~žÌp˜¼«}Pï¤>2ºû@VÁå±­ŽÇÇ.I£FØ/õ;«Ùªq,v`BùéΛ÷vÒšN2sܯH_ç+€tÏ*<ÎéKaž†ŸSÀü8ÃÀ(e»â/Kÿ1m‘l$ej\EÎÇã~«XþQ®ünnܨ²óiIæð2xÀ#äVñÒçˆæ7ÁG4WEf]É€Í[,ß¼sæ»ßzvªƒÙ‰Ö3¸E8ì/ îŠJM »ŠÎ ¼)vŹzÏym–éÍóÝÉK@³ý¨[íp¿|´`#øØ¼q¯dÕ 8½üÒI‹7Z_DˆS}]à3£êèæð'S±óö:6,ÅêÐñµ 4v9—úŠ½Ä Q±b(¢61½³êAd`PðˆÒgËÂ͑ԷkéE~*SBÑ_uç¼c ìÔc šîÈä1þ^èPÍ»òõÅ:ôº¿Ûu˜X=ìKÄ^ìKcé"fâáćÆÜd.¹ÊêÉ™Êv€ÄxÀIåÉO½¨š)ˆLºe=JnÐ=‹nr‡ ÜTÕŸ1/Þ"{(ƪÐaÃm .n2‰Æ #ݾý‡€w ¼J¥zÙÛ _‘Ø)cqi>QÆqeGF€ßi³zìÓFqµÛl‰D3fï',e­,„#IJnóð`˜|Ç–qѨFMj¿”àPjð`ÃH1+~h_ò¥¯Ç\ ¹ÖãJÉ·º§vpËp Ða«^Q•Æ“RuŸ‡A÷'\™\–!ƒÏ˜’^†î‡(±î7µpæõ溃R-ÎáçÄ™u1‘a69@‚{oæ³H&?6U§Û)dÐÞ”ƒÏ÷”"ù»ƒÇ’×í†W°¯RB@‰{D~ªMp¨¤I®Ò¨»(=Á…g¿ò(à¾[j:µ ­€ÎÀƒ÷ÏÆÚó^FcN1¨•pŸª®* •kj±Â… ißiQ?$eãwXCc[¿&Ú˰ÚäØ ÔÂT;ašúŒ0$NL’• ãùâÉ×-C;AîÇêð ¯Cñh+naT8Y–êû“*;j%‰xræô¥Z=¶*²cpzéb.oßsÒ¨‹©ó¶…á~…z;sêv÷Ÿ?D¶ÌÏ’Ú¡Ù}‰€ðÈ”vÖ8Ì ßï©z[(ü´~Oª·ËÛ /GßZm }´üÊÏë~õ:Pu›ù½ yŸz…DâÆ¹¾}ÙLZ7„úãÝwV¯u#K4SŠi–Öàˆ‹9ŸÚãRҸőګÏí®ck3„>ƒœ]ÄäÆãÝ{_ëµx7F¤î:n#ÕαŸi +ú‰ÐrIºP L©¸aê9qŒuý8ßÈøyÄÂ/¸¾TÕ½ ;´I¹8U/ùQ±ñö ŸÅÅ'Œ}U>w¦¶€C&-GBø‡§€üöÍM(5ÒÕÝxôB ñv6#SZ:f£õ¶ÞyF"9xØÂÈĘtsæÖ¨Â=Õ¬—A-HÖÒ uB6Qyùðsb-]tÁ‚žž, ,¥u§rtéT“íçs”IbquÈ$|"» ƒÀ^$Éé>g&•ˆòB=O¨=‘.õ£„zä÷& ¶‰ ’d–dƒ œ¼¸/ ÝsÁ·#JáNÆ®ípÎøa3ýäçü' ?¼#*E»‰×%…+^¿µŒ11õímìB™ÏØ,>B ª `‹?*ࣈõÚrÎ nžªmÅD¨%›­lä/uˆ!!O»¿TÙµ÷w…®Î¤‡B•ˆ*,=lÙâöNÒ.ð?€ƒÿ¨qÝJÞb}I8þ¹}W¼ä|L8q„9ˆüر¥éëbà˜L£mñJL½rvoA6Æ\ìµO¤T_, *E]yÖß` Ф»ëdlnpPîö¼ê’}F2*1ƒx&Gã˜$·€ šâ]$¶ñWs/£ñNÜW.¶7ƒ¥ÕK–DGïqBÂc‚#¦ <ìä§O"g‡ò<ÙG² 6¶º$p “VódÞÒ40W!ÝTÝèëšOœ0Û znLÓJ…'PÁ:7äÎBI]m(t‡‰D´{0áü^º,(:0«Wóø+cv¿+ãMxXB«ž‹´‘Ô¯Ôy–[ìA‡fmvPxÏÇÎhç8ÄìçÇšHQÊT|¾WjDλ·LùYªos,Oݪ;ÕŸ¸!<ìÅ#Z¯¶Q.u·¨DÜ!|eåÛif/Ô b7“î.ˆ˜7HŸjó2nÃçp…ºÉƒe—È~#n¯Gwžò¤l‰AñytFZR¤¤°:áej]nì}K_R¨'wv¾6,×àܱƒ›òitB‚íõ¡B9žOHîØ mn•ã5ëF·—·ÐŽ«¡oèå«¥ÄF™×´aHÊt¦?{èÝ’s‡¨—Øä6ÆúvÜͼÎÓœ=xKíydùµdàƆË{¢ˆÎ`¶µ~üÒÌÃ&Н‡\Ž„ÉO(s9_®íC# Ú'ó¸7”¦<±ÚqY eD*dÑ…¶Bé~¡ºÙ×ciÞJÜòQ06‡OË2šJfeßÇaŸÇäPJùê~§=!+¶šNX H‡tÆ@ûÈØÒ#«Ÿµì¤ñ¿”Âp÷W sfÌúWƒ„<¦\ÔAdS7G\oì”5¢<-¦ ”`=â|J,ö_¬†ø„¿ Qn‹¬ÆË¢¿V01ïï×Äâšó>DÛ4ÁÇã¼w„é˜cå"®t££ 8ŒE­u65ZQÚ³,¤÷]®¨c•×K·§S¿ôË=gñ©‰×NŸm5•-·2q ¾é#êi€V²9ò¡±±€mGo®ZÖÑÂ)T¶«üÉëë%¿…ÌÛü Æ• hºìÏ”Èñº3z=ÙÆ[y$ùò›Eö+˜FýçÌ f±Ö±¶íspb¢Ñö0?Ey®joQ÷çO•P ù ö>ÄÿÄø1ž­Ñ„ÅåEo#¢¶ÜÂÛ¢äüŠ¿›­S¡½Uކj9”Ñè­¡ÄNǶÛÛÿ- ¨;€îð‘]¥Ca"n± ¸R8c‡¸Eq`¬eØR®9x\Ķ•ý@×ç.Ø)G’±"lËÚT ~ˆzþqö9‹ê×Úð=tÖÏC¼9”X¸5]×0_|«<´ Ø<£ÉúˆMM)?V…౬/ˆ¦Ô…/¥|µ¸¬I\l£+7Õ×"õ“P–°tgH{›ææêw eULl˜_¤–‡åÕ°Qº©x̵$­×‚3šQõ%| ¤.„¦~ÈFHØ´Ë$õGÅ8É7š‰¬Ë·•¥y\Q÷ìÀUª¿{mdIž‘V;’¨Ïãóéq= H“VmKQ¬jŸß.s‚]´Š‹‰ûü¡ÜúØF2¸Uç塸°n¿Ôå ©t‰.y¬¦ß[ñ¬ÒÉñËÙ7oÎuÖO©*ÛÏ^Ǹ®?‰í™È¿ß²Ý&ñWruÔT›“5yœ"‡ªô‘Št}ÞÏÞe›* ÉǦ™äØÑôý—ð‰HH’¯9æ~÷ÎÈÍÚ'å¯>¾z:Q¤êܲ!£rµyÌ2¥ÈT Á`Žém¶^pE ÞÖ¸9-,Å!SÌ.#`è9 Ø„Ýé¦í§>º¶ÁÙTÂRÜw–(Íj?P\°ÅF¾¿ ·ÂÓxò×®Úìä‘~,¯M„³ÆäÒ¾«©¥àNµBÚ}È ==Á‹Ã²û™©è$ÓϨt”CY¯OtôwàæÀÏ1}vƒ›¾a_E$ê²<;7Fö7¾¿Í"s|üÑÏbƒ.¨'ºV8SKߨXøckRNãÅåOab^tl‚=ò…xüg7S!ŸÉJ%áze ”,8™}Z+ Á«ªeæzÇ`®‡˜Ñ«SSÑy7,ßÞ” °î‚¿¾À)HKªWý,óÃF‰–/(ßDì (Œ ïR%þØ FìÅdbàÕ¸&üˆ+2¥ñô…–‡vðjá½GEªcÐpÚ¢R¯°lÕ6 ¦ŠfmO¶1&p¶~­Á±ŠO«4—ƒs]ÊòïïòÃÁž+m:Ÿ@Ø,d]µM£pe`cÆ¡‚²(°Oɹ0‡ÔØF"¬…ÅQJ5›h ’}Âbzö°yÃ%ED1µîèÕk~ -ŒÄL½`‡i$B+Š@D©¹ôä/jåX™Y)©2µ%dõ®JiâO_óï'q6ØÍËêF‚Œõ™9ç·‘` ïžðúM|›³ ¨arÊÏR/õž]Âû‘ õ¸¹ç9+½b}Ùgõù–ÒU$õíìü+¬…Ù/k— cTó–XÖ×ðk|3b|°eý¸öM‹/?,õD!>\¶ËeÞ´U÷ñ€‡8.Â=Fï Œ€Ø%èè ŸJW!· 0À1B‡6`¢s{öb ¡5E•t{"ÕF WGbn½Hòš±«1¯ïzÛuÃ9‚L ½FòÍ`†­ÓÓ!°ö_.XèØ/>¯ós™­„Q³ý ¡BG¥Ä¾·.´'ü™£Ò‡Lî88™Òo"и_Œóƒöy,}-Ä΂¼™ˆñ4Ë=Ù%”q- »å[P‘Á쵄“L à±;º‰ÿé³Ûg´éT]ÛÄH›È[J±‚SÿA6îÝüä{Ôš[¬ØZÜ·G§ÏÈJßô™¡Mº¯ê\, k/vÒ3zqùÝ$=jêr¼¼1¨½leTf``'›*QSNzSHŠ pj|ã~ŠÖcü¿)v0ä8EêjWº°ÏÙþ ;Þúƒ^|ÛéDk\Z §c϶¬'|" )Y}ãæÈî{ó­AÿÁªOºµ[pÇfмêZ¾zž&§Aþú~  8)<Î|Ѧ{ˆ$Àj¿Ìñì<@±~€JÆùK¸|Ò@­øËM3¹Q^¿Ûi€‘דUËÁÔÜõ|‘‘²ùÊ[oÒH/‘8ÞlDÖËŒc¯½]cç Û’¬Ú¹x[‹žî“wt¾§8JNeU/E%Á´”Pë¾V ê †xÆÈM2ë`„º“‡+ÒÍÀT{¶ùà®:þÖCü'.Mª–4¦íʺ޽g|¬ ÐM7”Ë]ZÅ`“#Î žåÑ$í„6ä툃”ñŒò†+´9[IüÓK7¯Ò\¼y™€ÑK¦³ß”·1Á 0+•_¹>ºúö\¼5?Îno²Z —Œmíù•¤“Qè…ò'ßM-º—È^Û§\ÚêÆa¯W7þäŠD-ôwvª6´ Ø+ØóCé°qŽqEÏDÍFú7ã܉1ׯ$¸,êLçÕ<>­2µ[ø Ô4ŒXÚÔ­Úäâ5®A˜$ŒPØKC¨ýOÍcÊ÷Â#¦þÏ<ÉÑÜû)öSŸ–Àö­ƒçrZÖ_²}w†›¢™;²¬¥ð©hm“åNB.ññ_Ãàeû,)$­RÓ&Š ÇûÀ ’¥âå\6æ’÷? …‹kylY´aÔ´5*óL9Ð4É^m¤£Œ¦_§ ÐF‡è?Í NòÔJG U&ôˆ@ãVqNOïѪH¾.uJ ¼Yf±Ü²éAeoœå¡,¨½bòŠácí¸³lWëÞ¯×âªä/ß„¼QÐØAªûNúNÒ´o\#êìFŒ°kûyDß­ëôtó¤<#%_¿H“ÏœøÓ¬i¾“oæ­¨BTKSKüµB;-¶­‡Cè¬Æ„U}V=!Èý¹™­üFLÞ’‘Å’æë ´g¸L*Žœ ’Î QSO–ä×5GrHéúü—ˆƺ ¨lº¢õ&ªGé”Aó{µ\M(VäïGmC-c?ÏÕmÒœ—T­(¾K<å)+=cIš¯iB¼xØìYß5yyx£žÂí]íúùœ¬´WQ„© qìUø€Ñ€>:¾ò½[ñl”6£c(úø2ÀG(Qóµö™_œð—53RÐpç܂,öyÆü7+uú(Dl×®=úƒÞ'Ø}qÁÀC œmÔÞ]Å}‡Á”øûÓ£$f«ý /T_‚é½`/§w…Sè êí jš‚úõ9Î1l÷¬S¶°¡]ŠÍoˆH ~;­(‹xÎÎy5 ‹\ÝCÇ{Å9ÅD7Wéup¹… ©è™(Ìϲ‰i¦„´T˜-X}´¿ù8¢ >E‚1Ú8ó½ñCqÕtïNlÞˆñfnlJ¿‘ðPEÙúˉ3ÁN=ôF¼vä6Ô”Ý ðü|Ù/íÕæÑ¨Ë!BXñ»>+ „“ÌÝΡcšÖ/¹<ÎUÓJÌL¢å]«; í+œrÔ •Æz!á<ïwìÜ„³u¢C>öN}„kÚQn"`É¡òCüö2žäÔ3 …D[Ô Ô4ôIYÚn’@Éríø·w–ñh«¿¾¢žúºh 8Y*€8ŸSÜ5¿<Òš[ƒ»® -,gÆH3¢òÆQ; ƒ&7 É˼Ÿ½Íâä>¤Í¼±§î—×ÃÜ>é­Âc¨ü¦eBÃ_¯ÜE‰‹pà1•оfŽúW†Œ¥U%ä^Ïâ* ’!·š}ç&4埌ôP)]íö¤Ûšµ(¨Ôr|¹Â TòX ª$ˆ=•×_Eèͼ2¿ÏÅOEÛÄB1Å˼.òq¹~øõð²ñøÁþdÁýVÚM~¶ªuÆÕ=l¡Üãˆ,aú6T tòUìl<¥ß^´—y,nˆüU½'!­éýéÖù§@X~Ó°Ç0‰BYø5 ôàÚÕZ»:zŠ7ºD|:Çô7uÏã¹A*Ã^u¹-ö²¥.{"•*=ݳ„‚¢‰{­Ñ7¬ÒŸ‰ntà%Õþ;·òßIÊEBåÑ*nkº–Šh3+R¿£•!ZL˜[U(†»e¼¨£‚äÌ?¬Tͼ’æïÜäà£Ï ‹šnLù¸Œ7öxCû}ïφÀgngñ<ßïÒO¢gçd~¾Wšúµ¡º—7â•}IA1o:+Ô+£ð;ôö6í‚ìà4:1ýþ)>‚á^üQQ§Ž¿iÄqðܦ㹪!ŽG„r°R*€Y7¸W¨ª…eþG¶ÙªÓ–/2SÜŒ“þTÕ* T‹Æó5R¨Ê»¸¬›õ;*D—Åy4‰~ŸùÜ0wãŸIt¡Ïcá0w ¾°C+þ1{gØ?N gkÓá —”´oàβY"ŸPäˆU óD«eÕnÓtƒ™K&DLÂ’a)»›½ Qk³6ŸÁJ¢[J Y¢®‹v§~3;ºJ‘EJFê+Á½‘ô”exñmž|ª5ª—ZG£¡Ï(§Ó8ŒVþ´ô&Öö!鋵Z©…UÙ6aAè[µ’­šUø£¡#jAé“m¡ ž‘ÎŽŒï–A³/ÐãåHë»áÉ¿qÿç7>Ííå4X‰zðù§CÊo‡ìÄԑבcT€zO–û첺 ™Eþ_wZËpž§qù KÌüê¸_BpÑx­”¥@#bký}lL_í4XòªËZt0mEµUásZ£!02[ÚîBŠÑ›÷d‹ežÍ¸ßV+¦Oœ¿^“œ\´]Œ€Òo¿¡†AºðiƒÊáÜ¿$Ž»r jvØÒ᪄~YPUiÕT(Þ¾)‘iëVÕÔXkAYg…{†ì%©YÈ‚¬&jEÖÚh%eÅ-JÑn2 ›èbô–ñŸ20ûÕ¦OÈOÕÙ‹žÝÉÓÌ(IÛy~3ë‘zãÔ›Ð,ºR_jÅ«»ä#^õ­îVˆÆ]޹<3LNÄç„s¿1Êy̾Èm±©”HrA꾜 ‹D*qýª~Þ´¿(FïÜE°£ý†6Øe+ΰ9ÍOZ Ú>jY“”=V¿Ž}TÞw[èÊÏ’Bßs~ÿT¿ìH(òwÓ2pE0ãe>Š{kàëjÂ’—d2ù~«K%FI>”"Aj¦ClºÅZŽ€ZÜõ‘[Õ7Ü嵂\úàIB6i.ê‡>Ë4¯ý'ÍêöÍIÊ…m.WT KY©»ø èó©*Ö¨ø³Ò2ÅÚÐOð.ß9*"?HX©ÄF»ëh3„DÛND”É£ü›aÂaZO0KCQ©©‡øã“¢ Äé-!Š€•NÓd*¡ë\Ç=šÞóßc ¼éžzé’ôDÃv¿‰ãØÝÉèÆ_Á ÛÍ÷Æ4ÌñÓh±>¯‰fo)}mÛÚžŽ(=Ì)(Íb"‘‹ïÿêcº•Ò43ŸAÂ-xFÊã=iâ&mc» :Õ0ÿN”[~ˆHô]v,ÐmYn%Þ–Ãú««›‡|N'W‚Ÿòî*´ãÝÓ‡ ¸F?aä>Ø/ì§N}ñ'høk[¨Gì₦®9äËÒÍ>…µ†#™æËýˆ%ŒÍS„6ð0rÆ£ÊCÈÁ/¹Òü»BóïÚÆ4)ν(E{/n«­_ Áò«n m`7ÌÝ5>AǬК àA`ÞM𵯫h Ý+6ýúýÆ‚si¢ ⼈ĦksU £~û…~W¤èÕϨӨŒ3KLCj;¥?voC:¶mØ …-ƾ?Äj`[díͰٳݫ@ Íé³4rL?¥çôeS—R`¯g6ÙXø.—O¿¢Ç/‹¹4ËŸIñ ‚dibl«XÅ>)fëë%YTVˆ³|?¬ªÏ¹+'—³ÇIª-¥Æ›¤øº<]›+©qcû,ʽhÏhóYçú‹u_ßÛÀê¸8ç[K_þ¶M¶cx'O“$ß“n´ï¶Æ!Ô³Húóné9gÂ>¹ýÄD+'5ŒãÖd0G¹(ÂÅÈä^­YªÁ}·§lÕ}­K›Gü2H¦V²Æ_gUÌÅXå €¦¿¹rNc¶UO¤¾Î"Eë¼î’u~©Í‘†é…T¡}[”k°p¦£° 0aÔd„IT#>tDVƒ4‡2TH @ÚÖ™¦‰oa·ínÕ¾í“ä¡$úÚk‘9ÿ⦆ã©X½GfNÛðš<Ò\øèêcï;&wRB¶<gv©!=Õ(#‰Ã«Wz±>ÉEÆŒñ̸s‰yôÏ7FZïves±›‹°~fcÓ8V¦K_ õ´Œ¯dMHºky&aâ ŒzyTÄÎd†Ì‡£/Ù'©ò½9Í–&Þ¯äàã+*}5¤ÏˆÖ‘ëžà­‹D¥åþiŠ TÓŸZM3Õ^ø>BƒšOìëë2]°Tn7F¤©Ö‰ÈÇÁÉE¢::¬— ¤ÛzÀb3#9žšÚ^[­È ]sÏ^Q\p‡%Òì8ÜŸb~Ù6(mêGxŠÓ}.ˆÒÎ_˜Â½Ø*äLz¬›†;4(ƒZ9 ¾eÌ´ùÁÑs›qR¢…åN¬{ÒÊ#¢ û2ŸDª™ÅÊx¤=8¹_]ºi…9ï÷3!Rœs™ÑÖ} õ €ù™é‚oè®Ò%ºè˜s´nZ¦££ i‘>:HV‘õ+«ƒzÜE´l€™œ–žÏÁzºMe›M·WX%D½éöá…¯:™Tëu¬ï=_»g~ˆ\ù{ëý<õ}Å÷¤ä;™þ fˆ½¡Å‘—É/‡¿yÈÙ!|èXztÜ÷£yÁ•¼ø­Z°î‹é¯9¥¡<¶É!#‹åÅܦ Â^çƒ|Òù¸>½É‘MîPÞ0wM™Ò‹Úb‹B†xµhë¸9OÛ1RO2Eo³4/c¤mÝPÒ?÷Æ(„.#SŠÍÆ9J}Óê"y0P¿Z|Ý•¬jDÿ~]/³Éð¡P1L¦õ<çÜ&±VèįþTs³‘áê©ÀÐõð‚9g‡y{íf4©f¢—€NÀªñ†á¾d?»²·”{‰çŸ÷|ú´¨Ú@—#dÐÿéô­ ã\ˆ‘á›lÿìP4©‚¾$¹™×d Ç“D«Y12Ó!äŽËéÌE⌰xWù |Dh–hîì(^ºÀZ‹Ý…‰Un”+¿„$ß:†—‘9D4BFâÅ£zŒŽ)Γ'™Æ¡(à®ÔðºÑë8¦3ÖƒÕ›P¢§jö¥oÿÛ¸RHÙ8¢yR]Áƒš%Â~¡G c yG/¹X´'ì¾M¥o æŽÒG᱆:bŽöÃÓU[?`óp¿lŸ­§kÂi&ïõ~_½~\Äùw•tgåö­Y‹Îx“.ã]jâ·æ*ÛJirÊØÎ=·ÄPW+º­ÀA”‚^Œ0Ùê“Mù];ÃÛ?@it¶Ý=ÑyÄVfoê‹,6Y:¸LÀãD•´Šp55ÉÓC™UübHø˜;xœ,CQí–|ã• •Ùè4§x „\¯"s=xÌo|ó?7—2C QfÒ2ï¶ÍgkQë§‚Ý&¥KBޱCš/‰)æD{•dl ^OòøÑ¼Ö¢Ü )×~½é™‰¹«°KkÉÖ#ߢ Râ ‹Þ4ñHƒý{)Ü€ƒ ¹ùiÝSPa,"ÇmÍÃÄŸÍÙ13LߺNäJx(À(C ÕÓÌ„G'˜4½®éð*¢[]eÅ… RÁh Çi`ÎãQrÜ·žÍ#µ‹8nÁùº¿»\á>~²Ù(¤O ¡‹“˼\÷Ã>aš=Š´O"€¹@vQa#8±û•|¡6ßG5{¾êle&ɢûá')‹ ëÓü ÈÌU²ý˜g.ÃPïMh~p°ÜÑàÌ­T£l©a!ÂîV:kúºò;2ÖCˆÑKÛáõ夷ayg*þ‚JÂòt÷JO• Tf1BWGþº`ŽvjÍF %ÂL¢×*5Ò$fò¶ ™ÂÄUèD¿h+°šqæÙ_­0Ž»5´;gÇ{’߇¾xé Ù4¤CN"çGƦʌ‹°”Ô$V-"o<ýœ,C< u¿Š[7·´M­éXÈ.4%9$fؔݵòS/C Ê¿ÇÓúåu¯vhŠˆhm£ûøŸ¿svŠë+¬1ÿnâùˆ~¥×Ëëö•›/þ±²¬j Š?»ÏM§ºòxm^â«>ÝÖv|è¾<÷lÝcWp Z’98Œ~ÞT+Üù÷T³{ërz„p3L©N³Û;ö„á˜c¿ŸŠaüÚ VR¥Ÿ¬¬ÔïÜi».rîj1•ØOXŸúÁÆ 'µg ËµŒ|ìj‰SÐÔP‹Ãxý«j»PÉL®º¼3u¹ùü1¨h7OýÞv”Ôöq$V$Qž'¬Q{‡Œrh\¢±bäL#1•®-oÊr覣:,`ª“ pés}€õ±·×ƒˆ:ÎiGDúø+kqHPiNÞV€jË ‹º#Í{'Š/æuˆÄh“ß­ G-×F©ñ†Ê_ e£CÐðøR¿êñCŸ A´Õ½ÙÔ±kI»®ÜÙyøB“³4vÚÅdÀ™àÍ™]N<š²©AðQTm<­LAé°œ‡Sü%$™@x–=€¿¢1fk–¤ˆÌ_&Aƒz)¿5ÿê?ÿÇjŽ˜IþD³BÓ÷ö ûQ?hºÝšáù—µªB=Õç°Rzk/òÍÛp1üm´£3ÎGë¢ìÁï1#ÈÞ¬1ûo>L7ðV2:¾‘ûmÛÉ„©š$M ‚-”˜…r ¤„ïøk½H7éœ1w,#|ÈG1«´:g¡ÿ¥¾Áïc$ÞêGfac®›yëÕŸKÚ¾ûš^‹uˆÚC°m~ª®¥ü†¥ºeËÀ¾ÍÊì“ìÃp{³)XÅNEÐ`ˆìsMò$Š'YW—&IKU}zn“n7ìÚ%âf”R¬ JŒ”¨1ÚVó-ýá»Kôa‘t­ÂÙó¸8`áCgF€kOZŽŸ˜IÛYXAf¶WÓÿ鯖/åËo]œ¡~‚D[ˆ“=ójÞm¸þd)–ùÏN,ß.²Ôïˆ4*Ç‘Wš9Œ†Nêk¹ÓçWy€ú'<ákV”Š|¥áËÁ‘ÒWˆºšyǤZoQlͨ È9Qg²VvïXºŸ‹U;ûTãýØ>Щ` ÆÛT‡â?ÔJ)Vˆ½Èšîc—“îýn$*aŠäô3hLúéÙö»üòÍå0)ãc~8#f¶ƒ†1÷vkJ§Ø¿%®lMc&65 6ú /anãí[´rsïl\à­ETË…qwA²z#QÕhqªås ‹Czë²Lðý?âomü"¢ª•ôĶELì°ùܦDH'q (&tµ&ÔpHÑ@¾;óæËk¾sü Zÿ„Ft¢ÄMä1«•5ôd*¶©º»æçKp^Ç$q—ÃCêhð$äÊÝTÛìR[Ts¢ÀvSW*rRút%FxV¾1¹5Y9)FP´ï{][ç»FIÌ÷uØñ™Aÿˆã꾊6_‰R÷õr´±õ%~äªÄãd‹ÓÖQXMÜ}QÁºÌøDȪX7ÈÅÿ=Y[ -kñ'ô›if±ü¾¼Ä–(4œÆRAúª¥—3Z¯Æ…)Á7†ÉÛWˆC°/GÒ5ŽË»‘ç3Jf„ 8’Ì+8ˆV 3s,Ô6%ÍÈØð^û¾¶.:r;¡‰~÷ Khÿ5>–h£öû&ey¤Ð=Ë–›#Èê[É«*Ú2c[y q ¥ÑZý-Írÿ "˜ –™«ŠÑDÝ0ãì‡L@BòµbÊän¼ÈKÓ!E…òU´`-WA¾ÍÿÌ3ú"{ø[øúÁiDˆ¡ âñîáàâýˆÎR}ç¯L«L™‘C¾áZIEÀFØþQ¦sAg!“Æ¢Á;s†Ýù\¸ÜÀ+û·KN2ŽË (Iý@m“KRZI nö¯Ey0‰Ä´4G{ ºfD\— Ë D—] Òù= “eKéß­ÇžÔ˜Üñ&ìj En‡ ’àýhW–¨6ûÃaþ‡bKt§8\€G¿œÉ¾jÿâõâ.€w˜:,Y{.UƒèÈeÕoÑš@†. Ê7˜˜P)Ží²?ŒoIPbgƒh‡]_ Å‹Å&mÀ Ž<ËBÖ^@ ­ý×…¢Xò¸lfýV¨¹Z)ª†>ÝBòÐ>8£¸v›Áº@×ýaŒ>‰çi検9f±öÀ Ä1-¯Ù>´÷µ{“â~›B_ApTqŠÕN"rZœËá)ðÍ dä¼9{o Ê.4+&L¿ lûìêŸÝ&eœbª2Éreöþ“`$úâá„/Þ$±6F6åÙ%©‡ÏàÊ2fÜÖ²WØÓ¸p–kYeøeºû¸ÐKL²ù••Ëòá»û5¤)S ¥)bO€ ?’'N5B›7Oɲ³)Nüy´è²{-—[opg­ˆñŪŠYp\>Gƒ‡'Ô©²¡ðÓ³n{ª§Œ ÃîþuôJGhé%ÿoô8& :ÝÒgæjC¶H.å×üJÇaÒ-hÑTç¿âļ!“`º—þ¨f~OŠþì¡«µv£wÁùcÃJ}Ã>4 ö·ä×¶œøåw<\àço]tç`Ë#HÏÒzDûÙdŠÎúgœîN_±Ÿ…ê`0?flAåÚþyãÝÕ[ø8/TÔ×ìºc ¿K¾â޾)V‡õvy •6ÿà6˜– žâêTƄ֤ ¨Þέú“y¶.šÝ¤- rž]×Já»Óš¯P$2T¦Rˆ‰ˆ8øæËc~…{êÄ[%Õ­ÔAÛ7ûÝǚؑÍõ¶»F0—)ÝЗ!ŒÜa©ê¸Î'2§L€pç%x1Ëm&K@¦—{ZÚc”R ô[œÞ¨<å&Ñ;{K—ÅhaýzuvS¹á·ËÈlÄ?òç‡eSÆ9ìÓ«i|Â3“3¹ü0 {Ã2U„€ ×PæSAÔ¢ à¤ÿeä§ÖOxžÂ ?-oИŠ&Èæ`BÇMϲGqRn!iƒG t»{±V"Ð8º¥ÅV9™( jï‚ÛÕÇù¹‡ùœÿƒpsÎ'Ðhå›Tq[þÞ»‘¬· ëJ ‰û£{§gk2åzwºŸv\Xò;Ü Óˆ]S~äò…ÈH(¦‚L˜¼—´£q±â…3ó÷ˆE.B ¼ò‡‘LªŒ èºdLyžFßRÖ1²“@Æ.Q%&kúß:@(˲¢åžÚý<‚Î ¨?¾Ñþ°üÞI(UÃ\{‚éS@c‡'ÃИçÿ¶ÉSlŦ>½0Ù$-„,q£=!“cK…GŽR]>}눇aÈ’ÂyžF„î\asû–ŸÕ^¥lŒÐÆϦ*«é˜jéÍyÙ§¦_Ï:xD¡Ê¹ÿÖ?š½ë€ 'F‹œÝwáÚ.Ÿ‚&[†TÄžCf¯Gª+4t:9Ëf *®9Ú˜°•’Šwzá—Æ>ã`sJ£ {—`Æ"!@ŒT$²ž€=N‰º\ÓrcŸ£wyi}°PäG‡j> wÍ*~Ü]?!Œ©~UîJÕH²W‡‰ó (8ÌŒ1R!wÒF/ìfa)&v5]Ô„_å6j™Ý endstream endobj 519 0 obj << /Length1 1861 /Length2 13191 /Length3 0 /Length 14340 /Filter /FlateDecode >> stream xÚ÷PœÛò‡ ÷à`€àîîî–à3¸»»»; îîî\‚»»ûeË9{Ÿÿ÷UÝ[SżOw¯þ½½V÷š‚ŒXQ™Nh¥·²´§c¢gäˆÈ)Ë21Yè™áÉÈTLìÍAÿ±Ã“©‚líL¬,¹ÿ!b Ò³·‰êÙ¿ÊYY¤ÌL,&vn&nFF3##×­l¹¢zŽ&@€=@ÚÊdO&beíbkbdlÿ®óŸG¥€‰‹‹ƒöÏå! ­‰ž%@NÏÞdñ®h gP¶20Ù»üO J^c{{kn'''z= ;z+[#~*Z€“‰½1@ d²u” ׳ý]=<@ÅØÄî/‡²•¡½“ž-ðn071YÚ½/q°‚lïêe)Y€‚5Èò¯`Ù¿ho€‰žé¿éþ^ýG"Ë?ëXYXëYº˜X MÌAqYz{g{Z€ž%ð@=s;«÷õzŽz&æzúᄎ@\è @ï½Â¿ë³3°5±¶·£·31ÿ£F†?Ò¼o³˜%PÄÊÂdioÿÇû‰šØ‚ Þ÷Ý…áïÃ5³´r²tûšX ÿ(è`ÍðÕÒÄÆ$%úwÌ» þ›ÈÀÆÈÈÈÁÅ Ù@ÎÆ ¨¸Xƒþt2ýa~¯ÁÃÍÚÊ`ø^ÈÃÄôþïf§çØÛ:€<Üþíø_‚gbM ìú #Kø²¿›A†ñûùÛš8¾1¾·€ñÏŸ´Þ; heiîòOøŸGÌ +¦)$%IówÉÿu [9ÜèØ™tÌlŒ&&fÇûƒÇÿæùïü§ú?­Šz&¿Ý¿2JYZ¸þ*â}÷þSˆãßAù÷ØPþWAÞ꽟AÊÚÿ;#£Áû¦ÿÏCðç’ÿ½ÿG–ÿ×öÿ¿o$î`nþ§Ÿò¯€ÿ¿ž…‰¹Ëßïýì`ÿ>rVïbùCÕ@ ´hâ`ñ½Rözï3"diôÞçt\ô¬ì™MìÄMœA@E{ã¿Zé?gñ.anb R´²3ùãÚÐ112þßû䘽_-vï'ö§ ô>Xÿ++fi`üc™ÙØz¶¶z.ðï ðNl7¦÷Q‚œÿìp½¥•ýûÀ{‰C+[ø?Ε À ô‡é/â0ˆüCœÑˆ À ö_â`0ˆÿCL‰ˆÀ ù±¤þ!ö÷&þ‡Þõäþ¡w=ùè]Oá¿Äù®§ø½+(ýCï Êÿ+€Aåz¯ïë?ô®®ú½ë©ÿ—˜Þgô/|×0üÿ “yß5þ…ï2ÿö¾g6ÿ¾—bñ¾O.ƒå‘õÝùþóñ/÷»”õ¿ð½Ûá»’Ý¿ð½"ûÿâ{—0Ø;YýÉÿÓ&¶¶ïéŸãüÞCÿá?omÈd¿8geÀãoZíßz_)„ïD·3ÎÌŠÔz «¶-†ë¸÷ÅW„÷áŠ%7lA¨sf7ìa툹ð­ÁL‹ÑL{Í=%Œk±¶ÊP‹Ö}ïñÈNÖyW¦£CS—Åh„uÖ¨4èt-8M…Mks±3›~ ÁKÞX~Wf|CQL>ƒÃÉÉ‚îß&”ÞV.\%4=Ó.õÙîRpü$Ž@üà!¥o„™m³ÿw1-˜ÉF þá!’µÌuú!ò~7;žŒî`šl»[ ç)šÒ÷ºÕ߇RßnTY€”'Cj{âRòò4C½åm2*èA–¡–‹BÛr®E]A£“e[®/FÎ,ììs@’µÉBIwVáö«Fs¸à ·éAð•½V„;ËÂYs¯¶æW¿ & 5ßú©¥RÅñ©q!¹²B“¤P†9<¤€¦…t Þ²¡¢ïGM–VÑå·.€¶ªÏœç:Zo]æ! ¨°^H&õx? R äë‘PYÀ?„‹÷_RIwت|ÍθÔ×hu Ò­ý0BM~/ªm&‚& vFBëí÷lñÕi˜´‹w°²1gèê5©Ö¯lËY_2UzëF>,Üê©Ñ|ç®uÒpðì¾ÅUj0rŽt¸?]¦)عR1: eîø! w§g+Ü·sÊíÉr„¦*)âø4›³…})Ñ÷bœj¶Fbóá°Îúp³*›™×ÙMezxqó¾Ø MáQIÜGC–™U§¦¢øÁäl@®7d¶=óƒ/ßÐ>Jñõ`Å %œñÑìÏøÁeµçIŒ}f~EðqU]hEm<ÛïifièÄdx£xE ¸¼‹ú¼¦|Îdqã°ÊÅ u©Ð†¢ýèû ÄŽ5„É ÖbJ*n…]š |õ4îÿ›«-¨í¨hЉš¬¹"KzÆæpú6AöPÂÐ6 í”&æˆ ·åÓt ú…A9z×s)À’ÝÏW)¸]¦ ©³ŽºtaDÂË”gfS|Êq YÅ]Z«¶µFmš -®Îy”£Ns˹*Ÿ ¿‰ÌãKª»ŒSMLÒ“^¸(îܹœD¸3¥ôŒys²JÍ\ø¾RY½7ºêm¯ä[oG¤å:RêL}ú‹‹ ¦HHH]M¢+*v¬îEK‡©_ªí/t“^Õq®\f¬©O“ߟ&qY4rNJˆ'¤!øÔ>¾ØÛíYÁÙ↺¬.QG·j“<cóŸ×‘ŸChž¬Mê*Mq'윲:-¦_”Óé¦ÏÓMžºªè”ÓÂP4™ lXæ}ƒð¬Â/‰ Ò«‰7Ï‹ð u*Å#l¦³:cúø»T¿ŠÂàî!~þÔIÄ9Zýü–vú¢Ïz¾xrÊ$JÔiý)½QqÄ·”&W©µäH"ž‚:VÝ B£Pho#<ì&ëLÛDˆzVè—'Ö«A^º=¾x[ÛÆîQ’<"Ý2Éž‘LJkc)Ÿ0o?Ì#i¹ÔÃ*5® ï!è§¼-Îo §WtZ7º§È-BÌF“CÈC:$ ø&dSaMMD;ÍA™ºs›Ï˜àÉ`ø ¼Í µÖ¿¢¿F ͦ†èo<ØÍS½.¥%2Áð¸ÃK›« ж莃[ÖŠsë-ÁýNÌbó%ýgÿyxš9lËÎ Ud2)FHA;¤{7£óÑÂ(‚ÕJ9õXÓe.-<—Zæ‡"l5gºÌô|cÆuõ £b÷ÏÅÙü Gœ†KE-$<ÁA•OÎ(›’>›s‰Öۨ㖷{Ί g!’®5¯Åå8r·f³2´£°Æ{?ª›ÁF¸|1Y.ÝÐ à /|=¬’àñR;1«æÁ6Aí§%Aa Fc1‚ƒ‹_ßËeîŽW¯üw5L[“8Ö°%xô Æ%Ú0LT}¢FR”´âs÷5ã”Ñõ{Uœ©yæ=ó-Y Uï/øëÚn$¥-Ê‘—Ê?²ÖRwŽÏ]¤4ÔŸu©ßîƒÆ‚&2Qæ›TÓx)›ýݹâs'×’ƒÉVám;‘AÒêír¸Ã„¢–\Sså;¸M­p½ÔºÇ«¿:“>ßNp!V,OÏ6‘5}"u¬êàèÅ:9¾ÍœNe®]wWì±¼êDìÄ[Ne¶>¡aåbÎÞæmÌ" ŠÔlöl`ø”µ“º±€œìK®ÙÉ—Âë%ìçqmÂy?“Š€ƒÔN›5ýaƒgÜú‚elfüÜ—b}üÀÕçÅE¯aÇ«Ÿë¸%¸œ½ŠÜ îÈuE>§«ƒØ’çÐ/­{ö…"I¨ÎÛA,±Åóì{l—…p4¬A:·éÇzEDGí%)¼Ú OýÐîyÂIXèbØ–†»´¢ ¢ Nضƒ[«̱1àòC½³¸ìÞ9•™‘ÑA|ÒþÑóëQR,qÄÅ•-­¬$^n´üâ§SèÍáXç°ðy­ïy×ß²æl}ïnŸx¤B¨|QYù$ñ@ÈäÜ ~[x›úàîÎSdÅFàD/Q¿ŠáÓ*kÒÍêJ»…>Ïééž@´ªúR}Àh:)W[ˆå3×.lÁFÞw î–¡n^+Ããñ>•qV(ÿ6¤v¨ƒöÄe¼åFùçŽÆÓìz¼®8Îfà•øÇ°0†_Å}SŒµ%IJÙpóèDý‰2UÖS×È«;}ËÓáÆÞ4€6ð‡æx„ýbsOB >%²Qþ=Œ4¸Ô™Pú<¾Šb¡&Õª“"û¹æúmºSèMµ¾'!Ë·ÞA¦YÆÞ%Á,x|KžŸåfø˜3Ééê4töÅÆ†íèW­4Ÿb½ÕgpàŠH³×ýŒ_vÝ ¢’ãð諳–ÁzböÝÌ5L+@pCÕ "\>V<% ƒqf‡k,=5X1Kʯ¼#ÀªDâu2—*)æHìëý>ba병2É€G i×£ø ’.B% ž=B; v¡E‡d~à‡ØC¶/ îî‹381õ{¾Ì±­§—©³Ez^ê¿} i½O».ÿÞ=k™¨„*œ“"cEÛBS‰†x'3'U¶;êi ärß8¯‹Öl°/´¢PþâVpͶIq×ýZƒiR^f_8]ü8×…et9÷гã0ƒ¤%Óù¦õǰL¦ ÒNñ÷¨…Щ5IÝf­$Ü J‘%¦*úuÔ"Âõ³d”%f¦é<Ãú˜ä]+  éÜÁGÕß„{¡ Ç„sä&>&cSî´ë…¹æâ„¯¸~Ú›[”ñi÷©„hcCéþÑ$Ò-¦§&ʾè/OH ‰IìŽË$C’¤|s5ÔKÉq¸ê™ÉÇs¾îÇ+n#:÷´%£x´Ù¥ÒlÝ“í Ú ™¼ND{äóC” jf³ï1³ÅlªhŠë¤õÈ``Ñ_RðBÈ7Ïø•DS™r÷æ„õˆNãæRL¯ gZÑá|6Ñ ;o©=±€^޼ N‹¬pÇþ<‡óv”¼G±M.(»æw>\MÓÅ¥ààœ—hJ¿‡åqUîfeö;sãê˜Çqà± †7¥ÄÒ· ;ú%m8ݾ6y*ß»rÖº:w|,oîÃí¥¤Ûíö:)±ÆY?Ë7;…E_ Òh˜Ïã’® <”Ü[êÎiïÿö'Q`oyÖ1 Z2O?dõ¨•Gå-F™êWÛ™ O~0dvš‡o²¯÷ŽöÏAŒ }9÷‰Ç>ááóÒš<ÃïY¶”ÒxKgRÊrïÊ$>ªoòúgÈž¾Ð¥?j]ÎAæÊR×FoœH‘b@óM]‡/ó]FT,‚ZdÊBš°0 Ô"¿-óc«ñ¸¹f‹/]{àÞlæ™&†“ XÝí0/bê¤`6~%e˜› ByÐhNòä@›Ó…Xíz$Z¼%]dzøZUåzÁ$Ù–`²›­:û¿U,µ­»¸êËÏ»`n!þéI¿¶dû˜!¥ ü‚⯚TˆåŒñ=¡Bè7Õ0Ö˜ÚˆvÉ¢s؃(sS‹ÆÙD«…ö2žd:¯^‹ÿ¡E«MP9s6¢§qù"]w?ÚxÕNj÷hë^ܬL¤{ž“¤2t—ž1õOšiv·gûÕ $Á9³ ×[Ã3ÅïSG±åWÂîVØ&hs§”àfß–APAí¼ß@H‚I6rÚÒCËö ðˆ%²µ"©·[‡æg´ßAj未üiÙuf½wSœ:­?›8×Ké£Â¿øj*heÆ”‰üÂ^ÂNíÚD:½ÛVýÉC–1RÄí CæÂÁÅæþ¡L] a zºîÇébG0]ïzÿ½PHX´ãœ«ÿW×z™“BPRÆŽM¤}MÛ|Ž ÁY‹Cþ|Þ‰Þa©^œÅ´›ÊƒZĶ9òÁa­˜}60ñ VÕc-Û†½ÞHÁSÝ­x½RÿflŠW‹Ø»ßoêÞèîU..«Ö3Î;ç‘óe•4&ʰC¤|P.!†¯íé·Í³J|ÐÄ.uE;N*À«—‡»ŒÐ>© 'Ón"Æ}’¿»¿•!¥™×>;o¬¡¦d‰+Ç´:^Šã×=êŽÛ‚O»œúè[÷mù¦\IžÛððoà ´C’*²Ë—nyÜ Ž¼è¾šÖ¯½oÉçH•bõ)Ö.ˆo¹ˆLº¬dìUÆ þj,ÄÖ}›^™›U±cgÒKÔº«“Ø¿Ñ&w¾V-¨ªj¹î¤°Äœã(\Y¤”éb¸^qwà¨\i†eio[*±p6D=츣¢ÆæÌš_ùäÈ„B±µ“ãÄC. xjÇŠç8]ßôŸäSG!Ô½RþÄ=´ûnïÌÌñû ¶ÄʱŽ0‘Ö@t–ßtR:ž”LÔN%ãÒÅÉq;ÒZŠý[ÓlH16ý#fï ­agÈg‡œñÄÕ›¾^‹ô :äÂJ“¦Ç1ñ±µò©½‚Õ¥&b­ÂÜsâ ¡ <Æ|‹Ÿãü¹éÊ÷½Ça8^åDí×®×|ÚÉ =£\ÌüÜ™m"];*_ÃøÐñîKYì3q &-Íš:BŠ1Ç u†A|—NF¿×›QîÏÒ~`üt:B‰õ N:%ÞÌ~9+¼|f’øü¤ë‚ü|ü‚7=ˆ m—¼G·6u"D6k¦ÇQ»ru Êõ3wð ù%KG":¼úÄo¬ftþ~èÕVl¸S²í0â/ÓVô¹ÑŽõ-qCè“ý1'ËExèR2Ova/áÓ»—#F\„×~cìØv5>èn´WBΠ·‚ÖI÷â>5!5q¯y‹+FTÕϹWšÍ¨7¢ |¬1†!:öÉ23ÞF…Ät•V@Û¶R/sHùO¨´]h;ÐCÇ d(¶«ãÆC¿‹p’R¹÷Å-òÉÊ㕈UgÝdžjRò®:Ù%uúÏ„'‡†es8?‘lX,Y ˆÐL †[ c*Ê´å¥*Ši2Ê6‘Vó†ü]³|c&K| â¿âq¬x¢WÈOb‡rX¡š§\bínû2žv~—Ç%Êý˜~Þo =¸PvD ,Üíƒ[VÙ‚“묾 jÊ—ã9ó£?£¬qzBi c3½?äómÞ§Ûd[™HåûCR èš“û`£Ã“wpÔ¬)ÃÓf>Òíú&ž Qr°ª ÎÞÍ 4³Õ tL·`Ÿ ÕâZňÀÖ?ÑbÖ»ŽqƒîΟ‡ªu‡Þg@Õ¢$9šYz£“Ò.€ÎnÇvæSDr2¿]_u‡{+ËÔÁ:ÅÉ<!вX÷b%â Ûš$¤óº»ª| ]‘¼âD5ü¦vηõËAÎÔd ;A <zºÇÖT-7V˜gD .üýôàwÊÄÂûòe©ƒ|»N²UÁל“¼7¸K¾RDêûg¬Æz6røIáàÖ‡otQÏÇâÑêBIŠ‘?àrt[T¹×}G›¬a²îÒ0ª'š‰c_ËPhÄïsX0oÓ´=qˆ©„9sÅ•ís Íh •S8&¾öÌJ;m„ú»ƒÛiø¸´6>\ÉáOàùÐv* f®Òþ?Ù°§ lvèŽt™Ú]¦êG†X%K“«å¨2-YÜ^òfæ­£”¾à–v2÷ˆ÷bº¹ÝåêµûÓÕ¯±?Ö=óÿ¿µøuåm1†/ob•;œ¬Õú³ý¶uÍ­RT|ÇÛÀ„öÛvK~´3s`ÑTó‚¹\úþÊ y°ÒÈæ‹>Îß•ýU#ó+43¢¨¼Ñ·ó\ßñ¾»É}CÝq$á#4{¡ëú2ªÄŸ4K>œVi£Çw6ÔÒî󋉟³¥‡8–tmúØ_âj \ÞÐõãTð LŸzàG87­fÔ‡Ô†Ÿ5*ÆÈä6¿Š²ühTp-”€ùFË ×ˆˆs°¼÷Øòó¨Ía½G€+RCÅÊŽÙþ½'xÂP%Xñ+ôÈ࡜8o(1„ìTø‘r–¯àVÕ{EXàÉÝ'EUœÉ,Bqx¿Žý=<òFŽC ‡D呉Qæ)-74eÜk6\›ÆŸÙÛ¹„eRPF øºGÁâ)*h2ª¨üúñ5¡Î4º±˜ÃBTÒMk5yਸ਼ÅÃñrÿF*“‚&P×XÂI?¶uf~˜ý ±øÛ%ÚÝÐë«®—ܳxÒ ‹Ñé=5q@¶óל¹ÙX.ŽˆÂÓ;ÑuW[Tý]ŒëÅ6ï~œ.Tú¼zð‘-8Ú ƒƒÏ÷æÞ”äHlU­}¹(h‰Hª'å yC±6: P5¢<”/Úñzíõ½y*eÄ6[n¢‡¸·Œð„vi¢°è˜‰[E®r¾zêQñOÛó/ßšK»P5Šu³PØ4¿Èœ¥œ=‘=iHéA\:ØçÅéYsBßÌss ò¼Zç wËäßÖ†€7 ¯Bñ¯õƒµ‹D¶ªûcRÑä[Ð%qHˆD?,iyqWa½Ê9¢A•˜'«Þ–#Œ7¥ÄÍ^©{¡Aæ&ù_†EÚFËJ>}bHf£ÉR@ñîøz÷ýÍr㫦,×Ïeð†xCo( \õR³^ gÓj.7hçÛ¢3¦ÁáÄý'Ÿ(’JBÔXå³qË+Ðc~!Ÿ¬Y0®ûX T“²¥‡*<‚¯­R¬°Ç,^:4ë‘z^f _€àoÛ]8F1Ìôô>.ìõa°¯¡#¹Šìñq|º Ñ=®'A¥ùfGQiè€1Õ‰â.X ïåCÁC'E`îuiOiËEdàžmº°L«ûA4ôIç“ñ¨gA \ô³éŒÊ¯ 7MøºÃôYèÕDÊ” Ð -µõ2³CÉÚ/Íä)+Óõ¯ûžO½âôÓõYr—SFÈÑ·»<©`‰T0Ü- C\!¤vJŸ» Ër–9ÝÔåE²Ó^Û2ŒÕLø4o ¼Éûê)%R™‰4žEb·¥W2Ø´ž²Ðà“|¨š‚Gã8Ä]z'Ò D¡›•÷¶7Ôz€Ûo×1 Xë+ä¤í‹­b£©0Ô¯A  9ê±Ö4z¤IŽ"vئa PÈ¡Q ʪhŸ˜U‚lžŒ´ÔgLâÓ1t €FŸR#Á}S1fóÛæ°š :1}ÈÙ6ˆsBäωePöV¥™U~X8q8!:yvRøŽ¡Úã>¨]©Æ*q|×l:ÞL¦£–[ýÝq¯ ~·WH µÛ„Óȳ¨K(Xm½‘_ú‰xì¡×³ÔqÝ+ã3Ö¬c2}t·BDRé&ù[ÿ‘ó½€--‰kJ"Tî˜ÈÍË÷ª+¸ÜmºæSž7ˆ¬’ô„¯f 8וĵòzóñac9jÑqGh:#Võa¿3ÔAý„IÃçË“kKÝ:víEºœdOfžÏðìlnœV°”•±¿’«~ë­µÞ˜Ò Kº•Ðbqa„UìH–*¥­c^á¦ëlZ0•xø§fËÝ8D()â[NÿŒ„^Þí\¤¯í¨ñ3¿îh}döÔhŸ’5‰ÔüF¨ãò=™”´®êòwœ–[ L§¿óws%ܽ%ÑÜ'ÑÙw§•t[NSއ‚ ·ÕfÁeîfRÝ _zzáXàS#l¥¯$;~ȦfAþ„êƒÖKŽï5þ Ì_íÄ‘ÝùÔKòM*ªa×7þWª­w"g¸½Á×0:ŸÅ‡ÜúñUü™êäçB˜o ]7¢°2‰²]¬iƒNšÔ¦Q<ŸGa¯÷_.žºuo ¬·£ª~Üq—…I‹–`ÐKdœ^`ýÏ0Ê`ºø>lÔ<âÂ% EYÿÅelU;—{5b[Ò^„Ùbp‘›ØÒ½m~ ›§¿ôÂüC‘5(¦ÑóSgwrdD%%æöÕžO€ðŒì8_?¦ 2e×4xyˆ/¼<ôäÅ»\ç–G(W­ø»U°Ò9)Gñ“=—Ù²?ŸE1?½vþž. ž×C¾+=®A:j Ï…@¶ñSO”ä숺éCQ g&{ýS»UÛK…!õ:kV"š uÜAQáVÜUòwŠ:#—-íÚê¦1  ®Ölæ¿Uÿ>1K•ÊÒ¨µw¥_h‡~½*©ŸþÀœûq“ú™x<ˆd·›Ë&"vª jMÒií^VôDöm?-„'`⤯ú—y_…"k—Ä#Ü:)ã¬óÜÐÅåϬY­PA²ø&â[.ÄNÔÞ×[ tï\wÁyL×ð¨ºÅàõ|¶ Ísh\ÏÒ'`h7»¶V7ª+G-t—IA©€c¼>Ú7ì[X»!•…»@ôt˜Eˆ€ÕSC×Hú™1T’zi)´î6—ª†srGê|E Z"ýÌ)fŠž¾Vƒ¥zß~=´òµÂ–™ uP³©!øÜÜôj—Ýí ‘§]Þ]¡nÐ’¼Sg%ø€äi}çÎh¼hŒíé4A"Ë‘›^nL ‚óÜ}Âÿ¨Ðèõ2|ÍsÕ)è´[²ÈÃäN× *)ÊAö× ÔQ‚éçÛ&µK&w€ýêcPþ1«,D¸wñ¬UxUIR¦†L‡VÔìÕ6ŠJ°Ê¦:Û-°éÚÆQL°¾öS{N½u)X´í…]ZU•Ý ô[ÿ'·¡ ý+ð)B ¤—ÉÇl75k¾¡±zVÂaq›Hi“œWR•Ù}ÖË.µ×cõWÿQô`çB´OÊ9 LiÖ@^´T!wb ª&Aôp•çÃ@C»giÂv‡v¨ZÇgü§[L‰Õ¶H8qðˆNÁ¢×S![&ú¼ÞÊÚÈ5ÊÚä4¡ÇR‹R£âY°RåàÏÑ&ߣt¨Z—4ˆ^3.eI•6í‹ú8ý3Lå#êž.3MÊuyºº]~>YK~tLVYò ‡ 1 â‚Õ’ǧÄîžkÔj†ÿ3X7Ã(¼O~þOÿÀC43ÑHF‘ÞbgPN¥ N¾ ãæÅ¤ˆbz¸žqUn¨P‹Íê;è[‡m'¼çÇWLêƒ|j̵ۖ\¡ ¯ hÛÛÌ…ÓËæââó'Ô`yTΟO%ǎ^êb JÏ;òФÒÈx˜r5t|¶ŸDë°Ó>vtè$ØúlÍË8–âfveH†j@êŒÅZµ¤• Q1þ@÷“WbÃÜC¯­ÂƒçD0†tú$ð£C—Ë·g8ÀÂt˜Q#a§Fú¸{»_ôj׊ˆr.¾¡Åö¦5Ÿ—»£Ä¦y›³¢¿ÜFŒ‰Œçq ç‰7«—:ñÉš³ `:ÀP%­¶ø@s|ÕÄ (†–iÈ[ï]°-›ýšÈžxQh>ziBDq—SHI<ÀC %é•É@Òó±ùåV;¤?ÿÔû¡£«0ú>ûiP˜š|8î£å/"¼lVãQÌ -¬UµÌ™ÄYѦhq¤óïØõ§\²ö91ç6µUºRm.6á·](Q«ÁŸÃ˦¦Ï6‡X3ÍtÞjñ×?p{,Ÿ,‹u‘ŽE$L°#%÷g)*UtIdR«µ‰Ü=µ5'FdŸ­¡ ’0š —妭%É#_±øø—}]PíC×·"–lb›M·.3nÍ®Zæ¶nZÄXŸåÝá®`†ŒzrÆ*gE—-¼ëR62–Ðm`RÜ´F¤P}U[3sä.¦”« ÇTY ìw^çÐ÷‚øƒgµ]§{r¬“—¬J”4Ï~OÜS9š´"ÈFqépsl«ÉßYÛÇ%Ó qï>C;yY’òÓáû8&¼B5ÁÉê±¥×êiÛˆµµ9è@—l #Ê -­Ð-Ôͳ‰–#ËzAÐDû6tcg¹>ᚥ‘–ºú7æ8*é„ËØêd–íªW•ðiQV"tL×rO3îâª-ìøB^Ùe… ó•H‘v=ÒIr×i¯´Ý£ªG©PŸ„{‰Ñû8÷ž k5MÐb$¬}Ïl‡Rv“°ÖȽїv)Hö´Ødg%›9Ú„ll®„'¦zÖôò"ªOÐ|UÚMžõQ‡y-¶dj/£ˆTT&ºöÁn¤SDòL¿tñ ã3î ¶î?>|L_"‡X­à“Ôr_‚[5¨ÿ`ÌÕ÷˜”Û¥Éåk¯ Z#Uí‹xnø)5PáÈM^w7Ÿx–[lq…SÓæOúÛq{tñX9¹ƒnŽº¾8NEß¡†××·¤å(724^ØÜ±ªfÜÜËõ)ôOÊ>–ëbøÓ!E3JF•6æ=6ïñUQ'îìpx‹õ‡5w½ýžïîà‰ÏÆÓ`ŒÚ?k«/¨ZŠ}Þ†³« †^Wäh¨ Tgš¿û`ý‡ö©W³^ê-7 YÁú_æòÊàp ªÆ-=¼Á8ÁˆJàc°²œo<[‡ÍÆW1°k}S€+ø*î²vÌh÷{­zwé†fë<Ô`æ&‰Îmf¬šaxz´GIô×"l+ð\ÖøªVG «úFú³dlÎRÁhˆÅoÔ°VÁ]–V«Á*¦¬sZy ñ„·*UØT%Ïò GY4¸5ŠôhéØÂ±Âçaü™×©bÑ]lÓHS~ ¸!LV¬_ÝLe˜¶Š6Ô± ¦ÕKDÕ©¬Ó¡P×k Å´ÓÞ=óLäÏ¢ý'TS÷yOCâzG¶~´ûaŽÕWЫFàáX˜™ö#ð "Rwn›mZºÈdY4Õ.ù§b|ûy’ÛfZ Uß÷UXRê^PÆqFb«AÌ+;¬Ã×—Iäþ}I×؉ÂÍÓu#Ov½@ JÈ\®ü Þà/HñÛË„uSe×Õ ¯Š­Ë`ßé„ÊdÐ6ù³h]uÈTO''ÄéKhƒ²Øû¸yT¡pgO ©Êùr)%]hæ§ãC‹ôEÑ¡Hål)M¡f ’„BÅ¡à&„œôƒ·ê\[í6Êêš+²$»öTÁUZ¬ýª½}Ö·U¾"SVgz')þôëSÍ LIû8ieÐ1¡GîÊõšE–iÂÃÌÔt’Æ ö˜½1J­@ÖgxÔGm QºIú{¶ ÀËnE›ˆš·Á…ñ5ö™ 21 £ó ÓµN–ð[ tYN¼½.ƒ§ƒì$íDNo_«h Ä¬s-±«¢žy‹Þ>Ç7–/þ`)nŽÙØöÇ… &ãL‘Ä]x4!F¦0_¥òd¨éh®H6äÛ6uî‚ó Çˆ!µ ¶?Kbµb3ƒñ1CE¼~ØÂ:Äuä׉ÝÛH!AÓdÃìh¤Ôk›§5OÚWŠùª+È¿”9¸¤®Ô+%Ùh'=p#OÔ.3ÓÚØ7*Ý M4$¾1Ǥ𥼕GùWË}‰N…OJ\‡-ÔšP§º4ÏÇʺx˜å”`¤#Íýd¡¤¦b1”»8.ǹ§ØØÐ'Û¡få¢QÝ΋V*œÉúËÔÜ ìð“`´•ƒþæ¯fÊ-“/&ŸßýEÒ̘oç"­íÑmÙEçê˜ê¼-¾i‚eÄ`¤â ¶d`[_Ô,Ï ióåá&æ:;‹Ì2Z]‹çýg [ò‰£7:êxÕ8M@ÏÒ.*É|hÉÒ`èÒ5¢ypõ[2ÍQµ[T¥&žV\«÷Koßl6 ¥È·$Ñ?N‰}ç¡ jІB²Êv¼nÕ?føüx'#)Jp<ˆQxlXî?ê›ê½…ýÙ¦ÿKþDg]L5ºéVªS f%#Pù r@ )§¬õù ¢láòçr R;*BÈÀpÕ[i˜wÙå*GDåK8!´ˆ2ý‚…oÔh²G‡ò$;9œ­£5½kÐvdÀEÊ-ö÷£ëZ™j žê_ùÞVX#\ÆŠ.Á;7pOÐDÑ|*>—™` >:CáÕqÍ}D5Ç…ktðÖ:Ͼ϶Ü[ÇßÐp£I¯¨q9T/LjyâÁ’':0˜ßî{Båt+ŠÒ HC ?$—;þdþé¤^Ð)»0E>qâp›K zö!3÷¨$¹UÏ÷F'T!qṴ¨þcA¨hBŸ *d’ŠÑßìWÓã}îp93ÖâLp6+Ê1Q¢° ¥ùh‡y'þÏ,àÓn§üg7-”ÝžŒ›r1Iö“ ˜'sKÞ` Óiß1êd¤åoðMï#‘¬4§Ó…o™1,„ë‡XÑÒ\Öç—¤QŽx§óZ†K¶ôl—õ¿Š®ÙÖ¢±¶|·>hÅ&=Oï ¬$”q W‡Ã<¥9Ù¬i{Ó ieñ/_âXðfüÔÄŸ%Ð Ç7#˜qŠ6+;}ŽÍ¶£b¥Eoy++­Õ„CHÓWDØV±<‘›} +öÇš€ÐVêw ‚5%–qó1ànwXàˆû±¯6ëØ+MpV°]Ì­Ì^fÇœ_õÂ×y»qêhjpwPRñÓ†àLš›Ñ‹YˆàG—Kz?_m:LêÜÁ‹9Bû…•þ[kvòý‘A§¶6ßg»“ÚòÈ î¡'WŸMµc˱nÈŸ©ÍûôOµº(R™üÒåÏ@YÕ¶Á+èü©À$ô@Ÿ $R-cß̉þ½”[U¿ ³¼õ°é´¥fú“ʲ†)¶¿’Úa§ô‚µQw@ì¸Ð·1Ñ|Ê7¶ºø øñù»ÞëD¯) Ÿk?Æ-7¡è£ :L´Qsõå€ë~‹ˆˆ^ÙMŸ¤™Œ=dÅ[”zTˆÀ¡ØƒÖtéwѤ¥N’»aï›7º–Q5±|Ž—ý¬?„™›ô1Ó¯…ºR4‹%°v]Ž!ŒNñX™Â§•¯!5³¬Uª(°äLVnݰ²[J µƒìG?‚lüÒ°¢Ez-„ÐOwò¡£ êÔUì'‡¾áéîFœ²¥ŽíŒc_ÆÈf{µ´ñLŸn²»\ˆä©N„zeÚvàS!ð)D‘¾ÿi|çY LQ {ñO˜dÿ»ytdP¤ýþÁ:uá$1œ¯E¼ u)Éñ«•ÏC7ž(ë·Ðƒ•çW’Ä,µ —´a˜ÝÀ˜Ý™KÅÔù=Õî¯UÈÉ€×8Wm@\Eïsy‘Ô¨e(m7¶ú©ÏN˜Abïk!^ç€">Mt[³J½ºMô\U)t¨úç^*Df„å­åÑ6­á/9U|«(©w·t êu(=ªa ®’Â`U‡’¿>2!¢¼¯ð¶p ØÁ×Ë6ªˆßîhnh}‰«=÷ïz±Â¬ß]éãß:cÜÛ°íÒ™ÀX¡®¥0–;jòr×!%·—-£§HØ3…¸…Ò¹€K»bäÓÏÇ3®Ôsb¤u3˜óÎÉÔ‰ÅðyYòùI…ï+8jֲТ]ö¡*W1w§BlŠÎL ¤>ÑVŽ(œ@8Nv]î¯ÖUŠÌ%ª}Àÿ#] m[w Å-Â%®aÈÝ›Oé«#fÔú”’§g‹À\¯·KÈ <ͽ||㨠¼¯õš(ŒÍ¼dã=™LÑ‚NƒÛþ ¥2Aîâ‘é÷Ñ2Zf¬»5Ùá\ŽÆ(@$­Š§à×¶¤"„Ìó]=âÅì[K+é|{òëóø®0u{9ggler.µ.ŒÝ…›ÔÔsêPôq'©í¤$R ~^ÿ+ <ôK;B ‡ žM´|tox¶¥. Äö›¬u°Xü3½NUŒv^o¾ëHG?6á7±—A± x™©œkJ&x|«L”óWªaec®êT‰Û®”5g•w#1èig5Eã0pŠQOˆÊ!WP×<¿rÿ i endstream endobj 521 0 obj << /Length1 1919 /Length2 11724 /Length3 0 /Length 12896 /Filter /FlateDecode >> stream xÚ–eTœK³¶q‡à.·Ü‚»KÐA‚»»kpw nÁ]Áà îvØòîì÷|ß³f­™çªªî»«»ªç¡"WRe1µ3KÚÙ:3˜¼1yU955²1¬HTTj–ÎÖàß$* °£“¥-ï¿bÄÁFί6q#ç×Py;[€Œ‹5Äqò‚¸x@+ÈóŸ@;G^€¸‘«¥)@ž cg vB¢³³÷p´4·p~UúÏ#€Ö„âáábüs8@Äìhibd 7r¶Û¼*šYTíL,ÁÎÿ5-¿…³³=/ ‹››³‘³£¹ #ÀÍÒÙ v;º‚M¤ P0²ÿ“3@ÍÂÒé/—ª™³›‘#ðj°¶4Û:½r±5;^õªÒrE{°í_Ár0þÞˆôÏtþc"KÛ?™˜ØÙØÙzXÚšÌ,­ÁEI9fgwgF€‘­éFÖNv¯ã\,­Œ_þ\¼@RD`ôšãß:™8ZÚ;;1;YZÿ‘%ËÓ¼n´„­©˜ ØÖÙ éõ‰[:‚M^wÞƒåŸ#¶²µs³õúÍf–¶¦f¤bêbÏ¢nkéà–ÿ;êÕ„ôÛfvp@î׃;Àî&,ˆ¨y؃ÿt‚þ0¿æáãeog0{Mìci~ýAòr2rœ]À>^ÿvü7!@SKg€1ØÜÒé÷ì¯f°Ù_üZŽ–î]àk‚À?>ÿ<é¿Ö™©­µÇïð?šEF^õ˜Ã?Iÿãµsx1±L¬llN€“‡àóßý³ÿIÿO«’‘åßËûׄҶfvž¿²xݾÿdâúwyÐþÝ=t€ÿVP°{-k0€öwè9€&¯_ ÿs/ü9äÿ×Ìòè‚ÿ½&Ikë?#hÿòÿDÙXZ{üóZØ.ίM"o÷Ú*¶ÿ;TüWo˃M-]lþ·WÚÙèµYDlÍ_ ž‰‡™ó/³¥“¤¥;ØTÉÒÙÄâÏâùÏq¼*X[Ú‚•ìœ,ÿ¸€L ÿÊ?¾×4±z½dœ^íOøµÁþ[UÂÖÄÎôNdåà9:y _K•ƒàzmYS°ûŸU`a¶µs~xÍÐ`fçˆôÇÑrrXDþ0ýE\±ßÄ `ÿM<‰ˆ `‘üM Ë»ßÄ `‘úMléßÄ `‘ûM¯zò¿éUOá7½ê)þCܯzJ¿éUAå7½*¨þ&v‹ÚozÍOý7½ªkü¦W=­ˆçu-FÿèµYÀÿÂWE³᫤ù¿ðUÓâ_ø*jù/|Õ±þ¾&fó_;™Åö_øªk÷²¿Æ¾þËüËýªäø/|Urú¾æçü¾Ö ‹³›Ý¿Ü¯)ºüFÖW)?ñ¿JÊÄÅÑñõòý³û_ëí?üçM»ƒM–ìLø‚?ÔwÜÖŠ¹1íL°õsª_¿¸±#ÅXCn1Cõ)à[•±ç_q'g‹+ZVëBËCC†ÆIÄp¹Yñˆv2Ãcb…`BIE17ð+ð¢œ"ÐNû ã£ñSs÷Å<¥NÈ+®µ©ÅÆ1UCípüHnu~î9(‘VV!*î-ÐñàÞþR”²öUæ…›î~ KE–én𾣑ÑAn:ºÁªêÄ4œ_Eåð› }‡ä\jL¤]ÆÅÛ5ÞÍzoÑ)+ÜÙÃX™Góó‚±xøfI:Á—ò­€#—2n{$À¥/©D\ráxœµíJ:FQßÞMprŽ>˜w%í¢™[Àa±…Ô¯XÏ®²ÃaÎY)Ú“\Ì™nË™1Cʘ\…(~ÜÐ|é·ab‹š‘“æûR!"­ÍG×/Öñ;’œñï > j?Î' 9¯£!}õW“Ѩø‰q fD†u„Vï5”5Ò-$>öf˜¢ÍÝ“ÝXÀö•TÓåîµ¹'mÑ,Îóš ̸êëœöVîV{„6LÊOƒâË´<¦?û‘ºN²éŠT<·¿H@ÑŸZ„üI0W@z6+C®ê&GCÇ±Ü oÜìWŸ |™•‚ôiÕé…x)£õ耬F6I­DbÚ½›1ýNCm²¨‹­Ghºú±®”Êm81 Ô"*[Îc\Ǥ/¹9¬2SâzÓć,–¬>ÉŸÄ­D@EkdƇ…ßÁBõ8Pó&¯­t×KüLÖÄD_LÞHCü=Üûó:z/Ú°/áÔ@„Û8n4šëRTFŒÄ iÔDs¦\Ì#ÞvjÀXH‘ØŸcMm ódkW:¿~yVÔ͇'Jois4[Ѧa¨¹ke Vã2K í®ZZÿÀN ݤGýŠEvî+3¾*³éœµÓÜÛ´®® v4àó 9iÅ(]øUI(æÎº§9– ÇI…9;¡=_‚z‘c¿¿Éuý…ßNj5\©4>buóÑ#Ë»/ɼ::4j÷Êúbò¬hy^pY©Å0Š™Y\ö–ùqåN£´mhpV-"„¤tòÌhú·½ *Úïg©?¬¹WcÞè§<Ì)ˆÝà¸nuô‹èŠ:•~ëo`l½wAŒ/X}a@rNÅIS;ôOæì´¸&ÿœæôd š—údZ¡‰ßéZOB 382QkT\çg~¶¼ Ý“ñ©èg4´{–4Ð:Æ"…ó|¬ƒ¾—ÀЉv‡ÏD7(u%1[~,ENW 8Ùmúp\Zör¡ÐÙÚAœ%Ôô\ÞËPíD™æ(À’©gÖi3f…æ¨;>kºúÍöñÍX8ÖE}Ãg5`L0#ýq‘Œ’‘ý‰¿@êr>”•#œÙ~¢ÿáµrðùô5d ¡]s`7óÙO« ÂxϽ¬é ßcÑqíËíúÈÏ Êo’XÈ1*c/öL¥Aob÷¢ÍÝt  –”D”[õ‘EÒ5ØÌ:÷Ó«†)o%¹bJ׌¤ß ©‹y„½ém‚9×IBã1y'Ò¼¤x_PJ ¢<Ð{#„Ž &¥í²ÿÑut¾¬õ…€çyívðóFšâJ{z©;AzÖ[¦Âev:„Ñií›CfOzÂyl¨|(¿¸ÁûEW­½wJ˜걓̤®jº=»'å1ëÒJgk´…1JædBËOŸ6W-d$Ùê?kÀ8ø ¦*_ad+ˆ6óf~{p'&}~hÜñd‡{ºá‘-px)È? ·>>ê)–ò´Á ÍΑíέKs\ÓWñãÚï¦è„rÑ÷ËÛÚ¾‹8<ßC!ð{Šoo†'Fr§«8Úó¨ÉI2z–Ñú»•tÉG]Ý@½€=‡÷Mq´ L*ã’§qñ”º1 WaeÌ« ¯%×+i4#Òä@;CÞ]ø3êFx e±J©·ä5 ¼ür5Ý}ˆtÓx5“h³ÀXÿ0Ò\O抜iai˜÷Óõ]ퟜ ÙëÞu²:‘u.­úµgR$Òû–g:W%Þ52~U¢³×á«f@PnnasšÅ,'?Ɉ¯Ñ&ÐaüƒAA£àÝ#Ôo\{ÖH*B=ÛtåPIšŸšìqíJ&48ø—¹¤÷„Yrã»8ûÌßk|½x!ª–´KÏÃq¿†"uŸ} â : | $Y|¨~™µÞeNíghfï‚§Æ:}étmcí™çGj$þNi<ú¨itº`¥Þ2¹ßŒ*7¬€ç£/‘êtP4æ–!ñت¦4úžu>}êÈ`w½@¬Ãž §Ö¸hÒèð-Mƒ«û“Êj #6,·:zó¶­pÐ/|þÑÅV…<ô¼ÞcÚ~ݽWšƒ‚©ÄXÙ£W`Ÿ¾È^Å8vQzÃS^ÑXÏ‹Í0¼.hEŽèl$Öª:7Âøv¦&Ó",£š)ú—Cn¬š¶à¤ß—›µ;¶]¯ ¬“ç ¼û Ó+ÚãÚt„'šê‚)|Ùz^õˆó^³âAµƒ–‹œÔ2”â·v+Šç%¬æäwMÔÞ Qîw£“½U‘H=8 2¥W<•À¢ùåÆÇ3eý]­FÏiϬ|ÈEÅ)ü4²/ô9ã]YÙ±‚IkRâÕ¬Ý{Æ<ꌋä=Šp*gï‰yVö°š;æé¾–ø“;µ½ËóÖ®=2¤°„: ÔE,Hl4½ÉG×Âøä?JZh¶Ñ•¹O¹˜#­É™É6ûþSLþ±ü˜1¨ Æv"$Q_•‚`/¡½nR™í3 ÔѸ7'ÂÞ­'†k#|M†„Í¢‚³é¦ç,º—“'ja%È>Ozžº^ßi$Û6‘ e )”_*e\5S›#<×ÃǸ„Ò+7ùæWXœ[|QkW옆ö¾oë«:3šv-Æ­¸n‰ÅeR|u•17¹\³X÷ÉÑÜ’ÉÙ')âSd»ëoÒ£…oö7Mó™­ÔÝÆ ž;ýøÓ ÝЖ{{’ÊÔý<€Õ›šôÝQ/Ýf®Ô² {ÙOuävæFoŽ·º†–+EóëEgÐÁp6®•„N'e%kôäx@A:’ʲ%ë ÷¯^\¤áZ&¢)Z$L„B[Ó#˜ÎÔêÄÞŽAÕ!ï ¯Ô¤§øÌI ‰·WH‘†%Fa'o1ó}òqbY[ñÄøã$åJ(‡bŸOk¯íÆd²äeôƒ~×´ƒël­€Š¨ù*éCßó…¤tÿ‰]¸ 3hü áëªDúØÛù6F„àK¢ÐôybAR÷º ܈+Õ\ßDkýGÅ_ϸÊdF$Ï “Yû{^ë³ÝmDið3tĘ…ÊÆŒÒ(0Ì¡lÞöYŒì[Bj•÷¡ £Ãì‡/DÃÑ‹Ð^«ê$WÕŽ²}õ¯ùɾîO‰ãÇ'‚‰ºhß=da“lPUÒ²2§¨<ðÝb¹•¢0[Ó‰2äÚ£Œ ð>;Çw~4Hïuï”ÞANâNüê_⬊wä–ÃÕá²]w 4G-½µ²-½–çuD5ËðÝäi?š;áYRÒ™#&"þiØ *Ù.+VOÔr¼äE+9òià´Ét-Jl¤sõ` §vH™£àKá£[BÜrfÿcjàVÄO¼ØœXÎ’ûøó~£úí‡:HAí–2Œ}|\‹É3xȇ¢+BX¡H?ΆåÅDéÉo?WT‡ßÎ&SPí’¥(%U¥?éœC- {Z£™vµš¤ž•±~Õè\÷ù¥è±£Êëç¸cR¶^*$õrÆ„5C Éö€Éûa+Õè FûCüñNa@Ô4OÃ%@rÑl¡:…%ÝtÜo¤nƒñº×<”•M,€mPìKO~΂™Æw©ùÚ›¦Õm@ø!aŒ%b»ãæøêEsaÂu³]Û­‹åòä^M36[æZgÅ’¹w­^JƒÇB©kõê¼ZØŽåò!¥ãm˜*L79ÏÒ",\eö¾ ›—NóÁIì§==‡qS—?ºA¨a5þd¯é"-9Ž@­Xtõ6²óêèÆ™g"ž­¤îŸÐ»$JÇ­iÝ‚‘¤íAŒ§[§s BO_Aêô"ý2oJý;/‘½Ÿª¬Ø[þ gTÞ0osÅ$T  €‚CÚ,î0“µÉx—Ñ%9 w}À ^på>ä«s·BO÷ŠÙOX·˜¢«+j…bª5æ“¢/'Ðù\ò“³9k2j™{…ùÓ&û“ï3wÚü,Iï@ÙæF»°•Þýl«%&SÜ\¦Î / išÑ>y©S*]&Aë3×Y©ÆÜÚb!‘5ˆ]¥!Íy] ¼wŽæSS-7« 4MäYs1Ov¼fh¾ï’¶²©‚ G/(ãÏ‹qòÒ„pgß$’ ɨ€\§’qê[<¶ÇMÆêÖ.ަc…Ö|˜™Eò–òÃĵBÛÚé™S‰…[Hœýz‘ÎC"Ij°øÇ³–”Ä+N +5RFç Ú³Áà`´¡Ïvlù’!¡H9d¸/uDW.“|U/Dì²þk<Pt••}ûË{žáb€Ú-+ ç©l[/¡Å²YH”æxˆ‘ÆÈq;n¡\$²4 &‰D†¢äÒׄåcÂ=$ƒûEàƒÏ<¢7xŒŒ|yn¼`w£àªÂÊÖ-diS¬*€ ›Ûï'šÃ^)zæn\éž;“ïì¤$ë&ÞÓO&0#³/!-|Õø±ñFÝZ-YŒÜmî£.¾TýNí~¯ç/Ü9 ”ˆ¨TÒ0¹ªç~=ò\Ž.FŸ µž®c§¸í¤Ž7cæRã숧» rå€#?;ÊX~=&ô_ñ0,Çgú5N~´,Uàâ_¶Á{Åéf ¯ªÄί­Œ.3ay#o¥ç™v²„_:£…ü0ÆÍn¾YW0?™î%CY®E<…_ߪœ¯³ÓL'vC‚rLÛ–Œò5(taóà¾ÉZÄÄÓ‚rS-B®*AW-ˆÐíb—ª N’ðÅCk¸!WÄÖÀ‘³iõë%h±tõF$ï.W…ñxqKæùÜYù¸ÊE… äx?á:°)gè >–óúvY¤¼;.Mìvª é¿VÍô³ ?¾ËÙ«Ñ×›î‰úˆ’ƒ- Ï—T¨• ‚„ g]„ºÓ°FºîrYc›Hj5 M/ižzû.DY^Ù®ëÉlGˆ±$ùöN’ONÿ_HIŸìþ|a õƒ Õ¹b f‰ÑÔHŽ»ƒX>iß§m©ªN‚¡½¹su¾4Üã ;Mþ €Š“•*E O§}œ#…í{lâtZØe—G­®½¨óžb F¬ÓÞCÞj«ëç‚}¸dHgçÕÂó8¾õ¼J¥#É‹® ð¸ÌVYæiñ«Þ¼Ç8ÂÆ&m´ÀŒ' •·r=OgûK±¯íÓH+ `¨7Gå%÷+¼ª(Ê¡H h‚%¸÷:gÚâÃØ»™õHqBÏð.Q®.²<I‘ª*¸‚Q—K¨›bòe>[·u-àÓª[²¤-“©ò5+cöǹ­S /¾•¸0L¹õÁÊZÂe`¶&QSê‡Q O³ÏɧÇÄÍç{&\3ÊX'&Ë;Áóh?%?ý¸ÌGz…¨ª½BÑ?ÏÂ2$év:†fi\seåxjÁß夈ѣ@µY[^µúïP Îb™7xÇËýÉŸàÏÍа98‘†D<‡‹{ßί¢^¨n#q'D@0°5('°˜×yA}¬P]8cArœº×@Dy(»©\>Ÿ‚†V¸û.¾ËûÕH}èFr…Xa¹úÑþÀ†³:)s\ýþDÿWÄ×–šŽèÌ8öC¤e^›)¾·±¾.ÛA(EvSõ‡] \¾O*–ïXÔ]ê8Ìû‚§4¥•C¥,ŸM Ë©=]|ªÚõžƒ¤¿xÈ&3Þù§Oî›~ØÜ\ Øt›\­cºõ펭–O Ùwe9Õôʶ71ð¼åÂòä÷ˆô$²òMméT4ͦðìiøëÀ¥ îùÑwâØ¨¥üÖ¨m‰ :ÑS êf?Ö)* ä43Ž0Ó3Ûj¡<ðTÒ%áWˇ°Akó ìP¼±NF:¬ù¸ÂKɵ½„gsäÅTÔÜÛrù9t8{-ôïõöT¦Õ϶,ÔDÃõd¼aú0Q<_>Æ·!À7\¨Ê¨–øùF9.zBcJfÓt©NÓ|y[HNË×-)p70J 4:+òw>v°…›;qÉy+\ÕúÝD”­\ÕU…Ê®p\pÖßHÞ*»%[!ÿ,'žIJ~lÀ0~¾™ô9‚xr§„0Æop Cõžò}wJÊòpG’ÞÒ•iL|3™YodþµyèÞ€úOLŠÚÊOºÿ!Z¡(ÄŒµÜ}¼|2?>,¯²úm ’!_P½e/â%‰£ì† ›5u[ ~ð<Ê&C»l¹Æ°ÙrήP-%×Þ‰ 6…ã©*þjeoîxÙ*ò ÊÑwÌ/¥Rvó.:;aðüz£ ÷‘SY Ô–x(”p¢x‰ž®_f—JwÈü ûlz¥ÐP6±ËIv>–ö{ó³ç´CØ®gß`Éû#uôêÓýG³}ô¤Aø„ã“Í ˜«µ”>±c²ýDçÕ­“Ec%¥ëY.|ïÑsÄVOÆû:!´§áóö+ k¢kçØ$Ãæ6Ñ&1lR6"Ï3IŸG^@ ;ÌÎÖh©VYŠ”<ÃtÍZJšóF aáŠSH͸–#¬Ç-o;—p œ’¥s”ÄÎÉN,ûí•Þ%A~4ó“ܽÕè… ++õk‰n\£7žá”¨Z’bRÓl=:»;lh:—§åÓún÷/ä%}úÖª\ŽE?ºƒc@SÕä ðìK†p¤QÇæ[9YKÃ´Š¬¥gÇ»]L…žXäó?Ø{tèA&ç¹?(ÒØ36BéȃbyÙIŽxªo¤£ÆˆËJX©rf˜¡ÈÓõ­=‰ëmÚÀÝ]Ö©šÜaΗŒ C4÷§Åë¢iWx™C*vùÁå8j¤ØÑï3ÜŠçèPVDXFõmÚ3ã¬ÃÈê˜ÆÓ6„Ër×-¾³ã¤ô. cöâï¹CmrîJÞ]yÌEúç WLî4 ÇB¨ÄxÊiž1ò2L+ëÃäÖ¡Ô‘5[¨ƒÒi‡óLç¢i‰t\”Y]ý1êð%ZBà•©F§‚1æÏUn^ý´\æ…ës{é ›§Ó:ÞZ÷‰}y ãƒL‚æ&­×[hà¸ÞqŒ¥yœ_í ¶ÀºÃÃÜd¹Ö Þ1ÝåPš iÁ!àBJrö¨K#T2¬;WûW'ý#§(=²Îg3l.]ø9+Á÷3ÀJYN `¥Ï{ä š¯š´dE;/cäoõ¶±Vf²£Ú¥Ï  *Œ½§WÞ´E}þehžÓÇø”²|“5"ó¤ÝGÙèæ9VL_fmHØ×?@ðt M 7B–8»ùË2·ö})½}nO¦ëGq‘! SòãÞ;\ž9}Ã\=óƒbqo\æyxg °/|Òîå`â[É2yý\-MŽiê(“ÆFu ãQ@è›jt1íÜ »ú|î,|í‰v³lª±(ï]IOëœmãvî?ñ^f*µQ:"`Ãõœg~œ»ã–íYÚ ±Aª”%­P%R1¶ëÑ8º• Å÷âx ¥ñlèi $xzH>ùÈÓì¨F•‰–¸âÂÝßro $ÎRdÏãF¬Žî;ί@Ò8fðÅ:rކ‚­/Š2Ôº@aÊä³!'_g̵”¥Z)>±¶j=[P4Ï­w€ ¥PL,+{úƒ¼úHÈÌ¡r¾ËŽÖ„"ððÑIŒVlÁô2²KÎr~ Œ“ÐÀ¥Ÿ„• Ìá Éù­@*åb9Ž¡ ²cDs‘‰Ñ‰‰õÉQ¢•Á}â¸s¹œb¬ƒÒÖ¾üæ]$«Ö«vo­@iòNl@¨#!Y6ÞL¯1Å¢D7‘›NõätØç™ ÿ ©1ºnÐ*Ö„]ñôÈþ3š×.¢úI“ãbç"™^1ëò„¢ûJ‘àú·>ncž#ƒÆöÌ™hqCJ]Ay¾P¼>#tßÏWº" ´‰¹Þùñ” yäw”2ºßQ¦¹ <” Š7_Í?[ùNÑÅMÈ3´‘j QY°nZ!ßXDeŒ{Þ,±¶á.­ÓØ\ÛS+ '" ÷v$1þÔåÀ'x‡Žï:ðU\Xe‘ñþþî‘Òâc7NŸ GíëÖ$I6c äH‚÷›Û":ñ >"ºƒ¹fúƒà®¨¶¾1Ioj¦O5Ü7¼­Pã]z?y4°'Yªêç9¾»©V¬Q‹n$ë®1”Ÿ@s,3+§Ë‘oi2¯s¶E*¾F?£ï>ЇÍ×Ã.ß‹A-ZÞ¢AÚtÆ&¾$ û¶¼õËÆ2Ï'‡’‰¬ÝëlÌ ©‹qÏJQ—¯:{PÈýÜHnË?8èBuŸŠsZ‡ÍϸRY‹Ûˆµþø»óì8äþ㤠!w.(Ê® A_Œ 3L6–AÕJ£©`‡L¿YŠ®gò*p­Í¾O‚{_nÐHOÁ1‡°÷¹Éø”¡´Áq& ûÎà8ÌåÄý‚¿nr ­þ­ ›,ääy¾U=V-_s æÄ ô–Á˜ç\-ÛµwŠ›ÆÅi´nŒäq/·Ùr×·¡åEôÉa÷•¼ öt—nÆ‚Hœbâ¿Cá÷ͧ—^ E?fÃÇðõ÷5‡ gÑįÜü¶žÞã«øSµ;Å{4¹‚ðÌrRwN¯Ûº³¸Ôòh•_¿ o’{ÆÇ&Ny,àû\Lš“­aW?Ú·LÝq^¼¦½Ë¹¡z4îníøfµ5k¹·Õ©Œ<¼qîa"zx±Eãá s†®iû`9'ICÊäeâM󮔺›»K}+v6àT§ ì¸l+Ȩ¿–‡EÔ„{-"åÃ0±&¬2A/R±kÈ#:/ž„(™èxÎÏÓ Ã¢¿¢ ã}¯z7ºA¦Yµ€$Uîø¢¤$ïbçÏWΉå"ö0ímň,П—X(ríoáŽYΈôõZwŠMv?ý³!"/?NfQÔ}”ª–)@]d|qLLp^I>O5Œã~@ú:ÆažKéøW*À ±dÖ+܆¬(¹µÊñ¨ANËÚWò̧]Q+ñ®ì» ƒ†ì˜éŒ‚ÄsDfœzºë[˜ã‹KM¦œéMÍŸ^ÞÝÊOË27^âÁ\M×2z£cø aN¯~£î1å¬ìù®AF(í·}2¤ÚŠ)·Œ!6¢ºWyåÌ}MZžÒmTÄîsé;mRù k•-,KL–tÂflœ7Z;êtW^µàÐ[ÀÏ®ÌP3p¹iÀN%øŒA¨Çû›¼”T=ÅÛ?00&$xcÁì^SÏðŽÜ–ˆ[@‡'\~GgA¿C»´¾·k›¡[Ïžðò¬q«€Ü»´í³üáKcpþgÌ =–6ßGŽ˜;ËHËÓï=UX!òažvEé‰gÀ ð¡û•·®+VmAy¥m˜; uÊøìØ "‡Y!uœ<Ô§…aMlÅËNµ,«ãÁGÁÃbÞYÚˆ’ò¥„®îg#ú™|:ª¾~¡éº.%áU ä5 »õÞ,›È‰Zý ,pÜ ^y†ŠÞ‡ùؾ&ó°ä¸ïcØr—ç6 ,,+Î WÔªlÉçôT6°»óØ}ù(¸â[Ùó1–’±ÐŒÄýre‡x/Ýê…ã`H¥v›K³è‰F-ƒæ7Æ nû¯Œkçµ ›©úCŠ)«ÒG«L_ímÔ8¬UxQvŸâêM,‹X-àzCX7Í%”Ò… ãMäÅ$}ÖŽj!V]OR mrÿ¾Œc‚ŽüÆ€Eí}sNŠˆä‰žã¢Ý7iغ(•PkG¿¢L“å!=×úüö_Ñ(Ü¥² !ߊ²|÷§>ãÀ"ÈÅ«º JÖ)õ(º¶ò°g P a3/ÞÞwB¾Ø( ±Ðñ¹R¼«¨a¦ëÞÈÕ-]ýZZQ——¼Œô"è²­×îÅ$&ƒL½’t»0Ëįñ+O¸¾ lé)òá²`¦ƒKúR~0wOõYu„³sX¹¼¥OÍœÓz°’0SÉWsX¨„pì-Þx,Ø™üBV Ê·„'xì&qÆ›?–m¡®gij×£2 ‰“;ñ…é(”âQý¥£¬NFÚc¡Òwx°ážá×– /o¿y~@À_­öò…)û£À5¹pìXÝ\‘®>ŽÈŸjo³ižì&Ò& 6íÛþëF­†ú õÖ„úÝTŸZ†™Ð®Ž÷ƒ šüð§÷©¡Îin§þËÈø¶¶»gr7ÓM?Ô„StZOó]Û–ôfuÈV 39¬2@BæË}UnHVRj™“þ½pB̔킸JñpsÍç^7NDaƒÚ– Ù•%^23™ÙÕ ýëD1¤òmH©ŽOGF‡.o­¾÷Í^F&7w3$“HäwÅÈk gŽe]±²JÈ>Î\¡ô‡æÉÈÏXƧN}¼H yß’‰W€©ëU:@&žÐúkT¬Ü¹’M¶Ç Î1!8 ‰[E↼Âí,¶«¤½×£LïF/މk ©i1³×ÅÀ!¬g|ÆÕ²Áþ&®fKÛ,§†94}2“é›;;Kówˆ!•ß8³2c<šmïãš2×È1ÝßU=-$¶y‹HÙ¯jûzEPþb3æ-àl»“bì“à(×1*AíÙ 2â€Hñ>Ó›“ŽÐËd=§îr~j1<ý6hMóE®‚°‡}ÆN§ôüø¤ZûfÞœuB©ô ðÑc¸M¹aÆqérúZˆ7Ó#ŽÐg–'ÿ¼âÃc%f·Æ7Á¸ ùµš„ÚKŸ)3ª RŠø ³Ã¼ØX{ÇðÒpÇ'€Å*f·G[ÜÒ´Xo AÒúd5f°ÐÔ—žñ'#ܶT98¿2‚HxÙ¾pÍjý@ú,¬Ò‡¯‹'ÍòÈ0µÉ%!I}¡Óø|‰Jº*]æå:iZ2Z¥:¸gù¾X$t¾;{;¬zçèG/”ãšcò7p37qm2ÂèÖ7È’ƒ6ýö.Œ[f1‰h.ù Óµæ sPR¢òøì•ÛÏïz¢Å>¹ÙUë™f5õÿb–j*¶\}þ¢;šò!·BÉAeŒÉDœ¿ÉÿVŸ)_{Õ÷$®²¤‚µ¹½½YÉ?gaœ½’NàDözç>ø¦hçk…irä~Æ´¯šeîÉ)ìF;at.Ã4Âðj?ëÎí~— Œòè¥F×/ÜÈýþÛÊlX3l` ó;*aCY 6²i5 Ǩ*i±ƒ/óè»txü\ŸúGnÑKt¿Ø<¢ ªyxŒ´i`…„º‹H›Ã¨~ù¦ÞXâ4>ñ´œx<ŒÅ ‘Y¢RQíT”JÿŒrS6†ÖÏÍýYéÁ› ²Ï¦ ¸7m»qü2oŒÇÞXœ×xc‡ñözU͵Tg ¯R÷ Œ^u>HD€9õr92rñrz}ª-O±1LöRÇhÿrŒ7¥¡”g§ÿÅ£1-ÝÛ²×ÚÁodÃAè‘ÐÌ—Î2Ã"‰Ðoµ fÐ$ÐÐæ¥ŠÔGR!’G6Qq€ŒÁ ©°UHW5Ý­ã¡Ýÿ‘wjà…A.j‡ðÝ´þ7QÎÎíUøImSCͲ VŠgìR›ÈÌY„gc†]Ù¡0¢­%Á±¡È›OÏd‹§aHÄ"#$G Ïœ!H£\©ùYvÁ³î•\bsß{õì±^n&_îàºä<¥ ÜÉ•_ý%—Ä~ oï ßÝÚ²'ðþû‚ÿÊÀô*?]J$ž+3ÑYn•‡H5î üÎÙKT:ã4sÛ‘èÀß]U3f,î ê<Žoí©mÍ}êje©3ûbðdLñÆ™>Þ%Eý-kö£$Yx£ÊîOù•3hó¶®? ¨Õò´²ˆ?¶«• 5µ¸âYP±’Fö2§ýi„¨ËTNKËövIµÃa=±GožI NTYý(bNѵµÝ‹1ò)¤hËþ‘-\_†¹"é·Ýß##Њ¢{ÑxÉÌÅeH—fOyèa\I]Pd‡÷AÞøB©x®O¬¬¯c¶0m³j¿.¸yùÄŠ?˜aãsh·uÀ]|€13q™¡HûèŒäv á,|ÑŸî>nìøV©a7k»vó ÃLe .m¾'ýÍwáNË)êÚñÒ½œ r1”4¥Üy¹Þ]™2­¡}l¼Îš[´d ¤¯jdåoê ~~h¶…A·q<"ÁËWÊöqÆ#4~—òFµdzUtËëòÀºÁx§1QÇaôì[íÃO%¾-ûxƱ—¼êµ[³»íd¿Â”ßqJiÐ2©Î[þåzåÃ@)¬,ðFð,N$ endstream endobj 523 0 obj << /Length1 1445 /Length2 6225 /Length3 0 /Length 7207 /Filter /FlateDecode >> stream xÚx4Û}Û¿¢VÍÚ;Ôž µkïÚ›Z%B$HljϪ½)¥6-j5j×^5[Ô(­½Š*õ¦½{?Ïs?ÿÿ9ï{rNòû^ûs]Ÿë›œp²é *: í!jHZ$”(ëY€€ PT!âä4†¡á¿åDœ¦ ‰þ eˆ#S±Cc uÀ}O8$ ‰Kƒ$¤@€(õ·!ÒC bçsèî#§2ÒÍ×æè„ÆäùûÀ怤¤$~»]!0° c‡v‚¸b2‚íà#$Aûþ#Ï='4ÚMZXØÛÛ[ÈÎ%„ôp”ãxÃÐNC âáqü‚ еs…ü&DÄ 0v‚¡þR!¡ho;#€ÃÀ ãâ‰p€x0ÙFšÚ=7â/cí¿ š þî÷¯@0Äog;0éêf‡ð…!PÐSÓBû v‡_†vpãoçeƒÛÙc ~—nPS4ØaþÁ‡{ÀÜÐ(! þ £ð¯0˜6«"”‘®®Eô«>˜Œé»¯ðŸáº Þÿ¿OPÂú †ƒ§›° æî ÑTùcƒý[æAÄ€Rââb Äñ; ÿJ`ìëù­ü-Æ`ôwCº @‚ù òGÙyAhOH ÿ*þy"00`q„!ˆþ#†@ÿ:cæïóX1ô€¿^ÿz²Æ0̉€ûþÛü÷ˆ…µt µMùÿ@þ—RI éð‘J‰ H !!ügœuàoô¿¥úv°?ÕýGDM ú ¦{ñúà ž?kà øg]$†ÏÏ¿éo‚1o ÿóüvùÿqÿW”ÿ•þÿ]‘š'þ[Ïó—Áÿ£·s…Á}ÿX`øì‰Æì†³!ˆÿ65ƒüµÐ:˜§ëk5Ñv˜QD8bx.º+¼û—†Rƒù@ôah°Ó_\ú{˜p¢DÁ~Ý;/ ð¿t˜Õ»`îfd¿UÌfý3¯*Œtøµ‚"bâ;;_" 0'1€?³«Ÿß !hŒ ƒ1Ezý,H lé†öù_"Q€0æ†CÀ¿Æøo ì Cx¢~ þQØÓó¨¿é‚)ñïóï[ñ€‰æg`™pçWá­ç5ŠŒÞ‚ŸGð–WÚc-z£ÅÐ\³Ïü´ñ³Õ'Ý•:¼ ÊП+œ˜ `äÛ;õ±êÌ YJ×ÈGc©ö®) |?ît„°8 Ç$2bÖ(ö“ ˜ÉZâZr§˜Í\FHt‰n¾Ü(ºjGm>Ú¸JNÉÙÒÑOóÚ·±[°q¬ -¬Èão{XfzkšŒ]a?†ÅŸ)µÆÑ÷]³ŒÏ\\|—Û×›!zT¨Õ]-þ"’’žÊï>[ÞPr?=uRîý×(,.%±Såò´Dvúb×H®%œ‡K?¦ ûÞ$õ‹z68ê*‡ÜÒ{4ÜèY‡›‘ÍëZ:b²]Ï1þ.LB×”ã$P“Á¡ÄYí€u:˜¹_- ÏïÆ¥aàÕµ¸Ö™B––Yhc/4Æá? µÙ§;ø$; $b& —ìÿô\I\Îâ65[¸¼— dà¤Ô×ÄÑes^ñº# ôíy/¬Òœ5qò¥é]ë`WÔ’c™z2$Ѽ-{»g+鵦Øé{ S>Uqt­Ö,²Ã–7!/a*È0?WÿM»ºÌ©¹qöSQ²cŠYcíM¬L]B éÅà)rRJ—½ræ— UâÃÏdC›dÓ$ƒ>ŒÜP1ØI ¯]»eÐõý¦M¢½Ç°V~û§‡¥ºÜ÷ÑwaÛ‰—_”,&C$f–ò•~šÙR–=²Ê‡>ùÿmó¤a?ß\±.ú<&µc2hÍöù0sÛƒ¾x¦Ì·ã;ÝmÜi›> §¸”öƒêÒýìáÅðÊÆ±åÅ>êË>;íÖ“&®ahãÉwbå™ÌÝõ7›/ ºûn?*Ü•T·É¸ç"¤D×^èsIùãG›©|“¼Mb7Þ*2ƒÂr‚6­Ãåµh ·-97ÅRÔ]¨»œv3-R¶Ô2 ßï÷Ÿá‡ªIþðÒýøIØ\Oü¯"²£vïÑö¦µ™;£J¨N3^´ÅÝåÒãÈ&ŠB‹„éáBs}Õí+‘5[‘æ[/šË‘iþD ZŸIzª-îŽVOú€7H’óÓ 3]VfÃlÕÔ£’ݬæ„)ì“\©k™pVµk« m lC'ÐKµ<ûÃ’cüQpåsk@Iñ‡.‚p&/è42Œ:F—«³½ËZx—gó-E³ï½° 2¬Ú°®p\'+ תИŒgÓ¼÷jêÕMºo†?mÑSf2YÇ™ýž %åV>ö]Z­±í9õRÁÌ"™R‹`pç£ß¸¡}y×EO–v÷g¥ÂŒ ¹ì#\`Q©úx‰vÃû}©;ŽåÞÎÙÅëѹ/SVÈ7¡6³¯¹â>YSHÂÓÖ_£š¹ÂÃ;…WWmx³ÙŒ?÷Û‘c¯TíÍ׭Є´±È$|I»ô´Á2Š!R;ÊW’¥øPè…øe¼Fð"+¡v¬•=b⬜ÒZoD0(Ð?z¢o@!*ÿ1S6ŒôÆU9ØnÔ 1ða­~êÓ´‰ny(Ö¾'ê{Å׃<VóìŠnMèúç*Ó…õÑþ°»òlë“/òÓÄØ»GöèxJ¦¹xÒµ^´W—m)žá×á:©D#€ Žþ.›Ûag"ãY³‡øYk§Lq݃ô/}ë^s,R.ľñ4 ɾn2 *³k€gú]Pî¸ôa¸uÕb޽Ÿº²<;ghd±Ø›íKmúˆø“¡bCý/¯›¥¯ÛÞó´Å«Þ™ûRìÀ]Õý¹ƒQ°¹‘ø–0c/€ó0>0j¾ƒ1nî#-±ëPDõƒK†žBmRɱ·'óOÀCÇ cHªyìªØmâ÷-ZOŽóx3¿á»çñÏ~[ø¦õ޼)ÎϹADi«3wõPP¡xÛû$w¬vü´mT6PDæ ¿XkNKÉfÑsæ¢kÖ`ñvWmîÞ¥Àºô¯.uºñ— wy¦ÇlDæ8ÉØŠ—W;®áo°âFɾÂ\ÃSïvÊïÒ|n¡~^àû”2 %aÁ‹õö>ÿ£Ä¢|–žTÕpüûWó8É:}Û³Â/N™i¶Ñs8—ìÈy}åú¯^º{›ìêâÄ%;${øùyÖ  EÚÄ·q©ü›5<ëͦӇ˱êeUp‰P-(£•ß’G¾í®ìuvC‘æ:€žºî´ÚÈ}z?áuó~“ÚÝšcTn°ôÝ$û¾TÝukŒex`tÑt¬Ø¿UE]÷n…~®Iq=µ¹³ o¯Õ¸*°Ä2ñAê2GèÇðÕ?ƒ@ÊJ %íXÞ. Qt,ç ^ ‚²û“ñîýP óÜÏúÊnSyXÇíÛ1~Ç›’}½År×ξÆÙOBºL]û72VèÝK‡•铎“öçÞ¶dßò»ùæ³q´òRpúQKRofäÍR$3ßn†T\ŸÇØ´æã¤sµÉ®Ö)¥sA‹¡ÞÈ9¿=¨fæÕ!q·f\E{ßàŽhÈY£¾ yÒzÔÆ}oÜ¢m"¸>'Ë—‰ãS»“áuX„ŒO÷·V®ãø‰£FèçÈ6Í÷Ù‚5uÓ9ö½ îÝ‘â‘È#É„^-oÇÅ'n¹| JÒP¡™Øè§£]ÛµÄÚ¦1NÞ]_ž»’PÁíFI¬9©v„ØK&¾)·}iðÆİîöö´7že•Œ-æ+d–€Ã49ò’÷pƒ©Ð¸`«äÔ¤•_èRY9ë¼TYHÀˆúÑV¨¿d^auy°mWnfð•Ó/|Šîþ«æ9ó"†Â.Q´¦/°§ý¹îÔ˜^Ë”;EÌa*wT߇&»¹U«ñU–}«]ÊôÚ÷ЛrEH nQLâ@¥ÂøªwÌ¥¿µoÊõ·fKó,i3C±GžPwK%sÙ%;Ëð3ûS¿FòŽ/(&;v×hñm…˜kua0mäö›p<¬È¼ÀKˆØ;»U7mÜšJÑ•øA{t™ôþöþÑWXÙ•eÉ4êÞÓM"]l‡TK&Q9Xéw𾋙†oC'Lb·ÜõCÏ.'d¯ã²1¿gºÄôô»ñ¾ ²¥KYâ×?§ð1ó;º) ÔtÊ8WŠˆQ(„Jä|›&NÞO¯nȘc"ú*¬VÆÈ8Ð<,LGæ®´Äb ±3yCˆè;HõƒŸAÖg\ÝŽöîG!ëjjWÓC®m¶'ƒDKW ¨¿v(±˜ž<â8R-l¡It–%zl-¨üòÔßûfµ-™˜èY±ÚžãTGÝݧJY_ÖsvË*o¯´¹¿;"c]~»4q·?–%ª(q|ôRJ÷ž°êX`ƨ7_üd­õ&Ó3¢RˤÅN¯‡Ÿˆ[j<¡=éò9Sç¸Îg /Þ ,h½5œúºŒöãX»ÚHV*¸¦6;)T–îE'”ö+ßP[…žð¦7^OŒ¡d Âüüãl?pS›B·.—¦kFÞâs9s¶w®iÃA…Q8 ©Ù5û¤©²Æ—ó§’ï]h§“nÞó=ÏÕõ$±KÅß*.kë*éÛÇFëÖ÷DÃE^‘7¹(jZGñÒ꜓5n\[¤Ï#BŸàáe%Ls•ñÙÄ3÷'q_‚°ÈVé.¹^Ü[í-Ê8kg™`Ø­¹}½5_ÁŸ &}Üx¯à‘/·ëê^–É×)76ÛvìRƒÖ…oëÜ%º9êõû+73åH±{ËFÞ:[×ßF‹šËÝ/ð“ŸWÙ –Õ=¸Ñf a~âïNkoÁ#Ç>/É÷åqûÀˆK™¯è9r5öë# ø8Fc­‹$AÅ{µùܺ(˜¸1‘zÛᙿj2õ`q÷cïyú•, !jÓ•M't ‡‹ ‡õÝíjjÜ0´©à¢šü2®YºÂÑÐñѧ§n¬pƒêg)Y1¸ö+eÔÂnÇ7ŽŸ1§¸·«MHâÚþœV¤Hî@lS¼Ç¿.tÕŠ÷çò“¹7Ý‘‡âz´f “£©ßÎ}~ÈÍGsånl|q„¾Ç8çr$L _.âJÏ›74=i®ÞM[Y-<÷½Ã³VýsÁ¿‚‘¼”­Õ€%WÈ…Zöi>n*UòWM{<ÞW]Þ·DO,8êi1=1xÎqÁñJ–ŠáSèl®ü–ƒ‚(˜—ÜZ´‚!tkši‹“O'Pƒ©›!ëkqžŒ²Ãó•Ì›nmô5 *ç«|5 òŽhpж«Î}¶ªl•ÞâÆ‹û‚÷ïg®-k6E!oí4OóENqÃ-¢†ºp÷>/®ÆêÁ3ååÏ¢ºXÚPuÞÆúžþI4¨Ö–±šsý¼Çü‚O_”˜<ΨUûfr®ÏþFk42’¿²uÒ¢"A)¬äI;%€902fk×Ë8ºàKuÞæ±ÐLŒƒ?|ùmOæá4õæ†â8†týËg+Ìö ”†Õ7ýþMÞaý†6Ùô¤DÏ8ÔÊÞ§k¨Ì™2È»áûNd4Sé/qªÉ¾ íêïSŠÂ;?-PךÓwª{¤[oÙ„«9h»¬Lp`Lã·4 %Ü$¼7•žwrãá]Ì·²*hæ>wëÕÊ"ÇÃ@CB<²Pü… «²`ŠU]h¡Ý1Òó¾„èÓ ò­ú#¯•­Ž“ ­fþ¹:SK¢ò³ OÊuެ¿K›ÑËPQx±&FgÞ4_•¹®ÄšLSjN™ ¤¿¢)#ŸÏf\ ºõE³ƒsjb½þ2,YvÂ<öç­«d±ú·±ÁÁ:h9_ÙêH¾µ{eœöG6$mè^FEÚ8wãyoIÚåñ «“³¹ü&íìí°ý. 4š ûÔSÝOFËñîÂñęמ¼ì_ëd.>¥¥wyµ \~S~T'ßq?ìp²»¸‰P Pnû„ÿ£–ÁT8ž}pªrBv;äõui7Ìyßze¶‚mØûR\oQ(ðq^0z{(HŒâ Ðtu¨¼Ž¿Š¢øuÕ‹·—̱u&¨Ðì—3å}¾›Ÿ{Rðóã”Å.Õ=WMðzÈņ9¢2â¸j:b ¥-ªW¬ÏIæel‘Tãéx}^æq¦E—†­-HÇ ‡»9Ö£Ö½ØÃftzsI Ñ®¤BqÏã_Z¶ÓŽg"uï9ßÙ øÉºÙÓ zA9GúV&•ì ÂJ'è)x†Gz’P+¹Fù ë.‹V´cnyï—¢®òM2J…¸\ãªTÀ4·Ý);gŸVÀC­ÀO…ïÖŽ™ÔêÑ öœNǥاq£½óú{ñ'2J6 zå)¢ß;ø”n‰Ö…y"Þàp¼^Öì#ݺηÕÃü|øžˆ5“ãíòÃÐ@A)jážâÏ:uà<ù¹Îþ­Éš†,ä;Në8Ö±%ö„W_ßlUÚn‰Ü›8IïãÇ%ßA3uUÔXŽåÖFÓß/øY®§PÄ©“¤ºô•]Ò0ç…9mÅÐ,l¿6Ñ}¤cªF=»åwÑü,b&%M, ?ïi<EG5V^·8WD–t°—Öoœì%Îå÷XROiÇ:åcÇ[ܦ®ãCŠI¸P/ÿL¹Ã„¯‘l…%På3p‚ªFùìkäÝSÓ¢X[š»9²ëTz«ùø8]–«ÀÒ„“‘ ÙƒÛ ¤8£÷é¸_ל Ê–­ôÖýü´Î^!Ãq®'¶¬¿îÝm;£ ŒeÓZb·ù<ñÝÑý§°ªÚÇ#ãÆ.ûs žÊqQGíN+m‡¬Åê}?Ü~x{ Ô-9Ó¿i¹LSœV9]ëJGØ»æ©+~åÇA£÷/ ~°L(kŸ'5Ñødz~j/aŽPkZʹÉEòˆ=|]5En$2 Qæ!.Y/±×ÎsÖ…jcË]ð žõ~(;–]=ÄÁùÉr%^¸oìÚËgZÚÓÁ ‰Æó¯-Õ+cö”Šçöü›z‘ÖsðjŸOÜâÞGkâæ¯”É;T´Xôðé;£ 9<Ž ÞÖÐÓ¬¡.Ë­ GÛq µï_YlÈE½ªûWõr¼&«™Enxù]|6nZºÎ/RÙß9͹a™ãç;–<Í U}p™Ëp0TÜyÈÓ¡àŸ({Ó×L®ã z]î"©zÓWa£÷ºÙdå‚à÷_ Ý2ý`ÿôƒ{¾Jöåp6.Ÿ„–ƒ› åQï÷Ó p?´y®oYau`o°gq{î P³É}ý¬BÛÝúÜfúe*ït– ÿk½„æ½™ rò®z2Ÿw_¶ X£ z N¼•Ç“V[¯Œ®Þäå°ÏVÀsìNýdšk35}§­TgovmŸy”¹è¿VÀSè‚p½}&š– ïŒAmôp2‡ìò~v3ì?_š[ÁN'ÒàI”© I;çA•>8âf  ªm.ý–ùiÓ>ÚàÃÉAüv¾sï) ‘žÁß‹‹|)xõ§¥–Ÿ•.UAløæåÚê¾ÀÄTd’BV‡IÉK%rÜoú©Hz’Ád^d¢In=û.…¬ÃÀ¬åY˜ÞÕ·‰¤»|z~?Z„ÀMÇÎàÔJ ®Ëåssc” ;[²Û·S-è²êOÏßl (Š!5—ÕbÓ„så/‡c³VH¬íPBõºÂ×¹isIpÝ‹*Çí€55}I–ôyõGÆ@‚VB®ÇÌíEœÞñ–·r'\k¦p¿ïl”St¥ð" d.Xïä_pûÍѨîùsÞÁ¿e«~9š+‡ú¸ñô¶—\W—ÝÔÛW3¾‘âh‘>·š#獵Ɗ]ð½Š#Ü&VM>†˜¿v^õîwóî>?µdoȺ`nlÚ¦Iˆ8âY WÞ¢“èɪ<xzEÛê1Ẽ·›¹·Ø˜4w6ê_½TÓÚùiµ }=Iä ‘ôó²¸h݆3P-DV‰øArèÖy“h Ç+âµjŒ-•6}5l`^؉LÍ> Üf}N5Okzò]ñü:_þŽWÃ1¿4ñNÛ‘íQç‰æxóûÚÅ5565žUä¦Ó<#7^Æí™wóVæ7µØ¶E×û¦ TTç8ñ’®ðÏåà«6%ä’œ¢•¦s×X÷Ú­ tN«.º2p¡íe•°bM YâRÁŽ Ë†™Xi|¿2l[hØ&8—îb ÐjlYØcp›d>}öéS·Øûx…bóÁ£Åq! Ƽ*g²"E+Š.¿ìfÿÑ7ƒ¯f´ù©1=R4œÔ/qP`D§}ÄO)‰‡¬, ëñQ*®ë=ߊzóëLs[ À"î\fëÑèO{ï¸&ì=î} JyBoÂÌN#fe PüÒãS¶ÞƦsSÑa¦îû{£O‰Á öâší9ä¦'>°çÌJÁô‡&T¼Ï®âú"¾wöDyØ KÝ#6o½:Ët‹ó~D”ÌÂ=&¼>Áì]-RL¡p¬¨"n¡ÚÉ(Ðÿèù– endstream endobj 525 0 obj << /Length1 2166 /Length2 16145 /Length3 0 /Length 17455 /Filter /FlateDecode >> stream xÚŒöt¤ÛÖ Ƕ“*騶mÛªØvº“tØIǶmÛ¶m§c£;7çì}¾ÿãÞQcT½ÏÔšÏÄz‹ŒXQ…NÈÔÞ(noçBÇDÏÈ ‘S•bb02²Ð322Ñ‘©ZºØÿ#‡#S:9[ÚÛqÿËBÄ häò!5rù0”³·H»Ú˜XLìÜLÜŒŒfFF®ÿÚ;qDÜ,Mrôi{; 3™ˆ½ƒ§“¥¹…ËÇ9ÿyPšP˜¸¸8hÿtÙ,MŒìrF.@ÛMŒl*ö&–@Ïÿ AÉkáââÀÍÀàîîNodëLoïdÎOE p·t±(Nn@SÀ”òF¶À¿©ÑÑT-,ÿR¨Ø›¹¸9K ó‡‹«)Ð ðq:@EJ à´ûËXö/ZÀßÅ0Ñ3ý7ÜßÞ²´ûÓÙÈÄÄÞÖÁÈÎÓÒÎ`fi(ˆËÒ»x¸ÐŒìLÿ04²q¶ÿð7r3²´12þ0ø3u#€¸ÀèƒáßüœMœ,\œé-mþàÈðG˜2‹Ù™ŠØÛÚí\œáþÈOÔÒ hòQwO†¿›kmgïnçýdfigjö SW5;KGW ”èß6"¸dæ@###'3'èz˜X0üq€ª§ðO%Óâ¾Þö³@_K3àÇœ·³‘àâä ôõþ·âÀÔÒÄ` 4·´ƒû'ú‡höþè¿“¥@‡ñcü˜Œ|þû¤÷1a¦öv6žÿ˜ÿÙbeuQ!1š¿)ÿW),lïð¦caÐ1³1˜˜˜Y¾ÿç¿øû?¥ŠF–g÷¯ˆRvfö®¿H|Tï?DÜþž ʿ׆ ð¿'ÈÛÌ3@ùÏøë2²1š||1ý^‚?]þÿÍþQþ_Çÿÿf$îjcó§žò/ƒÿ½‘­¥çßóìêò±röb÷M5€-´ÐÔÒÕöÿj¥\Œ>vDÈÎücÎé˜XéYÿ’[:‹[zM-]L,þš¥ÿ4ãã K; ¢½³å÷·#ãÿÑ}¬ž‰õÇÝâüѲ?UÀÍúßsÅìLìMÿXAf6v€‘““‘'ÜÇ| 6€7ÓÇ®š=þq½½Ë‡ àƒ£/ÀÌÞ îÆ²³„þý‰8˜ ÿ ƒÔ?èÃRæÄ `ÿ/âdþ˜Íÿ".ƒÑ?èÃÒøÄ`0ù/beý@Kþõ5`0ýüÈø_Èþrtý–ÿHX>rü gcdû/ŸlÌþ ËÿB6–? Û?1ÙþÐÛ»:ýËÿÃÄü_ð#I‹Rþ(ƒ…§ƒÅÇ­ùŇÌò_ðƒ±Í¿àåe÷±¸ ÿø²}ÔÊî£ÓÿÒp´ÿç¸gûÿQ¤ëðú#˜ÃÇog4sùGÊô·ô¯ü¯˜ýCü±yöÿªïÇûÁñŸî|wtµwšÛüODÖÿ”‰éCõ¯â1}ÔÂùzJçkî¿)|Ðu¶1r¶ø—ÃGVÿ„û¸(\,œ€ÿêÏEwû9|Äpýü¨¶Û¿àGÁÜÿÕüxžÿ‚½þÉæÃÕ èôWìÿY+W§ò¹üyÿ}ìÜðŸ¯9 Ðh·²hoÂdUÔþT-ôÉî`’™qð&üFc_ ×íH)@„÷ù–%/bY¨{þ0ây팹ø½ÉZ‹ÑZË'%‚k¥¾ÒÌxÖgïåÌYÖ•ùP¦«KÛÅÎÔë²YyØýNpŽ ›Öñú`!ýD‚—¼¹ò±Â⚢ñ'=Ødd4'' XP‡PzG¥pÐÜ|§©óàäyøÉsÊÀ3Ûîàj)-¨åNʧÓSD™»ôSþäã^v<ÃiÀÙ~¯Îk4eÀ]{ÐWJcçqÏ<RûÓ7’7û‘RÊæÍ’CÛàIà"ÛÑ$WÛ°BYÆ»ú<Ô]¢Å­á+ ª^,l¥½eeè|â°ðý˰â3?ƒjé³Pe|dkFfbõU2æR hÇÒÐUn½—˜fL`Ç"¢,i…;öü•A2#¡­–l 6¦\jÔòÛû%áɈ‘ï_ Ï>¨çãû°O]ŒKpYæ`&¿2´S0´ £Å2œÔ\àõ™¾dÛ/2ÝökŒEH„ö/Âõ†eÖ!¸É’8«¼$Òáäš5†øºÜ´ízã’'”LkÍÝg†IÁú¬å:£ÎXšÍýjÙà Ñ{ªã Åñz«ùiùž–h“q¥‘ôþ@­fÜ,&¾Ìw*Ç1Rß„ö›`y‚whÝ{¯ßå–@¸´JWmiÛ=i|Ýe éu­Âw¸ÜT¢,õ¥3cf›²röR×|Ðâ±IC_´ZW¿¼Úv]н¼D®û®ƒ¾šÏr|ÅÐfôÆh7sÃe{xþmˆ„sMg%?÷¿æÌ“Èå}B[}É*MI¥èÊ×Qw_)e¯SƒcðôK°âA¡` á2jS’Nž,hºáQk|wŽÜ‚¬EEeá«” –/ pzƒ¼óˆVH±ñ Yùþê§¼'/à —ÜÎÞôѱˆJ¸’‰ ï÷¸Õ-?y‹Šp2ÆKÃÕÑŠƒmš(Ç‹ëU;ž†ë͆ìât9VwmÓjK–Ë^õˆ”CRJ¶$úxåÇ‹(Ãe 2L©e|9.gòÆ!G2j¾¥Æ;²¸_YÈ0^±yÒ,âBdg‚ÑÖÙQ³DÛ·³¦ _ÀÊô2Íoû¿0= ò꾆‘mÅÙMiPb°¹Jam‘ÏnšæIÁæ›iT·»”é%=ëAvž²0݃ßœ”dBª#5̨ø}Q¸/©l@<&7üub±­é,!DR·Gv„38‘D2cqÑÆûÞ¥ÎÁViñ9;áó§hÕ©©ðYPBóŒùVeå_,¹k¾r&¾†½7‰1ù¿¾¦H”Té2XÌØ9é-zÔq}ͰĶò™ }ÎÚï‡Gêz0-™VßÑ«l,ÉÓ*æ¿¢.úË:™6faÈmþIÉ<5ÿÈÚE~;q˜‹¤ås¨(õ5éPi{:Ú®§§n ˜K$_ ÅÛ“$:CIÈýŽáz¦Ð2v1©55¤‘;J@å ŠÓgæ¦{Ðo°¨Q4·zç£nXåÁµß·Î–û{~«óé!¨!asúOîïDbÖnžXCH ¿°ñÜbuµðX-ïIþ¦yZn±Ï Ž8*-¢òŒ¥×çE‡™9ÍzŸ×7—·Qç¾> ’„_¡ÌÇx!š±"¥~ŽAYÃáŸ}2uÚGíÖÊñêe‰ŸÅÓ'!¢|Ý(õŒ-(­Z{q. v Âq©d%dÇ–Ázšs4)È-R/Hn:óÝêW\“¢ø­,f±Þ:þJˆßöÔŽØá"Ïײ­ë»£$E~,8óË=RbLíªÂ”M\s *ÿsÜ ‚NÛ§±Tçn"û\XÖWQ—›×£}‚/“þIܾ+(\ r+zfçmPš+6f7yt/â“>Ë€>-¼Ó N°Ò`r5óoN€ æIêA[É)ƒ~Òœ©º0ŒŽÑj¾´W]³d<ã׌}Ì/5Ó*Mköß´ ¡)Ì©Ø0FKO¸u«,³´â$:ˆZ<\5 N} &ÇõF æ^¥•[ö¸Sɤ‚¡zœð¹åYÊGbwŠwõ×õý Ë^zâ(˜RË9]^kuLJ²“>$"bÕî¾Â‡é'•Œ•,ä·nßX•¸]‡d’Ý;îhìDæýܺ]ìA2븓Œêh=ˆt¡qµp8/:dε=WSSUX~ئcÝèí1½…|v£P¢”×1û|üÝþ'3¶a_@W¼räÙÞBaÑðòfoiÇH™HÎA1nÍü‹²ØsˆÈ¨”ÉF78W¬J²Ù¡c‰l/1ÓaÆÄ”èDˆ'œešæßE¿VÜ4è–ð)³``¾˜òk­MFqµÉ…*ÕBM&0¨/˜ÖíT‚ÂlôÒü>ZìzÖÀ%”º¾ XÇ—ºwȺ/B· n)ôÑj@V÷£~ºy0@ίFU³.Ö`^” ?ˆt±.¤±Pç%-1P5/’=[ntýqgâÅ%p©_?çùVCÉSžÃ\³~~z7N·üäÇQ= ‡rÿuâÔ©¢ˆ\)a‰Q§3mFHN/ÓlAóP ÑC0²å)åðÊNÿåòkî:Ùhó/Ê™nUÜÀ” z D#&Yúz÷ÆqK£ào›’e¿O?‹DÒšóáaCWšmPÁ©ÆÕŠIû¿†`Ó¤\Å0íÄ?™Ãϱ¥ô8s•Æü¨G"þr7-¡åÔ@º˜s¸Ìº•ÝïxÂèàŒ³à>³"°„M=0Áá´Æ§º°9¯êEö±ñAEA(©c({ZOå¡H¡dVÔã…ݱ{œ«™‚³Ñíy[þ²Í—°ó=‡nÎ9Àóæ"(poL´(žˆú*65Q˲š„TP˜‹ŸðÔϘ˖`GÔZòÅ­‚ÿ5±) ôÍ¡‘†lÜoûrªËi„ŠGš§%u&t[š¹átÖSžéf„˜û‚ñèD·øM®Ã…ÿÇWóî­ÁÁcqÛ€S§x–E¬Új M™O®Êà²DÙ‹(gcÅÂó¬ Q㊶(ýa@›ýß]:Æ\£Í›ÏòÊ%NAm0dŒ2xÛ—Cô{íQ?9ûUsSD¼Ãi1]Ϲà!ÈHà:Ó˜Ð&ú—[QïôdÔP¥Ö¼ZгVöÍžwj°@º(JRÄ-Ý%È™G pEy5 ßOKN>v»ÍÏÜÀók&±ßà|˜'ß!qÑsëTc¹qÌiéZokÇ2?û_µØJZ…1ù:þj+3PdÆòÙ0âüY0â:6n]«¸óÀjÿ\hpv‚ò—ï3ö6¥À-m>&ä6å¶ldkm‚óIM§Å`é¾g†êäÅg;ºó2Àýþ«™i>Ÿ Q´ë¶ï˜¸aøbWã£ÉQÓ¾]®òz`·ÔC¨C½§¥ŠÀ¸›#0®NÅÔñæxgþލ”!­Îµ“ŸÂoïòÆFÎ|}}–‹ÕÞ¤­1Eú»KN‰[qª}¼[÷¢{Ò½ð¡áÖMЪ™oò}Û@6A0¸à±Ô½O~¶*ÈW|ÝT“¦%f4üÂ=bèðr’¬ÕH®Ø¤/ÛÿŒ!÷ÿÚØ˜Ð_†3-Ùq³ÌÌ U) *¥Ç‚ÎîCyÉž!<˜Â=ò¦\ŸZ=7Þ¨¶¸ =4̾ñú5|‡)!Ùæ‚—ªžˆþ‚H³\ÿí±Óüw^Z(ü¯÷ ÓNâZózÄ/f}Žuîma.Ké2¹Ú ¯.÷ä3`Ù´¼ŸA~Qíj%Óz%?xELwEBBV‘1'äƒ e7V×k8¸N½âm˜Š·öœÞÞªÑEB(áõ3š]wÞ•õ ƒ#&d\Ð.½ºÍ…ë^I¶Š/EÍžˆ··ø|"bK”–àÀ÷¸ß®ã(»`uÂûüŠ%P#Ý­üSFã¬ËáÍñ÷®pêø ‘o¢ ôÔ@³{¼N‰âT/iIÕKf¸P­&.Ö´·î~¼£¼û£³ívn5¹-Œ)9ŽWž¯¤ÌJX›L>ì\xçgÀú)·>ƒý’E?ÆÔÃp²8&D¦dËñäâç<âä´?Ef{ÊGª. ËQUFrˆHŠÏÞj[Ûk‰Q·væ³q3ÞœÊãñ©îÓí0 ó¾š-®ã''÷—‚ÆL¿¯FÒxQïPy±TмTÏ£Ù™‹%õEh¿—¸;Îò™Éú hΩ¶íQ"2ôÅ šJ›NÖ¥ÜbÑö?]p\~1C•i¯£qnËõÊfv¾€,þÝxÊJÓsâßÙvÀÍ/dçïð¢Ê°¸ÒL®ù5?R°‘³¦E+¨øÇ½ þ÷cɵñ84×›üîxd=ù|•ïjÓç j˜u¸EŽ—`¾£Ÿ—‘Mæô/ócXÝÄîBI??YP¨Êñ ªÌEVvX+ršá–µð ”ßV|¨‚0‘ahØ9ê’éÒEäß"ˆ$Mš_ _Z>¯‘U‘GdëçÛ¤ $þ¼Ä ôYžˆ›7¯I€2¯\TkF¿_çÆË)Î(‚L[ÓUz늂4å4À­ß¨¼‚ÛQâ‘ËÞœdórù &g{™Ø`9ø»C:ti¹FïÌÝÒ¶ç¸Ov¬(çaǤP®i&Ûš?VRª^äŒoPUcðzªu±.yE&9c§ço€†@òmt‘-š†KlzYµz¼yøP¤þ*J¡E'¸n½rî ñfÄü™/„÷Jp»ŽY–uP¿ ¼s¡ÈL?’sƒå[÷UYòîC!¯g“Ç™éÁ›jSH¥Ç/g'€¼Uó‰éNÔņ Ô’OȲfæR{ÊÄ)P¡g) ±“O@|o›8m™Nùwˆ¾ßöËoè‹öW ’’,ÇÙ%úJÛ0Àa $Goº9&v±óI²ïç«¿ÙÉÏfV—ï¬&¨=šb;Õnö?Súl¨ç²'#Ï”íÃ9Ÿ#«Þ¤P,Ÿ™ë{W¯·j¿Í…±û‰ŪçB õ8J@T­îÓÚ=~ŠjÏË9Ç-õ9ÚÜż×è“ÂÒD™ã˜Ró머7èT¾¤6¼[+w•Ì•¼”œ2}‡\¨vÄÚûì[/nœný[ iNìµí{q @$|Y¼Hû¦Vc"jRÅT_6å½ÞqRô'† µBÍIù× Q„Ξ„¿y©4Zž®'}ó¼„TS€ÕîÏ–ȰŸ)—ºx?Zº†²Q´­úŠÚu¹Vê hGëéߋϺˆ5á\:Ê=à!ŸÖ}(£iÄüù& ÜÕŲñmÂ2€^[¿7^p¼´‹Äß6¸ŒþD+¾iwë©g&iðKŸGÉSR-’aã3 á»K3Ô%}ÉØ—’nâ©4K÷0Ìx\oÿSO‘» cŸˆéNœ x”¦¶žš½t랸øüýŒw™3¦›Žä}i#®¯ nç¼±ø)SÑjHMÉ´t]ÓµŒX«N*u2»_6NL…¢—*[e Ý )6KL?6þisA­5¶ý¼™^®_»ÍKMqŒ#õuÖœ‚HoaU#ߪi‘…FzãÖÁDÏÂZNXå…K]anº÷<]§½ôÊ[†‹âI ¢ézÇcgªæÖmÖul6ÈÓ0ðДý~h¸ çÝÅ>¾Úé rÒH±¹kéIº¡¯×v𨑠%Ýn—ÇÅéY‡Dk¹b½I žÚ Þ€ê¿çóÖÎø©ÆþÞF–lbƒïWõ “¼­Îm$ÕÕ·Ìѹ: »˜Vi·Z¼J@¹SÂÖ(²ëiÝrï SÀÁóíÌ8ÐcÚL [6ú‡ªÒc¾ r°Ú:{%píd¥¥•F «n0ÁåŠXà ×}ð¢ÉVH~¼ý‹ìÎÝ^ ø/í­Ù5…ëÂüGOér¥8*ünEPpfR^Í¡v XÂjˆi\¤ô ¢÷:,!;¨™`îË|ëst»C;G³$ÈÐ28 aöË:}«–“U|ïsüƵRå± ßXí6ïv¤‹¯óê~E:%Íω‚‡qqZ·üfÁQM¸ }Q*Ô:‚•jy= ª;”î$wj×6†Å­VPä™÷sç2þüTXfb’„Ûº˜Òi*;”oÌ8˜8Ö…‘ºi1 ½tU«ˆ!]4à§ž—(…ÿ±‚»çÍ#B´‘2Ñ´ Ò¦/‡°ç.¦ïæŠÙ&ÝÚáBDÒ+Kì½OkKƒ@†òO˜S4|àdx’j Kf•ˆüàÑõ¯ÄϘ¹QCˆðrB÷)óêǬ]utn ´°¶eÌ¿ÓOV8­¿Ç5„²ØØ*ˆ^Æ–œ)©ÊPl¬‹cû¬ÑÎ]ƒ€eó©h·ÜšÔÖtá6úaTŠt±@jÓ ?'dFæ¤Õ䛩VÙú!û/«§ŸÕÙt™ç¸¤ÒÍ`Í‹<2Ë  ~‘¥yÆnþâû|ÍÊÍF êCÌ'õ½ÑÉ+ÑÅ6hl[sk~óˆÊ§Ã7å·ìÔÄp¶½Ð_¤²CP ìïvY‹æ½Zðæ’Qg VE‚uµ·döìLŒêÈÂRä ùŸ!¾ú>uèH°IÒ›ÀçüpáÕÖ¹åŸÙ¡ž¿e†CŽ–q¢ï—_Á³ ÊïœçœØüÊžÚº ¹"uâãGpÑ„Y¿ö¼‚¨ú:|«.ÀT/]pª¸“Î>›\h5›BЇ ž5^ß'!3ü^Ôƒb¿BÅrÐóþ"˜¼C•Áh¢in‡ike~tÅ+O `œç#N¼žÆ•åZHÄK&K´7y{uó.ÇAs‡h³}e%—;Ë” Ð2ÅV®´%ÛCà3ç_Õ¢s”gj‚6š'²§¡~Ív•³µL|,ehët­â¯í½SbM#Ј“qñîÓfÍ{ÕT£–1XP×Z_>,àös6”&æíñ0¾íLò{J6T±@ÁãÙtÑæ*"X®»žŠKGwº½X™%%x·Ð4Ý\W aX=þâK¹×ì—íÏXHÔ¦ßéì˜|ΞáôH_ê×n»Ü¡ó$³|Ò‹^¢4‰Mƒ’ÉuŸ–ä¦Ç?˜qµ`¦©Èl=ª[ý0¤ŠÌÊàÇêÕ›þ»ø$0í€ Îû!æaÍŒ* á‡`⡬OÄQõ.‡xËSÉ÷}ÞÆ1óuÿ>°þÙgÕ›¼%3…õN"rb|i0¶XÍÝû4[\Æ =µ-¯;ñY/íˆeY]Bñšà¶ÃÔüI™ ¶ÏÏ+wØÒyò0JωédÙ‡O~jº†îÒ‰n¶ ó¾°âÄÛ˜¡iX·„VóVÕH¶ÌÝ£ýX‹wGh0|‹+Ò{á’ù±äxÕW¿`;³ƒiµÏ[œtßw¢_²g˼JƒOgT=B_¡HÖ.c>ƒÕ&=‰ÿ¸ŽÒÌ Êa¡$$R^³qz>´ôÎ:ú'`ýp%ÐÎ7åÎSå³=×E4nKƒ±Ãê{¸xnÓ%ñ ¥ Ûy½æ™*ãÈ?‚¨Ã:5ð÷çß.§ïe½axª¬)>&`Ú’¬OðQvìØZ´³ÉÏFPC~AùìÝé°‹†Îš_bÆaÃsßæ¹aŽÑH×Ê(‘[ëƒ+¼/qà£U l`oïðR¡W›Zý¦,Ã["ä/®ã"KÛNÉyÛ”ÙŒÌ4ÀûréÍÇKiuwZ:­äÁ©í3áYB²˜¦'7>áÛÿrƾUvh¦q¡Ç¼C†$?ê+0ÅPÅŽ4ë.¢lœ³X™zó{1!QÂn©½ ‹“ p Ò`ë\Èlº§ß6Îq²ýbA_JŒï-}NÉüT·+'ÃÉà#,†Uap“>ôÖÝ ÷…ÌRô`SIXSNwŸ£máØùgÊX¬¤:ÀšHСæùÛýà~%vîw½Köe joç™_c„ƒñ©w¹ínÃïHWÛ3ÝA *›”Ì;Y›­ L •«S†Ô•5MÈ|v´³¹æxmZiÖ1Ä!›#>Lœ¢󨣕î=“AfØ÷-­_Ùê %:àSø´…mF!A¢çåXÆW"ÐK››¸µŒ¨-P=Û–®m•±žL´ f±øÂ‘6h4˜0ÊV¾'A.åyÞ¤1ΙWX>hãCi¿ŽãJz%ºý~+ÐÔAÊgä%7¤Éz.(ù'›ögϦ^&Óù0B-™ÿ.{‹ðס׮o¨tPЗë»õ-@ø¶•õ™tª½¤¯š¼<†ÒcÏÃÏU²•“zú‡˜¶Ž”#>8ÀeC?Éþ§u”#ð´D˜ßÿ"Õ«s¶4½ãÂQñ ϯQTF¡“£§µ(>Û_·Zó×k9ö+áöJ<Ò½;&4/ÕwøÃËyª¥wÁžÂ¶»Uw~+ÎÖ:?8–Úò[3üLÿƒð¸íoAãºÃ+qhnì:Oü$ ö‹ïñʧü.$:½ŽË<~)ÆCå‡Ê?]äÞ³k–Â\$,R(û4XÅ®Æà×Ô‘žê ¿Þ5èçu—ÆROH¥ Äã6”êÊûR{[Ýû6ÉäB­34ïãXrÜÀÏ›•>”xH<–Ùx¯—ªa ‡=k@­7F û×nzW­ <¾]ö¨{N€€9­5‡Träó³ ÚyPãrÓ\Ç6"m˺P„Éb¼í¯À5ù6l”,„g"#²”¨<¯ëPÍXÇÝcQ]Y莪tîßÄ Ý-C²’= G¯J9wnê¶ß’3ÐrAZìøF¦”¦På-)®ËðòÑKãZ_©Ôn°9«N8 6庥Y€‘— çÖ7ж¼ïç¯H3ŸæŽgá¥S¡„7É‚T‹å1sÕø†YEc–}¦¼ç>­.U>W̼9×kÑ‹ÄóWåè çðÝä+g)J f’M&üvB «ž0Zÿ@:pÁa‘i‘ÛéõX\kp¿c]߬‹–†éúcŽ%>$í°]Ä“:'5²)ÛøPue:þ¸VP˜`hÌ.¯8,ÝfŸóŒä-ñ­§»MÙ€Úzf(˜Œ“.^$xÂÛ;² UÐå{s“´À8Pg̳sD:­ëÀúìò¦ÔŸÓ¹-6™p~83\²/ü¢ýõ|%Œ/-Ð^¡c CÍÃÛq’±¹œÜ´í·“ʰ¢#žßSuk ÇŸo=r±P\~ `>F<¥Vè¬ÐÒþðÍU®RÏìÙÕã_Åß8= ¸`%¢–¡·Ûà÷€ÈRì°•Ï,AüFˆ[mtÓ¶jWÅnêKæ¨âx3¬÷Ñ»¦<—gWƒ¤¿1<2u®³ö±\EväZê"¦ooÌÔŒG9ªÔ*)gÔz¬Â ˤ*Ìf-ó•wÈFð%«þWŸ²¿]È;‰§ðAt´QÏ’ä!žôZÔP9h!²¦ ŒkpAU9ƒVÑ™É×pÃp ú9®ëÆËºFÎd—@™ãûŠ­µ^tÇÔi´#aÉ¥û"ϧ÷·G|Ý=úš°øv–Rôzklj%U¼{Ç@áãB|JÔP‘ Ò¨¤Iåׂ&ðœvÅ(Àò <[O‹žá²ÿ*Á5Õ"¾.ù= #ñ*ÒÞckbIgF2çK¿¹b³¬ºžîD„1æaÄ8æþy µÿFcMÄ´Œ®ã:]œ™ùÚ¢/Ù¯ÖÄÏb·Éc4ÖЪ5%} ìÙ¢à*üöi§¿:ƒ‹õIÆ$ ér:ͳK­/\Z`:ö™üº®0zÆ` NéUUZƒß!áÑe(;xw3$´ºqbÙÞrªÄÐÕ~ˆ·GÁÖXÍ,oe f&Þ5 «dVÃöÛˆw1Ɔºáý˜²|L2 ¼ ²÷ëÖ·ó}Ï·“~£T‹S&®%` ǶpÕ‚r Œ9e (CÓù…ÉÚCÂÓ®H5Í E~ð#2†U•–w{·ÕMÚ—icæ3£ÖÐç¯C {€[KWAÈuÈ\¬~E®åy >À &Ïdf†„×AyaÙãóDF—›ÅêÄø“±k~ˆ¸Çõ ']å{£ÁšGE=û"Äq“W›¸¶Ñ\Npùª÷4B Í>‰'_; ¨q µù·ê¹£(sC:ï+‘‘Éóï¬À§k5ÙTé“Á©5%›F2Í•mj=ª•–²ñ£cª%i¤‚Á(†[ËRÛÀ‘}vláÁäóéZîî"FÓ(¥wöõä2OÇw!H@°­GH(RÔmºŸhöx™ön¯?”Ñœäç:ø¶ŠÙ~|-xÅêûDc.%'AèâÕÕE¥X.AìóH³½;ü'Aw‡WeÈòû–ïÞØ’zv¬ØÇCwª€Ã.ƒªÔ®$ᔫ¯îºÚÝß’ú†Â„2ÉÒõFÕ(pPã¼\@¨Ž‚¦7G¯õØX -ÄøÉl÷8NC„òmlEm ”`ÛG™‡uzÊ‚Ë>;ºÏ °{’Mü»*Ù xÙg(ZybÈT¶É­Iý;mßc† ‚ÄÛû)!i[+æ0$ Aª}¦‰Q;6§ôˆ¼Ae¾Ü” X}Ÿú4œÝÜöh”'Ö  \$ÔŒt¼ :[\=Áü$ã ezP拃¦|8-¶·öÆwàä=™‹ƒzÆôI@Üp]ª HTŸ+Kþ\­-mo¾»k?ëÅô‹Á1àØgªÛD;˜cÚ·tΑ$Å6ÎjÑ̼ì<¢^±Xç*ßzŸ‚^ÿ¹¹±[Sv\ áÇÂ(PNiÊg@)IöÆh”}óìUÙVÎZb—Ðêü%§™s±[¿ôÛ.rWâˆ||lq"|ÁØ–pN®Îƒ)¿êAŠX)òX¥­褾 °93»0ÔÕÀüT…Ø(‚¯ÚŽóG<<íqw‰WÄlM‚p©ýº°ä¬Jõ›já—z|Á/z†?ƒråtýŽ…¥ ª¾IÒõîÞ5†Æqö1&¨ߊCœ¢ ÅXKú+¸ê\ˤo4áÚ½7ZŒsONX0: bˆßâûÝËñ¦3Yd®LRZGÀ-w+Õ…2¸£c/n+ì`êÑz²–v–ñ¦*ât Õ5¨´ð0 K3Û!JlwëX+ÿ>abë?êž‚#w®ö‰{ýí¦"à„ÞÏùäòø!lÒÓd:#eéa°‚R¤ £œX4UJ¦«ƒFö¼{æÕÒ×T*Þu=µ¿7^‚2—ã$ ­ÉH ÙÆŸ«ß뀸ÅÔÀÕ‚`FtQÙ>0u‘´: ²oÔƒïuºöø'»±”ÁäÈÙ4a(îvô²óFÉ“ "Mñ‰Èe7ý²o¿2ûÞÅÕ—™ò |ôN㋟b3à ¬ÀÝÞ –‡íÑÚ^"¡Ý0˜.ôÆ&vð!&ç$æÈу[h6û6=£n…™Ún—ǃ+“ ¨$'$_…ø>q‚è¶i?145§»ÖîÇž„‡zl0wüÄî1Ãqœ“ÓX&¯÷ëê:0`»jŸ‘jó÷Ìa^"Æ“äÔC>—°ûnï‹÷£>öb¸ˆMGý‡û¥áõê3¿\ˆ4fž0+±Úø³9(æÀ–¼_9í§`ø>pYéŸÁbï}Õ/ÚÆ«IÁ&É2´ï’`>eâ7&eDµ#v”¦Êe·Sqáèð½JÍS}z“½£âÏvË¶Þ ^>åÈÑJjP•‡ÈB7ª¶êßÔ¡ædÔ¤CÑ÷hl¥³x\!²Âð„Aíûó3˜wµ)ÃU0 m¡Œ‹ªZ쿘|}¦êHÜÓ̧àemS„³Yè9ß;à cä]|çªf.óV¿Årmxáœóׯ(›o'Ïû,5:`iோVMQ±ÓŸæU?­/Áǵ§¶XŒolLIŠ ¶mî%Ú†oƒƒÂ#Q&´ñØ÷SN€†á‹|Áåþ åžJ›DƒIÙî‹bÖÏö€À óàŸHV}›é·Vm+ÇæÃÅ‘ÇöÊÑ8Ó*JéG“€ûCõ‘l„%td¤O·e¦ŠMì>¸«A¸– ìSýÏÇ áT3ï/¡̘á#¼(Â×ø¦ g^]3?uÛLê—'Í—$€´ÒDR4…Ô5Ðc‚˜ X"|½N1­ ·ÚT´ogp)øâø³©µaˆd»í¹~…vA¿X¥|åɃªÂ…z‰Ç_?ÂÐìøÛK¾ ~äÊß*®qc”·Ì*É]¡ƒî¯ ÙVÖÉð¼ç£8¯ç„SWøLöU¨ÛùÅèŸgieâXéBÜìÇ(°~„2¥™.w{Ì"oOtÕd ¹nŒ<”·‚%~Ä6…DX‹˜gÞîö?ÃwÓhSrÖ£êœ';æÕ¤Ù)Ô 0QÁ,=Ê(DÀñáç K"QY²žÍ£¹¢™Öî 9ßè"±ld“œÛ’¾SåÒÿVضˆM…€’¢™n>“ªŸ´Ù¨o-9k =€å7Êž8Úd£ ñæÜF6éÈýŠ‘#Žqå3¯rÒAzÑø´”—½™éEò¨dºaãš“År¹ZrCpèd%˜&ä¹£q£Ñ†Ë¨ôìÈ<--XË /JÑfa¯“ìøkeÌ5k¥Qð)úÉsõ J~ók†\/|(6¥Á´lË-Þ8“ni«pÇôCЃŽGpB¾ôC¼ ^ ÂfÕ>ŠTyŒ@ˆ¯´e+Ø{oÑâ áâì-#(û~i¾.Ñ&Ó‰(Õçjˆp=é>¼9êyz„tYHX¬ËÀ,:{Ô*\ó¢WáÃBqn”ï}ÑŒn©k¿z•ÉÇ1x:.t÷ÐØ+[…¯HãN—iWµ–qÉöãÉXªA t:ŒàÑY•< KàÔ²ÍC‰a€ªÙä ¢Uq…úywعvþ©”~B eO®0à+Edp®-†œ9zG˜ÕBr¯£h í’v eO+ÕëÞ£|ÃtÕ¶8—)¬1BV'@\bÖO•*UZ‰·ÔZ'/Ÿ¨Dyc66çd¿WK9Š +k¿6°|1ÿNi1‚kV¤}O‡☟fMâݤ±uOXGÀ$]‘ʯ!’ëe7@ãz„÷Ñk1­$¦Z‡ŒÎ6”|»ðÛo"að=_V <ˆ0•/«ò‚~ {ÕÁM-ó5Ö|Þªß3·ôЎ猒ðÑ„nB©{µҊ鼟Ç(p~Q{'‚þ 5“ŸÛ¢±VÖž%‡ÁÎé·ïçFãR’Ü®¼fG÷âÎí9£Î8Bឪ‰g1¼Ó*ɇá霘¡8­mãû™¸ ¸Ùé6/âëþ|Yai܇ÝÃh[¬…v˜¾d8o{Í|‰pÎéöyþÐó;Øiˆ];¼»·À¶mú׊½²Ô«4)ø%k¸ìæ‰%ªµJŠ“Kñ~¨àAó¨v}o…MiÌ­ö¥˜þ…R‰ aWbPþÈo'SQŒ‰åü>7.ñäoáS@åàY‹:.G”–ȉå±-Ú/öyÒŸ-1 1k~ +¯ùæ¯Djávøù²Kâýì°sD…ö3ùªN”;¨\Y‘½nÑeoô7eƒ¾ÈÆ"ž::»PØs\…ÇÿÛ¸éÈÕ‡c©¡V"­Œáìp‰…… ÛñˆøñÇ™Y–êÝ–âMGb]ànr‘ŽÂ~:VC~ò4þÍŒr4 åæ2)u1gªdìšÚv:°ú¨?€@MsáÍñg£±of¨²Ä–^ö¥Fö5ìY%ƒŠ˜yˆàAÀ¨3—£×¸T×–b|UM%•õÑO޶À*é½À=]ÁÅIO»AŽd"$®­ý*ÑüªU‡*þÓc^Ý­ü&EFìR¦ÐÚ×'TÛJ%ÝÇ`Ð|9Üz ŸS|6{S†| -S:¶L‡?[œ3N¥ô¶®e<ÿ5·³ [Nêyá ÈUTô¨žŸ˜;»‡)ͤQR!LØ!sA~ƨöå.ÉYu7¹Qi‘L´ òªŽœU5xkÜaÞ’äGÛÅí–Òþ†aTyO5&×®ZG:ˆèAÅÙ¸Ó1ø™ÂÕ¢²L5x§ûF}¾xï `&BQÙÝÔg%|IjÛ¿ý¿ Ç»%{é÷ùÅzŽh!Çpf$)B ÉÌ/-6¨½<¹d/Ú¹GSuhh'ÿœ[á›F`|M¼¥ÝçÑÞL§§ÕŸ#wŒk%„»DD ¬ ñ]S°4ÝÖ+HyR-:¶c„BõÕM¬Œyt@æv_wyüj 8SmSÿª{û)ÆœÌõ0¼Í²”u`ë Aš£Aà;–Ø…‰#ö ªx+w!›0e²;»£;¥vrxR‡ãü ßB>ËkVÛªhö1R„K ª-΃„þG:™M¯ýWC÷aŸàÁšÇy'+¦«?¾ uGú6}½M(²2Ãi¡"Fê!K¾j²ŒÉdˆ9$ Z¢÷"5<ÎŒ0D®|oR¼q[‡Ï=ø\ÌFWÜ’¬¾Û@òT!jæ‰ úíQLy/ÚéW¢%”`ïþà›ò@WdÄHdŒk@„¿$#A¶tF›ë™bUñŒÙœºåj„9Xà-Ruø%ç$#á¸rCðSÿÆSæ9%P`˜ãŠ,ñi5ÍJÓ“Õç’sËHµiŠè†Xá=Ú/äXî÷˹,kdâöQßñÝ M}\)uÄ#4Jõ§WRzîÆbFþÎØC-ë\®$¶C@”lP°øý:|ô»´Åvr¿¢T¨~’öùCèÉ®GŒ+R‡¥šôx„a¬ß C]..·_{¾?&ê'Ç@Ä lznäñû2ÇQ½àå¬ù2ä«äÏ!Tb»>¯ d65‹|˜–éIFÓBt£IµÔ=[Ú²Þå b9˽·ß3lF e°¿`%nrÎß|¯ÙbÕ¼q®Ï­Kéœ(ÉÔ†’Ý•vôw·æqk¡]Í]pÌðg-'Ë)~£\ƒZYB¼œÈÏN[ó®ã@Ì–j…ÐëæE/ðvƒ¡ÇNáyKX=†Ûœ}:Â`]Y½Mzh7$)Ö(Ýg¢ ÿþI]ÿÜÿ+Í“³ìI ”{"ðùÖ_¼uó0Ü8Ò¸ò¢ßZ¥ƒoÜÜ¡½sý*Fžh!õe“V,ð'îËÕ§ËÇÓ®h) X‡·25%?ŒëpÓ…üœnØœý6ÁlÑÁ¢â÷ y7ÓŹ4Ðg˜„BOLí§° ¯Â Á™mK4àÚÍJŸš¥è üþߎ$y.>Ÿ, Îf+ݽèúºjºüŠÐ.P•§9òׇT{û÷¬¨ßÖÁ]c“Uå}µv6ª]%í´æ[l½ ×8üÕ‰½ëóag_ƒÝȰ˜&ܯ÷×W;zšÖç¾Øöu'EÞË<©bn9‚±Q¶j¢¨é")‰á«‘_Ç&iùÊ&äïåæÁ9§.17wI%»¥Xú†Ö™T3¾/ß87¤ä¤Y®_”ìY2B€¬¹Ötxå…å¢ DÍsg7VœE“?åô tÖïê}2¨Ž¯kC'f{¿ê‚¼¤½|WüQ+ÇØRKœkŒspËN¸bRŠ}ÿÿ¥Zý7Í64ë‚hÀ¡õØþðçA%NCôÒ§5ÀøÕ·ƒLع’â䘌 +Kì‘ M ì¸ð ‡ªºÏÐM%6eáWu<V4°°È`ˆùÖ# ©_iÇfî}ñPÚ§„BÒ~É©oER©_<›÷c24ì!‰F€FÃúÎÐ,ž$û$à:KÉ ƒMšñ®SÕu\Óº¤}›ûðµÅ]T°u[gb(ö«›îõ)Oú¼ÔmCêÿ8ê|sÍ,Uuò³÷ˆÀÀ«éÌ`ûLÚí@j‡±®FI ‘`&P¨-¯Òedî:îNßî„[²ÍNþ,n|8&ê¥k>0§Ÿ¡Sa–ÓÆ jîÌŽqN£:zXíE;ºAÂáRsÈ}Ž@NXÅÃicDUÕõÓ¿=‡QM‰ç;\n¬J3]ή«:ö8Ã$Œæñ§N*êÖ6ÞnVo¢Õ] ¤÷æÚÐæ8w« Ïw»s§3îg Ô´síQ/Çrˆ÷ Aws¿7ýPŸ|ùé÷#tEt€ìåï”Uv—)¦²È[Gôð¨ˆ?<Ë9ѳƒÙ936AÝy´°zI2ºò cD·@Ià'O÷{ïf{rA2-Â÷þêòÓΙC!%É™ïÞ:¿Ü ~ zW PÛs³‡c¸úxÛ*×¹°|MžæCæG}F‰‚M­¬|ùî—uçO†‡mªÛÃd«ßɵsÌ!bíàq¨HâWÓÛhC.e+bþÑ>ÎWž«]qóUùMd _CŒæ€6“0&ŸmÚÔî™þ-@†æ´x™2Ok²n:Šb’ÖhæŒ-mDàù7“rÍuä©Ö×=0ŒYôx ¾«t`óàä,Øòð`ú_J™ Äc¥a’鼂|žõëp"bðhˆ i<ª endstream endobj 527 0 obj << /Length1 2817 /Length2 19953 /Length3 0 /Length 21549 /Filter /FlateDecode >> stream xÚŒ÷PÚÒ ã î2¸»Kpw‚×ÁÝ=8w×@pwww·àî‚CàÍ9÷Ü“Üïÿ«Þ+ª`Vwïî^-{$J* Â&vF@ ;[gFf^€¨¼ª* 3€™™‘™™ž‚BÕÂÙø_9<…:ÐÑÉÂΖ÷ QG ¡3H&fè 2”·³ȸXXØ,œ¼,\¼ÌÌVffžÿÚ9òÄ ]-LòŒ;[ <…¨½‡£…™¹3(Î?¨i,<<\ôÛ-Œ mò†Îæ@PDcCk€Š±ÐÙã\Pó›;;Ûó21¹¹¹1Ú81Ú9š ÐÐÜ,œÍN@GW  à/ÊCà?Ôá)ªæNÿQ¨Ø™:»: µ…1ÐÖ tÄÅÖèE¨HËí¶ÿ1–û=àŸâXYþu÷Ïé¿YØþ}ØÐØØÎÆÞÐÖÃÂÖ `ja (JÈ1:»;Ó mMþ24´v²7t5´°64üº!@BX`bø?'cG {g'F' ë¿82ýåTfq[Q; ­³ü_ù‰Y8Au÷`ú§¹V¶vn¶^ÿE¦¶&¦Ñ0q±gR³µppJ‹ýcÁÿ–™ÌÌÌÜl¬ ènlÎôWU{àßJ–¿Ä >^övöS  …)ôÞËÉÐpvtúxý©ø_ÏÂ0±0vÍ,lá{‰¦ÿÁ þ;Z¸´™AãÇ`þëçßOº  3±³µöømþw‹™$$d4éþ¡ü¯RDÄÎàÅÀ``ecp°q8y8>ÿëå_þÿåþ·TÉÐâŸÜþð'mkjàùPíþKÃõŸ¹ þgihÿAÁ4Í@õïá×aæ`6ýbùÿ¼ùÿ7ùyùþÿ›‘„‹µõßzêÿüÿè m,¬=þ±M³‹3h3äí@ûaûM5€ÿYgy ‰…‹ÍÿÕJ;‚6DØÖÌúßBZ8IX¸M”,œÍÿž˜ÿ¶äÝÚ¨dçdñ×}``afþ?:ÐÊ[î'P³þVAõ¿ÅmíLþZ=VN€¡££¡<3h¾X98^, 5ºÿ=Ú&F[;gЈÀÔÎþ¯–rr˜„ÿýq˜D~#.“èoÄ `ûxLâÿ".fÐLþF,&É߈À$õ±˜¤#v“ÌoÊEö7å"÷r‘ÿ@¹(üF \ÿEÜ \”~#Pô¿(ºÊoŠ®ú¢«ýF èê¿(ºÆoŠþé7E×üñ€¢kýF s†ÿ"VSC'c P¿­M€ÿÊÙYÿƒFÎÂÉêwAÉ:ÿöŠiôN[9Y:™ÿáŸý/±ão3P#ŒAv@Уgú‡3¶åÿÙÏ .Æÿ"PLc;kÐhþ›)û_›?8f–Éä_ÈbhbgmýG, ËŒé7YД2ÿ'(ç_zÐîÿë”hf­ mþð¢lúÛ ÈÂÔÂõ·©í\þ 21û¤7ûëÁþi¢ó»|ì 0÷°7Úþa’YüAý´ú‚ ô;kNP%¬ÿÚÕßzP9ÿ ºª™~ûæù²íøoÖ X¶.6FÝ®fäzD˜ì~g òi÷Ç)3ûßjP {ÐKoû? ggùGú¿í=Lö@GЋþ‡)çß2 »ßMeUÒÞÚåb oCL¿Ý€Êèàbç 41ú] ÐÃóáÿ$ÂÆóôaa¹ø£1, RüÇ:ä´±øßYäøËèúG·8@Nœ@oé¿yƒèýŸ aeõ;,è=br6wþ1F ò9»ÙýqäÃå7)PÌ¿¿69Û9þÙÐ ¸þA »ý±– §î@PT? ¨ž¿syò:þ'ƒÿ¹é]A tþû1=ÿÅãÝÆð+‹vÆ|A–µAíÕÂøn û“æ(ö5Ri¼V;\ža“hª26ï„“FzQÖvÅ©o…V‰y¶Ôƶ&(·={¿èÇ}œÙoƒ_žÆœ*8® „#`P:ðþåà­îoÙÞ%C‘ëà¬ôýÁ­_Ò½n ôûxÈâ¾òA§,ÂKé,C”Z¤ŽÑÌ‘ÎDÞ5VÁÃë`{êVóôVöô¼vJÛsTÛt~s­Id]ìW¨ƒ†< ÁÍw·weF yWŸåÔ™ýœû»JÇ`™ø… 2Ü–îhô%¬èV“ù¦ŽkÍõh-{ŒºWEÖ†Ö ùkPŠiÇ̓eP¢5ì·.ð‘ò´+ù<útÆmvõÍÞ.Z2êÿšŒÊ]“"nX·=ˆÒ;yt‹™“oš£u·i^À:ЬLÁ8[CbtÜG/µ7õbëöæ*;Ì9ÎâÓ=aªê4÷žšf|(ú( µ1R-;i“i}§·F©±æ‡±>äEÔôõÇ/‰~¼õË2¬ú”.üÕ…´¶X Y_i¬o\BXª\ÂkòÏŠJÈáŒ|Ñ뱑R£t!Ÿj²ù|jã²1,4?ÝŠ/¹”·çs µÙ‘n/ÜÎ W`½”ärÙ+wD±3ƒK¥Í/°ÿpÑ>CrÓìèKNÏÞÏbm×vžžM^ͬÏ4¿I o6ÊÜ~¥]!„ ÷ƒ7üfNP F ÎøÂëB{UB]â­6s9XriŠ óX†.ÖPàü€2o’Ò[”û¡<#“câgûg:üÆ‚ K®ŠS ¡·¬ôaT\ð™°1U&°i‡0<µµi‰ãšûØ–Dgñ©€Ù¦õ¯BH3_ý°Ypûòk%ô> &3d%e]÷:`Áêe’H„Þ* ²øåód™8i†ËUÛŠæÖS‰Á¥êŒžX=uRÅŒMÚ!‚,Õ{Ù9$*ÔLñ-%z^ù#¯p6IÖÈBœ:9[‚ ?ô°>EQù}?ºý,Åè`žÚ}¯‰Ÿsýl`XZì6¾¢P©f?QdPQq³“.ÏS³§!c6käF²“‚8ÞîÔï?ª:›V!Ö i0«á@¢ûÙb0Ï­-Áàí¨  6’j¿×`Ë\¦QU5FºÌVê Ðz¯ñ+jÇDüuô}_®ÚúÝ⮪ßÝÒ:€ª˜È>l™úT™&KËÁ]Ù—\µ®™òb¦3Å'hUx Ê3¯ jÙ^FÑ3‹ Yž¯]îR è®;â/óìîúDaû1¹+­/áéýô7ÙE&;ÖTFcFëôÉRwŒÅ„ê#îm8Û{­~ÉkhX— ¢¦¡šEùDˆÎ›³çãy&HFX»s_ÚþŽd´íÖÎ÷£]@ û‡±x–‹Z»÷~²`gÔÉ—^ÂxÓNò»„‚TÄì†1\o´ëL40´b½ÙÕ"êçU–.×yðO/Ë–±$êP?­8>œ RfhæY­¸ý óÆ.ÆÉ q­ŠPzîJ@ÕlDHîÈÀ*’t—½zæ õå‹3Òpç g:Ð¥LÚ¬œ$¾«¬@ò ôÄ08 ñ~ý\aH[9ar¨† KÃè,M`î·ôFDË ™ëpá×ZãW%p¤€9¤7À6H<³Åõ¾ßGѹQ›Í;ê‡#3äÏûÁå×çenØÍ$T1¹Žöh¯µsƒZŒ„a·D|ï¥ $I™7O¦¦Ì#)ªN-ò /+`iËò“ÜQ[Ñ1ƒZ(ãaÑàïø¹6½ªäì7PûîÕi(ÐѶ¬FרƒÎÒTí ^Dm}Øš´Þ‡«½Ú±{Ô´ÞxÄKsç%+·]âØyV¶ ìp:'˜ ¶}‘Ýw’cT‚½3Myˆ—Ê»?]1º ‹¸›J‰¿0ºið=§ÙÑwÃa‘³²’mð‚å1}gföBn}ì]FÙŽï7‹ƒ,?lH›?O~÷…°Ë•l­QàŒKíÌøøóD_#lUF¨m³Âûé´I–ÈôÃBÁ²WØâ•7õ5Ä’T:ž·Õ÷ì\¨’ï©gz_77‘Šý‘z»ÃI+åi¼QŒJ º…"_åÅ6á±ß­—Ð3I™$Z”ùH Ω͠J{ÎN’5ã¡ f@%ßð‹¡â]Õù¨åõSeüÇÎ~ñ¡SÝbV9¿“~0N(Ä+AsnÊqL&CÓÀ»äìVæ°†Î(MòüŸ˜Á=;X6É9É1›|žý5ø7Y,÷-v¸8‘w²×Á«ëë‡%rûô®“yª.ÊGv-¼ë×®|ÄëÇŠ©wUFÇ&˜ºª¢Y6hLž±"É~ŽJÃLðµù)éb£uŒ4\µ`}ïzMz9Jj•†¤O$ÌÈJð¿Û5É™š~Yâö^û.9•½±~©Ã×*…o;¸ c̶YåNüi#—…Dw sµ%yË™Œ¨o K¢eæ>É,(\¥ ¨í™žœ öŒnšÓ¤<‰!BZ2<¿ ê?S ât½õt)ˆ2 „‹€³p¯7\7püŽFéØ}H€„,}vƒƒ³Ú¢/€úΉEåDÅú g_“ü"Ø€¦ ·âv¦g‰:ë¢+ Uáá#šî´„t¥ª•û K3£l©“wŒÔ¼ð=;—e™Œ‘Ó)ö]¥7XŸËôŽ=ÝéW½ôâ'Œu3v8í*›BZnó†7Ê¥T×DM-’ù¦vüu¹É1<š›DÂìä‘ü¼>˜v7–“S$|ho)i#ÑžJŸœMœ¾beˆ‚+x7¶¥=pHúN|^îmÎNX#çMÊÐÀÃwuœ<©º†y÷§ 5„ëKÓØqèàAr¸l~!R½~ªH Ãç.ÖÜn²mFŸžòz©aðßþðô.ÛùmÖGéå,ѹók‘Œ{]÷ÒðÜG‚ïÛŒØ:^£.ëoÚ˜aøÄ E7Ç-l=a1/Á\½: ޶! 2Ä '¯S×i¿r%*¬Êkê ¯;-»R:ð*7Wèêa5€x ÓN%ò ê)4¥©É?{¶`Ke®4Õ¯Æ2¸ëϺYz~Á˜Éȱ` ¢Ë× ¢“d+÷ \v¶˜7MÏå8ÖwT!ð›YûF]¦ÄqhVÉN}ðWÙ¿Ò=5 +ðÓ‡åXrÚ x¾]ÊǸ〉F Z¨ -¾é¨úláê_ë/psaêñÙ?“ÆbÔN7œüØFFF*± ‘I‰Öè¡ìÂlñÖТ~ :™–’ƒ:ä2QìË? rЈ1Œ»Æ­Z«ÀÎæu¦€u%¢%•ç‡!Jõ8^Ú±äQÖNäˆ2_XÏ “þ¸'Gd4ÙC_e¦hKÅ9ò2\ZQI‚'>BÅGøÌ‚Ý ÉýL…ûÓPk`}HPÁþ9ixßä>Í+r>3¡PAðOÍ_u@ÔwÕǵ‚c^q›EJƒ“ßJÒ'½ËxøHžfb ÒǯAoüLNãÚ–E á툶a\C„°»%šÂjXp s…—m Rœ`Öâ/%l¿–×˶‡Ø^¼LDâÿfb”EÒóÚjò£ƒ#AîÜâ·‘lqò0cæ(ª'%b9.<שN–K7"ª8¡ŽˆH«6E.Ì»^£­òˆá>¶Y¹Z“{WXÜŸ1;Øÿè€Wv›q´Û•zR«Ksõ¼:Ìü [¹b1(–ݧ¶ –©SUºÿÀ$Bì¥ÝžÀ‚Êoóß½ùú¥2ñ–y–Ô1ß)cRE´òâCï¬Ç(â³öüó¼? C! y5‡\â†<*ª4ƒÀ+ÖB¢ôK¨ Y&š Ïešt d0Y `jÀ,z³Ñ˜¶Mœ®¸sMBÃÖ$DÞg꣦Kš‘dS@…kú¡± ¾™¼‡–]¿Ý:ÆAqN]à¬in¤/öæ¹d¯ÀüËrÃéD}Jnyê®™Õˆ.„87z“ djβa˜“=LÑûÃÉcVV Èâ'ç18j&í~¡]o>ÑÂM0]CGÎÝ…O·HAÍôí¢á``ŠXw_”ϾhÈè‹Tm™Í;\£s#’ð0^O áwÑöwÉÉß—]fu%ÊËâ¦zÙÉfHØÎ¨Ù5ã»-˜^³Å÷,DyÇ}ìt DýQFõTòþ\åiÑNzQ]§ö»®Å¢ªÙpD”¶þ¦Vƒþ™eAeþk"GAU1•·Û{ù0 X:q^×HøðQÒ Èæ¹ÒË’ÏÛ †…îX|SšˆÑu6ˆ÷5“ƒÀ¨ëËËR#§- ú~<-ÛQ¾⠶ƒÞHàô8õ·³Áe»çBÌvÀò³Mo9 ¯kåOÐU9T;2¼Æ–¥l…¦¬ð ñ ¼l¢¢±|Š(£®¤üŸ±†ë„y>t͇ÆÏá {a<=ɵ…7ÞQúÈغd~ÆùÆþ=G]{|‹Žñ«~°ÑI1¹ó]Y,Ë c£ÏÈâÐ\ñÌK•×^?†ëÙýZó&Ö¸çâM(ÿÂØUòðtþ:ϸ#ÌNƒ?i¦Q€scÚh*¹Çñtébžú@W#§wqv^ }—2õö3±RH|“-¡–èÈ`F¸bö‰Š¿Ü)sݱ߂a vkÀäbw+̾JP ÇdÒ=ƒ×—€wóƒX+ =´ØÍÒ¢•1^,Ã-!Âá©›Zu{°•¸ŽŠqÔ’ïðlSÑ8w‰1Úc¾òXìrl¡ŠýR¸¯%&¢r“ëEBß§G«µ$M:Óp­óŸ42uÍh)x$ ¤_‘‚­ D™il—Ô0 >ïǤL(Qêvo®§”FÃIO{;-ˆ±ø@ý~,%÷È“7@ÛN~ò$°5£[Ÿw(míZé¡t³òb9§MàŒÚê9ã¶Ç7cfü'¹êø¢ ÷šWVòB–f¹ »¦SË*rGº çô_¡\4A4›6”rãÊóH»r\ 4ufw~Mþ!K?ã&âIúÛßLa(â¿hwàßWcËÞðrTÝZâÙd¤B"–’4PBua°µ¸côãók;.öÊ .¾äâžÚÆ®ë¥9µŽðæè¥È{õñˆ' 4aÌ@ŒsϬ‹ì:ó¯jÖi8}‡c‹÷éEñ?ðÕRþ5ã{=ü,ÑÖmõ633Îæ0F1ÇìÜp|ºFmØ÷S–ÀmÊmÉ6IPo¯V$ý£¤;1êöˆ’Dû˜!Ñv²ûW ½Ì'ã’6t´Á*É'9Zmÿ@jSÄŸ’øG2ðߦ{èÔÎHZV¨ÄSøòÄ4D »Ãdß#Mܧ1/ft€ßWªœ6A8ör›bÍðå:¨Îü¨ÊP˜;Q—ö—ÁV9ó+;v4º|-5^gň0½é°<)¯­Wc­aæ&Læsîµ)#€ÃP\,È2ª/mV±˜„»ò©Ry?6vuüpåçCQâ ;þUE™²ú6±¥*¡,O€5áâY£šœÿ™ ,=“~P4¿MÞ{¡õiEq½bøSØtV§ÿçØã,ÉeƵ5ïèG6Ý•£Ê§ÝP5´oƒ´hà{+®7ÉâV+pà‰ ÙGžë¡Á窛‰+»»;oM~±è ¯¡åd9ê㼡øE@ÎFÀá sˆå¢MeÊTÒg†´Æ²gH•dÞ§Èó¦÷MGŸªÚ6‚?Öø²Ñkš“´¢•~·QŠ! Ò@,´eSÝLMƺÉEJ”¬õR":H™H²ˆÑ’;IÇ…1_»g‹l™ø ³~©/U2Á BÚ{Ü]βõ(Lº–ÆISE`¾ŽxõéǰÝãrpå$tò†äú£ŠÀ}]@ ç šq±y,:VÁ…cÊûUžð³@y UÚÇ·fŒWå†Ñ’`‡]ùrîºâsÆ=]&.Õ4§šŽsã2ÑŠ6s¿i?טu'zºÓR Xl6Ì„¡XÐSþ½/󷉜R¯™L^wšô-— ܸûïì²­¥5¾ÓÅ•'gÖÇj1ŒAÓsÞŒØì_øOßwœNç(ì§çqå¸^%Ñ´RüÃ:óÖÞÙò›î Oáõº3Sgd…_´X6V·sŒÌv‰)«¥Ì[:l9àn1/éѹ¦*ÍÆ¬ÐYÚÉ”ŸÖNIïÜðG%Å †ã²ÞR-Æ_aCŽ"´½*o%ÈñHWô¤c nd‰KòwZoìZ™óôÙØÁEŸÚÑöæ\&üötÇŽÃ7ÑP0~|ܧêO§å‰B$ƒn€fv™tXÐvƒYw©®µŠdĽ/êX”U®NH\OØØx†§ÃUã­4çb¤+ö>$fD˜Ç$ž}ßlÇ®A";lÀiêâ<Ë&õö^åëÏ¬Ø ?£^˜ƒhT”6w8Ÿ¹wá¶:6P^Tb˜®¬¢ÓnÄ/d¤ZhL¸çœ›.“›æô·XP‚.KÜÕŠ××â 6]©×6ˉ`DXT~ŠòúÐÖaùl‘ž‚›ºÓ÷Éþ|€6çBÂâyʳâ 'á:éøü>Àá\\¼Úó!oL³Ëä,cHÅ¡hêK„ªŸÿ̰§ÅK$¼+AéyrÕêŠváñN/ê­–.1AG>[|'•œ½©9§ ïØèL‡šûD´}ÅÊX[ÊÞwyM3$™géà%=öÞâÞ˜¯ia…(?2}]—Ú‡íÑ«<¢øgZêÔ d Ñá'YCPÇ–íL¿Qø|™öADœ8mý•&¥…|Ížm ]j“Xµ“àDt(®#W¤Ô*e-¥Ê¬O"¥]-F¥ÂzŒÝ>ÂS‚Í툱¦oßєIJq_Àªˆ|²»l{}¿F&æÔÔ´F)faæøÞ$$ãÖG‚ýÑ–ZXk¢ ï D—Q±SUT ž,™™HæF%° l:à⎿…„É9?bø ¤"û{®À©HU±¨¤ŒQŠw:JÑYA(â×dNB#ÂjÖÊ2 •ר¡Ùtdd®ÔjÈ.ïžÝ®f“I›w–(O×`ݯÆ,~¸ÂUKŠ¿ç.ÂŽÀí™B Ã{h¹ iªˆÒj^l}RÒ¾6˜rþÒ:ÖÉKKZ)g²>,›ð.)«£œìR‹3n‡'H(-ª ÉZœ†«†¸HŽ5k÷£ÞõYéI\qjïGb‚ý;‰.ÞÎâ‚b|ïÜÃÙY_mù¢> Gû–M¸¾mÒtÐ1ì±æ$osP}nÓ!I ^Ò8ödÀc¤Â®¾0ÅA¹¢ð¯¸*%/€P*Ó–X~@ER=e«¥^}ôg¹&ðC))Zzó”¥ÙO‰ròÜ)—‹u`L êh×(w“Xä•ê(ÒÉò|ày'itÃÍ?`öõœžK«tÙò)ºÊ«¥êt×{ Ÿ!ÂÅI€.g`•Ÿ[SPµ2¢»PoŸæ×Û›·á8„ˆ÷û"ѽ¢Ýä‹ùPpBs"ïžî·fqu²§,½yn$-Ì%8EÅMÐ ©"~¼%š0Lõµ¡‘„»«^þAžß9‘"¬Â–å/L4–»÷¶Ä‡RÔ£à/P»%ü¦Pg‰(ßAúsСç“ße+…TÜùHª–ñ¥ýXÛåÝ9Ð;ö_‡pÝ"ÞY_üf: U+ôó™f}²=ÑÏ·ù òàÐ4áçÈ=ÂLìØÙrÉô{iH„{ÈÜ‚VÛl–xy§6¬°oáb™1T@H±²ßiãçåÇ--åð8"ï‡?Ú¥qÒ»&TŸ§&l{ú´}P—½ö5ƒÀ)k l=z*£³­ŒÞ@õM'ä•BR°¿Lp q2rÝ ;6Û„–Uö)¨êñŒÎ@Ü.Q!›ó…—7>! =QÔ‚ûæ(s"*[ŒJ 6­3 ¡k,µ£O‘™ôi•mñ±–Y¸ Ì”"ǹø8ã„¿÷IóìˆäŒñs¹‘záìôu2ÛÆ;þú©ÀÎ’W^8Œ^2¥-ì" ¾æ,‰FÓ–¨ÏÇG·kßh&òH{ëŸ_YÓØ¹­ÛZÞ‘ˆñã õuVKŽ”ãX¬^³Ìz4ˆ‹­àÇå†UAÊåx´½F^59Lò§Íë«It4a‘}¾ßcº‚C&º?ÇÕ1 BãßïlŠ SWX^Û3-ûÕ7À³§& öùÝ<ZM.ÃѬ&DЍ!ì(zÚȹ ­!1ï "9©C Õ´ÿ¹•€ÑîB_Eس=¥õNØiª ^9§ðV÷óy¿FY×v¦!¶Z(9¾]u¡'ÎrÚ®N)&+onüÀW·ïž­°^ðd¸¦_E·Ñ¼¹<ÌÃeîæ!>¯‹’ÏmêÏ©ªöÃSûEO) ’”5ð2žèêE­ýcÎG\éÌ’ªf)vNVT ØËáç/=ÒqAJ]b£ÔÛ¿¢h[gõ ­Mw'/·Ih`„íóôLì…{åÌ « DüÖ‹‹~¬`{,ŽÔq€õA´¸DÓÒµ÷yè[¨OË~§¬À*`®ñ eˆY.Ôµ|5š}¶þë]•¯3ߵܜ¾Ü)÷m–˜ÚF¤§Z» ¾ûó„ZÕÂ33K¹ƒ¨¸¼Æ“¿Eà#EûÒóV'ÔG’zNC/í÷éè¤ÚÊ4q³(å¤äÃÍû­)\6«7–[;xÓÑÆ#/t«Z É]â>‘õHÞˆ¥˜bë9œ*ö~ÎHÂROF ëØ7ü ærS]ˆ[œˆz>Ð(ÌtÖ™²o_e×ójHPIÛö\‡ƒo÷¿Ïô «E1o”ˆ!¼®;ÔX÷÷#³q$åfQýz­œ¯[ÎÞ¥:i±(¯áÁîà˜’´á‡,l#O•i Ðè>ò=vfQonLªÙ3ç{m«Gîv™ùœ o8 v~ ¹.4-§é§6EoE^®ôM‘o4­ëä ¥³DâVI[Ê("#f-x<–±I/·-‚b1fsï¢l¦Æ?ŸÛv"Ù tÀ/Í&­0ia}j"@/a:»C·ñ!Z &{ >÷(WÚ˜DÂðx{D ñm¹#Aùò³ÚRѨ@Dî¡êxµäšÉÞ¦9? 騕ÌÄú3ì‹:Á·e¦2ãè—èš{ t‘¹âÎ-Á0L•K›…óŸ÷¤Á@\Ù.µÜtŽìψÈüNFCïñ®LÇŒx^‡ê„¦ÑD0ã¦-4|MÓ·mEW¼~2ŸÂöB~˜ ˜ÀfÕ’ ¹»N>üÆ(¨ÛÄ10DZM+hAhÐÀöòiOÀ}1´IêH#vh¤¡OCTíÙ>B/îRª†yõ#±ôO„©h Ñü•Àð@ýM'éÕ¤‰†Ôy]’6ûÁ¾ ¸ïGINe®|Áž6/ñ«hL®™¸E„'nòrƒ†“ìÍbÉOi8o5k_6gÙúi÷ˆGôÙR¾™Ävb+ßkÉ_¬‘ä ÔúÖbŒqPERZE?1É$À¡.‡™L£Ç35ÊáÞ¼9%»AA!Ëë)ŽýÀÔ„Ñ £ª­‡åÙz©ç@x¤ï8Äsr…ÕÌŽŒéé¦QKsÈJq¬‡ã±„ gœÒˆ lƒ¹où³¡¸ÍØ™mü|J¤üh‘R¤Öç1kõHÍ47R÷,þs·üû/ë“ÎÐdë#]îÀ­ô=ÖÑ´»ƒ©Dû ìôXßÂïÉgà]ùG’¹#I(¬'!R8¾à>0ƒár½FŽLË0´ËêÍ,í+°/Güj>–«l¤È~îéqõì¼+;ëÀv…%SÂ`…G8ÐHÔ0[*šñ^ ŽgEIAà3†KaLDHí°T¬ ÿÉð²¤Ä3k{VËN² B¶tk©–0mÎZ‘ÌhÑZ*èÖ›ëÀê¤Y4)ø)¥½§¨‘æþ¤1è¤hyZ²a •*~éñ±e}ÕŽ§_EÉE‚AÍdMz]œcÌ|$¼ç~‰¢ý•^ôóNŽá©øeö®h‘m²Oæâw«YmÑçÏô¤êCŒÌ}J&"íû r…ã¡mmB®ÅNœAt(<#lñwJ¯úñþ‚9—=¬…Š¥¾¯»¹19¬qÙ˦à½¯Í 4ÃÓCŸåž;:™Õ÷¹d„c.Šà­hÓ¡. 5uoW°ü£¶Ä Ë#²ý%üÌZiT;K¬ôÚ ÌÔù,Mø7^Ÿ®àSVÚØ ~Ò³¨u£ìk㯥¯lŠ@ì4˜5ÿLöNµH%µØ“ô¤¸ýaVF¿ñ–Ô]é!¡¹?“Èw-ô&Þ¤¾óSµAŶ½ú&Ùü팯DMêÜ]}%³ÂFXÚ;œ3^W°h’GfD“ú”‚÷x¸`uRœ ÑD3,I>›iàZ”Q¬\ôèÎå­ý¾ƒ2ux¤šØÑND¡5`9%Mzq™Þ7­a8ÇgEšœþXhf!73ž›Z±ÂèÊaŸþ5b #˜ïê /Xè¶.À×zè_,dg°|5WªÉÆsþµÒç݆$S¾—dØê!ßÐŒ°=5ßE ÁìHÊN”7ork<Â\ŒØ̵ÈeÞ_B²²ßu ȹ(kô.Ð~oÑJ´ªE| jP†A2·¾‚î %ŒÜÚt?³ÂgÞÔUv÷ÅéZ­—“÷Ö¶£¾á…ê.³SÜv¤Ví£ö?T àõAãE^˜â‘2‘©úš©ºà²ó1ðYѾw¸¦°¾éØXÆÄuÐFkí¢ï|óuÏwY~ÇT2Áë®HqÀ̱”\‘Å!õ˜ç62‡ë:²Ú wO±·•ï~ñ¢­Þ%èo6¹ÕM¿sŠuµ”Ò·Š®ò À¨c p=Tåã­l×(ëÒãl2˜Ÿë¹äñü Y„î‹|B•ȱó`gå‡þªFÜ®„IŠMÕ“µ‚n?;ИRh*ø5ã ysín¶ø@” §nÊ›±Ê¤NÝW lì©Yx?w‚:fI°m*ÂIyC²÷€ÀÎâØ9ÁTí ý_æ3{øn?eàéhà†C·í'6­ÕKнáI\ÉÇšúèŠ)&F`€rWŠÉŒ?g¯õ¨6¾@Ûw[9ÂÎ2æŠñR®ÑðÓÙÉnyDp}<Lp.ɲÜ( ªíÇ8®ô+Y"˜¶žW~ýí€\ø7; ШáhhROç)èìWK×läß,UžÓ&kbX­wëØãjàµm݆Êá”"µå° wwL¸°H#jÛêâH7´²§ñï³'=ôgK¸E„rº‘*ýZ¯Î[´ßÖ‹††rVY<6z½¿Ü¶ 0Ø(›ù„¹ß6¿-:¥$a e_ˉ§ö"Ë^&Ê Ú…g;´Ý'ÒEÆ”~¿qÅÛ1šo”!@±4¥ß£¦å.û´ÙŠ!4ov\e1Ó9Äô’?}v °ŠïÞäøÃÑ Go_»ÍszË” +¡¤,µ)ˆ…‚ ‚Ðñ–\¼°…?…÷Õ ²«båTçÎý¼2õ¨‡çg1e!Tʨ‡ãïýdƒ?ï¬Ãwh# 7ç®U '~e “‡ãZZçCS \¾ÍL!Ö$y)gŒõü /¹]íŽÀ7;"E:HÊ‘ùÅ0:îü¨³[ä>íþóCÑF˜÷χw݇ûÜ\_÷Ž\ßztDiuÛµ¶€&êɱ$ˆË3FÆi€åîjC›á^áµ'Õ’Y:Eÿ$ó¤ür¡÷Ï`H{Ízzy©¹¼ôšUc»‘êö‡Åûâcl–Rbz&ÌÐÍe…6iëùbÅп¾³k^Œ=ewcû‘û} «ævÕšÚs¦½*3nA9N/ü´bÒ?tUHOd¤Õ‰( @œø3T€._ödn„ÀêÃ|  L(‚$ƒª5Ÿ“ã&×RAJ~m’LC€EP´(»TeIð>tq{g‚{¼}"8¸&¬H’çêƒxö¯û_X‚P~I±‡ŠБ4Þ¤ßNr‡o9™‡¹bŒÔBÓ…¡5᫲! çõ™If­{ytÊ"‡¯z̰f°˜!Yó;jÚ›8¬ÏBxÎÄ'.kd[/Ýã*ÛjºHA%¦leIà›ŸèCÛ`ò¡NRÍtqlºÝyXéG@ÂûÉ; s3ÒžÍdëíß>$êPÙÐÅ梆,ÇÕÛXǼžSÏ«Ò:†ü1Œ+Þx«bônc¶×)­ß+VG¹çµMð}Ojg“Ï Yýàƒ&§¸|Øëãx,W’ø^1r#öq“dWÑDS%©ÿø©üÚ_°ƒÛÍÜÙfã¿/&þ‰óS[š¬Îl•9<ÑöL˜õã{HZ¯ýÉ.ü§‰_™nX”Í“n®ÄÏ u<ߦ .ׄHàT s¹Z§ÄÊò”ŠÂõª“.ˆ­Àƾ!¢ø'ßmN…7RÌQ)wÎûÆ!@ ’ȯqà,Ã<ø½úvt‘OÕe4ÂA¦L2—ô­¾¿ûbȽÉŒËvÊÔŠ˜½jÉLÊ=$·°×è8½Ëëüí3*«ßq™a“n@e7­h3<š¯‘`Iú KaVlŽ&å§Ê–¦¹e”.ä}¾š›Ø´¾“ŠI¹Œþb¿ùv§c’ÅñO’ód(Š}³ír  ÌF³Ö òM{–%~Ú>sî@›˜Y  ÖŒþÆ„Á6œÍ«áû¤8¶*ŽíwLÅ.¸uÞÂdUE¢oY“õÀÅÛ kÒ$õ3·z8ʺ7%ŸµMÇx÷±8½u a¹ÿêœ<Óçý@Ôk¶e׬ۛòw ‡øRx4àª4Ñp‰œ|ÄŒØí§Ì7îÐJQ“h·ŸscÓiüÊàEBèdU/Á–’ŸoÄç(h"ÿ"+,r©j|Ô8hˆ®S)æ”! ¸e[i>§†>Ôü[ýÀáû‘¼Q œ^ý‹ˆÁ=Læ^ä e>¿_]”C~ƒ-ü¤s‚k¥Â‰K"®q+òàÍN2þábVb¼¦ÑÏ×ÏI(šÞ¼û´é¾÷L¤Eø…Y¼ÈCü- ­Æ…§Ð]ùu²£^mb9ƒl¬ž>éЖ{»}ÖÑT8„8ˆCmÚXÖ ¦=ûÂ1²‹,ü½øI¾Ëf£x¶ œ§ó`µ¾Ègã/B“§„½HB?]Bù½À’¿kÊ?ú‰Hù´ˆÿ"0_eû¹}—x¢&ÆGúÍAXÀMrD÷4sN}´d2Ê“«ÉQ$ÓiZhQV©!yjñ¬‰:øv¾è“|ûÈHlЬˆ}QV¹)×Úѫ˂%G¢CŽ ŠL™_Ài1GÝt¶Š/M[ˆ`v¼pT¯[õS_•®_Ž#Nÿ„ÿÝJ8åæõ*bâM­DÀ„òe.DdzÃ1Xª°Dçt>*fá=–EQ X­,™ÎGÜW$ÙÅ–W5…ßç Lß#ïÉG¹‹<R‰È%„n)>äiÜf4ãäÿ`Ýl‘š^©úÕ§7{”ÊIHªåj:^øÙÿÅÍ/‘+’Ñ:ݰ!6d ÚÏv?W3`œªü2Ï0ñVZ¿ mïÚjfê]²á¸)•RÖÀX˧aËjÕÐLÌxêÑ{}SU«)—+m´n•Ôª `›lɦF ˜)ýùýÉ\/ú‹×ÁAÀǽ7=}B¢ö“k–…ØâýÊ]…â%ަfÈé”u¹9Hãáñ]~åÉ_¡6 ›¡³óÛë‚(!ÖöLõðés»Þ¯,—o'(Ÿ°£Ñ­¥áb‹G7‰ÈFÅWãÃHrÉlö²+‚»~ó7¦8?5 °}ý ‹I*"Jy~ ö7Ù=Ûœ{õdŃòhl!¨ãu[k©äA¾ž:]«4ÌîçÔv]­¯±6D^âvij²è<•cþ@jIšÀïqÛ"÷ì %`½Éˆ®“-FÏLò’«ÍÄlíÅSÉÚ ÆÐ#…D>Óôšx1 >ì…^êU˜d ;#óðûÃ§Ç ±a°f}´@;íÃBôÑC–~cuKŽËJúµÆé—VLÑJk(]è7 ÇbZ+³Ó i­,¯ùFD?ÁÖb¢åb¨³÷ËÓ3‰ejÝÉß—£ ^¶í9—T˜ÿ.‚BÕ¡‹Öt0º§fb¡§íˆö>9yäƒC¹5š Ù×më×n$Ï/êø>b'0ÉÊ_,öâNä‚ù5ÊíHÅŸ÷ÝÐÚȦƗp&ßFÌ®î2Ò¸Ö$$”íP)Ûþkl¾ äú†öØ êØdÎæ­©ÛìÂÈ×?¦C£5¸Òú½N36òåúÞd–ý¡féÒ€²w¿ŸÓôÌÆ)¿Zÿoñ.ŽôJ9Qwóf9˜5®çlöî£W„v*Œ?5Ìlú4¹ÈU§×~˜}{&Eç¡€™×&ý ¶ <·VÁœ˰y`2†ÖsOCº >»G.ò“6‰¬Ò^ê*ôÂy~ÀÅ33Ô?ïÎf·íÊAÇR÷Á‚‹½B…ÌÔõéŠÃ×…iG8‹Å~]q@ŠÇîíÚ>Ûp*˜\¤ª`‚”MésQ— ‰ !M#í^ÎP‡9àõ—­)0òÙ^‡Hd‰|1PGݱᶿEÒE@ðsâr´½’i’Æ|ÿè’½YL(É‹?ÆÚ-ÚA¦²‰Sç“p\$Z!(ó6˳oH+Dq2$ Â/€•Ù~|`¬,ž§Qo k+÷´Pê+þÉemøñ¬T±Ñ²Šg»$‡×ßÅ p^ ¬ z«ÒÆâÜíDÞ!÷©ãgS<5§+]&>[a”N3i¯¢ìó¨îv‹ [€‘sÕf÷¹Çx$w3äxü ÑHýàMDº/Ü®4{ôíó”kÉ_ ðt\daN°×ô1¦OÜ ýòøM•…ø{ÜÿZJ–×½½³’·ÿ5Àu¬Ò¼·?ߘ¥D?ÿÂj¥/yìZ«i–´S_IžUÝVå—ZSÅ~l E^ fu»@Fʪ:C¢W8‹›2Dû·I6PBÙÊöÌäÇ—`’tY[ø‰«\ðç-3Ÿ{Æ!$…*DbwËg‚$-Æ‚o€wŒ®;AA•eInn˜á·g5ì¬åFÛºyÌ–°œDգǨ’ ¡Ë`þƒÛñ×þßfíkÆ1F[)<2µšÒÀ˜„®—ÁóÇãSû…Ïœ¶´ 4Ç5Þjþv¥þ؆WÁ.²W°§T±%WÆx:<‡P€àÛû'›~—{ˆ¶ðf^æLŒíiü›úȾoµƒÑ_ÔöÐá@"­Ãq|ËI«KwJo»`ÃÔ‘X®6"Ûên«îvíÏ©ùº·† .Ó²±„ýE¶m ul¢—!Öxƒ7÷â½6 X’|Z ôdÚü¦ÒYEúYVN¨ ¼†4â—º|®§{0û¾9¯©eΓ¡Ë7‚Ù^âÍU¾àc?iH6da–W©žH1° SÈö°*‚Cp©ÈóádqœdÝÈɯºÍŸp ÖÆ&.È ñ”ÆNörDO[áY+òz‚o`¨ Ç>â§ èìJJz6¤â{>'Ôê*NM†¡–¦ßÁøB€÷¨V±î²è&hXø×OO„aÆ98D+ší™?xnÃÍk€CbÊJÇ®'Éîí52Œè'u:nƒ—ÃÞÈ©ÿ¶.M*½9רÑùMgÛ ÷iÇÙîFØö¸Ã©²'<³c%Æ;¨£=3ÛàUã€Ó¬žô¸3ÙŽ¥ v® Ç½¬ü[LRÈÑtýè{³õ꺲硾ß)1›™­ˆøRø€:×ÍÛ\ ýz¥G– «ÞCrÅý\´}"/‰;1«Ïs›Çãx¨pu±«S‘Îâkgi/šK&EayWo¸¦º‰eã¼Ð6ø<ø‰m¯ÛÒ8uO3|çö Ñ-¤7¾œôÎd¨ |Ò7g-öHëÜ|5î«ØNPŸ_ae«”ðÜ ecRs¤xv¾ f.²L‘œ2ìWÆÃWÞzRxŽX¬ÄàÂg¯Aä{6æÕ‰û_,Ú’·”ïôÞ¼dé—¶÷¾ðÅ-p"^‡DÙïÔÉa—ean9rxPɈ3ôšÓ/.¹8éÅÛA½¹|‚} rYœé Ô Aà j»½øÂ÷ße'ª^… ì/=5šCkÛ¯™K‹>xdƒ¦¨ªFvWAC€lv/á£N—xï‡Í!pˆLÏ#ã­‰7nŸu„Ô!D-æãzifÿxe‰p…|0¢ÒeV[=qT‹®ÝBãp^ÿWNÂ:¹73ÌÞ:”ØI·o‚-[§ŸgV9šê[zLвATIý¡W‡Ö(®ôá°Ï¿UL~ðâímC\MWíÃp;Dz¹Ñv7{KMN.àåýÐT„_ï§è[ë«™›däR¿y6"›p…®±€ Ñw%ôCáiE³ÚŽ÷ÈZÀnŽx‡·ýÜr™o¦3qC¯œ=QŸ[ÕŸ‹-z æ2XVŽ….üH 5%§ã‚z+£cd@(˜Ö°€\9dÍr'¥c›#v$!û[2Gôß¡¯Ùjêqd©óyCÖ1.›±SÅ,Œˆ20.g‚ nùÓÚÃÁ°(+JfÊtÒîNÕtM™õ#Ÿßvι˜€Ûb€Ðeo“Êg g|¼A;d›(UÞ†,8†v0¿ûº Ð\Ï\0òÚ¦5Tè~P]¸0 e (|nCëÍô>âÈ ! ÑýÔ9FæŠwY[ W×`g+®¬•ØÕüF×¼—‹‰Tµ›†PʸâÀª:†Åz˜8JÒi~Þþ®¸˜”é"ã šŒ3[“[ Á¾ÀîB¯®IãzêW·Ë2‡ÛFÙ©­ã›AógÞ)wÛC`*/µ¦¡M'(Äåí þÓmz¦[ÿ> EjÎÁ¯Êï/ˆhØ¡Zm{”ô²øçžæ§]ÔˆZûð‚Éꫦ“¿3TœÖÊJAEcD)Ö  ¨]9=áý„rμ‰X{räêå–a*Õãu"?¡sebP©‡Ϥ±”Ëšï©OpLÊ7ž¯•ðzÉêFmñ«V°ºÇ5.Y”0dÏ€CµÑKú\Û­/]±^ÞÓàŽå@¸(ñß%$aHó‹xÒ!<¦Ü:bp'z¬:ùf €qMžxmg¥"NÆ%Å©ó­W&·d NÁq+ amÞîFÐ¥Ðg<Z‹·g¢iý¸K4‹Æ±6ÛC“Õ#OM “í°ŸÆ©Òú9BDÍÖ29xª²1S•žáçC˜°ÜŒQh5Úð¼tâ´›¤Öìw,#HÇOâbQzÿ—ñÍiOá} gaëq²8¹øÂ±T}¿}Ûä8%ç…K爲%¡z ò¹´ÔãPE¦žù˜8ªA„fá%Ë6ßóм»qÿ1ÔxÚ9ºÍî"Êë!cO»ÄuñàÜLóüÿÊù§š2R!µPäxêlDÇÆÌ‚Qbãçž|‹ûŽÞ«êÎrÔ}u;Áo»ç°¥ðÓ±U­òJlÉËF(tzÿÂf¾1¢‘ÁzøpƒpˆgÐÑ‚´+Mœ8»®½ïûÚ'˜ûÕ=¦ÅÌÜÈëR A¾™“T@kêzïrö2UCeâ³ Nݘ °®´|•í”´ ›t«ýxZˆÜ³Kš;Ãfh!­›N?ÔSL)íÓÞY1Ì\ë&î÷¥’ô„Q69ÄæÊ¿ÿ;‚t HØJ]®Ú1p†×D„}žxü„ä—O[ à÷lX{,ó™V4nÆrÃiY :‡ºõâÃÆÎëøø¶ü-è%ÇVȈrsAð=:T¨aUm‹½¨4£n„󴾃ÿ¿QìÄ–È™3ýí,+ô„.”©›Ë–¬?ÿ@óö©›2PD3Õã5ÃøkÚÂÍqP™·äA¼-ëÅß²\Ðb¤ŸWE®`Í‚ ˆJ³´ãº¶,Ä™Ìã±,'·¹ó‹µxÚ.’:l¨˜2O;Iࢨ ŽuˆóoªçäBºkŽjÁ6}?¡œè©Lo¢žÑ?Ý{górojŒøÚ…#’•[:`h‰°¾Ì+#Ðt—µ!5öØOz±‚)RiˆÁã¾ÍÍoû kÇ5£ô,åžj†e‹*ü¶ñPm&,ÛM(Z/3"ÉhÞ8*¼~õt¾ÜcœEЬl3Î*iˆ½Ê×+çø¨]•gQÊæá‡Ô’Øôû‹%kUªèï s–…wZ!Ì:+«DÚª(‘ŸÿÓ“+4gîBO8„NA-Jø!LU`´P«Öwa5ûÖæpj j÷V¹B‚Ö]î˜@Àþ‹y~lœ­A<ÄíAT<õðaAQoÕ¼y7j¿_âÙ©'z3ïΞt‰¶‹ÒÉ"° c@#S€s[. ˆTo˜5ÝV a~8‚_á}aâÍÝæ\Ûåd-áìüK;‚ 0•/ëN©$ÎrCS†B—z{wB^ ÛlFšÃÀÞØÿâ!A Á¾Á2$^G µ~â3× ÙÖ©®¶ÍÈZðJ×bYÓü37¦” Û¤ƒe§w¶Mç!IÎ9öÚ:0ö¾MllI_ÿà1ع‘Ÿcø±ô :FE…}iñ¿¨¹ÿÕäs÷Оçyr­$ÐyP¾ÂÁÒ´í}OŸ8îW¦Ü!0,]·¢ÆkŒ" LJcé¯dhüæ)°Ë¡aÿ_®ªK¯õ“¹M’$6±± ÷ÛEÇ÷ýÆZ¼âJíO³ñûJ-%ÜlX_ͣΠ£Âþé# ËÇ—Ñ.´A-”!Ü~GîÑ»ÓeW"F‘¢¬4ÏYh÷óåJùï<÷%ÇYVÝe-à&_ŒhFowÍJ™‡¦ŸQuÒêì¯!«¹ 7Îpäï7 ɤÉ2™\Kø9¹“±ˆ"g2Ò'÷†zJñgW™¥ð„¼ÄYz¢©Eœ× ÖT’´‡é“Y­Ä¯Ó4j^§‰:4Ùce>#FÔeu¦F®ÉƒßïN¶ JšÝÀÉé‰2…KÎ$}µàãÐÜfcæ7¨`5,ó6š`ø¦-wXÛ]N|1oNBdߨlÉõ¼‘ŽRQÄ6¶Cuæ±B ÅR¥¹sá•8ÆG—˹NÍÝŽ”l'¨|éaàÝ•ýóÀ–.ædÑñ räɘ‚ ±ÃcWÍ“°ÆÁ/ðºå3ѧ9Æ ¥¨o^ÉpKíµþ¯MÑô.è?Ò1¬ĉ„OPóÖ–(|…n|ÄØgLEÃëÏË\´çèl }“Äbmõ¦<½&Q¬†ƨ{áD,_c%¶çö“ T¸6 ͵ے»ÿ›®Ôø¦F0q)Ø_i Þø8]ü‹±Âìþº¢òw—v®æŸ:˜hA Gйöòöš>Æ+fÿRJzþŬŒ4ÏŠbÉv¼ŽqOïˆ]Hm;×)Èwér!±B§«t¢éÿE4Ú,Í޳> stream xÚ·T›ë.Œ»»wkñRÜÝ‚K°â®ÅŠ»»»oqw(PZ(Ž7[Îî>çÿ׺we­$ÏÈóÎÌ;3_BG­ªÁ&fáh’vt€°q±s $”45œœ<윜Ühttš`ˆèo16ÈÅìè ø/ •I!P;%G€¼›€‹ÀõZ‹O“ÀÍÉ)ðCGA€$ÐlPbÈ;:€\Ñè$¼\ÀVÖè1ÿù `4gp ð±þé³¹€Í% Äd=ÑhÐp4ƒ ^ÿEÁ(l 8 rpxxx°í]Ù]¬Þ0±<Àk€:Èäâ²ü‘0@hú+3v4:€¦5Øõ/¹†£%Äè@v`sƒ+ÔÃÍÁä€ÐS¨8þ2VüË€ðwm\ì\ÿÐýíýØáOg ¹¹£½ÐÁ ì`°Û*ÒŠìO+è`ñ‡!ÐÎÕêt‚í€fPƒ?#¤ÅÔ@h‚§çjîv‚¸²»‚íþH‘ãh•¥,$ííAW´?â“»€Ì¡e÷âøëfm=¼ÿ–` Ë?’°psâÐr;»ä$ÿ6ŠÐ~ˬ@À+NNN~.Èò4·æøƒ^ÓË ô§òO14_o'G'€%4 /Øý@óvºƒ7¯÷¿ÿи¸`sÀ dv@û̓,ÿÂÐËw{ 8¡½ÇàüãõÏ7#h{Y8:Øyý6ÿó~9Ä´•5”YþÊø¸¸£'À›í5€›‡ðŠ—ðZ€àûß$ÿ¤ÿŸÔÿ”ªÁ‡Æù›OÎÁÒ ðWÐÒý' ÷¿›‚ñïaü÷ ÊŽÐN7¾!ç+Nsè×ÿsûÿéòÿ×õ°üßÿ’v³³ûSÍø§þÿ£Úƒí¼þ6€6²:JŽÐÑpø_SÐ_ƒ¬²»Ùÿ¯V„‡˜ƒ•Ý?e»Jƒ=Aª`ˆ¹õŸíòŸK€²Û@ªŽ®à?6 €‹“ótÐi3·…nWèUý©A‡é¿O”r0w´øcê¸_½]\€^hœÐæâ~õ àÍO çŸ} à`wp„@]Ðì|–Ž.h\èëW±?D¡×ÐÆúø¿?€CòÄÇ àþ¸2¿€Cî7‚r*þFPå?”Eõ7‚úiüF¼Íß§ÖoåÔþ @ãþFÐÌ~#‡ù?ˆÊ ]Tö¿­ÿ¨9‡Å¿ 4п 7€Ãò_¡Õ¿ ”Îú794Dk/'kè ým•ÿ¡‘Úþ BCµû„ÆjÿrA#ût‘p8þ> j }ÎüK Ôé·êëÝõv KÈo)×ßÒ¿fò1´šNÐItü]¨ÈÙÍú/¿¥ÿíÏÅ­ƒË¿ 4i×à+¨“+Èlîhçø;^h%\퀮Öÿrƒžù›º)8 Ö. §õqû„VÏý_zŽÇoÈ ­€ç¿ ”ÎëOø_ãcîæ-äÏý­ÿà?Ÿ` 'ÈmeÑÑ\(Ħ!¤ë¶NŒÜƒmoRdŽnO'‰Í{Å¥Ûí 9™©6+hÓåZ,y¤g}GŠñêí*Õ“÷·ö&äðŽj>& ê3{hËÓDŸ¦Š¾‰5Q ¾`Ó|»ïóäì£h ßÛ#O—çìÆ¥Z€ë1(ãÙ8T±6¶¸§¶_ûZý±b–í½VŒa`é<]¾Yö „…ïÌ{þêz/wê•| šï÷÷<ÅÞú[ܱw ï¾Tir»ö’Ò’ê“PÀ_áÏÐ{‹¦È/y—•ÄlŠ,åp2±Ã,;ôœ‰[_sSs³É,±ø—˜ÍÀð5”oé킟-`\á®Ò¾Ò9¾j=ãQn{˜˜FP­78ÕbMÒûVÄIˆ¨ØÐs}P?Ê¢"Ög!Ü®šmå|rD 6̱Þô,gylÖm§_ÏeòwlHÇC{¨þ”ûi [\"öƒ} ¿/ÔÑd0Ti‘n´ò½ü­k*¼õÀÚRªPÏ]ËãÖ)À¼L)ÓŸI Àl_œÓ7›PÀËBêH[G¥Õ,ež$Å\ýh/ƒ–pE8ŠlÁ^Õ©U8'0u{½Zü2ÍhŸŸ3UטZÚYDTyD3|M5ËË/¥-Œù&]Y(‹¬e9g}ïºÛ@`Œüu1M‘­Iô\-ŒúÌœñBÚŒÕÐ ƈ[¬gÙœ¶’õ÷yEZU¸´µ‚Ù¯N¬WYU¬=Ž4Ó| ÌH'RE!Âõú°¿æŽJÍ;VL˜ñ¿w¡5•îÝEÙ(å¨Ï¾w¹¾<é ýrÛoðAPüê~OÎÖ/Ud>¡ é8`*"¸µ 6heŒàv8k¸‡z÷8¥¡¯^­·IƒÁDqÒkWwÔŠ¹›ú¥¸´×½¦»4{‡g?½ÎzñÔÁ¬y¤‚ÁìÑÇê{›Ëj´àõŸ˜ ›šYlÖ6mió½‰(‚‹ ÇãfæCsžäw~ÓV”¶$œþÆ…ú)F“eMô1<•„ºÑwëÚ„Ñß§ÑÐ’ɽ÷¨¾}b»„}ó¶ÓipGÔ²ì>åXÒÐÕqÆ{êUS~•|Òí’¼u£Èìe9µ‰-4÷òý$¾f3¶I„-Ø6øA°JŠFf['ÉS±<ú‰X²¼,ñ."Õœ£¾m9}Í«V^B¤üâqÒ 1î¬àžžž4Zþ&H{ˆ§Ì>ýWq_ÐY¶ˆŽSIËŽÝb\ŸÃR8U^ÙK¾O‚£j$}o›UýfÙ¾»½«—ü¡mHîªQž(ôì)„,_S5…YÃà— {ŽÖá%:þg,1r…w~'‡ÙB/+£—™3%à AÁ>2\#V̲¡{²¬Êš„÷ü|ô])y5Æåû—õeœÏB"9vBu»yJ3roGÍ4h¨öŸ6ã:/+ä’G U|zÜØ·g”qÜ.Ȳ<ÌL¿Ït¼zÓPt»b!/ŠQ7xÆyry¡_r6Bát‹`0 ¹ø²…O‰8âvHeL·\rnJÁp…Æ©éŸ çJúÚF$ŸônÜ#ju¤»¸g5¥slˆ/Œôv8íé#ÒÔÚwü¡»UAïû‚rì«ÜŽpQ;Ù¦®t¦óÔþ8•Ë¢{]Ö¨FÊ´±ÍTLÕ ¸n0øyyÄH—+ùDüÁÓ›,íÅç*ËR#6j>J’C¶Þ- 8Œy勇R 2w ,¨»¼1Ï£„جyNK´o=éŸ|( –ñÊúñâÆÈó•‰medN÷WHÔ¨îOÃföùº½;ì÷ɾ±À…ua#ÊÀ$Ë;tÛ…½È'½Ü2<4ë^­›zÍqÆQFŽÈYÍÁÕ)yíÐ|¸×¾¶>þr"üJO"NöщÆ?ªxý傌¼ù1 ªtö5¥^Žã{_”±´’Iü‡¹¯¥ÈcLß➬¤†oñÌÕ-R­`:.îrYM¤q2 }ðÝv ª¶ ®çÕäØÌ i]kS¶Ô¼(Çù06Á~äþí¼ÝH8;ãZnÊ_£[›-M"ÊZó³§4Zò í· ¢"ü©ÃÓd~õS¥²%dNnžýÌÀ »÷uÆ…¶5Š÷‚•ÕØèŠTŒ«ó4Šó¿(ƒD¢nr4\lp’¢?yà ÚÿòÎ…]Ù$vTÕûj“… Ç¿² (¯šîLLù$Ó¬Úúe-ؘ×@)Åð¤-p·öª:"áÀËìuPQüçébODë…4ôi€@Ë;«aöôáþsŽŽm^ibªÝŒ¢¨‚¢âµM¬$1¾B ßxF’¥Ÿþ6n\zO- ÀÛFwûæ&Ø@3äöÄÖ4X&%>E‰`4PíÓÎP]ÅœØTãœO’sÛ<BÉ“à+ªŸCÝÒ°Í®çïoñŒÏý‡/7ÒÇÉeB©ÇÄÓ£°œŒ?àÃâ ?¦}R—Ìó)xAïÔð÷%d$UĉäÌû°[äKÏgɽ_îGÃ)Õë\hŸ¾o‘ÔE†%KÏ¥ÈøÉPƒ¸¦ú~õ.r£UFɈSAŒüÚmñǤ×Ý»aóÃð­åeÝ`ý ‡Ê:N>”$½ß-PËË9ùŠ\Ç€:忚5-“Ç…XIÌIÝÍvrýî-(˦pÀUÕñH Úiíø ?X¡¿âÓÎ$% @ûºì¤¸ô^Y¢ß« \Xä~ š__»… º¬õøçq\+¶lI.ÿÈ0u†mu¨Ð¢ž‡×Èq‚½©FÊmãHc^l³OŒõEäU`6Þr-¬ðTT÷½ûðØPNÿúT‚f¹ý5Òæ×ó]¿Ñ‡ù|?P7‘–VJ ¶ñ ¹'ÿ.XµE°ûë=ê:‡u­6û4 v»UU{.«Kù˜^â—‹(û÷ø9´ëç©öA[Vµ†ë~rJ¤‹W! ¥ÙÔâFÆõ²?[‹\ß’Ê" H‹`Žôv'z‡(<­Å™ÒÖS0Z6—+>¢øà vø9êí¦åùŠ8 ©Êªð¡!£ãj7 ÃtëvÈÒj‹¾<?}Ѹ´®ýÔ^å·Ü¤žŽ·¯#Ápše…%®ÚU7Šc IEL»½Ü»ßz:õy¦NFÁEÌ#…c³ŽrþÚ¸Û¥;S¶ý¹¹$†©sôÖß§L¡Wõ‡WŒ#ç< žMçëdvröIÆì)žqêý]96ÂÅ¡÷yªµ~ø¤Ià‰rgz;Û.T•X*Jõ¯&p\~UR‡[ÀçZM|ðdõ a½Y#:)È–uê¦lÍÐ¥”¤¹›Ã2Ê …}²£¥ÇÄÛZrïf×{㈗Wo¦õ G¢á>ÂÍ·*ò¾|ö;2†´x¦mÈZÉA žÝfpØÿr’{¢BòŽGý;j¥U 55áýìΈµäóO˜Ú¦Œ„,@Ð!ªÍø~&x‡»ýÚ[Ä1ï ¢Â4},çSûfg’(¬†“ËH{eˆÛ¼ì¶(+¶Ñ4#/ìƒÄ )yõpK—¿Ún´+•-eé0²àýIýEÓù}®"C;€…=«uç'ñfª»4$¾6<œ8+ã»JrØíÒæwÄQi$L›ŒxVËíÖ\D.üä.|¾¤¬ŠïS 6ü(Cf[4ŽÎެªWýifŽRE¨¬³[\=ëSu¹cÕ‘öqÝÀ™Æó¾ð`PšpH’+Æíg„ …úˆ;¬ƒ•P‚wû•måùéô®ßr¤Ã˜q(rd/ÿÛÎ ½ëÖ…6Æe²ϳ•dFÈg*z]½s¶Îj>æJòsΞ˜Æ¥N!=BV@®WƒF–vì¨[‡úï÷‹ÆåÌb­ˆâ\=¶4ßÓW–—è·=1I†ÊV“†A*@-㯠Ú0ýú_Ý,µˆf‘-×ä5M}F|øÚ×¼i±KúÂ…©%Ù®é:?yØÓ¤˜R4B­Zg†‡;9ƒÑ®lç&EÔþŒO Ê’›tÊÁŒ{Ê‹õlUIÂ$áùúÉ•-IĶL#Éþš~ED*޽ôá‚^¬«>…SœÏWÕuE¦‹[#ÒÁVj&£rhÛ„ˆΪµ­•&ŒiVË2ä ôöƒ¶wýGÕ&°ŽèK¦¼¥ïx‹ØÞó¡pÙþ°ÀvMŽ÷(3ôÄÔÏMä‡oÂ<ò2LÏPo#/Øœý~6e3þvž2`-3ôb}¿¿¹‰¡¬ölâeôy?¡Õ{>(܈ï§`g3³§-~úóôÃ;­&]. ü]g‘¶gkz>·‹J™Kí²C1“ù>žA¥Ç»í¯~ýÆ¡™}8Îð88záÏÃóKɾ³$g·ÖÍÑ»÷œ!#Eæ+³ußâ’ß`‡À´\&8¾ŽèfÚôVOªÒ5x¹!1(Çcü ºHŒàP€ÏíÐÒÅe)úF ³h~˜@…ˆ£j`ø°ܱ+¦Û$ó!¤$aÈ:TSÙ¶³’µ¢Ï‰¢'È¿7ñâ1ÆíG4Ÿ¸õõ!Bˆ±ºQß Ão q¹'¾ÍßðÆ•š­ªÃÆÄÈ (èãÈúÎÇ"ŠEnÚ<ÏÂׯI1˜6ÁQëWÈX Ú‹‰j•˼xŤQƒ«»Bå®Õ Îú:Œ*>[ÓcïÕ9hÂµÈ yúy’w3o—Êé‘ò GÁMsûn}ê=^õø€aì\×»±‰v/*ÂèÌŠœž¬²×©ødPÈ™º!Ûu[Ú‘3Êù—Ÿý>«—„§ÄÌcRÀ¹›FU>º›Î„Ûc£ EèæY·•=¥¾q!ªï ‘si\*K|ߢ5ß_¾¥ÃˆÄ'¸¢¥ê/aÕÌWB⎚’Pùò¨ÊI¾ý¬Ç÷Õ­00Ù$.ËÛ3 3y•ö»àKýsðG®Ñð »,t/Ìcµ‡œü:Å©ózÒiY‡D¦uÔ©²Ñ»akÉÉÌ^ߟX™r·JS—(Ÿ“uΘ±YØô«¾m²ZlTxYæ—Ù»ÏgAPŸ…(ÈMWq›–I’¢td«ðêN¶ôà¿ø3¨*›vh¸‰[ѲfÿXHžS¼žß½h¹÷À¶oä´'×FÁ™ßCM± LGÐTq€¾^R¢Ñ Þyqèܵ'kÉ9jï* J1˜“a’·oï kº#*¶„k?›ÑAж¸^ý˜ø£ æ0æÔÆÒa\ky-=f@"'³XiåˆY?Üï†9w_[_Ú\Uu~!E«¬jl²dqwè^ßv]Jƒ­™ #axîñ)ëÆ*ñ˜ äòáûL§›ûÕrhDUH¬SýžÆ¢÷ëk5d9`÷ÍlvÖûWáÙ଻¾Tü…t&ü–æôqºé!=S!Ô¸Ô¨šWÔá ŽŠ©Ê ”‰×ÖªÖ»’g«-ê é$lCjÚÉ4Îö£C:EQÏKöŠ4ø¨¢¨+RYG§ˆÐC*ݧ”‰_4ÀwLGhÄ‘û‰ý¯©ú_Æ’Zxt éÐéÙE~ô#"äh zS£_&š—îóV~™ç={â;*Êçuk…†ŸfMªÑZ€±e Ñ/¡Á`&%:T“ WpEr³—oÍðÁy½Þ u‰Z”Öµ²šü¸Iï>:,k"WYÂÔøù‹¢:ÉWæØzòVDµ~«ÝZ· mÖéDš :“ørŠxÅÉ"^÷õöâþ•r÷€NýÏWÔˆh{ ã§›zoo£" ¼ýÇÝ7;X‘£'•™õˆ>Œ±8ƒnQN9Œ™v(£š¢(Éí½6¹ÈD."ÂŽ›ñc1Óký¼ÁÍïY‡UQ†°pî 2ÖæÝîÌIÜi—ˆSHÂfãÈMÒ5[—ôzhu ^TR„´)º"ªW$¼å§}iQ¥Ã“‚ /ÌÀ>Ü”Jòöe¸Á>²W »sÝÉý1ÔU‘…¥˜ÜXÑ;“™Xàû2š)!gKsšØTc”šNZ\+ǵ@‹|÷c{öljñµ^ó·9Þ‚=4b÷­$îS·Fª¾ÈgÌôȶž£B—ù¶¯×Ãf± ÞyJžÁ£Jü´RÓM^èŸc¥òÅT¥>¯xÓ|þ²ýFa–óGÚîCNMJz—U|ƒ€þµ0§û®xBë%¥Ž‚Hªÿ®Z‚PGxªW[˜­Z dfì³PèL^ØK3h<5¾Do‡Ÿçsçzlþ5£&ÒBÕ‹‡{tå2‡°°7€¡ „uQdœk» êöge ÈÙ5W‚¢nçž<>uÍÀ‹ê×(ÛIhù‡5Ý/c>&,Æ% Ùôš#‹”VÜtqÀŒJ¾ü¶êL«á´@ŽJ®Ù‹|F Àà`wV“š@§Ü‡ý³ºdìxÀtBM’Xlªbš‚aÑ¡ä5²JÙ“ÌìíWɉÄK*µÎ~WaeÉ×iV‚µÊÉe¾qüqÝn| ((»zmºßÌŸ©óS0¨Î!w=¸«nÝt4ªnhNˆüâ»$òuø1ZW±{•öE.ÖïÔ’Ó ½[â°¶ÇdŠŸ]²’7“>WŽïKŽÙM× Ø1³–iâ\œ›ÝŸÕ¦{Š[.Ž“Ü.ÐJ§|ÎǽQ‰íWI[ÓöÉÌ)/MKÙ¾oü @q½L‚Ê+&tJÁN/£Ÿ}BœÅ³öI{bF±D¨Yç¨/=;+|¼\)°åÒ`u0?Û2¿°N–—êG…%Ô GüJ«ôîeÙ"b *Ï¢âœU•žLXç˜ ‘Ê„ÄUä[ºøy,i‚µ¤‘%M‰MùÍÀ"áOEW#õ¥Îçˆò·-µ²‡6ç–ßTÒ›98p™_ ã©5º÷Ux*Ma×TDøù2‰yñWì´ž!¨1ø¿qo¦¶ÍK}\nC*!‰_!ûõ»ŽV,èPŽùžÂoÀµÃ!hc­ƒ¬#Döõ¨l׳~«3’¢ìslën´ÞíjJ°Ž «Äã»LPÌš¨Ë _&7zèv¥••Ç ^ÌHüp)€Œ:9„ëõ>£g^Ê•é²Î•À1ä¥oÖlìê|¤ã´¼é@;)ñ•ìS?ÙÏÑßõÀóÓË¥E¦¢n>¯’ý"ËGXQë ª¤ßÒQ>‰ºÞ.ì…ø1« 2rïÙí”e) \_SfY3 >ÇT]^nd2º%Yr,¿lò'cef,ë5K.ÓëçÊÜ‘ò“ñÝÇlþ£|ÒÙØÁ|Æç±ËÇëÛLdkŽg³tÈîšãzÕ§Þý©àÛ »Ÿõlt凣ò%¥œ(0ëgX¡þªâká=CÏ»ù§¨²š@ž=Æ*&²ª fßPÎçEﻌ7¥VÌQ¨óþAÞ†¾¢²ž¥"¾Ã…£(,ã¬ì1“sU“×H^û^wËËI¤šÛI÷¬xnÙ3|OšÎ=õçd+.¸…óÖ×q*°‘ÀÄ ×$ÆœÕî¯T ËÐ5,7mª8#ŒÅÕŒ @òEp™úʬ­žjž|ÒO ø”r:IS.°/Ž¢Äªº„¿­ôRa5¥Í5`p4`"ix Mçý#΃wªl7ß`I‰úêBgX绚®×±D[ìªÅZ˜á¦'}ƒ>íòJb ¬_]½ç¹ƒÈ~X-õñz1Ñ7§Ð¼!'}ÎÛ<Ä{uÉÚ‘¡ÅþS’ÇÇVÈÝ›çAoÛÚôÐä­ÌË(‰é_Úi¨ÝÑÛÊ…VwÞRi ¢Ì‡ß+É•ãÃl¶ö¤R4Xu¨¾£\Ã'"ÒÈm Y“΂O­ízïko¤7z}íï4ÇIáít=¸ZâÞìâ$´+€/ | ~nuƒÈýSª·3“޵.Ó<¾RxW­—OXàì0Æ:‘ƒ³Ë-Rbä44E~e`}éë`õ«Ñ‹Â´×¶<~§¸kJQÑ ±¼¨´;â3Æ¢×_嬀ßSè@Ó~Öj·†$­(Lgäqg²½«ŠINÖæÌVäÿæ|Ê(s&ñý2‚u3˜Þßíä†uB¡~¹^¸;B¨>8Ù†)x'yÕ· û"3ˆûÓ%›ZT”ÞL»iOYNøUù+ŒÞivŸŠ_šQÓ¹iq<,Ø-'çì\©:þG">»ÐkLe7-I8oÕÍä0åê‡Ñ!3ÁÑ÷`ôÀ‚ÌÉæ>˜nÑÓ2*(,E&×Ýkƒ–8!4Ìan×í¹®Miàóö|‚áLc©Ñ6¡M (ò\}crI‘ᥑ^ôÍAµ±¾y±uaàæmŽÚ>ò…"¸z¯r\~{9¤þÄâP¦ÓmF÷’ù´ ÙüXõÀŠ/4=ºÏÛµgŠƒGþ{½‹¢Ae*OÝ ÿbâÄ£©çûá¾þj£TøÕ~­¥,'F+bœw’ŠûZõ/”h§iÍTy¢^šJ‚‚Újî§ l–ùýV ‘£Ñ{ïd?’ÕÉðNpûâµ8¦bp}¨ýÏBë(¸|pØŽ;Wg£¹_#•!@Ú[lºÈ~ÛéÜä£]öØìZÍ4Œ¦»¼t“ôWßÏo>™4L6†d°º/§Æ¢¢+S¿åNŽ™pèe|ÿUnkBi¿›¡tF ø9¦Ìj8c¢ ¨EÓSÔŠÏ1¤Ù’‘}i˘rqNwß‚ £ýUºÏjá5æ¿­ÊÚêcUQ•X½<§Ž ¹3&÷ÉzDWE%0$N¨.wœ¸×ß³XjÉ€Ëô!n;Rñj%ú±“P¢’ûjU×û' Ž»§¢wIø†=…0êcºç?Ö»G™²\°é}–Ö?Ñé’ßDbgЃ§C“"lETzù­oÈfØg%¯ËŽðôj>õ”Õb‡ðb¶8;uƒïí`U¤÷Oîô^tdø÷:'¨¦a‹3™B*Wä N(|]üOÍó§k†‘H±Çïa#Ks¦v¨/YµX:™å‡œÊ¿EÚ“ð3”¿bzB 1~ÜŒrͺ,ÔšP ™(2ï=•“[ÿZ6y¼\œØú€*¼ùúñÜ#׌¡É ^\5Ïwȼàþµ‡èéf–âkT)uŽ÷(ÎÏŠ1 òµ| û³C~rI³Á&%®O}»€ÏA ‰<&ÚåȘÙÇùæÇãõÂõrÄ?ÛÚáb¿;w;wU+“à3c„v:3kc:?j\xʻε›¶¨m·Á6PoŽ«I´ÌÌÊQ÷WÕ¦³7ÂîiA/+ß{©;Þ;é’ý|~ŸŽ¤Ìd«AÊH&Eí­Îâ*“6ùM¤ …Ñù \°îr#¡Á:ã©ô¹3®GðÔvõµ¸åÅÃSÕÕàøW¡ ÅõŠaÎ/ö,qº?F¨©wét#Ìa…VÞ#ÒßTÚ`åá”bc'„ÊåF§žlà!p/Ϋ˜õ0¾ˆ%Séã€C-¾nfhôö‰dµ-•"–åήó±Ì‘Mᡞ†™l—TX³jô¯ŽXÑ[}ú«¸*\ÂÚ;>eìãTÆ—˜>5Ëîœ{¿ZYö\øY4ß°;:xÝ}³•Å‹7·z“ßú3Äéšäöp³â¸ e¨â%qgMDLd¾Øf|-Zì#‘ÁÎ]œ3 ¬¦šašÄcÈùÁ%_Æ2Ùý²ÇÄ@t¢©Ô{)'Ü8áñJkÃÀ-¾h/w]#u;oÃ$qÞï#q°ý½å3¬!Ú†Âþê“O {9übÿÀ:"01K k»V67ûÆ$e<'&Qš=jëÌë>Æc!ê «ºª.ö~ã Úև V¸ 6îöBZòwÍÖOöMÕ= …'@Ù.#Tüzý·g¢”kžU 3Ns‚6Ù/R…Q‘D‘tÄÜ„ëxì¼Ô¿Ò»ªØ4[µ7_Ø«P—ê.àV({:±q†´“çl|’Ü.?ÑLmP¹š/¥Ü¶Ú«ÓeJŽÛHH°zÛ¢M¦Ù¿åPãµæ€¡‰æ’Z*÷ÈÃÔÈ=„%”6'}›#aϘÀŸO‚z™îiP;ý-…ë#È9bp[²NÙ³†§`rURñ€ þ˜CšR8i‹|È©H§Í*7# ‘âp)z¸QÿF ewÌsi¬äNI(.¾@È=ƒ1YªïlçlžûÞ`®¦xµºmùCV¤C‚óâ^릖Þ¨M­®ûçsle³ÙB¥|t0G¾ˆiöãð«;¬í,Ä%7g\&?RZÎZŸt7 ç"{AÖS’ÑcaÒ±p«¸}·Ž±°’Hš–ÕgBí-_º}~¥(噟ðx?éÌ&¼¯‚P½’7xäû³÷BÑx]]üŸÄç>êËÿ(I‘¿î‡;;nÆ­ÝÌÌ‚þàÑf3!hOÜù¦z±ŸÖmlqGS~¥4ØÜ4 b2ŒU ÜF¬ ]_$ɲáýVw4‹Vù?įУr>런6Gµšwõ0£"¼e˜¡_˜ÊJ¨³Ù医xÊì}‘³…ÉŠÙå–ö]tª€ $XžWþùW›É[ÔèÙ<5ú¹ ;2rŸð•5¥Éaÿ|”ÝŸ±BâØ"nØ!ê„u©/v ,Öš,è½ïñÍçc²çøO¥n”aùxM㎮„Ô|‹hÝÓ¥5¿Æ“³“…÷óhÂÕÆã4ÑFP'š_b¸,¥µ™ë}UÁÛxçRÓP¨k³œŸTRÇenâX"þhrÿSì£Âºz¶îÐûÛ,> Æ ¬¤ÚîÔ¬@vÒ1ÑKqÛ +Ôá,rÙ3äµüt¸æú!ã=eÔµpqÑM„詸ƆuÖè™û»O»m½¢GŠÃÔâÏêG;¢IxÞœLý¹½‹&ÞúŽß68¼dMI+ëU-ŒV¨ [„6éÀ \Û-A3QG*-Š+õØoßÅš¾©¯áB“x—³ÿü Ds%ÜáTŽ3öÅ#Þc+F¹žÿCAú·€‡†7.ªŒñå|lÃÚèæÇ8õj€pre?üÇÎtÁöûsaŸtB$lÝŽÖU+œ‚žú¡4%WÞuÎâǸ{ô$†vûºâF †wpª:P¯ÍE•¡€Ä&pz«_8¡[ŽñR£Z“–èÝEŠ®ôåu»-'_S¹Aì»ÛŸ3 Èü¯ˆH¤L^ðp@°²QPz¥%ò"Ö6ƒ1/õŽô³:Q06ÆGœgfYeߺïõ ªÑõ3‘ŸÃ£j–Î4‰ú|óñÐV‚Ãr'Ö—IˆB BùiôkŒåYŒîEJS Öœ÷S®]ÙÄ΂? +×¶¬wqÁ³'¼Ù "ízµ+8ÌâT„›_Æé† QŸ¾ò@”qµ©~?4Æ õ–&xáôPøµn½‘g]pN™´£Q€;r—Y?×ʈn%㙃àõYOþ¨#z™u&õ›ˆÏäÓºô“2;¾-yùÝÀ+Ï~ª% ¤­·!¥â©çoj{D!µj<øBˆïDøñ¨¶î€ê­¥GAŽM+…cM‘v>\?>~W°éU✠ånçúÑí®‘±ÛÒRö¦“ÂñåÌõÒNcÝ=Srî<ßçCv«Ù‰ï‡äŠ}ž+3æUFdt´#Ž6å$‡p‚µáp{ð¼—d®ûÇKD¥±m )”× Øú²»¡fJSÆî 7S,»8Ñö°\…Öû¡\éÕ/>¬;jjÒÇôßvA’@ø éƒó Ñ™¹)ÄŒCÔýVYpñê~ž!äV¸lû…†óŽ=]œ'g"/ŠŽn…îÌŒÂÊÁŽH÷+é9…m¢w‚dãFiØ=þ^;t¿ªŒpîË”~¡…5×EQð‚”:ör¬¿±¨Þ1}Wñh?é®\+XðX¸ñÓüY"/fð¹åËÇ“÷ò–ž9ÍDj’÷ásaÛ\Ç+eÏ=~!±)é°%ùªþ™²±IÕ¼õg ÄfAeF7Bm奬Ð)œ!Ã;2YÊ„¾öܶPûšœê&Ü¢ Hâ Iu&óG<¡…£ô7Ÿ”£Ì‰.f•îÁvzËäÜgùå{¤¤I”ó¼+fÔýe´#%‰ˆx¹-ó£i[¬¥ÞG›G{TcÆ‚QUñÕ›ô°3Ü;?\¯¾ŸvµÖªx¾¼¯$†'£gq)éàÚOe¸¦0±ïæÇªRoÞŒñ¢©Lí1ÞÑ5 OQ€¯Œ´M‹IeÚS‘Æ¨Û ;Ÿ2ÄÑX«¼¢ÛÏr‚—à{oÚÍŸ‹ 8êsp~‘àR%[¾Ø î|N8lôNyí•n‰UØKU”hô/eÕêO úÈ©i9š¤*óâJŒCF¼¯CxòúŒëњآÛËÑ£.Ÿ¾óF¿h1·ÓÌ~I2ÙÂÿ &p{Û8³Ô?ªjÏØ*ÚÔP6ò¨™×Ô‡ ×õ<é oåˆ}ªÆÊ4ëæÒöD¦;Œ˜ýÇVoO@ ߈hŠ´%äST6®`¡¿Šâ°Á/þø|©>¦àbz‹øyJSðpŒb+âhf+âàÎptéØ5˜ßV¬ÊÆÅ}zW—n=—ÂA!.ÑXó‚×)ò×2[ “á~ÖcÜ•¸3!ÀH~iÏøÍuî ª;§jûJÕ@¤É »´ã(Ãûq~kvrYáÀD˜ Œú‚Ï éN¶éeú Üa­®~s¿ûÇƃ²?N½ò+¶P¸ç×S|¤…9vÕ_oŽ‘ƒõ¬7Ô y—~l˜‚íÌðZ(|¢0ŠÖ « …íw›DðÖÐÊv’ÛÅÓ„ñ ð==^\úÈ(¶ãRáqÂ2äù,8S~iS0£ž_¾è“‚+(½KÞj]ÜFÙ|€@ýiÁð=ÝKÿ[‚*Öm¶/Ù /êZNà¦æÕjùÒ~­§CoÐáÈ:"´ŠëÞ…¹£†šÈFÞ½þå£Aˆ\þ™\ͯ{ãXÖFþ©Ò huŠ/…óãÜäcŸ¯®c†±¥Fpø V&ár‰ÁjsKaj ÿ3ÀŠ„8ìÀ¡Åí¼›EËš¶¥–oXïèõ(Æum'€»ÇT6t§g®ê‰}€JtÝt!!81be/¤PÒVœëd—.×&´ò¿ÆîVý89¯”ìaæ²c"¤†!¨|®ƒK§?À²+å8!VË_§ÈK¿;©0ó•lô”²õ®Ã,®:iBøZÉ3ÍÓÃ*Æö|‘/]ï,@ŒÒð!†¹¥°/„9ˆjPµ0\Ñ<}-#yÌMì½ —wÀ7&K:å &MC½ÌU“~wܼ éoìk·AÅE4Q¿dHp~3ÑìkywÙç÷!§X9×7]>b.*_[x­ÖMPŠî 9­7Ãi·F#}à÷Ëû;ÆÈÜ’õx…ÄþWIòglx°åFV<Æ[<€s  úuˆsÐ2ÁLÐŒJ£0 «‹¹#_e²SË!—šMº2,; µ•ë„J ÜœlJÕ1læJëïìiEÊ…KøHc~=ÆlŽž>ÅÂÀ!MDú²~ÜG¸=¤Ó–ƒû1{9ô Œ·œÿ–( Pi‘%îNÞ1Å5ž±5þÜ™Y®¼$í¼”||Û$P\º÷ú@¼X2ƒeÇ0 ¡¾GU6ÒQP/ªñ>‹CoQ g•˪7u5!ïOÊ“A’NSÄ$(û6$DgHÂIû—-×­X'!êP’íÄæ]˜–¾yçZü–kµQ_^Y5¼ñÊ›¹÷äçÇ»Ñê]\ãŽÂ1B¼Ý¶Ú/ªK}p|#ËèHäœgH‡Rzbð¦K£>”:f:^ÕrÁ aßù©j¼jµ¾F'méÎM@ðüI+ÂÓCôB™øáð ú÷­éë‡ìbï RXzÎñ9-B©AE~à{uZ“£³Õ~Y,V‹lEâ ùíÓ‹~~Jê—)›nZ–——Õ.ŠŽÚ^ºYÁÉÑD;ËIê¬*…2mïž§=Dh¢[ŒÜ7ݦ.qßWÅë¸aeþPÈ”TÜƒÜøÕQ.ÍŒöŽÛˆ¹­T` ìøe~ÔŠˆ·ié2Q䊟Z›+c¸—ñÅ>m*ZÊ™‰ûÄ« P›ÉÙÐ wë&HÄeÁ‹}ßh6q}’Ã:ãMCÛqž»7›‘~²¨ŠåŽÓl /Ó\Ow‡µÈÂë&‘yVŽ,ý6zÖƒl²åWïÀä³p@ô‚‡¤?Œ-ÄcÐt u†èQQÿH&@ImEÄq[Hü!nO×8"T}šzÙìÊæ°7]„»‘}³Ö®£†Ô²Äu8å-oçsšu©1Mg¬LÿÕCÆ‚™³‰Ë ¸¡2É3Œ(PU6]`ü<;ºø‘ŠòSME:¯ûàÍëÜUßIÛañb¹iå.l\¤ëìæ>C?3¢ÑVê«O›­Ô»Wï¼O¶Ç.5û¦{ª‡9k‰ªwm?²™éàœ“ßÝk‰NŽXj(òÎr}²{ZL˽õ¾žEdÇ öž|œb&/”.ÖõèN1"¢ Dytý÷I$æp†*¤X[4í’ ¦e ›—/}¦ß5·£ŽØNoåâ+ Ra>µQRyÝ¿ F/ˆz€°Paå8Ë­fàˆ¨Õ ³’|*WÒ‹~·uÚŽô£òÓ˜Ù©]UKe±#×kH ùüÁÅ謺ӨÐNÅ=çùÌ~7U9ºÞ9^Á¿ÐOçG•ÌÑ‚“Èp~Íw“às'¨ uâ¯ÂE÷Ìÿ?Îñ² endstream endobj 531 0 obj << /Length1 957 /Length2 6163 /Length3 0 /Length 6847 /Filter /FlateDecode >> stream xÚuTuX”ý¶¤;”Ž—îîé’î`!˜a(¥QPi¤E)¤» éî)éæòÝs¾sï9÷¹Ïüóîµ×oï½ÖÞÏ0ÓëèsËÛ»Ù‚•Ý žÜü<|€Ø„Ûìë ãçøø!>~lffˆ§ øß’àsä qƒ*‚<sú O@„~1 !q a!@€Oàožìñ¹£›+èÛ9Â:ªíÁ°Çœ¢›Â õÔG¸»»@Àöz`¸f†K3ý{GÀÎ ê†y‚íƒ'Ȼà .µyœPCÁ0Ð_I[_@ǤdñlŽžžî¼¼î ð#Æwà‚=yÙ±ùù{ˆ'` ~ bóþe‚¯;x„Áÿˆµ@ž0ˆ`Î÷—ß_¿}Y>ê²wƒºøþ]ä x5ž›hi›pþo+ÿÅPPp{,ÇÍ/*pó‹ b‚€˜¨è3„B<`5E@ˆO@HD@ô¨òÏÿWE5¨ƒÀ/ð)ö÷¿å<:ÜÀöÏ5²ÿÞBÛÍbØþSÿó…2ÂÅ忲=Jþ–¦~‰pÁþä qñý?ôÿ¤ƒ!/=¶ÿ§Šš'Èb'}éò/͸2Äl¯ñ´s@.pðß–=ž”  ÖqƒCþºËGƒùøþ#gà±s†‚áp@øŸ)°+ðHûg‚Û=# öwlþ ðO µÿ• vnöèK@@XÁ` _l¾Ç^ñǾ>ØçqR^¨›çãÀáéÿxÜ0ì¿vÅÿxK¼à¿0ì«k‡€Áÿ÷N›þ;@}ƒ}ÀvØ3“nv’aNåa—¥òTÞÜ¿ø3 …h ý©†AÉC;×á×m†Û6UÒz‘c>/~ÚûñÔpý)ÑæORçƒÃ¸ª¿|Åíšl!4²íE´U´äc>Ë‹úqýI"ժ͢gxu£{vÐ.ا·—ÉÅή‡ ¦·|Üì=#Móþ¡EÌ=WÎÎΊ§Ûñg3Øsí}—–=9×KϾçßGXyKšóMá‘óúã kðÓT°O²^Ú¯…ttvµŸ2£æ—‘j·ËuÂæÒÅ6È`‹(V&Bn68Çæ^O#V … wL q)&; âc­ÿŒµ•ЃClæGØ7y4Òmüüpü„—~cB±¸g“uÌœ*!K3h [c9«Ú ß{£v*{Ú)‘Šã”BN\ýé|f‰ ýS¦‰Æ„dzÜliv9€æIöÔDqÌúAf‡gêØÔMÌ¢<-/t%䥬ÉöŠpc ]é,ò¤M2y¾E¢ÜI^”}PW_í‘M¬Dc~%Ïâ í^¯£.I ïõ*ðwû‚ AaxÉ+˜ª®5VÙ½¼g¡Ùb¾:¡\°ÿ’`„箈yED•$·Ü’~x®G~â˶խ h÷sŽwßGÍD«hôbtF€*µV ôå¹ùkíÌ…Á X/î̃3•v³ WÍ0)©(mW(Hp›ÑwÞa[ ²ËyoÓl§ÕÀÎ"œ >¶F‹’/ ô#'&?w°ñ¡ùi lœaغFƔˋßîit/ùÒ¡¢çL¤±'üœþȸéGôqçë[-%Ž`U[ŸyoÑlpßRP¡Fè;ïîë¡€~R;Ô-ÂqRº(žuÍz_¦Í•ï ñSÕ*yªÞýrÞÊà~®"‘²o7½âUø©/ÒïÄ/¯žƒY¾}Ê o×– ½G¶Â|™ö)¯Ìã̯ª@4L{ó…™x·„=××ö}I.âéhSõÊ:q¬Iä¼É¥¸óz~ȉwÿîì1sIAm[O¢÷¿ä¼¡<ýÞпø_TUîœÀŸ«h’ÁÇ3q#Há<\bçUämdjCë {¿)IR«94‚oÕ?9"½‡¿iV ¹ÊaÅȇi¿Ø–R–Ò¥¢e8<½aÆJìQÊÑ˜Þ '”'t¶®%¬nu”„iîDï7aû{¬£×²U¾oØ.ñMÏ!áCQâ#êjLô(—Öy-ÃÓuþ™j™óþšóÇpBÊÕûLlëð6X‰^‚_­e[ zã­šßÝr©¢qôgàBR7ª`2å¶ÃE~ýyäà Íîû²ÙÄ\¯¿©Áû·Ï\ß'ëÐlÆoå0%ôpÅF>Ô‡5kßžJÑmì—WA{§nÜ'y>ËèR? M‚0¿OMÝŸ®IçÌpdGÜÍ2òê:ÜPõ£z°@£ã#uÝãÖêÇiÏð¯õ#Ð,\%4¤JûˆùðÝÚP¡Ä@Žõ³œ«Ù˜ñUÒ RЍÂàÆLôʯM-ê%1¶ÓÛÞJŒ ¶z3f)pN¶é)‘úÂ?˜ÐÕ¾™ûz³eG0‘mo`ìw`ñ¹ëuK ßMbgÄ (ÿ”ëZ"8»á«Úô«¼_„Z¡¡Ì1TÎÞ×ÔŸÚõ(‡3;³t:AD5ãïÌ‘ÝÁÙí¥™ßƒšZàõKlNVÄ–)ë¶HÈ|á†@×ï`½íbœ8K%› ïè9 ϔ̅¬‹Ýº>ˆú-ÿñݰ’KATfvï`Œ.ÏkqmEËÔËWš!îB“ô¾¬8ñãs¢´–òŽÍ>«À×£8i&Ì5ËöûÈòÄ>99Ò>xÙf ³rÀÒÃ[‹ñ9A˜ÐCU;H$t[ÿöi¦E[Äz¤¼Jx®µñ»êœâ'$™8{‡¾/·©6ŽeÜ‘qòh.•èhÄñ¯2ù‰–Tå¯:]xCä–Jìß7æ¸äG,‹k‹FBÉ…×MzÍŸ>Þ¥ÄÎq“ÇðÞx”˜_²<ÇóÀ65#ˆºùõ«{Ì¡\çSlQ´~Ùö”ò—e_îN_Ós.ðÂUXâA…ÖÎÔÊï¡Nó„•½Ml'›î…5zFúõŒÉΘìGAftÂÅÖœÏøe…ƒž2å§ ÛN­_ºµPÞÕ²':L+»|“ˆO& «c(°Áw\x\WÉ´edCÂŇ _˜v\bG®sP{¨ °u±kõ™yÿ¨ÖxºžVÓ.­Ä%`æA뉒޶€Lwq·Îß R”ÊS÷°¸F½[ÔÄ]òájb„Þ|î…Û¨ÝrDµ9ôøCÞ,j¯ðÆ„ù4¯i„þ"¬…D”Ì-‹§cCÖ6¢u…îâ(NЏ‡9I?à>ÑJJ3ᆓ4[^¾•B1TaÈ ’Ã/Ì÷uN,N›²4’KM¹n¬7Å4÷-®8Mºû4ŒÆ…Z¬„…ÌË›=E œ&K¶Ójíau› áì÷Ü_Ý^Ö;-mñi‚{T)©"sæÚ¨ä…v[x¸ÈŸ_"K–¤ð™•ü àØ'²®,éÚ]œÝNΊÅdÖNÙ—@aŒµ!˜‘&žUÒ»Ú&SµÎ’áPJ[±m~‡„áÖOËñ}>uã”Ø•Žsbã•Uí¼}Ätˆß+õæÙZ`vÑorB…9-¸bQFƒ{Ÿ|B"~9èc$ú/fŽÈâË:›¯Ï²¯-¾¾»üãÿnž7÷;qz¡ñ7ã¶+3™°!½SÊßéÔ] lË2{×*'Ú~ÊÊ>K‰š§ . È͂ϠȮ1õË‘j…Ü×î>À]éšá¼d³¸‚a–sëäomüXnžä*oë4ùU¼_\¶p ধþj*Â¥ë5 Ê™*_ší1•²OÐIí×îpûý¬*Ö«[Íë}_~xo7¡`CŸÍDiZ@qJOà{è †ÍNUÎo^\Å"j•äeȇê¤ËÑ‹º‰‹ÞÙvÉ)N U&£^†çÈ{؇æÀ†£WÉ!~–%ÓL›X ÕQjòîû¤›ìŠB´C&Lœ`GíË&¿W.·r†]«¡z4ÇhnG[˜'Ðcç%x• n´D祸è¦2Ýñ­†}iÌÝ­ÌÇDå®?é0v©”ãÖµiGi)ÝFw´Î2þÁ²¯¡Vz··BQJNïtÆFùœØþø…¯uüe¢eÑJa“ÔmíûÅQã|NëÚ&¯ •\wU÷£B0Ç[Ï£rƒJ۴쑹º¯ Cs‡%Ô<·ê­¿"8L¹›  ÿ½¿øe_NÒ7Ñ¢š±;™óm8–‘v.Ó$ò¾¨”p‹¢AÂÌó×| ‚)mÌ?C¯äÒ!=甩6 ]Åï6ŠT…ö¢N]æ·Úó›ÛMúÅ´95k…oä¶Í„3çÐe?îWÑ%h¿BywF’eïhjµM17lwóƒ%9¶QL…lK;€>~:®aˆ®¨ù-åÃÇË4Ü‹¬¢tdŸwC‘ÄÜHÂK=žï¿*Âm&”TE땹8„}/RÆ€¡ƒ‘d.]#ó;%BÔœÅc³ÎõwòçÂ6Ó² Ž„òy–š·x­žLoê¿!úõ¡W¹]k:q³š²°3¬f‰ëvµüöå¹*èÆÌ!Y’@g7¹™ƒôßë,%~¦oéðÌô⤦r’ž†—ˆ¡¸·ÁÛ@…¹ÞøŒ‚-©=y€éÕ $iz»qiãϘꑱƒ‚IXÏO/Ñ_XŸUC8“5Q{¥±%3ítÉb%Ÿ C¶WÂk@òÕ„k™É„–¿ñ¼[À¸ÏÞÍR-ŠŸ9Ü%z?h\°¾ßö§S¾ ¥Å~+Îφ7~[¢D¤ õ)"’d3 pÝXiáy”äüU££«¾ úæ,Î_ZÒ¼¤©Ó‰Üo/صòíéš.‚é–*äî5ºk}XŠõœ–êE'ÑÍ;k{–Ng’§Œ¬›êêÇTm‡äÑãFÄ3{¯<Œãg•ÔGiô”¨û ì\µo–òö(·s“Ûq™«?Ul4Îéwlf`{h™‡±m’0Y?iøñ!ù9íˆm~±³¤NšÝ¶J*žB¬IIJK÷~ó¯‹öÛëÇö»ŽÎ´Ø,wD(W•qÚb±Ý^Gèøÿ::€/¢‚WŸFÕv\ŽHßpOeqqŠ{ê*ÍzÍŸiï\½f½.;²í”Œ§ëóÓŠBwëÂôΩYI÷C9Åkû…øÓ †-43µêY<›$eúÝR TEé^ÁYíÓuŽ€7Dáx²ðcÔ2µf¡jgú% ¡nn× nïW±ˆñ)bN¼,ÍÇf‡ÜGÁÞÛ¬8^¼»»‹¼' :ÂMäÖ!.#¶@sNÏð;Ùƒ*³žR}M—æØ^9Fl-®ÍÑìBÎ'_œi3˜0WÅfÎz—©ãËç®4PUFõ(4¦œ*±\·ÀÆ/妑 éf¨ê¾6‹:Ó-f‘x{J|H‘Wx‚æøºŠ[l¿ý Õ ÍÂ_,×Ð ¤…AŸ·WCgȨcmß,.²¾Ó*uõÁµ¾e\º‹FØn¥UêÄM!é‡×ºfñGßã 6! ´?úÒéÜÔ“¿½iâ'pxù ]öyl˜I¾’¿4p*O?\ve^/®Ÿ‰n‡ÔÄâ³õùÔ³BŠ)¼½èÌ,bŠrª-çóD0æk§ˆ2ôLž–¤&æu6¡à؆šš@ Ž!¢b‘e™wœoØ1ÑèGñ: ž`1æ<ûU|ê~†7ÀF:`å®Hú J¬á׊êgw;ŠV2Þ•Á'î¹N˜.Ÿ(Û¹]”o£ã~AÑ‹–†Ic2ýÊeTT¸ºC‹;JêÛÇ¢4²!m)n܉‚¯>¼l:®l »¦:׋·ÃÆT’qäßhc:ûZÆ^’–]âˆmua‹éw éž׼;YP)¸ÚnpŒ\]acaR›J»Q·/Ã;‘©í:MÛŒúU ïÒfrbŸ‰†É5LºÔ*™ÑþîÐÌßùü- å¥Bšrå+ݬŸ>‡úq4ÒÂGê×k9˜ë÷™ÈJyýT1‚FógÞ¿—gÆbšÞp§^ûŠ-âfi‘÷ ž }Ú!ARþYó}à¨ÀHõÈÝo¶¼k%SñgòMklß~Š•è¤&E†ùÚ{8'6ö™ M1Éno;1J}?í ÷ý†Çñ‚†l=•±ZìX“ :3fÉßÎQöÇ Ã™!³øÊã[ãaY ø9šBwéz™äûÊkúúèßÙl°ëqäKÚ,ß»&³Y#âê¤Ìœ–uîT"ÖV?0+í웊W÷¶)õ7Ÿ‹Dg—0}\ó&ä"ýä©ÀØÀ8^{±©Úz.ŽÈ/ÑiÂyžuhk n ¢]@»Ì(T5›V…eM‚ÈI¥;U†¤V^´þXHÈ åÆ5§]TíàÌÅÞ~X­Á·àˆ"šBFÒÃ'3ª'£sÄ íS5ú²2éørµö÷‰Ç›%ùSQŒƒ‘ï˜,©vWçBéØÕ«¬CåìÇã„Íqê\ B»õH+½3Yü=q”øÒšÈp!âjz'Y6¼ƒ º¥w:Q¿ÈR­ig~Âðâ›6ÚÓ8?¡eHZíÖE¨ýÞI¯f8 ç˜£,˜bMDì‹ðe(#û‹(ŶxÓcFY¸‚t9Ù8u×äA)ê¥ÊXµN—â…cZèÏ2RžMÚ&û5EYDsú÷B=³Úàþlf‚û»ß¹aBR^Üàþµ*FDÑл5ð¤ÌØØÕöÆç·ýmSU]“ ’àA—±:"}´ðîùf;±tš]º»ˆ¬g»dúi7ÚVP¢#dý ½Åõ´ë(vZgCkŠ×mEHñ·ŽÌdJwè'U”ýž‘eY>º‡'´N55´QM(è§[&Ü8Õf„¨Žd䊫UÌš;ñ=9õÊDs‡«÷“sÁÛéÑηõÏ©`:¶–‹Jì:\|ØQèÑÃX= g†«ø RiÈ‚ée1ä¶ãФ¯ÙÕêCR._}·'ÞzOþZã•p ÛÐË÷ÅÙ“Þƒ錛úÒ¯%AÖŠÁeÿ"Eõ&Žž*¿Ý†wÞøŸ;`âýþùÁ ÅnºN¼µ¡Úñ ¾·50ž½‘œ´?Ûµ4jôí¦"-õè0å÷:¤¥ÖÞÖÏ[HPt?zÑÜ÷øçZÏK²TŒ`ž'=‹o¥ÉÇé;>Ñ%Ý‘É ›ºEÈ3‹UÔ–#ãÈéÇ.Ó¨*[ žõíie¯ ‡‰'IØ8§¬8˜´HP¼ ËëãÕ„ £”Wƒ\WûŒN+Ü©¬V‹[Ä¡e æ‚q¤Á!w²›\;½lµÁç¾j*FLöÍ.ÎÇËñô ®G–'ÞuUwÛíd å¶´äëA½Ï—¦;¦ÃÎ|œr†¸ žöáÒ¸*©aõ£¾}Ø!FYß6Ú/ £õŸ›6– E›lx~¥öœÆzâ5«ßÜ®¬þýe ªÜÁI…‰ºÜ&:TŠ„mdì¿g>ø endstream endobj 423 0 obj << /Type /ObjStm /N 100 /First 907 /Length 4079 /Filter /FlateDecode >> stream xÚí\[sÛ¸~ׯàãv:!‰;ÐÙéŒã\6Çum¯ãl&ŠÍØêÊ’W’7I}¿s‘”,Ú–-µÝƒ œËw.8€˜hYfe¦¥ÌD)3-B&´À½ÉD0¸ºL‡«Î”²™Ve¦÷™¯df ®2d6ˆžV&sã•˼ ¸êÌŸiç³àéžè— ËLA‘ «:ÁiŒÕ*Þjt4„ðeOk“É2€½¶™”òiÈ¥$M÷™¤©Z‡Lƒé¦Ì¤u˜nD& e(1ݨL•PU¨#”ïic2%ñXK Òt—)íé‰Ï” z('@ÐBy´@²h Z%î´Åá É- kHIzBŒ‰©¥E B¨YP÷ôÞhð ãDfJÜÉÌHªNeF^ • éajf dÑÎfÆÒÞ¸Áΰ€Ž:Ld¡L V^gÖ’©½ÉȦÞf®4€Ù;êÐ`™³°±Œ.H<`U$,Læ *óè¡[{’ ޤ¢W6 °ROC£ÈJððž $`5Fcš žÍLéKÌJ”ð7ÌF–ìyB:€b0_(éuÏÌP¤‚˜S‚ÆÂÛ`^Â_ÀYAž,`I †;\ ¼HBšÜÒA`¿ðAs­2¶çpÕäÄÕZø)y±u`E~€ÍaEáJöjt¡Hª:UÂA¹§ÉÛ=õ l*I}‡½ìÇ߯«¬8è_T½bw<šU£Ù%£‡½â°šŽo&gÕ”•½«ÎýçãoÙGŠcØ:—p ¯Eîç(M@"þ÷¿3—ÙGÍq˜§~ÍàlÎÌÈF7Ãá§ù°W ûñǬxeXWÅÁd|vTͲôÅ«¬8®¾Í²zV‡ ö– °ÄU0ÿUÔm+Èõ¬ÃóðÑh Š9’HKœù}¯x>žœW“H³üDŒÏ qP¹Í¬9'A£ò€,d%ßcÐÑÍçÙŒ~)Öþ(+~9|›.g³ë¿Åׯ_ó‹ÑM>ž\gãëïÃêˬø ¡Ó‚X=ÎKЇWû§Á}Ûc”~ ÜmuÌ#Õ¡Á© 7ÐÊÏÕÄòSŠ'ééÂ-={¢[)¦É«l¼Št•éªÒU§«IW›®.]}º&z&Ñ3‰žIôL¢g=“è™DÏ$z&Ñ3‰žMôl¢g=›èÙDÏ&z6ѳ‰žMôl¢ç=—è¹DÏ%z.Ñs‰ž³w„ßB$uE#ÖžÜ>ëT^ªLú+ a½À:ø^Ç<ðÙ°Çp+sª2mvÊåB†•,EØ O^-–äX*W²´jC,Í=¿š'äJžÚoˆ§µàåžNç¨aV[Slˆ§1ˆhÙð´*÷VnÉœÑa69—÷sžXITX­ç¦Ô,ENõeÍR”y)ÍV͉Ê57¡q[Ôo¹±[µ&²fNªfi4DЫ#Ålˆ§òyY6„ÌžKéWò4å†xJ¬G(•kž <»¼Ömˆ§0ˆÆÆ…´T¡#ñmÈž ©]¶°U׎d»){*+s§Â~a[>3‚2õEKO?îÂvC,©”)[jj—cw¹M–ðbѰ,mŽÞJ–ZÆ$€¤S‚9Ki(Þo5½K ‰ ÃéÝKµ 5±õæ˜´Þæ•¡A^0¨0mÐyb+齿‰ ªúš'ÔÇNq+ùÝH]Ø•X…=W›§Æ2Ö•÷6£&Õ^TŒÏYš€Ð«ãDÛMñ¹ Ó§9Oïrµ•r¯æ¨lnéôgÎ%Š5r«d$Âß5,ªZµú f)H-Ýð”:ïrŸM±,a»–û•Ûrµ–Bo†%öp¨'k–Ø’åÛÂ5Å%v£¹w ®Ø]R*ÜfÊÓ¥‡»41¢…ËË®%sCÀ¢HÏmËe50ãÕV£D!öEÙ¤v,RžÛª9JXÛæiJ¬`~ÛêZMT°¥o2»BfWBn'Í&5%6(ôÛÆœ§ T,Ømz­D^õ¦ñZª œ|Hn§34çï=C{à°{Ú$Ÿ“Ǿç£õûÚPA«O½†vzؾ þóQ’Z‘)úí‰0t¶Î!Ð!VîçO´ÌUæ@y>7H—ÓoZ¦Ç‘xlãÈ´ÝoTè»Ô&&í·`h¨=¥mËÛÈK£¯RŸDÕ”«•æß‹èÅ;Ÿù’5áqŠ@–H…<[¢"¢ôƒO¢çEʱ˜`^¢Çq+J¼” ,oÃp»¿'»qÏ^ËÞN´}ÌáöµXÍÈø^ÓOf¥A/™ª~ˆ}nÉ÷$'‘?ÿžþ4-lAõ'£&…7hÂÚPäQÁ†’\ós§Jlcé×%r9~kø¹Ó–<‰ûé9Sˆ}gѲ²q¦toâxj½" ±•Ž(¨’ß–å­?úÀòaŒæ{'%{6KŽû®”=Rº¡Ç²Õ2 fÔôÚ£”÷˜[&ß~×p•h]ò–‘ªv kp¡ š«eI ‹M¯¥hmFyœ²d ÓÒÓ¼AØô>=㹉:6"AžèÓ8ü‰RÖìñg‘n]îµ `bÉ­~Ë~ütÁª²¡‘LaGÇ žIiœé‘AþÌŒn‡}¦}BŒ¹«^¶–£ŒF ÊØÛÚ1‰òÔÿeœE9ºãŒß²›Ï#S?·1¤M4[mäÕŸ8ÍqQ²o‰´cûMž™üÐÑÇ`qœòÑ,„éA…V¨Ð¢ËžŸ8H>É` %q$·!xÞþ7Oæ;¬×6*mâ²Û­¾Kx×ÏÚsèi´\´Pòœ.LOŠÚbÉ{Ô|¶µ$“æxÕŒ£=$vöŠc“ãS¹|Þ*!ù E‘Ô–ú]-­í&ˆÓìGüÔÍß#ÝÑ‚-„Véùœ6­ÝÆ‹Ä1ŽŽýf”æ{ÝÑ¢P÷î–ð!m¢Ø’Œ5à‹-ÝG]é°ÆÏõ´|P£¨>p%û² æšBÖÐ{:²ÎpmbÁÄ<òB`×4©ïUàÍ<Øx:<ñ0žMŒ…°2uck}c+âÓF£­‘Á.?0Q²_£Ï¶ìKO¬¨O¢Ux^=6¾×†äИᓕšw¡ØçöS눖Ž9_TÓ³Éàz6žÄcÏýþÖîØûù¯»ïž‹χý‹i¦ã€çüÙß3 ðLòÒ - tF;=£¯þP«÷ŠÝþõOÕàârF?¾ö âBïž zùfÖÎvFÃ*ù£YuuB¾Wœ¦Iô9y±{ÙŸÐQêÅN±[¼(^¯Š×Å›b¯xWìÿ(ŠÃâ¨8.~)N‹E¿ø\œgãáxTœUñ¥ø2(.ŠËbPüV ‹«bTŒ‹ëâš>Mä/J¹7!vÅïŤ˜³â¦øZ|/þý—¨é«ä£Ïª[ßjÞÜ‹½w{Gï ¸S!W#g!'àI*l¹prÏ[Øý´€^Äîýrgã««>ãÇäEòËà@:¾™,A:Œ*à:F l«É`|ÎXN«?ªQ1|ª³ËIU³¯càûþFW“qf¿U}(̯Úÿú9`Þ=ÚíðP¡çêÜ"ÌXaV ÌeÆN¶ V¢ qà Šé¢6jmÞ¿<98}mÞ½é 7U‡›ö÷8ºËiž‘îPé3T%ƒ.jfÖ²ÓÁÎþñiÔ¬#”˜k&í†4³¦S³U¹u4:øç›½ãŸX£°Z!jÇ3›2•^K¡µ2Ö1‚èø vùž.ç •á) ÕÁdC§:·óÕÏÅÛVÎúgóO¹(ïÿ oíOg€aúÜöó¤ö[5ã Ÿú1Ç/g¸óñpØŸÔ‰®º:ïO/‹ê÷›þ°¨¾ ûW)ùqöK pØäÀËï×—Hqƒâ_‹Éptsõ¹šL£&/®ZsR²¼ÞL±þü~3žU矇xP¸>À è×Õó"Îk-’owOßíŸþõ¸:}ö¥ú~5é Tá<å>“yI‡—®Á{aA(ï?­0­µÁµ®QËZë»MzS=ïO+þ,rùlpAm>Ûäòûj0™ÎˆmFÿ½~}ƒ»÷ƒóÙå”ÿË{<þeôÏ«ìâ,Ÿ¸-Ë#oÉ#ä-yüä¹u4µ,^ˆ Ô$L#7hùtiY»,ñ ò”-€ä#ðX:ZfïïdO75wµ>÷¥ãš%æ¢|0sÿÕ—ŽV–™ß発¥ºÝ€#,nß—¥¹å–F·¡h ãíú¼÷Û˼o¹ oç ßNå€XÜ3/ ãž0¼Ú€4Ë›Ê%yä= UØ–<Ý ì? ™ø« endstream endobj 561 0 obj << /Producer (pdfTeX-1.40.13) /Creator (TeX) /CreationDate (D:20130915164704+02'00') /ModDate (D:20130915164704+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian) kpathsea version 6.1.0) >> endobj 533 0 obj << /Type /ObjStm /N 60 /First 514 /Length 1961 /Filter /FlateDecode >> stream xÚ­X[o·~ׯࣂ"Ðò2¼E×>ZÇJ;iŠƒ>¨í,*i íÊiþ}g–Cy¥]+Ç:}"¹äÌwáUR……NHc…¡œÒ ƒU£½B)\¡D^ƒÊ‰ q! ªx ”ZŽÆI…_”Áaš*Ǭ肨¢pŒ¥ …;ª¸€)°b Œ¢ÌFk¡(3h#”,ÜW©Ââ+”.VV,U<âQÖ‚*ž*€¢TYeEÀ±®(6–N š¼‘Òæ„Çq?:‡D-ŠÕBK„ X†BX@ÞÆ ìÒÇ$˜$jHñ3Jh/‘±ÁdAQÅ DŒtíEyè¸QVcÅ¡hGtÞx„@þ¸"ŒŒ—ôE ((0…bÅÐ8Œ¢†¥Ï€ §© ©´4#z@ŠLñ³ÅF~ôã£Éí·‡(&—ÕºMn¶6m“>ÊÑäçY©GL~½¾ys~öÃùõÍÛÛ[YŒÚ€‹XÏ7åCSmµô¿—›º9ÿ2ÛF“·3nH…é~+Í—µ„4ö¶ú¸.çÕ" Ý~øé§0ººþpuö‰ý>ÈÇò)ºtà‰M€—ƒøtqsö¿ýeÜ‚Kµg†êÀ»C3ÔËù\¾™Nýø OŽ?ä£õÛácþ…ÉùùêÓôfÚò }:ºèÑy~­üt®Î?_O?ÿp?¿¾‹ßV›!toã!ÒeUtY¹>‰÷³ûX&çÕ!ÑÐ÷³MÄdmâ«rQ‹ÿ¶‹ ȶÐ6µ¤â’Ûª5èSòË´ð¡à2·C*æÒŽ2åŸJËü-·«tát Ï<=ç ¬#¤¶*\*“w'a(™xªä7–Üfï{§´?Ã$oèiKàœìb/Á€= —æC¹´~”gþž±ØCôééœÂ[’—.û¯yíj^»Z©“1´âì¿fÿµf,#¹<Ý+ÍkWcYƲŒÅkX»ÿCϾ¸.ÓÔ= þd S$ßM‘ø)¹L؆״Ikú†î`Ø= ž“ ñ5ò]¾ºKØu“ññ£¼=/YÉKÔÀéôæLk“}W<— ¦ÓyÔ>7_à‰Û÷ä»{ÈÁî°çÌs—ý=~·m–åšâÛ»‡Þ˜- ]=íÛ¶m¥ÜRîbËf±›ßRgXåÉÛçÈ÷›øØ>»WGÃS´>-Skÿ~âtKå\!I•ß;œi€Uð»Dp,‘ÞK$™]"y$Q~޶‰‚ÈSä<|ï?“ºyt?·»<ÇÌö]¯™Ü~žÓî˜Ó¶ËÇC?ÛíöΑm7 ÄíœuòùHÛ5Ö ëvÆZ7˜&E°;+í1+íž•²óÂÛ‘kw“ãMöZ€íü†c~CweÛ¿aç7<³°SèÞRžÎV’ñkùJ¤abŒU¾ DzxE?¯¹A†ë ;lnhl8~UNÞ–«²É9©ïC0i0p,`¬Ïp–¹Çá(Ëu!7v¸C4JJ]=4dʯ¤±B9*iØ 9,Yá %7PŽR9ÄP£‡†ã©«†r”α–ÌZ¡e nxj°} õ(àÄ6º‡†YÇFjÒÃO±F=Êæ4$(Ï&AüòkäxJ5ÑÍ÷î奾> )ò,O“"ŸÑIQÈè¤(ð<"žä§×Øázx˜–úzx†–e‘)jðìÔ¤% 4†,Р&­rf6= ] /Length 1393 /Filter /FlateDecode >> stream xÚ%–kh—UÇÏ÷ùÿÿnSçu›÷ëÜœîï¼lnÞæÔynº››Ó¦S*3ˆ.”/"BzQRQQQBpPNÑêE`PPA/$"%"*ÈR0‰ntÙç뛿óý=Ï9¿çœï9ç !„ÿÂÄ E¡+d!” Œ6KÎ6‡î»u4Ê*ÇÈé¹_ZÁZ…Êkm` ب0ýOÛçÍm ]aq­ŸÛJ÷%D;À.°]aÕwÎî CaÃ×Övƒ=`èRØrÚ‰½ t+lûÇZØú:Yë®e@aß kƒ”acöÐa0jùþ¨¾èq‚# Ã_úµ…(eÀ{á˜ÂíOXÃ÷IR»›Ôœ#c0*S8u—56Db¤r…dž¬M >öLb¤I O~ï{!U6DbñR…Âs/;˺%¼‘f*¼xÝ«0BWŽŽ‘ÀaÉÆÄŽ ÿ¥¹ g繃…|y†K‹η8±Ô)|Píæ:õÇ`®T¯ðÑf'Šs¥U AáóÛœX°YÂR©Qá«'Øy ‡¥f…o.Xklç4ê°+ç¬áº´lP¸ñªµVÊðü±íS;hSøû„³Ø1mæ‹<»ÛÁV)ÿ¼³3á¿´C*Ýo ÿ%ü—:¤ _Xà ë¥.iÆÍÙÀz _%ü—º¥Ù“è¡ ¯ïè“jÿrO¦!0(5õZÓÉGÕA©í k81ÃÒÖ‹Ö|²ˆ¼‚#ÒÞ&'Žòm¾Å ê±m¥l°Û§r9MÃ9éøÎæA)#Ýó”µ0ŒeÒC¿:1LåÒéãÖ&€I`*¨S¤g¯9[f€*éÌë.ÃoÌ3¥×îõs³À|0Gzj°@ºP,’>~ÛÚào¨“>½ä„¼z°4HŸqb9L$j+¥o{à¬+6ƒ&釫ÖVƒµ Eú¹ÆÚ°¬“®5[[Ú@«tã²µ` Ø$ýþ®5ßž«m ]ú÷Š[ÁN°]Yö‡µ`Ø¥¬äMk`/èT6ñak] ôƒ}Ê*=÷ñÍA°_Yõ'~x€ ¼‚C€û²x@ÙŠ·œõÃÊZïvó0½pe»_q›EßñAÙðKM*\ºy¾à°˜SvgÎM±T,c”ôRÄRj™B„ÍâXe§\FG¯a•ÈjEf-Rxôx-b®ˆá¢/®ò8`¸8ૈ×âÀEç¼|ñZ\ø ˆµ¯En؈Í"6‹X*b®ˆá"wh\°Y\ |ib®ˆ›b¹²Gwú³ÿ££}Ê/Øâ¨[ù;*õ(æiG½Ê_ô^}Ê_/sÔ¯ÂêóŽö«ðø€£>¼9Ú  Wù˜ *@%¨Ó€Sƒ:à‹e)¨E° 4ogÿµ¬«@#hþuiþ‡[Ö‚u`½ ¿t~»?üíÃ]D endstream endobj startxref 390517 %%EOF ./numdiff-5.8.1/TODO0000644000175000017500000000001512215353073013011 0ustar ivanoivano* Add a GUI? ./numdiff-5.8.1/xalloc.h0000644000175000017500000001721212215353073013763 0ustar ivanoivano/* xalloc.h -- malloc with out-of-memory checking Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2006, 2007 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 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef XALLOC_H_ # define XALLOC_H_ # include # ifdef __cplusplus extern "C" { # endif # ifndef __attribute__ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ # define __attribute__(x) # endif # endif # ifndef ATTRIBUTE_NORETURN # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) # endif /* This function is always triggered when memory is exhausted. It must be defined by the application, either explicitly or by using gnulib's xalloc-die module. This is the function to call when one wants the program to die because of a memory allocation failure. */ extern void xalloc_die (void) ATTRIBUTE_NORETURN; void *xmalloc (size_t s); void *xzalloc (size_t s); void *xcalloc (size_t n, size_t s); void *xrealloc (void *p, size_t s); void *x2realloc (void *p, size_t *pn); void *xmemdup (void const *p, size_t s); char *xstrdup (char const *str); /* Return 1 if an array of N objects, each of size S, cannot exist due to size arithmetic overflow. S must be positive and N must be nonnegative. This is a macro, not an inline function, so that it works correctly even when SIZE_MAX < N. By gnulib convention, SIZE_MAX represents overflow in size calculations, so the conservative dividend to use here is SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value. However, malloc (SIZE_MAX) fails on all known hosts where sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for exactly-SIZE_MAX allocations on such hosts; this avoids a test and branch when S is known to be 1. */ # define xalloc_oversized(n, s) \ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) /* In the following macros, T must be an elementary or structure/union or typedef'ed type, or a pointer to such a type. To apply one of the following macros to a function pointer or array type, you need to typedef it first and use the typedef name. */ /* Allocate an object of type T dynamically, with error checking. */ /* extern t *XMALLOC (typename t); */ # define XMALLOC(t) ((t *) xmalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking. */ /* extern t *XNMALLOC (size_t n, typename t); */ # define XNMALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t)))) /* Allocate an object of type T dynamically, with error checking, and zero it. */ /* extern t *XZALLOC (typename t); */ # define XZALLOC(t) ((t *) xzalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking, and zero it. */ /* extern t *XCALLOC (size_t n, typename t); */ # define XCALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t)))) # if HAVE_INLINE # define static_inline static inline # else void *xnmalloc (size_t n, size_t s); void *xnrealloc (void *p, size_t n, size_t s); void *x2nrealloc (void *p, size_t *pn, size_t s); char *xcharalloc (size_t n); # endif # ifdef static_inline /* Allocate an array of N objects, each with S bytes of memory, dynamically, with error checking. S must be nonzero. */ static_inline void * xnmalloc (size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xmalloc (n * s); } /* Change the size of an allocated block of memory P to an array of N objects each of S bytes, with error checking. S must be nonzero. */ static_inline void * xnrealloc (void *p, size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xrealloc (p, n * s); } /* If P is null, allocate a block of at least *PN such objects; otherwise, reallocate P so that it contains more than *PN objects each of S bytes. *PN must be nonzero unless P is null, and S must be nonzero. Set *PN to the new number of objects, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. Repeated reallocations are guaranteed to make progress, either by allocating an initial block with a nonzero size, or by allocating a larger block. In the following implementation, nonzero sizes are increased by a factor of approximately 1.5 so that repeated reallocations have O(N) overall cost rather than O(N**2) cost, but the specification for this function does not guarantee that rate. Here is an example of use: int *p = NULL; size_t used = 0; size_t allocated = 0; void append_int (int value) { if (used == allocated) p = x2nrealloc (p, &allocated, sizeof *p); p[used++] = value; } This causes x2nrealloc to allocate a block of some nonzero size the first time it is called. To have finer-grained control over the initial size, set *PN to a nonzero value before calling this function with P == NULL. For example: int *p = NULL; size_t used = 0; size_t allocated = 0; size_t allocated1 = 1000; void append_int (int value) { if (used == allocated) { p = x2nrealloc (p, &allocated1, sizeof *p); allocated = allocated1; } p[used++] = value; } */ static_inline void * x2nrealloc (void *p, size_t *pn, size_t s) { size_t n = *pn; if (! p) { if (! n) { /* The approximate size to use for initial small allocation requests, when the invoking code specifies an old size of zero. 64 bytes is the largest "small" request for the GNU C library malloc. */ enum { DEFAULT_MXFAST = 64 }; n = DEFAULT_MXFAST / s; n += !n; } } else { /* Set N = ceil (1.5 * N) so that progress is made if N == 1. Check for overflow, so that N * S stays in size_t range. The check is slightly conservative, but an exact check isn't worth the trouble. */ if ((size_t) -1 / 3 * 2 / s <= n) xalloc_die (); n += (n + 1) / 2; } *pn = n; return xrealloc (p, n * s); } /* Return a pointer to a new buffer of N bytes. This is like xmalloc, except it returns char *. */ static_inline char * xcharalloc (size_t n) { return XNMALLOC (n, char); } # endif # ifdef __cplusplus } /* C++ does not allow conversions from void * to other pointer types without a cast. Use templates to work around the problem when possible. */ template inline T * xrealloc (T *p, size_t s) { return (T *) xrealloc ((void *) p, s); } template inline T * xnrealloc (T *p, size_t n, size_t s) { return (T *) xnrealloc ((void *) p, n, s); } template inline T * x2realloc (T *p, size_t *pn) { return (T *) x2realloc ((void *) p, pn); } template inline T * x2nrealloc (T *p, size_t *pn, size_t s) { return (T *) x2nrealloc ((void *) p, pn, s); } template inline T * xmemdup (T const *p, size_t s) { return (T *) xmemdup ((void const *) p, s); } # endif #endif /* !XALLOC_H_ */ ./numdiff-5.8.1/Makefile.in0000444000175000017500000003221312215353073014371 0ustar ivanoivano# !/bin/sh # Numdiff makefile # Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. # # @configure_input@ PACKAGE=numdiff PACKAGETWO=ndselect VERSION=5.8.1 SHELL=/bin/sh .SUFFIXES: .SUFFIXES: .c .o prefix =@prefix@ exec_prefix =@exec_prefix@ bindir =@bindir@ docdir =@docdir@ localedir =@localedir@ infodir =@infodir@ mandir =@mandir@ srcdir =@srcdir@ VPATH =@srcdir@ BINDIR=$(bindir) DOCDIR=$(docdir)/$(PACKAGE) INFODIR=$(infodir) LOCALEDIR=$(localedir) MANDIR=$(mandir)/man1 CC=@CC@ @SET_MAKE@ #MAKE=make MKDIR=$(srcdir)/shtool install -d DIST_MKDIR=$(srcdir)/shtool mkdir -f -m 777 INSTALL=$(srcdir)/shtool install -c MOVE=$(srcdir)/shtool move -p INSTALL_PROGRAM=$(INSTALL) INSTALL_DATA=$(INSTALL) -m 644 FIND=@FIND@ INSTINFO=@INSTINFO@ LS=ls CP=cp RM=rm -f RMDIR=rmdir RD=rm -f -R CAT=cat GZIP=gzip -f TAR=tar MSGFMT=msgfmt -c MSGMERGE=msgmerge XGETTEXT=xgettext -C -D$(srcdir) -k_ -kN_ --msgid-bugs-address=ivprimi@libero.it TEXI2HTML=makeinfo --html --no-split TEXI2INFO=makeinfo TEXI2PDF=texi2pdf TEXI2TXT=makeinfo --plaintext HELP2MAN=help2man -s 1 -m "User Commands" # flags for the preprocessor: CPPFLAGS =-DPACKAGE="\"$(PACKAGE)\"" -DPACKAGE2="\"$(PACKAGETWO)\"" -DLOCALEDIR="\"$(LOCALEDIR)\"" -I$(srcdir) -I. @CPPFLAGS@ # flags for the C compiler: CFLAGS =@CFLAGS@ # flags for the linker: LDFLAGS =@LDFLAGS@ # -L and -l options: LIBS =@LIBS@ @LIB_CLOCK_GETTIME@ OBJECTS= ./analyze.o ./arith.o ./cmpbuf.o ./cmpfns.o ./error.o ./exitfail.o ./flags.o ./getopt.o ./getopt1.o ./inout.o ./io.o ./linesplit.o ./main.o ./ndselect.o ./numutil.o ./options.o ./setmode.o ./side.o ./thrlist.o ./util.o ./xalloc-die.o ./xmalloc.o @LIBOBJS@ OBJECTSONE=./analyze.o ./arith.o ./cmpbuf.o ./cmpfns.o ./error.o ./exitfail.o ./flags.o ./getopt.o ./getopt1.o ./inout.o ./io.o ./linesplit.o ./main.o ./numutil.o ./options.o ./setmode.o ./side.o ./thrlist.o ./util.o ./xalloc-die.o ./xmalloc.o @LIBOBJS@ SOURCESONE=$(srcdir)/analyze.c $(srcdir)/arith.c $(srcdir)/cmpbuf.c $(srcdir)/cmpfns.c $(srcdir)/error.c $(srcdir)/errors.c $(srcdir)/exitfail.c $(srcdir)/flags.c $(srcdir)/getopt.c $(srcdir)/getopt1.c $(srcdir)/inout.c $(srcdir)/io.c $(srcdir)/linesplit.c $(srcdir)/main.c $(srcdir)/new.c $(srcdir)/number.c $(srcdir)/numutil.c $(srcdir)/options.c $(srcdir)/read_line.c $(srcdir)/setmode.c $(srcdir)/side.c $(srcdir)/thrlist.c $(srcdir)/util.c $(srcdir)/xalloc-die.c $(srcdir)/xmalloc.c OBJECTSTWO=./getopt.o ./getopt1.o ./linesplit.o ./ndselect.o SOURCESTWO=$(srcdir)/getopt.c $(srcdir)/getopt1.c $(srcdir)/linesplit.c $(srcdir)/ndselect.c $(srcdir)/read_line.c DOCS=$(srcdir)/AUTHORS $(srcdir)/BUGS $(srcdir)/COPYING $(srcdir)/ChangeLog $(srcdir)/INSTALL $(srcdir)/NEWS $(srcdir)/README $(srcdir)/TODO TEXISRC=$(srcdir)/docs/numdiff.txi FDLTEXI=$(srcdir)/docs/fdl.texi HTMLFILE=$(srcdir)/docs/numdiff.html INFOFILE=$(srcdir)/docs/numdiff.info MANFILE=$(srcdir)/docs/numdiff.1 MANFILETWO=$(srcdir)/docs/ndselect.1 PDFFILE=$(srcdir)/docs/numdiff.pdf TXTFILE=$(srcdir)/docs/numdiff.txt # l10n files PACKAGE_POT=$(srcdir)/po/$(PACKAGE)/$(PACKAGE).pot PACKAGETWO_POT=$(srcdir)/po/$(PACKAGETWO)/$(PACKAGETWO).pot PACKAGE_IT=$(srcdir)/po/$(PACKAGE)/it PACKAGETWO_IT=$(srcdir)/po/$(PACKAGETWO)/it IT_LOC_DIR=$(DESTDIR)$(LOCALEDIR)/it/LC_MESSAGES GARBAGE=./numdiff.aux ./numdiff.cp ./numdiff.cps ./numdiff.fn ./numdiff.ky ./numdiff.log ./numdiff.pg ./numdiff.toc ./numdiff.tp ./numdiff.vr ./config.log ./config.status ./config.h.in.save ./config.h # Rules to build the executable programs all: $(PACKAGE) $(PACKAGETWO) $(PACKAGE): $(OBJECTS) $(CC) $(OBJECTSONE) -o $@ $(LDFLAGS) $(LIBS) $(PACKAGETWO): $(OBJECTS) $(CC) $(OBJECTSTWO) -o $@ $(LDFLAGS) $(LIBS) # Rules to build the documentation. The documentation # must be built in $(srcdir)/docs ! man: $(MANFILE) $(MANFILETWO) $(MANFILE): $(HELP2MAN) -n "compare similar files with numeric fields" -p $(PACKAGE) $(PACKAGE) > $(MANFILE) $(MANFILETWO): $(HELP2MAN) -n "select lines and fields for numdiff" -p $(PACKAGE) $(PACKAGETWO) > $(MANFILETWO) info: $(INFOFILE).gz $(INFOFILE).gz: $(INFOFILE) $(CAT) $(INFOFILE) | $(GZIP) > $(INFOFILE).gz $(INFOFILE): $(TEXISRC) $(TEXI2INFO) $(TEXISRC) -o $(INFOFILE) html: $(HTMLFILE) $(HTMLFILE): $(TEXISRC) $(TEXI2HTML) $(TEXISRC) -o $(HTMLFILE) pdf: $(PDFFILE) $(PDFFILE): $(TEXISRC) $(TEXI2PDF) $(TEXISRC) -o $(PDFFILE) txt: $(TXTFILE) $(TXTFILE): $(TEXISRC) $(TEXI2TXT) $(TEXISRC) -o $(TXTFILE) # Rules to create PO template files. They should be used # only by the maintainer of the package. pot: $(PACKAGE_POT) $(PACKAGETWO_POT) $(PACKAGE_POT): $(SOURCESONE) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' $(XGETTEXT) --package-name=$(PACKAGE) \ --package-version=$(VERSION) \ -o $(PACKAGE_POT) $(SOURCESONE) *.h $(PACKAGETWO_POT): $(SOURCESTWO) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' $(XGETTEXT) --package-name=$(PACKAGETWO) \ --package-version=$(VERSION) \ -o $(PACKAGETWO_POT) $(SOURCESTWO) *.h po: $(PACKAGE_IT).po $(PACKAGETWO_IT).po $(PACKAGE_IT).po: $(PACKAGE_POT) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' if $(SHELL) -c "$(LS) $(PACKAGE_IT).po" \ >/dev/null 2>&1; then \ $(MSGMERGE) $(PACKAGE_IT).po $(PACKAGE_POT) -o $(PACKAGE_IT).po.new; \ $(MOVE) $(PACKAGE_IT).po.new $(PACKAGE_IT).po; \ else $(CP) $(PACKAGE_POT) $(PACKAGE_IT).po; fi $(PACKAGETWO_IT).po: $(PACKAGETWO_POT) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' if $(SHELL) -c "$(LS) $(PACKAGETWO_IT).po" \ >/dev/null 2>&1; then \ $(MSGMERGE) $(PACKAGETWO_IT).po $(PACKAGETWO_POT) -o $(PACKAGETWO_IT).po.new; \ $(MOVE) $(PACKAGETWO_IT).po.new $(PACKAGETWO_IT).po; \ else $(CP) $(PACKAGETWO_POT) $(PACKAGETWO_IT).po; fi # Rules to build the l10n files. They # must be built in $(srcdir)/po/numdiff (for numdiff) and # in $(srcdir)/po/ndselect (for ndselect). mo: $(PACKAGE_IT).mo $(PACKAGETWO_IT).mo $(PACKAGE_IT).mo: $(PACKAGE_IT).po $(MSGFMT) $(PACKAGE_IT).po -o $(PACKAGE_IT).mo $(PACKAGETWO_IT).mo: $(PACKAGETWO_IT).po $(MSGFMT) $(PACKAGETWO_IT).po -o $(PACKAGETWO_IT).mo # Rules needed by the installation process. installdirs: all $(MKDIR) $(DESTDIR)$(BINDIR) $(MKDIR) $(DESTDIR)$(DOCDIR) $(MKDIR) $(DESTDIR)$(INFODIR) $(MKDIR) $(DESTDIR)$(MANDIR) $(MKDIR) $(IT_LOC_DIR) install: installdirs html info pdf txt $(INSTALL_PROGRAM) $(PACKAGE) $(PACKAGETWO) $(DESTDIR)$(BINDIR) $(INSTALL_DATA) $(DOCS) $(DESTDIR)$(DOCDIR) $(INSTALL_DATA) $(MANFILE) $(DESTDIR)$(MANDIR) $(INSTALL_DATA) $(MANFILETWO) $(DESTDIR)$(MANDIR) $(INSTALL_DATA) $(HTMLFILE) $(DESTDIR)$(DOCDIR) $(INSTALL_DATA) $(PDFFILE) $(DESTDIR)$(DOCDIR) $(INSTALL_DATA) $(TXTFILE) $(DESTDIR)$(DOCDIR) $(POST_INSTALL) $(INSTALL_DATA) $(INFOFILE) $(DESTDIR)$(INFODIR) $(INSTALL_DATA) $(INFOFILE).gz $(DESTDIR)$(INFODIR) if $(SHELL) -c "$(INSTINFO) --version" \ >/dev/null 2>&1; then \ $(INSTINFO) --dir-file=$(DESTDIR)$(INFODIR)/dir $(DESTDIR)$(INFODIR)/numdiff.info; \ else true; fi install-nls: install $(INSTALL_DATA) $(PACKAGE_IT).mo $(IT_LOC_DIR)/$(PACKAGE).mo $(INSTALL_DATA) $(PACKAGETWO_IT).mo $(IT_LOC_DIR)/$(PACKAGETWO).mo # Rules needed to removed the installed stuff uninstall: $(RM) $(DESTDIR)$(BINDIR)/$(PACKAGE) $(RM) $(DESTDIR)$(BINDIR)/$(PACKAGETWO) $(RM) $(DESTDIR)$(DOCDIR)/* $(RMDIR) $(DESTDIR)$(DOCDIR) $(INSTINFO) --delete $(DESTDIR)$(INFODIR)/numdiff.info $(DESTDIR)$(INFODIR)/dir $(RM) $(DESTDIR)$(INFODIR)/numdiff.info.gz $(RM) $(DESTDIR)$(INFODIR)/numdiff.info $(RM) $(DESTDIR)$(MANDIR)/$(PACKAGE).1 $(RM) $(DESTDIR)$(MANDIR)/$(PACKAGETWO).1 uninstall-nls: uninstall $(FIND) $(DESTDIR)$(LOCALEDIR) -name '$(PACKAGE).mo' -exec $(RM) \{\} \; $(FIND) $(DESTDIR)$(LOCALEDIR) -name '$(PACKAGETWO).mo' -exec $(RM) \{\} \; # Cleaning rules clean: $(RM) $(OBJECTS) $(RM) $(PACKAGE) $(RM) $(PACKAGETWO) distclean: clean $(RM) $(GARBAGE) maintainer-clean: distclean @echo 'This command is intended for maintainers to use; it' @echo 'deletes files that may need special tools to rebuild.' $(RM) $(HTMLFILE) $(RM) $(INFOFILE) $(RM) $(INFOFILE).gz $(RM) $(MANFILE) $(RM) $(MANFILETWO) $(RM) $(PDFFILE) $(RM) $(TXTFILE) $(RM) $(PACKAGE_POT) $(RM) $(PACKAGETWO_POT) $(RM) $(PACKAGE_IT).mo $(RM) $(PACKAGETWO_IT).mo # To make a distribution tarball createdirs: $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION) $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/RCS $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/m4 $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/po $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) copy: createdirs $(CP) $(DOCS) $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/Makefile.in $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/aclocal.m4 $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/config.h.in $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/configure.ac $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/configure $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(TEXISRC) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(FDLTEXI) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(HTMLFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(INFOFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(INFOFILE).gz $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(MANFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(MANFILETWO) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(PDFFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(TXTFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(srcdir)/analyze.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/arith.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/cmpbuf.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/cmpfns.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/error.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/errors.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/exitfail.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/flags.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt1.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/inout.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/io.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/linesplit.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/main.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/ndselect.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/new.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/number.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/numutil.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/options.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/read_line.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/setmode.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/side.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/thrlist.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/util.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/xalloc-die.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/xmalloc.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/cmpbuf.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/error.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/exitfail.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt_int.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/gettext.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/linesplit.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/ndselect.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/number.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/numdiff.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/setmode.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/system.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/unlocked-io.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/xalloc.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/shtool $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/m4/setmode.m4 $(srcdir)/$(PACKAGE)-$(VERSION)/m4 $(CP) $(srcdir)/m4/st_mtim.m4 $(srcdir)/$(PACKAGE)-$(VERSION)/m4 $(CP) $(PACKAGE_POT) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(CP) $(PACKAGE_IT).po $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(CP) $(PACKAGE_IT).mo $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(CP) $(PACKAGETWO_POT) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) $(CP) $(PACKAGETWO_IT).po $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) $(CP) $(PACKAGETWO_IT).mo $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) dist: copy $(TAR) cvf $(srcdir)/$(PACKAGE)-$(VERSION).tar $(srcdir)/$(PACKAGE)-$(VERSION) $(GZIP) $(srcdir)/$(PACKAGE)-$(VERSION).tar $(RD) $(srcdir)/$(PACKAGE)-$(VERSION) # To make a backup tarball tarball: copy $(CP) $(srcdir)/RCS/* $(srcdir)/$(PACKAGE)-$(VERSION)/RCS $(TAR) cvf $(srcdir)/$(PACKAGE)-$(VERSION).tar $(srcdir)/$(PACKAGE)-$(VERSION) $(GZIP) $(srcdir)/$(PACKAGE)-$(VERSION).tar $(RD) $(srcdir)/$(PACKAGE)-$(VERSION) ./numdiff-5.8.1/inout.c0000444000175000017500000006101012215353073013623 0ustar ivanoivano/* File I/O for GNU DIFF. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff 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. Numdiff 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 "numdiff.h" #include "linesplit.h" #include #include #include /* Lines are put into equivalence classes of lines that match in lines_differ. Each equivalence class is represented by one of these structures, but only while the classes are being computed. Afterward, each class is represented by a number. */ struct equivclass { lin next; /* Next item in this bucket. */ hash_value hash; /* Hash of lines in this class. */ char const *line; /* A line that fits this class. */ size_t length; /* That line's length, not counting its newline. */ short file; /* That line's file, 0 --> filevec[0].name, 1 --> filevec[1].name */ }; /* Hash-table: array of buckets, each being a chain of equivalence classes. buckets[-1] is reserved for incomplete lines. */ static lin *buckets; /* Number of buckets in the hash table array, not counting buckets[-1]. */ static size_t nbuckets; /* Array in which the equivalence classes are allocated. The bucket-chains go through the elements in this array. The number of an equivalence class is its index in this array. */ static struct equivclass *equivs; /* Index of first free element in the array `equivs'. */ static lin equivs_index; /* Number of elements allocated in the array `equivs'. */ static lin equivs_alloc; /* Read a block of data into a file buffer, checking for EOF and error. */ static void file_block_read (struct file_data *current, size_t size) { if (size && ! current->eof) { size_t s = block_read (current->desc, FILE_BUFFER (current) + current->buffered, size); if (s == SIZE_MAX) pfatal_with_name (current->name); current->buffered += s; current->eof = s < size; } } /* Check for binary files and compare them for exact identity. */ /* Return 1 if BUF contains a non text character. SIZE is the number of characters in BUF. */ #define binary_file_p(buf, size) (memchr (buf, 0, size) != 0) /* Get ready to read the current file. Return nonzero if SKIP_TEST is zero, and if it appears to be a binary file. */ static bool sip (struct file_data *current, bool skip_test) { /* If we have a nonexistent file at this stage, treat it as empty. */ if (current->desc < 0) { /* Leave room for a sentinel. */ current->bufsize = sizeof (word); current->buffer = xmalloc (current->bufsize); } else { current->bufsize = buffer_lcm (sizeof (word), STAT_BLOCKSIZE (current->stat), PTRDIFF_MAX - 2 * sizeof (word)); current->buffer = xmalloc (current->bufsize); if (! skip_test) { /* Check first part of file to see if it's a binary file. */ bool was_binary = set_binary_mode (current->desc, 1); off_t buffered; file_block_read (current, current->bufsize); buffered = current->buffered; if (! was_binary) { /* Revert to text mode and seek back to the beginning to reread the file. Use relative seek, since file descriptors like stdin might not start at offset zero. */ if (lseek (current->desc, - buffered, SEEK_CUR) == -1) pfatal_with_name (current->name); set_binary_mode (current->desc, 0); current->buffered = 0; current->eof = 0; } return binary_file_p (current->buffer, buffered); } } current->buffered = 0; current->eof = 0; return 0; } /* Slurp the rest of the current file completely into memory. */ static void slurp (struct file_data *current) { size_t cc; if (current->desc < 0) { /* The file is nonexistent. */ return; } if (S_ISREG (current->stat.st_mode)) { /* It's a regular file; slurp in the rest all at once. */ /* Get the size out of the stat block. Allocate just enough room for appended newline plus word sentinel, plus word-alignment since we want the buffer word-aligned. */ size_t file_size = current->stat.st_size; cc = file_size + 2 * sizeof (word) - file_size % sizeof (word); if (file_size != current->stat.st_size || cc < file_size || PTRDIFF_MAX <= cc) xalloc_die (); if (current->bufsize < cc) { current->bufsize = cc; current->buffer = xrealloc (current->buffer, cc); } /* Try to read at least 1 more byte than the size indicates, to detect whether the file is growing. This is a nicety for users who run 'diff' on files while they are changing. */ if (current->buffered <= file_size) { file_block_read (current, file_size + 1 - current->buffered); if (current->buffered <= file_size) return; } } /* It's not a regular file, or it's a growing regular file; read it, growing the buffer as needed. */ file_block_read (current, current->bufsize - current->buffered); if (current->buffered) { while (current->buffered == current->bufsize) { if (PTRDIFF_MAX / 2 - sizeof (word) < current->bufsize) xalloc_die (); current->bufsize *= 2; current->buffer = xrealloc (current->buffer, current->bufsize); file_block_read (current, current->bufsize - current->buffered); } /* Allocate just enough room for appended newline plus word sentinel, plus word-alignment. */ cc = current->buffered + 2 * sizeof (word); current->bufsize = cc - cc % sizeof (word); current->buffer = xrealloc (current->buffer, current->bufsize); } } /* Split the file into lines, simultaneously computing the equivalence class for each line. */ static void find_and_hash_each_line (struct file_data *current, const char** ifs, int index, argslist *argl) { hash_value h; unsigned char const *p = (unsigned char const *) current->prefix_end; unsigned char *eof, c; lin i, *bucket; size_t length; /* Cache often-used quantities in local variables to help the compiler. */ int ignore_case = argl->optmask & _SI_MASK; const struct numfmt* pnf = (index) ? &argl->nf2 : &argl->nf1; unsigned char* ghostmask = (index) ? argl->ghostmask2 : argl->ghostmask1; unsigned char* pblurmask = (index) ? argl->pblurmask2 : argl->pblurmask1; unsigned char* tblurmask = (index) ? argl->tblurmask2 : argl->tblurmask1; char const **linbuf = current->linbuf; lin alloc_lines = current->alloc_lines; lin line = 0; lin linbuf_base = current->linbuf_base; lin *cureqs = xmalloc (alloc_lines * sizeof *cureqs); struct equivclass *eqs = equivs; lin eqs_index = equivs_index; lin eqs_alloc = equivs_alloc; char const *suffix_begin = current->suffix_begin; char const *bufend = FILE_BUFFER (current) + current->buffered; const unsigned long fieldno_upper_limit = FIELDMASK_SIZE*8; while ((char const *) p < suffix_begin) { char const *ip = (char const *) p; unsigned long fieldno; hash_value htmp; /* Hash this line until we find a newline. */ /* First we have to initialize `p' so that it points */ /* to the first character of the first field */ h = 0; p = (unsigned char const*)string_spn ((const char*)p, ifs, '\n'); for (fieldno = 0; fieldno < fieldno_upper_limit && *p != '\n'; fieldno++) { eof = (unsigned char*) string_cspn ((const char*) p, ifs, '\n'); /* We have to mark the end of the field before calling hcxnum() or acxnum(). But before doing this, we save the original character placed just after the field. */ c = *eof; *eof = '\0'; if ( (ghostmask[fieldno >> 3] & 0x80 >> (fieldno & 0x7)) ) { /* If the field lies in the ranges specified by the option -X, then it must be ignored. */ p = (unsigned char const *) eof; } else if ( (tblurmask[fieldno >> 3] & 0x80 >> (fieldno & 0x7)) ) { /* If the field lies in the ranges specified by the option -Z, then it must be always blurred, even if it is not numeric. */ h = HASH (h, NEWLINE); p = (unsigned char const *) eof; } else if ( (pblurmask[fieldno >> 3] & 0x80 >> (fieldno & 0x7)) ) { if ((unsigned char*) acxnum ((char*)p, pnf) < eof) { /* If the field is not numeric, then it must be hashed byte by byte, even if it lies in the ranges specified by the option -z. */ if ((ignore_case)) for(; (unsigned char*)p < eof; h = HASH (h, TOLOWER (*p)), p++); else for(; (unsigned char*)p < eof; h = HASH (h, *p), p++); } else { /* If the field is numeric AND lies in the ranges specified by -z, then this field has to be hashed as a special symbol. */ h = HASH (h, NEWLINE); p = (unsigned char const *) eof; } } else { /* If the field does not lie in the ranges specified by -z, -X and -Z, then this field must be always hashed byte by byte (particular numerical formats are converted before to the standard one). */ htmp = h; if ((unsigned char*) hcxnum ((char*)p, pnf, &htmp) < eof) { if ((ignore_case)) for(; (unsigned char*)p < eof; h = HASH (h, TOLOWER (*p)), p++); else for(; (unsigned char*)p < eof; h = HASH (h, *p), p++); } else { h = htmp; p = (unsigned char const *) eof; } } /* Now `p' points to the end of the field */ *eof = c; p = (unsigned char const*)string_spn ((const char*)p, ifs, '\n'); /* And now to the beginning of the next field */ } if (fieldno >= fieldno_upper_limit) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } p++; /* hashing_done:; */ bucket = &buckets[h % nbuckets]; length = (char const *) p - ip - 1; #ifdef _DEBUG_HASHING_ fprintf (stderr, "File: \"%s\"\nLine: \"%.*s\"\nHash: %u\n", current->name, length, ip, h); #endif /* _DEBUG_HASHING_ */ for (i = *bucket; ; i = eqs[i].next) if (!i) { /* Create a new equivalence class in this bucket. */ i = eqs_index++; if (i == eqs_alloc) { if (PTRDIFF_MAX / (2 * sizeof *eqs) <= eqs_alloc) xalloc_die (); eqs_alloc *= 2; eqs = xrealloc (eqs, eqs_alloc * sizeof *eqs); } eqs[i].next = *bucket; eqs[i].hash = h; eqs[i].line = ip; eqs[i].length = length; eqs[i].file = index; *bucket = i; break; } else if (eqs[i].hash == h) { char const *eqline = eqs[i].line; /* Reuse existing class if lines_differ reports the lines equal. */ if (eqs[i].length == length) { /* Reuse existing equivalence class if the lines are identical. This detects the common case of exact identity faster than lines_differ would. */ if (memcmp (eqline, ip, length) == 0) break; } if (! lines_differ (eqline, ip, eqs[i].file, index, argl) ) break; } /* Maybe increase the size of the line table. */ if (line == alloc_lines) { /* Double (alloc_lines - linbuf_base) by adding to alloc_lines. */ if (PTRDIFF_MAX / 3 <= alloc_lines || PTRDIFF_MAX / sizeof *cureqs <= 2 * alloc_lines - linbuf_base || PTRDIFF_MAX / sizeof *linbuf <= alloc_lines - linbuf_base) xalloc_die (); alloc_lines = 2 * alloc_lines - linbuf_base; cureqs = xrealloc (cureqs, alloc_lines * sizeof *cureqs); linbuf += linbuf_base; linbuf = xrealloc (linbuf, (alloc_lines - linbuf_base) * sizeof *linbuf); linbuf -= linbuf_base; } linbuf[line] = ip; cureqs[line] = i; ++line; } current->buffered_lines = line; for (i = 0; ; i++) { /* Record the line start for lines in the suffix that we care about. Record one more line start than lines, so that we can compute the length of any buffered line. */ if (line == alloc_lines) { /* Double (alloc_lines - linbuf_base) by adding to alloc_lines. */ if (PTRDIFF_MAX / 3 <= alloc_lines || PTRDIFF_MAX / sizeof *cureqs <= 2 * alloc_lines - linbuf_base || PTRDIFF_MAX / sizeof *linbuf <= alloc_lines - linbuf_base) xalloc_die (); alloc_lines = 2 * alloc_lines - linbuf_base; linbuf += linbuf_base; linbuf = xrealloc (linbuf, (alloc_lines - linbuf_base) * sizeof *linbuf); linbuf -= linbuf_base; } linbuf[line] = (char const *) p; if ((char const *) p == bufend) { /* If the last line is incomplete, don't count its appended newline. */ if ((current->missing_newline)) linbuf[line]--; break; } if ((suppress_common_lines)) break; line++; while (*p++ != '\n') continue; } /* Done with cache in local variables. */ current->linbuf = linbuf; current->valid_lines = line; current->alloc_lines = alloc_lines; current->equivs = cureqs; equivs = eqs; equivs_alloc = eqs_alloc; equivs_index = eqs_index; #ifdef _DEBUG_HASHING_ if (1) { size_t n; lin j; fprintf (stderr, "buckets[-1] = %ld\n", buckets[-1]); for (n = 0; n < nbuckets; n++) fprintf (stderr, "buckets[%zu] = %ld\n", n, buckets[n]); for (n = 0; n < equivs_alloc; n++) fprintf (stderr, "equivs[%zu] = {next = %d, hash = %lu, line = %s, length = %zu, file = %d}\n", n, equivs[n].next, equivs[n].hash, equivs[n].line, equivs[n].length, equivs[n].file); char const **linbuf = current->linbuf; lin alloc_lines = current->alloc_lines; fprintf (stderr, "current->linbuf_base = %ld, current->buffered_lines = %ld,\n current->valid_lines = %ld, current->alloc_lines = %ld\n", current->linbuf_base, current->buffered_lines, current->valid_lines, current->alloc_lines); for ( j = current->linbuf_base; j < current->alloc_lines; j++ ) fprintf (stderr, "current->linbuf[%ld] = %s\n", j, current->linbuf[j]); fprintf (stderr, " current->equivs = "); for ( j = 0; j < current->buffered_lines; j++ ) fprintf (stderr, "%ld ", current->equivs[j]); fputs ("\n", stderr); } #endif /* _DEBUG_HASHING_ */ } /* Prepare the text. Make sure the text end is initialized. Make sure text ends in a newline, but remember that we had to add one. */ static void prepare_text (struct file_data *current) { size_t buffered = current->buffered; char *p = FILE_BUFFER (current); if (buffered == 0 || p[buffered - 1] == '\n') current->missing_newline = 0; else { p[buffered++] = '\n'; current->missing_newline = 1; } if (!p) return; /* Don't use uninitialized storage when planting or using sentinels. */ memset (p + buffered, 0, sizeof (word)); current->buffered = buffered; } /* We have found N lines in a buffer of size S; guess the proportionate number of lines that will be found in a buffer of size T. However, do not guess a number of lines so large that the resulting line table might cause overflow in size calculations. */ static lin guess_lines (lin n, size_t s, size_t t) { size_t guessed_bytes_per_line = n < 10 ? 32 : s / (n - 1); lin guessed_lines = MAX (1, t / guessed_bytes_per_line); return MIN (guessed_lines, PTRDIFF_MAX / (2 * sizeof (char *) + 1) - 5) + 5; } /* Given a vector of two file_data objects, find the identical prefixes and suffixes of each object. */ static void find_identical_ends (struct file_data filevec[]) { word *w0, *w1; char *p0, *p1, *buffer0, *buffer1; char const *end0, *beg0; char const **linbuf0, **linbuf1; lin i, lines; size_t n0, n1; lin alloc_lines0, alloc_lines1; lin buffered_prefix, prefix_count, prefix_mask; lin middle_guess, suffix_guess; slurp (&filevec[0]); prepare_text (&filevec[0]); if (filevec[0].desc != filevec[1].desc) { slurp (&filevec[1]); prepare_text (&filevec[1]); } else { filevec[1].buffer = filevec[0].buffer; filevec[1].bufsize = filevec[0].bufsize; filevec[1].buffered = filevec[0].buffered; filevec[1].missing_newline = filevec[0].missing_newline; } /* Find identical prefix. */ w0 = filevec[0].buffer; w1 = filevec[1].buffer; p0 = buffer0 = (char *) w0; p1 = buffer1 = (char *) w1; n0 = filevec[0].buffered; n1 = filevec[1].buffered; if (p0 == p1) /* The buffers are the same; sentinels won't work. */ p0 = p1 += n1; else { /* Insert end sentinels, in this case characters that are guaranteed to make the equality test false, and thus terminate the loop. */ if (n0 < n1) p0[n0] = ~p1[n0]; else p1[n1] = ~p0[n1]; /* Loop until first mismatch, or to the sentinel characters. */ /* Compare a word at a time for speed. */ while (*w0 == *w1) w0++, w1++; /* Do the last few bytes of comparison a byte at a time. */ p0 = (char *) w0; p1 = (char *) w1; while (*p0 == *p1) p0++, p1++; /* Don't mistakenly count missing newline as part of prefix. */ if ((buffer0 + n0 - filevec[0].missing_newline < p0) != (buffer1 + n1 - filevec[1].missing_newline < p1)) p0--, p1--; } /* Now P0 and P1 point at the first nonmatching characters. */ /* Skip back to last line-beginning in the prefix */ while (p0 != buffer0 && p0[-1] != '\n') p0--, p1--; /* Record the prefix. */ filevec[0].prefix_end = p0; filevec[1].prefix_end = p1; /* Find identical suffix. */ /* P0 and P1 point beyond the last chars not yet compared. */ p0 = buffer0 + n0; p1 = buffer1 + n1; if (filevec[0].missing_newline == filevec[1].missing_newline) { end0 = p0; /* Addr of last char in file 0. */ /* Get value of P0 at which we should stop scanning backward: this is when either P0 or P1 points just past the last char of the identical prefix. */ beg0 = filevec[0].prefix_end + (n0 < n1 ? 0 : n0 - n1); /* Scan back until chars don't match or we reach that point. */ while (p0 != beg0) if (*--p0 != *--p1) { /* Point at the first char of the matching suffix. */ ++p0, ++p1; beg0 = p0; break; } /* Are we at a line-beginning in both files? If not, add the rest of this line to the main body. Discard one line, because shift_boundaries may need it. */ i = !((buffer0 == p0 || p0[-1] == '\n') && (buffer1 == p1 || p1[-1] == '\n')); while (i-- && p0 != end0) while (*p0++ != '\n') continue; p1 += p0 - beg0; } /* Record the suffix. */ filevec[0].suffix_begin = p0; filevec[1].suffix_begin = p1; /* Calculate number of lines of prefix to save. prefix_count == 0 means save the whole prefix; we need this for options that output the whole file. Otherwise, prefix_count == 1 and the prefix is not saved. */ if (suppress_common_lines && 0 < n0) { middle_guess = guess_lines (0, 0, p0 - filevec[0].prefix_end); suffix_guess = guess_lines (0, 0, buffer0 + n0 - p0); prefix_count = 1; alloc_lines0 = (prefix_count + middle_guess); } else { prefix_count = 0; alloc_lines0 = guess_lines (0, 0, n0); } prefix_mask = prefix_count - 1; lines = 0; linbuf0 = xmalloc (alloc_lines0 * sizeof *linbuf0); p0 = buffer0; /* If the prefix is needed, find the prefix lines. */ if (! (suppress_common_lines && filevec[0].prefix_end == p0 && filevec[1].prefix_end == p1)) { end0 = filevec[0].prefix_end; while (p0 != end0) { lin l = lines++ & prefix_mask; if (l == alloc_lines0) { if (PTRDIFF_MAX / (2 * sizeof *linbuf0) <= alloc_lines0) xalloc_die (); alloc_lines0 *= 2; linbuf0 = xrealloc (linbuf0, alloc_lines0 * sizeof *linbuf0); } linbuf0[l] = p0; while (*p0++ != '\n') continue; } } /* buffered_prefix = prefix_count && 0 < lines ? 0 : lines; */ buffered_prefix = (prefix_count) ? 0 : lines; /* Allocate line buffer 1. */ middle_guess = guess_lines (lines, p0 - buffer0, p1 - filevec[1].prefix_end); suffix_guess = guess_lines (lines, p0 - buffer0, buffer1 + n1 - p1); alloc_lines1 = buffered_prefix + middle_guess; if (alloc_lines1 < buffered_prefix || PTRDIFF_MAX / sizeof *linbuf1 <= alloc_lines1) xalloc_die (); linbuf1 = xmalloc (alloc_lines1 * sizeof *linbuf1); /* Initialize line buffer 1 from line buffer 0. */ for (i = 0; i < buffered_prefix; i++) linbuf1[i] = linbuf0[i] - buffer0 + buffer1; /* Record the line buffer, adjusted so that linbuf[0] points at the first differing line. */ filevec[0].linbuf = linbuf0 + buffered_prefix; filevec[1].linbuf = linbuf1 + buffered_prefix; filevec[0].linbuf_base = filevec[1].linbuf_base = - buffered_prefix; filevec[0].alloc_lines = alloc_lines0 - buffered_prefix; filevec[1].alloc_lines = alloc_lines1 - buffered_prefix; filevec[0].prefix_lines = filevec[1].prefix_lines = lines; } /* If 1 < k, then (2**k - prime_offset[k]) is the largest prime less than 2**k. This table is derived from Chris K. Caldwell's list . */ static unsigned char const prime_offset[] = { 0, 0, 1, 1, 3, 1, 3, 1, 5, 3, 3, 9, 3, 1, 3, 19, 15, 1, 5, 1, 3, 9, 3, 15, 3, 39, 5, 39, 57, 3, 35, 1, 5, 9, 41, 31, 5, 25, 45, 7, 87, 21, 11, 57, 17, 55, 21, 115, 59, 81, 27, 129, 47, 111, 33, 55, 5, 13, 27, 55, 93, 1, 57, 25 }; /* Verify that this host's size_t is not too wide for the above table. */ verify (enough_prime_offsets, sizeof (size_t) * CHAR_BIT <= sizeof prime_offset); extern char** def_ifs; /* Given a vector of two file_data objects, read the file associated with each one, and build the table of equivalence classes. Return nonzero if either file appears to be a binary file. */ bool read_files (struct file_data filevec[], argslist* argl) { int i; bool appears_binary = sip (&filevec[0], 0); char **ifs1, **ifs2; ifs1 = (!argl->ifs1) ? def_ifs : argl->ifs1; ifs2 = (!argl->ifs2) ? def_ifs : argl->ifs2; if (filevec[0].desc != filevec[1].desc) appears_binary |= sip (&filevec[1], appears_binary); /*# skip test if appears_binary is already !0 #*/ /* else */ /* { */ /* filevec[1].buffer = filevec[0].buffer; */ /* filevec[1].bufsize = filevec[0].bufsize; */ /* filevec[1].buffered = filevec[0].buffered; */ /* } */ if (appears_binary) return 1; find_identical_ends (filevec); equivs_alloc = filevec[0].alloc_lines + filevec[1].alloc_lines + 1; if (PTRDIFF_MAX / sizeof *equivs <= equivs_alloc) xalloc_die (); equivs = xmalloc (equivs_alloc * sizeof *equivs); /* Equivalence class 0 is permanently safe for lines that were not hashed. Real equivalence classes start at 1. */ equivs_index = 1; /* Allocate (one plus) a prime number of hash buckets. Use a prime number between 1/3 and 2/3 of the value of equiv_allocs, approximately. */ for (i = 9; (size_t) 1 << i < equivs_alloc / 3; i++) continue; nbuckets = ((size_t) 1 << i) - prime_offset[i]; if (PTRDIFF_MAX / sizeof *buckets <= nbuckets) xalloc_die (); buckets = zalloc ((nbuckets + 1) * sizeof *buckets); buckets++; find_and_hash_each_line (&filevec[0], (const char**) ifs1, 0, argl); find_and_hash_each_line (&filevec[1], (const char**) ifs2, 1, argl); filevec[0].equiv_max = filevec[1].equiv_max = equivs_index; free (equivs); free (buckets - 1); return 0; } ./numdiff-5.8.1/README0000444000175000017500000000276712215353073013217 0ustar ivanoivano Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. *********************************************************************************** Numdiff ~~~~~~~ This README file is distributed together with the source code of Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Numdiff is Copyright (C) of Ivano Primi , which is also its author. Numdiff (also written numdiff) 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. Numdiff 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 in a file called COPYING. If not, see . Detailed instructions on how to install Numdiff can be found in the file INSTALL. The full documentation of Numdiff can be found in the directory ./docs . ./numdiff-5.8.1/ndselect.h0000444000175000017500000000562512215353073014305 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #ifndef _NDSELECT_H_ #define _NDSELECT_H_ #include"config.h" /* Error codes */ #define OPEN_ERROR -1 #define READ_ERROR -2 #define CLOSE_ERROR -3 typedef struct { /* Mask of the options */ unsigned long optmask; /* Begin, end, step */ unsigned long begin_line, end_line, step; /* First field, last field, increment */ unsigned long first_field, last_field, increment; /* Internal fields separators */ char **ifs; /* Output separator */ char *osep; /* File to read from */ const char *file; } Argslist ; /* A structure of this type is used to store the options */ /* set by the user */ #define ___H_MASK 0x00000001 /* -h option, used to recall help */ #define ___B_MASK 0x00000002 /* -b option, used to set the start line */ #define ___E_MASK 0x00000004 /* -e option, used to set the end line */ #define ___S_MASK 0x00000008 /* -s option, used to explicitly set the step */ #define ___SF_MASK 0x00000010 /* -F option, used to set the first field to display */ #define ___SL_MASK 0x00000020 /* -L option, used to set the last field to display */ #define ___SI_MASK 0x00000040 /* -I option, used to explicitly set the increment */ #define ___SS_MASK 0x00000080 /* -S option, used to explicitly set IFS */ #define ___SD_MASK 0x00000100 /* -D option, used to explicitly set IFS */ #define ___SO_MASK 0x00000200 /* -O option, used to set the output separator */ #define ___X_MASK 0x00000400 /* -x option, to omit empty lines */ #define ___V_MASK 0x00000800 /* -v option, used to show version number, Copyright and No-Warranty */ /* I18N and L10N support */ #ifdef ENABLE_NLS #include #define _(String) gettext (String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) #else #define _(String) (String) #define N_(String) String #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif #ifndef PACKAGE2 #define PACKAGE2 "ndselect" #endif #ifndef LOCALEDIR #define LOCALEDIR "/usr/local/share/locale/" #endif #endif /* _NDSELECT_H_ */ ./numdiff-5.8.1/setmode.c0000644000175000017500000000322412215353073014132 0ustar ivanoivano/* Set a file descriptor's mode to binary or to text. Copyright (C) 2001 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Paul Eggert */ #if HAVE_CONFIG_H # include #endif #if HAVE_STDBOOL_H # include #else typedef enum {false = 0, true = 1} bool; #endif #if HAVE_SETMODE_DOS # include # if HAVE_FCNTL_H # include # endif # if HAVE_UNISTD_H # include # endif #endif #include "setmode.h" #undef set_binary_mode /* Set the binary mode of FD to MODE, returning its previous mode. MODE is 1 for binary and 0 for text. If setting the mode might cause problems, ignore the request and return MODE. Always return 1 on POSIX platforms, which do not distinguish between text and binary. */ bool set_binary_mode (int fd, bool mode) { #if HAVE_SETMODE_DOS if (isatty (fd)) return mode; return setmode (fd, mode ? O_BINARY : O_TEXT) != O_TEXT; #else return 1; #endif } ./numdiff-5.8.1/exitfail.h0000644000175000017500000000150312215353073014302 0ustar ivanoivano/* Failure exit status Copyright (C) 2002 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 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ extern int volatile exit_failure; ./numdiff-5.8.1/getopt.h0000644000175000017500000001745312215353073014012 0ustar ivanoivano/* Declarations for getopt. Copyright (C) 1989-1994,1996-1999,2001,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif /* Standalone applications should #define __GETOPT_PREFIX to an identifier that prefixes the external functions and variables defined in this header. When this happens, include the headers that might declare getopt so that they will not cause confusion if included after this file. Then systematically rename identifiers so that they do not collide with the system functions and variables. Renaming avoids problems with some compilers and linkers. */ #if defined __GETOPT_PREFIX && !defined __need_getopt # include # include # if HAVE_UNISTD_H # include # endif # undef __need_getopt # undef getopt # undef getopt_long # undef getopt_long_only # undef optarg # undef opterr # undef optind # undef optopt # define __GETOPT_CONCAT(x, y) x ## y # define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) # define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) # define getopt __GETOPT_ID (getopt) # define getopt_long __GETOPT_ID (getopt_long) # define getopt_long_only __GETOPT_ID (getopt_long_only) # define optarg __GETOPT_ID (optarg) # define opterr __GETOPT_ID (opterr) # define optind __GETOPT_ID (optind) # define optopt __GETOPT_ID (optopt) #endif /* Standalone applications get correct prototypes for getopt_long and getopt_long_only; they declare "char **argv". libc uses prototypes with "char *const *argv" that are incorrect because getopt_long and getopt_long_only can permute argv; this is required for backward compatibility (e.g., for LSB 2.0.1). This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt', but it caused redefinition warnings if both unistd.h and getopt.h were included, since unistd.h includes getopt.h having previously defined __need_getopt. The only place where __getopt_argv_const is used is in definitions of getopt_long and getopt_long_only below, but these are visible only if __need_getopt is not defined, so it is quite safe to rewrite the conditional as follows: */ #if !defined __need_getopt # if defined __GETOPT_PREFIX # define __getopt_argv_const /* empty */ # else # define __getopt_argv_const const # endif #endif /* If __GNU_LIBRARY__ is not already defined, either we are being used standalone, or this is the first header included in the source file. If we are being used with glibc, we need to include , but that does not exist if we are standalone. So: if __GNU_LIBRARY__ is not defined, include , which will pull in for us if it's from glibc. (Why ctype.h? It's guaranteed to exist and it doesn't flood the namespace with stuff the way some other headers do.) */ #if !defined __GNU_LIBRARY__ # include #endif #ifndef __THROW # ifndef __GNUC_PREREQ # define __GNUC_PREREQ(maj, min) (0) # endif # if defined __cplusplus && __GNUC_PREREQ (2,8) # define __THROW throw () # else # define __THROW # endif #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { const char *name; /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) __THROW; #ifndef __need_getopt extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW; extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW; #endif #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ ./numdiff-5.8.1/cmpfns.c0000444000175000017500000004410412215353073013760 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include #include #include #include #include"numdiff.h" #include"linesplit.h" /* See io.c */ extern char* read_line (FILE* pf, int* errcode); extern void print_lines (const char* line1, const char* line2, unsigned long lineno1, unsigned long lineno2, int delimiter_only); extern void print_fields (const char* field1, const char* field2, size_t l1, size_t l2, unsigned long lineno1, unsigned long lineno2, unsigned long fieldno1, unsigned long fieldno2); extern void print_errors (Real abserr, Real relerr); extern void print_separator (void); static void field2cx (const char* field, size_t length, char** tail, int iscale, const struct numfmt* pnf, Complex* pz) { char* ptr = (char*) field; char ch; ch = ptr[length]; ptr[length] = '\0'; str2C (ptr, tail, iscale, pnf, pz); ptr[length] = ch; } /* Be careful ! strNcmp() and strNcasecmp() are only used when n <= strlen (s) == strlen (t). */ static int strNcmp (const char* s, const char* t, size_t n) { const char *p, *q; for (p = s, q = t; p < s + n && *p == *q; p++, q++); return p < s + n; } static int strNcasecmp (const char* s, const char* t, size_t n) { const char *p, *q; for (p = s, q = t; p < s + n && TOLOWER(*p) == TOLOWER(*q); p++, q++); return p < s + n; } static int cmp_fields (const char* field1, const char* field2, unsigned long fieldno1, unsigned long fieldno2, size_t l1, size_t l2, argslist* argl, Real* abserr, Real* relerr) { char *tail1, *tail2; Complex z1, z2; field2cx (field1, l1, &tail1, argl->iscale, &argl->nf1, &z1); field2cx (field2, l2, &tail2, argl->iscale, &argl->nf2, &z2); #ifdef __DEBUG__ fprintf (stderr, "l1 = %zu, tail1 - field1 = %zu\n", l1, tail1 - field1); fprintf (stderr, "l2 = %zu, tail2 - field2 = %zu\n", l2, tail2 - field2); #endif if (tail1 - field1 == l1 && tail2 - field2 == l2) { /* This second test manages the options -P and -N . If neither of them has been set, then the condition is always TRUE. */ if ( (smart_cmp (&z2, &z1, argl->flag)) ) { int exit_code; /* Numeric comparison */ Complex w; Real x1, x2; int iscale = argl->iscale; initC (&w); initR (&x1); initR (&x2); Csub (z1, z2, &w, iscale); Cabs (w, abserr, iscale); #ifdef _MPA_DEBUG fputs ("*** MPA Debug output\n", stderr); fputs ("1st number= ( ", stderr); debug_printno (z1.re, 20); fputs (", ", stderr); debug_printno (z1.im, 20); fputs (" )\n", stderr); fputs ("2nd number= ( ", stderr); debug_printno (z2.re, 20); fputs (", ", stderr); debug_printno (z2.im, 20); fputs (" )\n", stderr); fputs ("abs. err= ", stderr); debug_printno (*abserr, 20); fputs ("\n*** *** ***\n", stderr); #endif if (argl->relerr_formula == CLASSIC_FORMULA) { Cabs (z1, &x1, iscale); Cabs (z2, &x2, iscale); if ( cmp (x1, x2) > 0 ) copyR (&x1, x2); if ( (is0(x1)) ) (is0(*abserr)) ? copyR(relerr, Zero) : copyR(relerr, Inf); else divide (*abserr, x1, relerr, iscale); } else if (argl->relerr_formula == WR_TO_FIRST_FILE) { Cabs (z1, &x1, iscale); if ( (is0(x1)) ) (is0(*abserr)) ? copyR(relerr, Zero) : copyR(relerr, Inf); else divide (*abserr, x1, relerr, iscale); } else if (argl->relerr_formula == WR_TO_SECOND_FILE) { Cabs (z2, &x2, iscale); if ( (is0(x2)) ) (is0(*abserr)) ? copyR(relerr, Zero) : copyR(relerr, Inf); else divide (*abserr, x2, relerr, iscale); } delR (&x2); delR (&x1); delC (&w); delC (&z2); delC (&z1); if (!(argl->optmask & _2_MASK)) exit_code = thrlist_cmp (*relerr, argl->maxrelerr, fieldno1, fieldno2) > 0 && thrlist_cmp (*abserr, argl->maxabserr, fieldno1, fieldno2) > 0 ? 2:0; else exit_code = thrlist_cmp (*relerr, argl->maxrelerr, fieldno1, fieldno2) > 0 || thrlist_cmp (*abserr, argl->maxabserr, fieldno1, fieldno2) > 0 ? 2:0; if ((argl->optmask & _SS_MASK)) { argl->Nentries++; initR (&x1); initR (&x2); /* To compute the 1-norm of all errors */ add (*abserr, argl->N1abserr, &x1, iscale); copyR (&argl->N1abserr, x1); /* To compute the 2-norm of all errors */ square (*abserr, &x1, iscale); add (x1, argl->N2abserr, &x2, iscale); copyR (&argl->N2abserr, x2); if ((exit_code)) { int test; argl->Ndisperr++; /* To compute the 1-norm of the displayed errors */ add (*abserr, argl->N1disperr, &x1, iscale); copyR (&argl->N1disperr, x1); /* To compute the 2-norm of the displayed errors */ square (*abserr, &x1, iscale); add (x1, argl->N2disperr, &x2, iscale); copyR (&argl->N2disperr, x2); if ((test = cmp (*abserr, argl->Labserr)) > 0) { copyR (&argl->Labserr, *abserr); copyR (&argl->Crelerr, *relerr); } else if (test == 0 && cmp (*relerr, argl->Crelerr) > 0) copyR (&argl->Crelerr, *relerr); if ((test = cmp (*relerr, argl->Lrelerr)) > 0) { copyR (&argl->Lrelerr, *relerr); copyR (&argl->Cabserr, *abserr); } else if (test == 0 && cmp (*abserr, argl->Cabserr) > 0) copyR (&argl->Cabserr, *abserr); } delR (&x2); delR (&x1); } return exit_code; } else return 0; } else { delC (&z2); delC (&z1); /* Byte by byte comparison */ if ((argl->optmask & _SI_MASK)) return (l1 != l2 || strNcasecmp (field1, field2, l1) != 0 ? 1 : 0); else return (l1 != l2 || strNcmp (field1, field2, l1) != 0 ? 1 : 0); } } static int cmp_lines (const char* line1, const char* line2, unsigned long lineno1, unsigned long lineno2, const char** ifs1, const char** ifs2, int output_mode, argslist* argl) { const unsigned long fieldno_upper_limit = 8*FIELDMASK_SIZE; if (!line1 && !line2) return 0; else if (!line1) { if (output_mode >= OUTMODE_NORMAL) print_lines (line1, line2, lineno1, lineno2, 0); return 1; } else if (!line2) { if (output_mode >= OUTMODE_NORMAL) print_lines (line1, line2, lineno1, lineno2, 0); return 1; } else { const char *field1, *field2; char *end_field1, *end_field2; size_t l1, l2; unsigned long fieldno1, fieldno2; Real abserr, relerr; int rv, lines_differ = 0, _1sttime = 1; initR (&abserr); initR (&relerr); field1 = string_spn (line1, ifs1, '\0'); field2 = string_spn (line2, ifs2, '\0'); fieldno1 = fieldno2 = 0; while (*field1 != '\0' && *field2 != '\0') { /* Ignore the fields selected through the option -X 1: */ while ( *field1 != '\0' && fieldno1 < fieldno_upper_limit && (argl->ghostmask1[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { end_field1 = string_cspn (field1, ifs1, '\0'); field1 = string_spn (end_field1, ifs1, '\0'); fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno1, argl->file1); exit (EXIT_TROUBLE); } /* Ignore the fields selected through the option -X 2: */ while ( *field2 != '\0' && fieldno2 < fieldno_upper_limit && (argl->ghostmask2[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { end_field2 = string_cspn (field2, ifs2, '\0'); field2 = string_spn (end_field2, ifs2, '\0'); fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno2, argl->file2); exit (EXIT_TROUBLE); } if (*field1 != '\0' && *field2 != '\0') { end_field1 = string_cspn (field1, ifs1, '\0'); end_field2 = string_cspn (field2, ifs2, '\0'); l1 = end_field1 - field1; l2 = end_field2 - field2; rv = cmp_fields (field1, field2, fieldno1, fieldno2, l1, l2, argl, &abserr, &relerr); if ( rv >= 1 ) { if ( (output_mode > OUTMODE_QUIET) && !(rv == 1 && argl->optmask & _SE_MASK) && !(rv == 2 && argl->optmask & _SU_MASK)) { if ((_1sttime)) { print_lines (line1, line2, lineno1, lineno2, output_mode != OUTMODE_VERBOSE && output_mode != OUTMODE_COINCISE); _1sttime = 0; } print_fields (field1, field2, l1, l2, lineno1, lineno2, fieldno1, fieldno2); if ( rv == 2 ) print_errors (abserr, relerr); else print_separator (); } lines_differ = 1; } field1 = string_spn (end_field1, ifs1, '\0'); fieldno1++; field2 = string_spn (end_field2, ifs2, '\0'); fieldno2++; } } /* end while (*field1 != '\0' && *field2 != '\0') */ delR (&abserr); delR (&relerr); /* Ignore the fields selected through the option -X 1: */ while ( *field1 != '\0' && fieldno1 < fieldno_upper_limit && (argl->ghostmask1[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { end_field1 = string_cspn (field1, ifs1, '\0'); field1 = string_spn (end_field1, ifs1, '\0'); fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno1, argl->file1); exit (EXIT_TROUBLE); } /* Ignore the fields selected through the option -X 2: */ while ( *field2 != '\0' && fieldno2 < fieldno_upper_limit && (argl->ghostmask2[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { end_field2 = string_cspn (field2, ifs2, '\0'); field2 = string_spn (end_field2, ifs2, '\0'); fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno2, argl->file2); exit (EXIT_TROUBLE); } if (*field1 != '\0') { if (output_mode >= OUTMODE_NORMAL) { if ((_1sttime)) { print_lines (line1, line2, lineno1, lineno2, output_mode < OUTMODE_VERBOSE); _1sttime = 0; } print_fields (field1, field2, 0, 0, lineno1, lineno2, fieldno1, fieldno2); printf (_("@ Line %lu in file \"%s\" is shorter than expected!\n"), lineno2, argl->file2); } return 1; } else if (*field2 != '\0') { if (output_mode >= OUTMODE_NORMAL) { if ((_1sttime)) { print_lines (line1, line2, lineno1, lineno2, output_mode < OUTMODE_VERBOSE); _1sttime = 0; } print_fields (field1, field2, 0, 0, lineno1, lineno2, fieldno1, fieldno2); printf (_("@ Line %lu in file \"%s\" is shorter than expected!\n"), lineno1, argl->file1); } return 1; } else return lines_differ; } } extern char** def_ifs; int cmp_files (FILE* pf1, FILE* pf2, argslist* argl) { char *line1, *line2, **ifs1, **ifs2; int err1, err2, files_differ = 0; unsigned long lineno1 = 1, lineno2 = 1; size_t n; unsigned short i; unsigned char byte, elem; flg_array table = copy_of_intflagtab(); ifs1 = (!argl->ifs1) ? def_ifs : argl->ifs1; ifs2 = (!argl->ifs2) ? def_ifs : argl->ifs2; if ( (table.ptr) ) { /* Filter on */ for (n = 0, err1 = err2 = OK; n < table.len; n += 4U) { byte = table.ptr[n/4U]; for (i = 0; i < 4U; i++) { elem = (byte & 0x03 << 2*i) >> 2 * i; switch (elem) { case 1: line1 = read_line (pf1, &err1); line2 = NULL; break; case 2: line1 = NULL; line2 = read_line (pf2, &err2); break; case 3: line1 = read_line (pf1, &err1); line2 = read_line (pf2, &err2); break; case 0: goto catch_error; } if ( (cmp_lines (line1, line2, lineno1, lineno2, (const char**) ifs1, (const char**) ifs2, argl->output_mode, argl)) ) { files_differ = 1; if (argl->output_mode == OUTMODE_OVERVIEW) print_1overview_line (line1, 1, line2); } else { if (argl->output_mode == OUTMODE_OVERVIEW && !suppress_common_lines) print_1overview_line (line1, 0, line2); } if ((line1)) { lineno1++; free ((void*)line1); } if ((line2)) { lineno2++; free ((void*)line2); } if (err1 == OUT_OF_MEMORY || err2 == OUT_OF_MEMORY || err1 == FILE_IS_BINARY || err2 == FILE_IS_BINARY || err1 == READING_ERROR || err2 == READING_ERROR) goto catch_error; } } } /* end of `if ( (table.ptr) )'*/ else { /* Filter off */ do { line1 = read_line (pf1, &err1); line2 = read_line (pf2, &err2); if ( (cmp_lines (line1, line2, lineno1, lineno2, (const char**) ifs1, (const char**) ifs2, argl->output_mode, argl)) ) { files_differ = 1; if (argl->output_mode == OUTMODE_OVERVIEW) print_1overview_line (line1, 1, line2); } else { if (argl->output_mode == OUTMODE_OVERVIEW && !suppress_common_lines) print_1overview_line (line1, 0, line2); } if ((line1)) free ((void*)line1); if ((line2)) free ((void*)line2); lineno1++, lineno2++; } while (err1 == OK && err2 == OK); } catch_error: /* * If we arrive here, then * * either ist n == table.len, * or elem == 0, * or either err1 or err2 is different from OK. */ fflush (stdout); if ( (table.ptr) ) { if (n >= table.len || !elem) return files_differ; } if (err1 == OK) { switch (err2) { case FILE_IS_BINARY: fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file2); return FILE_IS_BINARY; case READING_ERROR: fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file2); return READING_ERROR; case OUT_OF_MEMORY: fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file2); return OUT_OF_MEMORY; case LINE_INTERR: if (getc (pf1) == EOF) break; /* default == EOF_REACHED */ default: fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file2, lineno2-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file1, argl->file2); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno1-1, argl->file1); } return files_differ; } else if (err1 == LINE_INTERR) { switch (err2) { case FILE_IS_BINARY: fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file2); return FILE_IS_BINARY; case READING_ERROR: fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file2); return READING_ERROR; case OUT_OF_MEMORY: fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file2); return OUT_OF_MEMORY; case OK: if (getc (pf2) != EOF) { fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file1, lineno1-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file2, argl->file1); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno2-1, argl->file2); } break; case EOF_REACHED: fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file2, lineno2-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file1, argl->file2); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno1-1, argl->file1); /* No particular action to do if err2 == LINE_INTERR */ } return files_differ; } else if (err1 == EOF_REACHED) { switch (err2) { case FILE_IS_BINARY: fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file2); return FILE_IS_BINARY; case READING_ERROR: fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file2); return READING_ERROR; case OUT_OF_MEMORY: fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file2); return OUT_OF_MEMORY; case OK: case LINE_INTERR: fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file1, lineno1-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file2, argl->file1); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno2-1, argl->file2); } return files_differ; } else if (err1 == FILE_IS_BINARY) { fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file1); return FILE_IS_BINARY; } else if (err1 == READING_ERROR) { fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file1); return READING_ERROR; } else /* err1 == OUT_OF_MEMORY */ { fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file1); return OUT_OF_MEMORY; } } ./numdiff-5.8.1/NEWS0000444000175000017500000002122612215353073013025 0ustar ivanoivano5.8.0 --> 5.8.1 (Ivano Primi ) : * The distribution terms of the documentation have been slightly changed to comply with Debian policies. 5.6.1 --> 5.8.0 (Ivano Primi ) : * Ndselect recognizes now the following additional options: # -O to specify the string to use as separator while writing the selected fields to the standard output, # -D to specify the set of strings to use as delimiters while splitting the input lines into fields. * The long option --separator of Numdiff/Ndselect has been changed to --separators and its help message has been improved. * The options -s of Numdiff and -S of Ndselect recognize and accept now a larger set of escape sequences. * Numdiff can detect now if any of the files to compare is binary and return a suitable error message. * The short form of Numdiff option --dummy is not -D anymore, but -U. * Numdiff accepts now the option --delimiters (short form: -D) to specify the set of strings to use as delimiters while splitting the input lines into fields. * The option --currency of Numdiff now recognizes and accepts escape sequences in its argument. 5.6.0 --> 5.6.1 (Ivano Primi ) : * Added instruction to Makefile.in to create the directory for the man pages in case it does not exist yet. 5.2.1 --> 5.6.0 (Ivano Primi ) : * Several bugs have been corrected: # Fixed improper handling of the last line of a file when no trailing newline is present at its end. # Array overrun in function find_and_hash_each_file. # Fixed two bugs which prevented Numdiff to be built on Cygwin. Thanks to Satish Balay for the report. # Numdiff is not linked anymore against the GNU Multiple Precision Arithmetic Library if --disable-gmp is passed to the configure script. * Numdiff recognizes now the following additional options: # -O for the "overview" mode, # -B to treat the compared files as binary files (only meaningful under MSDog/MSWindog), # -c to set the currency name for the two files to compare, # -F to change the formula used to compute the relative errors. * Added new entries to Numdiff help which explain how to use the new options. * The options -a and -r accept now an extended syntax which allows to specify to which fields the given threshold applies. The option -r does not accept anymore the prefixes 1: and 2: (use -F instead). * Several help messages of Numdiff have been improved. * Several error and warning messages of Numdiff have been improved. * ndselect allows now to select not only the lines but also the fields that have to be printed. It recognizes then the following additional options: # -F to set the number of the first field to print, # -L to set the number of the last field that can be printed, # -I to set the increment to use when selecting the fields to print, # -S to specify the set of characters to use to split the input lines into fields, # -x to avoid to print empty lines. * Added new entries to ndselect help which explain how to use the new options. * Several help messages of ndselect have been improved. * Added man pages for numdiff and ndselect. * Documentation, i18n and italian l10n have been updated. 5.2.0 --> 5.2.1 (Ivano Primi ) : * Corrected a bug which prevented Numdiff to be built on MacOS X(R). Thanks to Antoine Dechaume for the report. 5.0.0 --> 5.2.0 (Ivano Primi ) : * Numdiff uses now the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP) if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option --disable-gmp (or --enable-gmp=no) to the configure script before building the program. After building and installing Numdiff, it is possible to know whether it has been linked against GNU MP or not just by calling the program with the option -v. In case of link against GMP the program tells also which version of GNU MP it uses to perform its computations. 5.0.0 beta4 --> 5.0.0 (Ivano Primi ) : * The filter has been improved, now it gets no more confused if the same value is represented in scientific notation in one file and in common decimal notation in the other file. * The Makefile.in (and consequently the Makefile) has been modified to conform to the GNU Coding Standards. * Now numdiff and ndselect accept long options too (for instance --separator='\n\t %' instead of -s '\n\t %'). * The option -r accepts now an additional parameter which tells to compute the relative differences always with respect to the values in one file, instead of using the classic formula for the relative error. * The argument of the option -f has been made optional. * Documentation, i18n and italian l10n have been updated. 5.0.0 beta1 --> 5.0.0 beta4 (Ivano Primi ) : * Added additional information to the report printed by the option -S. * Now the program can accept the options with argument -z INT, -Z INT, -X INT as short equivalent forms of -z 1:INT -z 2:INT, -Z 1:INT -Z 2:INT and -X 1:INT -X 2:INT respectively. * The option -R has been removed since not useful. * The option -s has now an extended syntax allowing to specify different sets of field delimiters for the two files to compare. * Adoption of the version 1.3 of the GNU Free Documentation License for the TeXinfo documentation. * Now the test programs are not anymore distributed together with the source code of Numdiff. 4.2.0 --> 5.0.0 beta1 (Ivano Primi ) : * Removed the support for double, long double and high precision arithmetic. Now only multiple precision arithmetic is available (but it is not a limitation :) ). * Removed the option -L, since the tool ndselect made it obsolete. * Implemented a synchronization procedure to detect insertions/deletions of lines. To accomplish this, source code from GNU diff (diffutils 2.8.1) has been used (with the necessary modifications). Added the options -f, -z, -Z, -R, -m, -H, -T. * Removed the option -F, -X is now used in place of it. * Added new entries to the help which explain how to use the new options. * The output format has been slightly changed. * Makefile and configuration scripts have been changed, since the code has become much more complex than it was. * Added more tests to check that the new features are correctly working. * Change of the license: from GPL version 2 or later to GPL version 3 or later. The copyright statement of my files has been consequently updated. Also the message shown by 'numdiff -v'. 4.0.0 --> 4.2.0 (Ivano Primi ) : * Changed the way the options -V and -b interact when they are both set. * Added new tests. * Now, when the options -v and -h are both set, Numdiff displays before the information about version, Copyright and NO-Warranty and then the help message. * The Copyright has been updated. * Added the tools `ndfilter' and `ndselect'. * i18n and italian l10n updated. * The documentation has been consequently updated. 3.0.2 --> 4.0.0 (Ivano Primi ) : * New output format. At the same time the code printing the output has been cleaned. * Added the -V option for the "verbose" mode. * Better handling of the last line of a file. * i18n, l10n and documentation have been consequently updated. 3.0.1 --> 3.0.2 (Ivano Primi ) : * The code of the function Cabs() has been improved for both double and long-double precision. * Fixed a compilation error which occurred when one chose to activate the double, the long-double or the high precision instead of the multiple precision arithmetic. This compilation error was introduced just before releasing the version 3.0 of Numdiff . 3.0 --> 3.0.1 (Ivano Primi ) : * The code of the function Cabs() has been modified in order to speed up the execution when working with real numbers (the change concerned only the code for multiple precision arithmetic). 3.0 (Ivano Primi ) : * First public release ./numdiff-5.8.1/number.h0000644000175000017500000001044012215353073013765 0ustar ivanoivano/* number.h: Arbitrary precision numbers header file. */ /* Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 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 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; see the file COPYING. If not, write to: The Free Software Foundation, Inc. 59 Temple Place, Suite 330 Boston, MA 02111-1307 USA. You may contact the author by: e-mail: philnelson@acm.org us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #ifndef _NUMBER_H_ #define _NUMBER_H_ typedef enum {PLUS, MINUS} sign; typedef struct bc_struct *bc_num; typedef struct bc_struct { sign n_sign; int n_len; /* The number of digits before the decimal point. */ int n_scale; /* The number of digits after the decimal point. */ int n_refs; /* The number of pointers to this number. */ bc_num n_next; /* Linked list for available list. */ char *n_ptr; /* The pointer to the actual storage. If NULL, n_value points to the inside of another number (bc_multiply...) and should not be "freed." */ char *n_value; /* The number. Not zero char terminated. May not point to the same place as n_ptr as in the case of leading zeros generated. */ } bc_struct; /* The base used in storing the numbers in n_value above. Currently this MUST be 10. */ #define BASE 10 /* Some useful macros and constants. */ #define CH_VAL(c) (c - '0') #define BCD_CHAR(d) (d + '0') #ifdef MIN #undef MIN #undef MAX #endif #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)>(b)?(b):(a)) #define ODD(a) ((a)&1) #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef LONG_MAX #define LONG_MAX 0x7ffffff #endif /* Global numbers. */ extern bc_num _zero_; extern bc_num _one_; extern bc_num _two_; /* Function Prototypes */ /* Define the _PROTOTYPE macro if it is needed. */ #ifndef _PROTOTYPE #ifdef __STDC__ #define _PROTOTYPE(func, args) func args #else #define _PROTOTYPE(func, args) func() #endif #endif _PROTOTYPE(void bc_init_numbers, (void)); _PROTOTYPE(void bc_end, (void)); /* Added by Ivano Primi, 30/12/2002. */ _PROTOTYPE(bc_num bc_new_num, (int length, int scale)); _PROTOTYPE(void bc_free_num, (bc_num *num)); _PROTOTYPE(bc_num bc_copy_num, (bc_num num)); _PROTOTYPE(void bc_init_num, (bc_num *num)); _PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale)); _PROTOTYPE(char *bc_num2str, (bc_num num)); _PROTOTYPE(void bc_int2num, (bc_num *num, int val)); _PROTOTYPE(long bc_num2long, (bc_num num)); _PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2)); _PROTOTYPE(char bc_is_zero, (bc_num num)); _PROTOTYPE(char bc_is_near_zero, (bc_num num, int scale)); _PROTOTYPE(char bc_is_neg, (bc_num num)); _PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); _PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); _PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale)); _PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale)); _PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result, int scale)); _PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot, bc_num *rem, int scale)); _PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale)); _PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result, int scale)); _PROTOTYPE(int bc_sqrt, (bc_num *num, int scale)); _PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int), int leading_zero)); #endif ./numdiff-5.8.1/shtool0000755000175000017500000042514612215353073013577 0ustar ivanoivano#!/bin/sh ## ## GNU shtool -- The GNU Portable Shell Tool ## Copyright (c) 1994-2008 Ralf S. Engelschall ## ## See http://www.gnu.org/software/shtool/ for more information. ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. ## ## Version: 2.0.8 (18-Jul-2008) ## Contents: all available modules ## ## ## 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, or contact Ralf S. Engelschall . ## ## NOTICE: Given that you include this file verbatim into your own ## source tree, you are justified in saying that it remains separate ## from your package, and that this way you are simply just using GNU ## shtool. So, in this situation, there is no requirement that your ## package itself is licensed under the GNU General Public License in ## order to take advantage of GNU shtool. ## ## ## Usage: shtool [] [ [] []] ## ## Available commands: ## echo Print string with optional construct expansion ## mdate Pretty-print modification time of a file or dir ## table Pretty-print a field-separated list as a table ## prop Display progress with a running propeller ## move Move files with simultaneous substitution ## install Install a program, script or datafile ## mkdir Make one or more directories ## mkln Make link with calculation of relative paths ## mkshadow Make a shadow tree through symbolic links ## fixperm Fix file permissions inside a source tree ## rotate Logfile rotation ## tarball Roll distribution tarballs ## subst Apply sed(1) substitution operations ## platform Platform Identification Utility ## arx Extended archive command ## slo Separate linker options by library class ## scpp Sharing C Pre-Processor ## version Maintain a version information file ## path Deal with program paths ## # maximum Bourne-Shell compatibility if [ ".$ZSH_VERSION" != . ] && (emulate sh) >/dev/null 2>&1; then # reconfigure zsh(1) emulate sh NULLCMD=: alias -g '${1+"$@"}'='"$@"' elif [ ".$BASH_VERSION" != . ] && (set -o posix) >/dev/null 2>&1; then # reconfigure bash(1) set -o posix fi # maximum independence of NLS nuisances for var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $var=C; export $var) 2>&1`"); then eval $var=C; export $var else unset $var fi done # initial command line handling if [ $# -eq 0 ]; then echo "$0:Error: invalid command line" 1>&2 echo "$0:Hint: run \`$0 -h' for usage" 1>&2 exit 1 fi if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then echo "This is GNU shtool, version 2.0.8 (18-Jul-2008)" echo 'Copyright (c) 1994-2008 Ralf S. Engelschall ' echo 'Report bugs to ' echo '' echo 'Usage: shtool [] [ [] []]' echo '' echo 'Available global :' echo ' -v, --version display shtool version information' echo ' -h, --help display shtool usage help page (this one)' echo ' -d, --debug display shell trace information' echo ' -r, --recreate recreate this shtool script via shtoolize' echo '' echo 'Available [] []:' echo ' echo [-n|--newline] [-e|--expand] [ ...]' echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]' echo ' [-f|--field-sep ] [-o|--order ] ' echo ' table [-F|--field-sep ] [-w|--width ] [-c|--columns' echo ' ] [-s|--strip ] ...' echo ' prop [-p|--prefix ]' echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]' echo ' ' echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]' echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode ]' echo ' [-o|--owner ] [-g|--group ] [-e|--exec' echo ' ] [ ...] ' echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode' echo ' ] [-o|--owner ] [-g|--group ]

' echo ' [ ...]' echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] ' echo ' [ ...] ' echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] ' echo ' fixperm [-v|--verbose] [-t|--trace] [ ...]' echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files' echo ' ] [-s|--size ] [-c|--copy] [-r|--remove]' echo ' [-a|--archive-dir ] [-z|--compress [:]]' echo ' [-b|--background] [-d|--delay] [-p|--pad ] [-m|--mode' echo ' ] [-o|--owner ] [-g|--group ] [-M|--migrate' echo ' ] [-P|--prolog ] [-E|--epilog ] [...]' echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output ]' echo ' [-c|--compress ] [-d|--directory ] [-u|--user' echo ' ] [-g|--group ] [-e|--exclude ]' echo ' [ ...]' echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]' echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup' echo ' ] [-e|--exec ] [-f|--file ] []' echo ' [...]' echo ' platform [-F|--format ] [-S|--sep ] [-C|--conc' echo ' ] [-L|--lower] [-U|--upper] [-v|--verbose]' echo ' [-c|--concise] [-n|--no-newline] [-t|--type ]' echo ' [-V|--version] [-h|--help]' echo ' arx [-t|--trace] [-C|--command ] [' echo ' ...]' echo ' slo [-p|--prefix ] -- -L -l [-L -l' echo ' ...]' echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter ]' echo ' [-o|--output ] [-t|--template ] [-M|--mark' echo ' ] [-D|--define ] [-C|--class ]' echo ' [ ...]' echo ' version [-l|--language ] [-n|--name ] [-p|--prefix' echo ' ] [-s|--set ] [-e|--edit] [-i|--increase' echo ' ] [-d|--display ] ' echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]' echo ' [-m|--magic] [-p|--path ] [ ...]' echo '' exit 0 fi if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then echo "GNU shtool 2.0.8 (18-Jul-2008)" exit 0 fi if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then shtoolize -oshtool all exit 0 fi if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then shift set -x fi name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` case "$name" in echo|mdate|table|prop|move|install|mkdir|mkln|mkshadow|fixperm|rotate|tarball|subst|platform|arx|slo|scpp|version|path ) # implicit tool command selection tool="$name" ;; * ) # explicit tool command selection tool="$1" shift ;; esac arg_spec="" opt_spec="" gen_tmpfile=no ## ## DISPATCH INTO SCRIPT PROLOG ## case $tool in echo ) str_tool="echo" str_usage="[-n|--newline] [-e|--expand] [ ...]" arg_spec="0+" opt_spec="n.e." opt_alias="n:newline,e:expand" opt_n=no opt_e=no ;; mdate ) str_tool="mdate" str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep ] [-o|--order ] " arg_spec="1=" opt_spec="n.z.s.d.f:o:" opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order" opt_n=no opt_z=no opt_s=no opt_d=no opt_f=" " opt_o="dmy" ;; table ) str_tool="table" str_usage="[-F|--field-sep ] [-w|--width ] [-c|--columns ] [-s|--strip ] ..." arg_spec="1+" opt_spec="F:w:c:s:" opt_alias="F:field-sep,w:width,c:columns,s:strip" opt_F=":" opt_w=15 opt_c=3 opt_s=79 ;; prop ) str_tool="prop" str_usage="[-p|--prefix ]" arg_spec="0=" opt_spec="p:" opt_alias="p:prefix" opt_p="" ;; move ) str_tool="move" str_usage="[-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve] " arg_spec="2=" opt_spec="v.t.e.p." opt_alias="v:verbose,t:trace,e:expand,p:preserve" opt_v=no opt_t=no opt_e=no opt_p=no ;; install ) str_tool="install" str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode ] [-o|--owner ] [-g|--group ] [-e|--exec ] [ ...] " arg_spec="1+" opt_spec="v.t.d.c.C.s.m:o:g:e+" opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" opt_v=no opt_t=no opt_d=no opt_c=no opt_C=no opt_s=no opt_m="0755" opt_o="" opt_g="" opt_e="" ;; mkdir ) str_tool="mkdir" str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode ] [-o|--owner ] [-g|--group ] [ ...]" arg_spec="1+" opt_spec="t.f.p.m:o:g:" opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group" opt_t=no opt_f=no opt_p=no opt_m="" opt_o="" opt_g="" ;; mkln ) str_tool="mkln" str_usage="[-t|--trace] [-f|--force] [-s|--symbolic] [ ...] " arg_spec="2+" opt_spec="t.f.s." opt_alias="t:trace,f:force,s:symbolic" opt_t=no opt_f=no opt_s=no ;; mkshadow ) str_tool="mkshadow" str_usage="[-v|--verbose] [-t|--trace] [-a|--all] " arg_spec="2=" opt_spec="v.t.a." opt_alias="v:verbose,t:trace,a:all" opt_v=no opt_t=no opt_a=no ;; fixperm ) str_tool="fixperm" str_usage="[-v|--verbose] [-t|--trace] [ ...]" arg_spec="1+" opt_spec="v.t." opt_alias="v:verbose,t:trace" opt_v=no opt_t=no ;; rotate ) str_tool="rotate" str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files ] [-s|--size ] [-c|--copy] [-r|--remove] [-a|--archive-dir ] [-z|--compress [:]] [-b|--background] [-d|--delay] [-p|--pad ] [-m|--mode ] [-o|--owner ] [-g|--group ] [-M|--migrate ] [-P|--prolog ] [-E|--epilog ] [...]" arg_spec="1+" opt_spec="v.t.f.n:s:c.r.a:z:b.d.p:o:g:m:M:P:E:" opt_alias="v:verbose,t:trace,f:force,n:num-files,s:size,c:copy,r:remove,a:archive-dir,z:compress,b:background,d:delay,p:pad,o:owner,g:group,m:mode,M:migrate,P:prolog,E:epilog" opt_v=no opt_t=no opt_f=no opt_n=10 opt_s="" opt_c=no opt_r=no opt_a="" opt_z="" opt_b=no opt_d=no opt_p=1 opt_o="" opt_g="" opt_m="" opt_M="" opt_P="" opt_E="" ;; tarball ) str_tool="tarball" str_usage="[-t|--trace] [-v|--verbose] [-o|--output ] [-c|--compress ] [-d|--directory ] [-u|--user ] [-g|--group ] [-e|--exclude ] [ ...]" gen_tmpfile=yes arg_spec="1+" opt_spec="t.v.o:c:d:u:g:e:" opt_alias="t:trace,v:verbose,o:output,c:compress,d:directory,u:user,g:group,e:exclude" opt_t=no opt_v=no opt_o="" opt_c="" opt_d="" opt_u="" opt_g="" opt_e="CVS,\\.cvsignore,\\.svn,\\.[oa]\$" ;; subst ) str_tool="subst" str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning] [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup ] [-e|--exec ] [-f|--file ] [] [...]" gen_tmpfile=yes arg_spec="0+" opt_spec="v.t.n.w.q.s.i.b:e+f:" opt_alias="v:verbose,t:trace,n:nop,w:warning,q:quiet,s:stealth,i:interactive,b:backup,e:exec,f:file" opt_v=no opt_t=no opt_n=no opt_w=no opt_q=no opt_s=no opt_i=no opt_b="" opt_e="" opt_f="" ;; platform ) str_tool="platform" str_usage="[-F|--format ] [-S|--sep ] [-C|--conc ] [-L|--lower] [-U|--upper] [-v|--verbose] [-c|--concise] [-n|--no-newline] [-t|--type ] [-V|--version] [-h|--help]" arg_spec="0=" opt_spec="F:S:C:L.U.v.c.n.t:d.V.h." opt_alias="F:format,S:sep,C:conc,L:lower,U:upper,v:verbose,c:consise,t:type,n:no-newline,V:version,h:help" opt_F="%{sp} (%{ap})" opt_S=" " opt_C="/" opt_L=no opt_U=no opt_t="" opt_v=no opt_c=no opt_n=no opt_V=no opt_h=no ;; arx ) str_tool="arx" str_usage="[-t|--trace] [-C|--command ] [ ...]" arg_spec="2+" opt_spec="t.C:" opt_alias="t:trace,C:command" opt_t=no opt_C="ar" ;; slo ) str_tool="slo" str_usage="[-p|--prefix ] -- -L -l [-L -l ...]" arg_spec="1+" opt_spec="p:" opt_alias="p:prefix" opt_p="SLO_" ;; scpp ) str_tool="scpp" str_usage="[-v|--verbose] [-p|--preserve] [-f|--filter ] [-o|--output ] [-t|--template ] [-M|--mark ] [-D|--define ] [-C|--class ] [ ...]" gen_tmpfile=yes arg_spec="1+" opt_spec="v.p.f+o:t:M:D:C:" opt_alias="v:verbose,p:preserve,f:filter,o:output,t:template,M:mark,D:define,C:class" opt_v=no opt_p=no opt_f="" opt_o="lib.h" opt_t="lib.h.in" opt_M="%%MARK%%" opt_D="cpp" opt_C="intern" ;; version ) str_tool="version" str_usage="[-l|--language ] [-n|--name ] [-p|--prefix ] [-s|--set ] [-e|--edit] [-i|--increase ] [-d|--display ] " arg_spec="1=" opt_spec="l:n:p:s:i:e.d:" opt_alias="l:language,n:name,p:prefix,s:set,e:edit,i:increase,d:display" opt_l="txt" opt_n="unknown" opt_p="" opt_s="" opt_e="no" opt_i="" opt_d="short" ;; path ) str_tool="path" str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path ] [ ...]" gen_tmpfile=yes arg_spec="1+" opt_spec="s.r.d.b.m.p:" opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path" opt_s=no opt_r=no opt_d=no opt_b=no opt_m=no opt_p="$PATH" ;; -* ) echo "$0:Error: unknown option \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; * ) echo "$0:Error: unknown command \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; esac ## ## COMMON UTILITY CODE ## # commonly used ASCII values ASC_TAB=" " ASC_NL=" " # determine name of tool if [ ".$tool" != . ]; then # used inside shtool script toolcmd="$0 $tool" toolcmdhelp="shtool $tool" msgprefix="shtool:$tool" else # used as standalone script toolcmd="$0" toolcmdhelp="sh $0" msgprefix="$str_tool" fi # parse argument specification string eval `echo $arg_spec |\ sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` # parse option specification string eval `echo h.$opt_spec |\ sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` # parse option alias string eval `echo h:help,$opt_alias |\ sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` # interate over argument line opt_PREV='' while [ $# -gt 0 ]; do # special option stops processing if [ ".$1" = ".--" ]; then shift break fi # determine option and argument opt_ARG_OK=no if [ ".$opt_PREV" != . ]; then # merge previous seen option with argument opt_OPT="$opt_PREV" opt_ARG="$1" opt_ARG_OK=yes opt_PREV='' else # split argument into option and argument case "$1" in --[a-zA-Z0-9]*=*) eval `echo "x$1" |\ sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" ;; --[a-zA-Z0-9]*) opt_OPT=`echo "x$1" | cut -c4-` opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" opt_ARG='' ;; -[a-zA-Z0-9]*) eval `echo "x$1" |\ sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ -e 's/";\(.*\)$/"; opt_ARG="\1"/'` ;; -[a-zA-Z0-9]) opt_OPT=`echo "x$1" | cut -c3-` opt_ARG='' ;; *) break ;; esac fi # eat up option shift # determine whether option needs an argument eval "opt_MODE=\$opt_MODE_${opt_OPT}" if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then opt_PREV="$opt_OPT" continue fi fi # process option case $opt_MODE in '.' ) # boolean option eval "opt_${opt_OPT}=yes" ;; ':' ) # option with argument (multiple occurances override) eval "opt_${opt_OPT}=\"\$opt_ARG\"" ;; '+' ) # option with argument (multiple occurances append) eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\"" ;; * ) echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 ;; esac done if [ ".$opt_PREV" != . ]; then echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 fi # process help option if [ ".$opt_h" = .yes ]; then echo "Usage: $toolcmdhelp $str_usage" exit 0 fi # complain about incorrect number of arguments case $arg_MODE in '=' ) if [ $# -ne $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; '+' ) if [ $# -lt $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; esac # establish a temporary file on request if [ ".$gen_tmpfile" = .yes ]; then # create (explicitly) secure temporary directory if [ ".$TMPDIR" != . ]; then tmpdir="$TMPDIR" elif [ ".$TEMPDIR" != . ]; then tmpdir="$TEMPDIR" else tmpdir="/tmp" fi tmpdir="$tmpdir/.shtool.$$" ( umask 077 rm -rf "$tmpdir" >/dev/null 2>&1 || true mkdir "$tmpdir" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2 exit 1 fi ) # create (implicitly) secure temporary file tmpfile="$tmpdir/shtool.tmp" touch "$tmpfile" fi # utility function: map string to lower case util_lower () { echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' } # utility function: map string to upper case util_upper () { echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' } # cleanup procedure shtool_exit () { rc="$1" if [ ".$gen_tmpfile" = .yes ]; then rm -rf "$tmpdir" >/dev/null 2>&1 || true fi exit $rc } ## ## DISPATCH INTO SCRIPT BODY ## case $tool in echo ) ## ## echo -- Print string with optional construct expansion ## Copyright (c) 1998-2008 Ralf S. Engelschall ## text="$*" # check for broken escape sequence expansion seo='' bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" != .3 ]; then bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" = .3 ]; then seo='-E' fi fi # check for existing -n option (to suppress newline) minusn='' bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" = .3 ]; then minusn='-n' fi # determine terminal bold sequence term_bold='' term_norm='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then case $TERM in # for the most important terminal types we directly know the sequences xterm|xterm*|vt220|vt220*) term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` ;; vt100|vt100*|cygwin) term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` ;; # for all others, we try to use a possibly existing `tput' or `tcout' utility * ) paths=`echo $PATH | sed -e 's/:/ /g'` for tool in tput tcout; do for dir in $paths; do if [ -r "$dir/$tool" ]; then for seq in bold md smso; do # 'smso' is last bold="`$dir/$tool $seq 2>/dev/null`" if [ ".$bold" != . ]; then term_bold="$bold" break fi done if [ ".$term_bold" != . ]; then for seq in sgr0 me rmso init reset; do # 'reset' is last norm="`$dir/$tool $seq 2>/dev/null`" if [ ".$norm" != . ]; then term_norm="$norm" break fi done fi break fi done if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then break; fi done ;; esac if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 term_bold='' term_norm='' fi fi # determine user name username='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then username="`(id -un) 2>/dev/null`" if [ ".$username" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then username=`echo $str | sed -e 's/^uid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` fi if [ ".$username" = . ]; then username="$LOGNAME" if [ ".$username" = . ]; then username="$USER" if [ ".$username" = . ]; then username="`(whoami) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$username" = . ]; then username="`(who am i) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$username" = . ]; then username='unknown' fi fi fi fi fi fi fi # determine user id userid='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then userid="`(id -u) 2>/dev/null`" if [ ".$userid" = . ]; then userid="`(id -u ${username}) 2>/dev/null`" if [ ".$userid" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*$//'` fi if [ ".$userid" = . ]; then userid=`(getent passwd ${username}) 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ sed -e 'q' | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid='?' fi fi fi fi fi fi fi fi # determine (primary) group id groupid='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then groupid="`(id -g ${username}) 2>/dev/null`" if [ ".$groupid" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then groupid=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*//' -e 's/(.*$//'` fi if [ ".$groupid" = . ]; then groupid=`(getent passwd ${username}) 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ sed -e 'q' | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid='?' fi fi fi fi fi fi fi # determine (primary) group name groupname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then groupname="`(id -gn ${username}) 2>/dev/null`" if [ ".$groupname" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then groupname=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` fi if [ ".$groupname" = . ]; then groupname=`(getent group) 2>/dev/null | \ grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`(ypcat group; niscat group) 2>/dev/null | \ sed -e 'q' | grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`(nidump group .) 2>/dev/null | \ grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname='?' fi fi fi fi fi fi fi # determine host and domain name hostname='' domainname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then hostname="`(uname -n) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$hostname" = . ]; then hostname="`(hostname) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$hostname" = . ]; then hostname='unknown' fi fi case $hostname in *.* ) domainname=".`echo $hostname | cut -d. -f2-`" hostname="`echo $hostname | cut -d. -f1`" ;; esac fi if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then if [ ".$domainname" = . ]; then if [ -f /etc/resolv.conf ]; then domainname="`grep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*domain//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/^\.//' -e 's/^/./' |\ awk '{ printf("%s", $1); }'`" if [ ".$domainname" = . ]; then domainname="`grep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*search//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/ .*//' -e 's/ .*//' \ -e 's/^\.//' -e 's/^/./' |\ awk '{ printf("%s", $1); }'`" fi fi fi fi # determine current time time_day='' time_month='' time_year='' time_monthname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then time_day=`date '+%d'` time_month=`date '+%m'` time_year=`date '+%Y' 2>/dev/null` if [ ".$time_year" = . ]; then time_year=`date '+%y'` case $time_year in [5-9][0-9]) time_year="19$time_year" ;; [0-4][0-9]) time_year="20$time_year" ;; esac fi case $time_month in 1|01) time_monthname='Jan' ;; 2|02) time_monthname='Feb' ;; 3|03) time_monthname='Mar' ;; 4|04) time_monthname='Apr' ;; 5|05) time_monthname='May' ;; 6|06) time_monthname='Jun' ;; 7|07) time_monthname='Jul' ;; 8|08) time_monthname='Aug' ;; 9|09) time_monthname='Sep' ;; 10) time_monthname='Oct' ;; 11) time_monthname='Nov' ;; 12) time_monthname='Dec' ;; esac fi # expand special ``%x'' constructs if [ ".$opt_e" = .yes ]; then text=`echo $seo "$text" |\ sed -e "s/%B/${term_bold}/g" \ -e "s/%b/${term_norm}/g" \ -e "s/%u/${username}/g" \ -e "s/%U/${userid}/g" \ -e "s/%g/${groupname}/g" \ -e "s/%G/${groupid}/g" \ -e "s/%h/${hostname}/g" \ -e "s/%d/${domainname}/g" \ -e "s/%D/${time_day}/g" \ -e "s/%M/${time_month}/g" \ -e "s/%Y/${time_year}/g" \ -e "s/%m/${time_monthname}/g" 2>/dev/null` fi # create output if [ .$opt_n = .no ]; then echo $seo "$text" else # the harder part: echo -n is best, because # awk may complain about some \xx sequences. if [ ".$minusn" != . ]; then echo $seo $minusn "$text" else echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" fi fi shtool_exit 0 ;; mdate ) ## ## mdate -- Pretty-print modification time of a file or dir ## Copyright (c) 1995-1997 Free Software Foundation, Inc. ## Copyright (c) 1998-2008 Ralf S. Engelschall ## fod="$1" case "$opt_o" in [dmy][dmy][dmy] ) ;; * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2 shtool_exit 1 ;; esac if [ ! -r "$fod" ]; then echo "$msgprefix:Error: file or directory not found: $fod" 1>&2 shtool_exit 1 fi # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume "unset" works, revert this # variable to its documented default. if [ ".$TIME_STYLE" != . ]; then TIME_STYLE=posix-long-iso export TIME_STYLE fi # get the extended ls output of the file or directory. if /bin/ls -L /dev/null >/dev/null 2>&1; then set - x`/bin/ls -L -l -d $fod` else set - x`/bin/ls -l -d $fod` fi # The month is at least the fourth argument # (3 shifts here, the next inside the loop). shift; shift; shift # Find the month. Next argument is day, followed by the year or time. month="" while [ ".$month" = . ]; do shift case $1 in Jan) month=January; nummonth=1 ;; Feb) month=February; nummonth=2 ;; Mar) month=March; nummonth=3 ;; Apr) month=April; nummonth=4 ;; May) month=May; nummonth=5 ;; Jun) month=June; nummonth=6 ;; Jul) month=July; nummonth=7 ;; Aug) month=August; nummonth=8 ;; Sep) month=September; nummonth=9 ;; Oct) month=October; nummonth=10 ;; Nov) month=November; nummonth=11 ;; Dec) month=December; nummonth=12 ;; esac done day="$2" year="$3" # We finally have to deal with the problem that the "ls" output # gives either the time of the day or the year. case $year in *:*) this_year=`date '+%Y' 2>/dev/null` if [ ".$this_year" = . ]; then this_year=`date '+%y'` case $this_year in [5-9][0-9]) this_year="19$this_year" ;; [0-4][0-9]) this_year="20$this_year" ;; esac fi # for the following months of the last year the time notation # is usually also used for files modified in the last year. this_month=`date '+%m'` if (expr $nummonth \> $this_month) >/dev/null; then this_year=`expr $this_year - 1` fi year="$this_year" ;; esac # Optionally fill day and month with leeding zeros if [ ".$opt_z" = .yes ]; then case $day in [0-9][0-9] ) ;; [0-9] ) day="0$day" ;; esac case $nummonth in [0-9][0-9] ) ;; [0-9] ) nummonth="0$nummonth" ;; esac fi # Optionally use digits for month if [ ".$opt_d" = .yes ]; then month="$nummonth" fi # Optionally shorten the month name to three characters if [ ".$opt_s" = .yes ]; then month=`echo $month | cut -c1-3` fi # Output the resulting date string echo dummy | awk '{ for (i = 0; i < 3; i++) { now = substr(order, 1, 1); order = substr(order, 2); if (now == "d") out = day; else if (now == "m") out = month; else if (now == "y") out = year; if (i < 2) printf("%s%s", out, field); else printf("%s", out); } if (newline != "yes") printf("\n"); }' "day=$day" "month=$month" "year=$year" \ "field=$opt_f" "order=$opt_o" "newline=$opt_n" shtool_exit 0 ;; table ) ## ## table -- Pretty-print a field-separated list as a table ## Copyright (c) 1998-2008 Ralf S. Engelschall ## if [ $opt_c -gt 4 ]; then echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2 shtool_exit 1 fi case "x$opt_F" in x? ) ;; * ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; shtool_exit 1 ;; esac # split the list into a table list=` IFS="$opt_F" for entry in $*; do if [ ".$entry" != . ]; then echo "$entry" fi done |\ awk " BEGIN { list = \"\"; n = 0; } { list = list \\$1; n = n + 1; if (n < $opt_c) { list = list \":\"; } if (n == $opt_c) { list = list \"\\n\"; n = 0; } } END { print list; } " ` # format table cells and make sure table # doesn't exceed maximum width OIFS="$IFS" IFS=' ' for entry in $list; do case $opt_c in 1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;; 2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;; 3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;; 4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;; esac done |\ awk "{ if (length(\$0) > $opt_s) { printf(\"%s\\n\", substr(\$0, 0, $opt_s-1)); } else { print \$0; } }" IFS="$OIFS" shtool_exit 0 ;; prop ) ## ## prop -- Display progress with a running propeller ## Copyright (c) 1998-2008 Ralf S. Engelschall ## perl='' for dir in `echo $PATH | sed -e 's/:/ /g'` .; do if [ -f "$dir/perl" ]; then perl="$dir/perl" break fi done if [ ".$perl" != . ]; then # Perl is preferred because writing to STDERR in # Perl really writes immediately as one would expect $perl -e ' @p = ("|","/","-","\\"); $i = 0; while () { printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]); $i = 0 if ($i > 3); } printf(STDERR "\r%s \n", $ARGV[0]); ' "$opt_p" else # But if Perl doesn't exists we use Awk even # some Awk's buffer even the /dev/stderr writing :-( awk ' BEGIN { split("|#/#-#\\", p, "#"); i = 1; } { printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr"; if (i > 4) { i = 1; } } END { printf("\r%s \n", prefix) > "/dev/stderr"; } ' "prefix=$opt_p" fi shtool_exit 0 ;; move ) ## ## move -- Move files with simultaneous substitution ## Copyright (c) 1999-2008 Ralf S. Engelschall ## src="$1" dst="$2" # consistency checks if [ ".$src" = . ] || [ ".$dst" = . ]; then echo "$msgprefix:Error: Invalid arguments" 1>&2 shtool_exit 1 fi if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Error: Source and destination files are the same" 1>&2 shtool_exit 1 fi expsrc="$src" if [ ".$opt_e" = .yes ]; then expsrc="`echo $expsrc`" fi if [ ".$opt_e" = .yes ]; then if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2 shtool_exit 1 fi if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2 shtool_exit 1 fi if [ ".$expsrc" = ".$src" ]; then echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2 shtool_exit 1 fi else if [ ! -r "$src" ]; then echo "$msgprefix:Error: Source not found: $src" 1>&2 shtool_exit 1 fi fi # determine substitution patterns if [ ".$opt_e" = .yes ]; then srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'` dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'` fi # iterate over source(s) for onesrc in $expsrc; do if [ .$opt_e = .yes ]; then onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"` else onedst="$dst" fi errorstatus=0 if [ ".$opt_v" = .yes ]; then echo "$onesrc -> $onedst" fi if [ ".$opt_p" = .yes ]; then if [ -r $onedst ]; then if cmp -s $onesrc $onedst; then if [ ".$opt_t" = .yes ]; then echo "rm -f $onesrc" 1>&2 fi rm -f $onesrc || errorstatus=$? else if [ ".$opt_t" = .yes ]; then echo "mv -f $onesrc $onedst" 1>&2 fi mv -f $onesrc $onedst || errorstatus=$? fi else if [ ".$opt_t" = .yes ]; then echo "mv -f $onesrc $onedst" 1>&2 fi mv -f $onesrc $onedst || errorstatus=$? fi else if [ ".$opt_t" = .yes ]; then echo "mv -f $onesrc $onedst" 1>&2 fi mv -f $onesrc $onedst || errorstatus=$? fi if [ $errorstatus -ne 0 ]; then break; fi done shtool_exit $errorstatus ;; install ) ## ## install -- Install a program, script or datafile ## Copyright (c) 1997-2008 Ralf S. Engelschall ## # special case: "shtool install -d [...]" internally # maps to "shtool mkdir -f -p -m 755 [...]" if [ "$opt_d" = yes ]; then cmd="$0 mkdir -f -p -m 755" if [ ".$opt_o" != . ]; then cmd="$cmd -o '$opt_o'" fi if [ ".$opt_g" != . ]; then cmd="$cmd -g '$opt_g'" fi if [ ".$opt_v" = .yes ]; then cmd="$cmd -v" fi if [ ".$opt_t" = .yes ]; then cmd="$cmd -t" fi for dir in "$@"; do eval "$cmd $dir" || shtool_exit $? done shtool_exit 0 fi # determine source(s) and destination argc=$# srcs="" while [ $# -gt 1 ]; do srcs="$srcs $1" shift done dstpath="$1" # type check for destination dstisdir=0 if [ -d $dstpath ]; then dstpath=`echo "$dstpath" | sed -e 's:/$::'` dstisdir=1 fi # consistency check for destination if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 shtool_exit 1 fi # iterate over all source(s) for src in $srcs; do dst=$dstpath # if destination is a directory, append the input filename if [ $dstisdir = 1 ]; then dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` dst="$dst/$dstfile" fi # check for correct arguments if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 continue fi if [ -d "$src" ]; then echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 continue fi # make a temp file name in the destination directory dsttmp=`echo $dst |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ -e "s;\$;/#INST@$$#;"` # verbosity if [ ".$opt_v" = .yes ]; then echo "$src -> $dst" 1>&2 fi # copy or move the file name to the temp name # (because we might be not allowed to change the source) if [ ".$opt_C" = .yes ]; then opt_c=yes fi if [ ".$opt_c" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "cp $src $dsttmp" 1>&2 fi cp "$src" "$dsttmp" || shtool_exit $? else if [ ".$opt_t" = .yes ]; then echo "mv $src $dsttmp" 1>&2 fi mv "$src" "$dsttmp" || shtool_exit $? fi # adjust the target file if [ ".$opt_e" != . ]; then sed='sed' OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" for e do sed="$sed -e '$e'" done cp "$dsttmp" "$dsttmp.old" chmod u+w $dsttmp eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $? rm -f $dsttmp.old fi if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "strip $dsttmp" 1>&2 fi strip $dsttmp || shtool_exit $? fi if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $dsttmp" 1>&2 fi chown $opt_o $dsttmp || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $dsttmp" 1>&2 fi chgrp $opt_g $dsttmp || shtool_exit $? fi if [ ".$opt_m" != ".-" ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $dsttmp" 1>&2 fi chmod $opt_m $dsttmp || shtool_exit $? fi # determine whether to do a quick install # (has to be done _after_ the strip was already done) quick=no if [ ".$opt_C" = .yes ]; then if [ -r $dst ]; then if cmp -s "$src" "$dst"; then quick=yes fi fi fi # finally, install the file to the real destination if [ $quick = yes ]; then if [ ".$opt_t" = .yes ]; then echo "rm -f $dsttmp" 1>&2 fi rm -f $dsttmp else if [ ".$opt_t" = .yes ]; then echo "rm -f $dst && mv $dsttmp $dst" 1>&2 fi rm -f $dst && mv $dsttmp $dst fi done shtool_exit 0 ;; mkdir ) ## ## mkdir -- Make one or more directories ## Copyright (c) 1996-2008 Ralf S. Engelschall ## errstatus=0 for p in ${1+"$@"}; do # if the directory already exists... if [ -d "$p" ]; then if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then echo "$msgprefix:Error: directory already exists: $p" 1>&2 errstatus=1 break else continue fi fi # if the directory has to be created... if [ ".$opt_p" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $p" 1>&2 fi mkdir $p || errstatus=$? if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $p" 1>&2 fi chown $opt_o $p || errstatus=$? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $p" 1>&2 fi chgrp $opt_g $p || errstatus=$? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $p" 1>&2 fi chmod $opt_m $p || errstatus=$? fi else # the smart situation set fnord `echo ":$p" |\ sed -e 's/^:\//%/' \ -e 's/^://' \ -e 's/\// /g' \ -e 's/^%/\//'` shift pathcomp='' for d in ${1+"$@"}; do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp="./$pathcomp" ;; esac if [ ! -d "$pathcomp" ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $pathcomp" 1>&2 fi mkdir $pathcomp || errstatus=$? if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $pathcomp" 1>&2 fi chown $opt_o $pathcomp || errstatus=$? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $pathcomp" 1>&2 fi chgrp $opt_g $pathcomp || errstatus=$? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $pathcomp" 1>&2 fi chmod $opt_m $pathcomp || errstatus=$? fi fi pathcomp="$pathcomp/" done fi done shtool_exit $errstatus ;; mkln ) ## ## mkln -- Make link with calculation of relative paths ## Copyright (c) 1998-2008 Ralf S. Engelschall ## # determine source(s) and destination args=$# srcs="" while [ $# -gt 1 ]; do srcs="$srcs $1" shift done dst="$1" if [ ! -d $dst ]; then if [ $args -gt 2 ]; then echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2 shtool_exit 1 fi fi # determine link options lnopt="" if [ ".$opt_f" = .yes ]; then lnopt="$lnopt -f" fi if [ ".$opt_s" = .yes ]; then lnopt="$lnopt -s" fi # iterate over sources for src in $srcs; do # determine if one of the paths is an absolute path, # because then we _have_ to use an absolute symlink oneisabs=0 srcisabs=0 dstisabs=0 case $src in /* ) oneisabs=1; srcisabs=1 ;; esac case $dst in /* ) oneisabs=1; dstisabs=1 ;; esac # split source and destination into dir and base name if [ -d $src ]; then srcdir=`echo $src | sed -e 's;/*$;;'` srcbase="" else srcdir=`echo $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'` fi if [ -d $dst ]; then dstdir=`echo $dst | sed -e 's;/*$;;'` dstbase="" else dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'` fi # consistency check if [ ".$dstdir" != . ]; then if [ ! -d $dstdir ]; then echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2 shtool_exit 1 fi fi # make sure the source is reachable from the destination if [ $dstisabs = 1 ]; then if [ $srcisabs = 0 ]; then if [ ".$srcdir" = . ]; then srcdir="`pwd | sed -e 's;/*$;;'`" srcisabs=1 oneisabs=1 elif [ -d $srcdir ]; then srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`" srcisabs=1 oneisabs=1 fi fi fi # split away a common prefix prefix="" if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then prefix="$srcdir/" srcdir="" dstdir="" else while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'` predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'` if [ ".$presrc" != ".$predst" ]; then break fi prefix="$prefix$presrc/" srcdir=`echo $srcdir | sed -e 's;^[^/]*/*;;'` dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'` done fi # destination prefix is just the common prefix dstpre="$prefix" # determine source prefix which is the reverse directory # step-up corresponding to the destination directory srcpre="" allow_relative_srcpre=no if [ ".$prefix" != . ] && [ ".$prefix" != ./ ]; then allow_relative_srcpre=yes fi if [ $oneisabs = 0 ]; then allow_relative_srcpre=yes fi if [ ".$opt_s" != .yes ]; then allow_relative_srcpre=no fi if [ ".$allow_relative_srcpre" = .yes ]; then pl="$dstdir/" OIFS="$IFS"; IFS='/' for pe in $pl; do [ ".$pe" = . ] && continue [ ".$pe" = .. ] && continue srcpre="../$srcpre" done IFS="$OIFS" else if [ $srcisabs = 1 ]; then srcpre="$prefix" fi fi # determine destination symlink name if [ ".$dstbase" = . ]; then if [ ".$srcbase" != . ]; then dstbase="$srcbase" else dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'` fi fi # now finalize source and destination directory paths srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'` dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'` # run the final link command if [ ".$opt_t" = .yes ]; then echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase" fi eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase done shtool_exit 0 ;; mkshadow ) ## ## mkshadow -- Make a shadow tree through symbolic links ## Copyright (c) 1998-2008 Ralf S. Engelschall ## # source and destination directory src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` # check whether source exists if [ ! -d $src ]; then echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2 shtool_exit 1 fi # determine if one of the paths is an absolute path, # because then we have to use an absolute symlink oneisabs=0 case $src in /* ) oneisabs=1 ;; esac case $dst in /* ) oneisabs=1 ;; esac # determine reverse directory for destination directory dstrevdir='' if [ $oneisabs = 0 ]; then # derive reverse path from forward path pwd=`pwd` OIFS="$IFS"; IFS='/' for pe in $dst; do if [ "x$pe" = "x.." ]; then OIFS2="$IFS"; IFS="$DIFS" eval `echo "$pwd" |\ sed -e 's:\([^/]*\)$:; dir="\1":' \ -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\ -e 's:^;:pwd="";:'` dstrevdir="$dir/$dstrevdir" IFS="$OIFS2" else dstrevdir="../$dstrevdir" fi done IFS="$OIFS" else src="`cd $src; pwd`"; fi # create directory tree at destination if [ ! -d $dst ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $dst" 1>&2 fi mkdir $dst fi if [ ".$opt_a" = .yes ]; then DIRS=`cd $src; find . -type d -print |\ sed -e '/^\.$/d' -e 's:^\./::'` else DIRS=`cd $src; find . -type d -print |\ sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'` fi for dir in $DIRS; do if [ ".$opt_t" = .yes ]; then echo "mkdir $dst/$dir" 1>&2 fi mkdir $dst/$dir done # fill directory tree with symlinks to files if [ ".$opt_a" = .yes ]; then FILES="`cd $src; find . -depth -print |\ sed -e 's/^\.\///'`" else FILES="`cd $src; find . -depth -print |\ sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \ -e '/\.cvsignore$/d' -e '/\/CVS/d' \ -e '/\/\.#/d' -e '/\.orig$/d' \ -e 's/^\.\///'`" fi for file in $FILES; do # don't use `-type f' above for find because of symlinks if [ -d "$src/$file" ]; then continue fi basename=`echo $file | sed -e 's:^.*/::'` dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'` from=`echo "$src/$file" | sed -e 's/^\.\///'` to="$dst/$dir$basename" if [ $oneisabs = 0 ]; then if [ ".$dir" != . ]; then subdir=`echo $dir | sed -e 's:/$::'` # derive reverse path from forward path revdir='' OIFS="$IFS"; IFS='/' for pe in $subdir; do revdir="../$revdir" done IFS="$OIFS" # finalize from from="$revdir$from" fi from="$dstrevdir$from" fi if [ ".$opt_v" = .yes ]; then echo " $to" 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "ln -s $from $to" 1>&2 fi ln -s $from $to done shtool_exit 0 ;; fixperm ) ## ## fixperm -- Fix file permissions inside a source tree ## Copyright (c) 1996-2008 Ralf S. Engelschall ## paths="$*" # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # iterate over paths for p in $paths; do for file in `find $p -depth -print`; do if [ -f $file ]; then if [ $minusx $file ]; then if [ ".$opt_v" = .yes ]; then echo "-rwxr-xr-x $file" 2>&1 fi if [ ".$opt_t" = .yes ]; then echo "chmod 755 $file" 2>&1 fi chmod 755 $file else if [ ".$opt_v" = .yes ]; then echo "-rw-r--r-- $file" 2>&1 fi if [ ".$opt_t" = .yes ]; then echo "chmod 644 $file" 2>&1 fi chmod 644 $file fi continue fi if [ -d $file ]; then if [ ".$opt_v" = .yes ]; then echo "drwxr-xr-x $file" 2>&1 fi if [ ".$opt_t" = .yes ]; then echo "chmod 755 $file" 2>&1 fi chmod 755 $file continue fi if [ ".$opt_v" = .yes ]; then echo "?????????? $file" 2>&1 fi done done shtool_exit 0 ;; rotate ) ## ## rotate -- Logfile rotation ## Copyright (c) 2001-2008 Ralf S. Engelschall ## # make sure we have at least one file to rotate if [ ".$opt_n" = .0 ]; then echo "$msgprefix:Error: invalid argument \`$opt_n' to option -n." 1>&2 shtool_exit 1 fi # canonicalize -s option argument if [ ".$opt_s" != . ]; then if [ ".`expr $opt_s : '[0-9]*$'`" != .0 ]; then : elif [ ".`expr $opt_s : '[0-9]*[Kk]$'`" != .0 ]; then opt_s=`expr $opt_s : '\([0-9]*\)[Kk]$'` opt_s=`expr $opt_s \* 1024` elif [ ".`expr $opt_s : '[0-9]*[Mm]$'`" != .0 ]; then opt_s=`expr $opt_s : '\([0-9]*\)[Mm]$'` opt_s=`expr $opt_s \* 1048576` # 1024*1024 elif [ ".`expr $opt_s : '[0-9]*[Gg]$'`" != .0 ]; then opt_s=`expr $opt_s : '\([0-9]*\)[Gg]$'` opt_s=`expr $opt_s \* 1073741824` # 1024*1024*1024 else echo "$msgprefix:Error: invalid argument \`$opt_s' to option -s." 1>&2 shtool_exit 1 fi fi # option -d/-z consistency if [ ".$opt_d" = .yes ] && [ ".$opt_z" = . ]; then echo "$msgprefix:Error: option -d requires option -z." 1>&2 shtool_exit 1 fi # make sure target directory exists if [ ".$opt_a" != . ]; then if [ ! -d $opt_a ]; then if [ ".$opt_f" = .no ]; then echo "$msgprefix:Error: archive directory \`$opt_a' does not exist." 1>&2 shtool_exit 1 fi mkdir $opt_a || shtool_exit $? chmod 755 $opt_a fi if [ ! -w $opt_a ]; then echo "$msgprefix:Error: archive directory \`$opt_a' not writable." 1>&2 shtool_exit 1 fi fi # determine compression approach if [ ".$opt_z" != . ]; then comp_lvl="$opt_z" comp_prg="" case $comp_lvl in *:* ) eval `echo $comp_lvl |\ sed -e 's%^\(.*\):\(.*\)$%comp_prg="\1"; comp_lvl="\2"%'` ;; esac # compression level consistency case $comp_lvl in [0-9] ) ;; * ) echo "$msgprefix:Error: invalid compression level \`$comp_lvl'" 1>&2 shtool_exit 1 ;; esac # determine a suitable compression tool if [ ".$comp_prg" = . ]; then # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # search for tools in $PATH paths="`echo $PATH |\ sed -e 's%/*:%:%g' -e 's%/*$%%' \ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ -e 's/:/ /g'`" for prg in bzip2 gzip compress; do for path in $paths; do if [ $minusx "$path/$prg" ] && [ ! -d "$path/$prg" ]; then comp_prg="$prg" break fi done if [ ".$comp_prg" != . ]; then break fi done if [ ".$comp_prg" = . ]; then echo "$msgprefix:Error: no suitable compression tool found in \$PATH" 1>&2 shtool_exit 1 fi fi # determine standard compression extension # and make sure it is a known tool case $comp_prg in */bzip2 | bzip2 ) comp_ext="bz2" comp_lvl="-$comp_lvl" ;; */gzip | gzip ) comp_ext="gz" comp_lvl="-$comp_lvl" ;; */compress | compress ) comp_ext="Z"; comp_lvl="" ;; * ) echo "$msgprefix:Error: tool \`$comp_prg' is not a known compression tool" 1>&2 shtool_exit 1 ;; esac comp_suf=".$comp_ext" fi # iterate over all given logfile arguments for file in $*; do # make sure the logfile exists if [ ! -f $file ]; then if [ ".$opt_f" = .yes ]; then continue fi echo "$msgprefix:Error: logfile \`$file' not found" 1>&2 shtool_exit 1 fi # determine log directory (where original logfile is placed) ldir="." case $file in */* ) eval `echo $file | sed -e 's%^\(.*\)/\([^/]*\)$%ldir="\1"; file="\2";%'` ;; esac # determine archive directory (where rotated logfiles are placed) adir="$ldir" if [ ".$opt_a" != . ]; then case "$opt_a" in /* | ./* ) adir="$opt_a" ;; * ) adir="$ldir/$opt_a" ;; esac fi # optionally take logfile size into account if [ ".$opt_s" != . ]; then # determine size of logfile set -- `env -i /bin/ls -l "$ldir/$file" | sed -e "s;$ldir/$file;;" |\ sed -e 's; -> .*$;;' -e 's;[ ][ ]*; ;g'` n=`expr $# - 3` eval "size=\`echo \${$n}\`" # skip logfile if size is still too small if [ $size -lt $opt_s ]; then if [ ".$opt_v" = .yes ]; then echo "$ldir/$file: still too small in size -- skipping" fi continue fi fi # verbosity if [ ".$opt_v" = .yes ]; then echo "rotating $ldir/$file" fi # execute prolog if [ ".$opt_P" != . ]; then if [ ".$opt_t" = .yes ]; then echo "$opt_P" fi eval $opt_P [ $? -ne 0 ] && shtool_exit $? fi # kick away out-rotated logfile n=`expr $opt_n - 1` n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` if [ -f "${adir}/${file}.${n}${comp_suf}" ]; then # optionally migrate away the out-rotated logfile if [ ".$opt_M" != . ]; then if [ ".$opt_t" = .yes ]; then echo "$opt_M ${adir}/${file}.${n}${comp_suf}" fi eval "$opt_M ${adir}/${file}.${n}${comp_suf}" [ $? -ne 0 ] && shtool_exit $? fi # finally get rid of the out-rotated logfile if [ ".$opt_t" = .yes ]; then echo "rm -f ${adir}/${file}.${n}${comp_suf}" fi rm -f ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi # rotate already archived logfiles while [ $n -gt 0 ]; do m=$n n=`expr $n - 1` n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` if [ $n -eq 0 ] && [ ".$opt_d" = .yes ]; then # special case: first rotation file under delayed compression situation if [ ! -f "${adir}/${file}.${n}" ]; then continue fi # compress file (delayed) if [ ".$opt_b" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "mv ${adir}/${file}.${n} ${adir}/${file}.${m}" fi mv ${adir}/${file}.${n} ${adir}/${file}.${m} || shtool_exit $? if [ ".$opt_t" = .yes ]; then echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${m} >${adir}/${file}.${m}${comp_suf}; rm -f ${adir}/${file}.${m}) &" fi ( ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${m} \ >${adir}/${file}.${m}${comp_suf} || shtool_exit $? rm -f ${adir}/${file}.${m} || shtool_exit $? ) /dev/null 2>&1 & else if [ ".$opt_t" = .yes ]; then echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${m}${comp_suf}" fi ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${n} \ >${adir}/${file}.${m}${comp_suf} || shtool_exit $? if [ ".$opt_t" = .yes ]; then echo "rm -f ${adir}/${file}.${n}" fi rm -f ${adir}/${file}.${n} || shtool_exit $? fi # fix file attributes if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o ${adir}/${file}.${m}${comp_suf}" fi chown $opt_o ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g ${adir}/${file}.${m}${comp_suf}" fi chgrp $opt_g ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m ${adir}/${file}.${m}${comp_suf}" fi chmod $opt_m ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi else # standard case: second and following rotation file if [ ! -f "${adir}/${file}.${n}${comp_suf}" ]; then continue fi if [ ".$opt_t" = .yes ]; then echo "mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf}" fi mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi done # move away current logfile if [ ".$opt_c" = .yes ]; then # approach: copy[+truncate] if [ ".$opt_t" = .yes ]; then echo "cp -p ${ldir}/${file} ${adir}/${file}.${n}" fi cp -p ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $? if [ ".$opt_r" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "cp /dev/null ${ldir}/${file}" fi cp /dev/null ${ldir}/${file} || shtool_exit $? fi else # approach: move[+touch] if [ ".$opt_t" = .yes ]; then echo "mv ${ldir}/${file} ${adir}/${file}.${n}" fi mv ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $? if [ ".$opt_r" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "touch ${ldir}/${file}" fi touch ${ldir}/${file} || shtool_exit $? # fix file attributes if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o ${ldir}/${file}" fi chown $opt_o ${ldir}/${file} || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g ${ldir}/${file}" fi chgrp $opt_g ${ldir}/${file} || shtool_exit $? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m ${ldir}/${file}" fi chmod $opt_m ${ldir}/${file} || shtool_exit $? fi fi fi # regular compression step if [ ".$opt_z" != . ] && [ ".$opt_d" = .no ]; then # compress file if [ ".$opt_b" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}; rm -f ${adir}/${file}.${n}) &" fi ( ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${n} \ >${adir}/${file}.${n}${comp_suf} || shtool_exit $? rm -f ${adir}/${file}.${n} || shtool_exit $? ) /dev/null 2>&1 & else if [ ".$opt_t" = .yes ]; then echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}" fi ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${n} \ >${adir}/${file}.${n}${comp_suf} || shtool_exit $? if [ ".$opt_t" = .yes ]; then echo "rm -f ${opt_a}${file}.${n}" fi rm -f ${adir}/${file}.${n} || shtool_exit $? fi # fix file attributes if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o ${adir}/${file}.${n}${comp_suf}" fi chown $opt_o ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g ${adir}/${file}.${n}${comp_suf}" fi chgrp $opt_g ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m ${adir}/${file}.${n}${comp_suf}" fi chmod $opt_m ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi fi # execute epilog if [ ".$opt_E" != . ]; then if [ ".$opt_t" = .yes ]; then echo "$opt_E" fi eval $opt_E [ $? -ne 0 ] && shtool_exit $? fi done shtool_exit 0 ;; tarball ) ## ## tarball -- Roll distribution tarballs ## Copyright (c) 1999-2008 Ralf S. Engelschall ## srcs="$*" # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # find the tools paths="`echo $PATH |\ sed -e 's%/*:%:%g' -e 's%/*$%%' \ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ -e 's/:/ /g'`" for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do prg=`echo $spec | sed -e 's/:.*$//'` tools=`echo $spec | sed -e 's/^.*://'` eval "prg_${prg}=''" # iterate over tools for tool in `echo $tools | sed -e 's/,/ /g'`; do # iterate over paths for path in $paths; do if [ $minusx "$path/$tool" ] && [ ! -d "$path/$tool" ]; then eval "prg_${prg}=\"$path/$tool\"" break fi done eval "val=\$prg_${prg}" if [ ".$val" != . ]; then break fi done done # expand source paths exclude='' for pat in `echo $opt_e | sed 's/,/ /g'`; do exclude="$exclude | grep -v '$pat'" done if [ ".$opt_t" = .yes ]; then echo "cp /dev/null $tmpfile.lst" 1>&2 fi cp /dev/null $tmpfile.lst for src in $srcs; do if [ -d $src ]; then if [ ".$opt_t" = .yes ]; then echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2 fi (cd $src && $prg_find . -type f -depth -print) |\ sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst else if [ ".$opt_t" = .yes ]; then echo "echo $src >>$tmpfile.lst" 1>&2 fi echo $src >>$tmpfile.lst fi done sort <$tmpfile.lst >$tmpfile.lst.n mv $tmpfile.lst.n $tmpfile.lst if [ ".$opt_v" = .yes ]; then cat $tmpfile.lst | sed -e 's/^/ /' 1>&2 fi # determine tarball file and directory name if [ ".$opt_o" != . ]; then tarfile="$opt_o" if [ ".$opt_d" != . ]; then tarname="$opt_d" else tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'` fi else if [ ".$opt_d" != . ]; then tarname="$opt_d" elif [ -d "$from" ]; then tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'` else tarname="out" fi tarfile="$tarname.tar" fi # roll the tarball compress='' if [ ".$opt_c" != . ]; then compress="| $opt_c" fi if [ ".$prg_tardy" != . ]; then # the elegant hackers way tardy_opt="--prefix=$tarname" tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security! if [ ".$opt_u" != . ]; then tardy_opt="$tardy_opt --user_name=$opt_u" fi if [ ".$opt_g" != . ]; then tardy_opt="$tardy_opt --group_name=$opt_g" fi if [ ".$opt_t" = .yes ]; then echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2 fi cat $tmpfile.lst |\ xargs $prg_tar cf - |\ $prg_tardy $tardy_opt |\ eval cat $compress >$tmpfile.out if [ ".$opt_t" = .yes ]; then echo "cp $tmpfile.out $tarfile" 1>&2 fi cp $tmpfile.out $tarfile else # the portable standard way if [ ".$opt_t" = .yes ]; then echo "mkdir $tmpdir/$tarname" 1>&2 fi mkdir $tmpdir/$tarname || shtool_exit 1 if [ ".$opt_t" = .yes ]; then echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2 fi cat $tmpfile.lst |\ xargs $prg_tar cf - |\ (cd $tmpdir/$tarname && $prg_tar xf -) if [ ".$opt_u" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1 fi chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\ echo "$msgprefix:Warning: cannot set user name \`$opt_u' (would require root privileges)" fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1 fi chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\ echo "$msgprefix:Warning: cannot set group name \`$opt_g' (would require root privileges)" fi if [ ".$opt_t" = .yes ]; then echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2 fi (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\ eval cat $compress >$tmpfile.out if [ ".$opt_t" = .yes ]; then echo "cp $tmpfile.out $tarfile" 1>&2 fi cp $tmpfile.out $tarfile if [ ".$opt_t" = .yes ]; then echo "rm -rf $tmpdir/$tarname" 1>&2 fi rm -rf $tmpdir/$tarname fi # cleanup if [ ".$opt_t" = .yes ]; then echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2 fi rm -f $tmpfile.lst $tmpfile.out shtool_exit 0 ;; subst ) ## ## subst -- Apply sed(1) substitution operations ## Copyright (c) 2001-2008 Ralf S. Engelschall ## # remember optional list of file(s) files="$*" files_num="$#" # parameter consistency check if [ $# -eq 0 ] && [ ".$opt_b" != . ]; then echo "$msgprefix:Error: option -b cannot be applied to stdin" 1>&2 shtool_exit 1 fi if [ $# -eq 0 ] && [ ".$opt_s" = .yes ]; then echo "$msgprefix:Error: option -s cannot be applied to stdin" 1>&2 shtool_exit 1 fi # build underlying sed(1) command sedcmd='sed' if [ ".$opt_e" != . ]; then OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" for e do sedcmd="$sedcmd -e '$e'" done elif [ ".$opt_f" != . ]; then if [ ! -f $opt_f ]; then echo "$msgprefix:Error: command file \`$opt_f' not found or not a regular file" 1>&2 shtool_exit 1 fi sedcmd="$sedcmd -f '$opt_f'" else echo "$msgprefix:Error: either -e option(s) or -f option required" 1>&2 shtool_exit 1 fi # determine extension for original file orig=".orig" if [ ".$opt_b" != . ]; then orig="$opt_b" fi # apply sed(1) operation(s) if [ ".$files" != . ]; then # apply operation(s) to files substdone=no for file in $files; do test ".$file" = . && continue if [ ! -f $file ]; then echo "$msgprefix:Warning: file \`$file' not found or not a regular file" 1>&2 continue fi # handle interactive mode if [ ".$opt_i" = .yes ]; then eval "$sedcmd <$file >$file.new" skip=no if cmp $file $file.new >/dev/null 2>&1; then rm -f $file.new skip=yes else (diff -U1 $file $file.new >$tmpfile) 2>/dev/null if [ ".`cat $tmpfile`" = . ]; then (diff -C1 $file $file.new >$tmpfile) 2>/dev/null if [ ".`cat $tmpfile`" = . ]; then echo "$msgprefix:Warning: unable to show difference for file \`$file'" 1>&2 cp /dev/null $tmpfile fi fi rm -f $file.new cat $tmpfile echo dummy | awk '{ printf("%s", TEXT); }' TEXT=">>> Apply [Y/n]: " read input if [ ".$input" != .Y ] &&\ [ ".$input" != .y ] &&\ [ ".$input" != . ]; then skip=yes fi fi if [ ".$skip" = .yes ]; then if [ ".$opt_v" = .yes ]; then echo "file \`$file' -- skipped" 1>&2 fi continue fi fi # apply sed(1) operation(s) if [ ".$opt_v" = .yes ]; then echo "patching \`$file'" 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "\$ cp -p $file $file$orig" echo "\$ chmod u+w $file" echo "\$ $sedcmd <$file$orig >$file" fi if [ ".$opt_n" = .no ]; then cp -p $file $file$orig chmod u+w $file >/dev/null 2>&1 || true eval "$sedcmd <$file$orig >$file" fi # optionally fix timestamp if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "\$ touch -r $file$orig $file" fi if [ ".$opt_n" = .no ]; then touch -r $file$orig $file fi fi # optionally check whether any content change actually occurred if [ ".$opt_q" = .no ]; then if cmp $file$orig $file >/dev/null 2>&1; then if [ ".$opt_w" = .yes ]; then echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 fi else substdone=yes fi fi # optionally remove preserved original file if [ ".$opt_b" = . ]; then if [ ".$opt_t" = .yes ]; then echo "\$ rm -f $file$orig" fi if [ ".$opt_n" = .no ]; then rm -f $file$orig fi fi done if [ ".$opt_q" = .no ] && [ ".$opt_w" = .no ]; then if [ ".$substdone" = .no ]; then if [ ".$files_num" = .1 ]; then echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 else echo "$msgprefix:Warning: substitution resulted in no content change on any file" 1>&2 fi fi fi else # apply operation(s) to stdin/stdout if [ ".$opt_v" = .yes ]; then echo "patching " 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "\$ $sedcmd" fi if [ ".$opt_n" = .no ]; then eval "$sedcmd" fi fi shtool_exit 0 ;; platform ) ## ## platform -- Platform Identification Utility ## Copyright (c) 2003-2008 Ralf S. Engelschall ## # option post-processing if [ ".$opt_t" != . ]; then case "$opt_t" in binary ) # binary package id (OpenPKG RPM) opt_F="%-%" opt_L=yes opt_S="" opt_C="+" ;; build ) # build time checking (OpenPKG RPM) opt_F="%-%" opt_L=yes opt_S="" opt_C="+" ;; gnu ) # GNU config.guess style -- opt_F="%-unknown-%" opt_L=yes opt_S="" opt_C="+" ;; web ) # non-whitespace HTTP Server-header id opt_F="%-%" opt_S="/" opt_C="+" ;; summary) # human readable verbose summary information opt_F="Class: %[sc] (%[ac])\\nProduct: %[sp] (%[ap])\\nTechnology: %[st] (%[at])" opt_S=" " opt_C="/" ;; all-in-one ) # full-table all-in-one information opt_F="" opt_F="${opt_F}concise architecture class: %\\n" opt_F="${opt_F}regular architecture class: %{ac}\\n" opt_F="${opt_F}verbose architecture class: %[ac]\\n" opt_F="${opt_F}concise architecture product: %\\n" opt_F="${opt_F}regular architecture product: %{ap}\\n" opt_F="${opt_F}verbose architecture product: %[ap]\\n" opt_F="${opt_F}concise architecture technology: %\\n" opt_F="${opt_F}regular architecture technology: %{at}\\n" opt_F="${opt_F}verbose architecture technology: %[at]\\n" opt_F="${opt_F}concise system class: %\\n" opt_F="${opt_F}regular system class: %{sc}\\n" opt_F="${opt_F}verbose system class: %[sc]\\n" opt_F="${opt_F}concise system product: %\\n" opt_F="${opt_F}regular system product: %{sp}\\n" opt_F="${opt_F}verbose system product: %[sp]\\n" opt_F="${opt_F}concise system technology: %\\n" opt_F="${opt_F}regular system technology: %{st}\\n" opt_F="${opt_F}verbose system technology: %[st]" ;; * ) echo "$msgprefix:Error: invalid type \`$opt_t'" 1>&2 exit 1 ;; esac fi # assemble initial platform information UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\ UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\ UNAME_MACHINE='unknown' UNAME_SYSTEM=`(uname -s) 2>/dev/null` ||\ UNAME_SYSTEM='unknown' UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\ UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\ UNAME_RELEASE='unknown' UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}" AC=""; AP=""; AT="" SC=""; SP=""; ST="" # dispatch into platform specific sections case "${UNAME}" in # FreeBSD *:FreeBSD:* ) # determine architecture AC="${UNAME_MACHINE}" case "${AC}" in i386 ) AC="iX86" ;; esac AP="${AC}" AT="${AP}" if [ ".${AT}" = ".iX86" ]; then case "`(/sbin/sysctl -n hw.model) 2>&1`" in *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;; *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;; *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;; esac fi # determine system r=`echo "${UNAME_RELEASE}" |\ sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'` ST="FreeBSD ${r}" SP="${ST}" case "${r}" in 1.* ) SC="4.3BSD" ;; * ) SC="4.4BSD" ;; esac ;; # NetBSD *:NetBSD:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}" in i[3-6]86 ) AP="iX86" ;; esac AC="${AP}" # determine system r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` ST="NetBSD ${r}" SP="${ST}" case "${r}" in 0.* ) SC="4.3BSD" ;; * ) SC="4.4BSD" ;; esac ;; # OpenBSD *:OpenBSD:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}" in i[3-6]86 ) AP="iX86" ;; esac AC="${AP}" # determine system r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` ST="OpenBSD ${r}" SP="${ST}" SC="4.4BSD" ;; # DragonFly BSD *:DragonFly:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}" in i[3-6]86 ) AP="iX86" ;; esac AC="${AP}" # determine system r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` ST="DragonFly ${r}" SP="${ST}" SC="4.4BSD" ;; # GNU/Linux *:Linux:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in ia64 ) AT="IA64" ;; x86_64 ) AT='AMD64' ;; parisc ) AT="HPPA32" ;; parisc64 ) AT="HPPA64" ;; esac AP="${AT}" case "${AP}" in i[3-6]86 ) AP='iX86' ;; esac AC="${AP}" # determine system v_kern=`echo "${UNAME_RELEASE}" |\ sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'` v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\ env -i sort -n | sed -n -e '$p' | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null` ST="GNU/${v_libc}/<${v_kern}>" if [ -f /etc/lsb-release ]; then eval `( . /etc/lsb-release echo "SC=\"LSB${LSB_VERSION}\"" if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\"" fi ) 2>/dev/null` fi if [ ".$SP" = . ]; then for tagfile in x \ `cd /etc && \ /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \ sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \ echo redhat-release lsb-release` do [ ".${tagfile}" = .x ] && continue [ ! -f "/etc/${tagfile}" ] && continue n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'` v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | sed -e 'q' |\ sed -e 's/^/#/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ -e 's/^#.*$//'` case "`util_lower ${n}`" in redhat ) if [ ".`egrep '(Red Hat Enterprise Linux|CentOS)' /etc/${tagfile}`" != . ]; then n="ed at nterprise inux" else n="ed at inux" fi ;; debian ) n="Debian[ GNU/Linux]" ;; ubuntu ) n="Ubuntu[ GNU/Linux]" ;; fedora ) n=" Core[ GNU/Linux]" ;; suse ) n="[Novell ]SUSE[ Linux]" ;; mandrake*|mandriva ) n="Mandriva[ Linux]" ;; gentoo ) n="Gentoo[ GNU/Linux]" ;; slackware ) n="Slackware[ Linux]" ;; turbolinux ) n="TurboLinux" ;; unitedlinux ) n="UnitedLinux" ;; * ) n="${n}[ GNU/Linux]" ;; esac case "$n" in *"<"*">"* ) SP="$n <$v>" ;; * ) SP="$n $v" ;; esac break done fi [ ".$SP" = . ] && SP="${ST}" [ ".$SC" = . ] && SC="LSB" ;; # Sun Solaris *:SunOS:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in i86pc ) AT="iX86" case "`(/bin/isainfo -k) 2>&1`" in amd64 ) AT="AMD64" ;; esac ;; esac AP="${AT}" case "${AP}" in sun4[cdm] ) AP="SPARC32" ;; sun4[uv] ) AP="SPARC64" ;; sun4* ) AP="SPARC" ;; esac AC="${AP}" case "${AC}" in SPARC* ) AC="SPARC" ;; esac # determine system ST="[Sun ]SunOS ${UNAME_RELEASE}" v=`echo "${UNAME_RELEASE}" |\ sed -e 's;^4\.;1.;' \ -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \ -e 's;^5\.\([0-9][0-9]*\).*;\1;'` SP="[Sun ]Solaris $v" case "${UNAME_RELEASE}" in 4.* ) SC="4.3BSD" ;; 5.* ) SC="SVR4" ;; esac ;; # SCO UnixWare *:UnixWare:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in i[3-6]86 | ix86at ) AT="iX86" ;; esac AP="${AT}" # determine system v=`/sbin/uname -v` ST="[SCO ]UnixWare ${v}" SP="${ST}" SC="SVR${UNAME_RELEASE}" ;; # QNX *:QNX:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in x86pc ) AT="iX86" ;; esac AP="${AT}" # determine system v="${UNAME_RELEASE}" ST="QNX[ Neutrino RTOS] ${v}" v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'` SP="QNX[ Neutrino RTOS] ${v}" SC="QNX" ;; # SGI IRIX *:IRIX*:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}:${UNAME_SYSTEM}" in IP*:IRIX64 ) AP="MIPS64" ;; IP*:* ) AP="MIPS" ;; esac AC="${AP}" # determine system v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'` ST="[SGI ]IRIX ${v}" v="${UNAME_RELEASE}" SP="[SGI ]IRIX ${v}" SC="4.2BSD/SVR3" ;; # HP HP-UX *:HP-UX:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in ia64 ) AT="IA64" ;; 9000/[34]?? ) AT=M68K ;; 9000/[678][0-9][0-9]) sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523 ) AT="HPPA1.0" ;; 528 ) AT="HPPA1.1" ;; 532 ) AT="HPPA2.0" case "${sc_kernel_bits}" in 32 ) AT="${AT}n" ;; 64 ) AT="${AT}w" ;; esac ;; esac ;; esac AP="${AT}" case "${AP}" in HPPA* ) AP="HPPA" ;; esac AC="${AP}" # determine system v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'` ST="[HP ]-" SP="${ST}" case "${v}" in 10.* ) SC="SVR4.2" ;; [7-9]* ) SC="SVR4" ;; esac ;; # HP Tru64 (OSF1) *:OSF1:* ) # determine architecture AP="${UNAME_MACHINE}" case "${AP}" in alpha ) AP="Alpha" ;; esac alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\ sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | sed -e 'q'` AT="${AP}${alpha_type}" AC="${AP}" # determine system v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'` ST="[HP ]Tru64 ${v}" SP="${ST}" SC="OSF1" ;; # IBM AIX *:AIX:* ) # determine architecture cpu_arch=RS6000 if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then cpu_arch=PPC fi elif [ -d /QOpenSys ]; then # IBM i5/OS (aka OS/400) with PASE (Portable Application Solutions Environment) cpu_arch=PPC fi if [ -x /usr/bin/oslevel ]; then os_level=`/usr/bin/oslevel` else os_level="`uname -v`.`uname -r`" fi os_level=`echo "${os_level}" |\ sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \ -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'` AT="${cpu_arch}" AP="${AT}" AC="${AP}" # determine system ST="[IBM ]${os_level}" SP="${ST}" case "${os_level}" in [12]* ) SC="SVR2" ;; * ) SC="SVR4" ;; esac ;; # Apple Mac OS X (Darwin) *:Darwin:* ) # determine architecture AT="`uname -p`" case "${AT}" in powerpc ) AT="PPC" ;; esac AP="${AT}" case "${AP}" in i?86 ) AP="iX86" ;; esac AC="${AP}" # determine system unset v1; unset v2; unset v3 eval `echo "${UNAME_RELEASE}" |\ sed -e 's/^/#/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ -e 's/^#.*$/v1="0"/'` ST="[Apple ]<${UNAME_SYSTEM} ${v1}>${v2+.$v2}${v3+[.$v3]}" SP="$ST" v="`(sw_vers) 2>/dev/null | grep 'ProductVersion:' | sed -e 's/^ProductVersion:[^0-9]*\([0-9][0-9.]*\).*$/\1/'`" if [ ".$v" = . ]; then for name in System Server; do if [ -f /System/Library/CoreServices/${name}Version.plist ]; then v=`(defaults read "/System/Library/CoreServices/${name}Version" "ProductVersion") 2>/dev/null` [ ".$v" != . ] && break fi done fi if [ ".$v" != . ]; then unset v1; unset v2; unset v3 eval `echo "${v}" |\ sed -e 's/^/#/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ -e 's/^#.*$/v1="0"/'` SP="[Apple ]Mac OS X ${v1}${v2+.$v2}${v3+[.$v3]}" fi SC="4.4BSD/Mach3.0" ;; # Windows/Cygwin *:CYGWIN*:* ) # determine architecture AT="`uname -m`" AP="${AT}" case "${AP}" in i?86 ) AP="iX86" ;; esac AC="${AP}" # determine system unset v1; unset v2; unset v3 eval `echo "${UNAME_RELEASE}" |\ sed -e 's/^/#/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ -e 's/^#.*$/v1="0"/'` ST="Cygwin ${v1}${v2+.$v2}${v3+[.$v3]}" SP="$ST" SC="Windows" v=`echo "${UNAME_SYSTEM}" | sed -e 's/^CYGWIN_NT-//' |\ sed -e 's/^/#/' -e 's/^#\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' -e 's/^#.*$//'` case "$v" in 4.0 ) SC="$SC[ NT]" ;; 5.0 ) SC="$SC[ 2000]" ;; 5.1 ) SC="$SC[ XP]" ;; 6.0 ) SC="$SC[ Vista]" ;; esac ;; # TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO # *:XXX:* ) # ... # ;; # ...A STILL UNKNOWN PLATFORM... * ) AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"` AP="${AT}" AC="${AP}" v=`echo "${UNAME_RELEASE}" |\ sed -e 's/^/#/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ -e 's/^#.*$/?/'` ST="${UNAME_SYSTEM} ${v}" SP="${ST}" SC="${SP}" ;; esac # provide fallback values [ ".$AT" = . ] && AT="${AP:-${AC}}" [ ".$AP" = . ] && AP="${AT:-${AC}}" [ ".$AC" = . ] && AC="${AP:-${AT}}" [ ".$ST" = . ] && ST="${SP:-${SC}}" [ ".$SP" = . ] && SP="${ST:-${SC}}" [ ".$SC" = . ] && SC="${SP:-${ST}}" # support explicit enforced verbose/concise output if [ ".$opt_v" = .yes ]; then opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'` elif [ ".$opt_c" = .yes ]; then opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'` fi # provide verbose and concise variants AC_V=""; AC_N=""; AC_C="" AP_V=""; AP_N=""; AP_C="" AT_V=""; AT_N=""; AT_C="" SC_V=""; SC_N=""; SC_C="" SP_V=""; SP_N=""; SP_C="" ST_V=""; ST_N=""; ST_C="" for var_lc in at ap ac st sp sc; do case "$opt_F" in *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* ) var_uc=`util_upper "$var_lc"` eval "val=\"\$${var_uc}\"" val_V=""; val_N=""; val_C="" case "$opt_F" in *"%[${var_lc}]"* ) val_V=`echo ":$val" | \ sed -e 's/^://' \ -e 's;\[\([^]]*\)\];\1;g' \ -e 's;<\([^>]*\)>;\1;g' \ -e "s; ;§§;g" \ -e "s;/;%%;g" \ -e "s;§§;${opt_S};g" \ -e "s;%%;${opt_C};g"` eval "${var_uc}_V=\"\${val_V}\"" ;; esac case "$opt_F" in *"%{${var_lc}}"* | *"%${var_lc}"* ) val_N=`echo ":$val" | \ sed -e 's/^://' \ -e 's;\[\([^]]*\)\];;g' \ -e 's;<\([^>]*\)>;\1;g' \ -e "s; ;§§;g" \ -e "s;/;%%;g" \ -e "s;§§;${opt_S};g" \ -e "s;%%;${opt_C};g"` eval "${var_uc}_N=\"\${val_N}\"" ;; esac case "$opt_F" in *"%<${var_lc}>"* ) val_C=`echo ":$val" | \ sed -e 's/^://' \ -e 's;\[\([^]]*\)\];;g' \ -e 's;[^<]*<\([^>]*\)>[^<]*;\1;g' \ -e "s; ;§§;g" \ -e "s;/;%%;g" \ -e "s;§§;${opt_S};g" \ -e "s;%%;${opt_C};g"` eval "${var_uc}_C=\"\${val_C}\"" ;; esac ;; esac done # create output string output=`echo ":$opt_F" |\ sed -e "s/^://" \ -e "s;%\\[ac\\];${AC_V};g" \ -e "s;%{ac};${AC_N};g" \ -e "s;%ac;${AC_N};g" \ -e "s;%;${AC_C};g" \ -e "s;%\\[ap\\];${AP_V};g" \ -e "s;%{ap};${AP_N};g" \ -e "s;%ap;${AP_N};g" \ -e "s;%;${AP_C};g" \ -e "s;%\\[at\\];${AT_V};g" \ -e "s;%{at};${AT_N};g" \ -e "s;%at;${AT_N};g" \ -e "s;%;${AT_C};g" \ -e "s;%\\[sc\\];${SC_V};g" \ -e "s;%{sc};${SC_N};g" \ -e "s;%sc;${SC_N};g" \ -e "s;%;${SC_C};g" \ -e "s;%\\[sp\\];${SP_V};g" \ -e "s;%{sp};${SP_N};g" \ -e "s;%sp;${SP_N};g" \ -e "s;%;${SP_C};g" \ -e "s;%\\[st\\];${ST_V};g" \ -e "s;%{st};${ST_N};g" \ -e "s;%st;${ST_N};g" \ -e "s;%;${ST_C};g" \ -e 's/\\\\n/^/g' |\ tr '^' '\012'` # support lower/upper-case mapping if [ ".$opt_L" = .yes ]; then output=`util_lower "$output"` elif [ ".$opt_U" = .yes ]; then output=`util_upper "$output"` fi # display output string if [ ".$opt_n" = .yes ]; then echo . | awk '{ printf("%s", output); }' output="$output" else echo "$output" fi shtool_exit 0 ;; arx ) ## ## arx -- Extended archive command ## Copyright (c) 1999-2008 Ralf S. Engelschall ## ar_prg="$opt_C" ar_cmd="$1"; shift archive="$1"; shift files="$*" # walk through the file list and expand archives members ar_tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'` nfiles='' if [ ".$files" != . ]; then for file in $files; do if [ ! -f $file ]; then echo "$msgprefix:Error: input file not found: $file" 1>&2 shtool_exit 1 fi case $file in *.a ) if [ ! -d $ar_tmpdir ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $ar_tmpdir" 1>&2 fi mkdir $ar_tmpdir fi case $ar_tmpdir in .arx ) from="../$file" ;; * ) dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'` base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'` from="`cd $dir; pwd`/$base" ;; esac if [ ".$opt_t" = .yes ]; then echo "(cd $ar_tmpdir && $ar_prg x $from)" 1>&2 fi (cd $ar_tmpdir && eval $ar_prg x $from) if [ $? -ne 0 ]; then echo "$msgprefix:Error: member extraction failed for archive: $file" 1>&2 shtool_exit 1 fi for member in - `eval $ar_prg t $file | sed -e '/_\.SYMDEF/d'`; do [ ".$member" = .- ] && continue nfiles="$nfiles $ar_tmpdir/$member" done ;; * ) nfiles="$nfiles $file" ;; esac done fi # run the final archive command if [ ".$opt_t" = .yes ]; then echo "$ar_prg $ar_cmd $archive $nfiles" 1>&2 fi eval $ar_prg $ar_cmd $archive $nfiles if [ $? -ne 0 ]; then echo "$msgprefix:Error: archive command failed" 1>&2 shtool_exit $? fi # cleanup and die gracefully if [ -d $ar_tmpdir ]; then if [ ".$opt_t" = .yes ]; then echo "rm -rf $ar_tmpdir" 1>&2 fi rm -rf $ar_tmpdir fi shtool_exit 0 ;; slo ) ## ## slo -- Separate linker options by library class ## Copyright (c) 1998-2008 Ralf S. Engelschall ## DIFS="$IFS" # parse out -L and -l options from command line DIRS='' LIBS='' ARGV='' optprev='' for opt do # concatenate with previous option if exists if [ ".$optprev" != . ]; then opt="${optprev}${opt}"; optprev='' fi # remember options for arg if used stand-alone if [ ".$opt" = ".-L" ] || [ ".$opt" = ".-l" ]; then optprev="$opt" continue; fi # split argument into option plus option argument arg="`echo $opt | cut -c3-`" opt="`echo $opt | cut -c1-2`" # store into containers case $opt in -L) DIRS="$DIRS:$arg" ;; -l) LIBS="$LIBS:$arg" ;; *) ARGV="$ARGV $opt" ;; esac done # set linker default directories DIRS_DEFAULT='/lib:/usr/lib' if [ ".$LD_LIBRARY_PATH" != . ]; then DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH" fi # sort options by class DIRS_OBJ='' LIBS_OBJ='' DIRS_PIC='' LIBS_PIC='' DIRS_DSO='' LIBS_DSO='' # for each library... OIFS="$IFS"; IFS=':' for lib in $LIBS; do [ ".$lib" = . ] && continue found='no' found_indefdir='no' found_type='' found_dir='' # for each directory... OIFS2="$IFS"; IFS=":$DIFS" for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do [ ".$dir" = . ] && continue [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes [ ! -d $dir ] && continue # search the file OIFS3="$IFS"; IFS="$DIFS" for file in '' `cd $dir && env -i /bin/ls lib${lib}.* 2>/dev/null`; do [ ".$file" = . ] && continue case $file in *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* ) found=yes; found_type=DSO; break ;; *.lo|*.la ) found=yes; found_type=PIC ;; *.a ) if [ ".$found_type" = . ]; then found=yes found_type=OBJ fi ;; esac done IFS="$OIFS3" if [ ".$found" = .yes ]; then found_dir="$dir" break fi done IFS="$OIFS2" if [ ".$found" = .yes ]; then if [ ".$found_indefdir" != .yes ]; then eval "dirlist=\"\${DIRS_${found_type}}:\"" case "$dirlist" in *:$found_dir:* ) ;; * ) eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\"" ;; esac eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" else eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" fi else LIBS_OBJ="$LIBS_OBJ:$lib" #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`" #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1 #echo "slo:Warning: $dirlist" 1>&1 fi done IFS="$OIFS" # also pass-through unused dirs even if it's useless OIFS="$IFS"; IFS=':' for dir in $DIRS; do dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:" case "$dirlist" in *:$dir:* ) ;; * ) DIRS_OBJ="$DIRS_OBJ:$dir" ;; esac done IFS="$OIFS" # reassemble the options but separated by type for type in OBJ PIC DSO; do OIFS="$IFS"; IFS=':' eval "libs=\"\$LIBS_${type}\"" opts='' for lib in $libs; do [ ".$lib" = . ] && continue opts="$opts -l$lib" done eval "LIBS_${type}=\"$opts\"" eval "dirs=\"\$DIRS_${type}\"" opts='' for dir in $dirs; do [ ".$dir" = . ] && continue opts="$opts -L$dir" done eval "DIRS_${type}=\"$opts\"" IFS="$OIFS" done # give back results for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do eval "val=\"\$${var}\"" val="`echo $val | sed -e 's/^ *//'`" echo "${opt_p}${var}=\"${val}\"" done shtool_exit 0 ;; scpp ) ## ## scpp -- Sharing C Pre-Processor ## Copyright (c) 1999-2008 Ralf S. Engelschall ## srcs="$*" output="${opt_o}.n" # find a reasonable Awk awk='' paths=`echo $PATH |\ sed -e 's%/*:%:%g' -e 's%/$%%' \ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ -e 's/:/ /g'` for name in gawk nawk awk; do for path in $paths; do if [ -r "$path/$name" ]; then awk="$path/$name" break fi done if [ ".$awk" != . ]; then break fi done if [ ".$awk" = . ]; then echo "$msgprefix:Error: cannot find a reasonable Awk" 1>&2 shtool_exit 1 fi # parse source file(s) if [ ".$opt_v" = .yes ]; then echo "Parsing:" | $awk '{ printf("%s", $0); }' 1>&2 fi for src in $srcs; do if [ ".$opt_v" = .yes ]; then echo $src | $awk '{ printf(" %s", $0); }' 1>&2 fi if [ ".$opt_f" != . ]; then inputcmd="sed" OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_f; IFS="$OIFS" for e do inputcmd="$inputcmd -e '$e'" done inputcmd="$inputcmd '$src'" else inputcmd="cat '$src'" fi eval $inputcmd |\ $awk ' BEGIN { ln = 0; fln = 0; level = 0; mode = ""; store = ""; } { ln++; } /^#if.*/ { level++; } /^#if [a-zA-Z_][a-zA-Z0-9_]* *$/ { if ($2 == define) { mode = "D"; printf("D:#line %d \"%s\"\n", ln, src); next; } } /^#endif.*/ { level--; if (mode == "D" && level == 0) { mode = ""; next; } } /^[a-zA-Z_][a-zA-Z0-9_].*;.*/ { if ($1 == class) { printf("V:#line %d \"%s\"\n", ln, src); printf("V:%s\n", $0); printf("J:%s\n", $0); next; } } /^[a-zA-Z_][a-zA-Z0-9_].*=.*/ { if ($1 == class) { printf("V:#line %d \"%s\"\n", ln, src); printf("V:%s\n", $0); printf("J:%s\n", $0); next; } } /^[a-zA-Z_][a-zA-Z0-9_]*/ { if ($1 == class) { fln = ln; store = $0; mode = "F"; next; } } /^\{ *$/ { if (mode == "F") { printf("F:#line %d \"%s\"\n", fln, src); printf("F:%s;\n", store); printf("I:%s;\n", store); store = ""; mode = ""; next; } } { if (mode == "D") printf("D:%s\n", $0); else if (mode == "F") store = store " " $0; } ' "src=$src" "define=$opt_D" "class=$opt_C" >>$tmpfile done if [ ".$opt_v" = .yes ]; then echo "" 1>&2 fi # start generating output header echo "/* $opt_o -- autogenerated from $opt_t, DO NOT EDIT! */" >$output echo "#line 1 \"$opt_t\"" >>$output sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd' |\ sed -e "/^${opt_M} *\$/d" >>$output # merge in the define blocks grep '^D:' $tmpfile | sed -e 's/^D://' >>$output # generate standard prolog echo "#line 1 \"_ON_THE_FLY_\"" >>$output echo "" >>$output echo "/* make sure the scpp source extensions are skipped */" >>$output echo "#define $opt_D 0" >>$output echo "#define $opt_C /**/" >>$output # generate namespace hiding for variables echo "" >>$output echo "/* move intern variables to hidden namespace */" >>$output grep '^J:' $tmpfile | sed >>$output \ -e 's/^J://' \ -e 's/ */ /g' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\];.*$/#define \1 __\1/' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\] =.*$/#define \1 __\1/' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\);.*$/#define \1 __\1/' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\) =.*$/#define \1 __\1/' # generate namespace hiding for functions echo "" >>$output echo "/* move intern functions to hidden namespace */" >>$output grep '^I:' $tmpfile | sed >>$output \ -e 's/^I://' \ -e 's/\([ (]\) */\1/g' \ -e 's/ *\([),]\)/\1/g' \ -e 's/^[^(]*[ *]\([a-zA-Z0-9_]*\)(.*$/#define \1 __\1/' # generate prototypes for variables echo "" >>$output echo "/* prototypes for intern variables */" >>$output grep '^V:' $tmpfile | sed >>$output \ -e 's/^V://' \ -e 's/ */ /g' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\);.*$/\1;/' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\) =.*$/\1;/' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\);.*$/\1;/' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\) =.*$/\1;/' \ -e 's/ ;/;/g' \ -e "s/^$opt_C /extern /" # generate prototypes for functions echo "" >>$output echo "/* prototypes for intern functions */" >>$output grep '^F:' $tmpfile | sed >>$output \ -e 's/^F://' \ -e 's/\([ (]\) */\1/g' \ -e 's/ *\([),]\)/\1/g' \ -e 's/\([* ]\)[a-zA-Z0-9_]*,/\1,/g' \ -e 's/\([* ]\)[a-zA-Z0-9_]*);/\1);/g' \ -e 's/(\*[a-zA-Z0-9_]*)(/(*)(/g' \ -e 's/\([ (]\) */\1/g' \ -e 's/ *\([),]\)/\1/g' \ -e "s/^$opt_C /extern /" # finish generating output header n=`(echo ''; sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd') |\ wc -l | sed -e 's;^ *\([0-9]*\) *$;\1;'` echo "#line $n \"$opt_t\"" >>$output sed <$opt_t -e "/^${opt_M} *\$/,\$p" -e 'd' |\ sed -e "/^${opt_M} *\$/d" >>$output # create final output file if [ -f $opt_o ]; then if [ ".$opt_p" = .yes ]; then grep -v '^#line' $opt_o >$tmpfile.o grep -v '^#line' $output >$tmpfile.n out_old="$tmpfile.o" out_new="$tmpfile.n" else out_old="$opt_o" out_new="$output" fi if cmp -s $out_old $out_new; then : else cp $output $opt_o fi else cp $output $opt_o fi rm -f $output rm -f $tmpfile $tmpfile.* >/dev/null 2>&1 shtool_exit 0 ;; version ) ## ## version -- Maintain a version information file ## Copyright (c) 1994-2008 Ralf S. Engelschall ## file="$1" # determine prefix and name name="$opt_n" prefix="$opt_p" # determine current version triple="$opt_s" if [ ".$triple" != . ]; then # use given triple if [ ".`echo $triple | grep '[0-9]*.[0-9]*[sabp.][0-9]*'`" = . ]; then echo "$msgprefix:Error: invalid argument to option \`-s': \`$opt_s'" 1>&2 shtool_exit 1 fi eval `echo $triple |\ sed -e 's%\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\).*%\ ver="\1";rev="\2";typ="\3";lev="\4"%'` tim=calc elif [ -r $file ]; then # determine triple from given file eval `grep 'Version [0-9]*.[0-9]*[sabp.][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $file |\ sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\ ver="\1";rev="\2";typ="\3";lev="\4";tim="\5"%' -e 'q'` else # intialise to first version ver=0 rev=1 typ=. lev=0 tim=calc fi # determine new version in batch if [ ".$opt_i" != . ]; then case $opt_i in v ) ver=`expr $ver + 1` rev=0 lev=0 ;; r ) rev=`expr $rev + 1` lev=0 ;; l ) lev=`expr $lev + 1` ;; * ) echo "$msgprefix:Error: invalid argument to option \`-i': \`$opt_i'" 1>&2 shtool_exit 1 ;; esac tim=calc fi # determine new version interactively if [ ".$opt_e" = .yes ]; then echo "old version: ${ver}.${rev}${typ}${lev}" while [ 1 ]; do echo dummy | awk '{ printf("new version: "); }' read triple case $triple in [0-9]*.[0-9]*[sabp.][0-9]* ) ;; * ) echo "$msgprefix:Error: invalid version string entered: \`$triple'" 1>&2 continue ;; esac break done eval `echo $triple |\ sed -e 's%^\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\)$%\ ver="\1";rev="\2";typ="\3";lev="\4"%'` tim=calc fi # determine hexadecimal and libtool value of version case $typ in a ) typnum=0; levnum=$lev ;; b ) typnum=1; levnum=$lev ;; p | . ) typnum=2; levnum=$lev ;; s ) typnum=15; levnum=255 ;; # snapshots are special esac hex=`echo "$ver:$rev:$typnum:$levnum" |\ awk -F: '{ printf("0x%x%02x%1x%02x", $1, $2, $3, $4); }' |\ tr 'abcdef' 'ABCDEF'` ltv=`echo "$ver:$rev:$typnum:$levnum" |\ awk -F: '{ printf("%d:%d", $1*10 + $2, $3*10 + $4); }'` # determine date if [ ".$tim" = .calc ]; then day=`date '+%d'` month=`date '+%m'` year=`date '+%Y' 2>/dev/null` if [ ".$time_year" = . ]; then year=`date '+%y'` case $year in [5-9][0-9]) year="19$year" ;; [0-4][0-9]) year="20$year" ;; esac fi case $month in 1|01) month='Jan' ;; 2|02) month='Feb' ;; 3|03) month='Mar' ;; 4|04) month='Apr' ;; 5|05) month='May' ;; 6|06) month='Jun' ;; 7|07) month='Jul' ;; 8|08) month='Aug' ;; 9|09) month='Sep' ;; 10) month='Oct' ;; 11) month='Nov' ;; 12) month='Dec' ;; esac tim="${day}-${month}-${year}" fi # perform result actions mode=show if [ ".$opt_i" != . ]; then mode=edit elif [ ".$opt_e" = .yes ]; then mode=edit elif [ ".$opt_s" != . ]; then mode=edit fi if [ ".$mode" = .show ]; then # just display the current version case $opt_d in short ) echo "${ver}.${rev}${typ}${lev}" ;; long ) echo "${ver}.${rev}${typ}${lev} ($tim)" ;; libtool ) echo "${ltv}" ;; hex ) echo "${hex}" ;; * ) echo "$msgprefix:Error: invalid argument to option \`-d': \`$opt_d'" 1>&2 shtool_exit 1 ;; esac else # update the version file # pre-generate various strings triple="${ver}.${rev}${typ}${lev}" vHex="$hex" vShort="${triple}" vLong="${triple} (${tim})" vTeX="This is ${name}, Version ${triple} (${tim})" vGNU="${name} ${triple} (${tim})" vWeb="${name}/${triple}" vSCCS="@(#)${name} ${triple} (${tim})" vRCS="\$Id: ${name} ${triple} (${tim}) \$" # determine string out of filename # (do NOT try to optimize this in any way because of portability) filestr=`util_upper "$file" | tr './%+' '____' | sed -e 's/-/_/g'` # generate uppercase prefix prefixupper=`util_upper "$prefix"` # create the version file according the the selected language echo "new version: ${vLong}" cp /dev/null $file case $opt_l in txt ) echo >>$file "" echo >>$file " ${file} -- Version Information for ${name} (syntax: Text)" echo >>$file " [automatically generated and maintained by GNU shtool]" echo >>$file "" echo >>$file " $vTeX" echo >>$file "" ;; c ) echo >>$file "/*" echo >>$file "** ${file} -- Version Information for ${name} (syntax: C/C++)" echo >>$file "** [automatically generated and maintained by GNU shtool]" echo >>$file "*/" echo >>$file "" echo >>$file "#ifdef _${filestr}_AS_HEADER_" echo >>$file "" echo >>$file "#ifndef _${filestr}_" echo >>$file "#define _${filestr}_" echo >>$file "" echo >>$file "#define ${prefixupper}VERSION ${vHex}" echo >>$file "" echo >>$file "typedef struct {" echo >>$file " const int v_hex;" echo >>$file " const char *v_short;" echo >>$file " const char *v_long;" echo >>$file " const char *v_tex;" echo >>$file " const char *v_gnu;" echo >>$file " const char *v_web;" echo >>$file " const char *v_sccs;" echo >>$file " const char *v_rcs;" echo >>$file "} ${prefix}version_t;" echo >>$file "" echo >>$file "extern ${prefix}version_t ${prefix}version;" echo >>$file "" echo >>$file "#endif /* _${filestr}_ */" echo >>$file "" echo >>$file "#else /* _${filestr}_AS_HEADER_ */" echo >>$file "" echo >>$file "#define _${filestr}_AS_HEADER_" echo >>$file "#include \"${file}\"" echo >>$file "#undef _${filestr}_AS_HEADER_" echo >>$file "" echo >>$file "${prefix}version_t ${prefix}version = {" echo >>$file " ${vHex}," echo >>$file " \"${vShort}\"," echo >>$file " \"${vLong}\"," echo >>$file " \"${vTeX}\"," echo >>$file " \"${vGNU}\"," echo >>$file " \"${vWeb}\"," echo >>$file " \"${vSCCS}\"," echo >>$file " \"${vRCS}\"" echo >>$file "};" echo >>$file "" echo >>$file "#endif /* _${filestr}_AS_HEADER_ */" echo >>$file "" ;; m4 ) echo >>$file "##" echo >>$file "## ${file} -- Version Information for ${name} (syntax: M4)" echo >>$file "## [automatically generated and maintained by GNU shtool]" echo >>$file "##" echo >>$file "" echo >>$file "m4_define([v_hex], [${vHex}])" echo >>$file "m4_define([v_short], [${vShort}])" echo >>$file "m4_define([v_long], [${vLong}])" echo >>$file "m4_define([v_tex], [${vTeX}])" echo >>$file "m4_define([v_gnu], [${vGNU}])" echo >>$file "m4_define([v_web], [${vWeb}])" echo >>$file "m4_define([v_sccs], [${vSCCS}])" echo >>$file "m4_define([v_rcs], [${vRCS}])" echo >>$file "" ;; perl ) echo >>$file "##" echo >>$file "## ${file} -- Version Information for ${name} (syntax: Perl)" echo >>$file "## [automatically generated and maintained by GNU shtool]" echo >>$file "##" echo >>$file "" echo >>$file "our \$${prefix}version = {" echo >>$file " 'v_hex' => ${vHex}," echo >>$file " 'v_short' => \"${vShort}\"," echo >>$file " 'v_long' => \"${vLong}\"," echo >>$file " 'v_tex' => \"${vTeX}\"," echo >>$file " 'v_gnu' => \"${vGNU}\"," echo >>$file " 'v_web' => \"${vWeb}\"," echo >>$file " 'v_sccs' => \"${vSCCS}\"," echo >>$file " 'v_rcs' => \"\\${vRCS}/\"" echo >>$file "};" echo >>$file "" echo >>$file "1;" echo >>$file "" ;; python ) echo >>$file "##" echo >>$file "## ${file} -- Version Information for ${name} (syntax: Python)" echo >>$file "## [automatically generated and maintained by GNU shtool]" echo >>$file "##" echo >>$file "" echo >>$file "class ${prefix}version:" echo >>$file " v_hex = ${vHex}" echo >>$file " v_short = \"${vShort}\"" echo >>$file " v_long = \"${vLong}\"" echo >>$file " v_tex = \"${vTeX}\"" echo >>$file " v_gnu = \"${vGNU}\"" echo >>$file " v_web = \"${vWeb}\"" echo >>$file " v_sccs = \"${vSCCS}\"" echo >>$file " v_rcs = \"${vRCS}\"" echo >>$file "" ;; * ) echo "$msgprefix:Error: invalid argument to option \`-l': \`$opt_l'" 1>&2 shtool_exit 1 ;; esac fi shtool_exit 0 ;; path ) ## ## path -- Deal with program paths ## Copyright (c) 1998-2008 Ralf S. Engelschall ## namelist="$*" # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # split path string paths="`echo $opt_p |\ sed -e 's/^:/.:/' \ -e 's/::/:.:/g' \ -e 's/:$/:./' \ -e 's/:/ /g'`" # SPECIAL REQUEST # translate forward to reverse path if [ ".$opt_r" = .yes ]; then if [ "x$namelist" = "x." ]; then rp='.' else rp='' for pe in `IFS="$IFS/"; echo $namelist`; do rp="../$rp" done fi echo $rp | sed -e 's:/$::' shtool_exit 0 fi # SPECIAL REQUEST # strip out directory or base name if [ ".$opt_d" = .yes ]; then echo "$namelist" |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' shtool_exit 0 fi if [ ".$opt_b" = .yes ]; then echo "$namelist" |\ sed -e 's;.*/\([^/]*\)$;\1;' shtool_exit 0 fi # MAGIC SITUATION # Perl Interpreter (perl) if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then rm -f $tmpfile >/dev/null 2>&1 touch $tmpfile found=0 pc=99 for dir in $paths; do dir=`echo $dir | sed -e 's;/*$;;'` nc=99 for name in perl perl5 miniperl; do if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then perl="$dir/$name" pv=`$perl -e 'printf("%.3f", $]);'` echo "$pv:$pc:$nc:$perl" >>$tmpfile found=1 fi nc=`expr $nc - 1` done pc=`expr $pc - 1` done if [ $found = 1 ]; then perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`" rm -f $tmpfile >/dev/null 2>&1 echo "$perl" shtool_exit 0 fi rm -f $tmpfile >/dev/null 2>&1 shtool_exit 1 fi # MAGIC SITUATION # C pre-processor (cpp) if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then echo >$tmpfile.c "#include " echo >>$tmpfile.c "Syntax Error" # 1. try the standard cc -E approach cpp="${CC-cc} -E" (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # 2. try the cc -E approach and GCC's -traditional-ccp option cpp="${CC-cc} -E -traditional-cpp" (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # 3. try a standalone cpp command in path and lib dirs for path in $paths /lib /usr/lib /usr/local/lib; do path=`echo $path | sed -e 's;/*$;;'` if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then cpp="$path/cpp" break fi done if [ ".$cpp" != . ]; then (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # ok, we gave up... cpp='' fi fi fi fi rm -f $tmpfile >/dev/null 2>&1 rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1 if [ ".$cpp" != . ]; then echo "$cpp" shtool_exit 0 fi shtool_exit 1 fi # STANDARD SITUATION # iterate over names for name in $namelist; do # iterate over paths for path in $paths; do path=`echo $path | sed -e 's;/*$;;'` if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then if [ ".$opt_s" != .yes ]; then echo "$path/$name" fi shtool_exit 0 fi done done shtool_exit 1 ;; esac shtool_exit 0 ./numdiff-5.8.1/numdiff.h0000444000175000017500000005265512215353073014141 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #ifndef _NUMDIFF_H_ #define _NUMDIFF_H_ #include "system.h" #if defined(HAVE_LIBGMP) && !defined(DISABLE_GMP) #define USE_GMP 1 #endif /* defined(HAVE_LIBGMP) && !defined(DISABLE_GMP) */ /* The type of a hash value. */ typedef size_t hash_value; verify (hash_value_is_unsigned, ! TYPE_SIGNED (hash_value)); /* Rotate an unsigned value to the left. */ #define ROL(v, n) ((v) << (n) | (v) >> (sizeof (v) * CHAR_BIT - (n))) /* Given a hash value and a new character, return a new hash value. */ #ifdef _DEBUG_HASHING_ #define HASH(h, c) (putc((c), stderr), (c) + ROL (h, 7)) #else #define HASH(h, c) ((c) + ROL (h, 7)) #endif /* Error codes */ #define OK 0 #define LINE_INTERR 1 #define EOF_REACHED 2 #define READING_ERROR 3 #define OUT_OF_MEMORY 4 /* *** */ #define OPEN_FAILED 5 #define WRONG_USAGE 6 #define FILE_IS_BINARY 7 /* Begin section -- Math types */ #include"number.h" #ifdef USE_GMP #include typedef mpf_t Real; typedef struct { mpf_t re, im; } Complex; #else /* not USE_GMP */ typedef bc_num Real; typedef struct { bc_num re, im; } Complex; #endif /* USE_GMP */ /* End section -- Math types */ #define THRLIST_OK 0 #define THRLIST_INVALID_FORMAT -1 #define THRLIST_INVALID_RANGES -2 /* A structure of type 'thrlist_node' is used to construct lists of threshold values. */ struct __thrlist_node { Real threshold; /* the threshold value */ /* BEG1-END1 and BEG2-END2 are the ranges of fields */ /* to which the specified THRESHOLD value applies. */ /* The two ranges must have the same length, but refer */ /* to different files. */ unsigned long beg1, end1; unsigned long beg2, end2; /* DOUBLE_RANGE_SPEC is a boolean value, which is 1 if */ /* BEG1-END1 and BEG2-END2 have been both explicitely */ /* set via the command line through a specification of */ /* the form: */ /* BEG1-END1:BEG2-END2 */ /* and otherwise is equal to 0. */ int double_range_spec; /* pointer to the next node in the list */ struct __thrlist_node *next; }; typedef struct __thrlist_node thrlist_node; /* A pointer to a list of threshold values */ typedef thrlist_node *thrlist; struct numfmt { char *currency; /* currency */ char dp; /* decimal point */ char thsep; /* thousands separator */ unsigned grouping; /* Number of digits in each group */ char pos_sign; /* positive sign */ char neg_sign; /* negative sign */ char ech; /* prefix for decimal exponent */ char iu; /* symbol of the imaginary unit */ }; /* A structure of this type is used to store */ /* information about the legal format for the */ /* numbers in input. */ /* This is the number of the fields in the 'numftm' structure having "char" type. None of them can be a digit and they must have all different values (see the code of the function valid_numfmt() in the file options.c). */ #define NUMFMT_CHARS 6 typedef struct { unsigned char* ptr; size_t len, size; } flg_array; /* A structure of this type is used to store the information retrieved from the execution of a diff command */ typedef struct { /* Mask of the options */ unsigned long optmask; /* Output mode. This field can take any of the values */ /* OUTMODE_* (see below) */ int output_mode; /* This is a mask of bits specifying the fields of the first file which must be ignored. */ unsigned char ghostmask1[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields of the second file which must be ignored. */ unsigned char ghostmask2[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the first file for which partial blurring must be enabled during the filtering procedure. */ unsigned char pblurmask1[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the second file for which partial blurring must be enabled during the filtering procedure. */ unsigned char pblurmask2[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the first file for which total blurring must be enabled during the filtering procedure. */ unsigned char tblurmask1[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the second file for which total blurring must be enabled during the filtering procedure. */ unsigned char tblurmask2[FIELDMASK_SIZE]; /* This parameter specifies how the relative errors */ /* have to be computed. It may have one of the */ /* following values: */ /* CLASSIC_FORMULA 0 (the default one) */ /* WR_TO_FIRST_FILE 1 */ /* WR_TO_SECOND_FILE 2 */ int relerr_formula; /* Tolerance thresholds for absolute and relative errors */ thrlist maxabserr, maxrelerr; /* These variables are used to print statistics */ Real Labserr, Crelerr, Lrelerr, Cabserr, N1abserr, N1disperr, N2abserr, N2disperr; int Nentries, Ndisperr; /* Flag > 0 --> If a numeric field in the first file is greater than the */ /* corresponding numeric field in the second file, then the */ /* related difference is ignored, i.e. it is never output */ /* Flag < 0 --> If a numeric field in the first file is less than the */ /* corresponding numeric field in the second file, then the */ /* related difference is ignored, i.e. it is never output */ /* Flag = 0 --> Standard behavior: the difference between 2 corresponding */ /* numeric fields (one in the first file, the other one in */ /* the second file) is always considered and it is output */ /* whenever its absolute value is greater than the given */ /* tolerance thresholds for the absolute and relative errors.*/ signed char flag; /* Internal scale (number of digits of accuracy) */ int iscale; /* Files to be compared */ const char *file1, *file2; /* Internal fields separators (IFS) for file1 and file2 */ char **ifs1, **ifs2; /* Numeric conventions for file1 (.nf1) and file2 (.nf2) */ struct numfmt nf1, nf2; } argslist ; /* A structure of this type is used to store the options */ /* set by the user */ #define _H_MASK 0x00000001 /* -h option, used to recall help */ #define _A_MASK 0x00000002 /* -a option, used to set tolerance for abs. error */ #define _R_MASK 0x00000004 /* -r option, used to set tolerance for rel. error */ #define _2_MASK 0x00000008 /* -2 option, used to enable the "strict" control */ #define _S_MASK 0x00000010 /* -s option, used to explicitly set IFS */ #define _B_MASK 0x00000020 /* -b option, used to enable the "brief" mode */ #define _F_MASK 0x00000040 /* -f option, used to enable the "filter-only" mode */ #define _Q_MASK 0x00000080 /* -q option, used to enable "quiet" mode */ #define _X_MASK 0x00000100 /* -# option, used to set the precision */ #define _D_MASK 0x00000200 /* -d option, used to set the decimal point */ #define _T_MASK 0x00000400 /* -t option, used to set the thousands separator */ #define _G_MASK 0x00000800 /* -g option, used to set the 'grouping' */ #define _P_MASK 0x00001000 /* -p option, used to set the character 'positive sign' */ #define _N_MASK 0x00002000 /* -n option, used to set the character 'negative sign' */ #define _E_MASK 0x00004000 /* -e option, used to set prefix for decimal exponent */ #define _I_MASK 0x00008000 /* -i option, used to set the symbol of the imaginary unit */ #define _L_MASK 0x00010000 /* -l option, used to redirect the standard error on a file */ #define _O_MASK 0x00020000 /* -o option, used to redirect the standard output on a file */ #define _Z_MASK 0x00040000 /* -z option, used to activate the filter (normal mode) */ #define _SZ_MASK 0x00080000 /* -Z option, used to activate the filter (alternative mode) */ #define _SX_MASK 0x00100000 /* -X option, used to select which fields in the lines of the files must be ignored */ #define _SP_MASK 0x00200000 /* -P option, used to ignore negative errors */ #define _SN_MASK 0x00400000 /* -N option, used to ignore positive errors */ #define _SU_MASK 0x00800000 /* -U option, used to enable the "dummy" mode */ #define _SE_MASK 0x01000000 /* -E option, used to enable the "essential" mode */ #define _SV_MASK 0x02000000 /* -V option, used to enable the "verbose" mode */ #define _SO_MASK 0x04000000 /* -O option, used to enable the "overview" mode */ #define _SS_MASK 0x08000000 /* -S option, used to print statistics */ #define _SI_MASK 0x10000000 /* -I option, used to ignore case while comparing non numerical fields */ #define _SH_MASK 0x20000000 /* -H option, by filtering assume large files and many scattered small changes */ #define _M_MASK 0x40000000 /* -m option, by filtering try hard to find a smaller set of changes */ #define _V_MASK 0x80000000 /* -v option, used to show version number, Copyright and No-Warrany */ /* Remark: Intentionally there are no masks for the options -c and -F */ /* Output modes: verbose, normal, brief, and quiet. */ /* Do not change the relative order of the values of */ /* these macros, the code in cmp_lines() (see file */ /* cmpfns.c) relies on the fact that: */ /* OUTMODE_VERBOSE > OUTMODE_NORMAL > OUTMODE_COINCISE */ /* > OUTMODE_BRIEF > OUTMODE_QUIET > OUTMODE_OVERVIEW */ #define OUTMODE_VERBOSE 4 #define OUTMODE_NORMAL 3 #define OUTMODE_COINCISE 2 #define OUTMODE_BRIEF 1 #define OUTMODE_QUIET 0 #define OUTMODE_OVERVIEW -1 /* Methods to compute the relative differences */ #define CLASSIC_FORMULA 0 #define WR_TO_FIRST_FILE 1 #define WR_TO_SECOND_FILE 2 #ifndef PACKAGE #define PACKAGE "numdiff" #endif #ifndef LOCALEDIR #define LOCALEDIR "/usr/local/share/locale/" #endif /* The character representing the number zero */ #define CHAR_ZERO '0' /* The character representing the number one */ #define CHAR_ONE '1' /* The character representing the number nine */ #define CHAR_NINE '9' /* newline character */ #define NEWLINE '\n' /* Predefined values for .nf*.currency (currency name) .nf*.dp (decimal point) .nf*.thsep (thousands separator) .nf*.grouping (number of digits in each thousands group) .nf*.pos_sign (positive sign) .nf*.neg_sign (negative sign) .nf*.ech (prefix for decimal exponent) .nf*.iu (symbol of the imaginary unit) .iscale (decimal digits of accuracy) */ #define CURRENCY "" #define DP '.' #define THSEP ',' #define GROUPING 3 #define POS_SIGN '+' #define NEG_SIGN '-' #define ECH 'e' #define IU 'i' #define ISCALE 35 /* Largest possible value for .iscale */ #define MAX_ISCALE 180 /* Largest possible exponent accepted by Numdiff when a number is written in scientific notation */ #define MAX_EXPN +1073741824L /* Lowest possible exponent accepted by Numdiff when a number is written in scientific notation */ #define MIN_EXPN -1073741824L /* Macro to move ahead a pointer */ #define move_ahead(ptr) ptr++ /* Character classification macros. The macro CTYPE_DOMAIN is defined in "system.h". */ #define is_digit(c) ((unsigned int) (c) - '0' <= 9 ? 1 : 0) #define is_punct(c) (CTYPE_DOMAIN((unsigned char)(c)) && ispunct((unsigned char)(c))) #define is_print(c) (CTYPE_DOMAIN((unsigned char)(c)) && isgraph((unsigned char)(c)) && ((unsigned int) (c) - '0' > 9)) #define is_space(c) (CTYPE_DOMAIN((unsigned char)(c)) && isspace((unsigned char)(c))) /* Mathematical functions */ int cmp (Real p, Real q); int is0 (Real u); int smart_cmp (const Complex* pz1, const Complex* pz2, int flag); void printno (Real u, int m); extern Real Zero, Inf; void init_mpa(int iscale); void initR (Real* px); void initC (Complex* pz); void copyR (Real* dst, Real src); void copyC (Complex* dst, Complex src); #ifdef _MPA_DEBUG void debug_printno (Real u, int m); #endif /* _MPA_DEBUG */ void str2R (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Real* pr); void str2C (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Complex* pc); void add (Real s, Real t, Real* q, int iscale); void square (Real s, Real* q, int iscale); void divide (Real s, Real t, Real* q, int iscale); void divide_by_int (Real* q, int d, int iscale); void square_root (Real* q, int iscale); void Cabs (Complex z, Real* pm, int iscale); void Csub (Complex z1, Complex z2, Complex* pw, int iscale); void delR (Real* px); void delC (Complex* pz); void end_mpa(void); /* Functions used to manipulate lists of threshold specifications (see thrlist.c) */ thrlist thrlist_new (void); int thrlist_add (thrlist *plist, const char* def); int thrlist_cmp (Real r, thrlist list, unsigned long fieldno1, unsigned long fieldno2); void thrlist_dispose (thrlist *plist); /* Shared definitions coming from GNU DIFF Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #define TAB_WIDTH 8 /* Added by Ivano Primi, July 31 2008 */ #define MIN_ATMOST_NCOLS 16 #define DEF_ATMOST_NCOLS 130 #define MAX_ATMOST_NCOLS 512 /* What kind of changes a hunk contains. */ enum changes { /* No changes: lines common to both files. */ UNCHANGED, /* Deletes only: lines taken from just the first file. */ OLD, /* Inserts only: lines taken from just the second file. */ NEW, /* Both deletes and inserts: a hunk containing both old and new lines. */ CHANGED }; /* Variables for command line options */ #ifndef GDIFF_OPTIONS # define XTERN extern #else # define XTERN #endif /* The significance of white space during comparisons. */ XTERN enum { /* All white space is significant (the default). */ IGNORE_NO_WHITE_SPACE, /* Ignore changes due to tab expansion. */ IGNORE_TAB_EXPANSION, /* Ignore changes in horizontal white space. */ IGNORE_SPACE_CHANGE, /* Ignore all horizontal white space. */ IGNORE_ALL_SPACE } ignore_white_space; /* Treat both files as binary files (meaningful only under Doz/Windoz) */ XTERN bool binary; /* Nonzero means to not show common lines. */ XTERN bool suppress_common_lines; /* Expand tabs in the output so the text lines up properly despite the characters added to the front of each line (-T). */ XTERN bool expand_tabs; /* The half line width and column 2 offset for OUTPUT_SDIFF. */ XTERN unsigned int sdiff_half_width; XTERN unsigned int sdiff_column2_offset; /* Use heuristics for better speed with large files with a small density of changes. */ XTERN bool speed_large_files; /* Name of program the user invoked (for error messages). */ XTERN char *program_name; /* The result of comparison is an "edit script": a chain of `struct change'. Each `struct change' represents one place where some lines are deleted and some are inserted. LINE0 and LINE1 are the first affected lines in the two files (origin 0). DELETED is the number of lines deleted here from file 0. INSERTED is the number of lines inserted here in file 1. If DELETED is 0 then LINE0 is the number of the line before which the insertion was done; vice versa for INSERTED and LINE1. */ struct change { struct change *link; /* Previous or next edit command */ lin inserted; /* # lines of file 1 changed here. */ lin deleted; /* # lines of file 0 changed here. */ lin line0; /* Line number of 1st deleted line. */ lin line1; /* Line number of 1st inserted line. */ bool ignore; /* Flag used in context.c. */ }; /* Structures that describe the input files. */ /* Data on one input file being compared. */ struct file_data { int desc; /* File descriptor */ char const *name; /* File name */ struct stat stat; /* File status */ /* Buffer in which text of file is read. */ word *buffer; /* Allocated size of buffer, in bytes. Always a multiple of sizeof *buffer. */ size_t bufsize; /* Number of valid bytes now in the buffer. */ size_t buffered; /* Array of pointers to lines in the file. */ char const **linbuf; /* linbuf_base <= buffered_lines <= valid_lines <= alloc_lines. linebuf[linbuf_base ... buffered_lines - 1] are possibly differing. linebuf[linbuf_base ... valid_lines - 1] contain valid data. linebuf[linbuf_base ... alloc_lines - 1] are allocated. */ lin linbuf_base, buffered_lines, valid_lines, alloc_lines; /* Pointer to end of prefix of this file to ignore when hashing. */ char const *prefix_end; /* Count of lines in the prefix. There are this many lines in the file before linbuf[0]. */ lin prefix_lines; /* Pointer to start of suffix of this file to ignore when hashing. */ char const *suffix_begin; /* Vector, indexed by line number, containing an equivalence code for each line. It is this vector that is actually compared with that of another file to generate differences. */ lin *equivs; /* Vector, like the previous one except that the elements for discarded lines have been squeezed out. */ lin *undiscarded; /* Vector mapping virtual line numbers (not counting discarded lines) to real ones (counting those lines). Both are origin-0. */ lin *realindexes; /* Total number of nondiscarded lines. */ lin nondiscarded_lines; /* Vector, indexed by real origin-0 line number, containing TRUE for a line that is an insertion or a deletion. The results of comparison are stored here. */ bool *changed; /* 1 if file ends in a line with no final newline. */ bool missing_newline; /* 1 if at end of file. */ bool eof; /* 1 more than the maximum equivalence value used for this or its sibling file. */ lin equiv_max; }; /* The file buffer, considered as an array of bytes rather than as an array of words. */ #define FILE_BUFFER(f) ((char *) (f)->buffer) /* Describe the two files currently being compared. */ XTERN struct file_data files[2]; /* Stdio stream to output diffs to. */ #define outfile stdout /* Declare various functions. */ /* analyze.c */ int diff_2_files (struct file_data[], argslist*); /* inout.c */ bool read_files (struct file_data[], argslist*); /* numutil.c */ char* acxnum (const char *str, const struct numfmt* pnf); int compare_numeric_strings (const char *str1, const struct numfmt* pnf1, const char *str2, const struct numfmt* pnf2); char* hcxnum (const char *str, const struct numfmt* pnf, hash_value *ph); #ifdef USE_GMP int mpf_a2num (Real* pr, const char *q, char** endptr, const struct numfmt* pnf); #endif /* USE_GMP */ /* side.c */ void print_sdiff_script (struct change *); void print_1overview_line (const char *left, int are_different, const char *right); /* util.c */ bool lines_differ (char const *, char const *, int, int, argslist*); void *zalloc (size_t); #define stralloc(length) zalloc ((length)+1) enum changes analyze_hunk (struct change *, lin *, lin *, lin *, lin *); #ifdef _DEBUG_SCRIPT_ void debug_script (struct change *); #endif void perror_with_name (char const *); void pfatal_with_name (char const *) __attribute__((noreturn)); void print_script (struct change *, void (*) (struct change *)); /* flags.c */ /* This functions were added by Ivano Primi, 14-02-08 */ int init_flags (void); int print_flags (FILE* fp); flg_array copy_of_intflagtab (void); void erase_flags (void); void notedown_sdiff_script (struct change *script); /* End Section "Shared definitions coming from GNU DIFF" */ #endif /* _NUMDIFF_H_ */ ./numdiff-5.8.1/getopt_int.h0000644000175000017500000001127412215353073014657 0ustar ivanoivano/* Internal declarations for getopt. Copyright (C) 1989-1994,1996-1999,2001,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GETOPT_INT_H #define _GETOPT_INT_H 1 extern int _getopt_internal (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, int __posixly_correct); /* Reentrant versions which can handle parsing multiple argument vectors at the same time. */ /* Data type for reentrant functions. */ struct _getopt_data { /* These have exactly the same meaning as the corresponding global variables, except that they are used for the reentrant versions of getopt. */ int optind; int opterr; int optopt; char *optarg; /* Internal members. */ /* True if the internal members have been initialized. */ int __initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ char *__nextchar; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters, or by calling getopt. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } __ordering; /* If the POSIXLY_CORRECT environment variable is set or getopt was called. */ int __posixly_correct; /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ int __first_nonopt; int __last_nonopt; #if defined _LIBC && defined USE_NONOPTION_FLAGS int __nonoption_flags_max_len; int __nonoption_flags_len; # endif }; /* The initializer is necessary to set OPTIND and OPTERR to their default values and to clear the initialization flag. */ #define _GETOPT_DATA_INITIALIZER { 1, 1 } extern int _getopt_internal_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, int __posixly_correct, struct _getopt_data *__data); extern int _getopt_long_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); extern int _getopt_long_only_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); #endif /* getopt_int.h */ ./numdiff-5.8.1/analyze.c0000444000175000017500000006276312215353073014150 0ustar ivanoivano/* Analyze file differences for GNU DIFF. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The basic algorithm is described in: "An O(ND) Difference Algorithm and its Variations", Eugene Myers, Algorithmica Vol. 1 No. 2, 1986, pp. 251-266; see especially section 4.2, which describes the variation used below. Unless the --minimal option is specified, this code uses the TOO_EXPENSIVE heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N) at the price of producing suboptimal output for large inputs with many differences. The basic algorithm was independently discovered as described in: "Algorithms for Approximate String Matching", E. Ukkonen, Information and Control Vol. 64, 1985, pp. 100-118. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff 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. Numdiff 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 "numdiff.h" #include #include #include static lin *xvec, *yvec; /* Vectors being compared. */ static lin *fdiag; /* Vector, indexed by diagonal, containing 1 + the X coordinate of the point furthest along the given diagonal in the forward search of the edit matrix. */ static lin *bdiag; /* Vector, indexed by diagonal, containing the X coordinate of the point furthest along the given diagonal in the backward search of the edit matrix. */ static lin too_expensive; /* Edit scripts longer than this are too expensive to compute. */ #define SNAKE_LIMIT 20 /* Snakes bigger than this are considered `big'. */ struct partition { lin xmid, ymid; /* Midpoints of this partition. */ bool lo_minimal; /* Nonzero if low half will be analyzed minimally. */ bool hi_minimal; /* Likewise for high half. */ }; /* Find the midpoint of the shortest edit script for a specified portion of the two files. Scan from the beginnings of the files, and simultaneously from the ends, doing a breadth-first search through the space of edit-sequence. When the two searches meet, we have found the midpoint of the shortest edit sequence. If FIND_MINIMAL is nonzero, find the minimal edit script regardless of expense. Otherwise, if the search is too expensive, use heuristics to stop the search and report a suboptimal answer. Set PART->(xmid,ymid) to the midpoint (XMID,YMID). The diagonal number XMID - YMID equals the number of inserted lines minus the number of deleted lines (counting only lines before the midpoint). Return the approximate edit cost; this is the total number of lines inserted or deleted (counting only lines before the midpoint), unless a heuristic is used to terminate the search prematurely. Set PART->lo_minimal to true iff the minimal edit script for the left half of the partition is known; similarly for PART->hi_minimal. This function assumes that the first lines of the specified portions of the two files do not match, and likewise that the last lines do not match. The caller must trim matching lines from the beginning and end of the portions it is going to specify. If we return the "wrong" partitions, the worst this can do is cause suboptimal diff output. It cannot cause incorrect diff output. */ static lin diag (lin xoff, lin xlim, lin yoff, lin ylim, bool find_minimal, struct partition *part) { lin *const fd = fdiag; /* Give the compiler a chance. */ lin *const bd = bdiag; /* Additional help for the compiler. */ lin const *const xv = xvec; /* Still more help for the compiler. */ lin const *const yv = yvec; /* And more and more . . . */ lin const dmin = xoff - ylim; /* Minimum valid diagonal. */ lin const dmax = xlim - yoff; /* Maximum valid diagonal. */ lin const fmid = xoff - yoff; /* Center diagonal of top-down search. */ lin const bmid = xlim - ylim; /* Center diagonal of bottom-up search. */ lin fmin = fmid, fmax = fmid; /* Limits of top-down search. */ lin bmin = bmid, bmax = bmid; /* Limits of bottom-up search. */ lin c; /* Cost. */ bool odd = (fmid - bmid) & 1; /* True if southeast corner is on an odd diagonal with respect to the northwest. */ fd[fmid] = xoff; bd[bmid] = xlim; for (c = 1;; ++c) { lin d; /* Active diagonal. */ bool big_snake = 0; /* Extend the top-down search by an edit step in each diagonal. */ fmin > dmin ? fd[--fmin - 1] = -1 : ++fmin; fmax < dmax ? fd[++fmax + 1] = -1 : --fmax; for (d = fmax; d >= fmin; d -= 2) { lin x, y, oldx, tlo = fd[d - 1], thi = fd[d + 1]; if (tlo >= thi) x = tlo + 1; else x = thi; oldx = x; y = x - d; while (x < xlim && y < ylim && xv[x] == yv[y]) ++x, ++y; if (x - oldx > SNAKE_LIMIT) big_snake = 1; fd[d] = x; if (odd && bmin <= d && d <= bmax && bd[d] <= x) { part->xmid = x; part->ymid = y; part->lo_minimal = part->hi_minimal = 1; return 2 * c - 1; } } /* Similarly extend the bottom-up search. */ bmin > dmin ? bd[--bmin - 1] = LIN_MAX : ++bmin; bmax < dmax ? bd[++bmax + 1] = LIN_MAX : --bmax; for (d = bmax; d >= bmin; d -= 2) { lin x, y, oldx, tlo = bd[d - 1], thi = bd[d + 1]; if (tlo < thi) x = tlo; else x = thi - 1; oldx = x; y = x - d; while (x > xoff && y > yoff && xv[x - 1] == yv[y - 1]) --x, --y; if (oldx - x > SNAKE_LIMIT) big_snake = 1; bd[d] = x; if (!odd && fmin <= d && d <= fmax && x <= fd[d]) { part->xmid = x; part->ymid = y; part->lo_minimal = part->hi_minimal = 1; return 2 * c; } } if (find_minimal) continue; /* Heuristic: check occasionally for a diagonal that has made lots of progress compared with the edit distance. If we have any such, find the one that has made the most progress and return it as if it had succeeded. With this heuristic, for files with a constant small density of changes, the algorithm is linear in the file size. */ if (200 < c && big_snake && speed_large_files) { lin best; best = 0; for (d = fmax; d >= fmin; d -= 2) { lin dd = d - fmid; lin x = fd[d]; lin y = x - d; lin v = (x - xoff) * 2 - dd; if (v > 12 * (c + (dd < 0 ? -dd : dd))) { if (v > best && xoff + SNAKE_LIMIT <= x && x < xlim && yoff + SNAKE_LIMIT <= y && y < ylim) { /* We have a good enough best diagonal; now insist that it end with a significant snake. */ int k; for (k = 1; xv[x - k] == yv[y - k]; k++) if (k == SNAKE_LIMIT) { best = v; part->xmid = x; part->ymid = y; break; } } } } if (best > 0) { part->lo_minimal = 1; part->hi_minimal = 0; return 2 * c - 1; } best = 0; for (d = bmax; d >= bmin; d -= 2) { lin dd = d - bmid; lin x = bd[d]; lin y = x - d; lin v = (xlim - x) * 2 + dd; if (v > 12 * (c + (dd < 0 ? -dd : dd))) { if (v > best && xoff < x && x <= xlim - SNAKE_LIMIT && yoff < y && y <= ylim - SNAKE_LIMIT) { /* We have a good enough best diagonal; now insist that it end with a significant snake. */ int k; for (k = 0; xv[x + k] == yv[y + k]; k++) if (k == SNAKE_LIMIT - 1) { best = v; part->xmid = x; part->ymid = y; break; } } } } if (best > 0) { part->lo_minimal = 0; part->hi_minimal = 1; return 2 * c - 1; } } /* Heuristic: if we've gone well beyond the call of duty, give up and report halfway between our best results so far. */ if (c >= too_expensive) { lin fxybest, fxbest; lin bxybest, bxbest; fxbest = bxbest = 0; /* Pacify `gcc -Wall'. */ /* Find forward diagonal that maximizes X + Y. */ fxybest = -1; for (d = fmax; d >= fmin; d -= 2) { lin x = MIN (fd[d], xlim); lin y = x - d; if (ylim < y) x = ylim + d, y = ylim; if (fxybest < x + y) { fxybest = x + y; fxbest = x; } } /* Find backward diagonal that minimizes X + Y. */ bxybest = LIN_MAX; for (d = bmax; d >= bmin; d -= 2) { lin x = MAX (xoff, bd[d]); lin y = x - d; if (y < yoff) x = yoff + d, y = yoff; if (x + y < bxybest) { bxybest = x + y; bxbest = x; } } /* Use the better of the two diagonals. */ if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff)) { part->xmid = fxbest; part->ymid = fxybest - fxbest; part->lo_minimal = 1; part->hi_minimal = 0; } else { part->xmid = bxbest; part->ymid = bxybest - bxbest; part->lo_minimal = 0; part->hi_minimal = 1; } return 2 * c - 1; } } } /* Compare in detail contiguous subsequences of the two files which are known, as a whole, to match each other. The results are recorded in the vectors files[N].changed, by storing 1 in the element for each line that is an insertion or deletion. The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1. Note that XLIM, YLIM are exclusive bounds. All line numbers are origin-0 and discarded lines are not counted. If FIND_MINIMAL, find a minimal difference no matter how expensive it is. */ static void compareseq (lin xoff, lin xlim, lin yoff, lin ylim, bool find_minimal) { lin * const xv = xvec; /* Help the compiler. */ lin * const yv = yvec; /* Slide down the bottom initial diagonal. */ while (xoff < xlim && yoff < ylim && xv[xoff] == yv[yoff]) ++xoff, ++yoff; /* Slide up the top initial diagonal. */ while (xlim > xoff && ylim > yoff && xv[xlim - 1] == yv[ylim - 1]) --xlim, --ylim; /* Handle simple cases. */ if (xoff == xlim) while (yoff < ylim) files[1].changed[files[1].realindexes[yoff++]] = 1; else if (yoff == ylim) while (xoff < xlim) files[0].changed[files[0].realindexes[xoff++]] = 1; else { lin c; struct partition part; /* Find a point of correspondence in the middle of the files. */ c = diag (xoff, xlim, yoff, ylim, find_minimal, &part); if (c == 1) { /* This should be impossible, because it implies that one of the two subsequences is empty, and that case was handled above without calling `diag'. Let's verify that this is true. */ abort (); #if 0 /* The two subsequences differ by a single insert or delete; record it and we are done. */ if (part.xmid - part.ymid < xoff - yoff) files[1].changed[files[1].realindexes[part.ymid - 1]] = 1; else files[0].changed[files[0].realindexes[part.xmid]] = 1; #endif } else { /* Use the partitions to split this problem into subproblems. */ compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal); compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal); } } } /* Discard lines from one file that have no matches in the other file. A line which is discarded will not be considered by the actual comparison algorithm; it will be as if that line were not in the file. The file's `realindexes' table maps virtual line numbers (which don't count the discarded lines) into real line numbers; this is how the actual comparison algorithm produces results that are comprehensible when the discarded lines are counted. When we discard a line, we also mark it as a deletion or insertion so that it will be printed in the output. */ static void discard_confusing_lines (struct file_data filevec[], int minimal) { int f; lin i; char *discarded[2]; lin *equiv_count[2]; lin *p; /* Allocate our results. */ p = xmalloc ((filevec[0].buffered_lines + filevec[1].buffered_lines) * (2 * sizeof *p)); for (f = 0; f < 2; f++) { filevec[f].undiscarded = p; p += filevec[f].buffered_lines; filevec[f].realindexes = p; p += filevec[f].buffered_lines; } /* Set up equiv_count[F][I] as the number of lines in file F that fall in equivalence class I. */ p = zalloc (filevec[0].equiv_max * (2 * sizeof *p)); equiv_count[0] = p; equiv_count[1] = p + filevec[0].equiv_max; for (i = 0; i < filevec[0].buffered_lines; ++i) ++equiv_count[0][filevec[0].equivs[i]]; for (i = 0; i < filevec[1].buffered_lines; ++i) ++equiv_count[1][filevec[1].equivs[i]]; /* Set up tables of which lines are going to be discarded. */ discarded[0] = zalloc (filevec[0].buffered_lines + filevec[1].buffered_lines); discarded[1] = discarded[0] + filevec[0].buffered_lines; /* Mark to be discarded each line that matches no line of the other file. If a line matches many lines, mark it as provisionally discardable. */ for (f = 0; f < 2; f++) { size_t end = filevec[f].buffered_lines; char *discards = discarded[f]; lin *counts = equiv_count[1 - f]; lin *equivs = filevec[f].equivs; size_t many = 5; size_t tem = end / 64; /* Multiply MANY by approximate square root of number of lines. That is the threshold for provisionally discardable lines. */ while ((tem = tem >> 2) > 0) many *= 2; for (i = 0; i < end; i++) { lin nmatch; if (equivs[i] == 0) continue; nmatch = counts[equivs[i]]; if (nmatch == 0) discards[i] = 1; else if (nmatch > many) discards[i] = 2; } } /* Don't really discard the provisional lines except when they occur in a run of discardables, with nonprovisionals at the beginning and end. */ for (f = 0; f < 2; f++) { lin end = filevec[f].buffered_lines; register char *discards = discarded[f]; for (i = 0; i < end; i++) { /* Cancel provisional discards not in middle of run of discards. */ if (discards[i] == 2) discards[i] = 0; else if (discards[i] != 0) { /* We have found a nonprovisional discard. */ register lin j; lin length; lin provisional = 0; /* Find end of this run of discardable lines. Count how many are provisionally discardable. */ for (j = i; j < end; j++) { if (discards[j] == 0) break; if (discards[j] == 2) ++provisional; } /* Cancel provisional discards at end, and shrink the run. */ while (j > i && discards[j - 1] == 2) discards[--j] = 0, --provisional; /* Now we have the length of a run of discardable lines whose first and last are not provisional. */ length = j - i; /* If 1/4 of the lines in the run are provisional, cancel discarding of all provisional lines in the run. */ if (provisional * 4 > length) { while (j > i) if (discards[--j] == 2) discards[j] = 0; } else { register lin consec; lin minimum = 1; lin tem = length >> 2; /* MINIMUM is approximate square root of LENGTH/4. A subrun of two or more provisionals can stand when LENGTH is at least 16. A subrun of 4 or more can stand when LENGTH >= 64. */ while (0 < (tem >>= 2)) minimum <<= 1; minimum++; /* Cancel any subrun of MINIMUM or more provisionals within the larger run. */ for (j = 0, consec = 0; j < length; j++) if (discards[i + j] != 2) consec = 0; else if (minimum == ++consec) /* Back up to start of subrun, to cancel it all. */ j -= consec; else if (minimum < consec) discards[i + j] = 0; /* Scan from beginning of run until we find 3 or more nonprovisionals in a row or until the first nonprovisional at least 8 lines in. Until that point, cancel any provisionals. */ for (j = 0, consec = 0; j < length; j++) { if (j >= 8 && discards[i + j] == 1) break; if (discards[i + j] == 2) consec = 0, discards[i + j] = 0; else if (discards[i + j] == 0) consec = 0; else consec++; if (consec == 3) break; } /* I advances to the last line of the run. */ i += length - 1; /* Same thing, from end. */ for (j = 0, consec = 0; j < length; j++) { if (j >= 8 && discards[i - j] == 1) break; if (discards[i - j] == 2) consec = 0, discards[i - j] = 0; else if (discards[i - j] == 0) consec = 0; else consec++; if (consec == 3) break; } } } } } /* Actually discard the lines. */ for (f = 0; f < 2; f++) { char *discards = discarded[f]; lin end = filevec[f].buffered_lines; lin j = 0; for (i = 0; i < end; ++i) if ((minimal) || discards[i] == 0) { filevec[f].undiscarded[j] = filevec[f].equivs[i]; filevec[f].realindexes[j++] = i; } else filevec[f].changed[i] = 1; filevec[f].nondiscarded_lines = j; } free (discarded[0]); free (equiv_count[0]); } /* Adjust inserts/deletes of identical lines to join changes as much as possible. We do something when a run of changed lines include a line at one end and have an excluded, identical line at the other. We are free to choose which identical line is included. `compareseq' usually chooses the one at the beginning, but usually it is cleaner to consider the following identical line to be the "change". */ static void shift_boundaries (struct file_data filevec[]) { int f; for (f = 0; f < 2; f++) { bool *changed = filevec[f].changed; bool const *other_changed = filevec[1 - f].changed; lin const *equivs = filevec[f].equivs; lin i = 0; lin j = 0; lin i_end = filevec[f].buffered_lines; while (1) { lin runlength, start, corresponding; /* Scan forwards to find beginning of another run of changes. Also keep track of the corresponding point in the other file. */ while (i < i_end && !changed[i]) { while (other_changed[j++]) continue; i++; } if (i == i_end) break; start = i; /* Find the end of this run of changes. */ while (changed[++i]) continue; while (other_changed[j]) j++; do { /* Record the length of this run of changes, so that we can later determine whether the run has grown. */ runlength = i - start; /* Move the changed region back, so long as the previous unchanged line matches the last changed one. This merges with previous changed regions. */ while (start && equivs[start - 1] == equivs[i - 1]) { changed[--start] = 1; changed[--i] = 0; while (changed[start - 1]) start--; while (other_changed[--j]) continue; } /* Set CORRESPONDING to the end of the changed run, at the last point where it corresponds to a changed run in the other file. CORRESPONDING == I_END means no such point has been found. */ corresponding = other_changed[j - 1] ? i : i_end; /* Move the changed region forward, so long as the first changed line matches the following unchanged one. This merges with following changed regions. Do this second, so that if there are no merges, the changed region is moved forward as far as possible. */ while (i != i_end && equivs[start] == equivs[i]) { changed[start++] = 0; changed[i++] = 1; while (changed[i]) i++; while (other_changed[++j]) corresponding = i; } } while (runlength != i - start); /* If possible, move the fully-merged run of changes back to a corresponding run in the other file. */ while (corresponding < i) { changed[--start] = 1; changed[--i] = 0; while (other_changed[--j]) continue; } } } } /* Cons an additional entry onto the front of an edit script OLD. LINE0 and LINE1 are the first affected lines in the two files (origin 0). DELETED is the number of lines deleted here from file 0. INSERTED is the number of lines inserted here in file 1. If DELETED is 0 then LINE0 is the number of the line before which the insertion was done; vice versa for INSERTED and LINE1. */ static struct change * add_change (lin line0, lin line1, lin deleted, lin inserted, struct change *old) { struct change *new = xmalloc (sizeof *new); new->line0 = line0; new->line1 = line1; new->inserted = inserted; new->deleted = deleted; new->link = old; return new; } /* Scan the tables of which lines are inserted and deleted, producing an edit script in forward order. */ static struct change * build_script (struct file_data const filevec[]) { struct change *script = 0; bool *changed0 = filevec[0].changed; bool *changed1 = filevec[1].changed; lin i0 = filevec[0].buffered_lines, i1 = filevec[1].buffered_lines; /* Note that changedN[-1] does exist, and is 0. */ while (i0 >= 0 || i1 >= 0) { if (changed0[i0 - 1] | changed1[i1 - 1]) { lin line0 = i0, line1 = i1; /* Find # lines changed here in each file. */ while (changed0[i0 - 1]) --i0; while (changed1[i1 - 1]) --i1; /* Record this change. */ script = add_change (i0, i1, line0 - i0, line1 - i1, script); } /* We have reached lines in the two files that match each other. */ i0--, i1--; } return script; } /* Report the differences of two files. */ int diff_2_files (struct file_data filevec[], argslist* argl) { lin diags; int f; struct change *e, *p; struct change *script; int changes; /* This code was just used to discover the reason of a bug :) */ /* #ifdef __USE_FILE_OFFSET64 printf ("\n %s: FILE OFFSET 64 in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #else printf ("\n %s: FILE OFFSET 64 NOT in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #endif */ /* If we have detected that either file is binary, return the error code -1. */ if (read_files (filevec, argl)) return -1; else { /* Allocate vectors for the results of comparison: a flag for each line of each file, saying whether that line is an insertion or deletion. Allocate an extra element, always 0, at each end of each vector. */ size_t s = filevec[0].buffered_lines + filevec[1].buffered_lines + 4; bool *flag_space = zalloc (s * sizeof *flag_space); filevec[0].changed = flag_space + 1; filevec[1].changed = flag_space + filevec[0].buffered_lines + 3; /* Some lines are obviously insertions or deletions because they don't match anything. Detect them now, and avoid even thinking about them in the main comparison algorithm. */ discard_confusing_lines (filevec, (argl->optmask & _M_MASK)); /* Now do the main comparison algorithm, considering just the undiscarded lines. */ xvec = filevec[0].undiscarded; yvec = filevec[1].undiscarded; diags = (filevec[0].nondiscarded_lines + filevec[1].nondiscarded_lines + 3); fdiag = xmalloc (diags * (2 * sizeof *fdiag)); bdiag = fdiag + diags; fdiag += filevec[1].nondiscarded_lines + 1; bdiag += filevec[1].nondiscarded_lines + 1; /* Set TOO_EXPENSIVE to be approximate square root of input size, bounded below by 256. */ too_expensive = 1; for (; diags != 0; diags >>= 2) too_expensive <<= 1; too_expensive = MAX (256, too_expensive); compareseq (0, filevec[0].nondiscarded_lines, 0, filevec[1].nondiscarded_lines, (argl->optmask & _M_MASK)); free (fdiag - (filevec[1].nondiscarded_lines + 1)); /* Modify the results slightly to make them prettier in cases where that can validly be done. */ shift_boundaries (filevec); /* Get the results of comparison in the form of a chain of `struct change's -- an edit script. */ script = build_script (filevec); /* Set CHANGES if we had any diffs. */ changes = (script != 0) ? 1 : 0; if ( argl->optmask & _F_MASK && argl->output_mode > OUTMODE_QUIET ) { if (changes | !suppress_common_lines) print_sdiff_script (script); } else { if (changes | !suppress_common_lines) notedown_sdiff_script (script); } free (filevec[0].undiscarded); free (flag_space); for (f = 0; f < 2; f++) { free (filevec[f].equivs); free (filevec[f].linbuf + filevec[f].linbuf_base); } for (e = script; e; e = p) { p = e->link; free (e); } } if (filevec[0].buffer != filevec[1].buffer) free (filevec[0].buffer); free (filevec[1].buffer); return changes; } ./numdiff-5.8.1/error.h0000644000175000017500000000465712215353073013643 0ustar ivanoivano/* Declaration for error-reporting function Copyright (C) 1995, 1996, 1997, 2003, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _ERROR_H #define _ERROR_H 1 #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif #ifdef __cplusplus extern "C" { #endif /* Print a message with `fprintf (stderr, FORMAT, ...)'; if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). If STATUS is nonzero, terminate the program with `exit (STATUS)'. */ extern void error (int __status, int __errnum, const char *__format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern void error_at_line (int __status, int __errnum, const char *__fname, unsigned int __lineno, const char *__format, ...) __attribute__ ((__format__ (__printf__, 5, 6))); /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ extern void (*error_print_progname) (void); /* This variable is incremented each time `error' is called. */ extern unsigned int error_message_count; /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ extern int error_one_per_line; #ifdef __cplusplus } #endif #endif /* error.h */ ./numdiff-5.8.1/xalloc-die.c0000644000175000017500000000254312215353073014516 0ustar ivanoivano/* Report a memory allocation failure and exit. Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006 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 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "xalloc.h" #include #include "error.h" #include "exitfail.h" #include "gettext.h" #define _(msgid) gettext (msgid) void xalloc_die (void) { error (exit_failure, 0, "%s", _("memory exhausted")); /* The `noreturn' cannot be given to error, since it may return if its first argument is 0. To help compilers understand the xalloc_die does not return, call abort. Also, the abort is a safety feature if exit_failure is 0 (which shouldn't happen). */ abort (); } ./numdiff-5.8.1/number.c0000444000175000017500000012437412215353073013772 0ustar ivanoivano/* number.c: Implements arbitrary precision numbers. */ /* Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 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 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; see the file COPYING. If not, write to: The Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA You may contact the author by: e-mail: philnelson@acm.org us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ /* This file, coming from the source code of GNU BC, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff 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. Numdiff 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 #ifdef __STDC__ #include #endif /* #include */ #include "numdiff.h" #include "number.h" /* Prototypes needed for external utility routines. */ #ifdef _DMALLOC_ #include /* Useful only for the debugging */ #endif #define bc_rt_warn rt_warn #define bc_rt_error rt_error #define bc_out_of_memory out_of_memory _PROTOTYPE(void rt_warn, (char *mesg ,...)); _PROTOTYPE(void rt_error, (char *mesg ,...)); _PROTOTYPE(void out_of_memory, (void)); /* Storage used for special numbers. */ bc_num _zero_; bc_num _one_; bc_num _two_; static bc_num _bc_Free_list = NULL; /* new_num allocates a number and sets fields to known values. */ bc_num bc_new_num (length, scale) int length, scale; { bc_num temp; if (_bc_Free_list != NULL) { temp = _bc_Free_list; _bc_Free_list = temp->n_next; } else { temp = (bc_num) malloc (sizeof(bc_struct)); if (temp == NULL) bc_out_of_memory (); } temp->n_sign = PLUS; temp->n_len = length; temp->n_scale = scale; temp->n_refs = 1; temp->n_ptr = (char *) malloc (length+scale); if (temp->n_ptr == NULL) bc_out_of_memory(); temp->n_value = temp->n_ptr; memset (temp->n_ptr, 0, length+scale); return temp; } /* "Frees" a bc_num NUM. Actually decreases reference count and only frees the storage if reference count is zero. */ void bc_free_num (num) bc_num *num; { if (*num == NULL) return; (*num)->n_refs--; if ((*num)->n_refs == 0) { if ((*num)->n_ptr) free ((*num)->n_ptr); (*num)->n_next = _bc_Free_list; _bc_Free_list = *num; } *num = NULL; } /* Initialize the number package! */ void bc_init_numbers () { _zero_ = bc_new_num (1,0); _one_ = bc_new_num (1,0); _one_->n_value[0] = 1; _two_ = bc_new_num (1,0); _two_->n_value[0] = 2; } /* Free the memory associated to _two_, _one_ and _zero_ . */ void bc_end () { bc_free_num (&_two_); bc_free_num (&_one_); bc_free_num (&_zero_); } /* This routine has been added by Ivano Primi to avoid some memory leaks. */ /* 30/12/2002 */ /* Make a copy of a number! Just increments the reference count! */ bc_num bc_copy_num (num) bc_num num; { num->n_refs++; return num; } /* Initialize a number NUM by making it a copy of zero. */ void bc_init_num (num) bc_num *num; { *num = bc_copy_num (_zero_); } /* For many things, we may have leading zeros in a number NUM. _bc_rm_leading_zeros just moves the data "value" pointer to the correct place and adjusts the length. */ static void _bc_rm_leading_zeros (num) bc_num num; { /* We can move n_value to point to the first non zero digit! */ while (*num->n_value == 0 && num->n_len > 1) { num->n_value++; num->n_len--; } } /* Compare two bc numbers. Return value is 0 if equal, -1 if N1 is less than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just compare the magnitudes. */ static int _bc_do_compare (n1, n2, use_sign, ignore_last) bc_num n1, n2; int use_sign; int ignore_last; { char *n1ptr, *n2ptr; int count; /* First, compare signs. */ if (use_sign && n1->n_sign != n2->n_sign) { if (n1->n_sign == PLUS) return (1); /* Positive N1 > Negative N2 */ else return (-1); /* Negative N1 < Positive N1 */ } /* Now compare the magnitude. */ if (n1->n_len != n2->n_len) { if (n1->n_len > n2->n_len) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } else { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } /* If we get here, they have the same number of integer digits. check the integer part and the equal length part of the fraction. */ count = n1->n_len + MIN (n1->n_scale, n2->n_scale); n1ptr = n1->n_value; n2ptr = n2->n_value; while ((count > 0) && (*n1ptr == *n2ptr)) { n1ptr++; n2ptr++; count--; } if (ignore_last && count == 1 && n1->n_scale == n2->n_scale) return (0); if (count != 0) { if (*n1ptr > *n2ptr) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } else { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } /* They are equal up to the last part of the equal part of the fraction. */ if (n1->n_scale != n2->n_scale) { if (n1->n_scale > n2->n_scale) { for (count = n1->n_scale-n2->n_scale; count>0; count--) if (*n1ptr++ != 0) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } } else { for (count = n2->n_scale-n1->n_scale; count>0; count--) if (*n2ptr++ != 0) { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } } /* They must be equal! */ return (0); } /* This is the "user callable" routine to compare numbers N1 and N2. */ int bc_compare (n1, n2) bc_num n1, n2; { return _bc_do_compare (n1, n2, TRUE, FALSE); } /* In some places we need to check if the number is negative. */ char bc_is_neg (num) bc_num num; { return num->n_sign == MINUS; } /* In some places we need to check if the number NUM is zero. */ char bc_is_zero (num) bc_num num; { int count; char *nptr; /* Quick check. */ if (num == _zero_) return TRUE; /* Initialize */ count = num->n_len + num->n_scale; nptr = num->n_value; /* The check */ while ((count > 0) && (*nptr++ == 0)) count--; if (count != 0) return FALSE; else return TRUE; } /* In some places we need to check if the number NUM is almost zero. Specifically, all but the last digit is 0 and the last digit is 1. Last digit is defined by scale. */ char bc_is_near_zero (num, scale) bc_num num; int scale; { int count; char *nptr; /* Error checking */ if (scale > num->n_scale) scale = num->n_scale; /* Initialize */ count = num->n_len + scale; nptr = num->n_value; /* The check */ while ((count > 0) && (*nptr++ == 0)) count--; if (count != 0 && (count != 1 || *--nptr != 1)) return FALSE; else return TRUE; } /* Perform addition: N1 is added to N2 and the value is returned. The signs of N1 and N2 are ignored. SCALE_MIN is to set the minimum scale of the result. */ static bc_num _bc_do_add (n1, n2, scale_min) bc_num n1, n2; int scale_min; { bc_num sum; int sum_scale, sum_digits; char *n1ptr, *n2ptr, *sumptr; int carry, n1bytes, n2bytes; int count; /* Prepare sum. */ sum_scale = MAX (n1->n_scale, n2->n_scale); sum_digits = MAX (n1->n_len, n2->n_len) + 1; sum = bc_new_num (sum_digits, MAX(sum_scale, scale_min)); /* Zero extra digits made by scale_min. */ if (scale_min > sum_scale) { sumptr = (char *) (sum->n_value + sum_scale + sum_digits); for (count = scale_min - sum_scale; count > 0; count--) *sumptr++ = 0; } /* Start with the fraction part. Initialize the pointers. */ n1bytes = n1->n_scale; n2bytes = n2->n_scale; n1ptr = (char *) (n1->n_value + n1->n_len + n1bytes - 1); n2ptr = (char *) (n2->n_value + n2->n_len + n2bytes - 1); sumptr = (char *) (sum->n_value + sum_scale + sum_digits - 1); /* Add the fraction part. First copy the longer fraction.*/ if (n1bytes != n2bytes) { if (n1bytes > n2bytes) while (n1bytes>n2bytes) { *sumptr-- = *n1ptr--; n1bytes--;} else while (n2bytes>n1bytes) { *sumptr-- = *n2ptr--; n2bytes--;} } /* Now add the remaining fraction part and equal size integer parts. */ n1bytes += n1->n_len; n2bytes += n2->n_len; carry = 0; while ((n1bytes > 0) && (n2bytes > 0)) { *sumptr = *n1ptr-- + *n2ptr-- + carry; if (*sumptr > (BASE-1)) { carry = 1; *sumptr -= BASE; } else carry = 0; sumptr--; n1bytes--; n2bytes--; } /* Now add carry the longer integer part. */ if (n1bytes == 0) { n1bytes = n2bytes; n1ptr = n2ptr; } while (n1bytes-- > 0) { *sumptr = *n1ptr-- + carry; if (*sumptr > (BASE-1)) { carry = 1; *sumptr -= BASE; } else carry = 0; sumptr--; } /* Set final carry. */ if (carry == 1) *sumptr += 1; /* Adjust sum and return. */ _bc_rm_leading_zeros (sum); return sum; } /* Perform subtraction: N2 is subtracted from N1 and the value is returned. The signs of N1 and N2 are ignored. Also, N1 is assumed to be larger than N2. SCALE_MIN is the minimum scale of the result. */ static bc_num _bc_do_sub (n1, n2, scale_min) bc_num n1, n2; int scale_min; { bc_num diff; int diff_scale, diff_len; int min_scale, min_len; char *n1ptr, *n2ptr, *diffptr; int borrow, count, val; /* Allocate temporary storage. */ diff_len = MAX (n1->n_len, n2->n_len); diff_scale = MAX (n1->n_scale, n2->n_scale); min_len = MIN (n1->n_len, n2->n_len); min_scale = MIN (n1->n_scale, n2->n_scale); diff = bc_new_num (diff_len, MAX(diff_scale, scale_min)); /* Zero extra digits made by scale_min. */ if (scale_min > diff_scale) { diffptr = (char *) (diff->n_value + diff_len + diff_scale); for (count = scale_min - diff_scale; count > 0; count--) *diffptr++ = 0; } /* Initialize the subtract. */ n1ptr = (char *) (n1->n_value + n1->n_len + n1->n_scale -1); n2ptr = (char *) (n2->n_value + n2->n_len + n2->n_scale -1); diffptr = (char *) (diff->n_value + diff_len + diff_scale -1); /* Subtract the numbers. */ borrow = 0; /* Take care of the longer scaled number. */ if (n1->n_scale != min_scale) { /* n1 has the longer scale */ for (count = n1->n_scale - min_scale; count > 0; count--) *diffptr-- = *n1ptr--; } else { /* n2 has the longer scale */ for (count = n2->n_scale - min_scale; count > 0; count--) { val = - *n2ptr-- - borrow; if (val < 0) { val += BASE; borrow = 1; } else borrow = 0; *diffptr-- = val; } } /* Now do the equal length scale and integer parts. */ for (count = 0; count < min_len + min_scale; count++) { val = *n1ptr-- - *n2ptr-- - borrow; if (val < 0) { val += BASE; borrow = 1; } else borrow = 0; *diffptr-- = val; } /* If n1 has more digits then n2, we now do that subtract. */ if (diff_len != min_len) { for (count = diff_len - min_len; count > 0; count--) { val = *n1ptr-- - borrow; if (val < 0) { val += BASE; borrow = 1; } else borrow = 0; *diffptr-- = val; } } /* Clean up and return. */ _bc_rm_leading_zeros (diff); return diff; } /* Here is the full subtract routine that takes care of negative numbers. N2 is subtracted from N1 and the result placed in RESULT. SCALE_MIN is the minimum scale for the result. */ void bc_sub (n1, n2, result, scale_min) bc_num n1, n2, *result; int scale_min; { bc_num diff = NULL; int cmp_res; int res_scale; if (n1->n_sign != n2->n_sign) { diff = _bc_do_add (n1, n2, scale_min); diff->n_sign = n1->n_sign; } else { /* subtraction must be done. */ /* Compare magnitudes. */ cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); switch (cmp_res) { case -1: /* n1 is less than n2, subtract n1 from n2. */ diff = _bc_do_sub (n2, n1, scale_min); diff->n_sign = (n2->n_sign == PLUS ? MINUS : PLUS); break; case 0: /* They are equal! return zero! */ res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); diff = bc_new_num (1, res_scale); memset (diff->n_value, 0, res_scale+1); break; case 1: /* n2 is less than n1, subtract n2 from n1. */ diff = _bc_do_sub (n1, n2, scale_min); diff->n_sign = n1->n_sign; break; } } /* Clean up and return. */ bc_free_num (result); *result = diff; } /* Here is the full add routine that takes care of negative numbers. N1 is added to N2 and the result placed into RESULT. SCALE_MIN is the minimum scale for the result. */ void bc_add (n1, n2, result, scale_min) bc_num n1, n2, *result; int scale_min; { bc_num sum = NULL; int cmp_res; int res_scale; if (n1->n_sign == n2->n_sign) { sum = _bc_do_add (n1, n2, scale_min); sum->n_sign = n1->n_sign; } else { /* subtraction must be done. */ cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); /* Compare magnitudes. */ switch (cmp_res) { case -1: /* n1 is less than n2, subtract n1 from n2. */ sum = _bc_do_sub (n2, n1, scale_min); sum->n_sign = n2->n_sign; break; case 0: /* They are equal! return zero with the correct scale! */ res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); sum = bc_new_num (1, res_scale); memset (sum->n_value, 0, res_scale+1); break; case 1: /* n2 is less than n1, subtract n2 from n1. */ sum = _bc_do_sub (n1, n2, scale_min); sum->n_sign = n1->n_sign; } } /* Clean up and return. */ bc_free_num (result); *result = sum; } /* Recursive vs non-recursive multiply crossover ranges. */ #if defined(MULDIGITS) #include "muldigits.h" #else #define MUL_BASE_DIGITS 80 #endif int mul_base_digits = MUL_BASE_DIGITS; #define MUL_SMALL_DIGITS mul_base_digits/4 /* Multiply utility routines */ static bc_num new_sub_num (length, scale, value) int length, scale; char *value; { bc_num temp; if (_bc_Free_list != NULL) { temp = _bc_Free_list; _bc_Free_list = temp->n_next; } else { temp = (bc_num) malloc (sizeof(bc_struct)); if (temp == NULL) bc_out_of_memory (); } temp->n_sign = PLUS; temp->n_len = length; temp->n_scale = scale; temp->n_refs = 1; temp->n_ptr = NULL; temp->n_value = value; return temp; } static void _bc_simp_mul (bc_num n1, int n1len, bc_num n2, int n2len, bc_num *prod, int full_scale) { char *n1ptr, *n2ptr, *pvptr; char *n1end, *n2end; /* To the end of n1 and n2. */ int indx, sum, prodlen; prodlen = n1len+n2len+1; *prod = bc_new_num (prodlen, 0); n1end = (char *) (n1->n_value + n1len - 1); n2end = (char *) (n2->n_value + n2len - 1); pvptr = (char *) ((*prod)->n_value + prodlen - 1); sum = 0; /* Here is the loop... */ for (indx = 0; indx < prodlen-1; indx++) { n1ptr = (char *) (n1end - MAX(0, indx-n2len+1)); n2ptr = (char *) (n2end - MIN(indx, n2len-1)); while ((n1ptr >= n1->n_value) && (n2ptr <= n2end)) sum += *n1ptr-- * *n2ptr++; *pvptr-- = sum % BASE; sum = sum / BASE; } *pvptr = sum; } /* A special adder/subtractor for the recursive divide and conquer multiply algorithm. Note: if sub is called, accum must be larger that what is being subtracted. Also, accum and val must have n_scale = 0. (e.g. they must look like integers. *) */ static void _bc_shift_addsub (bc_num accum, bc_num val, int shift, int sub) { signed char *accp, *valp; int count, carry; count = val->n_len; if (val->n_value[0] == 0) count--; assert (accum->n_len+accum->n_scale >= shift+count); /* Set up pointers and others */ accp = (signed char *)(accum->n_value + accum->n_len + accum->n_scale - shift - 1); valp = (signed char *)(val->n_value + val->n_len - 1); carry = 0; if (sub) { /* Subtraction, carry is really borrow. */ while (count--) { *accp -= *valp-- + carry; if (*accp < 0) { carry = 1; *accp-- += BASE; } else { carry = 0; accp--; } } while (carry) { *accp -= carry; if (*accp < 0) *accp-- += BASE; else carry = 0; } } else { /* Addition */ while (count--) { *accp += *valp-- + carry; if (*accp > (BASE-1)) { carry = 1; *accp-- -= BASE; } else { carry = 0; accp--; } } while (carry) { *accp += carry; if (*accp > (BASE-1)) *accp-- -= BASE; else carry = 0; } } } /* Recursive divide and conquer multiply algorithm. Based on Let u = u0 + u1*(b^n) Let v = v0 + v1*(b^n) Then uv = (B^2n+B^n)*u1*v1 + B^n*(u1-u0)*(v0-v1) + (B^n+1)*u0*v0 B is the base of storage, number of digits in u1,u0 close to equal. */ static void _bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, int full_scale) { bc_num u0, u1, v0, v1; int u0len, v0len; bc_num m1, m2, m3, d1, d2; int n, prodlen, m1zero; int d1len, d2len; /* Base case? */ if ((ulen+vlen) < mul_base_digits || ulen < MUL_SMALL_DIGITS || vlen < MUL_SMALL_DIGITS ) { _bc_simp_mul (u, ulen, v, vlen, prod, full_scale); return; } /* Calculate n -- the u and v split point in digits. */ n = (MAX(ulen, vlen)+1) / 2; /* Split u and v. */ if (ulen < n) { u1 = bc_copy_num (_zero_); u0 = new_sub_num (ulen,0, u->n_value); } else { u1 = new_sub_num (ulen-n, 0, u->n_value); u0 = new_sub_num (n, 0, u->n_value+ulen-n); } if (vlen < n) { v1 = bc_copy_num (_zero_); v0 = new_sub_num (vlen,0, v->n_value); } else { v1 = new_sub_num (vlen-n, 0, v->n_value); v0 = new_sub_num (n, 0, v->n_value+vlen-n); } _bc_rm_leading_zeros (u1); _bc_rm_leading_zeros (u0); u0len = u0->n_len; _bc_rm_leading_zeros (v1); _bc_rm_leading_zeros (v0); v0len = v0->n_len; m1zero = bc_is_zero(u1) || bc_is_zero(v1); /* Calculate sub results ... */ bc_init_num(&d1); bc_init_num(&d2); bc_sub (u1, u0, &d1, 0); d1len = d1->n_len; bc_sub (v0, v1, &d2, 0); d2len = d2->n_len; /* Do recursive multiplies and shifted adds. */ if (m1zero) m1 = bc_copy_num (_zero_); else _bc_rec_mul (u1, u1->n_len, v1, v1->n_len, &m1, 0); if (bc_is_zero(d1) || bc_is_zero(d2)) m2 = bc_copy_num (_zero_); else _bc_rec_mul (d1, d1len, d2, d2len, &m2, 0); if (bc_is_zero(u0) || bc_is_zero(v0)) m3 = bc_copy_num (_zero_); else _bc_rec_mul (u0, u0->n_len, v0, v0->n_len, &m3, 0); /* Initialize product */ prodlen = ulen+vlen+1; *prod = bc_new_num(prodlen, 0); if (!m1zero) { _bc_shift_addsub (*prod, m1, 2*n, 0); _bc_shift_addsub (*prod, m1, n, 0); } _bc_shift_addsub (*prod, m3, n, 0); _bc_shift_addsub (*prod, m3, 0, 0); _bc_shift_addsub (*prod, m2, n, d1->n_sign != d2->n_sign); /* Now clean up! */ bc_free_num (&u1); bc_free_num (&u0); bc_free_num (&v1); bc_free_num (&m1); bc_free_num (&v0); bc_free_num (&m2); bc_free_num (&m3); bc_free_num (&d1); bc_free_num (&d2); } /* The multiply routine. N2 times N1 is put int PROD with the scale of the result being MIN(N2 scale+N1 scale, MAX (SCALE, N2 scale, N1 scale)). */ void bc_multiply (n1, n2, prod, scale) bc_num n1, n2, *prod; int scale; { bc_num pval; int len1, len2; int full_scale, prod_scale; /* Initialize things. */ len1 = n1->n_len + n1->n_scale; len2 = n2->n_len + n2->n_scale; full_scale = n1->n_scale + n2->n_scale; prod_scale = MIN(full_scale,MAX(scale,MAX(n1->n_scale,n2->n_scale))); /* Do the multiply */ _bc_rec_mul (n1, len1, n2, len2, &pval, full_scale); /* Assign to prod and clean up the number. */ pval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); pval->n_value = pval->n_ptr; pval->n_len = len2 + len1 + 1 - full_scale; pval->n_scale = prod_scale; _bc_rm_leading_zeros (pval); if (bc_is_zero (pval)) pval->n_sign = PLUS; bc_free_num (prod); *prod = pval; } /* Some utility routines for the divide: First a one digit multiply. NUM (with SIZE digits) is multiplied by DIGIT and the result is placed into RESULT. It is written so that NUM and RESULT can be the same pointers. */ static void _one_mult (num, size, digit, result) unsigned char *num; int size, digit; unsigned char *result; { int carry, value; unsigned char *nptr, *rptr; if (digit == 0) memset (result, 0, size); else { if (digit == 1) memcpy (result, num, size); else { /* Initialize */ nptr = (unsigned char *) (num+size-1); rptr = (unsigned char *) (result+size-1); carry = 0; while (size-- > 0) { value = *nptr-- * digit + carry; *rptr-- = value % BASE; carry = value / BASE; } if (carry != 0) *rptr = carry; } } } /* The full division routine. This computes N1 / N2. It returns 0 if the division is ok and the result is in QUOT. The number of digits after the decimal point is SCALE. It returns -1 if division by zero is tried. The algorithm is found in Knuth Vol 2. p237. */ int bc_divide (n1, n2, quot, scale) bc_num n1, n2, *quot; int scale; { bc_num qval; unsigned char *num1, *num2; unsigned char *ptr1, *ptr2, *n2ptr, *qptr; int scale1, val; unsigned int len1, len2, scale2, qdigits, extra, count; unsigned int qdig, qguess, borrow, carry; unsigned char *mval; char zero; unsigned int norm; /* Test for divide by zero. */ if (bc_is_zero (n2)) return -1; /* Test for divide by 1. If it is we must truncate. */ if (n2->n_scale == 0) { if (n2->n_len == 1 && *n2->n_value == 1) { qval = bc_new_num (n1->n_len, scale); qval->n_sign = (n1->n_sign == n2->n_sign ? PLUS : MINUS); memset (&qval->n_value[n1->n_len],0,scale); memcpy (qval->n_value, n1->n_value, n1->n_len + MIN(n1->n_scale,scale)); bc_free_num (quot); *quot = qval; } } /* Set up the divide. Move the decimal point on n1 by n2's scale. Remember, zeros on the end of num2 are wasted effort for dividing. */ scale2 = n2->n_scale; n2ptr = (unsigned char *) n2->n_value+n2->n_len+scale2-1; while ((scale2 > 0) && (*n2ptr-- == 0)) scale2--; len1 = n1->n_len + scale2; scale1 = n1->n_scale - scale2; if (scale1 < scale) extra = scale - scale1; else extra = 0; num1 = (unsigned char *) malloc (n1->n_len+n1->n_scale+extra+2); if (num1 == NULL) bc_out_of_memory(); memset (num1, 0, n1->n_len+n1->n_scale+extra+2); memcpy (num1+1, n1->n_value, n1->n_len+n1->n_scale); len2 = n2->n_len + scale2; num2 = (unsigned char *) malloc (len2+1); if (num2 == NULL) bc_out_of_memory(); memcpy (num2, n2->n_value, len2); *(num2+len2) = 0; n2ptr = num2; while (*n2ptr == 0) { n2ptr++; len2--; } /* Calculate the number of quotient digits. */ if (len2 > len1+scale) { qdigits = scale+1; zero = TRUE; } else { zero = FALSE; if (len2>len1) qdigits = scale+1; /* One for the zero integer part. */ else qdigits = len1-len2+scale+1; } /* Allocate and zero the storage for the quotient. */ qval = bc_new_num (qdigits-scale,scale); memset (qval->n_value, 0, qdigits); /* Allocate storage for the temporary storage mval. */ mval = (unsigned char *) malloc (len2+1); if (mval == NULL) bc_out_of_memory (); /* Now for the full divide algorithm. */ if (!zero) { /* Normalize */ norm = 10 / ((int)*n2ptr + 1); if (norm != 1) { _one_mult (num1, len1+scale1+extra+1, norm, num1); _one_mult (n2ptr, len2, norm, n2ptr); } /* Initialize divide loop. */ qdig = 0; if (len2 > len1) qptr = (unsigned char *) qval->n_value+len2-len1; else qptr = (unsigned char *) qval->n_value; /* Loop */ while (qdig <= len1+scale-len2) { /* Calculate the quotient digit guess. */ if (*n2ptr == num1[qdig]) qguess = 9; else qguess = (num1[qdig]*10 + num1[qdig+1]) / *n2ptr; /* Test qguess. */ if (n2ptr[1]*qguess > (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 + num1[qdig+2]) { qguess--; /* And again. */ if (n2ptr[1]*qguess > (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 + num1[qdig+2]) qguess--; } /* Multiply and subtract. */ borrow = 0; if (qguess != 0) { *mval = 0; _one_mult (n2ptr, len2, qguess, mval+1); ptr1 = (unsigned char *) num1+qdig+len2; ptr2 = (unsigned char *) mval+len2; for (count = 0; count < len2+1; count++) { val = (int) *ptr1 - (int) *ptr2-- - borrow; if (val < 0) { val += 10; borrow = 1; } else borrow = 0; *ptr1-- = val; } } /* Test for negative result. */ if (borrow == 1) { qguess--; ptr1 = (unsigned char *) num1+qdig+len2; ptr2 = (unsigned char *) n2ptr+len2-1; carry = 0; for (count = 0; count < len2; count++) { val = (int) *ptr1 + (int) *ptr2-- + carry; if (val > 9) { val -= 10; carry = 1; } else carry = 0; *ptr1-- = val; } if (carry == 1) *ptr1 = (*ptr1 + 1) % 10; } /* We now know the quotient digit. */ *qptr++ = qguess; qdig++; } } /* Clean up and return the number. */ qval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); if (bc_is_zero (qval)) qval->n_sign = PLUS; _bc_rm_leading_zeros (qval); bc_free_num (quot); *quot = qval; /* Clean up temporary storage. */ free (mval); free (num1); free (num2); return 0; /* Everything is OK. */ } /* Division *and* modulo for numbers. This computes both NUM1 / NUM2 and NUM1 % NUM2 and puts the results in QUOT and REM, except that if QUOT is NULL then that store will be omitted. */ int bc_divmod (num1, num2, quot, rem, scale) bc_num num1, num2, *quot, *rem; int scale; { bc_num quotient = NULL; bc_num temp; int rscale; /* Check for correct numbers. */ if (bc_is_zero (num2)) return -1; /* Calculate final scale. */ rscale = MAX (num1->n_scale, num2->n_scale+scale); bc_init_num(&temp); /* Calculate it. */ bc_divide (num1, num2, &temp, scale); if (quot) quotient = bc_copy_num (temp); bc_multiply (temp, num2, &temp, rscale); bc_sub (num1, temp, rem, rscale); bc_free_num (&temp); if (quot) { bc_free_num (quot); *quot = quotient; } return 0; /* Everything is OK. */ } /* Modulo for numbers. This computes NUM1 % NUM2 and puts the result in RESULT. */ int bc_modulo (num1, num2, result, scale) bc_num num1, num2, *result; int scale; { return bc_divmod (num1, num2, NULL, result, scale); } /* Raise BASE to the EXPO power, reduced modulo MOD. The result is placed in RESULT. If a EXPO is not an integer, only the integer part is used. */ int bc_raisemod (base, expo, mod, result, scale) bc_num base, expo, mod, *result; int scale; { bc_num power, exponent, parity, temp; int rscale; /* Check for correct numbers. */ if (bc_is_zero(mod)) return -1; if (bc_is_neg(expo)) return -1; /* Set initial values. */ power = bc_copy_num (base); exponent = bc_copy_num (expo); temp = bc_copy_num (_one_); bc_init_num(&parity); /* Check the base for scale digits. */ if (base->n_scale != 0) bc_rt_warn (_("power with non integral base")); /* bc_rt_warn (_("non-zero scale in base")); */ /* Check the exponent for scale digits. */ if (exponent->n_scale != 0) { bc_rt_warn (_("power with non integral exponent")); /* bc_rt_warn (_("non-zero scale in exponent")); */ bc_divide (exponent, _one_, &exponent, 0); /*truncate */ } /* Check the modulus for scale digits. */ if (mod->n_scale != 0) bc_rt_warn (_("modulus is not an integral value")); /* bc_rt_warn (_("non-zero scale in modulus")); */ /* Do the calculation. */ rscale = MAX(scale, base->n_scale); while ( !bc_is_zero(exponent) ) { (void) bc_divmod (exponent, _two_, &exponent, &parity, 0); if ( !bc_is_zero(parity) ) { bc_multiply (temp, power, &temp, rscale); (void) bc_modulo (temp, mod, &temp, scale); } bc_multiply (power, power, &power, rscale); (void) bc_modulo (power, mod, &power, scale); } /* Assign the value. */ bc_free_num (&power); bc_free_num (&exponent); bc_free_num (result); *result = temp; return 0; /* Everything is OK. */ } /* Raise NUM1 to the NUM2 power. The result is placed in RESULT. Maximum exponent is LONG_MAX. If a NUM2 is not an integer, only the integer part is used. */ void bc_raise (num1, num2, result, scale) bc_num num1, num2, *result; int scale; { bc_num temp, power; long exponent; int rscale; int pwrscale; int calcscale; char neg; /* Check the exponent for scale digits and convert to a long. */ if (num2->n_scale != 0) bc_rt_warn (_("power with non integral exponent")); /* bc_rt_warn (_("non-zero scale in exponent")); */ exponent = bc_num2long (num2); if (exponent == 0 && (num2->n_len > 1 || num2->n_value[0] != 0)) bc_rt_error (_("exponent too large in raise")); /* Special case if exponent is a zero. */ if (exponent == 0) { bc_free_num (result); *result = bc_copy_num (_one_); return; } /* Other initializations. */ if (exponent < 0) { neg = TRUE; exponent = -exponent; rscale = scale; } else { neg = FALSE; rscale = MIN (num1->n_scale*exponent, MAX(scale, num1->n_scale)); } /* Set initial value of temp. */ power = bc_copy_num (num1); pwrscale = num1->n_scale; while ((exponent & 1) == 0) { pwrscale = 2*pwrscale; bc_multiply (power, power, &power, pwrscale); exponent = exponent >> 1; } temp = bc_copy_num (power); calcscale = pwrscale; exponent = exponent >> 1; /* Do the calculation. */ while (exponent > 0) { pwrscale = 2*pwrscale; bc_multiply (power, power, &power, pwrscale); if ((exponent & 1) == 1) { calcscale = pwrscale + calcscale; bc_multiply (temp, power, &temp, calcscale); } exponent = exponent >> 1; } /* Assign the value. */ if (neg) { bc_divide (_one_, temp, result, rscale); bc_free_num (&temp); } else { bc_free_num (result); *result = temp; if ((*result)->n_scale > rscale) (*result)->n_scale = rscale; } bc_free_num (&power); } /* Take the square root NUM and return it in NUM with SCALE digits after the decimal place. */ int bc_sqrt (num, scale) bc_num *num; int scale; { int rscale, cmp_res, done; int cscale; bc_num guess, guess1, point5, diff; /* Initial checks. */ cmp_res = bc_compare (*num, _zero_); if (cmp_res < 0) return -1; /* error */ else { if (cmp_res == 0) { bc_free_num (num); *num = bc_copy_num (_zero_); return 0; } } cmp_res = bc_compare (*num, _one_); if (cmp_res == 0) { bc_free_num (num); *num = bc_copy_num (_one_); return 0; } /* Initialize the variables. */ rscale = MAX (scale, (*num)->n_scale); /* bc_init_num(&guess); */ /* Moved at the line 1386 by Ivano Primi */ bc_init_num(&guess1); bc_init_num(&diff); point5 = bc_new_num (1,1); point5->n_value[1] = 5; /* Calculate the initial guess. */ if (cmp_res < 0) { /* The number is between 0 and 1. Guess should start at 1. */ guess = bc_copy_num (_one_); cscale = (*num)->n_scale; } else { /* The number is greater than 1. Guess should start at 10^(exp/2). */ bc_init_num(&guess); bc_int2num (&guess,10); bc_int2num (&guess1,(*num)->n_len); bc_multiply (guess1, point5, &guess1, 0); guess1->n_scale = 0; bc_raise (guess, guess1, &guess, 0); bc_free_num (&guess1); cscale = 3; } /* Find the square root using Newton's algorithm. */ done = FALSE; while (!done) { bc_free_num (&guess1); guess1 = bc_copy_num (guess); bc_divide (*num, guess, &guess, cscale); bc_add (guess, guess1, &guess, 0); bc_multiply (guess, point5, &guess, cscale); bc_sub (guess, guess1, &diff, cscale+1); if (bc_is_near_zero (diff, cscale)) { if (cscale < rscale+1) cscale = MIN (cscale*3, rscale+1); else done = TRUE; } } /* Assign the number and clean up. */ bc_free_num (num); bc_divide (guess,_one_,num,rscale); bc_free_num (&guess); bc_free_num (&guess1); bc_free_num (&point5); bc_free_num (&diff); return 0; } /* The following routines provide output for bcd numbers package using the rules of POSIX bc for output. */ /* This structure is used for saving digits in the conversion process. */ typedef struct stk_rec { long digit; struct stk_rec *next; } stk_rec; /* The reference string for digits. */ static char ref_str[] = "0123456789ABCDEF"; /* A special output routine for "multi-character digits." Exactly SIZE characters must be output for the value VAL. If SPACE is non-zero, we must output one space before the number. OUT_CHAR is the actual routine for writing the characters. */ void bc_out_long (val, size, space, out_char) long val; int size, space; #ifdef __STDC__ void (*out_char)(int); #else void (*out_char)(); #endif { char digits[40]; int len, ix; if (space) (*out_char) (' '); sprintf (digits, "%ld", val); len = strlen (digits); while (size > len) { (*out_char) ('0'); size--; } for (ix=0; ix < len; ix++) (*out_char) (digits[ix]); } /* Output of a bcd number. NUM is written in base O_BASE using OUT_CHAR as the routine to do the actual output of the characters. */ void bc_out_num (num, o_base, out_char, leading_zero) bc_num num; int o_base; #ifdef __STDC__ void (*out_char)(int); #else void (*out_char)(); #endif int leading_zero; { char *nptr; int index, fdigit, pre_space; stk_rec *digits, *temp; bc_num int_part, frac_part, base, cur_dig, t_num, max_o_digit; /* The negative sign if needed. */ if (num->n_sign == MINUS) (*out_char) ('-'); /* Output the number. */ if (bc_is_zero (num)) (*out_char) ('0'); else if (o_base == 10) { /* The number is in base 10, do it the fast way. */ nptr = num->n_value; if (num->n_len > 1 || *nptr != 0) for (index=num->n_len; index>0; index--) (*out_char) (BCD_CHAR(*nptr++)); else nptr++; if (leading_zero && bc_is_zero (num)) (*out_char) ('0'); /* Now the fraction. */ if (num->n_scale > 0) { (*out_char) ('.'); for (index=0; indexn_scale; index++) (*out_char) (BCD_CHAR(*nptr++)); } } else { /* special case ... */ if (leading_zero && bc_is_zero (num)) (*out_char) ('0'); /* The number is some other base. */ digits = NULL; bc_init_num (&int_part); bc_divide (num, _one_, &int_part, 0); bc_init_num (&frac_part); bc_init_num (&cur_dig); bc_init_num (&base); bc_sub (num, int_part, &frac_part, 0); /* Make the INT_PART and FRAC_PART positive. */ int_part->n_sign = PLUS; frac_part->n_sign = PLUS; bc_int2num (&base, o_base); bc_init_num (&max_o_digit); bc_int2num (&max_o_digit, o_base-1); /* Get the digits of the integer part and push them on a stack. */ while (!bc_is_zero (int_part)) { bc_modulo (int_part, base, &cur_dig, 0); temp = (stk_rec *) malloc (sizeof(stk_rec)); if (temp == NULL) bc_out_of_memory(); temp->digit = bc_num2long (cur_dig); temp->next = digits; digits = temp; bc_divide (int_part, base, &int_part, 0); } /* Print the digits on the stack. */ if (digits != NULL) { /* Output the digits. */ while (digits != NULL) { temp = digits; digits = digits->next; if (o_base <= 16) (*out_char) (ref_str[ (int) temp->digit]); else bc_out_long (temp->digit, max_o_digit->n_len, 1, out_char); free (temp); } } /* Get and print the digits of the fraction part. */ if (num->n_scale > 0) { (*out_char) ('.'); pre_space = 0; t_num = bc_copy_num (_one_); while (t_num->n_len <= num->n_scale) { bc_multiply (frac_part, base, &frac_part, num->n_scale); fdigit = bc_num2long (frac_part); bc_int2num (&int_part, fdigit); bc_sub (frac_part, int_part, &frac_part, 0); if (o_base <= 16) (*out_char) (ref_str[fdigit]); else { bc_out_long (fdigit, max_o_digit->n_len, pre_space, out_char); pre_space = 1; } bc_multiply (t_num, base, &t_num, 0); } bc_free_num (&t_num); } /* Clean up. */ bc_free_num (&int_part); bc_free_num (&frac_part); bc_free_num (&base); bc_free_num (&cur_dig); bc_free_num (&max_o_digit); } } /* Convert a number NUM to a long. The function returns only the integer part of the number. For numbers that are too large to represent as a long, this function returns a zero. This can be detected by checking the NUM for zero after having a zero returned. */ long bc_num2long (num) bc_num num; { long val; char *nptr; int index; /* Extract the int value, ignore the fraction. */ val = 0; nptr = num->n_value; for (index=num->n_len; (index>0) && (val<=(LONG_MAX/BASE)); index--) val = val*BASE + *nptr++; /* Check for overflow. If overflow, return zero. */ if (index>0) val = 0; if (val < 0) val = 0; /* Return the value. */ if (num->n_sign == PLUS) return (val); else return (-val); } /* Convert an integer VAL to a bc number NUM. */ void bc_int2num (num, val) bc_num *num; int val; { char buffer[30]; char *bptr, *vptr; int ix = 1; char neg = 0; /* Sign. */ if (val < 0) { neg = 1; val = -val; } /* Get things going. */ bptr = buffer; *bptr++ = val % BASE; val = val / BASE; /* Extract remaining digits. */ while (val != 0) { *bptr++ = val % BASE; val = val / BASE; ix++; /* Count the digits. */ } /* Make the number. */ bc_free_num (num); *num = bc_new_num (ix, 0); if (neg) (*num)->n_sign = MINUS; /* Assign the digits. */ vptr = (*num)->n_value; while (ix-- > 0) *vptr++ = *--bptr; } /* Convert a numbers to a string. Base 10 only.*/ char * bc_num2str (num) bc_num num; { char *str, *sptr; char *nptr; int index, signch; /* Allocate the string memory. */ signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */ if (num->n_scale > 0) str = (char *) malloc (num->n_len + num->n_scale + 2 + signch); else str = (char *) malloc (num->n_len + 1 + signch); if (str == NULL) bc_out_of_memory(); /* The negative sign if needed. */ sptr = str; if (signch) *sptr++ = '-'; /* Load the whole number. */ nptr = num->n_value; for (index=num->n_len; index>0; index--) *sptr++ = BCD_CHAR(*nptr++); /* Now the fraction. */ if (num->n_scale > 0) { *sptr++ = '.'; for (index=0; indexn_scale; index++) *sptr++ = BCD_CHAR(*nptr++); } /* Terminate the string and return it! */ *sptr = '\0'; return (str); } /* Convert strings to bc numbers. Base 10 only.*/ void bc_str2num (num, str, scale) bc_num *num; char *str; int scale; { int digits, strscale; char *ptr, *nptr; char zero_int; /* Prepare num. */ bc_free_num (num); /* Check for valid number and count digits. */ ptr = str; digits = 0; strscale = 0; zero_int = FALSE; if ( (*ptr == '+') || (*ptr == '-')) ptr++; /* Sign */ while (*ptr == '0') ptr++; /* Skip leading zeros. */ while (is_digit((int)*ptr)) ptr++, digits++; /* digits */ if (*ptr == '.') ptr++; /* decimal point */ while (is_digit((int)*ptr)) ptr++, strscale++; /* digits */ if ((*ptr != '\0') || (digits+strscale == 0)) { *num = bc_copy_num (_zero_); return; } /* Adjust numbers and allocate storage and initialize fields. */ strscale = MIN(strscale, scale); if (digits == 0) { zero_int = TRUE; digits = 1; } *num = bc_new_num (digits, strscale); /* Build the whole number. */ ptr = str; if (*ptr == '-') { (*num)->n_sign = MINUS; ptr++; } else { (*num)->n_sign = PLUS; if (*ptr == '+') ptr++; } while (*ptr == '0') ptr++; /* Skip leading zeros. */ nptr = (*num)->n_value; if (zero_int) { *nptr++ = 0; digits = 0; } for (;digits > 0; digits--) *nptr++ = CH_VAL(*ptr++); /* Build the fractional part. */ if (strscale > 0) { ptr++; /* skip the decimal point! */ for (;strscale > 0; strscale--) *nptr++ = CH_VAL(*ptr++); } } void out_char (int c) { putchar(c); } void out_char_stderr (int c) { fputc (c, stderr); } /* pn prints the number NUM in base 10. */ void pn (num) bc_num num; { bc_out_num (num, 10, out_char, 0); out_char ('\n'); } /* pn_stderr prints the number NUM in base 10 on stderr. */ void pn_stderr (num) bc_num num; { bc_out_num (num, 10, out_char_stderr, 0); out_char_stderr ('\n'); } /* pv prints a character array as if it was a string of bcd digits. */ void pv (name, num, len) char *name; unsigned char *num; int len; { int i; printf ("%s=", name); for (i=0; i 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 . */ #include #include #include "numdiff.h" #include "xalloc.h" extern Real Zero; /* Care that internally the field numbers start from zero, not from one */ const long FIELDNO_MAX = (8 * FIELDMASK_SIZE); const char separator = ':'; static const struct numfmt defaults = {CURRENCY, DP, THSEP, GROUPING, POS_SIGN, NEG_SIGN, ECH, IU}; /* Create a new stack of threshold values, then push onto the stack the element { threshold = 0.0, beg1 = 0, end1 = FIELDNO_MAX-1, beg2 = 0, end2 = FIELDNO_MAX-1, double_range_spec = 0 } and return a pointer to the top of the stack. */ thrlist thrlist_new (void) { thrlist list; list = (thrlist) xmalloc (sizeof (thrlist_node)); initR (&list->threshold); /* copyR (&list->threshold, Zero); */ list->beg1 = list->beg2 = 0; list->end1 = list->end2 = FIELDNO_MAX - 1; list->double_range_spec = 0; list->next = NULL; return list; } /* If the string STR begins with a valid range of positive integer values, then set *B to (start value - 1), *E to (end value - 1), and, if TAIL != NULL, set *TAIL so that it points to the first character of STR after the range specification. Finally, return THRLIST_OK (0). For example, if STR == "1-10#abc", then *B will be set to 0, *E to 9, and *TAIL will point to the character '#'. If the string STR does not begin with a valid range of positive integer values, then leave *B, *E and *TAIL unchanged and return the error code THRLIST_INVALID_FORMAT. Remarks: 1. The following abbreviated range specifications are admitted, where N is a positive integer value and M == FIELDNO_MAX : N stays for N-N -N stays for 1-N N- stays for N-M . 2. The extremal values of a valid range are integer numbers between 1 and FIELDNO_MAX. In addition, the start value may not be greater than the end value. In case these conditions are not both true the function returns THRLIST_INVALID_FORMAT. */ static int set_interval (const char *str, unsigned long *b, unsigned long *e, char **tail) { long beg, end; char *ptr, *endptr; beg = end = -1; if (!str || !*str) return THRLIST_INVALID_FORMAT; /* illegal input */ /* If we arrive here we are sure that *str != '\0' ! */ if ((beg = strtol (str, &endptr, 10)) == 0 || beg > FIELDNO_MAX || beg < -FIELDNO_MAX) return THRLIST_INVALID_FORMAT; /* illegal input */ else if (beg < 0) { if (*endptr == '\0' || *endptr == separator) { end = -beg; beg = 1; } else return THRLIST_INVALID_FORMAT; } else if (*endptr == '\0' || *endptr == separator) end = beg; else if (*endptr == '-') { ptr = endptr + 1; if (*ptr == '\0' || *ptr == separator) end = FIELDNO_MAX; else { if ((end = strtol (ptr, &endptr, 10)) <= 0 || (*endptr != '\0' && *endptr != separator) || end > FIELDNO_MAX) return THRLIST_INVALID_FORMAT; /* illegal input */ } } if (beg > end) return THRLIST_INVALID_FORMAT; else { *b = (unsigned long)(beg-1); *e = (unsigned long)(end-1); if (tail != NULL) *tail = endptr; return THRLIST_OK; } } /* If the string DEF contains a specification of the form RANGE1:RANGE2, where the ranges RANGE1 and RANGE2 are both in the form accepted by the function set_interval() and have the same length, then set *BEG1, *END1, *BEG2 and *END2 to the extremal values of RANGE1 and RANGE2, respectively, after decrementing them of 1. Then set *DBL_RNG_SPEC to 1 and return THRLIST_OK to the calling function. If the string DEF contains a specification of the form RANGE, where RANGE is in the form accepted by the function set_interval(), then set *BEG1 and *BEG2 to (start_value_of_RANGE - 1), *END1 and *END2 (end_value_of_RANGE - 1), and *DBL_RNG_SPEC to zero. Then return THRLIST_OK to the calling function. If DEF does not contain a valid specification of the form RANGE or RANGE1:RANGE2 then return THRLIST_INVALID_FORMAT. If the given specification is valid, but RANGE1 and RANGE2 do not have the same length, then return THRLIST_INVALID_RANGES. Remark: In the last two cases after returning from the function the values of *BEG1, *BEG2, *END1, *END2 and *DBL_RNG_SPEC can not be trusted. */ static int set_intervals (const char *def, unsigned long *beg1, unsigned long *beg2, unsigned long *end1, unsigned long *end2, int *dbl_rng_spec) { char *endptr; int rv; rv = set_interval (def, beg1, end1, &endptr); if (rv != 0) return rv; else if (*endptr == separator) { rv = set_interval (endptr + 1, beg2, end2, &endptr); if ((rv != 0) || (*endptr != '\0')) return THRLIST_INVALID_FORMAT; else { *dbl_rng_spec = 1; return (*end2 + *beg1 == *end1 + *beg2) ? THRLIST_OK : THRLIST_INVALID_RANGES; } } else { /* *endptr == '\0' */ *beg2 = *beg1; *end2 = *end1; *dbl_rng_spec = 0; return THRLIST_OK; } } /* Push onto the stack pointed to by PLIST a new element according to the specification contained in the string DEF. This specification must have the form 1. THRESHOLD or 2. THRESHOLD:RANGE or 3. THRESHOLD:RANGE1:RANGE2 where THRESHOLD is a non-negative real (decimal) number, and RANGE or RANGE1:RANGE2 must be a valid specification for the function set_intervals(). In case 1. and 2. set the field DOUBLE_RANGE_SPEC of the just pushed element to zero, otherwise set it to 1. If DEF does not contain a valid specification, then do nothing but return a suitable error code (either THRLIST_INVALID_FORMAT or THRLIST_INVALID_RANGES). Otherwise, return THRLIST_OK. */ int thrlist_add (thrlist *plist, const char* def) { int rv, dbl_rng_spec; Real r; unsigned long beg1, beg2, end1, end2; thrlist_node *pnode; char *endptr; if (!def || !*def) return THRLIST_INVALID_FORMAT; /* no input */ /* If we arrive here we are sure that *def != '\0' ! */ initR (&r); str2R (def, &endptr, ISCALE, &defaults, &r); if (endptr == def || cmp(r, Zero) < 0) { delR (&r); return THRLIST_INVALID_FORMAT; /* no valid positive number */ } else { if (*endptr == '\0') { beg1 = beg2 = 0; end1 = end2 = FIELDNO_MAX - 1; dbl_rng_spec = 0; } else if (*endptr == separator) { if ( (rv = set_intervals (endptr + 1, &beg1, &beg2, &end1, &end2, &dbl_rng_spec)) != 0) { delR (&r); return rv; } } else { delR (&r); return THRLIST_INVALID_FORMAT; } pnode = (thrlist_node*) xmalloc (sizeof (thrlist_node)); initR (&pnode->threshold); copyR (&pnode->threshold, r); delR (&r); pnode->beg1 = beg1; pnode->beg2 = beg2; pnode->end1 = end1; pnode->end2 = end2; pnode->double_range_spec = dbl_rng_spec; pnode->next = *plist; *plist = pnode; return THRLIST_OK; } } /* Look in the stack LIST for the first element E from the top such that either E.DOUBLE_RANGE_SPEC == 0 and E.BEG1 <= FIELDNO1 <= E.END1, E.BEG2 <= FIELDNO2 <= E.END2, or E.DOUBLE_RANGE_SPEC == 1 and E.BEG1 <= FIELDNO1 <= E.END1, FIELDNO2 == E.BEG2 + FIELDNO1 - E.BEG1 . Then return the value of the comparison test between R and E.THRESHOLD. If there is no element E in LIST satisfying one of the previous conditions (this should never happen if LIST has been created by thrlist_new()), then interrupt the main program via exit(EXIT_TROUBLE) after printing a suitable error message on stdout. */ int thrlist_cmp (Real r, thrlist list, unsigned long fieldno1, unsigned long fieldno2) { thrlist_node *pnode, *pnext; pnode = list; while (pnode != NULL) { pnext = pnode->next; if ( (pnode->double_range_spec) ) { if (fieldno1 >= pnode->beg1 && fieldno1 <= pnode->end1 && fieldno2 == pnode->beg2 + fieldno1 - pnode->beg1) { return cmp (r, pnode->threshold); /* found */ } } else { if (fieldno1 >= pnode->beg1 && fieldno1 <= pnode->end1 && fieldno2 >= pnode->beg2 && fieldno2 <= pnode->end2) { return cmp (r, pnode->threshold); /* found */ } } pnode = pnext; } /* The code execution should NEVER reach this point. */ printf (_("Fatal error occurred during comparison of two numerical fields\n")); exit (EXIT_TROUBLE); } /* Dispose the stack pointed to by PLIST (free and clean the memory). */ void thrlist_dispose (thrlist *plist) { thrlist_node *pnode, *pnext; if (plist != NULL) { pnode = *plist; while (pnode != NULL) { pnext = pnode->next; delR (&pnode->threshold); free ((void*)pnode); pnode = pnext; } *plist = NULL; } } ./numdiff-5.8.1/cmpbuf.c0000644000175000017500000000741612215353073013755 0ustar ivanoivano/* Buffer primitives for comparison operations. Copyright (C) 1993, 1995, 1998, 2001, 2002 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include #endif #include #include #include #ifndef SA_RESTART # ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */ # define SA_RESTART SA_INTERRUPT # else # define SA_RESTART 0 # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_INTTYPES_H # include #endif #include #include "cmpbuf.h" /* Determine whether an integer type is signed, and its bounds. This code assumes two's (or one's!) complement with no holes. */ /* The extra casts work around common compiler bugs, e.g. Cray C 5.0.3.0 when t == time_t. */ #ifndef TYPE_SIGNED # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) #endif #ifndef TYPE_MINIMUM # define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ : (t) 0)) #endif #ifndef TYPE_MAXIMUM # define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) #endif #ifndef PTRDIFF_MAX # define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t) #endif #ifndef SIZE_MAX # define SIZE_MAX TYPE_MAXIMUM (size_t) #endif #ifndef SSIZE_MAX # define SSIZE_MAX TYPE_MAXIMUM (ssize_t) #endif #undef MIN #define MIN(a, b) ((a) <= (b) ? (a) : (b)) /* Read NBYTES bytes from descriptor FD into BUF. NBYTES must not be SIZE_MAX. Return the number of characters successfully read. On error, return SIZE_MAX, setting errno. The number returned is always NBYTES unless end-of-file or error. */ size_t block_read (int fd, char *buf, size_t nbytes) { char *bp = buf; char const *buflim = buf + nbytes; size_t readlim = SSIZE_MAX; do { size_t bytes_to_read = MIN (buflim - bp, readlim); ssize_t nread = read (fd, bp, bytes_to_read); if (nread <= 0) { if (nread == 0) break; /* Accommodate Tru64 5.1, which can't read more than INT_MAX bytes at a time. They call that a 64-bit OS? */ if (errno == EINVAL && INT_MAX < bytes_to_read) { readlim = INT_MAX; continue; } /* This is needed for programs that have signal handlers on older hosts without SA_RESTART. It also accommodates ancient AIX hosts that set errno to EINTR after uncaught SIGCONT. See (1993-04-22). */ if (! SA_RESTART && errno == EINTR) continue; return SIZE_MAX; } bp += nread; } while (bp < buflim); return bp - buf; } /* Least common multiple of two buffer sizes A and B. However, if either A or B is zero, or if the multiple is greater than LCM_MAX, return a reasonable buffer size. */ size_t buffer_lcm (size_t a, size_t b, size_t lcm_max) { size_t lcm, m, n, q, r; /* Yield reasonable values if buffer sizes are zero. */ if (!a) return b ? b : 8 * 1024; if (!b) return a; /* n = gcd (a, b) */ for (m = a, n = b; (r = m % n) != 0; m = n, n = r) continue; /* Yield a if there is an overflow. */ q = a / n; lcm = q * b; return lcm <= lcm_max && lcm / b == q ? lcm : a; } ./numdiff-5.8.1/numutil.c0000444000175000017500000005266612215353073014203 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include "numdiff.h" #include #include /* for exit() */ #include #if defined(HAVE_LOCALECONV) && defined(USE_GMP) #include #endif /* HAVE_LOCALECONV and USE_GMP */ /* The following structure is used to store the canonical form of a real number. The canonical form corresponding to zero is .sgn = 0 .ipart = NULL .dpart = NULL .expn = 0 . If X is a non-null number with sign S (either + or -), integer part II...II (each I is a digit but the digits have not to be necessarily all equal), decimal part DD...DD (each D is a digit but the digits have not to be necessarily all equal) and exponent N, i.e. X = SII...II(decimal point)DD...DD * 10^N, then the canonical form of X is given by: .sgn = S .ipart = "II...II" .dpart = "DD...DD" and, denoted by NI the number of digits of the integer part and by NN the number of null digits after the decimal point (NN can be zero, for instance if the first digit of the decimal part is not null), +---- N + NI - 1, if NI > 0 | .expn = < | +---- N - NN - 1, if NI == 0 The exponent stored in the canonical form is then equal to the one that you would find in the scientific representation of the number. If the integer (decimal) part of X is zero, then .ipart (.dpart respectively) is the empty string. The string that one obtains by appending the decimal part to the integer part is what I call mantissa. Given two non-null numbers X and Y both in canonical form, they are equal if and only if they have the same sign, the same exponents and the same mantissa. */ struct canform { unsigned char sgn; char *ipart, *dpart; long expn; }; struct canform null = { 0, NULL, NULL, 0}; static char* anum (const char *str, const struct numfmt* pnf) { char *ptr; long digits, strscale; size_t length; ptr = (char*)str; digits = 0; strscale = 0; length = strlen(pnf->currency); if ( (*ptr == pnf->pos_sign) || (*ptr == pnf->neg_sign) ) move_ahead(ptr); if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ if (pnf->grouping > 0) { while ( (is_digit((int)*ptr)) || *ptr == pnf->thsep ) { int first_sep = 1; if (*ptr == pnf->thsep) { unsigned long i; char* ptr2; if ((first_sep)) { for (ptr2 = ptr; ptr2 > str && (is_digit ((int)*(ptr2-1))); ptr2--); if ((i=ptr-ptr2) == 0 || i > pnf->grouping) { return (char*) str; } first_sep = 0; } for (ptr2 = ptr + 1; (is_digit((int)*ptr2)); ptr2++); if ((i=ptr2-ptr-1) != pnf->grouping) { return (char*) str; } ptr++; } else { move_ahead(ptr), digits++; } } } else { while ( (is_digit((int)*ptr)) ) { move_ahead(ptr), digits++; } } if (*ptr == pnf->dp) move_ahead(ptr); while ( (is_digit((int)*ptr)) ) move_ahead(ptr), strscale++; if (digits+strscale == 0) return (char*)str; if (TOLOWER(*ptr) == TOLOWER(pnf->ech) && !is_space (*(ptr+1))) { char *tail; long expn; expn = strtol (ptr + 1, &tail, 10); if (expn < MIN_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too small exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents smaller than %ld are not accepted,\n"), MIN_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if (expn > MAX_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too large exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents larger than %ld are not accepted,\n"), MAX_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } return (tail != ptr + 1 ? tail : ptr); } else return ptr; } /* This function is going to be used in inout.c and util.c */ char* acxnum (const char *str, const struct numfmt* pnf) { char *ptr, *endrp, *ptr2; endrp = ptr = anum (str, pnf); if (ptr != str) { if (*ptr == pnf->iu) { return ptr + 1; } else { while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { ptr2 = anum (ptr, pnf); return (*ptr2 != pnf->iu ? endrp : ptr2 + 1); } else return endrp; } } else return ptr; } static char* snum (const char *str, const struct numfmt* pnf, struct canform* pcform) { char *ptr = (char*)str; char *it = pcform->ipart; int nonnull_digit_found = 0; long digits, strscale, nzeros, expn; char* tail; size_t length; digits = strscale = 0; length = strlen(pnf->currency); if ( (*ptr == pnf->pos_sign) ) { pcform->sgn = POS_SIGN; move_ahead(ptr); } else if ( (*ptr == pnf->neg_sign) ) { pcform->sgn = NEG_SIGN; move_ahead(ptr); } if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ if (pnf->grouping > 0) { while ( (is_digit((int)*ptr)) || *ptr == pnf->thsep ) { int first_sep = 1; if (*ptr == pnf->thsep) { unsigned long i; char* ptr2; if ((first_sep)) { for (ptr2 = ptr; ptr2 > str && (is_digit ((int)*(ptr2-1))); ptr2--); if ((i=ptr-ptr2) == 0 || i > pnf->grouping) { return (char*) str; } first_sep = 0; } for (ptr2 = ptr + 1; (is_digit((int)*ptr2)); ptr2++); if ((i=ptr2-ptr-1) != pnf->grouping) { return (char*) str; } ptr++; } else { if ((nonnull_digit_found |= *ptr > CHAR_ZERO)) *it++ = *ptr; move_ahead(ptr), digits++; } } } else { while ( (is_digit((int)*ptr)) ) { if ((nonnull_digit_found |= *ptr > CHAR_ZERO)) *it++ = *ptr; move_ahead(ptr), digits++; } } if (*ptr == pnf->dp) { it = pcform->dpart; move_ahead(ptr); } while ( (is_digit((int)*ptr)) ) { for (nzeros = 0; *ptr == CHAR_ZERO; nzeros++, move_ahead(ptr)); strscale += nzeros; if ( (is_digit((int)*ptr)) ) { nonnull_digit_found = 1; for (; nzeros > 0; nzeros--) *it++ = CHAR_ZERO; *it++ = *ptr; move_ahead(ptr), strscale++; } } if (digits+strscale == 0) return (char*)str; if (!nonnull_digit_found) { free((void*)pcform->ipart); free((void*)pcform->dpart); pcform->ipart = pcform->dpart = NULL; pcform->sgn = 0; } if (TOLOWER(*ptr) == TOLOWER(pnf->ech) && !is_space (*(ptr+1))) { expn = strtol (ptr + 1, &tail, 10); if (tail != ptr + 1) { if (expn < MIN_EXPN) { fprintf (stderr, _("%s: a number with a too small exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents smaller than %ld are not accepted,\n"), MIN_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if (expn > MAX_EXPN) { fprintf (stderr, _("%s: a number with a too large exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents larger than %ld are not accepted,\n"), MAX_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } pcform->expn = (nonnull_digit_found) ? expn : 0; return tail; } else { pcform->expn = 0; return ptr; } } else return ptr; } static int inc_with_check (long* pl, unsigned long r) { long l = *pl; unsigned long L; if (r == 0) return 0; else if (r > LONG_MAX) return -1; /* After this we are sure that 1 <= r <= LONG_MAX */ else if ( (long)r >= -l ) /* This is surely the case if l >= 0 */ { L = l + r; if (L > LONG_MAX) return -1; else { *pl = L; return 0; } } else { /* r < -l ==> l < r+l < 0 */ *pl = l + (long)r; return 0; } } static int dec_with_check (long* pl, unsigned long r) { long l = *pl; unsigned long L; if (r == 0) return 0; else if (r > LONG_MAX) return -1; /* After this we are sure that 1 <= r <= LONG_MAX */ else if ( (long)r >= l ) /* This is surely the case if l <= 0 */ { L = r - l; if (L > LONG_MAX) return -1; else { /* 0 <= r - l <= LONG_MAX ==> LONG_MIN <= -LONG_MAX <= l - r <= 0 */ *pl = -(long)L; return 0; } } else { /* r < l ==> 0 < l-r < l */ *pl = l - (long)r; return 0; } } static void msg_and_abort (const char* progname) { fprintf (stderr, "%s: number with too big mantissa or\nwith exponent out of the allowed range\n", progname); exit (EXIT_TROUBLE); } static void normalize (struct canform* pnum) { size_t lip, lnullprefix; char *ptr; if (!pnum || !pnum->ipart || !pnum->dpart) return; if (pnum->sgn == 0) pnum->sgn = POS_SIGN; if ( (lip = strlen (pnum->ipart)) > ULONG_MAX ) msg_and_abort (PACKAGE); if (lip != 0) { if ( inc_with_check (&pnum->expn, lip-1) != 0 ) msg_and_abort (PACKAGE); if ( *pnum->dpart == '\0' ) for (ptr = pnum->ipart + lip - 1; *ptr == CHAR_ZERO; *ptr-- = '\0'); } else { /* The integer part has zero length ==> decimal part with positive length */ for (lnullprefix = 0, ptr = pnum->dpart; *ptr == CHAR_ZERO; lnullprefix++, ptr++); if ( lnullprefix > ULONG_MAX ) msg_and_abort (PACKAGE); if ( dec_with_check (&pnum->expn, lnullprefix+1) != 0 ) msg_and_abort (PACKAGE); if ((lnullprefix)) { for (ptr = pnum->dpart + lnullprefix; *ptr != '\0'; ptr++) *(ptr-lnullprefix) = *ptr; *(ptr-lnullprefix) = '\0'; } } } static char* scxnum (const char *str, const struct numfmt* pnf, struct canform* pre, struct canform* pim) { char *ptr, *endrp, *ptr2; struct canform cform1, cform2; size_t slen = strlen (str); cform1.sgn = 0; cform1.ipart = stralloc (slen); cform1.dpart = stralloc (slen); cform1.expn = 0; endrp = ptr = snum (str, pnf, &cform1); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", str, cform1.sgn, cform1.ipart, cform1.dpart, cform1.expn, endrp); #endif if (ptr != str) { normalize (&cform1); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "After normalization:\n"); fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", str, cform1.sgn, cform1.ipart, cform1.dpart, cform1.expn, endrp); #endif if (*ptr == pnf->iu) { /* We have read a pure imaginary number. */ *pre = null; *pim = cform1; return ptr + 1; } else { /* We have to check if we have read a pure real number or if we can read a full complex number. */ *pre = cform1; while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { cform2.sgn = 0; cform2.ipart = stralloc (slen); cform2.dpart = stralloc (slen); cform2.expn = 0; ptr2 = snum (ptr, pnf, &cform2); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", ptr, cform2.sgn, cform2.ipart, cform2.dpart, cform2.expn, ptr2); #endif if (*ptr2 == pnf->iu) { /* We have read a full complex number. */ normalize (&cform2); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "After normalization:\n"); fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", ptr, cform2.sgn, cform2.ipart, cform2.dpart, cform2.expn, ptr2); #endif *pim = cform2; return ptr2 + 1; } else { /* We have read a pure real number. */ free ((void*) cform2.ipart); free ((void*) cform2.dpart); *pim = null; return endrp; } } else { /* We have read a pure real number. */ *pim = null; return endrp; } } } else { /* We have read no valid number, clean and return. */ free ((void*) cform1.ipart); free ((void*) cform1.dpart); *pre = *pim = null; return ptr; } } /* The following function compares two canonic forms of numerical values. It returns 0 if they are equal, 1 if they differ. */ static int compare_canonic_forms (struct canform x, struct canform y) { char *px, *py; int ppx, ppy; if (!x.ipart && !x.dpart) { /* If `x' is zero, then */ return ((y.ipart) || (y.dpart) ? 1 : 0); /* return 1 if `y' is not zero, */ /* 0 if also `y' is zero */ } else { /* If `x' is not zero, then */ if (!y.ipart && !y.dpart) return 1; /* return 1 if `y' is zero */ /* If both `x' and `y' are not zero */ /* we need a detailed comparison */ if (x.sgn != y.sgn) return 1; if (x.expn != y.expn) return 1; /* After comparing signs and exponents */ /* we compare the mantissas */ ppx = ppy = 0; px = x.ipart; py = y.ipart; /* Explanation about the meaning of `ppx' and `ppy': `ppx' (`ppy') is 0 as long as `px' (`py') points to a character in the string `x.ipart' (`y.ipart'), `ppx' (`ppy') is 1 when `px' (`py') points to a character in the string `x.dpart' (`y.dpart'), and becomes 2 after that both `x.ipart' and `x.dpart' (`y.ipart' and `y.dpart') have been scanned */ do { for ( ; *px != '\0' && *py != '\0' && *px == *py; px++, py++); if (*px == '\0') { ppx++; if (ppx == 1) px = x.dpart; } if (*py == '\0') { ppy++; if (ppy == 1) py = y.dpart; } } while (*px == *py && ppx < 2 && ppy < 2); return (*px != *py); } } /* The following function compares `str1' and `str2' assuming that they both contain a valid (possibly complex) number and neglecting differences in the numeric format. To be sure that the contents of `str1' and `str2' correspond to valid numbers, call before acxnum() on `str1' and `str2'. This function returns !0 to mean that the numeric contents of `str1' and `str2' differ, else 0. This function is going to be used in util.c */ int compare_numeric_strings (const char *str1, const struct numfmt* pnf1, const char *str2, const struct numfmt* pnf2) { struct canform re1, im1, re2, im2; int re_differ, im_differ; scxnum (str1, pnf1, &re1, &im1); scxnum (str2, pnf2, &re2, &im2); re_differ = compare_canonic_forms (re1, re2); im_differ = compare_canonic_forms (im1, im2); /* Clean the memory before returning the result of the comparison */ if ((re1.ipart)) free ((void*)re1.ipart); if ((re1.dpart)) free ((void*)re1.dpart); if ((im1.ipart)) free ((void*)im1.ipart); if ((im1.dpart)) free ((void*)im1.dpart); if ((re2.ipart)) free ((void*)re2.ipart); if ((re2.dpart)) free ((void*)re2.dpart); if ((im2.ipart)) free ((void*)im2.ipart); if ((im2.dpart)) free ((void*)im2.dpart); return (re_differ || im_differ); } #define HNDDULONG 80 static void hash_canonic_form (struct canform num, int pos_flag, hash_value* ph) { char *ptr, exp_ch[HNDDULONG+1]; size_t li, ld, le; int s_exp = (num.expn >= 0) ? 1 : -1; unsigned long abs_exp = num.expn * s_exp; li = (num.ipart) ? strlen(num.ipart) : 0; ld = (num.dpart) ? strlen(num.dpart) : 0; exp_ch[HNDDULONG] = '\0'; for (le = 0; abs_exp != 0; le++, abs_exp /= 10) exp_ch[HNDDULONG-1-le] = (char)(abs_exp % 10) + CHAR_ZERO; if (le > 0) exp_ch[HNDDULONG-1-le] = (s_exp < 0) ? NEG_SIGN : POS_SIGN; else exp_ch[HNDDULONG-1] = CHAR_ZERO; s_exp = HNDDULONG-2-le; exp_ch[s_exp] = ECH; if (li == 0 && ld == 0) { *ph = HASH (*ph, (unsigned char) CHAR_ZERO); *ph = HASH (*ph, (unsigned char) ECH); *ph = HASH (*ph, (unsigned char) CHAR_ZERO); } else { if (num.sgn == NEG_SIGN) *ph = HASH (*ph, (unsigned char) NEG_SIGN); else { if ((pos_flag)) *ph = HASH (*ph, (unsigned char) POS_SIGN); } if (li > 0) { *ph = HASH (*ph, (unsigned char) *num.ipart); if (li > 1 || ld > 0) *ph = HASH (*ph, (unsigned char) DP); for (ptr = num.ipart+1; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); if (ld > 0) { for (ptr = num.dpart; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); } } else /* li == 0 but ld > 0 */ { *ph = HASH (*ph, (unsigned char) *num.dpart); if (ld > 1) { *ph = HASH (*ph, (unsigned char) DP); for (ptr = num.dpart+1; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); } } for (ptr = exp_ch + s_exp; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); } } /* This function is going to be used in inout.c */ char* hcxnum (const char *str, const struct numfmt* pnf, hash_value *ph) { struct canform re, im; char *endptr; endptr = scxnum (str, pnf, &re, &im); if (endptr != str) { if ((im.ipart == NULL && im.dpart == NULL)) /* If the imaginary part is zero, hash only the real part */ hash_canonic_form (re, 0, ph); else { /* If the imaginary part is not zero but the real part is null, then hash only the imaginary part */ if ((re.ipart == NULL && re.dpart == NULL)) hash_canonic_form (im, 0, ph); else { /* If both real and imaginary part are not zero, hash both of them. The imaginary part must always be hashed with its sign */ hash_canonic_form (re, 0, ph); hash_canonic_form (im, 1, ph); } *ph = HASH (*ph, IU); } } /* Clean the memory and return */ if ((re.ipart)) free ((void*)re.ipart); if ((re.dpart)) free ((void*)re.dpart); if ((im.ipart)) free ((void*)im.ipart); if ((im.dpart)) free ((void*)im.dpart); return endptr; } #ifdef USE_GMP int mpf_a2num (Real* pr, const char *q, char** endptr, const struct numfmt* pnf) { struct canform cform; size_t slen = strlen (q); cform.sgn = 0; cform.ipart = stralloc (slen); cform.dpart = stralloc (slen); cform.expn = 0; *endptr = snum (q, pnf, &cform); if (*endptr != q) { char *ptr, *str; long e; size_t len, explen; #ifdef HAVE_LOCALECONV struct lconv *plconv = localeconv(); char* dec_point = plconv->decimal_point; #else /* not HAVE_LOCALECONV */ char* dec_point = "."; #endif /* not HAVE_LOCALECONV */ if (cform.ipart == NULL || cform.dpart == NULL) { /* The number contained in the string Q is zero */ mpf_set_ui (*pr, 0); return 0; } normalize (&cform); e = cform.expn >= 0 ? cform.expn : -cform.expn; for (len = 0; e != 0; len++, e /= 10); explen = len; if (cform.expn < 0) /* We need space for the minus sign in front of the exponent */ len++; if (cform.sgn == NEG_SIGN) /* We need space for the minus sign in front of the whole number */ len++; /* We need space also for the decimal point and the exponent letter */ len += strlen (cform.ipart) + strlen (cform.dpart) + strlen(dec_point) + 1; ptr = str = stralloc (len); if (cform.sgn == NEG_SIGN) { *ptr = NEG_SIGN; ptr++; } if (*cform.ipart != '\0') { *ptr = *cform.ipart; strcat (str, dec_point); strcat (str, cform.ipart+1); strcat (str, cform.dpart); } else { *ptr = *cform.dpart; strcat (str, dec_point); strcat (str, cform.dpart+1); } if (explen > 0) { for (ptr++; *ptr != '\0'; ptr++); *ptr = ECH; if (cform.expn < 0) { ptr++; *ptr = NEG_SIGN; } ptr += explen; for (e = cform.expn >= 0 ? cform.expn : -cform.expn; e != 0; ptr--, e /= 10) *ptr = CHAR_ZERO + e % 10; } if ( mpf_set_str (*pr, str, 10) == -1 ) { /* This should never happen. If mpf_set_str() returns -1, then */ /* there is something wrong with the code above. */ fprintf (stderr, _("The string \"%s\"\nis not a valid number, the execution of the program ends now\n"), str); free ((void*) cform.ipart); free ((void*) cform.dpart); free ((void*) str); exit (EXIT_TROUBLE); } else { free ((void*) cform.ipart); free ((void*) cform.dpart); free ((void*) str); return 0; } } /* *endptr != q */ else { /* We have read no valid number, then free the previously allocated memory, set the value pointed to by PR to zero and return -1 */ free ((void*) cform.ipart); free ((void*) cform.dpart); mpf_set_ui (*pr, 0); return -1; } /* *endptr == q */ } #endif /* USE_GMP */ ./numdiff-5.8.1/read_line.c0000444000175000017500000000763412215353073014423 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #ifdef _TEST_READ_LINE_ #include #include #include #define BUFF_SIZE 32 /* Error codes */ #define OK 0 #define LINE_INTERR 1 #define EOF_REACHED 2 #define READING_ERROR 3 #define OUT_OF_MEMORY 4 /* *** */ #define OPEN_FAILED 5 #define WRONG_USAGE 6 #define FILE_IS_BINARY 7 #endif /* _TEST_READ_LINE_ */ char* read_line (FILE* pf, int* errcode) { char buffer[BUFF_SIZE]; char *ptr, *line = NULL; size_t lline = 0; register size_t n; register int ch; int exception_occurred = 0; do { for (n = 0; n < BUFF_SIZE-1 && (ch = getc(pf)) != EOF && ch != '\0' && ch != '\n'; n++) buffer[n] = ch; if ( !(exception_occurred = ((ch == EOF && n == 0) || ch == '\0')) ) { /* If we enter this block, then CH is not the nul character. Thus either is n == BUFF_SIZE-1, or is CH == EOF or is CH == NEWLINE. */ if (n == BUFF_SIZE-1 || ch == EOF) { buffer[n] = '\0'; lline += n; } else { buffer[n] = '\n'; buffer[n+1] = '\0'; lline += (n+1); } if (!line) ptr = (char*) calloc (lline + 1, sizeof(char)); else ptr = (char*) realloc ((void*)line, (lline + 1) * sizeof(char)); if (!ptr) { if ((line)) free ((void*)line); *errcode = OUT_OF_MEMORY; return NULL; } else { line = ptr; strcat (line, buffer); } if (lline > 0 && line[lline-1] == '\n') break; } } while (!exception_occurred); if ((exception_occurred)) { if ( (ferror(pf)) ) *errcode = READING_ERROR; else if ( ch == '\0' ) *errcode = FILE_IS_BINARY; else if (lline > 0) *errcode = LINE_INTERR; else *errcode = EOF_REACHED; } else *errcode = OK; return line; } #ifdef _TEST_READ_LINE_ int main (int argc, char* argv[]) { FILE* fp; if (argc != 2) { fprintf (stderr, "\n*** Usage: %s FILEPATH\n", argv[0]); return 1; } else if ( !(fp = fopen (argv[1], "r")) ) { fprintf (stderr, "\n*** Cannot open \"%s\" for reading:\n", argv[1]); perror(NULL); return 1; } else { char* line = NULL; int errcode = OK; do { line = read_line (fp, &errcode); switch (errcode) { case FILE_IS_BINARY: fputs ("\n*** Cannot read from a binary file\n", stderr); break; case LINE_INTERR: fputs (line, stdout); puts (""); break; case READING_ERROR: fputs ("\n*** Error while reading from file\n", stderr); break; case OUT_OF_MEMORY: fputs ("\n*** Memory exhausted while reading from file, abort now...\n", stderr); break; case EOF_REACHED: puts (""); break; default: /* OK */ fputs (line, stdout); break; } if ((line)) free ((void*)line); } while (errcode == OK); if ( (fclose(fp)) ) { fprintf (stderr, "\n*** Could not close \"%s\":\n", argv[1]); perror(NULL); return 1; } else { return 0; } } } #endif /* _TEST_READ_LINE_ */ ./numdiff-5.8.1/setmode.h0000644000175000017500000000176712215353073014151 0ustar ivanoivano/* Set a file descriptor's mode to binary or to text. Copyright (C) 2001 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Paul Eggert */ #ifndef set_binary_mode bool set_binary_mode (int, bool); # if ! HAVE_SETMODE_DOS # define set_binary_mode(fd, mode) 1 # endif #endif ./numdiff-5.8.1/io.c0000444000175000017500000000672312215353073013106 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include #include #include #include"numdiff.h" #ifdef _DMALLOC_ #include /* Useful only for the debugging */ #endif #include"read_line.c" static void print_head (const char* str, size_t length) { const char* t; for (t = str; t - str < length; putchar(*t), t++); } static void print_ws (unsigned n) { while ((n--)) putchar (' '); } static void writeln (const char* line, int addemptyline) { const char *ptr; for (ptr = line; *ptr != '\0'; putchar(*ptr), ptr++); if (ptr == line || *(ptr-1) != '\n') puts (EOF_INDICATOR); if ((addemptyline)) putchar('\n'); } /* This function assumes that at least one between line1 and line2 is not empty (!NULL). */ void print_lines (const char* line1, const char* line2, unsigned long lineno1, unsigned long lineno2, int delimiter_only) { puts (LINE_SEP); if (!delimiter_only) { if (!line1) { printf (" <==\n##%-7lu ==> ", lineno2); writeln (line2, 1); } else if (!line2) { printf ("##%-7lu <== ", lineno1); writeln (line1, 0); printf (" ==>\n\n"); } else { printf ("##%-7lu <== ", lineno1); writeln (line1, 0); printf ("##%-7lu ==> ", lineno2); writeln (line2, 1); } } } /* This function assumes that at least one between field1 and field2 is not empty. */ void print_fields (const char* field1, const char* field2, size_t l1, size_t l2, unsigned long lineno1, unsigned long lineno2, unsigned long fieldno1, unsigned long fieldno2) { fieldno1++; /* The field number must start from 1, not from 0 */ fieldno2++; /* The field number must start from 1, not from 0 */ if (*field1 == '\0') { printf ("##%-7lu <==\n##%-7lu #>%-3lu ==> ", lineno1, lineno2, fieldno2); /* length(" #> ") + 3 = 7 white spaces before the arrow */ writeln (field2, 0); } else if (*field2 == '\0') { printf ("##%-7lu #>%-3lu <== ", lineno1, fieldno1); writeln (field1, 0); /* length(" #> ") + 3 = 7 white spaces before the arrow */ printf ("##%-7lu ==>\n", lineno2); } else { printf ("##%-7lu #:%-3lu <== ", lineno1, fieldno1); print_head (field1, l1); putchar ('\n'); printf ("##%-7lu #:%-3lu ==> ", lineno2, fieldno2); print_head (field2, l2); putchar ('\n'); } } void print_errors (Real abserr, Real relerr) { fputs (_("@ Absolute error = "), stdout); printno (abserr, DEF_LIM); fputs (_(", Relative error = "), stdout); printno (relerr, DEF_LIM); putchar ('\n'); } void print_separator (void) { putchar ('@'); print_ws (53); puts ("@@"); } ./numdiff-5.8.1/flags.c0000444000175000017500000001353412215353073013571 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include"numdiff.h" #include /* Constants and default values */ #define CHUNK_ALLOC 20480 static flg_array internal_table; /* `table' must be the address of a `flg_array' structure. */ static int init_flg_array (flg_array* table) { if ((table)) { table->ptr = NULL; table->size = table->len = 0; return 0; } else return -1; } int init_flags (void) { return init_flg_array (&internal_table); } /* `table' must be the address of a `flg_array' structure. */ static int print_flg_array (FILE* fp, const flg_array* table) { size_t n; unsigned short i; unsigned char byte, elem; if (!table || !table->ptr) return (fputs (_("\n"), fp) == EOF); else { int outerror = 0; for (n = 0; !outerror && n < table->len; n += 4U) { byte = table->ptr[n/4U]; for (i = 0; i < 4U; i++) { if ( (elem = (byte & 0x03 << 2*i) >> 2 * i) ) { if ( fprintf (fp, "%u", elem) < 0 ) { outerror = 1; break; } } else break; } } if (!outerror) outerror = (fputc ('\n', fp) == EOF); return outerror; } } int print_flags (FILE* fp) { return print_flg_array (fp, &internal_table); } /* array must be the address of a `flg_array' structure. */ static void addnewelem (flg_array* array, unsigned char elem) { if (!array) return; if ( !array->ptr ) { array->ptr = xcalloc (CHUNK_ALLOC, sizeof (unsigned char)); array->size = CHUNK_ALLOC; array->ptr[0] = elem; array->len = 1; #ifdef __MEMDEBUG__ fprintf (stderr, "size = %6zu, len = %6zu, string:", array->size, array->len); print_flg_array (stderr, array); #endif } else { if (array->len == 4 * array->size - 1) { unsigned char* p; array->ptr = xrealloc (array->ptr, array->size + CHUNK_ALLOC); array->size += CHUNK_ALLOC; array->ptr[array->len / 4U] |= elem << 2 * (array->len % 4U); array->len++; /* Now array->len == 4 * array->"old"size */ for (p = array->ptr + array->len / 4; p < array->ptr + array->size; *p = 0, p++); #ifdef __MEMDEBUG__ fprintf (stderr, "size = %6zu, len = %6zu, string:", array->size, array->len); print_flg_array (stderr, array); #endif } else { array->ptr[array->len / 4U] |= elem << 2 * (array->len % 4U); array->len++; #ifdef __MEMDEBUG__ fprintf (stderr, "size = %6zu, len = %6zu, string:", array->size, array->len); print_flg_array (stderr, array); #endif } } } flg_array copy_of_intflagtab (void) { return internal_table; } /* array must be the address of a `flg_array' structure. */ static void destroy_flg_array (flg_array* array) { if ((array) && (array->ptr)) { free ((void*)array->ptr); array->ptr = NULL; array->size = array->len = 0; } } void erase_flags (void) { destroy_flg_array (&internal_table); } static void notedown_sdiff_common_lines (lin, lin); static void notedown_sdiff_hunk (struct change *); /* Next line number to be printed in the two input files. */ static lin next0, next1; /* * Note down the edit-script SCRIPT in the INTERNAL_TABLE. */ void notedown_sdiff_script (struct change *script) { next0 = next1 = - files[0].prefix_lines; print_script (script, notedown_sdiff_hunk); notedown_sdiff_common_lines (files[0].valid_lines, files[1].valid_lines); #ifdef _DEBUG_FLAGSTABLE_ print_flg_array (stderr, &internal_table); #endif } /* Print lines common to both files in side-by-side format. */ static void notedown_sdiff_common_lines (lin limit0, lin limit1) { lin i0 = next0, i1 = next1; if (i0 != limit0 || i1 != limit1) { for (; i0 != limit0 && i1 != limit1; i0++, i1++) addnewelem (&internal_table, 3); for (; i1 != limit1; i1++) addnewelem (&internal_table, 2); for (; i0 != limit0; i0++) addnewelem (&internal_table, 1); } next0 = limit0; next1 = limit1; } /* Note down a hunk of an sdiff diff. This is a contiguous portion of a complete edit script, describing changes in consecutive lines. */ static void notedown_sdiff_hunk (struct change *hunk) { lin first0, last0, first1, last1; register lin i, j; /* Determine range of line numbers involved in each file. */ enum changes changes = analyze_hunk (hunk, &first0, &last0, &first1, &last1); if (!changes) return; /* Note down lines up to this change. */ notedown_sdiff_common_lines (first0, first1); /* Note down ``xxx | xxx '' lines */ if (changes == CHANGED) { for (i = first0, j = first1; i <= last0 && j <= last1; i++, j++) addnewelem (&internal_table, 3); changes = (i <= last0 ? OLD : 0) + (j <= last1 ? NEW : 0); next0 = first0 = i; next1 = first1 = j; } /* Note down `` > xxx '' lines */ if (changes & NEW) { for (j = first1; j <= last1; ++j) addnewelem (&internal_table, 2); next1 = j; } /* Note down ``xxx < '' lines */ if (changes & OLD) { for (i = first0; i <= last0; ++i) addnewelem (&internal_table, 1); next0 = i; } } ./numdiff-5.8.1/ChangeLog0000644000175000017500000007147712215353073014117 0ustar ivanoivano2013-09-15 Ivano Primi * Version 5.8.1 released. * config.h.in (VERSION): From 5.8.0 to 5.8.1. * NEWS: Added news for version 5.8.1. * Makefile.in (VERSION): From 5.8.0 to 5.8.1. 2013-08-28 Ivano Primi * Version 5.8.0 released. * BUGS: Doc fixes. * BUGS: Added description of the bug discovered by Elias Pipping and a hint on how to avoid it. 2013-08-26 Ivano Primi * INSTALL: Doc fixes. * BUGS: Added remind: specify if the operating system is either 32- or 64-bit. * NEWS: Added news for version 5.8.0. 2013-08-25 Ivano Primi * util.c: Added instruction to include linesplit.h Added declaration of the external variable def_ifs. (lines_differ): ifs and Ifs redefined as const char**. (lines_differ): IFS replaced by def_ifs. (lines_differ): for cycle to initialize f1 and let it point to the first field of s1 replaced by a call to string_spn(). (lines_differ): for cycle to initialize f2 and let it point to the first field of s2 replaced by a call to string_spn(). (lines_differ): Every couple of for cycles to move f1 to the beginning of the next field has been replaced by a call to string_cspn() and a call to string_spn(). (lines_differ): Every couple of for cycles to move f2 to the beginning of the next field has been replaced by a call to string_cspn() and a call to string_spn(). (lines_differ): for cycle to set e1 and let it point to the end of the field pointed to by f1 replaced by a call to string_cspn(). (lines_differ): for cycle to set e2 and let it point to the end of the field pointed to by f2 replaced by a call to string_cspn(). (lines_differ): The instructions f1 = e1; f2 = e2; have been removed from block of else if ((f1_is_blurred)) . (lines_differ): The instructions f1 = e1; f2 = e2; have been removed from `else' block of if ( (compare_numeric_strings (f1, pnf, f2, Pnf)) ) . (lines_differ): for cycle to move f1 from the end of a field to the beginning of the next field replaced by a call to string_spn(). (lines_differ): for cycle to move f2 from the end of a field to the beginning of the next field replaced by a call to string_spn(). 2013-08-22 Ivano Primi * thrlist.c, README: Doc fixes. * read_line.c: [_TEST_READ_LINE_]: Added instructions to include stdio.h, stdlib.h, and string.h [_TEST_READ_LINE_]: New macro constant BUFF_SIZE [_TEST_READ_LINE_]: New macro constants for error codes: OK, LINE_INTERR, EOF_REACHED, READING_ERROR, OUT_OF_MEMORY, OPEN_FAILED, WRONG_USAGE, FILE_IS_BINARY. (read_line): New variables n, ch, exception_occurred. (read_line): Cycle while ((ptr = fgets (buffer, BUFF_SIZE,pf))) { ... } replaced by do { ... } while (!exception_occurred); (do not rely anymore on function fgets() to read input lines, but use getc()). (read_line): Test if(!ptr) replaced by if ((exception_occurred)) . (read_line): Added test else if ( ch == '\0' ) . If the condition is true, *errcode is set to FILE_IS_BINARY. [_TEST_READ_LINE_] (main): New function. Doc fixes. * options.c: Added instruction to include linesplit.h (print_version): Fixed copyright string. (print_help): New help entry for options --delimiters, help message for option -s improved. (print_help): Since the short option for --dummy is not -D anymore but -U, the format strings for a couple of printf() calls have been changed. (return_ifs): function removed. (setargs): Changed initialization of optstring. (setargs): Since the short option for --dummy is not -D anymore but -U, the entry for the option "dummy" in the array long_options has been changed. (setargs): Since the short option for --dummy is not -D anymore but -U, the label of the corresponding case in switch (optch){...} is now 'U' instead of 'D'. (setargs): _SD_MASK replaced by _SU_MASK. (setargs): Long option "separator" changed to "separators". (setargs): Added entry for option "delimiters" to the array long_options. (setargs): Instead of using xstrdup(), list->nf1.currency and list->nf2.currency are now initialized by means of a call to get_separating_string(). (setargs): The memory reserved for list->ifs1 and list->ifs2 is now freed by calling delete_string_vector() instead of free(). (setargs): ssplit_former_way() is now used in place of return_ifs(). (setargs): Added if statements to print a suitable error message and return -1 in case ssplit_former_way() returns NULL (to indicate a failure). (setargs): To check for the presence of the newline character in list->ifs1 and list->ifs2 the function is_string_in_vector() is used in place of strchr(). (setargs): Before `adding' _S_MASK to list->optmask, the functions remove_duplicates_from_string_vector() and sort_string_vector() are called on list->ifs1 and list->ifs2. (setargs): Added case D to switch statement. (setargs): In case c the function get_separating_string() is now used in place of xstrdup() to set list->nf1.currency and list->nf2.currency. Doc fixes. 2013-08-18 Ivano Primi * numutil.c: Doc fixes. * numdiff.h (FILE_IS_BINARY): New macro. (argslist): Changed declaration of the fields ifs1 and ifs2. (_SD_MASK): Macro removed. (_SU_MASK): New macro. (IFS): Macro removed. Doc fixes. * new.c: Doc fixes. * ndselect.h (Argslist): Changed declaration of field ifs. (Argslist): New field osep. New macros ___SD_MASK and ___SO_MASK. Redefinition of macros ___X_MASK and ___V_MASK. Doc fixes. * ndselect.c: Added instruction to include linesplit.h. (return_ifs): function removed. (print_line): Signature and definition changed. All callers changed. (print_line): strspn() and strcspn() replaced by string_spn() and string_cspn() respectively. (print_line): The setting of the variable stop depends now on the value of the variable osep. (print_line): If osep is not NULL, it is printed to the standard output after every selected field. (scan_file): Signature and definition changed. All callers changed. (scan_file): Definition of ifs changed. (scan_file): IFS replaced by def_ifs. (scan_file): calls to print_line() changed. (print_selversion): Fixed copyright string. (print_selhelp): New help entries for options -D and -O, help message for option -S improved. (set_args): Changed initialization of optstring. (set_args): Added entries for options "delimiters" and "output-separator" to the array long_options. (set_args): Long option "separator" changed to "separators". (set_args): Added initialization code for list->osep. (set_args): The memory reserved for list.ifs is now freed by calling delete_string_vector() instead of free(), and after list->ifs is reinitialized to NULL. (set_args): ssplit_former_way() is now used in place of return_ifs(). (set_args): To check for the presence of the newline character in list->ifs the function is_string_in_vector() is used in place of strchr(). (set_args): Before `adding' ___SS_MASK to list->optmask, the functions remove_duplicates_from_string_vector() and sort_string_vector() are called on list->ifs. (set_args): Added cases D and O to switch statement. Added definition of static variable def_ifs. (clean_up_memory): New function. (main): def_ifs is properly initialized by means of a call to ssplit(). (main): clean_up_memory() is registered through atexit() to be called at process termination. (main): If either the call to atexit() or the initialization of def_ifs fails, the program exits after printing a suitable error message. (main): Changed call to scan_file(). Doc fixes. * Makefile.in (VERSION): From 5.6.1 to 5.8.0. (OBJECTS): Added ./linesplit.o. (OBJECTSONE): Added ./linesplit.o. (OBJECTSTWO): Added ./linesplit.o. (SOURCESONE): Added $(srcdir)/linesplit.c. (SOURCESTWO): Added $(srcdir)/linesplit.c. (copy): Added commands to copy $(srcdir)/linesplit.c and $(srcdir)/linesplit.h. Doc fixes. * main.c: Added instruction to include linesplit.h. Added definition of the external variable def_ifs. (main): def_ifs is properly initialized by calling the function ssplit(), added if statement to check for the successful initialization. (main): The memory reserved for list.ifs1 and list.ifs2 is now freed by calling delete_string_vector() instead of free(). (main): Before exiting the program, the function delete_string_vector() is called to free the memory previously reserved for def_ifs. (main): variable test is now initialized to 0 instead of -1. (main): If the call to open_files() fails, the memory is cleaned now before exiting the program. (main): If compare_files() returns a negative value, the program now exits after printing a suitable error message. (main): Now, if either rewind_files() or set_file_pointers() fails, the memory is cleaned and all files are properly closed before exiting the program. Doc fixes. * io.c, INSTALL: Doc fixes. * inout.c: Added instruction to include linesplit.h. (find_and_hash_each_line): Signature and definition changed, all callers changed. (find_and_hash_each_line): for cycle to initialize p and let it point to the first field replaced by a call to string_spn(). (find_and_hash_each_line): for cycle to initialize eof replaced by a call to string_cspn(). (find_and_hash_each_line): for cycle to move p to the beginning of the next field replaced by a call to string_spn(). Added declaration of the external variable def_ifs. (read_files): ifs1 and ifs2 redefined as char**. (read_files): IFS replaced by def_ifs. (read_files): call to find_and_hash_each_line() changed. Doc fixes. * flags.c, errors.c: Doc fixes. * configure.ac: AC_INIT(...): From version 5.6 to 5.8. Doc fixes. * config.h.in (VERSION): From 5.6.1 to 5.8.0. Doc fixes. * cmpfns.c: Added instruction to include linesplit.h. (cmp_lines): Signature and definition changed. All callers changed. (cmp_lines): New local variables end_field1, end_field2. (cmp_lines): strspn() and strcspn() replaced by string_spn() and string_cspn(), respectively. (cmp_lines): _SD_MASK replaced by _SU_MASK. Added declaration of the external variable def_ifs. (cmp_files): ifs1 and ifs2 redefined as char**. (cmp_files): IFS replaced by def_ifs. (cmp_files): Changed calls to cmp_lines(). (cmp_files): The if condition catching any error occurred while comparing corresponding lines has been extended: the error FILE_IS_BINARY is also caught now. (cmp_files): A suitable error message is printed if one of the two compared files is binary. (cmp_files): Message for reading error fixed. (cmp_files): Format of error message fixed. Doc fixes. * AUTHORS, arith.c: Doc fixes. * analyze.c (diff_2_files): The instruction which sets the value of the variable changes has been modified to ensure that the returned value is either 0 or 1. 2013-07-11 Ivano Primi * linesplit.h, linesplit.c: New file. 2012-02-22 Ivano Primi * Version 5.6.1 released. * config.h.in (VERSION): From 5.6.0 to 5.6.1. * Makefile.in: VERSION changed to 5.6.1. * NEWS: Added news for version 5.6.1. * Makefile.in (installdirs): Added $(MKDIR) $(DESTDIR)$(MANDIR). 2012-02-12 Ivano Primi * Version 5.6.0 released. * side.c (display_half_line): label control_char replaced by control_character. 2012-02-05 Ivano Primi * NEWS: Dox fixes. * main.c (compare_files): Newline not any more printed, since it makes the report unclear. * inout.c (_DEBUG_HASHING_): New Macro. _DEBUG_ has been replaced by _DEBUG_HASHING_. (find_and_hash_each_line): Fixed improper handling of a file whose last line does not have a trailing newline (bucket[-1] no longer used). (find_and_hash_each_line): Bug fix imported from GNU Diffutils 3.0. (find_and_hash_each_line)[_DEBUG_HASHING_]: Added code for debug. (find_identical_ends): Bug fix imported from GNU Diffutils 3.0. * flags.c: (notedown_sdiff_script)[_DEBUG_FLAGSTABLE_]: New debug instruction. * cmpfns.c (cmp_files): Fixed improper handling of files whose last line does not have a trailing newline in case filter is on. * numdiff.h (_DEBUG_HASHING_): New Macro. _DEBUG_ has been replaced by _DEBUG_HASHING_. * options.c (print_help): two help entries fixed. 2012-01-05 Ivano Primi * ndselect.c (print_selhelp): Several fixes to help entries. * options.c (print_help): Several fixes to help entries. * cmpfns.c (cmp_lines): New constant fieldno_upper_limit, set to 8*FIELDMASK_SIZE. (cmp_lines): Constant value 8*FIELDMASK_SIZE replaced everywhere by fieldno_upper_limit. 2012-01-03 Ivano Primi * NEWS: Doc fixes. * ndselect.c (print_line): Signature changed. All callers changed. (print_line): Added if-else statement based on the value of the variable omit_if_empty. (scan_file): New variable omit_empty_lines, added initialization code. (print_selhelp): New help entry for option `-x', help message improved. (set_args): Changed initialization of optstring. (set_args): Added entry for option "omit-empty-lines" to the array long_options. (set_args): Added case 'x' to switch statement. * ndselect.h (___X_MASK): New macro. (___V_MASK): The value of this macro has been changed. 2012-01-02 Ivano Primi * Makefile.in (MANFILETWO): changed description of the manpage. * NEWS: Doc fixes. * options.c (print_help): New help entry for option -F, other help messages improved. (setargs): Changed initialization of optstring. (setargs): Added entry for option "formula" to the array long_options. (setargs): Added case 'F' to switch statement. (setargs): Removed initial if-else if-else statement from case 'r', replaced by a single call to thrlist_add. (setargs): Parentheses have been written around operator &. * numdiff.h: Doc fixes. * ndselect.h (Argslist): New fields first_field, last_field, increment, and ifs. (___SF_MASK ___SL_MASK ___SI_MASK ___SS_MASK): New macros. (___V_MASK): The value of this macro has been changed. Doc fixes. * ndselect.c (return_ifs): New function, copied from options.c. (we_can_go_on): New function. (print_line): New function. (scan_file): New variable ifs, then added initialization code for ifs. (scan_file): call to fputs replaced by call to print_line (done twice). (print_selhelp): New help entries for options -F, -L, -I and -S, other help messages improved. (set_args): Changed initialization of optstring. (set_args): Added entries for "first-field", "last-field", "increment" and "separator" options to the array long_options. (set_args): Added initialization code for list->first_field, list->last_field, list->increment and list->ifs. (set_args): Added cases F, L, I and S to switch statement. Doc fixes. 2011-12-31 Ivano Primi * util.c (lines_differ): New constant fieldno_upper_limit, set to 8*FIELDMASK_SIZE. (lines_differ): 8*FIELDMASK_SIZE replaced by fieldno_upper_limit everywhere. (lines_differ): Error message "Line \"%s\"\ncontains too many fields!\n" replaced by a clearer explanation, which is sent to stderr through fprintf. * thrlist.c (defaults): Added field CURRENCY. (thrlist_new): list->beg1, list->beg2, and list->end1, list->end2 are initialized now with 0 and FIELDNO_MAX - 1 respectively. (thrlist_new): list->double_range_spec is set to zero. (set_interval): *b and *e are set now to beg-1 and end-1 respectively. (set_intervals): Signature has been changed. All callers changed. (set_intervals): Added code to set the variable pointed to by dbl_rng_spec. (thrlist_add): New variable dbl_rng_spec. (thrlist_add): beg1, beg2, and end1, end2 are initialized now with 0 and FIELDNO_MAX - 1 respectively. (thrlist_add): pnode->double_range_spec set to dbl_rng_spec. (thrlist_cmp): The value returned by this function depends now also on the value of pnode->double_range_spec. Doc fixes. * options.c (print_version): Copyright statement updated. (print_help): Help strings have been updated or improved. New help entries for options `-c' and `-B'. Added instruction to display the default value of the currency name. (VALID_NUMFMT INVALID_NUMFMT INVALID_CURRENCY): New macros. (valid_numfmt): Name changed to is_numfmt_valid. All callers changed. (valid_numfmt): New variable ptr. (valid_numfmt): Macros VALID_NUMFMT, INVALID_NUMFMT and INVALID_CURRENCY are used in the 'return' statements in place of hardcoded integer values. (valid_numfmt): Added code to check the validity of the string pointed to by pnf->currency. (setargs): New constant mask_size, defined as FIELDMASK_SIZE*8. (setargs): modified string pointed to by optstring. (setargs): Added entries for "binary" and "currency" options to the array long_options. (setargs): New variables binary, rv and file_id. (setargs): Removed variable defaults. (setargs): Added initialization of variable binary. (setargs): Added initialization of list->nf*.currency. (setargs): Added cases 'B' and 'c' to switch statement. (setargs): FIELDMASK_SIZE*8 replaced by mask_size everywhere. (setargs)[USE_GMP]: Removed call to delR(), removed directive (done twice). (setargs): thrlist_add is used in place of str2R to add new elements to list->maxabserr and list->maxrelerr. Error handling consequently updated. (setargs): tests "if (!valid_numfmt(&list->nf*) )" replaced by "if ( (rv = is_numfmt_valid(&list->nf*)) == INVALID_NUMFMT )" (setargs): Added code to handle the cases when is_numfmt_valid returns INVALID_CURRENCY. Doc fixes. * numutil.c (anum): New variable length, used to store the length of the string pnf->currency. Added code to skip the currency name, if specified. (snum): New variable length, used to store the length of the string pnf->currency. Added code to skip the currency name, if specified. Doc fixes. * numdiff.h (currency): New variable. (maxabserr maxrelerr): Variable type has been changed. (CURRENCY): New macro. (binary): New variable. Doc fixes. * new.c (bc_a2num): New variable length, used to store the length of the string pnf->currency. Added code to skip the currency name, if specified. Doc fixes. * ndselect.c (print_selversion): Copyright statement updated. Doc fixes. * Makefile.in: VERSION set to 5.6.0. (mandir MANDIR HELP2MAN MANFILE MANFILETWO): New variables. (OBJECTSTWO): Added ./getopt1.o. (SOURCESTWO): Added $(srcdir)/getopt1.c. (man $(MANFILE) $(MANFILETWO)): New targets for creation of manpages. (install): Added installation of manpages. (uninstall): Added removal of files $(PACKAGE).1 and $(PACKAGETWO).1, i.e. removal of numdiff and ndselect manpages. (maintainer-clean): Added cleaning instructions for $(MANFILE) and $(MANFILETWO). (copy): Added instructions to copy $(MANFILE) and (MANFILETWO) from docs directory to tarball directory. * main.c (init_mpa_support): list->maxabserr and list->maxrelerr are now initialized through a call to thrlist_new(), instead of using initR(). (dismiss_mpa_support): list->maxabserr and list->maxrelerr are now disposed through a call to thrlist_dispose(), instead of using delR(). (main): variable defaults removed. Doc fixes. * configure.ac: AC_INIT(...): From version 5.2 to 5.6. * NEWS: Added news for version 5.6.0. 2011-12-30 Ivano Primi * README, read_line.c, ndselect.h, io.c, INSTALL: Doc fixes. * inout.c (find_and_hash_each_line): New constant fieldno_upper_limit, set to FIELDMASK_SIZE*8. (find_and_hash_each_line): Added test "fieldno < fieldno_upper_limit" to for cycle. (find_and_hash_each_line): Added error handling in case fieldno >= fieldno_upper_limit. * flags.c, errors.c: Doc fixes. * configure.ac: AC_CHECK_LIB(gmp, __gmpz_init): Do not search for the GMP library if its use has been turned off through --disable-gmp or --enable-gmp=no. AC_CHECK_LIB(intl, setlocale): If the support for NLS is on, search for the function setlocale in libintl (this fixes building bug under Cygwin). Doc fixes. * config.h.in: VERSION changed to 5.6.0. Doc fixes. * cmpfns.c (cmp_fields): Signature changed. All callers changed. (cmp_fields): Calls to cmp replaced by calls to thrlist_cmp. (cmp_lines): Error message "@ Line %lu in file \"%s\" contains too many fields!\n" replaced by a clearer message. (cmp_files): Error message "\n*** End of file \"%s\" reached while trying to read line %lu.\n" replaced by clearer message. Doc fixes. * AUTHORS, arith.c: Doc fixes. 2011-10-30 Ivano Primi * Makefile.in (OBJECTS OBJECTSONE): Added ./thrlist.o. (SOURCESONE): Added source $(srcdir)/thrlist.c. (copy): Added instruction to copy thrlist.c from source directory to tarball directory. * numdiff.h (THRLIST_OK THRLIST_INVALID_FORMAT THRLIST_INVALID_RANGES): New macros. (__thrlist_node): New struct. (thrlist_node): Alias for __thrlist_node. (thrlist): Alias for thrlist_node*. (thrlist_new thrlist_add thrlist_cmp thrlist_dispose): Added declarations. * thrlist.c: New file. 2011-10-01 Ivano Primi * side.c (display_half_line): New function. (print_1overview_line): New function. * options.c (print_help): New help entry for option -O. (setargs): modified string pointed to by optstring. (setargs): Added entry for "overview" option to the array long_options. (setargs): Added case O to switch statement. (setargs): Added code to initialize list->output_mode to OUTMODE_OVERVIEW. * numdiff.h (_SO_MASK): New macro for option -O. (_SS_MASK _SI_MASK _SH_MASK _M_MASK _V_MASK): The values of these macros have been changed. (OUTMODE_OVERVIEW): New macro. (print_1overview_line): Added declaration. Doc fixes. * Makefile.in: VERSION changed to 5.3.0. * config.h.in: VERSION set to 5.3.0. * cmpfns.c (cmp_files): Addition of code for the implementation of the overview mode, i.e. added calls to the function print_1overview_line. In case the compared files are equal, print_1overview_line is called only if suppress_common_lines is false (0). 2010-01-24 Ivano Primi Version 5.2.1 released. 2010-01-24 Ivano Primi * Makefile.in: VERSION changed to 5.2.1. * config.h.in (VERSION): From 5.2.0 to 5.2.1. * NEWS: Added news for version 5.2.1. * system.h: [!ENABLE_NLS] (ngettext): Macro definition. 2010-01-07 Ivano Primi Version 5.2.0 released. 2010-01-07 Ivano Primi * util.c: Doc fixes. * util.c: New file. * side.c: Doc fixes. * side.c: New file. * inout.c: Doc fixes. * inout.c: New file. * analyze.c: Doc fixes. * analyze.c: New file. * number.c: Doc fixes. * options.c: (print_version) [!USE_GMP]: Message string fixed. (print_help): Message string fixed. 2010-01-06 Ivano Primi * NEWS, INSTALL: Doc fixes. 2010-01-05 Ivano Primi * ndselect.c (print_selversion): Fixed Copyright string. * read_line.c: Doc fixes. * options.c: Doc fixes. (print_version): Fixed Copyright string. * numutil.c, numdiff.h, number.c: Doc fixes. * number.c: New file. * new.c, ndselect.h: Doc fixes. * ndselect.h: New file. * ndselect.c, main.c, io.c, flags.c: Doc fixes. * flags.c: New file. * errors.c, configure.ac, config.h.in, cmpfns.c, arith.c, README: Doc fixes. * README: New file. * Makefile.in, INSTALL: Doc fixes. * INSTALL, BUGS: New file. * AUTHORS: Doc fixes. * AUTHORS: New file. 2010-01-03 Ivano Primi * ndselect.c: [USE_GMP]: Removed zalloc. string.h and numutil.c are not anymore included. Removed declaration of read_line. Include read_line.c. * Makefile.in (SOURCESONE): Added $(srcdir)/read_line.c. (OBJECTSTWO): Removed ./arith.o and ./io.o. (SOURCESTWO): Removed $(srcdir)/arith.c and $(srcdir)/io.c. Added $(srcdir)/read_line.c. (copy): Added instruction to copy read_line.c from source directory to tarball directory. * io.c: Doc-fixes: Removed unuseful comments. (read_line): Moved to file read_line.c. Added instruction to include read_line.c. * read_line.c, io.c: New file. * arith.c: [USE_GMP] (str2C): Replaced isspace by is_space. Replaced '+' by POS_SIGN and '-' by NEG_SIGN. [!USE_GMP] (str2C): Replaced isspace by is_space. Replaced '+' by POS_SIGN and '-' by NEG_SIGN. * ndselect.c (setargs): Replaced isspace by is_space. * numdiff.h (is_digit, is_punct, is_print): Macro re-definition. (is_space): Macro definition. The macro isspace has been replaced everywhere by is_space. * system.h: New file. * numutil.c (anum, snum): Replaced toupper by TOLOWER. (anum, acxnum, snum, scxnum): Replaced isspace by is_space. * cmpfns.c (strNcasecmp): Replaced tolower by TOLOWER. * new.c (bc_a2num): Replaced toupper by TOLOWER. Replaced isspace by is_space. * new.c: New file. 2009-12-30 Ivano Primi * NEWS: Added news for version 5.2.0. * NEWS: New file. * configure.ac: New option --enable-gmp / --disable-gmp. Usage of GNU MP is enabled by default. * arith.c: HAVE_LIBGMP has been replaced by USE_GMP. (Epsilon, MEpsilon): Removed. (mpa_define_epsilon, mpa_undef_epsilon): Removed. [USE_GMP] (init_mpa): Signature and definition (argument iscale is used in place of MAX_ISCALE) changed. All callers in other files changed. [!USE_GMP] (init_mpa): Signature changed. All callers in other files changed. (copyR, copyC): Signature and definition changed. All callers in other files changed. [USE_GMP] (str2R, str2C): Calls to mpf_a2num() changed. (cmp, is0): Signature and definition changed. All callers in other files changed. [USE_GMP] (fprintno): Test (u == Inf) has been correctly rewritten. [USE_GMP] (end_mpa): Variable Inf is also cleared now. * main.c (init_mpa_support): Call to init_mpa() changed. (print_statistics) [USE_GMP]: Added code to initialize qm_abserr and qm_relerr. (print_statistics): Removed commented out old code. (print_statistics): Changed calls to copyR(). (main): Removed calls to mpa_define_epsilon() and mpa_undef_epsilon(). * ndselect.c: [USE_GMP] (zalloc): New function. [USE_GMP]: Include numutil.c. * options.c: (print_version) [USE_GMP]: Added statement on the way the program has been built. (print_version) [!USE_GMP]: Modified statement on the way the program has been built. (set_args) [!USE_GMP]: Removed code to avoid memory leak (not needed in this case and even dangerous). * errors.c (out_of_memory): Added missing argument in the call to fprintf(). * numutil.c: HAVE_LIBGMP has been replaced by USE_GMP. [USE_GMP](mpf_a2num): The case when the number returned by snum() is zero is now correctly handled. * cmpfns.c (cmp, is0, copyR): Calls changed. * numdiff.h (USE_GMP): New Macro. HAVE_LIBGMP has been replaced by USE_GMP. (MAX_EPXN, MIN_EXPN): They are now constant values of 'long int' type. (cmp, is0, init_mpa, copyR, copyC): Redefinition of signature. All callers changed. (mpa_define_epsilon, mpa_undef_epsilon): Removed. * errors.c, options.c, ndselect.c, main.c, cmpfns.c: New file. 2009-12-29 Ivano Primi * configure.ac: AC_INIT(...): From version 5.0 to 5.2. * config.h.in (HAVE_LIBGMP): New Macro. (HAVE_LOCALECONV): New Macro. (VERSION): From 5.0.0 to 5.2.0. * Makefile.in: VERSION changed to 5.2.0. * config.h.in: New file. * numutil.c: [HAVE_LIBGMP] (mpf_a2num): Bug fixes after running a text program. * numutil.c: [HAVE_LIBGMP] (mpf_a2num): Removed memory leak + Doc fixes. * arith.c: [HAVE_LIBGMP] (fprintno): Memory leak removed 2009-12-28 Ivano Primi * numutil.c: [HAVE_LOCALECONV && HAVE_LIBGMP]: Include locale.h. [HAVE_LIBGMP] (mpf_a2num): New function. * numutil.c: New file. * configure.ac: AC_CHECK_FUNCS(...): Check for localeconv added. * numdiff.h (CHAR_ONE CHAR_NINE): Macro definition. [HAVE_LIBGMP] (mpf_a2num): Declaration. * arith.c: [HAVE_LIBGMP] (round_far_from_zero fprintno): New functions. [HAVE_LIBGMP] (printno, debug_printno): Transformed into wrappers of the function fprintno. [HAVE_LIBGMP] (str2R): Call to mpf_a2num changed in view of the actual definition of this function. * arith.c: [HAVE_LIBGMP] (Zero, Ten, Inf, Epsilon, MEpsilon): Definition of variables. [HAVE_LIBGMP] (init_mpa, mpa_define_epsilon, initR, initC, copyR, copyC) (str2R, str2C, add, square, divide, divide_by_int, square_root) (Cabs, Csub, cmp, is0, smart_cmp, printno, debug_printno) (delR, delC, mpa_undef_epsilon, end_mpa): New functions. [!HAVE_LIBGMP] (copyR, copyC): Re-definition according to the new signature. * numdiff.h (copyR copyC): Redefinition of signature. All callers changed. 2009-12-13 Ivano Primi * Makefile.in: Added createdirs, copy and tarball targets. Target dist rewritten. * Makefile.in, arith.c: New file. 2009-12-12 Ivano Primi * numdiff.h: [HAVE_LIBGMP] (Real Complex): Definition of types. * numdiff.h: New file. * configure.ac: AC_CHECK_LIB(gmp, __gmpz_init): Check for GNUMP added. * configure.ac: New file. 2009-11-31 Ivano Primi Version 5.0.0 released. ./numdiff-5.8.1/RCS/0000777000175000017500000000000012215353072012757 5ustar ivanoivano./numdiff-5.8.1/m4/0000777000175000017500000000000012215353073012651 5ustar ivanoivano./numdiff-5.8.1/m4/st_mtim.m40000644000175000017500000000341712215353073014570 0ustar ivanoivano# Copyright 1997, 2000, 2001 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 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; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. #serial 5 dnl From Paul Eggert. # Define ST_MTIM_NSEC to be the nanoseconds member of struct stat's st_mtim, # if it exists. AC_DEFUN([AC_STRUCT_ST_MTIM_NSEC], [AC_CACHE_CHECK([for nanoseconds member of struct stat.st_mtim], ac_cv_struct_st_mtim_nsec, [ac_save_CPPFLAGS="$CPPFLAGS" ac_cv_struct_st_mtim_nsec=no # tv_nsec -- the usual case # _tv_nsec -- Solaris 2.6, if # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 # && !defined __EXTENSIONS__) # st__tim.tv_nsec -- UnixWare 2.1.2 for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" AC_TRY_COMPILE([#include #include ], [struct stat s; s.st_mtim.ST_MTIM_NSEC;], [ac_cv_struct_st_mtim_nsec=$ac_val; break]) done CPPFLAGS="$ac_save_CPPFLAGS"]) if test $ac_cv_struct_st_mtim_nsec != no; then AC_DEFINE_UNQUOTED(ST_MTIM_NSEC, $ac_cv_struct_st_mtim_nsec, [Define to be the nanoseconds member of struct stat's st_mtim, if it exists.]) fi ] ) ./numdiff-5.8.1/m4/setmode.m40000644000175000017500000000246612215353073014557 0ustar ivanoivano# Check for setmode, DOS style. # Copyright (C) 2001, 2002 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 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; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AC_DEFUN([AC_FUNC_SETMODE_DOS], [AC_CHECK_HEADERS(fcntl.h unistd.h) AC_CACHE_CHECK([for DOS-style setmode], [ac_cv_func_setmode_dos], [AC_TRY_LINK( [#include #if HAVE_FCNTL_H # include #endif #if HAVE_UNISTD_H # include #endif], [int ret = setmode && setmode (1, O_BINARY);], [ac_cv_func_setmode_dos=yes], [ac_cv_func_setmode_dos=no])]) if test $ac_cv_func_setmode_dos = yes; then AC_DEFINE(HAVE_SETMODE_DOS, 1, [Define to 1 if you have the DOS-style `setmode' function.]) fi]) ./numdiff-5.8.1/cmpbuf.h0000644000175000017500000000161312215353073013753 0ustar ivanoivano/* Buffer primitives for comparison operations. Copyright (C) 2002 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ size_t block_read (int, char *, size_t); size_t buffer_lcm (size_t, size_t, size_t); ./numdiff-5.8.1/error.c0000644000175000017500000001757212215353073013636 0ustar ivanoivano/* Error handler for noninteractive utilities Copyright (C) 1990-1998, 2000-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by David MacKenzie . */ #if !_LIBC # include #endif #include "error.h" #include #include #include #include #if !_LIBC && ENABLE_NLS # include "gettext.h" #endif #ifdef _LIBC # include # include # include # include # define mbsrtowcs __mbsrtowcs #endif #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifndef _ # define _(String) String #endif /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ void (*error_print_progname) (void); /* This variable is incremented each time `error' is called. */ unsigned int error_message_count; #ifdef _LIBC /* In the GNU C library, there is a predefined variable for this. */ # define program_name program_invocation_name # include # include # include /* In GNU libc we want do not want to use the common name `error' directly. Instead make it a weak alias. */ extern void __error (int status, int errnum, const char *message, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern void __error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) __attribute__ ((__format__ (__printf__, 5, 6)));; # define error __error # define error_at_line __error_at_line # include # define fflush(s) INTUSE(_IO_fflush) (s) # undef putc # define putc(c, fp) INTUSE(_IO_putc) (c, fp) # include #else /* not _LIBC */ # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P # ifndef HAVE_DECL_STRERROR_R "this configure-time declaration test was not run" # endif char *strerror_r (); # endif /* The calling program should define program_name and set it to the name of the executing program. */ extern char *program_name; # if HAVE_STRERROR_R || defined strerror_r # define __strerror_r strerror_r # endif /* HAVE_STRERROR_R || defined strerror_r */ #endif /* not _LIBC */ static void print_errno_message (int errnum) { char const *s; #if defined HAVE_STRERROR_R || _LIBC char errbuf[1024]; # if STRERROR_R_CHAR_P || _LIBC s = __strerror_r (errnum, errbuf, sizeof errbuf); # else if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) s = errbuf; else s = 0; # endif #else s = strerror (errnum); #endif #if !_LIBC if (! s) s = _("Unknown system error"); #endif #if _LIBC __fxprintf (NULL, ": %s", s); #else fprintf (stderr, ": %s", s); #endif } static void error_tail (int status, int errnum, const char *message, va_list args) { #if _LIBC if (_IO_fwide (stderr, 0) > 0) { # define ALLOCA_LIMIT 2000 size_t len = strlen (message) + 1; wchar_t *wmessage = NULL; mbstate_t st; size_t res; const char *tmp; bool use_malloc = false; while (1) { if (__libc_use_alloca (len * sizeof (wchar_t))) wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); else { if (!use_malloc) wmessage = NULL; wchar_t *p = (wchar_t *) realloc (wmessage, len * sizeof (wchar_t)); if (p == NULL) { free (wmessage); fputws_unlocked (L"out of memory\n", stderr); return; } wmessage = p; use_malloc = true; } memset (&st, '\0', sizeof (st)); tmp = message; res = mbsrtowcs (wmessage, &tmp, len, &st); if (res != len) break; if (__builtin_expect (len >= SIZE_MAX / 2, 0)) { /* This really should not happen if everything is fine. */ res = (size_t) -1; break; } len *= 2; } if (res == (size_t) -1) { /* The string cannot be converted. */ if (use_malloc) { free (wmessage); use_malloc = false; } wmessage = (wchar_t *) L"???"; } __vfwprintf (stderr, wmessage, args); if (use_malloc) free (wmessage); } else #endif vfprintf (stderr, message, args); va_end (args); ++error_message_count; if (errnum) print_errno_message (errnum); #if _LIBC __fxprintf (NULL, "\n"); #else putc ('\n', stderr); #endif fflush (stderr); if (status) exit (status); } /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. If ERRNUM is nonzero, print its corresponding system error message. Exit with status STATUS if it is nonzero. */ void error (int status, int errnum, const char *message, ...) { va_list args; #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif fflush (stdout); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s: ", program_name); #else fprintf (stderr, "%s: ", program_name); #endif } va_start (args, message); error_tail (status, errnum, message, args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ int error_one_per_line; void error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) { va_list args; if (error_one_per_line) { static const char *old_file_name; static unsigned int old_line_number; if (old_line_number == line_number && (file_name == old_file_name || strcmp (old_file_name, file_name) == 0)) /* Simply return and print nothing. */ return; old_file_name = file_name; old_line_number = line_number; } #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif fflush (stdout); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s:", program_name); #else fprintf (stderr, "%s:", program_name); #endif } #if _LIBC __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ", file_name, line_number); #else fprintf (stderr, file_name != NULL ? "%s:%d: " : " ", file_name, line_number); #endif va_start (args, message); error_tail (status, errnum, message, args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } #ifdef _LIBC /* Make the weak alias. */ # undef error # undef error_at_line weak_alias (__error, error) weak_alias (__error_at_line, error_at_line) #endif ./numdiff-5.8.1/configure.ac0000444000175000017500000001730312215353073014615 0ustar ivanoivanodnl dnl Autoconf configuration script for Numdiff - version 5.x . dnl dnl Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi . dnl dnl Permission is granted to use, copy, modify, and redistribute this file as dnl needed. dnl dnl Process this file with autoconf to produce a configure script. dnl dnl -------------------------------------- dnl Minimal required version of dnl autoconf dnl -------------------------------------- dnl AC_PREREQ(2.62) dnl -------------------------------------- dnl Initialization dnl -------------------------------------- dnl AC_INIT(Numdiff, 5.8, , numdiff) AC_CONFIG_SRCDIR(numdiff.h) AC_CONFIG_HEADER(config.h) dnl -------------------------------------- dnl My own flags dnl -------------------------------------- dnl if test "x$DBGFLAGS" = "x"; then DBGFLAGS="-g" fi if test "x$OPTFLAGS" = "x"; then OPTFLAGS="-O" fi dnl -------------------------------------- dnl Getting environment variables dnl -------------------------------------- dnl CPPFLAGS="${CPPFLAGS:=}" CFLAGS="${CFLAGS:=}" LDFLAGS="${LDFLAGS:=}" LIBS="${LIBS:=}" CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H" dnl -------------------------------------- dnl Check whether to add /usr/local or not dnl (this is somewhat a religious problem) dnl -------------------------------------- dnl if test "`$CPP -v < /dev/null 2>&1 | grep '/usr/local/include' 2>&1`" = ""; then CPPFLAGS="$CPPFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" fi dnl -------------------------------------- dnl If possible, enable dnl extensions to C or Posix on hosts dnl that normally disable the extensions, dnl typically due to standards-conformance dnl namespace issues. This should be dnl called before any macros that run the dnl C compiler. dnl -------------------------------------- AC_USE_SYSTEM_EXTENSIONS dnl -------------------------------------- dnl Process options dnl -------------------------------------- dnl AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]], , enable_debug=no) AC_ARG_ENABLE(optimization, [ --enable-optimization turn on basic optimization [default=no]], , enable_optimization=no) AC_ARG_ENABLE(nls, [ --enable-nls turn on Natural Language Support [default=yes]], , enable_nls=yes) AC_ARG_ENABLE(gmp, [ --enable-gmp turn on use of GNU MP [default=yes]], , enable_gmp=yes) dnl -------------------------------------- dnl Checks for programs dnl -------------------------------------- dnl AC_PROG_CC AC_PROG_CC_C_O AC_PROG_CPP dnl AC_PROG_INSTALL AC_PATH_PROG(FIND,find) dnl * Debian uses ginstall-info instead of install-info dnl * to install info files. AC_PATH_PROGS(INSTINFO,install-info ginstall-info) dnl -------------------------------------- dnl Checks for header files dnl -------------------------------------- dnl AC_HEADER_STDC if test $ac_cv_header_stdc = yes; then AC_MSG_RESULT(Ok! I have just found them.) else AC_MSG_ERROR(Cannot find ANSI C header files!) fi AC_HEADER_STDBOOL AC_CHECK_HEADERS(fcntl.h locale.h stddef.h \ stdlib.h string.h sys/file.h time.h unistd.h wchar.h wctype.h) AC_HEADER_DIRENT AC_HEADER_STAT AC_HEADER_SYS_WAIT dnl -------------------------------------- dnl Checks for typedefs, structures, and dnl compiler characteristics dnl -------------------------------------- dnl dnl AC__GNU_SOURCE dnl AC_DEFINE([__EXTENSIONS__], 1, [Enable Solaris extensions.]) AC_SYS_LARGEFILE AC_C_CONST AC_C_INLINE AC_C_VARARRAYS AC_TYPE_SIZE_T AC_TYPE_PID_T AC_CHECK_TYPE(ptrdiff_t, int) AC_CHECK_TYPE(ssize_t, int) AC_STRUCT_ST_BLKSIZE AC_STRUCT_ST_RDEV AC_STRUCT_ST_MTIM_NSEC dnl AC_TYPE_MODE_T dnl AC_STRUCT_ST_BLOCKS dnl -------------------------------------- dnl Checks for libraries dnl -------------------------------------- if test "x$enable_gmp" = "xyes"; then AC_CHECK_LIB(gmp, __gmpz_init) fi dnl Required to make building under Cygwin possible if test "x$enable_nls" = "xyes"; then AC_CHECK_LIB(intl, setlocale) fi dnl -------------------------------------- dnl Checks for library functions dnl -------------------------------------- dnl dnl HAVE_SNPRINTF=0 dnl AC_CHECK_FUNC(snprintf, HAVE_SNPRINTF=1) dnl if test $HAVE_SNPRINTF = 0; then dnl AC_MSG_ERROR(Declaration of snprintf() not present!) dnl else dnl AC_MSG_RESULT(Ok! snprintf() is declared.) dnl fi HAVE_VSPRINTF=0 AC_CHECK_FUNC(vsprintf, HAVE_VSPRINTF=1) if test $HAVE_VSPRINTF = 0; then AC_MSG_ERROR(Declaration of vsprintf() not present!) else AC_MSG_RESULT(Ok! vsprintf() is declared.) fi HAVE_MEMSET=0 AC_CHECK_FUNC(memset, HAVE_MEMSET=1) if test $HAVE_MEMSET = 0; then AC_MSG_ERROR(Declaration of memset() not present!) else AC_MSG_RESULT(Ok! memset() is declared.) fi HAVE_MEMCHR=0 AC_CHECK_FUNC(memchr, HAVE_MEMCHR=1) if test $HAVE_MEMCHR = 0; then AC_MSG_ERROR(Declaration of memchr() not present!) else AC_MSG_RESULT(Ok! memchr() is declared.) fi HAVE_STRERROR=0 AC_CHECK_FUNC(strerror, HAVE_STRERROR=1) if test $HAVE_STRERROR = 0; then AC_MSG_ERROR(Declaration of strerror() not present!) else AC_MSG_RESULT(Ok! strerror() is declared.) fi HAVE_STRSPN=0 AC_CHECK_FUNC(strspn, HAVE_STRSPN=1) if test $HAVE_STRSPN = 0; then AC_MSG_ERROR(Declaration of strspn() not present!) else AC_MSG_RESULT(Ok! strspn() is declared.) fi HAVE_STRCSPN=0 AC_CHECK_FUNC(strcspn, HAVE_STRCSPN=1) if test $HAVE_STRCSPN = 0; then AC_MSG_ERROR(Declaration of strcspn() not present!) else AC_MSG_RESULT(Ok! strcspn() is declared.) fi AC_FUNC_STRERROR_R AC_FUNC_FORK AC_CHECK_FUNCS(localeconv gettimeofday isascii setlocale strchr strftime waitpid) # setmode DOS ? AC_FUNC_SETMODE_DOS # Check for clock_gettime and its library. Solaris puts it in -lrt or # -lposix4, but we don't want to link that library unless we have to. diff_saved_libs=$LIBS AC_SEARCH_LIBS(clock_gettime, [rt posix4]) case $ac_cv_search_clock_gettime in no | 'none required') LIB_CLOCK_GETTIME=;; *) LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime;; esac AC_SUBST([LIB_CLOCK_GETTIME]) AC_CHECK_FUNCS(clock_gettime) LIBS=$diff_saved_libs dnl -------------------------------------- dnl Check for functions declarations dnl -------------------------------------- dnl AC_DEFINE([USE_UNLOCKED_IO], [1], [Define to 1 if you want getc etc. to use unlocked I/O if available. Unlocked I/O can improve performance in unithreaded apps, but it is not safe for multithreaded apps.]) AC_CHECK_DECLS( [clearerr_unlocked, feof_unlocked, ferror_unlocked, fflush_unlocked, fgets_unlocked, fputc_unlocked, fputs_unlocked, fread_unlocked, fwrite_unlocked, getc_unlocked, getchar_unlocked, putc_unlocked, putchar_unlocked, strerror]) dnl -------------------------------------- dnl Optimization, debug, GNU MP and NLS dnl -------------------------------------- dnl if test "x$enable_gmp" = "xno"; then CPPFLAGS="$CPPFLAGS -DDISABLE_GMP " fi if test "x$enable_nls" = "xyes"; then CPPFLAGS="$CPPFLAGS -DENABLE_NLS " fi if test "x$enable_debug" = "xyes"; then CFLAGS="$CFLAGS $DBGFLAGS " fi if test "x$enable_optimization" = "xyes"; then CFLAGS="$CFLAGS $OPTFLAGS " fi dnl LIBS="$LIBS" dnl CPPFLAGS="$CPPFLAGS" dnl -------------------------------------- dnl Output the makefile dnl -------------------------------------- dnl AC_MSG_RESULT(Configuration terminated with success:) AC_MSG_RESULT(Preprocessor flags = "$CPPFLAGS") AC_MSG_RESULT(Compiler flags = "$CFLAGS") AC_MSG_RESULT(Linker flags = "$LDFLAGS") AC_MSG_RESULT(Libraries = "$LIBS") dnl Remember to include @SET_MAKE@ in Makefile.in !!! AC_PROG_MAKE_SET AC_OUTPUT(Makefile) dnl dnl -------------------------------------- dnl End of configure script. dnl -------------------------------------- ./numdiff-5.8.1/ndselect.c0000444000175000017500000003777312215353073014311 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include #include #include #include #ifdef ENABLE_NLS #include #endif #include"getopt.h" #include"linesplit.h" #include"numdiff.h" /* For NEWLINE and LINE_INTERR definitions */ #include"ndselect.h" #include"read_line.c" static int we_can_go_on (const char *field, unsigned long fieldno, unsigned long last_field) { if (!last_field) return (*field != '\0'); else return (fieldno <= last_field && *field != '\0'); } static void print_line (const char *line, const char **ifs, const char* osep, unsigned long first_field, unsigned long last_field, unsigned long increment, int omit_if_empty) { unsigned long fieldno, lf; int print_nl, at_least_one_field_printed; const char *field, *endfield, *nextfield, *stop, *ptr; if (!last_field) lf = 0; else { lf = (last_field - first_field) / increment; lf = lf * increment + first_field; } at_least_one_field_printed = 0; print_nl = strchr (line, NEWLINE) != NULL ? 1 : 0; field = string_spn (line, ifs, '\0'); for (fieldno = 1; (we_can_go_on (field, fieldno, last_field)) ; fieldno++) { endfield = string_cspn (field, ifs, '\0'); nextfield = string_spn (endfield, ifs, '\0'); if (fieldno >= first_field && (fieldno - first_field) % increment == 0) { if ((osep)) stop = endfield; else stop = (fieldno == lf || *nextfield == '\0') ? endfield : nextfield; for (ptr = field; ptr < stop; ptr++) fputc(*ptr, stdout); if ((osep)) { fputs (osep, stdout); } at_least_one_field_printed = 1; } field = nextfield; } if ((omit_if_empty)) { if ((print_nl) && (at_least_one_field_printed)) fputc(NEWLINE, stdout); } else { if ((print_nl)) fputc(NEWLINE, stdout); else fputc(' ', stdout); } } static int scan_file (char** def_ifs, const Argslist* data) { FILE *fp; char *line_buffer; char **ifs; unsigned long lineno; int errcode, omit_empty_lines; ifs = (!data->ifs) ? def_ifs : data->ifs; omit_empty_lines = (data->optmask & ___X_MASK) ? 1 : 0; if (!data->file || !*data->file) fp = stdin; else { if ( !(fp = fopen (data->file, "r")) ) return OPEN_ERROR; } if (!data->end_line) { for (lineno = 1; (line_buffer = read_line(fp, &errcode), errcode <= LINE_INTERR); lineno++) { if (lineno >= data->begin_line && (lineno - data->begin_line) % data->step == 0) print_line (line_buffer, (const char**) ifs, data->osep, data->first_field, data->last_field, data->increment, omit_empty_lines); free ((void*)line_buffer); } } else { for (lineno = 1; lineno <= data->end_line && (line_buffer = read_line(fp, &errcode), errcode <= LINE_INTERR); lineno++) { if (lineno >= data->begin_line && (lineno - data->begin_line) % data->step == 0) print_line (line_buffer, (const char**) ifs, data->osep, data->first_field, data->last_field, data->increment, omit_empty_lines); free ((void*)line_buffer); } } if (errcode <= EOF_REACHED) { if (fp == stdin) return OK; else return fclose (fp) == EOF ? CLOSE_ERROR : OK; } else { if((line_buffer)) free ((void*)line_buffer); if (fp != stdin) fclose (fp); return READ_ERROR; } } static void print_selversion (const char* progname) { printf ("%s %s\n", progname, VERSION); printf ("Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 %s \n", /* TRANSLATORS: This is a proper name. See the gettext manual, section Names. Pronounciation is like "evaa-no pree-me". */ _("Ivano Primi")); printf (_("\ License GPLv3+: GNU GPL version 3 or later,\n\ see .\n\ This is free software: you are free to change and redistribute it.\n\ There is NO WARRANTY, to the extent permitted by law.\n")); } static void print_selhelp (const char* progname) { puts (_("Usage:")); printf ("%s -h|--help|-v|--version %s\n\n", progname, _("or")); printf ("%s %s\n", progname, "[-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS][-O OSEP][-x][-l PATH][-o PATH] [FILE]"); /* %%% */ printf(_("\nPrint to standard output a subset of lines and fields from a given file.\n")); printf ("\n%s\n%s\n%s\n\n%s\n\n", _("The argument after the options is the name of the file to read from."), _("The complete path of the file should be given,\na directory name is not accepted."), _("If no input file is specified, the program reads from the standard input."), _("Exit status: 0 in case of normal termination, -1 (255) in case of error")); printf ("-b, --beginning, --start=N\n %s\n %s\n", _("Set to N the number of the first line to print"), _("(The default behavior is to start with line number 1)")); printf ("-e, --end=N\n %s\n %s\n", _("Set to N the number of the last line that can be printed"), _("(The default behavior is to arrive till to the end of the file)")); printf ("-s, --step=N\n %s\n %s\n", _("Set to N the increment to use when selecting the lines to print"), _("(The default value for the increment is 1)")); printf ("-F, --first-field=N\n %s\n %s\n", _("Set to N the number of the first field to print"), _("(The default behavior is to start with field number 1)")); printf ("-L, --last-field=N\n %s\n %s\n", _("Set to N the number of the last field that can be printed"), _("(The default behavior is to arrive till to the end of every line)")); printf ("-I, --increment=N\n %s\n %s\n", _("Set to N the increment to use when selecting the fields to print"), _("(The default value for the increment is 1)")); printf ("-S, --separators=IFS\n %s\n %s\n", _("Specify the set of characters to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)")); printf ("-D, --delimiters=DELIMS\n %s\n %s\n", _("Specify the set of strings to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)")); printf ("-O, --output-separator=OSEP\n %s\n %s\n", _("Specify the string to use as separator\n while writing the selected fields to the standard output"), _("(The default behavior consists in reusing\n the delimiters found in the input lines)")); printf ("-x, --omit-empty-lines\n %s\n", _("Do not print empty lines")); printf ("-l, --warnings-to=PATH\n %s\n", _("Redirect warning and error messages from stderr to the indicated file")); printf ("-o, --output=PATH\n %s\n", _("Redirect output from stdout to the indicated file")); printf ("-h, --help\n %s\n", _("Show this help message")); printf ("-v, --version\n %s\n\n", _("Show version number, Copyright, Distribution Terms and NO-Warranty")); } extern int errno; extern char *optarg; extern int optind; static int set_args (int argc, char* argv[], Argslist *list) { const char *optstring = "hb:e:s:F:L:I:S:D:O:xl:o:v"; struct option long_options[] = { {"help", 0, NULL, 'h'}, {"beginning", 1, NULL, 'b'}, {"start", 1, NULL, 'b'}, {"end", 1, NULL, 'e'}, {"step", 1, NULL, 's'}, {"first-field", 1, NULL, 'F'}, {"last-field", 1, NULL, 'L'}, {"increment", 1, NULL, 'I'}, {"separators", 1, NULL, 'S'}, {"delimiters", 1, NULL, 'D'}, {"output-separator", 1, NULL, 'O'}, {"omit-empty-lines", 0, NULL, 'x'}, {"warnings-to", 1, NULL, 'l'}, {"output", 1, NULL, 'o'}, {"version", 0, NULL, 'v'}, {0, 0, 0, 0} }; int option_index=0; char *endptr; int optch; /* We start by loading the default values for the user settable options. */ list->optmask = 0x0; list->begin_line=1; list->end_line=0; list->step=1; list->first_field=1; list->last_field=0; list->increment=1; list->ifs = NULL; list->osep = NULL; list->file = NULL; while ( (optch = getopt_long (argc, argv, optstring, long_options, &option_index)) != -1 ) { switch (optch) { case 'h': list->optmask |= ___H_MASK; break; case 'b': list->optmask |= ___B_MASK; errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->begin_line = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->begin_line == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'e': list->optmask |= ___E_MASK; errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->end_line = strtoul (optarg, &endptr, 10), errno == ERANGE) || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 's': list->optmask |= ___S_MASK; errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->step = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->step == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'F': list->optmask |= ___SF_MASK; errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->first_field = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->first_field == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'L': list->optmask |= ___SL_MASK; errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->last_field = strtoul (optarg, &endptr, 10), errno == ERANGE) || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'I': list->optmask |= ___SI_MASK; errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->increment = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->increment == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'S': if ((list->ifs)) { delete_string_vector (list->ifs); list->ifs = NULL; } list->ifs = ssplit_former_way (optarg); if (!list->ifs) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } else if ( !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE2, optch); fprintf (stderr, _(" The list of field delimiters cannot be empty and\n must always include the newline character (\'\\n\')\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs); sort_string_vector (list->ifs); /* This is not strictly necessary */ list->optmask |= ___SS_MASK; } break; case 'D': if ((list->ifs)) { delete_string_vector (list->ifs); list->ifs = NULL; } list->ifs = ssplit (optarg, I_DEF_SEP); if (!list->ifs) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } else if ( !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE2, optch); fprintf (stderr, _(" The list of field delimiters cannot be empty and\n must always include the newline string (\"\\n\")\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs); sort_string_vector (list->ifs); list->optmask |= ___SD_MASK; } break; case 'O': if ((list->osep)) { free((void*)list->osep); list->osep = NULL; } list->osep = get_separating_string (optarg); if (!list->osep) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } else list->optmask |= ___SO_MASK; break; case 'x': list->optmask |= ___X_MASK; break; case 'l': if (!freopen (optarg, "w", stderr)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE2, optarg); perror(0); return -1; } break; case 'o': if (!freopen (optarg, "w", stdout)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE2, optarg); perror(0); return -1; } break; case 'v': list->optmask |= ___V_MASK; break; default: /* fprintf (stderr, */ /* _("%s: unrecognized option `-%c\' \n"), PACKAGE2, optch); */ return -1; } } if (!(list->optmask & (___H_MASK | ___V_MASK)) && argc - optind > 1) { print_selhelp (PACKAGE2); return -1; } else { if( !(list->optmask & (___H_MASK | ___V_MASK)) ) list->file = (const char*) argv[optind]; return 0; } } static char** def_ifs = NULL; static void clean_up_memory (void) { delete_string_vector (def_ifs); } int main (int argc, char** argv) { Argslist arg_list; def_ifs = ssplit (DEF_IFS, I_DEF_SEP); if ((atexit(clean_up_memory)) || !def_ifs) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } #ifdef ENABLE_NLS setlocale (LC_CTYPE, ""); setlocale (LC_MESSAGES, ""); #endif bindtextdomain (PACKAGE2, LOCALEDIR); textdomain (PACKAGE2); if ( set_args (argc, argv, &arg_list) != 0 ) return -1; else if ( (arg_list.optmask & (___H_MASK | ___V_MASK)) ) { if ((arg_list.optmask & ___V_MASK)) print_selversion(PACKAGE2); if ((arg_list.optmask & ___H_MASK)) print_selhelp(PACKAGE2); if (argc > 2) return -1; else return 0; } else { switch (scan_file (def_ifs, &arg_list)) { case OPEN_ERROR: fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE2, arg_list.file); perror(0); return -1; case CLOSE_ERROR: fprintf (stderr, _("%s: cannot close file \"%s\":\n"), PACKAGE2, arg_list.file); perror(0); return -1; case READ_ERROR: fprintf (stderr, _("%s: Error occurred while reading from file \"%s\"\n\n"), PACKAGE2, arg_list.file); return -1; default: return 0; } } } ./numdiff-5.8.1/exitfail.c0000644000175000017500000000217712215353073014305 0ustar ivanoivano/* Failure exit status Copyright (C) 2002, 2003, 2005, 2006, 2007 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 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "system.h" #include "exitfail.h" #include /* Modified by Ivano Primi on April 18, 2009. The value of the constant EXIT_FAILURE (1) is used by Numdiff to mean that the given files are different. To signal troubles Numdiff uses EXIT_TROUBLE (-1). */ int volatile exit_failure = EXIT_TROUBLE; ./numdiff-5.8.1/arith.c0000444000175000017500000003145112215353073013602 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include #include"numdiff.h" #ifdef USE_GMP #include Real Zero, Ten, Inf; void init_mpa(int iscale) { char tmpbuff[1024]; /* Hopefully the highest possible number of digits for a LONG will never become larger than 1000!! :) */ sprintf (tmpbuff, "1e%ld", LONG_MAX); mpf_set_default_prec ((iscale * 32) / 10); mpf_init (Zero); mpf_init_set_ui (Ten, 10); mpf_init_set_str (Inf, tmpbuff, 10); } void initR (Real* px) { mpf_init (*px); } void initC (Complex* pz) { mpf_init (pz->re); mpf_init (pz->im); } void copyR (Real* dst, Real src) { mpf_set (*dst, src); } void copyC (Complex* dst, Complex src) { mpf_set (dst->re, src.re); mpf_set (dst->im, src.im); } void str2R (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Real* pr) { mpf_a2num (pr, q, endptr, pnf); } void str2C (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Complex* pc) { char *ptr, *ptr2; mpf_init (pc->re); mpf_init (pc->im); mpf_a2num (&pc->re, q, &ptr, pnf); if ((endptr)) *endptr = ptr; if (ptr != q) { if (*ptr == pnf->iu) { mpf_set (pc->im, pc->re); mpf_set (pc->re, Zero); if ((endptr)) *endptr = ptr + 1; } else { while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { mpf_a2num (&pc->im, ptr, &ptr2, pnf); if (*ptr2 != pnf->iu) mpf_set (pc->im, Zero); else { if ((endptr)) *endptr = ptr2 + 1; } } /* else : we have successfully read a real number but there is no another number after it. : So, we leave pc->im set to zero. */ } } else /* : q does not contain any valid number ==> pc->re is 0. Then we set pc->im to 0. We remark that, if endptr is not NULL, then *endptr == q. */ mpf_set (pc->im, Zero); } void add (Real s, Real t, Real* q, int iscale) { mpf_add (*q, s, t); } void square (Real s, Real* q, int iscale) { mpf_pow_ui (*q, s, 2); } void divide (Real s, Real t, Real* q, int iscale) { mpf_div (*q, s, t); } void divide_by_int (Real* q, int d, int iscale) { Real div; if (d == 0) mpf_set (*q, Zero); else { mpf_init_set_si (div, d); mpf_div (*q, *q, div); mpf_clear (div); } } void square_root (Real* q, int iscale) { mpf_sqrt (*q, *q); } void Cabs (Complex z, Real* pm, int iscale) { mpf_t a, b, q; if ( mpf_sgn (z.re) >= 0 ) mpf_init_set (a, z.re); else { mpf_init (a); mpf_sub (a, Zero, z.re); } if ( (mpf_sgn(z.im) == 0) ) { mpf_set (*pm, a); mpf_clear (a); return; } else if ( (mpf_sgn(z.im) > 0) ) mpf_init_set (b, z.im); else { mpf_init (b); mpf_sub (b, Zero, z.im); } mpf_init (q); if ( mpf_cmp (b, a) > 0 ) { mpf_div (q, a, b); mpf_mul (a, q, q); mpf_add_ui (q, a, 1); mpf_sqrt (q, q); mpf_mul (*pm, b, q); } else { /* a >= b ===> a > 0 */ mpf_div (q, b, a); mpf_mul (b, q, q); mpf_add_ui (q, b, 1); mpf_sqrt (q, q); mpf_mul (*pm, a, q); } mpf_clear (q); mpf_clear (b); mpf_clear (a); } void Csub (Complex z1, Complex z2, Complex* pw, int iscale) { mpf_sub (pw->re, z1.re, z2.re); mpf_sub (pw->im, z1.im, z2.im); } int cmp (Real p, Real q) { return mpf_cmp (p, q); } int is0 (Real u) { return (mpf_cmp (u, Zero) == 0 ? 1 : 0); } int smart_cmp (const Complex* pz1, const Complex* pz2, int flag) { if (flag == 0) return 1; else if (flag > 0) return (mpf_cmp (pz1->re, pz2->re) >= 0 && mpf_cmp (pz1->im, pz2->im) >= 0); else /* flag < 0 */ return (mpf_cmp (pz1->re, pz2->re) <= 0 && mpf_cmp (pz1->im, pz2->im) <= 0); } static int round_far_from_zero (char* mantissa, int prec) { size_t length; char *ptr, *abs_mantissa; /* abs_mantissa is a pointer to the absolute value of MANTISSA. If MANTISSA starts with a minus sign, then abs_mantissa has to point to the digit immediately after this sign. */ if (*mantissa == NEG_SIGN) abs_mantissa = mantissa + 1; else abs_mantissa = mantissa; length = strlen (abs_mantissa); /* If the length of the string ABS_MANTISSA is less or equal than PREC+1, then no rounding is required and zero has to be returned. */ if (length <= prec + 1) return 0; else { /* If length > prec + 1, then the character of ABS_MANTISSA in the position PREC+1 is non-null. If this character is a number between 0 and 4, then the rounding procedure ends hier. */ ptr = abs_mantissa + (prec + 1); if ((*ptr - CHAR_ZERO) >= 5) { /* Otherwise we have to "increment" the previous character by 1, taking into account each time the amount to be carried. */ for (ptr--; ptr > abs_mantissa && *ptr == CHAR_NINE; *ptr = CHAR_ZERO, ptr--); if (ptr == abs_mantissa) { /* If the first PREC+1 digits of ABS_MANTISSA were all equal to 9, then the rounding procedure has to set all of them to zero and return 1, i.e. the last carried amount. */ if (*ptr == CHAR_NINE) { *ptr = CHAR_ZERO; return 1; } /* If the first digit of ABS_MANTISSA is less than 9, then the rounding procedure ends by incrementing this digit by 1 and returning 0. */ else *ptr = *ptr + 1; } /* If at least one of the first PREC+1 digits of ABS_MANTISSA is less than 9, then the rounding procedure ends by incrementing this digit by 1 and returning 0. */ else *ptr = *ptr + 1; } return 0; } /* LENGTH > PREC + 1 */ } static void fprintno (FILE *fp, Real u, int prec) { if (mpf_cmp (u, Inf) == 0) printf ("Inf"); else { char *ptr, *mantissa; mp_exp_t expn; ptr = mantissa = mpf_get_str (NULL, &expn, 10, 0, u); if (*mantissa == '\0') { /* If MANTISSA is the empty string, then print 0 with the required number of decimal digits. */ fputc (CHAR_ZERO, fp); fputc (DP, fp); for (; prec > 0; prec--) fputc (CHAR_ZERO, fp); fputc (ECH, fp); fputc (POS_SIGN, fp); fputc (CHAR_ZERO, fp); } else { int amount_to_carry = round_far_from_zero (mantissa, prec); if (*ptr == NEG_SIGN) { /* Print a minus sign if the number is negative */ fputc (NEG_SIGN, fp); ptr++; } /* The mantissa has been already rounded to the given precision PREC. If MANTISSA before the rounding was "99...9", then now it is given by "00...0" but there is a leading 1 which has to be carried. */ if (amount_to_carry) { fputc (CHAR_ONE, fp); expn++; } else { fputc (*ptr, fp); ptr++; } /* We print now the decimal point */ fputc (DP, fp); /* and the remaining digits of the mantissa. After the decimal point has been printed, one must print no more than PREC digits. */ for (; *ptr != '\0' && prec > 0; ptr++, prec--) fputc (*ptr, fp); /* If the remaining digits of the mantissa are less than PREC, then fill up with zeros. */ if (*ptr == '\0') { for (; prec > 0; prec--) fputc (CHAR_ZERO, fp); } /* Finally we print the exponent with its sign */ fprintf (fp, "%c%+ld", ECH, expn - 1); } free ((void*) mantissa); } /* u != Inf */ } void printno (Real u, int m) { fprintno (stdout, u, m); } #ifdef _MPA_DEBUG void debug_printno (Real u, int m) { fprintno (stderr, u, m); } #endif void delR (Real* px) { mpf_clear (*px); } void delC (Complex* pz) { mpf_clear (pz->re); mpf_clear (pz->im); } void end_mpa(void) { mpf_clear (Inf); mpf_clear (Ten); mpf_clear (Zero); } #else /* not USE_GMP */ #include"number.c" #include"errors.c" #include"new.c" Real Zero, Inf; void init_mpa(int iscale) { bc_init_numbers(); bc_init_num(&Zero); Inf = bc_new_num (1,0); Inf->n_value[0] = 10; } void initR (Real* px) { bc_init_num (px); } void initC (Complex* pz) { bc_init_num (&pz->re); bc_init_num (&pz->im); } void copyR (Real* dst, Real src) { *dst = bc_copy_num (src); } void copyC (Complex* dst, Complex src) { dst->re = bc_copy_num (src.re); dst->im = bc_copy_num (src.im); } void str2R (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Real* pr) { bc_a2num (pr, q, endptr, iscale, pnf); } void str2C (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Complex* pc) { char *ptr, *ptr2; bc_init_num (&pc->re); bc_init_num (&pc->im); bc_a2num (&pc->re, q, &ptr, iscale, pnf); if ((endptr)) *endptr = ptr; if (ptr != q) { if (*ptr == pnf->iu) { pc->im = bc_copy_num (pc->re); pc->re = bc_copy_num (_zero_); if ((endptr)) *endptr = ptr + 1; } else { while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { bc_a2num (&pc->im, ptr, &ptr2, iscale, pnf); if (*ptr2 != pnf->iu) pc->im = bc_copy_num (_zero_); else { if ((endptr)) *endptr = ptr2 + 1; } } /* else : we have successfully read a real number but there is no another number after it. : So, we leave pc->im set to zero. */ } } else /* : q does not contain any valid number ==> pc->re is 0. Then we set pc->im to 0. We remark that, if endptr is not NULL, then *endptr == q. */ pc->im = bc_copy_num (_zero_); } void add (Real s, Real t, Real* q, int iscale) { bc_add (s, t, q, iscale); } void square (Real s, Real* q, int iscale) { bc_multiply (s, s, q, iscale); } void divide (Real s, Real t, Real* q, int iscale) { bc_divide (s, t, q, iscale); } void divide_by_int (Real* q, int d, int iscale) { Real num, div; if (d == 0) { bc_free_num (q); bc_init_num (q); } else { bc_init_num (&div); bc_int2num (&div, d); num = bc_copy_num (*q); bc_divide (num, div, q, iscale); bc_free_num (&num); bc_free_num (&div); } } void square_root (Real* q, int iscale) { bc_sqrt (q, iscale); } void Cabs (Complex z, Real* pm, int iscale) { bc_num a, b, q; if ( z.re->n_sign == PLUS ) a = bc_copy_num (z.re); else { bc_init_num (&a); bc_sub (Zero, z.re, &a, iscale); } if ( (bc_is_zero(z.im)) ) { *pm = a; return; } else if ( z.im->n_sign == PLUS ) b = bc_copy_num (z.im); else { bc_init_num (&b); bc_sub (Zero, z.im, &b, iscale); } bc_init_num (&q); if ( bc_compare (b, a) > 0 ) { bc_divide (a, b, &q, iscale); bc_multiply (q, q, &a, iscale); bc_add (a, _one_, &q, iscale); bc_sqrt (&q, iscale); bc_multiply (b, q, pm, iscale); } else { /* a >= b ===> a > 0 */ bc_divide (b, a, &q, iscale); bc_multiply (q, q, &b, iscale); bc_add (b, _one_, &q, iscale); bc_sqrt (&q, iscale); bc_multiply (a, q, pm, iscale); } bc_free_num (&q); bc_free_num (&b); bc_free_num (&a); } void Csub (Complex z1, Complex z2, Complex* pw, int iscale) { bc_sub (z1.re, z2.re, &pw->re, iscale); bc_sub (z1.im, z2.im, &pw->im, iscale); } int cmp (Real p, Real q) { return bc_compare (p, q); } int is0 (Real u) { return bc_is_zero (u); } int smart_cmp (const Complex* pz1, const Complex* pz2, int flag) { if (flag == 0) return 1; else if (flag > 0) return (bc_compare (pz1->re, pz2->re) >= 0 && bc_compare (pz1->im, pz2->im) >= 0); else /* flag < 0 */ return (bc_compare (pz1->re, pz2->re) <= 0 && bc_compare (pz1->im, pz2->im) <= 0); } void printno (Real u, int m) { bc_print_num (u, out_char, m); } #ifdef _MPA_DEBUG void debug_printno (Real u, int m) { bc_print_num (u, out_char_stderr, m); } #endif void delR (Real* px) { bc_free_num (px); } void delC (Complex* pz) { bc_free_num (&pz->re); bc_free_num (&pz->im); } void end_mpa(void) { bc_free_num (&Inf); bc_free_num (&Zero); bc_end(); } #endif /* not USE_GMP */ ./numdiff-5.8.1/getopt.c0000644000175000017500000010123712215353073013777 0ustar ivanoivano/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include #endif #include /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #include #ifdef VMS # include #endif #ifdef _LIBC # include #else # include "gettext.h" # define _(msgid) gettext (msgid) #endif #if defined _LIBC && defined USE_IN_LIBIO # include #endif #ifndef attribute_hidden # define attribute_hidden #endif /* Unlike standard Unix `getopt', functions like `getopt_long' let the user intersperse the options with the other arguments. As `getopt_long' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Using `getopt' or setting the environment variable POSIXLY_CORRECT disables permutation. Then the application's behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" #include "getopt_int.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Keep a global copy of all internal members of getopt_data. */ static struct _getopt_data getopt_data; #ifndef __GNU_LIBRARY__ /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif #endif /* not __GNU_LIBRARY__ */ #ifdef _LIBC /* Stored original parameters. XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ extern int __libc_argc; extern char **__libc_argv; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ if (d->__nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } # else # define SWAP_FLAGS(ch1, ch2) # endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (char **argv, struct _getopt_data *d) { int bottom = d->__first_nonopt; int middle = d->__last_nonopt; int top = d->optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, d->__nonoption_flags_max_len), '\0', top + 1 - d->__nonoption_flags_max_len); d->__nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ d->__first_nonopt += (d->optind - d->__last_nonopt); d->__last_nonopt = d->optind; } /* Initialize the internal data when the first call is made. */ static const char * _getopt_initialize (int argc, char **argv, const char *optstring, int posixly_correct, struct _getopt_data *d) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ d->__first_nonopt = d->__last_nonopt = d->optind; d->__nextchar = NULL; d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { d->__ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { d->__ordering = REQUIRE_ORDER; ++optstring; } else if (d->__posixly_correct) d->__ordering = REQUIRE_ORDER; else d->__ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS if (!d->__posixly_correct && argc == __libc_argc && argv == __libc_argv) { if (d->__nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') d->__nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = d->__nonoption_flags_max_len = strlen (orig_str); if (d->__nonoption_flags_max_len < argc) d->__nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (d->__nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) d->__nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', d->__nonoption_flags_max_len - len); } } d->__nonoption_flags_len = d->__nonoption_flags_max_len; } else d->__nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT environment variable were set. */ int _getopt_internal_r (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, int posixly_correct, struct _getopt_data *d) { int print_errors = d->opterr; if (optstring[0] == ':') print_errors = 0; if (argc < 1) return -1; d->optarg = NULL; if (d->optind == 0 || !d->__initialized) { if (d->optind == 0) d->optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring, posixly_correct, d); d->__initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ || (d->optind < d->__nonoption_flags_len \ && __getopt_nonoption_flags[d->optind] == '1')) #else # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') #endif if (d->__nextchar == NULL || *d->__nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (d->__last_nonopt > d->optind) d->__last_nonopt = d->optind; if (d->__first_nonopt > d->optind) d->__first_nonopt = d->optind; if (d->__ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange ((char **) argv, d); else if (d->__last_nonopt != d->optind) d->__first_nonopt = d->optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (d->optind < argc && NONOPTION_P) d->optind++; d->__last_nonopt = d->optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (d->optind != argc && !strcmp (argv[d->optind], "--")) { d->optind++; if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange ((char **) argv, d); else if (d->__first_nonopt == d->__last_nonopt) d->__first_nonopt = d->optind; d->__last_nonopt = argc; d->optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (d->optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (d->__first_nonopt != d->__last_nonopt) d->optind = d->__first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (d->__ordering == REQUIRE_ORDER) return -1; d->optarg = argv[d->optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[d->optind][1] == '-' || (long_only && (argv[d->optind][2] || !strchr (optstring, argv[d->optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) { if ((unsigned int) (nameend - d->__nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), argv[0], argv[d->optind]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[d->optind]); #endif } d->__nextchar += strlen (d->__nextchar); d->optind++; d->optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; d->optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[d->optind - 1][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #else fprintf (stderr, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); #else fprintf (stderr, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->__nextchar += strlen (d->__nextchar); d->optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]); #endif } d->__nextchar += strlen (d->__nextchar); d->optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[d->optind][1] == '-' || strchr (optstring, *d->__nextchar) == NULL) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[d->optind][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), argv[0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], d->__nextchar); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[d->optind][0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[d->optind][0], d->__nextchar); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->__nextchar = (char *) ""; d->optind++; d->optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *d->__nextchar++; char *temp = strchr (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*d->__nextchar == '\0') ++d->optind; if (temp == NULL || c == ':') { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (d->__posixly_correct) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: illegal option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); #endif } else { #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: invalid option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ d->optind++; } else if (d->optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option requires an argument -- %c\n"), argv[0], c) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `d->optind' once; increment it again when taking next ARGV-elt as argument. */ d->optarg = argv[d->optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) { if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[d->optind]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[d->optind]); #endif } d->__nextchar += strlen (d->__nextchar); d->optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } d->__nextchar += strlen (d->__nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]); #endif } d->__nextchar += strlen (d->__nextchar); return optstring[0] == ':' ? ':' : '?'; } } d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } d->__nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; d->optind++; } else d->optarg = NULL; d->__nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ d->optind++; } else if (d->optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option requires an argument -- %c\n"), argv[0], c) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ d->optarg = argv[d->optind++]; d->__nextchar = NULL; } } return c; } } int _getopt_internal (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, int posixly_correct) { int result; getopt_data.optind = optind; getopt_data.opterr = opterr; result = _getopt_internal_r (argc, argv, optstring, longopts, longind, long_only, posixly_correct, &getopt_data); optind = getopt_data.optind; optarg = getopt_data.optarg; optopt = getopt_data.optopt; return result; } /* glibc gets a LSB-compliant getopt. Standalone applications get a POSIX-compliant getopt. */ #if _LIBC enum { POSIXLY_CORRECT = 0 }; #else enum { POSIXLY_CORRECT = 1 }; #endif int getopt (int argc, char *const *argv, const char *optstring) { return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0, POSIXLY_CORRECT); } #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ ./numdiff-5.8.1/main.c0000444000175000017500000003545312215353073013425 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ /* Leave this inclusion at the begin, otherwise problems */ /* with the symbol __USE_FILE_OFFSET64 */ #include"numdiff.h" #include"linesplit.h" #include #include /* for free() */ #include #if HAVE_GETTIMEOFDAY #include #endif #ifdef ENABLE_NLS #include #endif /* See cmpfns.c */ extern int cmp_files (FILE* pf1, FILE* pf2, argslist* argl); /* See options.c */ extern void print_version (const char* progname); extern void print_help (const char* progname); extern int setargs (int argc, char* argv[], argslist *list); static void init_mpa_support (argslist* list) { init_mpa(list->iscale); initR (&list->Labserr); initR (&list->Crelerr); initR (&list->Lrelerr); initR (&list->Cabserr); initR (&list->N1abserr); initR (&list->N1disperr); initR (&list->N2abserr); initR (&list->N2disperr); list->maxabserr = thrlist_new (); list->maxrelerr = thrlist_new (); } static void dismiss_mpa_support (argslist* list) { delR (&list->Labserr); delR (&list->Crelerr); delR (&list->Lrelerr); delR (&list->Cabserr); delR (&list->N1abserr); delR (&list->N1disperr); delR (&list->N2abserr); delR (&list->N2disperr); thrlist_dispose (&list->maxabserr); thrlist_dispose (&list->maxrelerr); end_mpa(); } static void set_mtime_to_now (struct stat *st) { #ifdef ST_MTIM_NSEC # if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME if (clock_gettime (CLOCK_REALTIME, &st->st_mtim) == 0) return; # endif # if HAVE_GETTIMEOFDAY { struct timeval timeval; if (gettimeofday (&timeval, NULL) == 0) { st->st_mtime = timeval.tv_sec; st->st_mtim.ST_MTIM_NSEC = timeval.tv_usec * 1000; return; } } # endif #endif /* ST_MTIM_NSEC */ time (&st->st_mtime); } /* cmp.file[f].desc markers */ #define NONEXISTENT (-1) /* nonexistent file */ #define UNOPENED (-2) /* unopened file (e.g. directory) */ #define ERRNO_ENCODE(errno) (-3 - (errno)) /* encoded errno value */ #define ERRNO_DECODE(desc) (-3 - (desc)) /* inverse of ERRNO_ENCODE */ #define DIR_P(f) (S_ISDIR (files[f].stat.st_mode) != 0) static int open_files (const char* name0, const char* name1) { register int f; int status = EXIT_SUCCESS; bool same_files; if (!name0 || !name1) return EXIT_TROUBLE; memset (files, 0, sizeof files); files[0].desc = UNOPENED; files[1].desc = UNOPENED; files[0].name = name0; files[1].name = name1; /* Stat the files. */ for (f = 0; f < 2; f++) { if ((f) && file_name_cmp (files[f].name, files[0].name) == 0) { files[f].desc = files[0].desc; files[f].stat = files[0].stat; } else if (strcmp (files[f].name, "-") == 0) { files[f].desc = STDIN_FILENO; if (fstat (STDIN_FILENO, &files[f].stat) != 0) files[f].desc = ERRNO_ENCODE (errno); else { if (S_ISREG (files[f].stat.st_mode)) { off_t pos = lseek (STDIN_FILENO, (off_t) 0, SEEK_CUR); if (pos < 0) files[f].desc = ERRNO_ENCODE (errno); else files[f].stat.st_size = MAX (0, files[f].stat.st_size - pos); } /* POSIX 1003.1-2001 requires current time for stdin. */ set_mtime_to_now (&files[f].stat); } } else if (stat (files[f].name, &files[f].stat) != 0) files[f].desc = ERRNO_ENCODE (errno); } for (f = 0; f < 2; f++) { int e = ERRNO_DECODE (files[f].desc); if (0 <= e) { errno = e; perror_with_name (files[f].name); status = EXIT_TROUBLE; } } if (status != EXIT_SUCCESS) /* One of the files should exist but does not. */ return status; else if (DIR_P (0) | DIR_P (1)) return EXIT_TROUBLE; else { /* Both exist and neither is a directory. */ /* Are they the same file ? */ same_files = (files[0].desc != NONEXISTENT && files[1].desc != NONEXISTENT && 0 < same_file (&files[0].stat, &files[1].stat) && same_file_attributes (&files[0].stat, &files[1].stat)); /* Open the files and record their descriptors. */ if (files[0].desc == UNOPENED) if ((files[0].desc = open (files[0].name, O_RDONLY, 0)) < 0) { perror_with_name (files[0].name); status = EXIT_TROUBLE; } if (files[1].desc == UNOPENED) { if ((same_files)) files[1].desc = files[0].desc; else if ((files[1].desc = open (files[1].name, O_RDONLY, 0)) < 0) { perror_with_name (files[1].name); status = EXIT_TROUBLE; } } #if HAVE_SETMODE_DOS if (binary) for (f = 0; f < 2; f++) if (0 <= files[f].desc) set_binary_mode (files[f].desc, 1); #endif return status; } } static int compare_files (argslist* list, int* is_same_physical_file) { if ((files[0].desc != NONEXISTENT && files[1].desc != NONEXISTENT && 0 < same_file (&files[0].stat, &files[1].stat) && same_file_attributes (&files[0].stat, &files[1].stat))) { /* The two named files are actually the same physical file. We know they are identical without actually reading them. */ *is_same_physical_file = 1; return 0; } else { int status = diff_2_files (files, list); /* STATUS is 0 if no changes have been found, 1 in case of detected changes, -1 if either file is binary. */ *is_same_physical_file = 0; return status; } } static int rewind_files (void) { off_t pos0, pos1; int status = EXIT_SUCCESS; if ((pos0 = lseek(files[0].desc, (off_t) 0, SEEK_SET)) < 0) { perror_with_name (files[0].name); status = EXIT_TROUBLE; } if ((pos1 = lseek(files[1].desc, (off_t) 0, SEEK_SET)) < 0) { perror_with_name (files[1].name); status = EXIT_TROUBLE; } return status; } static int set_file_pointers (FILE** fpp1, FILE** fpp2) { int status = EXIT_SUCCESS; if ( !(*fpp1 = fdopen (files[0].desc, "r")) ) { perror_with_name (files[0].name); status = EXIT_TROUBLE; } if ( !(*fpp2 = fdopen (files[1].desc, "r")) ) { perror_with_name (files[1].name); status = EXIT_TROUBLE; } return status; } static int close_files (void) { /* Close the file descriptors. */ if (0 <= files[0].desc && close (files[0].desc) != 0) { perror_with_name (files[0].name); return EXIT_TROUBLE; } if (0 <= files[1].desc && files[0].desc != files[1].desc && close (files[1].desc) != 0) { perror_with_name (files[1].name); return EXIT_TROUBLE; } return EXIT_SUCCESS; } static void print_statistics (argslist* list) { Real qm_abserr, qm_relerr; #ifdef USE_GMP initR (&qm_abserr); initR (&qm_relerr); #endif /* USE_GMP */ if (list->flag > 0) { fputs (_("\n In the computation of the following quantities\n only the errors with positive sign are considered:\n"), stdout); fputs (_(" differences due to numeric fields of the second file that are\n less than the corresponding fields in the first file are neglected\n\n"), stdout); } if (list->flag < 0) { fputs (_("\n In the computation of the following quantities\n only the errors with negative sign are considered:\n"), stdout); fputs (_(" differences due to numeric fields of the second file that are\n greater than the corresponding fields in the first file are neglected\n\n"), stdout); } if ( list->Ndisperr == 0 ) { if ( list->Nentries == 0 ) fputs (_("\nNo numeric comparison has been done\n"), stdout); else printf(ngettext ( "\nOne numeric comparison has been done and\nthe resulting numeric difference is negligible\n", "\n%d numeric comparisons have been done and\nthe resulting numeric differences are all negligible\n", list->Nentries), list->Nentries); } else if ( list->Ndisperr == list->Nentries ) { printf(ngettext ( "\nOne numeric comparison has been done and\nhas produced an outcome beyond the tolerance threshold\n", "\n%d numeric comparisons have been done, all of them\nhave produced an outcome beyond the tolerance threshold\n", list->Nentries), list->Nentries); } else { /* Case 0 < LIST->NDISPERR < LIST->NENTRIES */ printf (ngettext ( "\nOne numeric comparison has been done,\n", "\n%d numeric comparisons have been done,\n", list->Nentries), list->Nentries); printf (ngettext ( "only one numeric comparison has produced an outcome\nbeyond the tolerance threshold\n", "%d numeric comparisons have produced an outcome\nbeyond the tolerance threshold\n", list->Ndisperr), list->Ndisperr); } fputs (_("\nLargest absolute error in the set of relevant numerical differences:\n"), stdout); printno (list->Labserr, DEF_LIM); fputs (_("\nCorresponding relative error:\n"), stdout); printno (list->Crelerr, DEF_LIM); fputs (_("\nLargest relative error in the set of relevant numerical differences:\n"), stdout); printno (list->Lrelerr, DEF_LIM); fputs (_("\nCorresponding absolute error:\n"), stdout); printno (list->Cabserr, DEF_LIM); putchar ('\n'); fputs (_("\nSum of all absolute errors:\n"), stdout); printno (list->N1abserr, DEF_LIM); fputs (_("\nSum of the relevant absolute errors:\n"), stdout); printno (list->N1disperr, DEF_LIM); /* Arithmetic means */ divide_by_int (&list->N1abserr, list->Nentries, list->iscale); divide_by_int (&list->N1disperr, list->Ndisperr, list->iscale); fputs (_("\nArithmetic mean of all absolute errors:\n"), stdout); printno (list->N1abserr, DEF_LIM); fputs (_("\nArithmetic mean of the relevant absolute errors:\n"), stdout); printno (list->N1disperr, DEF_LIM); /* 2-norms and quadratic means of the errors */ copyR (&qm_abserr, list->N2abserr); divide_by_int (&qm_abserr, list->Nentries, list->iscale); square_root (&qm_abserr, list->iscale); square_root (&list->N2abserr, list->iscale); fputs (_("\nSquare root of the sum of the squares of all absolute errors:\n"), stdout); printno (list->N2abserr, DEF_LIM); fputs (_("\nQuadratic mean of all absolute errors:\n"), stdout); printno (qm_abserr, DEF_LIM); copyR (&qm_relerr, list->N2disperr); divide_by_int (&qm_relerr, list->Ndisperr, list->iscale); square_root (&qm_relerr, list->iscale); square_root (&list->N2disperr, list->iscale); fputs (_("\nSquare root of the sum of the squares\nof the relevant absolute errors:\n"), stdout); printno (list->N2disperr, DEF_LIM); fputs (_("\nQuadratic mean of the relevant absolute errors:\n"), stdout); printno (qm_relerr, DEF_LIM); putchar ('\n'); delR (&qm_relerr); delR (&qm_abserr); } char **def_ifs = NULL; int main (int argc, char* argv[]) { argslist list; #ifdef ENABLE_NLS setlocale (LC_CTYPE, ""); setlocale (LC_MESSAGES, ""); #endif bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); def_ifs = ssplit (DEF_IFS, I_DEF_SEP); if (!def_ifs) { fprintf (stderr, _("*** %s: memory exhausted\n"), PACKAGE); return -1; } /* This code was used to discover the reason of a bug */ /* #ifdef __USE_FILE_OFFSET64 printf ("\n %s: FILE OFFSET 64 in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #else printf ("\n %s: FILE OFFSET 64 NOT in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #endif */ init_mpa_support (&list); init_flags (); if ( setargs (argc, argv, &list) != 0 ) { delete_string_vector (def_ifs); dismiss_mpa_support (&list); if ((list.ifs1)) delete_string_vector (list.ifs1); if ((list.ifs2)) delete_string_vector (list.ifs2); return -1; } else if ( (list.optmask & (_H_MASK | _V_MASK)) ) { if ((list.optmask & _V_MASK)) print_version(PACKAGE); if ((list.optmask & _H_MASK)) print_help(PACKAGE); delete_string_vector (def_ifs); dismiss_mpa_support (&list); if ((list.ifs1)) delete_string_vector (list.ifs1); if ((list.ifs2)) delete_string_vector (list.ifs2); if (argc > 2) return -1; else return 0; } else { int test = 0, ident_files = 0; FILE *fp1, *fp2; int qm = list.optmask & _Q_MASK; if ( open_files (list.file1, list.file2) != EXIT_SUCCESS ) { delete_string_vector (def_ifs); dismiss_mpa_support (&list); if ((list.ifs1)) delete_string_vector (list.ifs1); if ((list.ifs2)) delete_string_vector (list.ifs2); return EXIT_TROUBLE; } if ( list.optmask & (_F_MASK | _Z_MASK | _SZ_MASK) ) test = compare_files (&list, &ident_files); if (test < 0) { fputs (_("\n*** The requested comparison cannot be performed:\n"), stdout); printf (_("*** At least one between \"%s\" and \"%s\" is a binary file\n"), list.file1, list.file2); return EXIT_TROUBLE; } if ( !(list.optmask & _F_MASK) && !ident_files ) { if ( rewind_files () != EXIT_SUCCESS || set_file_pointers (&fp1, &fp2) != EXIT_SUCCESS ) { delete_string_vector (def_ifs); dismiss_mpa_support (&list); if ((list.ifs1)) delete_string_vector (list.ifs1); if ((list.ifs2)) delete_string_vector (list.ifs2); close_files (); return EXIT_TROUBLE; } test = cmp_files (fp1, fp2, &list); if ((list.optmask & _SS_MASK) && test <= 1) print_statistics (&list); } if (test == 0 && !qm) { if ((list.optmask & _F_MASK)) printf (_("\n+++ Files \"%s\" and \"%s\" have the same structure\n"), list.file1, list.file2); else printf (_("\n+++ Files \"%s\" and \"%s\" are equal\n"), list.file1, list.file2); } if (test == 1 && !qm) printf (_("\n+++ File \"%s\" differs from file \"%s\"\n"), list.file1, list.file2); erase_flags (); delete_string_vector (def_ifs); dismiss_mpa_support (&list); if ((list.ifs1)) delete_string_vector (list.ifs1); if ((list.ifs2)) delete_string_vector (list.ifs2); close_files (); return test; } } ./numdiff-5.8.1/aclocal.m40000644000175000017500000000121712215353073014166 0ustar ivanoivano# generated automatically by aclocal 1.10.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_include([m4/setmode.m4]) m4_include([m4/st_mtim.m4]) ./numdiff-5.8.1/configure0000755000175000017500000113353512215353073014247 0ustar ivanoivano#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.63 for Numdiff 5.8. # # Report bugs to <>. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 -n "${ZSH_VERSION+set}" && (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 `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; 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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (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 `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (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 `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell bug-autoconf@gnu.org about your system, echo including any error possibly output before this message. echo This can help us improve future autoconf versions. echo Configuration will now proceed without shell functions. } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Numdiff' PACKAGE_TARNAME='numdiff' PACKAGE_VERSION='5.8' PACKAGE_STRING='Numdiff 5.8' PACKAGE_BUGREPORT='' ac_unique_file="numdiff.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS SET_MAKE LIB_CLOCK_GETTIME INSTINFO FIND EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC 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 localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug enable_optimization enable_nls enable_gmp enable_largefile ' 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' 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=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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 ;; -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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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_echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$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_echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 { (exit 1); exit 1; }; } ;; *) $as_echo "$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 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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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_echo "$as_me: error: working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # 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 || $as_echo 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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 Numdiff 5.8 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] --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/numdiff] --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 Numdiff 5.8:";; 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-debug turn on debugging default=no --enable-optimization turn on basic optimization default=no --enable-nls turn on Natural Language Support default=yes --enable-gmp turn on use of GNU MP default=yes --disable-largefile omit support for large files 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 C/C++/Objective 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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 guested configure. 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 $as_echo "$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 Numdiff configure 5.8 generated by GNU Autoconf 2.63 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 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 Numdiff $as_me 5.8, which was generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. $as_echo "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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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= ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$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'; { (exit 1); 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 # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" 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. if test -f "$cache_file"; then { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file 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,) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$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 { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$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=`$as_echo "$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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_config_headers="$ac_config_headers config.h" if test "x$DBGFLAGS" = "x"; then DBGFLAGS="-g" fi if test "x$OPTFLAGS" = "x"; then OPTFLAGS="-O" fi CPPFLAGS="${CPPFLAGS:=}" CFLAGS="${CFLAGS:=}" LDFLAGS="${LDFLAGS:=}" LIBS="${LIBS:=}" CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H" if test "`$CPP -v < /dev/null 2>&1 | grep '/usr/local/include' 2>&1`" = ""; then CPPFLAGS="$CPPFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" 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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" $as_echo "$as_me:$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 fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; 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. { $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } ac_link_default=`$as_echo "$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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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+set}" = set && 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 ac_file='' fi { $as_echo "$as_me:$LINENO: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 $as_echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi fi fi { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; 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 { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) 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; } /* 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 don't provoke an error unfortunately, instead are silently treated as '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's necessary to write '\x00'==0 to get something that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _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" rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac 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 { $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "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+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } 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 { $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_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 test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_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_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_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 test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_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_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_minix_config_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 $as_echo_n "checking for minix/config.h... " >&6; } if test "${ac_cv_header_minix_config_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 $as_echo "$ac_cv_header_minix_config_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5 $as_echo_n "checking minix/config.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5 $as_echo_n "checking minix/config.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 $as_echo_n "checking for minix/config.h... " >&6; } if test "${ac_cv_header_minix_config_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_minix_config_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 $as_echo "$ac_cv_header_minix_config_h" >&6; } fi if test "x$ac_cv_header_minix_config_h" = x""yes; then MINIX=yes else MINIX= fi if test "$MINIX" = yes; then cat >>confdefs.h <<\_ACEOF #define _POSIX_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_1_SOURCE 2 _ACEOF cat >>confdefs.h <<\_ACEOF #define _MINIX 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test "${ac_cv_safe_to_define___extensions__+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_safe_to_define___extensions__=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && cat >>confdefs.h <<\_ACEOF #define __EXTENSIONS__ 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _ALL_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _GNU_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_PTHREAD_SEMANTICS 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _TANDEM_SOURCE 1 _ACEOF # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then enableval=$enable_debug; else enable_debug=no fi # Check whether --enable-optimization was given. if test "${enable_optimization+set}" = set; then enableval=$enable_optimization; else enable_optimization=no fi # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then enableval=$enable_nls; else enable_nls=yes fi # Check whether --enable-gmp was given. if test "${enable_gmp+set}" = set; then enableval=$enable_gmp; else enable_gmp=yes 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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" $as_echo "$as_me:$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 fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; 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 { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) 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; } /* 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 don't provoke an error unfortunately, instead are silently treated as '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's necessary to write '\x00'==0 to get something that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _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" rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac 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 "x$CC" != xcc; then { $as_echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -f conftest2.$ac_objext && { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -f conftest2.$ac_objext && { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } cat >>confdefs.h <<\_ACEOF #define NO_MINUS_C_MINUS_O 1 _ACEOF 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 { $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "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+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } 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 # Extract the first word of "find", so it can be a program name with args. set dummy find; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_FIND+set}" = set; then $as_echo_n "(cached) " >&6 else case $FIND in [\\/]* | ?:[\\/]*) ac_cv_path_FIND="$FIND" # 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_FIND="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FIND=$ac_cv_path_FIND if test -n "$FIND"; then { $as_echo "$as_me:$LINENO: result: $FIND" >&5 $as_echo "$FIND" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi for ac_prog in install-info ginstall-info do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INSTINFO+set}" = set; then $as_echo_n "(cached) " >&6 else case $INSTINFO in [\\/]* | ?:[\\/]*) ac_cv_path_INSTINFO="$INSTINFO" # 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INSTINFO="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INSTINFO=$ac_cv_path_INSTINFO if test -n "$INSTINFO"; then { $as_echo "$as_me:$LINENO: result: $INSTINFO" >&5 $as_echo "$INSTINFO" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$INSTINFO" && break done { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi if test $ac_cv_header_stdc = yes; then { $as_echo "$as_me:$LINENO: result: Ok! I have just found them." >&5 $as_echo "Ok! I have just found them." >&6; } else { { $as_echo "$as_me:$LINENO: error: Cannot find ANSI C header files!" >&5 $as_echo "$as_me: error: Cannot find ANSI C header files!" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if test "${ac_cv_header_stdbool_h+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; # if defined __xlc__ || defined __GNUC__ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 reported by James Lemley on 2005-10-05; see http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html This test is not quite right, since xlc is allowed to reject this program, as the initializer for xlcbug is not one of the forms that C requires support for. However, doing the test right would require a runtime test, and that would make cross-compilation harder. Let us hope that IBM fixes the xlc bug, and also adds support for this kind of constant expression. In the meantime, this test will reject xlc, which is OK, since our stdbool.h substitute should suffice. We also test this with GCC, where it should work, to detect more quickly whether someone messes up the test in the future. */ char digs[] = "0123456789"; int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); # endif /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdbool_h=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } { $as_echo "$as_me:$LINENO: checking for _Bool" >&5 $as_echo_n "checking for _Bool... " >&6; } if test "${ac_cv_type__Bool+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type__Bool=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (_Bool)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((_Bool))) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type__Bool=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5 $as_echo "$ac_cv_type__Bool" >&6; } if test "x$ac_cv_type__Bool" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_STDBOOL_H 1 _ACEOF fi for ac_header in fcntl.h locale.h stddef.h \ stdlib.h string.h sys/file.h time.h unistd.h wchar.h wctype.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_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 { $as_echo "$as_me:$LINENO: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { 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 rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_search_opendir=$ac_res else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 $as_echo "$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 { $as_echo "$as_me:$LINENO: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { 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 rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_search_opendir=$ac_res else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 $as_echo "$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 { $as_echo "$as_me:$LINENO: checking whether stat file-mode macros are broken" >&5 $as_echo_n "checking whether stat file-mode macros are broken... " >&6; } if test "${ac_cv_header_stat_broken+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stat_broken=no else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stat_broken" >&5 $as_echo "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then cat >>confdefs.h <<\_ACEOF #define STAT_MACROS_BROKEN 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if test "${ac_cv_header_sys_wait_h+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_sys_wait_h=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if test "${ac_cv_sys_largefile_CC+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_largefile_CC=' -n32'; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if test "${ac_cv_sys_file_offset_bits+set}" = set; then $as_echo_n "(cached) " >&6 else while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_file_offset_bits=no; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_file_offset_bits=64; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if test "${ac_cv_sys_large_files+set}" = set; then $as_echo_n "(cached) " >&6 else while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_large_files=no; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_large_files=1; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi { $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if test "${ac_cv_c_const+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* 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}; /* AIX 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. */ char *t; 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; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; 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 rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const /**/ _ACEOF fi { $as_echo "$as_me:$LINENO: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_inline=$ac_kw else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 $as_echo "$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 { $as_echo "$as_me:$LINENO: checking for variable-length arrays" >&5 $as_echo_n "checking for variable-length arrays... " >&6; } if test "${ac_cv_c_vararrays+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { static int x; char a[++x]; a[sizeof a - 1] = 0; return a[0]; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_vararrays=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_vararrays=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_vararrays" >&5 $as_echo "$ac_cv_c_vararrays" >&6; } if test $ac_cv_c_vararrays = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_C_VARARRAYS 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for size_t" >&5 $as_echo_n "checking for size_t... " >&6; } if test "${ac_cv_type_size_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_size_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (size_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((size_t))) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 $as_echo "$ac_cv_type_size_t" >&6; } if test "x$ac_cv_type_size_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for pid_t" >&5 $as_echo_n "checking for pid_t... " >&6; } if test "${ac_cv_type_pid_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_pid_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (pid_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((pid_t))) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 $as_echo "$ac_cv_type_pid_t" >&6; } if test "x$ac_cv_type_pid_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for ptrdiff_t" >&5 $as_echo_n "checking for ptrdiff_t... " >&6; } if test "${ac_cv_type_ptrdiff_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_ptrdiff_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (ptrdiff_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((ptrdiff_t))) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_ptrdiff_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_ptrdiff_t" >&5 $as_echo "$ac_cv_type_ptrdiff_t" >&6; } if test "x$ac_cv_type_ptrdiff_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define ptrdiff_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for ssize_t" >&5 $as_echo_n "checking for ssize_t... " >&6; } if test "${ac_cv_type_ssize_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_ssize_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (ssize_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((ssize_t))) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_ssize_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5 $as_echo "$ac_cv_type_ssize_t" >&6; } if test "x$ac_cv_type_ssize_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for struct stat.st_blksize" >&5 $as_echo_n "checking for struct stat.st_blksize... " >&6; } if test "${ac_cv_member_struct_stat_st_blksize+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (ac_aggr.st_blksize) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_blksize=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (sizeof ac_aggr.st_blksize) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_blksize=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_member_struct_stat_st_blksize=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_blksize" >&5 $as_echo "$ac_cv_member_struct_stat_st_blksize" >&6; } if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLKSIZE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_ST_BLKSIZE 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for struct stat.st_rdev" >&5 $as_echo_n "checking for struct stat.st_rdev... " >&6; } if test "${ac_cv_member_struct_stat_st_rdev+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (ac_aggr.st_rdev) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_rdev=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (sizeof ac_aggr.st_rdev) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_rdev=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_member_struct_stat_st_rdev=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_rdev" >&5 $as_echo "$ac_cv_member_struct_stat_st_rdev" >&6; } if test "x$ac_cv_member_struct_stat_st_rdev" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_RDEV 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_ST_RDEV 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for nanoseconds member of struct stat.st_mtim" >&5 $as_echo_n "checking for nanoseconds member of struct stat.st_mtim... " >&6; } if test "${ac_cv_struct_st_mtim_nsec+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_CPPFLAGS="$CPPFLAGS" ac_cv_struct_st_mtim_nsec=no # tv_nsec -- the usual case # _tv_nsec -- Solaris 2.6, if # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 # && !defined __EXTENSIONS__) # st__tim.tv_nsec -- UnixWare 2.1.2 for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { struct stat s; s.st_mtim.ST_MTIM_NSEC; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_struct_st_mtim_nsec=$ac_val; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done CPPFLAGS="$ac_save_CPPFLAGS" fi { $as_echo "$as_me:$LINENO: result: $ac_cv_struct_st_mtim_nsec" >&5 $as_echo "$ac_cv_struct_st_mtim_nsec" >&6; } if test $ac_cv_struct_st_mtim_nsec != no; then cat >>confdefs.h <<_ACEOF #define ST_MTIM_NSEC $ac_cv_struct_st_mtim_nsec _ACEOF fi if test "x$enable_gmp" = "xyes"; then { $as_echo "$as_me:$LINENO: checking for __gmpz_init in -lgmp" >&5 $as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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. */ #ifdef __cplusplus extern "C" #endif char __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gmp___gmpz_init=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gmp___gmpz_init=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gmp___gmpz_init" >&5 $as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } if test "x$ac_cv_lib_gmp___gmpz_init" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGMP 1 _ACEOF LIBS="-lgmp $LIBS" fi fi if test "x$enable_nls" = "xyes"; then { $as_echo "$as_me:$LINENO: checking for setlocale in -lintl" >&5 $as_echo_n "checking for setlocale in -lintl... " >&6; } if test "${ac_cv_lib_intl_setlocale+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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. */ #ifdef __cplusplus extern "C" #endif char setlocale (); int main () { return setlocale (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_intl_setlocale=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_setlocale=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_setlocale" >&5 $as_echo "$ac_cv_lib_intl_setlocale" >&6; } if test "x$ac_cv_lib_intl_setlocale" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL 1 _ACEOF LIBS="-lintl $LIBS" fi fi HAVE_VSPRINTF=0 { $as_echo "$as_me:$LINENO: checking for vsprintf" >&5 $as_echo_n "checking for vsprintf... " >&6; } if test "${ac_cv_func_vsprintf+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define vsprintf to an innocuous variant, in case declares vsprintf. For example, HP-UX 11i declares gettimeofday. */ #define vsprintf innocuous_vsprintf /* System header to define __stub macros and hopefully few prototypes, which can conflict with char vsprintf (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef vsprintf /* 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 vsprintf (); /* 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_vsprintf || defined __stub___vsprintf choke me #endif int main () { return vsprintf (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_vsprintf=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_vsprintf=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_vsprintf" >&5 $as_echo "$ac_cv_func_vsprintf" >&6; } if test "x$ac_cv_func_vsprintf" = x""yes; then HAVE_VSPRINTF=1 fi if test $HAVE_VSPRINTF = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of vsprintf() not present!" >&5 $as_echo "$as_me: error: Declaration of vsprintf() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! vsprintf() is declared." >&5 $as_echo "Ok! vsprintf() is declared." >&6; } fi HAVE_MEMSET=0 { $as_echo "$as_me:$LINENO: checking for memset" >&5 $as_echo_n "checking for memset... " >&6; } if test "${ac_cv_func_memset+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define memset to an innocuous variant, in case declares memset. For example, HP-UX 11i declares gettimeofday. */ #define memset innocuous_memset /* System header to define __stub macros and hopefully few prototypes, which can conflict with char memset (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef memset /* 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 memset (); /* 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_memset || defined __stub___memset choke me #endif int main () { return memset (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_memset=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_memset=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_memset" >&5 $as_echo "$ac_cv_func_memset" >&6; } if test "x$ac_cv_func_memset" = x""yes; then HAVE_MEMSET=1 fi if test $HAVE_MEMSET = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of memset() not present!" >&5 $as_echo "$as_me: error: Declaration of memset() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! memset() is declared." >&5 $as_echo "Ok! memset() is declared." >&6; } fi HAVE_MEMCHR=0 { $as_echo "$as_me:$LINENO: checking for memchr" >&5 $as_echo_n "checking for memchr... " >&6; } if test "${ac_cv_func_memchr+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define memchr to an innocuous variant, in case declares memchr. For example, HP-UX 11i declares gettimeofday. */ #define memchr innocuous_memchr /* System header to define __stub macros and hopefully few prototypes, which can conflict with char memchr (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef memchr /* 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 memchr (); /* 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_memchr || defined __stub___memchr choke me #endif int main () { return memchr (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_memchr=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_memchr=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_memchr" >&5 $as_echo "$ac_cv_func_memchr" >&6; } if test "x$ac_cv_func_memchr" = x""yes; then HAVE_MEMCHR=1 fi if test $HAVE_MEMCHR = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of memchr() not present!" >&5 $as_echo "$as_me: error: Declaration of memchr() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! memchr() is declared." >&5 $as_echo "Ok! memchr() is declared." >&6; } fi HAVE_STRERROR=0 { $as_echo "$as_me:$LINENO: checking for strerror" >&5 $as_echo_n "checking for strerror... " >&6; } if test "${ac_cv_func_strerror+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define strerror to an innocuous variant, in case declares strerror. For example, HP-UX 11i declares gettimeofday. */ #define strerror innocuous_strerror /* System header to define __stub macros and hopefully few prototypes, which can conflict with char strerror (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef strerror /* 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 strerror (); /* 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_strerror || defined __stub___strerror choke me #endif int main () { return strerror (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_strerror=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_strerror=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strerror" >&5 $as_echo "$ac_cv_func_strerror" >&6; } if test "x$ac_cv_func_strerror" = x""yes; then HAVE_STRERROR=1 fi if test $HAVE_STRERROR = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of strerror() not present!" >&5 $as_echo "$as_me: error: Declaration of strerror() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! strerror() is declared." >&5 $as_echo "Ok! strerror() is declared." >&6; } fi HAVE_STRSPN=0 { $as_echo "$as_me:$LINENO: checking for strspn" >&5 $as_echo_n "checking for strspn... " >&6; } if test "${ac_cv_func_strspn+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define strspn to an innocuous variant, in case declares strspn. For example, HP-UX 11i declares gettimeofday. */ #define strspn innocuous_strspn /* System header to define __stub macros and hopefully few prototypes, which can conflict with char strspn (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef strspn /* 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 strspn (); /* 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_strspn || defined __stub___strspn choke me #endif int main () { return strspn (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_strspn=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_strspn=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strspn" >&5 $as_echo "$ac_cv_func_strspn" >&6; } if test "x$ac_cv_func_strspn" = x""yes; then HAVE_STRSPN=1 fi if test $HAVE_STRSPN = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of strspn() not present!" >&5 $as_echo "$as_me: error: Declaration of strspn() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! strspn() is declared." >&5 $as_echo "Ok! strspn() is declared." >&6; } fi HAVE_STRCSPN=0 { $as_echo "$as_me:$LINENO: checking for strcspn" >&5 $as_echo_n "checking for strcspn... " >&6; } if test "${ac_cv_func_strcspn+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define strcspn to an innocuous variant, in case declares strcspn. For example, HP-UX 11i declares gettimeofday. */ #define strcspn innocuous_strcspn /* System header to define __stub macros and hopefully few prototypes, which can conflict with char strcspn (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef strcspn /* 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 strcspn (); /* 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_strcspn || defined __stub___strcspn choke me #endif int main () { return strcspn (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_strcspn=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_strcspn=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strcspn" >&5 $as_echo "$ac_cv_func_strcspn" >&6; } if test "x$ac_cv_func_strcspn" = x""yes; then HAVE_STRCSPN=1 fi if test $HAVE_STRCSPN = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of strcspn() not present!" >&5 $as_echo "$as_me: error: Declaration of strcspn() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! strcspn() is declared." >&5 $as_echo "Ok! strcspn() is declared." >&6; } fi { $as_echo "$as_me:$LINENO: checking whether strerror_r is declared" >&5 $as_echo_n "checking whether strerror_r is declared... " >&6; } if test "${ac_cv_have_decl_strerror_r+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef strerror_r (void) strerror_r; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_strerror_r=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_strerror_r=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror_r" >&5 $as_echo "$ac_cv_have_decl_strerror_r" >&6; } if test "x$ac_cv_have_decl_strerror_r" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR_R 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR_R 0 _ACEOF fi for ac_func in strerror_r do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* 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 $ac_func (); /* 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_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:$LINENO: checking whether strerror_r returns char *" >&5 $as_echo_n "checking whether strerror_r returns char *... " >&6; } if test "${ac_cv_func_strerror_r_char_p+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_func_strerror_r_char_p=no if test $ac_cv_have_decl_strerror_r = yes; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); char *p = strerror_r (0, buf, sizeof buf); return !p || x; ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_func_strerror_r_char_p=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else # strerror_r is not declared. Choose between # systems that have relatively inaccessible declarations for the # function. BeOS and DEC UNIX 4.0 fall in this category, but the # former has a strerror_r that returns char*, while the latter # has a strerror_r that returns `int'. # This test should segfault on the DEC system. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default extern char *strerror_r (); int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); return ! isalpha (x); ; return 0; } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_strerror_r_char_p=yes else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strerror_r_char_p" >&5 $as_echo "$ac_cv_func_strerror_r_char_p" >&6; } if test $ac_cv_func_strerror_r_char_p = yes; then cat >>confdefs.h <<\_ACEOF #define STRERROR_R_CHAR_P 1 _ACEOF fi for ac_header in vfork.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in fork vfork do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* 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 $ac_func (); /* 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_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:$LINENO: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if test "${ac_cv_func_fork_works+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then ac_cv_func_fork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_fork_works=yes else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_fork_works=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:$LINENO: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if test "${ac_cv_func_vfork_works+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then ac_cv_func_vfork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_vfork_works=yes else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_vfork_works=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_VFORK 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define vfork fork _ACEOF fi if test "x$ac_cv_func_fork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_FORK 1 _ACEOF fi for ac_func in localeconv gettimeofday isascii setlocale strchr strftime waitpid do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* 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 $ac_func (); /* 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_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # setmode DOS ? for ac_header in fcntl.h unistd.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:$LINENO: checking for DOS-style setmode" >&5 $as_echo_n "checking for DOS-style setmode... " >&6; } if test "${ac_cv_func_setmode_dos+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if HAVE_FCNTL_H # include #endif #if HAVE_UNISTD_H # include #endif int main () { int ret = setmode && setmode (1, O_BINARY); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_setmode_dos=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_setmode_dos=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_setmode_dos" >&5 $as_echo "$ac_cv_func_setmode_dos" >&6; } if test $ac_cv_func_setmode_dos = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SETMODE_DOS 1 _ACEOF fi # Check for clock_gettime and its library. Solaris puts it in -lrt or # -lposix4, but we don't want to link that library unless we have to. diff_saved_libs=$LIBS { $as_echo "$as_me:$LINENO: checking for library containing clock_gettime" >&5 $as_echo_n "checking for library containing clock_gettime... " >&6; } if test "${ac_cv_search_clock_gettime+set}" = set; then $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF for ac_lib in '' rt posix4; 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 rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_search_clock_gettime=$ac_res else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_clock_gettime+set}" = set; then break fi done if test "${ac_cv_search_clock_gettime+set}" = set; then : else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_search_clock_gettime" >&5 $as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi case $ac_cv_search_clock_gettime in no | 'none required') LIB_CLOCK_GETTIME=;; *) LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime;; esac for ac_func in clock_gettime do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* 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 $ac_func (); /* 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_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS=$diff_saved_libs cat >>confdefs.h <<\_ACEOF #define USE_UNLOCKED_IO 1 _ACEOF { $as_echo "$as_me:$LINENO: checking whether clearerr_unlocked is declared" >&5 $as_echo_n "checking whether clearerr_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_clearerr_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef clearerr_unlocked (void) clearerr_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_clearerr_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_clearerr_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_clearerr_unlocked" >&5 $as_echo "$ac_cv_have_decl_clearerr_unlocked" >&6; } if test "x$ac_cv_have_decl_clearerr_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_CLEARERR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_CLEARERR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5 $as_echo_n "checking whether feof_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef feof_unlocked (void) feof_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_feof_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_feof_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5 $as_echo "$ac_cv_have_decl_feof_unlocked" >&6; } if test "x$ac_cv_have_decl_feof_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEOF_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEOF_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether ferror_unlocked is declared" >&5 $as_echo_n "checking whether ferror_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_ferror_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef ferror_unlocked (void) ferror_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_ferror_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_ferror_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ferror_unlocked" >&5 $as_echo "$ac_cv_have_decl_ferror_unlocked" >&6; } if test "x$ac_cv_have_decl_ferror_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FERROR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FERROR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fflush_unlocked is declared" >&5 $as_echo_n "checking whether fflush_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fflush_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fflush_unlocked (void) fflush_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fflush_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fflush_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fflush_unlocked" >&5 $as_echo "$ac_cv_have_decl_fflush_unlocked" >&6; } if test "x$ac_cv_have_decl_fflush_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FFLUSH_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FFLUSH_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5 $as_echo_n "checking whether fgets_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fgets_unlocked (void) fgets_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fgets_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fgets_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5 $as_echo "$ac_cv_have_decl_fgets_unlocked" >&6; } if test "x$ac_cv_have_decl_fgets_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FGETS_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FGETS_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fputc_unlocked is declared" >&5 $as_echo_n "checking whether fputc_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fputc_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fputc_unlocked (void) fputc_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fputc_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fputc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputc_unlocked" >&5 $as_echo "$ac_cv_have_decl_fputc_unlocked" >&6; } if test "x$ac_cv_have_decl_fputc_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTC_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTC_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fputs_unlocked is declared" >&5 $as_echo_n "checking whether fputs_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fputs_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fputs_unlocked (void) fputs_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fputs_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fputs_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputs_unlocked" >&5 $as_echo "$ac_cv_have_decl_fputs_unlocked" >&6; } if test "x$ac_cv_have_decl_fputs_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTS_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTS_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fread_unlocked is declared" >&5 $as_echo_n "checking whether fread_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fread_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fread_unlocked (void) fread_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fread_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fread_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fread_unlocked" >&5 $as_echo "$ac_cv_have_decl_fread_unlocked" >&6; } if test "x$ac_cv_have_decl_fread_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREAD_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREAD_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fwrite_unlocked is declared" >&5 $as_echo_n "checking whether fwrite_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fwrite_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fwrite_unlocked (void) fwrite_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fwrite_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fwrite_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fwrite_unlocked" >&5 $as_echo "$ac_cv_have_decl_fwrite_unlocked" >&6; } if test "x$ac_cv_have_decl_fwrite_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FWRITE_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FWRITE_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5 $as_echo_n "checking whether getc_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef getc_unlocked (void) getc_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_getc_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_getc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5 $as_echo "$ac_cv_have_decl_getc_unlocked" >&6; } if test "x$ac_cv_have_decl_getc_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether getchar_unlocked is declared" >&5 $as_echo_n "checking whether getchar_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_getchar_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef getchar_unlocked (void) getchar_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_getchar_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_getchar_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_getchar_unlocked" >&5 $as_echo "$ac_cv_have_decl_getchar_unlocked" >&6; } if test "x$ac_cv_have_decl_getchar_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETCHAR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETCHAR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether putc_unlocked is declared" >&5 $as_echo_n "checking whether putc_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_putc_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef putc_unlocked (void) putc_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_putc_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_putc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_putc_unlocked" >&5 $as_echo "$ac_cv_have_decl_putc_unlocked" >&6; } if test "x$ac_cv_have_decl_putc_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTC_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTC_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether putchar_unlocked is declared" >&5 $as_echo_n "checking whether putchar_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_putchar_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef putchar_unlocked (void) putchar_unlocked; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_putchar_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_putchar_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_putchar_unlocked" >&5 $as_echo "$ac_cv_have_decl_putchar_unlocked" >&6; } if test "x$ac_cv_have_decl_putchar_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTCHAR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTCHAR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether strerror is declared" >&5 $as_echo_n "checking whether strerror is declared... " >&6; } if test "${ac_cv_have_decl_strerror+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef strerror (void) strerror; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_strerror=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_strerror=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror" >&5 $as_echo "$ac_cv_have_decl_strerror" >&6; } if test "x$ac_cv_have_decl_strerror" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR 0 _ACEOF fi if test "x$enable_gmp" = "xno"; then CPPFLAGS="$CPPFLAGS -DDISABLE_GMP " fi if test "x$enable_nls" = "xyes"; then CPPFLAGS="$CPPFLAGS -DENABLE_NLS " fi if test "x$enable_debug" = "xyes"; then CFLAGS="$CFLAGS $DBGFLAGS " fi if test "x$enable_optimization" = "xyes"; then CFLAGS="$CFLAGS $OPTFLAGS " fi { $as_echo "$as_me:$LINENO: result: Configuration terminated with success:" >&5 $as_echo "Configuration terminated with success:" >&6; } { $as_echo "$as_me:$LINENO: result: Preprocessor flags = \"$CPPFLAGS\"" >&5 $as_echo "Preprocessor flags = \"$CPPFLAGS\"" >&6; } { $as_echo "$as_me:$LINENO: result: Compiler flags = \"$CFLAGS\"" >&5 $as_echo "Compiler flags = \"$CFLAGS\"" >&6; } { $as_echo "$as_me:$LINENO: result: Linker flags = \"$LDFLAGS\"" >&5 $as_echo "Linker flags = \"$LDFLAGS\"" >&6; } { $as_echo "$as_me:$LINENO: result: Libraries = \"$LIBS\"" >&5 $as_echo "Libraries = \"$LIBS\"" >&6; } { $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else 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 fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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= ;; #( *) $as_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+set}" = set || &/ 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 test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$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= 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=`$as_echo "$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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$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" { $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF || ac_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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (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 `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; 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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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 Numdiff $as_me 5.8, which was generated by GNU Autoconf 2.63. 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 from templates according to the current configuration. Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ Numdiff config.status 5.8 configured by $0, generated by GNU Autoconf 2.63, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2008 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' 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=$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 ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { $as_echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) $as_echo "$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_echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 \$as_echo "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 $as_echo "$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_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # 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=' ' 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 {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 $as_echo "$as_me: error: could not setup config files machinery" >&2;} { (exit 1); exit 1; }; } _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// 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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 $as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 $as_echo "$as_me: error: could not setup config headers machinery" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} { (exit 1); exit 1; }; };; :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac ac_file_inputs="$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 '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; 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 || $as_echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$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 || $as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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@*) { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$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 "$tmp/subs.awk" >$tmp/out \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 $as_echo "$as_me: error: could not create -" >&2;} { (exit 1); exit 1; }; } fi ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 $as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } # 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 || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ./numdiff-5.8.1/xmalloc.c0000644000175000017500000000646212215353073014140 0ustar ivanoivano/* xmalloc.c -- malloc with out of memory checking Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006 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 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #if ! HAVE_INLINE # define static_inline #endif #include "xalloc.h" #undef static_inline #include #include #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif /* 1 if calloc is known to be compatible with GNU calloc. This matters if we are not also using the calloc module, which defines HAVE_CALLOC and supports the GNU API even on non-GNU platforms. */ #if defined HAVE_CALLOC || defined __GLIBC__ enum { HAVE_GNU_CALLOC = 1 }; #else enum { HAVE_GNU_CALLOC = 0 }; #endif /* Allocate N bytes of memory dynamically, with error checking. */ void * xmalloc (size_t n) { void *p = malloc (n); if (!p && n != 0) xalloc_die (); return p; } /* Change the size of an allocated block of memory P to N bytes, with error checking. */ void * xrealloc (void *p, size_t n) { p = realloc (p, n); if (!p && n != 0) xalloc_die (); return p; } /* If P is null, allocate a block of at least *PN bytes; otherwise, reallocate P so that it contains more than *PN bytes. *PN must be nonzero unless P is null. Set *PN to the new block's size, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. */ void * x2realloc (void *p, size_t *pn) { return x2nrealloc (p, pn, 1); } /* Allocate S bytes of zeroed memory dynamically, with error checking. There's no need for xnzalloc (N, S), since it would be equivalent to xcalloc (N, S). */ void * xzalloc (size_t s) { return memset (xmalloc (s), 0, s); } /* Allocate zeroed memory for N elements of S bytes, with error checking. S must be nonzero. */ void * xcalloc (size_t n, size_t s) { void *p; /* Test for overflow, since some calloc implementations don't have proper overflow checks. But omit overflow and size-zero tests if HAVE_GNU_CALLOC, since GNU calloc catches overflow and never returns NULL if successful. */ if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s)) || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0))) xalloc_die (); return p; } /* Clone an object P of size S, with error checking. There's no need for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any need for an arithmetic overflow check. */ void * xmemdup (void const *p, size_t s) { return memcpy (xmalloc (s), p, s); } /* Clone STRING. */ char * xstrdup (char const *string) { return xmemdup (string, strlen (string) + 1); } ./numdiff-5.8.1/gettext.h0000644000175000017500000000653512215353073014173 0ustar ivanoivano/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004 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 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; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String #endif /* _LIBGETTEXT_H */ ./numdiff-5.8.1/errors.c0000444000175000017500000000447512215353073014015 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include #include #include "number.h" #ifndef STDC_HEADERS #define VARARGS 1 #else #undef VARARGS #endif #ifndef VARARGS #include #else #include #endif /* Other things for number.c. */ /* int std_only; */ void out_of_memory() { fprintf (stderr, _("%s: insufficient memory for new allocation,\nthe execution of the program ends now\n"), PACKAGE); exit (EXIT_TROUBLE); } /* Runtime error will print a message and stop the machine. */ #ifndef VARARGS #ifdef __STDC__ void rt_error (char *mesg, ...) #else void rt_error (mesg) char *mesg; #endif #else void rt_error (mesg, va_alist) char *mesg; #endif { va_list args; char error_mesg [255]; #ifndef VARARGS va_start (args, mesg); #else va_start (args); #endif vsprintf (error_mesg, mesg, args); va_end (args); fprintf (stderr, _("Runtime error: %s\n"), error_mesg); exit (EXIT_TROUBLE); } /* A runtime warning tells of some action taken by the processor that may change the program execution but was not enough of a problem to stop the execution. */ #ifndef VARARGS #ifdef __STDC__ void rt_warn (char *mesg, ...) #else void rt_warn (mesg) char *mesg; #endif #else void rt_warn (mesg, va_alist) char *mesg; #endif { va_list args; char error_mesg [255]; #ifndef VARARGS va_start (args, mesg); #else va_start (args); #endif vsprintf (error_mesg, mesg, args); va_end (args); fprintf (stderr, _("Runtime warning: %s\n"), error_mesg); } ./numdiff-5.8.1/po/0000777000175000017500000000000012215353073012747 5ustar ivanoivano./numdiff-5.8.1/po/ndselect/0000777000175000017500000000000012215353073014550 5ustar ivanoivano./numdiff-5.8.1/po/ndselect/it.po0000644000175000017500000002170612215353073015526 0ustar ivanoivano# Italian messages for ndselect # Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi # This file is distributed under the same license as the Numdiff program. # Ivano Primi , 2013. # msgid "" msgstr "" "Project-Id-Version: numdiff 5.8.1 (ndselect 5.8.1)\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2013-08-07 15:35+0200\n" "PO-Revision-Date: 2013-09-15 17:42+0200\n" "Last-Translator: Ivano Primi \n" "Language-Team: ITALIAN \n" "Language: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0;\n" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "%s: l'opzione `%s' è ambigua\n" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "%s: l'opzione `--%s' non vuole argomenti\n" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "%s: l'opzione `%c%s' non vuole argomenti\n" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "%s: l'opzione `%s' ha bisogno di un argomento\n" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "%s: l'opzione `--%s' risulta sconosciuta\n" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "%s: l'opzione `%c%s' risulta sconosciuta\n" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "%s: opzione inammissibile -- %c\n" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "%s: opzione non valida -- %c\n" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: opzione con argomento obbligatorio -- %c\n" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "%s: l'opzione `-W %s' è ambigua\n" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "%s: l'opzione `-W %s' non vuole argomenti\n" #: ndselect.c:168 msgid "Ivano Primi" msgstr "Ivano Primi" #: ndselect.c:169 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licenza GPLv3+: GNU GPL versione 3 o successiva,\n" "vedi .\n" "Questo è software libero: sei libero di modificarlo e redistribuirlo.\n" "NON viene data NESSUNA GARANZIA, nella misura consentita dalle leggi " "vigenti.\n" #: ndselect.c:179 msgid "Usage:" msgstr "Uso:" #: ndselect.c:180 msgid "or" msgstr "oppure" #: ndselect.c:183 #, c-format msgid "" "\n" "Print to standard output a subset of lines and fields from a given file.\n" msgstr "" "\n" "Stampa sullo standard output (schermo) un sottinsieme\n" "di linee e campi di un file dato.\n" #: ndselect.c:185 msgid "The argument after the options is the name of the file to read from." msgstr "L'argomento dopo le opzioni è il nome del file da cui leggere." #: ndselect.c:186 msgid "" "The complete path of the file should be given,\n" "a directory name is not accepted." msgstr "" "È bene fornire il percorso completo del file,\n" "un nome di cartella non viene accettato." #: ndselect.c:187 msgid "" "If no input file is specified, the program reads from the standard input." msgstr "" "Se non si specifica il file da leggere, il programma prende i dati\n" "dallo standard input." #: ndselect.c:188 msgid "Exit status: 0 in case of normal termination, -1 (255) in case of error" msgstr "" "Codice di uscita: 0 in caso di conclusione regolare, -1 (255) su errore" #: ndselect.c:190 msgid "Set to N the number of the first line to print" msgstr "Imposta al valore N il numero della prima linea da stampare" #: ndselect.c:191 msgid "(The default behavior is to start with line number 1)" msgstr "(L'azione predefinita è di stampare dalla linea numero 1)" #: ndselect.c:193 msgid "Set to N the number of the last line that can be printed" msgstr "Imposta al valore N il numero dell'ultima linea stampabile" #: ndselect.c:194 msgid "(The default behavior is to arrive till to the end of the file)" msgstr "(L'azione predefinita è di arrivare fino alla fine del file)" #: ndselect.c:196 msgid "Set to N the increment to use when selecting the lines to print" msgstr "Imposta al valore N il passo con cui selezionare le linee da stampare" #: ndselect.c:197 ndselect.c:206 msgid "(The default value for the increment is 1)" msgstr "(Il valore predefinito per il passo è 1)" #: ndselect.c:199 msgid "Set to N the number of the first field to print" msgstr "Imposta al valore N il numero del primo campo da stampare" #: ndselect.c:200 msgid "(The default behavior is to start with field number 1)" msgstr "(L'azione predefinita è di stampare dal campo numero 1)" #: ndselect.c:202 msgid "Set to N the number of the last field that can be printed" msgstr "Imposta al valore N il numero dell'ultimo campo stampabile" #: ndselect.c:203 msgid "(The default behavior is to arrive till to the end of every line)" msgstr "(L'azione predefinita è di arrivare fino alla fine di ogni linea)" #: ndselect.c:205 msgid "Set to N the increment to use when selecting the fields to print" msgstr "Imposta al valore N il passo con cui selezionare i campi da stampare" #: ndselect.c:208 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme dei caratteri da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: ndselect.c:209 ndselect.c:212 msgid "(The default set of delimiters is space, tab and newline)" msgstr "(L'insieme predefinito è spazio bianco, tabulazione e nuova linea)" #: ndselect.c:211 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme delle stringhe da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: ndselect.c:214 msgid "" "Specify the string to use as separator\n" " while writing the selected fields to the standard output" msgstr "" "Specifica la stringa da usare come separatore al momento\n" " di scrivere i campi selezionati sullo standard output (schermo)" #: ndselect.c:215 msgid "" "(The default behavior consists in reusing\n" " the delimiters found in the input lines)" msgstr "" "(L'azione predefinita consiste nel riutilizzare\n" " i separatori trovati nelle linee di input)" #: ndselect.c:217 msgid "Do not print empty lines" msgstr "Non stampare linee vuote" #: ndselect.c:219 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" "Reindirizza avvertimenti e messaggi di errore\n" " dallo standard error (schermo) al file indicato" #: ndselect.c:221 msgid "Redirect output from stdout to the indicated file" msgstr "Reindirizza l'output dallo standard output (schermo) al file indicato" #: ndselect.c:222 msgid "Show this help message" msgstr "Mostra questo messaggio di aiuto" #: ndselect.c:223 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" "Mostra numero di versione, Copyright,\n" " termini di distribuzione e NON-Garanzia" #: ndselect.c:287 ndselect.c:301 ndselect.c:315 ndselect.c:329 ndselect.c:343 #: ndselect.c:357 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "%s: un argomento non valido segue l'opzione `-%c'\n" #: ndselect.c:371 ndselect.c:397 ndselect.c:423 ndselect.c:488 #, c-format msgid "%s: memory exhausted\n" msgstr "%s: memoria esaurita\n" #: ndselect.c:376 ndselect.c:402 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "%s: un argomento non valido segue l'opzione `-%c':\n" #: ndselect.c:378 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere il carattere di nuova linea ('\\n')\n" #: ndselect.c:404 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\")\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere la stringa di nuova linea (\"\\n\")\n" #: ndselect.c:435 ndselect.c:444 ndselect.c:515 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "%s: impossibile aprire il file \"%s\":\n" #: ndselect.c:519 #, c-format msgid "%s: cannot close file \"%s\":\n" msgstr "%s: è stato impossibile chiudere il file \"%s\":\n" #: ndselect.c:523 #, c-format msgid "" "%s: Error occurred while reading from file \"%s\"\n" "\n" msgstr "" "%s: Errore di lettura dal file \"%s\"\n" "\n" ./numdiff-5.8.1/po/ndselect/ndselect.pot0000644000175000017500000001331612215353073017075 0ustar ivanoivano# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: ndselect 5.8.1\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2013-08-07 15:35+0200\n" "PO-Revision-Date: 2013-09-15 17:42+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "" #: ndselect.c:168 msgid "Ivano Primi" msgstr "" #: ndselect.c:169 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: ndselect.c:179 msgid "Usage:" msgstr "" #: ndselect.c:180 msgid "or" msgstr "" #: ndselect.c:183 #, c-format msgid "" "\n" "Print to standard output a subset of lines and fields from a given file.\n" msgstr "" #: ndselect.c:185 msgid "The argument after the options is the name of the file to read from." msgstr "" #: ndselect.c:186 msgid "" "The complete path of the file should be given,\n" "a directory name is not accepted." msgstr "" #: ndselect.c:187 msgid "" "If no input file is specified, the program reads from the standard input." msgstr "" #: ndselect.c:188 msgid "Exit status: 0 in case of normal termination, -1 (255) in case of error" msgstr "" #: ndselect.c:190 msgid "Set to N the number of the first line to print" msgstr "" #: ndselect.c:191 msgid "(The default behavior is to start with line number 1)" msgstr "" #: ndselect.c:193 msgid "Set to N the number of the last line that can be printed" msgstr "" #: ndselect.c:194 msgid "(The default behavior is to arrive till to the end of the file)" msgstr "" #: ndselect.c:196 msgid "Set to N the increment to use when selecting the lines to print" msgstr "" #: ndselect.c:197 ndselect.c:206 msgid "(The default value for the increment is 1)" msgstr "" #: ndselect.c:199 msgid "Set to N the number of the first field to print" msgstr "" #: ndselect.c:200 msgid "(The default behavior is to start with field number 1)" msgstr "" #: ndselect.c:202 msgid "Set to N the number of the last field that can be printed" msgstr "" #: ndselect.c:203 msgid "(The default behavior is to arrive till to the end of every line)" msgstr "" #: ndselect.c:205 msgid "Set to N the increment to use when selecting the fields to print" msgstr "" #: ndselect.c:208 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: ndselect.c:209 ndselect.c:212 msgid "(The default set of delimiters is space, tab and newline)" msgstr "" #: ndselect.c:211 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: ndselect.c:214 msgid "" "Specify the string to use as separator\n" " while writing the selected fields to the standard output" msgstr "" #: ndselect.c:215 msgid "" "(The default behavior consists in reusing\n" " the delimiters found in the input lines)" msgstr "" #: ndselect.c:217 msgid "Do not print empty lines" msgstr "" #: ndselect.c:219 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" #: ndselect.c:221 msgid "Redirect output from stdout to the indicated file" msgstr "" #: ndselect.c:222 msgid "Show this help message" msgstr "" #: ndselect.c:223 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" #: ndselect.c:287 ndselect.c:301 ndselect.c:315 ndselect.c:329 ndselect.c:343 #: ndselect.c:357 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "" #: ndselect.c:371 ndselect.c:397 ndselect.c:423 ndselect.c:488 #, c-format msgid "%s: memory exhausted\n" msgstr "" #: ndselect.c:376 ndselect.c:402 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "" #: ndselect.c:378 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" #: ndselect.c:404 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\")\n" msgstr "" #: ndselect.c:435 ndselect.c:444 ndselect.c:515 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "" #: ndselect.c:519 #, c-format msgid "%s: cannot close file \"%s\":\n" msgstr "" #: ndselect.c:523 #, c-format msgid "" "%s: Error occurred while reading from file \"%s\"\n" "\n" msgstr "" ./numdiff-5.8.1/po/ndselect/it.mo0000644000175000017500000001620312215353073015517 0ustar ivanoivanoÞ•2¬C<HJIf”cû1_‘®Ê(ä) 7Q,g”%²,Ø- 3&T{›W»A?U6•5Ì9 *< g G€ IÈ  Í 1ì E @d ?¥ /å . 9D 8~ · BÎ b _t cÔ D8P}ÎÕ¥ØY~uØsN%Â0è% ?2`3“Çå)û%.D)s*!È-ê))B_lBÌ=8M:†CÁ)/GHX éïõFåb,DEÔ9;T::Ë Q'sytí|b?ßWw|)#$/!% (0 ,"2+.* 1 &- ' Print to standard output a subset of lines and fields from a given file. The list of field delimiters cannot be empty and must always include the newline character ('\n') The list of field delimiters cannot be empty and must always include the newline string ("\n") %s: Error occurred while reading from file "%s" %s: cannot close file "%s": %s: cannot open file "%s": %s: illegal option -- %c %s: invalid argument after `-%c' option %s: invalid argument after `-%c' option: %s: invalid option -- %c %s: memory exhausted %s: option `%c%s' doesn't allow an argument %s: option `%s' is ambiguous %s: option `%s' requires an argument %s: option `--%s' doesn't allow an argument %s: option `-W %s' doesn't allow an argument %s: option `-W %s' is ambiguous %s: option requires an argument -- %c %s: unrecognized option `%c%s' %s: unrecognized option `--%s' (The default behavior consists in reusing the delimiters found in the input lines)(The default behavior is to arrive till to the end of every line)(The default behavior is to arrive till to the end of the file)(The default behavior is to start with field number 1)(The default behavior is to start with line number 1)(The default set of delimiters is space, tab and newline)(The default value for the increment is 1)Do not print empty linesExit status: 0 in case of normal termination, -1 (255) in case of errorIf no input file is specified, the program reads from the standard input.Ivano PrimiLicense GPLv3+: GNU GPL version 3 or later, see . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Redirect output from stdout to the indicated fileRedirect warning and error messages from stderr to the indicated fileSet to N the increment to use when selecting the fields to printSet to N the increment to use when selecting the lines to printSet to N the number of the first field to printSet to N the number of the first line to printSet to N the number of the last field that can be printedSet to N the number of the last line that can be printedShow this help messageShow version number, Copyright, Distribution Terms and NO-WarrantySpecify the set of characters to use as delimiters while splitting the input lines into fieldsSpecify the set of strings to use as delimiters while splitting the input lines into fieldsSpecify the string to use as separator while writing the selected fields to the standard outputThe argument after the options is the name of the file to read from.The complete path of the file should be given, a directory name is not accepted.Usage:orProject-Id-Version: numdiff 5.8.1 (ndselect 5.8.1) Report-Msgid-Bugs-To: ivprimi@libero.it POT-Creation-Date: 2013-08-07 15:35+0200 PO-Revision-Date: 2013-09-15 17:42+0200 Last-Translator: Ivano Primi Language-Team: ITALIAN Language: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0; Stampa sullo standard output (schermo) un sottinsieme di linee e campi di un file dato. La lista di separatori di campo non può essere vuota e deve sempre includere il carattere di nuova linea ('\n') La lista di separatori di campo non può essere vuota e deve sempre includere la stringa di nuova linea ("\n") %s: Errore di lettura dal file "%s" %s: è stato impossibile chiudere il file "%s": %s: impossibile aprire il file "%s": %s: opzione inammissibile -- %c %s: un argomento non valido segue l'opzione `-%c' %s: un argomento non valido segue l'opzione `-%c': %s: opzione non valida -- %c %s: memoria esaurita %s: l'opzione `%c%s' non vuole argomenti %s: l'opzione `%s' è ambigua %s: l'opzione `%s' ha bisogno di un argomento %s: l'opzione `--%s' non vuole argomenti %s: l'opzione `-W %s' non vuole argomenti %s: l'opzione `-W %s' è ambigua %s: opzione con argomento obbligatorio -- %c %s: l'opzione `%c%s' risulta sconosciuta %s: l'opzione `--%s' risulta sconosciuta (L'azione predefinita consiste nel riutilizzare i separatori trovati nelle linee di input)(L'azione predefinita è di arrivare fino alla fine di ogni linea)(L'azione predefinita è di arrivare fino alla fine del file)(L'azione predefinita è di stampare dal campo numero 1)(L'azione predefinita è di stampare dalla linea numero 1)(L'insieme predefinito è spazio bianco, tabulazione e nuova linea)(Il valore predefinito per il passo è 1)Non stampare linee vuoteCodice di uscita: 0 in caso di conclusione regolare, -1 (255) su erroreSe non si specifica il file da leggere, il programma prende i dati dallo standard input.Ivano PrimiLicenza GPLv3+: GNU GPL versione 3 o successiva, vedi . Questo è software libero: sei libero di modificarlo e redistribuirlo. NON viene data NESSUNA GARANZIA, nella misura consentita dalle leggi vigenti. Reindirizza l'output dallo standard output (schermo) al file indicatoReindirizza avvertimenti e messaggi di errore dallo standard error (schermo) al file indicatoImposta al valore N il passo con cui selezionare i campi da stampareImposta al valore N il passo con cui selezionare le linee da stampareImposta al valore N il numero del primo campo da stampareImposta al valore N il numero della prima linea da stampareImposta al valore N il numero dell'ultimo campo stampabileImposta al valore N il numero dell'ultima linea stampabileMostra questo messaggio di aiutoMostra numero di versione, Copyright, termini di distribuzione e NON-GaranziaSpecifica l'insieme dei caratteri da usare come separatori al momento di suddividere le linee di input in campiSpecifica l'insieme delle stringhe da usare come separatori al momento di suddividere le linee di input in campiSpecifica la stringa da usare come separatore al momento di scrivere i campi selezionati sullo standard output (schermo)L'argomento dopo le opzioni è il nome del file da cui leggere.È bene fornire il percorso completo del file, un nome di cartella non viene accettato.Uso:oppure./numdiff-5.8.1/po/numdiff/0000777000175000017500000000000012215353073014377 5ustar ivanoivano./numdiff-5.8.1/po/numdiff/it.po0000644000175000017500000010264012215353073015352 0ustar ivanoivano# Italian messages for numdiff # Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi # This file is distributed under the same license as the Numdiff program. # Ivano Primi , 2013. # msgid "" msgstr "" "Project-Id-Version: numdiff 5.8.1\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2013-08-07 15:35+0200\n" "PO-Revision-Date: 2013-09-15 17:43+0200\n" "Last-Translator: Ivano Primi \n" "Language-Team: ITALIAN \n" "Language: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0;\n" #: cmpfns.c:277 cmpfns.c:293 cmpfns.c:347 cmpfns.c:363 #, c-format msgid "" "@ Line %lu in file \"%s\"\n" " contains too many fields to be properly processed!\n" msgstr "" "@ La linea %lu nel file \"%s\"\n" " contiene troppi campi per essere elaborata correttamente!\n" #: cmpfns.c:379 cmpfns.c:395 #, c-format msgid "@ Line %lu in file \"%s\" is shorter than expected!\n" msgstr "@ La linea %lu nel file \"%s\" è più corta del previsto\n" #: cmpfns.c:531 cmpfns.c:556 cmpfns.c:589 cmpfns.c:608 #, c-format msgid "" "\n" "*** File \"%s\" is binary,\n" "*** cannot read from it\n" msgstr "" "\n" "*** Il file \"%s\" è un file binario,\n" "*** non è possibile leggere dati da esso\n" #: cmpfns.c:534 cmpfns.c:559 cmpfns.c:592 cmpfns.c:613 #, c-format msgid "" "\n" "*** Error while reading from file \"%s\"\n" msgstr "" "\n" "*** Errore in lettura dal file \"%s\"\n" #: cmpfns.c:537 cmpfns.c:562 cmpfns.c:595 cmpfns.c:618 #, c-format msgid "" "\n" "*** Out of memory while reading from file \"%s\"\n" msgstr "" "\n" "*** Esaurimento di memoria durante la lettura del file \"%s\"\n" #: cmpfns.c:544 cmpfns.c:567 cmpfns.c:574 cmpfns.c:599 #, c-format msgid "" "\n" "*** End of file \"%s\" reached while trying to read line %lu.\n" msgstr "" "\n" "*** Raggiunta la fine del file \"%s\"\n" "*** mentre si cercava di leggere la linea %lu.\n" #: cmpfns.c:545 cmpfns.c:568 cmpfns.c:575 cmpfns.c:600 #, c-format msgid "*** File \"%s\" has more lines than file \"%s\",\n" msgstr "*** Il file \"%s\" ha più linee del file \"%s\",\n" #: cmpfns.c:547 cmpfns.c:570 cmpfns.c:577 cmpfns.c:602 #, c-format msgid "" "*** line %lu is the last one read from file \"%s\"\n" "\n" msgstr "" "*** la linea %lu è l'ultima letta dal file \"%s\"\n" "\n" #: error.c:125 msgid "Unknown system error" msgstr "Errore di sistema sconosciuto" #: errors.c:43 #, c-format msgid "" "%s: insufficient memory for new allocation,\n" "the execution of the program ends now\n" msgstr "" "%s: memoria insufficiente per nuova assegnazione,\n" "l'esecuzione del programma finisce qui\n" #: errors.c:76 #, c-format msgid "Runtime error: %s\n" msgstr "Errore durante l'esecuzione del programma: %s\n" #: errors.c:110 #, c-format msgid "Runtime warning: %s\n" msgstr "" "Avvertimento lanciato durante l'esecuzione del programma:\n" "%s\n" #: flags.c:58 msgid "\n" msgstr "\n" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "%s: l'opzione `%s' è ambigua\n" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "%s: l'opzione `--%s' non vuole argomenti\n" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "%s: l'opzione `%c%s' non vuole argomenti\n" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "%s: l'opzione `%s' ha bisogno di un argomento\n" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "%s: l'opzione `--%s' risulta sconosciuta\n" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "%s: l'opzione `%c%s' risulta sconosciuta\n" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "%s: opzione inammissibile -- %c\n" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "%s: opzione non valida -- %c\n" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: opzione con argomento obbligatorio -- %c\n" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "%s: l'opzione `-W %s' è ambigua\n" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "%s: l'opzione `-W %s' non vuole argomenti\n" #: inout.c:347 util.c:121 util.c:136 util.c:242 util.c:258 #, c-format msgid "" "*** Fatal error occurred in function %s:\n" "%s" msgstr "" "*** Errore non emendabile verificatosi durante\n" "*** l'esecuzione della funzione %s:\n" "%s" #: inout.c:349 util.c:123 util.c:138 util.c:244 util.c:260 msgid "" "*** a very long line has been encountered which contains\n" "*** too many fields to be correctly handled\n" msgstr "" "*** È stata incontrata una linea molto lunga che contiene\n" "*** troppi campi per poter essere elaborata correttamente\n" #: io.c:127 msgid "@ Absolute error = " msgstr "@ Errore assoluto = " #: io.c:129 msgid ", Relative error = " msgstr ", Errore relativo = " #: main.c:312 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with positive sign are considered:\n" msgstr "" "\n" " Nel calcolo dei seguenti valori vengono considerati\n" " solo gli errori con segno positivo:\n" #: main.c:314 msgid "" " differences due to numeric fields of the second file that are\n" " less than the corresponding fields in the first file are neglected\n" "\n" msgstr "" " le differenze dovute a campi numerici del secondo file\n" " che risultano essere minori dei corrispondenti campi\n" " del primo file sono state tralasciate\n" "\n" #: main.c:319 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with negative sign are considered:\n" msgstr "" "\n" " Nel calcolo dei seguenti valori vengono considerati\n" " solo gli errori con segno negativo:\n" #: main.c:321 msgid "" " differences due to numeric fields of the second file that are\n" " greater than the corresponding fields in the first file are neglected\n" "\n" msgstr "" " le differenze dovute a campi numerici del secondo file\n" " che risultano essere maggiori dei corrispondenti campi\n" " del primo file sono state tralasciate\n" "\n" #: main.c:327 msgid "" "\n" "No numeric comparison has been done\n" msgstr "" "\n" "Non è stato effettuato alcun confronto numerico\n" #: main.c:331 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "the resulting numeric difference is negligible\n" msgid_plural "" "\n" "%d numeric comparisons have been done and\n" "the resulting numeric differences are all negligible\n" msgstr[0] "" "\n" "È stato effettuato un solo confronto numerico e\n" "la differenza numerica rilevata è trascurabile\n" msgstr[1] "" "\n" "Sono stati effettuati %d confronti numerici e\n" "le differenze numeriche rilevate sono tutte trascurabili\n" #: main.c:338 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "has produced an outcome beyond the tolerance threshold\n" msgid_plural "" "\n" "%d numeric comparisons have been done, all of them\n" "have produced an outcome beyond the tolerance threshold\n" msgstr[0] "" "\n" "È stato effettuato un solo confronto numerico e\n" "ha prodotto un risultato oltre la soglia di tolleranza\n" msgstr[1] "" "\n" "Sono stati effettuati %d confronti numerici e tutti\n" "hanno prodotto un risultato oltre la soglia di tolleranza\n" #: main.c:346 #, c-format msgid "" "\n" "One numeric comparison has been done,\n" msgid_plural "" "\n" "%d numeric comparisons have been done,\n" msgstr[0] "" "\n" "È stato effettuato un solo confronto numerico,\n" msgstr[1] "" "\n" "Sono stati effettuati %d confronti numerici,\n" #: main.c:351 #, c-format msgid "" "only one numeric comparison has produced an outcome\n" "beyond the tolerance threshold\n" msgid_plural "" "%d numeric comparisons have produced an outcome\n" "beyond the tolerance threshold\n" msgstr[0] "" "un solo confronto numerico ha prodotto un risultato\n" "oltre la soglia di tolleranza\n" msgstr[1] "" "%d confronti numerici hanno prodotto un risultato\n" "oltre la soglia di tolleranza\n" #: main.c:356 msgid "" "\n" "Largest absolute error in the set of relevant numerical differences:\n" msgstr "" "\n" "Massimo errore assoluto nell'insieme delle differenze numeriche rilevanti:\n" #: main.c:359 msgid "" "\n" "Corresponding relative error:\n" msgstr "" "\n" "Corrispondente errore relativo:\n" #: main.c:362 msgid "" "\n" "Largest relative error in the set of relevant numerical differences:\n" msgstr "" "\n" "Massimo errore relativo nell'insieme delle differenze numeriche rilevanti:\n" #: main.c:365 msgid "" "\n" "Corresponding absolute error:\n" msgstr "" "\n" "Corrispondente errore assoluto:\n" #: main.c:369 msgid "" "\n" "Sum of all absolute errors:\n" msgstr "" "\n" "Somma degli errori assoluti:\n" #: main.c:372 msgid "" "\n" "Sum of the relevant absolute errors:\n" msgstr "" "\n" "Somma degli errori assoluti non trascurabili:\n" #: main.c:378 msgid "" "\n" "Arithmetic mean of all absolute errors:\n" msgstr "" "\n" "Media aritmetica degli errori assoluti:\n" #: main.c:381 msgid "" "\n" "Arithmetic mean of the relevant absolute errors:\n" msgstr "" "\n" "Media aritmetica degli errori assoluti non trascurabili:\n" #: main.c:390 msgid "" "\n" "Square root of the sum of the squares of all absolute errors:\n" msgstr "" "\n" "Radice quadrata della somma dei quadrati\n" "di tutti gli errori assoluti:\n" #: main.c:393 msgid "" "\n" "Quadratic mean of all absolute errors:\n" msgstr "" "\n" "Media quadratica degli errori assoluti:\n" #: main.c:401 msgid "" "\n" "Square root of the sum of the squares\n" "of the relevant absolute errors:\n" msgstr "" "\n" "Radice quadrata della somma dei quadrati\n" "di tutti gli errori assoluti non trascurabili:\n" #: main.c:404 msgid "" "\n" "Quadratic mean of the relevant absolute errors:\n" msgstr "" "\n" "Media quadratica degli errori assoluti non trascurabili:\n" #: main.c:428 #, c-format msgid "*** %s: memory exhausted\n" msgstr "*** %s: memoria esaurita\n" #: main.c:494 msgid "" "\n" "*** The requested comparison cannot be performed:\n" msgstr "" "\n" "*** Il confronto richiesto non può essere effettuato:\n" #: main.c:495 #, c-format msgid "*** At least one between \"%s\" and \"%s\" is a binary file\n" msgstr "*** Almeno uno tra \"%s\" e \"%s\" è un file binario\n" #: main.c:521 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" have the same structure\n" msgstr "" "\n" "+++ I file \"%s\" e \"%s\" hanno la stessa struttura\n" #: main.c:524 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" are equal\n" msgstr "" "\n" "+++ I file \"%s\" e \"%s\" sono uguali\n" #: main.c:528 #, c-format msgid "" "\n" "+++ File \"%s\" differs from file \"%s\"\n" msgstr "" "\n" "+++ Il file \"%s\" differisce dal file \"%s\"\n" #: new.c:151 numutil.c:157 numutil.c:312 #, c-format msgid "" "%s: a number with a too small exponent has been found,\n" "namely \"%s\".\n" msgstr "" "%s: è stato trovato un numero con un esponente troppo basso,\n" "precisamente \"%s\".\n" #: new.c:152 numutil.c:158 numutil.c:313 #, c-format msgid "Exponents smaller than %ld are not accepted,\n" msgstr "Esponenti inferiori a %ld non sono accettati,\n" #: new.c:153 new.c:160 numutil.c:159 numutil.c:166 numutil.c:314 numutil.c:321 #, c-format msgid "the execution of the program ends now\n" msgstr "l'esecuzione del programma finisce qui\n" #: new.c:158 numutil.c:164 numutil.c:319 #, c-format msgid "" "%s: a number with a too large exponent has been found,\n" "namely \"%s\".\n" msgstr "" "%s: è stato trovato un numero con un esponente troppo alto,\n" "precisamente \"%s\".\n" #: new.c:159 numutil.c:165 numutil.c:320 #, c-format msgid "Exponents larger than %ld are not accepted,\n" msgstr "Esponenti superiori a %ld non sono accettati,\n" #: number.c:1228 msgid "power with non integral base" msgstr "potenza con base non intera" #: number.c:1234 number.c:1285 msgid "power with non integral exponent" msgstr "potenza con esponente non intero" #: number.c:1241 msgid "modulus is not an integral value" msgstr "il modulo non è un valore intero" #: number.c:1289 msgid "exponent too large in raise" msgstr "potenza con esponente troppo grande" #: numutil.c:863 #, c-format msgid "" "The string \"%s\"\n" "is not a valid number, the execution of the program ends now\n" msgstr "" "La stringa \"%s\"\n" "non è un numero valido, l'esecuzione del programma finisce qui\n" #: options.c:46 msgid "Ivano Primi" msgstr "Ivano Primi" #: options.c:47 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licenza GPLv3+: GNU GPL versione 3 o successiva,\n" "vedi .\n" "Questo è software libero: sei libero di modificarlo e redistribuirlo.\n" "NON c'è NESSUNA GARANZIA, per quanto consentito dalle vigenti normative.\n" #: options.c:53 msgid "" "The software has been linked against\n" "the GNU Multiple Precision Arithmetic Library,\n" "version number" msgstr "" "Il software è stato linkato alla libreria\n" "GNU per l'aritmetica a precisione multipla (GNU MP),\n" "numero di versione" #: options.c:57 msgid "" "The software has been built with\n" "its own internal support for multiple precision arithmetic" msgstr "" "Il software è stato compilato attivando\n" "il suo supporto interno per l'aritmetica a precisione multipla" #: options.c:64 msgid "Usage:" msgstr "Uso:" #: options.c:65 msgid "or" msgstr "oppure" #: options.c:67 #, c-format msgid "" "\n" "Compare putatively similar files line by line and field by field,\n" "ignoring small numeric differences or/and different numeric formats.\n" "\n" msgstr "" "\n" "Confronta file grossolanamente simili linea per linea e campo per campo,\n" "ignorando piccole differenze numeriche o/e formati numerici differenti.\n" "\n" #: options.c:68 #, c-format msgid "" "RANGE, RANGE1 and RANGE2 stay for a positive integer value or\n" "for a range of integer values, like 1-, 3-5 or -7.\n" msgstr "" "RANGE, RANGE1 e RANGE2 stanno per un valore intero positivo oppure\n" "per un intervallo di valori interi, per esempio 1-, 3-5 or -7.\n" #: options.c:70 msgid "" "The two arguments after the options are the names of the files to compare." msgstr "I due argomenti dopo le opzioni sono i nomi dei file da confrontare." #: options.c:71 msgid "" "The complete paths of the files should be given,\n" "a directory name is not accepted." msgstr "" "È bene fornire i percorsi completi dei file,\n" "un nome di cartella non viene accettato." #: options.c:72 msgid "" "The given paths cannot refer to the same file\n" "but one of them can be \"-\", which refers to stdin." msgstr "" "I file non possono coincidere ma uno di loro può essere \"-\",\n" "che si riferisce allo standard input." #: options.c:73 msgid "" "Exit status: 1 if files differ, 0 if they are equal, -1 (255) in case of " "error" msgstr "" "Codice di uscita: 1 se i file sono diversi, 0 se uguali, -1 (255) su errore" #: options.c:76 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme dei caratteri da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: options.c:77 options.c:81 msgid "(The default set of delimiters is space, tab and newline)." msgstr "(L'insieme predefinito è spazio bianco, tabulazione e nuova linea)." #: options.c:78 msgid "" "If IFS is prefixed with 1: or 2: then use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" "Se IFS è preceduto dal prefisso 1: o da 2: allora usa l'insieme di\n" " caratteri specificato solo per le linee del primo ovvero del secondo file" #: options.c:80 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme delle stringhe da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: options.c:82 msgid "" "If DELIMS is prefixed with 1: or 2: then use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" "Se DELIMS è preceduto dal prefisso 1: o da 2: allora usa l'insieme di\n" " stringhe specificato solo per le linee del primo ovvero del secondo file" #: options.c:84 msgid "" "Set to THRVAL the maximum absolute difference permitted\n" " before that two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" "Imposta al valore THRVAL la massima differenza assoluta consentita\n" " prima che due campi numerici siano considerati diversi\n" " (Il valore predefinito è zero)." #: options.c:85 options.c:89 msgid "" "If a RANGE is given, use the specified\n" " threshold only when comparing fields whose positions lie in RANGE." msgstr "" "Se un solo RANGE è dato, usa il valore di soglia specificato\n" " solo per confrontare campi le cui posizioni cadono dentro RANGE." #: options.c:86 options.c:90 msgid "" "If both RANGE1 and RANGE2 are given and have the same length,\n" " then use the specified threshold when comparing a field of FILE1\n" " lying in RANGE1 with the corresponding field of FILE2 in RANGE2" msgstr "" "Se sono dati sia RANGE1 che RANGE2 ed hanno la stessa lunghezza,\n" " usa il valore di soglia specificato quando confronti un campo di FILE1\n" " che cade in RANGE1 con il corrispondente campo di FILE2 in RANGE2" #: options.c:88 msgid "" "Set to THRVAL the maximum relative difference permitted\n" " before that two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" "Imposta al valore THRVAL la massima differenza relativa consentita\n" " prima che due campi numerici siano considerati diversi\n" " (Il valore predefinito è zero)." #: options.c:92 msgid "" "Consider two numerical values as equal only if\n" " both absolute and relative difference do not exceed\n" " the corresponding tolerance threshold" msgstr "" "Considera due campi numerici come uguali solo se\n" " la differenza assoluta e quella relativa sono entrambe dentro\n" " la corrispondente soglia di tolleranza" #: options.c:94 msgid "Use the formula indicated by NUM to compute the relative errors." msgstr "Usa la formula indicata da NUM per calcolare gli errori relativi." #: options.c:95 msgid "If 'NUM' is 0 use the classic formula." msgstr "Se 'NUM' è 0 usa la formula classica." #: options.c:96 msgid "" "If 'NUM' is 1 compute the relative errors by considering\n" " the values in FILE1 as sample values." msgstr "" "Se 'NUM' è 1 calcola gli errori relativi considerando\n" " i valori in FILE1 come valori campione." #: options.c:97 msgid "" "If 'NUM' is 2 compute the relative errors by considering\n" " the values in FILE2 as sample values." msgstr "" "Se 'NUM' è 2 calcola gli errori relativi considerando\n" " i valori in FILE2 come valori campione." #: options.c:99 msgid "" "Set to NUM the number of digits in the significands\n" " used in multiple precision arithmetic" msgstr "" "Imposta a NUM il numero di cifre significative\n" " usate nell'aritmetica a precisione multipla" #: options.c:101 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are less than the corresponding numeric fields in the first file" msgstr "" "Ignora tutte le differenze dovute a campi numerici del secondo file\n" " che sono minori dei corrispondenti campi numerici nel primo file" #: options.c:103 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are greater than the corresponding numeric fields in the first file" msgstr "" "Ignora tutte le differenze dovute a campi numerici del secondo file\n" " che sono maggiori dei corrispondenti campi numerici nel primo file" #: options.c:105 msgid "Ignore changes in case while doing literal comparisons" msgstr "" "Nel fare confronti letterali\n" " ignora le differenze del tipo maiuscolo/minuscolo" #: options.c:107 msgid "Set to CURRNAME the currency name for the two files to compare." msgstr "Imposta a CURRNAME il nome della valuta per i due file da confrontare." #: options.c:108 msgid "" "CURRNAME must be prefixed with 1: or 2: to specify the\n" " currency name only for the first or the second file" msgstr "" "CURRNAME deve essere preceduto dal prefisso 1: o 2: per specificare\n" " il nome della valuta solo per il primo ovvero per il secondo file" #: options.c:110 msgid "" "Specify the characters representing the decimal point\n" " in the two files to compare" msgstr "" "Specifica i caratteri rappresentanti il punto decimale\n" " nei due file da confrontare" #: options.c:112 msgid "" "Specify the characters representing the thousands separator\n" " in the two files to compare" msgstr "" "Specifica i caratteri rappresentanti il separatore delle migliaia\n" " nei due file da confrontare" #: options.c:114 msgid "" "Specify the number of digits forming each group of thousands\n" " in the two files to compare" msgstr "" "Specifica il numero di cifre che formano ogni gruppo di migliaia\n" " nei due file da confrontare" #: options.c:116 msgid "" "Specify the (optional) prefixes for positive values\n" " used in the two files to compare" msgstr "" "Specifica i prefissi (opzionali) per valori positivi\n" " usati nei due file da confrontare" #: options.c:118 msgid "" "Specify the prefixes for negative values\n" " used in the two files to compare" msgstr "" "Specifica i prefissi per valori negativi\n" " usati nei due file da confrontare" #: options.c:120 msgid "" "Specify the exponent letters\n" " used in the two files to compare" msgstr "" "Specifica i simboli che precedono l'esponente decimale\n" " nei due file da confrontare" #: options.c:122 msgid "" "Specify the characters representing the imaginary unit\n" " in the two files to compare" msgstr "" "Specifica i caratteri rappresentanti l' unità immaginaria\n" " nei due file da confrontare" #: options.c:124 msgid "Select the fields of the first file that have to be ignored" msgstr "Seleziona i campi del primo file che devono essere ignorati" #: options.c:126 msgid "Select the fields of the second file that have to be ignored" msgstr "Seleziona i campi del secondo file che devono essere ignorati" #: options.c:128 msgid "" "While printing the differences between the two compared files\n" " show only the numerical ones" msgstr "" "Nello stampare le differenze tra i due file confrontati\n" " mostra solo quelle di tipo numerico" #: options.c:130 msgid "" "While printing the differences between the two compared files\n" " neglect all the numerical ones (dummy mode)" msgstr "" "Nello stampare le differenze tra i due file confrontati\n" " trascura tutte quelle di tipo numerico (modalità stupida)" #: options.c:132 msgid "" "Suppress all messages concerning the differences discovered\n" " in the structures of the two files" msgstr "" "Sopprimi tutti i messaggi relativi alle differenze scoperte\n" " nelle strutture dei due file" #: options.c:134 msgid "" "For every couple of lines which differ in at least one field print\n" " an header to show how these lines appear in the two compared files" msgstr "" "Per ogni coppia di linee che differiscono in almeno un campo stampa una\n" " intestazione per mostrare come esse appaiono nei due file confrontati" #: options.c:136 msgid "" "Display a side by side difference listing of the two files\n" " showing which lines are present only in one file, which\n" " lines are present in both files but with one or more differing fields,\n" " and which lines are identical." msgstr "" "Stampa un elenco a colonne affiancate delle differenze tra i due file,\n" " mostrando quali linee sono presenti solo in un file, quali linee\n" " sono presenti in entrambi i file ma con uno o più campi differenti\n" " e quali sono identiche." #: options.c:137 options.c:158 msgid "" "If 'NUM' is zero or is not specified, output at most 130 columns per line." msgstr "" "Se 'NUM' è zero o non è specificato, visualizza al più\n" " 130 colonne per linea." #: options.c:138 options.c:159 msgid "If 'NUM' is a positive number, output at most 'NUM' columns per line." msgstr "" "Se 'NUM' è un numero positivo, visualizza al più\n" " 'NUM' colonne per linea." #: options.c:139 options.c:160 msgid "" "If 'NUM' is a negative number, do not output common lines\n" " and display at most -'NUM' columns per line." msgstr "" "Se 'NUM' è un numero negativo, non stampare le linee comuni\n" " ai due file e visualizza al più -'NUM' colonne per linea." #: options.c:141 msgid "Suppress all the standard output" msgstr "Sopprimi completamente l'output standard del programma" #: options.c:143 msgid "Add some statistics to the standard output" msgstr "Aggiungi alcune informazioni di tipo statistico all'output standard" #: options.c:145 msgid "" "Select the fields of the first file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" "Seleziona i campi del primo file che devono essere\n" " offuscati durante la procedura di sincronizzazione\n" " quando risultano essere di tipo numerico" #: options.c:147 msgid "" "Select the fields of the second file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" "Seleziona i campi del secondo file che devono essere\n" " offuscati durante la procedura di sincronizzazione\n" " quando risultano essere di tipo numerico" #: options.c:149 msgid "" "Select the fields of the first file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" "Seleziona i campi del primo file che devono essere\n" " sempre offuscati durante la procedura di sincronizzazione" #: options.c:151 msgid "" "Select the fields of the second file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" "Seleziona i campi del secondo file che devono essere\n" " sempre offuscati durante la procedura di sincronizzazione" #: options.c:153 msgid "During synchronization try hard to find a smaller set of changes" msgstr "" "Durante la sincronizzazione cerca ad ogni costo di trovare\n" " una catena minimale di modifiche" #: options.c:155 msgid "" "During synchronization assume large files and\n" " many scattered small changes" msgstr "" "Durante la sincronizzazione assumi di lavorare su file grandi\n" " con tante piccole differenze sparpagliate" #: options.c:157 msgid "" "Run only the filter and then show the results of its\n" " attempt to synchronize the two files." msgstr "" "Esegui solo il filtraggio e quindi mostra i risultati del\n" " suo tentativo di sincronizzare i due file." #: options.c:162 msgid "" "Expand tabs to spaces in output while displaying the results of the\n" " synchronization procedure (meaningful only together with option -O or -f)" msgstr "" "Espandi le tabulazioni a spazi bianchi mentre stampi i risultati della\n" " procedura di sincronizzazione (utile solo con le opzioni -O e -f)" #: options.c:164 msgid "Treat both files as binary files (only meaningful under Doz/Windoz)" msgstr "Tratta entrambi i file come binari (utile solo sotto Doz/Windoz)" #: options.c:166 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" "Reindirizza avvertimenti e messaggi di errore\n" " dallo standard error (schermo) al file indicato" #: options.c:168 msgid "Redirect output from stdout to the indicated file" msgstr "Reindirizza l'output dallo standard output (schermo) al file indicato" #: options.c:169 msgid "Show help message and predefined settings" msgstr "Mostra questo messaggio di aiuto e le impostazioni predefinite" #: options.c:170 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" "Mostra numero di versione, Copyright,\n" " termini di distribuzione e NON-Garanzia" #: options.c:172 msgid "" "\n" " Default numeric format (for both files to compare):\n" msgstr "" "\n" " Formato numerico predefinito (per entrambi i file da confrontare):\n" #: options.c:173 #, c-format msgid "Currency name = \"%s\"\n" msgstr "Nome della valuta = \"%s\"\n" #: options.c:174 #, c-format msgid "Decimal point = `%c'\n" msgstr "Punto decimale = `%c'\n" #: options.c:176 options.c:955 options.c:986 #, c-format msgid "Thousands separator = `%c'\n" msgstr "Separatore delle migliaia = `%c'\n" #: options.c:177 #, c-format msgid "Number of digits in each thousands group = %u\n" msgstr "Numero di cifre in ogni gruppo di migliaia = %u\n" #: options.c:179 options.c:956 options.c:987 #, c-format msgid "Leading positive sign = `%c'\n" msgstr "Segno iniziale per numeri positivi = `%c'\n" #: options.c:180 options.c:957 options.c:988 #, c-format msgid "Leading negative sign = `%c'\n" msgstr "Segno iniziale per numeri negativi = `%c'\n" #: options.c:181 options.c:958 options.c:989 #, c-format msgid "Prefix for decimal exponent = `%c'\n" msgstr "Prefisso per esponente decimale = `%c'\n" #: options.c:182 options.c:961 options.c:992 #, c-format msgid "" "Symbol used to denote the imaginary unit = `%c'\n" "\n" msgstr "" "Simbolo usato per indicare l'unità immaginaria = `%c'\n" "\n" #: options.c:467 options.c:513 options.c:528 options.c:545 options.c:560 #: options.c:582 options.c:804 options.c:831 options.c:874 options.c:889 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "%s: un argomento non valido segue l'opzione `-%c'\n" #: options.c:600 options.c:614 options.c:634 options.c:667 options.c:681 #: options.c:701 #, c-format msgid "%s: memory exhausted\n" msgstr "%s: memoria esaurita\n" #: options.c:642 options.c:708 options.c:726 options.c:733 options.c:745 #: options.c:752 options.c:789 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "%s: un argomento non valido segue l'opzione `-%c':\n" #: options.c:644 #, c-format msgid "" " The list of field delimiters can not be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere il carattere di nuova linea ('\\n')\n" #: options.c:710 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\").\n" " Care that the newline character cannot appear\n" " in any other delimiter than the newline string\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere la stringa di nuova linea (\"\\n\").\n" " Inoltre, il carattere di nuova linea non può\n" " apparire in alcun altro separatore di campo\n" #: options.c:728 options.c:747 #, c-format msgid " The format specification has not been respected\n" msgstr " La specifica di formato non è stata rispettata\n" #: options.c:735 options.c:754 #, c-format msgid " The specified ranges do not have the same length\n" msgstr " Gli intervalli specificati non hanno la stessa lunghezza\n" #: options.c:791 #, c-format msgid " you have missed to specify the currency name\n" msgstr " hai dimenticato di specificare il nome della valuta\n" #: options.c:900 options.c:909 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "%s: impossibile aprire il file \"%s\":\n" #: options.c:951 #, c-format msgid "The numeric format specified for the first file is illegal,\n" msgstr "Il formato numerico specificato per il primo file è inaccettabile,\n" #: options.c:953 options.c:984 #, c-format msgid "" "the following symbols should be all different\n" "while two or more of them are actually equal:\n" msgstr "" "i simboli seguenti dovrebbero essere tutti diversi\n" "mentre due o più di essi sono in realtà uguali:\n" #: options.c:954 options.c:985 #, c-format msgid "" "\n" "Decimal point = `%c'\n" msgstr "" "\n" "Punto decimale = `%c'\n" #: options.c:968 #, c-format msgid "The numeric format specified for the first file is illegal:\n" msgstr "Il formato numerico specificato per il primo file è inaccettabile:\n" #: options.c:970 options.c:1001 #, c-format msgid "the name of the currency may not contain digits,\n" msgstr "il nome della valuta non può contenere cifre numeriche,\n" #: options.c:972 options.c:1003 #, c-format msgid "the symbol for the leading positive sign (`%c'),\n" msgstr "il prefisso per numeri positivi (`%c'),\n" #: options.c:974 options.c:1005 #, c-format msgid "the symbol for the leading negative sign (`%c'),\n" msgstr "il prefisso per numeri negativi (`%c'),\n" #: options.c:976 options.c:1007 #, c-format msgid "the decimal point (`%c'), or the thousands separator (`%c')\n" msgstr "il punto decimale (`%c'), o il separatore delle migliaia (`%c')\n" #: options.c:982 #, c-format msgid "The numeric format specified for the second file is illegal,\n" msgstr "Il formato numerico specificato per il secondo file è inaccettabile,\n" #: options.c:999 #, c-format msgid "The numeric format specified for the second file is illegal:\n" msgstr "Il formato numerico specificato per il secondo file è inaccettabile:\n" #: thrlist.c:341 #, c-format msgid "Fatal error occurred during comparison of two numerical fields\n" msgstr "" "Si è verificato un errore inemendabile durante\n" "il confronto di due campi numerici\n" #: xalloc-die.c:35 msgid "memory exhausted" msgstr "memoria esaurita" ./numdiff-5.8.1/po/numdiff/it.mo0000644000175000017500000006623512215353073015360 0ustar ivanoivanoÞ• ß ˜ 7™ gÑ g9>¡)à4 1?4q'¦$Î2ó)&2P‰ƒ -MFdF«%òκçP¢(ó1HN?—×&õ2gOÅ·3}‰±†;/ÂDòD7|˜R²().Xr,ˆµ%Ó,ù-& T&uœ¼:Ü92,l.™gÈ30dxŽM¢2ð*#nN½NdäzN_@®Nï‘> ,Ð -ý ?+!‰k!&õ!b"b"jâ"EM#J“#ŠÞ#‡i$mñ$Æ_%Œ&&‰³&6=' t'€'ž'ͼ'.Š(#¹(qÝ(1O)E)^Ç)&*9*ŒN*tÛ*;P+Œ+u,<,?Í,] -•k-•.)—.BÁ.X/U]/V³/[ 0Af0\¨0M1bS1_¶1b2 y21š2RÌ2`3<€3<½3=ú3=84[v4bÒ4M55Jƒ5Î5Cê5.6C6@J6m‹6^ù6X7t7 …7£¦7J8M8 j8<‹8&È8\ï81L91~91°9”â9Fw;]¾;]<Vz<&Ñ<Rø<>K=9Š=,Ä=%ñ=3>)K>:u>“°>!D?!f?ˆ?L ?Lí?2:@Ùm@ËGA`B)tB:žBYÙBH3C|C/›C2ËCuþCÒtD;GE›ƒE™F6¹FPðFQAG%“G ¹GYÚG24H3gH›H¹H)ÏHùH.I)GI*qI!œI-¾I)ìI)JD@J…J3 JWÔJ/,Kw\K3ÔKLL1LYFL8 LCÙL‰M§MEN_NïvNkfO_ÒOK2PŒ~P. Q.:QSiQ‘½Q&ORbvRbÙR{c`Q¢`Zô`VOaZ¦aabVcb`ºbNcsjctÞc\Sd6°d8çdV ecweDÛeD fFefF¬fgófr[gPÎgDh!dh@†hÇhåhAêhv,i_£i#j'j!8j£Zjþjk !k@Bk'ƒke«k9l(Kl(tl C” F’R™v`7‹–JB\pž†…DWce UK[‡oŸgƒNu TfH#,^tlŒXb=s%‰3 œ—a'„)1ZM˜kSˆš_Y.APx~}Š “OdE&/ni?-›<I|‘‚$;L+9 ]V!:y6jm€•h(5G28wŽ{>"rz40Qq*@ Default numeric format (for both files to compare): In the computation of the following quantities only the errors with negative sign are considered: In the computation of the following quantities only the errors with positive sign are considered: *** End of file "%s" reached while trying to read line %lu. *** Error while reading from file "%s" *** File "%s" is binary, *** cannot read from it *** Out of memory while reading from file "%s" *** The requested comparison cannot be performed: +++ File "%s" differs from file "%s" +++ Files "%s" and "%s" are equal +++ Files "%s" and "%s" have the same structure Arithmetic mean of all absolute errors: Arithmetic mean of the relevant absolute errors: Compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Corresponding absolute error: Corresponding relative error: Decimal point = `%c' Largest absolute error in the set of relevant numerical differences: Largest relative error in the set of relevant numerical differences: No numeric comparison has been done One numeric comparison has been done and has produced an outcome beyond the tolerance threshold %d numeric comparisons have been done, all of them have produced an outcome beyond the tolerance threshold One numeric comparison has been done and the resulting numeric difference is negligible %d numeric comparisons have been done and the resulting numeric differences are all negligible One numeric comparison has been done, %d numeric comparisons have been done, Quadratic mean of all absolute errors: Quadratic mean of the relevant absolute errors: Square root of the sum of the squares of the relevant absolute errors: Square root of the sum of the squares of all absolute errors: Sum of all absolute errors: Sum of the relevant absolute errors: The format specification has not been respected The list of field delimiters can not be empty and must always include the newline character ('\n') The list of field delimiters cannot be empty and must always include the newline string ("\n"). Care that the newline character cannot appear in any other delimiter than the newline string The specified ranges do not have the same length differences due to numeric fields of the second file that are greater than the corresponding fields in the first file are neglected differences due to numeric fields of the second file that are less than the corresponding fields in the first file are neglected you have missed to specify the currency name %s: a number with a too large exponent has been found, namely "%s". %s: a number with a too small exponent has been found, namely "%s". %s: cannot open file "%s": %s: illegal option -- %c %s: insufficient memory for new allocation, the execution of the program ends now %s: invalid argument after `-%c' option %s: invalid argument after `-%c' option: %s: invalid option -- %c %s: memory exhausted %s: option `%c%s' doesn't allow an argument %s: option `%s' is ambiguous %s: option `%s' requires an argument %s: option `--%s' doesn't allow an argument %s: option `-W %s' doesn't allow an argument %s: option `-W %s' is ambiguous %s: option requires an argument -- %c %s: unrecognized option `%c%s' %s: unrecognized option `--%s' (The default set of delimiters is space, tab and newline).*** %s: memory exhausted *** At least one between "%s" and "%s" is a binary file *** Fatal error occurred in function %s: %s*** File "%s" has more lines than file "%s", *** a very long line has been encountered which contains *** too many fields to be correctly handled *** line %lu is the last one read from file "%s" , Relative error = @ Absolute error = @ Line %lu in file "%s" contains too many fields to be properly processed! @ Line %lu in file "%s" is shorter than expected! Add some statistics to the standard outputCURRNAME must be prefixed with 1: or 2: to specify the currency name only for the first or the second fileConsider two numerical values as equal only if both absolute and relative difference do not exceed the corresponding tolerance thresholdCurrency name = "%s" Decimal point = `%c' Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical.During synchronization assume large files and many scattered small changesDuring synchronization try hard to find a smaller set of changesExit status: 1 if files differ, 0 if they are equal, -1 (255) in case of errorExpand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option -O or -f)Exponents larger than %ld are not accepted, Exponents smaller than %ld are not accepted, Fatal error occurred during comparison of two numerical fields For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared filesIf 'NUM' is 0 use the classic formula.If 'NUM' is 1 compute the relative errors by considering the values in FILE1 as sample values.If 'NUM' is 2 compute the relative errors by considering the values in FILE2 as sample values.If 'NUM' is a negative number, do not output common lines and display at most -'NUM' columns per line.If 'NUM' is a positive number, output at most 'NUM' columns per line.If 'NUM' is zero or is not specified, output at most 130 columns per line.If DELIMS is prefixed with 1: or 2: then use the given delimiter set only for the lines from the first or the second file respectivelyIf IFS is prefixed with 1: or 2: then use the given delimiter set only for the lines from the first or the second file respectivelyIf a RANGE is given, use the specified threshold only when comparing fields whose positions lie in RANGE.If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first fileIgnore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first fileIgnore changes in case while doing literal comparisonsIvano PrimiLeading negative sign = `%c' Leading positive sign = `%c' License GPLv3+: GNU GPL version 3 or later, see . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Number of digits in each thousands group = %u Prefix for decimal exponent = `%c' RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like 1-, 3-5 or -7. Redirect output from stdout to the indicated fileRedirect warning and error messages from stderr to the indicated fileRun only the filter and then show the results of its attempt to synchronize the two files.Runtime error: %s Runtime warning: %s Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numericSelect the fields of the first file that have to be unconditionally blurred during the synchronization procedureSelect the fields of the first file that have to be ignoredSelect the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numericSelect the fields of the second file that have to be unconditionally blurred during the synchronization procedureSelect the fields of the second file that have to be ignoredSet to CURRNAME the currency name for the two files to compare.Set to NUM the number of digits in the significands used in multiple precision arithmeticSet to THRVAL the maximum absolute difference permitted before that two numeric fields are regarded as different (The default value is zero).Set to THRVAL the maximum relative difference permitted before that two numeric fields are regarded as different (The default value is zero).Show help message and predefined settingsShow version number, Copyright, Distribution Terms and NO-WarrantySpecify the (optional) prefixes for positive values used in the two files to compareSpecify the characters representing the decimal point in the two files to compareSpecify the characters representing the imaginary unit in the two files to compareSpecify the characters representing the thousands separator in the two files to compareSpecify the exponent letters used in the two files to compareSpecify the number of digits forming each group of thousands in the two files to compareSpecify the prefixes for negative values used in the two files to compareSpecify the set of characters to use as delimiters while splitting the input lines into fieldsSpecify the set of strings to use as delimiters while splitting the input lines into fieldsSuppress all messages concerning the differences discovered in the structures of the two filesSuppress all the standard outputSymbol used to denote the imaginary unit = `%c' The complete paths of the files should be given, a directory name is not accepted.The given paths cannot refer to the same file but one of them can be "-", which refers to stdin.The numeric format specified for the first file is illegal, The numeric format specified for the first file is illegal: The numeric format specified for the second file is illegal, The numeric format specified for the second file is illegal: The software has been built with its own internal support for multiple precision arithmeticThe software has been linked against the GNU Multiple Precision Arithmetic Library, version numberThe string "%s" is not a valid number, the execution of the program ends now The two arguments after the options are the names of the files to compare.Thousands separator = `%c' Treat both files as binary files (only meaningful under Doz/Windoz)Unknown system errorUsage:Use the formula indicated by NUM to compute the relative errors.While printing the differences between the two compared files neglect all the numerical ones (dummy mode)While printing the differences between the two compared files show only the numerical onesexponent too large in raisememory exhaustedmodulus is not an integral valueonly one numeric comparison has produced an outcome beyond the tolerance threshold %d numeric comparisons have produced an outcome beyond the tolerance threshold orpower with non integral basepower with non integral exponentthe decimal point (`%c'), or the thousands separator (`%c') the execution of the program ends now the following symbols should be all different while two or more of them are actually equal: the name of the currency may not contain digits, the symbol for the leading negative sign (`%c'), the symbol for the leading positive sign (`%c'), Project-Id-Version: numdiff 5.8.1 Report-Msgid-Bugs-To: ivprimi@libero.it POT-Creation-Date: 2013-08-07 15:35+0200 PO-Revision-Date: 2013-09-15 17:43+0200 Last-Translator: Ivano Primi Language-Team: ITALIAN Language: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0; Formato numerico predefinito (per entrambi i file da confrontare): Nel calcolo dei seguenti valori vengono considerati solo gli errori con segno negativo: Nel calcolo dei seguenti valori vengono considerati solo gli errori con segno positivo: *** Raggiunta la fine del file "%s" *** mentre si cercava di leggere la linea %lu. *** Errore in lettura dal file "%s" *** Il file "%s" è un file binario, *** non è possibile leggere dati da esso *** Esaurimento di memoria durante la lettura del file "%s" *** Il confronto richiesto non può essere effettuato: +++ Il file "%s" differisce dal file "%s" +++ I file "%s" e "%s" sono uguali +++ I file "%s" e "%s" hanno la stessa struttura Media aritmetica degli errori assoluti: Media aritmetica degli errori assoluti non trascurabili: Confronta file grossolanamente simili linea per linea e campo per campo, ignorando piccole differenze numeriche o/e formati numerici differenti. Corrispondente errore assoluto: Corrispondente errore relativo: Punto decimale = `%c' Massimo errore assoluto nell'insieme delle differenze numeriche rilevanti: Massimo errore relativo nell'insieme delle differenze numeriche rilevanti: Non è stato effettuato alcun confronto numerico È stato effettuato un solo confronto numerico e ha prodotto un risultato oltre la soglia di tolleranza Sono stati effettuati %d confronti numerici e tutti hanno prodotto un risultato oltre la soglia di tolleranza È stato effettuato un solo confronto numerico e la differenza numerica rilevata è trascurabile Sono stati effettuati %d confronti numerici e le differenze numeriche rilevate sono tutte trascurabili È stato effettuato un solo confronto numerico, Sono stati effettuati %d confronti numerici, Media quadratica degli errori assoluti: Media quadratica degli errori assoluti non trascurabili: Radice quadrata della somma dei quadrati di tutti gli errori assoluti non trascurabili: Radice quadrata della somma dei quadrati di tutti gli errori assoluti: Somma degli errori assoluti: Somma degli errori assoluti non trascurabili: La specifica di formato non è stata rispettata La lista di separatori di campo non può essere vuota e deve sempre includere il carattere di nuova linea ('\n') La lista di separatori di campo non può essere vuota e deve sempre includere la stringa di nuova linea ("\n"). Inoltre, il carattere di nuova linea non può apparire in alcun altro separatore di campo Gli intervalli specificati non hanno la stessa lunghezza le differenze dovute a campi numerici del secondo file che risultano essere maggiori dei corrispondenti campi del primo file sono state tralasciate le differenze dovute a campi numerici del secondo file che risultano essere minori dei corrispondenti campi del primo file sono state tralasciate hai dimenticato di specificare il nome della valuta %s: è stato trovato un numero con un esponente troppo alto, precisamente "%s". %s: è stato trovato un numero con un esponente troppo basso, precisamente "%s". %s: impossibile aprire il file "%s": %s: opzione inammissibile -- %c %s: memoria insufficiente per nuova assegnazione, l'esecuzione del programma finisce qui %s: un argomento non valido segue l'opzione `-%c' %s: un argomento non valido segue l'opzione `-%c': %s: opzione non valida -- %c %s: memoria esaurita %s: l'opzione `%c%s' non vuole argomenti %s: l'opzione `%s' è ambigua %s: l'opzione `%s' ha bisogno di un argomento %s: l'opzione `--%s' non vuole argomenti %s: l'opzione `-W %s' non vuole argomenti %s: l'opzione `-W %s' è ambigua %s: opzione con argomento obbligatorio -- %c %s: l'opzione `%c%s' risulta sconosciuta %s: l'opzione `--%s' risulta sconosciuta (L'insieme predefinito è spazio bianco, tabulazione e nuova linea).*** %s: memoria esaurita *** Almeno uno tra "%s" e "%s" è un file binario *** Errore non emendabile verificatosi durante *** l'esecuzione della funzione %s: %s*** Il file "%s" ha più linee del file "%s", *** È stata incontrata una linea molto lunga che contiene *** troppi campi per poter essere elaborata correttamente *** la linea %lu è l'ultima letta dal file "%s" , Errore relativo = @ Errore assoluto = @ La linea %lu nel file "%s" contiene troppi campi per essere elaborata correttamente! @ La linea %lu nel file "%s" è più corta del previsto Aggiungi alcune informazioni di tipo statistico all'output standardCURRNAME deve essere preceduto dal prefisso 1: o 2: per specificare il nome della valuta solo per il primo ovvero per il secondo fileConsidera due campi numerici come uguali solo se la differenza assoluta e quella relativa sono entrambe dentro la corrispondente soglia di tolleranzaNome della valuta = "%s" Punto decimale = `%c' Stampa un elenco a colonne affiancate delle differenze tra i due file, mostrando quali linee sono presenti solo in un file, quali linee sono presenti in entrambi i file ma con uno o più campi differenti e quali sono identiche.Durante la sincronizzazione assumi di lavorare su file grandi con tante piccole differenze sparpagliateDurante la sincronizzazione cerca ad ogni costo di trovare una catena minimale di modificheCodice di uscita: 1 se i file sono diversi, 0 se uguali, -1 (255) su erroreEspandi le tabulazioni a spazi bianchi mentre stampi i risultati della procedura di sincronizzazione (utile solo con le opzioni -O e -f)Esponenti superiori a %ld non sono accettati, Esponenti inferiori a %ld non sono accettati, Si è verificato un errore inemendabile durante il confronto di due campi numerici Per ogni coppia di linee che differiscono in almeno un campo stampa una intestazione per mostrare come esse appaiono nei due file confrontatiSe 'NUM' è 0 usa la formula classica.Se 'NUM' è 1 calcola gli errori relativi considerando i valori in FILE1 come valori campione.Se 'NUM' è 2 calcola gli errori relativi considerando i valori in FILE2 come valori campione.Se 'NUM' è un numero negativo, non stampare le linee comuni ai due file e visualizza al più -'NUM' colonne per linea.Se 'NUM' è un numero positivo, visualizza al più 'NUM' colonne per linea.Se 'NUM' è zero o non è specificato, visualizza al più 130 colonne per linea.Se DELIMS è preceduto dal prefisso 1: o da 2: allora usa l'insieme di stringhe specificato solo per le linee del primo ovvero del secondo fileSe IFS è preceduto dal prefisso 1: o da 2: allora usa l'insieme di caratteri specificato solo per le linee del primo ovvero del secondo fileSe un solo RANGE è dato, usa il valore di soglia specificato solo per confrontare campi le cui posizioni cadono dentro RANGE.Se sono dati sia RANGE1 che RANGE2 ed hanno la stessa lunghezza, usa il valore di soglia specificato quando confronti un campo di FILE1 che cade in RANGE1 con il corrispondente campo di FILE2 in RANGE2Ignora tutte le differenze dovute a campi numerici del secondo file che sono maggiori dei corrispondenti campi numerici nel primo fileIgnora tutte le differenze dovute a campi numerici del secondo file che sono minori dei corrispondenti campi numerici nel primo fileNel fare confronti letterali ignora le differenze del tipo maiuscolo/minuscoloIvano PrimiSegno iniziale per numeri negativi = `%c' Segno iniziale per numeri positivi = `%c' Licenza GPLv3+: GNU GPL versione 3 o successiva, vedi . Questo è software libero: sei libero di modificarlo e redistribuirlo. NON c'è NESSUNA GARANZIA, per quanto consentito dalle vigenti normative. Numero di cifre in ogni gruppo di migliaia = %u Prefisso per esponente decimale = `%c' RANGE, RANGE1 e RANGE2 stanno per un valore intero positivo oppure per un intervallo di valori interi, per esempio 1-, 3-5 or -7. Reindirizza l'output dallo standard output (schermo) al file indicatoReindirizza avvertimenti e messaggi di errore dallo standard error (schermo) al file indicatoEsegui solo il filtraggio e quindi mostra i risultati del suo tentativo di sincronizzare i due file.Errore durante l'esecuzione del programma: %s Avvertimento lanciato durante l'esecuzione del programma: %s Seleziona i campi del primo file che devono essere offuscati durante la procedura di sincronizzazione quando risultano essere di tipo numericoSeleziona i campi del primo file che devono essere sempre offuscati durante la procedura di sincronizzazioneSeleziona i campi del primo file che devono essere ignoratiSeleziona i campi del secondo file che devono essere offuscati durante la procedura di sincronizzazione quando risultano essere di tipo numericoSeleziona i campi del secondo file che devono essere sempre offuscati durante la procedura di sincronizzazioneSeleziona i campi del secondo file che devono essere ignoratiImposta a CURRNAME il nome della valuta per i due file da confrontare.Imposta a NUM il numero di cifre significative usate nell'aritmetica a precisione multiplaImposta al valore THRVAL la massima differenza assoluta consentita prima che due campi numerici siano considerati diversi (Il valore predefinito è zero).Imposta al valore THRVAL la massima differenza relativa consentita prima che due campi numerici siano considerati diversi (Il valore predefinito è zero).Mostra questo messaggio di aiuto e le impostazioni predefiniteMostra numero di versione, Copyright, termini di distribuzione e NON-GaranziaSpecifica i prefissi (opzionali) per valori positivi usati nei due file da confrontareSpecifica i caratteri rappresentanti il punto decimale nei due file da confrontareSpecifica i caratteri rappresentanti l' unità immaginaria nei due file da confrontareSpecifica i caratteri rappresentanti il separatore delle migliaia nei due file da confrontareSpecifica i simboli che precedono l'esponente decimale nei due file da confrontareSpecifica il numero di cifre che formano ogni gruppo di migliaia nei due file da confrontareSpecifica i prefissi per valori negativi usati nei due file da confrontareSpecifica l'insieme dei caratteri da usare come separatori al momento di suddividere le linee di input in campiSpecifica l'insieme delle stringhe da usare come separatori al momento di suddividere le linee di input in campiSopprimi tutti i messaggi relativi alle differenze scoperte nelle strutture dei due fileSopprimi completamente l'output standard del programmaSimbolo usato per indicare l'unità immaginaria = `%c' È bene fornire i percorsi completi dei file, un nome di cartella non viene accettato.I file non possono coincidere ma uno di loro può essere "-", che si riferisce allo standard input.Il formato numerico specificato per il primo file è inaccettabile, Il formato numerico specificato per il primo file è inaccettabile: Il formato numerico specificato per il secondo file è inaccettabile, Il formato numerico specificato per il secondo file è inaccettabile: Il software è stato compilato attivando il suo supporto interno per l'aritmetica a precisione multiplaIl software è stato linkato alla libreria GNU per l'aritmetica a precisione multipla (GNU MP), numero di versioneLa stringa "%s" non è un numero valido, l'esecuzione del programma finisce qui I due argomenti dopo le opzioni sono i nomi dei file da confrontare.Separatore delle migliaia = `%c' Tratta entrambi i file come binari (utile solo sotto Doz/Windoz)Errore di sistema sconosciutoUso:Usa la formula indicata da NUM per calcolare gli errori relativi.Nello stampare le differenze tra i due file confrontati trascura tutte quelle di tipo numerico (modalità stupida)Nello stampare le differenze tra i due file confrontati mostra solo quelle di tipo numericopotenza con esponente troppo grandememoria esauritail modulo non è un valore interoun solo confronto numerico ha prodotto un risultato oltre la soglia di tolleranza %d confronti numerici hanno prodotto un risultato oltre la soglia di tolleranza oppurepotenza con base non interapotenza con esponente non interoil punto decimale (`%c'), o il separatore delle migliaia (`%c') l'esecuzione del programma finisce qui i simboli seguenti dovrebbero essere tutti diversi mentre due o più di essi sono in realtà uguali: il nome della valuta non può contenere cifre numeriche, il prefisso per numeri negativi (`%c'), il prefisso per numeri positivi (`%c'), ./numdiff-5.8.1/po/numdiff/numdiff.pot0000644000175000017500000005043412215353073016555 0ustar ivanoivano# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: numdiff 5.8.1\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2013-08-07 15:35+0200\n" "PO-Revision-Date: 2013-09-15 17:43+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: cmpfns.c:277 cmpfns.c:293 cmpfns.c:347 cmpfns.c:363 #, c-format msgid "" "@ Line %lu in file \"%s\"\n" " contains too many fields to be properly processed!\n" msgstr "" #: cmpfns.c:379 cmpfns.c:395 #, c-format msgid "@ Line %lu in file \"%s\" is shorter than expected!\n" msgstr "" #: cmpfns.c:531 cmpfns.c:556 cmpfns.c:589 cmpfns.c:608 #, c-format msgid "" "\n" "*** File \"%s\" is binary,\n" "*** cannot read from it\n" msgstr "" #: cmpfns.c:534 cmpfns.c:559 cmpfns.c:592 cmpfns.c:613 #, c-format msgid "" "\n" "*** Error while reading from file \"%s\"\n" msgstr "" #: cmpfns.c:537 cmpfns.c:562 cmpfns.c:595 cmpfns.c:618 #, c-format msgid "" "\n" "*** Out of memory while reading from file \"%s\"\n" msgstr "" #: cmpfns.c:544 cmpfns.c:567 cmpfns.c:574 cmpfns.c:599 #, c-format msgid "" "\n" "*** End of file \"%s\" reached while trying to read line %lu.\n" msgstr "" #: cmpfns.c:545 cmpfns.c:568 cmpfns.c:575 cmpfns.c:600 #, c-format msgid "*** File \"%s\" has more lines than file \"%s\",\n" msgstr "" #: cmpfns.c:547 cmpfns.c:570 cmpfns.c:577 cmpfns.c:602 #, c-format msgid "" "*** line %lu is the last one read from file \"%s\"\n" "\n" msgstr "" #: error.c:125 msgid "Unknown system error" msgstr "" #: errors.c:43 #, c-format msgid "" "%s: insufficient memory for new allocation,\n" "the execution of the program ends now\n" msgstr "" #: errors.c:76 #, c-format msgid "Runtime error: %s\n" msgstr "" #: errors.c:110 #, c-format msgid "Runtime warning: %s\n" msgstr "" #: flags.c:58 msgid "\n" msgstr "" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "" #: inout.c:347 util.c:121 util.c:136 util.c:242 util.c:258 #, c-format msgid "" "*** Fatal error occurred in function %s:\n" "%s" msgstr "" #: inout.c:349 util.c:123 util.c:138 util.c:244 util.c:260 msgid "" "*** a very long line has been encountered which contains\n" "*** too many fields to be correctly handled\n" msgstr "" #: io.c:127 msgid "@ Absolute error = " msgstr "" #: io.c:129 msgid ", Relative error = " msgstr "" #: main.c:312 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with positive sign are considered:\n" msgstr "" #: main.c:314 msgid "" " differences due to numeric fields of the second file that are\n" " less than the corresponding fields in the first file are neglected\n" "\n" msgstr "" #: main.c:319 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with negative sign are considered:\n" msgstr "" #: main.c:321 msgid "" " differences due to numeric fields of the second file that are\n" " greater than the corresponding fields in the first file are neglected\n" "\n" msgstr "" #: main.c:327 msgid "" "\n" "No numeric comparison has been done\n" msgstr "" #: main.c:331 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "the resulting numeric difference is negligible\n" msgid_plural "" "\n" "%d numeric comparisons have been done and\n" "the resulting numeric differences are all negligible\n" msgstr[0] "" msgstr[1] "" #: main.c:338 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "has produced an outcome beyond the tolerance threshold\n" msgid_plural "" "\n" "%d numeric comparisons have been done, all of them\n" "have produced an outcome beyond the tolerance threshold\n" msgstr[0] "" msgstr[1] "" #: main.c:346 #, c-format msgid "" "\n" "One numeric comparison has been done,\n" msgid_plural "" "\n" "%d numeric comparisons have been done,\n" msgstr[0] "" msgstr[1] "" #: main.c:351 #, c-format msgid "" "only one numeric comparison has produced an outcome\n" "beyond the tolerance threshold\n" msgid_plural "" "%d numeric comparisons have produced an outcome\n" "beyond the tolerance threshold\n" msgstr[0] "" msgstr[1] "" #: main.c:356 msgid "" "\n" "Largest absolute error in the set of relevant numerical differences:\n" msgstr "" #: main.c:359 msgid "" "\n" "Corresponding relative error:\n" msgstr "" #: main.c:362 msgid "" "\n" "Largest relative error in the set of relevant numerical differences:\n" msgstr "" #: main.c:365 msgid "" "\n" "Corresponding absolute error:\n" msgstr "" #: main.c:369 msgid "" "\n" "Sum of all absolute errors:\n" msgstr "" #: main.c:372 msgid "" "\n" "Sum of the relevant absolute errors:\n" msgstr "" #: main.c:378 msgid "" "\n" "Arithmetic mean of all absolute errors:\n" msgstr "" #: main.c:381 msgid "" "\n" "Arithmetic mean of the relevant absolute errors:\n" msgstr "" #: main.c:390 msgid "" "\n" "Square root of the sum of the squares of all absolute errors:\n" msgstr "" #: main.c:393 msgid "" "\n" "Quadratic mean of all absolute errors:\n" msgstr "" #: main.c:401 msgid "" "\n" "Square root of the sum of the squares\n" "of the relevant absolute errors:\n" msgstr "" #: main.c:404 msgid "" "\n" "Quadratic mean of the relevant absolute errors:\n" msgstr "" #: main.c:428 #, c-format msgid "*** %s: memory exhausted\n" msgstr "" #: main.c:494 msgid "" "\n" "*** The requested comparison cannot be performed:\n" msgstr "" #: main.c:495 #, c-format msgid "*** At least one between \"%s\" and \"%s\" is a binary file\n" msgstr "" #: main.c:521 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" have the same structure\n" msgstr "" #: main.c:524 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" are equal\n" msgstr "" #: main.c:528 #, c-format msgid "" "\n" "+++ File \"%s\" differs from file \"%s\"\n" msgstr "" #: new.c:151 numutil.c:157 numutil.c:312 #, c-format msgid "" "%s: a number with a too small exponent has been found,\n" "namely \"%s\".\n" msgstr "" #: new.c:152 numutil.c:158 numutil.c:313 #, c-format msgid "Exponents smaller than %ld are not accepted,\n" msgstr "" #: new.c:153 new.c:160 numutil.c:159 numutil.c:166 numutil.c:314 numutil.c:321 #, c-format msgid "the execution of the program ends now\n" msgstr "" #: new.c:158 numutil.c:164 numutil.c:319 #, c-format msgid "" "%s: a number with a too large exponent has been found,\n" "namely \"%s\".\n" msgstr "" #: new.c:159 numutil.c:165 numutil.c:320 #, c-format msgid "Exponents larger than %ld are not accepted,\n" msgstr "" #: number.c:1228 msgid "power with non integral base" msgstr "" #: number.c:1234 number.c:1285 msgid "power with non integral exponent" msgstr "" #: number.c:1241 msgid "modulus is not an integral value" msgstr "" #: number.c:1289 msgid "exponent too large in raise" msgstr "" #: numutil.c:863 #, c-format msgid "" "The string \"%s\"\n" "is not a valid number, the execution of the program ends now\n" msgstr "" #: options.c:46 msgid "Ivano Primi" msgstr "" #: options.c:47 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: options.c:53 msgid "" "The software has been linked against\n" "the GNU Multiple Precision Arithmetic Library,\n" "version number" msgstr "" #: options.c:57 msgid "" "The software has been built with\n" "its own internal support for multiple precision arithmetic" msgstr "" #: options.c:64 msgid "Usage:" msgstr "" #: options.c:65 msgid "or" msgstr "" #: options.c:67 #, c-format msgid "" "\n" "Compare putatively similar files line by line and field by field,\n" "ignoring small numeric differences or/and different numeric formats.\n" "\n" msgstr "" #: options.c:68 #, c-format msgid "" "RANGE, RANGE1 and RANGE2 stay for a positive integer value or\n" "for a range of integer values, like 1-, 3-5 or -7.\n" msgstr "" #: options.c:70 msgid "" "The two arguments after the options are the names of the files to compare." msgstr "" #: options.c:71 msgid "" "The complete paths of the files should be given,\n" "a directory name is not accepted." msgstr "" #: options.c:72 msgid "" "The given paths cannot refer to the same file\n" "but one of them can be \"-\", which refers to stdin." msgstr "" #: options.c:73 msgid "" "Exit status: 1 if files differ, 0 if they are equal, -1 (255) in case of " "error" msgstr "" #: options.c:76 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: options.c:77 options.c:81 msgid "(The default set of delimiters is space, tab and newline)." msgstr "" #: options.c:78 msgid "" "If IFS is prefixed with 1: or 2: then use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" #: options.c:80 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: options.c:82 msgid "" "If DELIMS is prefixed with 1: or 2: then use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" #: options.c:84 msgid "" "Set to THRVAL the maximum absolute difference permitted\n" " before that two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" #: options.c:85 options.c:89 msgid "" "If a RANGE is given, use the specified\n" " threshold only when comparing fields whose positions lie in RANGE." msgstr "" #: options.c:86 options.c:90 msgid "" "If both RANGE1 and RANGE2 are given and have the same length,\n" " then use the specified threshold when comparing a field of FILE1\n" " lying in RANGE1 with the corresponding field of FILE2 in RANGE2" msgstr "" #: options.c:88 msgid "" "Set to THRVAL the maximum relative difference permitted\n" " before that two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" #: options.c:92 msgid "" "Consider two numerical values as equal only if\n" " both absolute and relative difference do not exceed\n" " the corresponding tolerance threshold" msgstr "" #: options.c:94 msgid "Use the formula indicated by NUM to compute the relative errors." msgstr "" #: options.c:95 msgid "If 'NUM' is 0 use the classic formula." msgstr "" #: options.c:96 msgid "" "If 'NUM' is 1 compute the relative errors by considering\n" " the values in FILE1 as sample values." msgstr "" #: options.c:97 msgid "" "If 'NUM' is 2 compute the relative errors by considering\n" " the values in FILE2 as sample values." msgstr "" #: options.c:99 msgid "" "Set to NUM the number of digits in the significands\n" " used in multiple precision arithmetic" msgstr "" #: options.c:101 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are less than the corresponding numeric fields in the first file" msgstr "" #: options.c:103 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are greater than the corresponding numeric fields in the first file" msgstr "" #: options.c:105 msgid "Ignore changes in case while doing literal comparisons" msgstr "" #: options.c:107 msgid "Set to CURRNAME the currency name for the two files to compare." msgstr "" #: options.c:108 msgid "" "CURRNAME must be prefixed with 1: or 2: to specify the\n" " currency name only for the first or the second file" msgstr "" #: options.c:110 msgid "" "Specify the characters representing the decimal point\n" " in the two files to compare" msgstr "" #: options.c:112 msgid "" "Specify the characters representing the thousands separator\n" " in the two files to compare" msgstr "" #: options.c:114 msgid "" "Specify the number of digits forming each group of thousands\n" " in the two files to compare" msgstr "" #: options.c:116 msgid "" "Specify the (optional) prefixes for positive values\n" " used in the two files to compare" msgstr "" #: options.c:118 msgid "" "Specify the prefixes for negative values\n" " used in the two files to compare" msgstr "" #: options.c:120 msgid "" "Specify the exponent letters\n" " used in the two files to compare" msgstr "" #: options.c:122 msgid "" "Specify the characters representing the imaginary unit\n" " in the two files to compare" msgstr "" #: options.c:124 msgid "Select the fields of the first file that have to be ignored" msgstr "" #: options.c:126 msgid "Select the fields of the second file that have to be ignored" msgstr "" #: options.c:128 msgid "" "While printing the differences between the two compared files\n" " show only the numerical ones" msgstr "" #: options.c:130 msgid "" "While printing the differences between the two compared files\n" " neglect all the numerical ones (dummy mode)" msgstr "" #: options.c:132 msgid "" "Suppress all messages concerning the differences discovered\n" " in the structures of the two files" msgstr "" #: options.c:134 msgid "" "For every couple of lines which differ in at least one field print\n" " an header to show how these lines appear in the two compared files" msgstr "" #: options.c:136 msgid "" "Display a side by side difference listing of the two files\n" " showing which lines are present only in one file, which\n" " lines are present in both files but with one or more differing fields,\n" " and which lines are identical." msgstr "" #: options.c:137 options.c:158 msgid "" "If 'NUM' is zero or is not specified, output at most 130 columns per line." msgstr "" #: options.c:138 options.c:159 msgid "If 'NUM' is a positive number, output at most 'NUM' columns per line." msgstr "" #: options.c:139 options.c:160 msgid "" "If 'NUM' is a negative number, do not output common lines\n" " and display at most -'NUM' columns per line." msgstr "" #: options.c:141 msgid "Suppress all the standard output" msgstr "" #: options.c:143 msgid "Add some statistics to the standard output" msgstr "" #: options.c:145 msgid "" "Select the fields of the first file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" #: options.c:147 msgid "" "Select the fields of the second file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" #: options.c:149 msgid "" "Select the fields of the first file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" #: options.c:151 msgid "" "Select the fields of the second file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" #: options.c:153 msgid "During synchronization try hard to find a smaller set of changes" msgstr "" #: options.c:155 msgid "" "During synchronization assume large files and\n" " many scattered small changes" msgstr "" #: options.c:157 msgid "" "Run only the filter and then show the results of its\n" " attempt to synchronize the two files." msgstr "" #: options.c:162 msgid "" "Expand tabs to spaces in output while displaying the results of the\n" " synchronization procedure (meaningful only together with option -O or -f)" msgstr "" #: options.c:164 msgid "Treat both files as binary files (only meaningful under Doz/Windoz)" msgstr "" #: options.c:166 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" #: options.c:168 msgid "Redirect output from stdout to the indicated file" msgstr "" #: options.c:169 msgid "Show help message and predefined settings" msgstr "" #: options.c:170 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" #: options.c:172 msgid "" "\n" " Default numeric format (for both files to compare):\n" msgstr "" #: options.c:173 #, c-format msgid "Currency name = \"%s\"\n" msgstr "" #: options.c:174 #, c-format msgid "Decimal point = `%c'\n" msgstr "" #: options.c:176 options.c:955 options.c:986 #, c-format msgid "Thousands separator = `%c'\n" msgstr "" #: options.c:177 #, c-format msgid "Number of digits in each thousands group = %u\n" msgstr "" #: options.c:179 options.c:956 options.c:987 #, c-format msgid "Leading positive sign = `%c'\n" msgstr "" #: options.c:180 options.c:957 options.c:988 #, c-format msgid "Leading negative sign = `%c'\n" msgstr "" #: options.c:181 options.c:958 options.c:989 #, c-format msgid "Prefix for decimal exponent = `%c'\n" msgstr "" #: options.c:182 options.c:961 options.c:992 #, c-format msgid "" "Symbol used to denote the imaginary unit = `%c'\n" "\n" msgstr "" #: options.c:467 options.c:513 options.c:528 options.c:545 options.c:560 #: options.c:582 options.c:804 options.c:831 options.c:874 options.c:889 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "" #: options.c:600 options.c:614 options.c:634 options.c:667 options.c:681 #: options.c:701 #, c-format msgid "%s: memory exhausted\n" msgstr "" #: options.c:642 options.c:708 options.c:726 options.c:733 options.c:745 #: options.c:752 options.c:789 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "" #: options.c:644 #, c-format msgid "" " The list of field delimiters can not be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" #: options.c:710 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\").\n" " Care that the newline character cannot appear\n" " in any other delimiter than the newline string\n" msgstr "" #: options.c:728 options.c:747 #, c-format msgid " The format specification has not been respected\n" msgstr "" #: options.c:735 options.c:754 #, c-format msgid " The specified ranges do not have the same length\n" msgstr "" #: options.c:791 #, c-format msgid " you have missed to specify the currency name\n" msgstr "" #: options.c:900 options.c:909 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "" #: options.c:951 #, c-format msgid "The numeric format specified for the first file is illegal,\n" msgstr "" #: options.c:953 options.c:984 #, c-format msgid "" "the following symbols should be all different\n" "while two or more of them are actually equal:\n" msgstr "" #: options.c:954 options.c:985 #, c-format msgid "" "\n" "Decimal point = `%c'\n" msgstr "" #: options.c:968 #, c-format msgid "The numeric format specified for the first file is illegal:\n" msgstr "" #: options.c:970 options.c:1001 #, c-format msgid "the name of the currency may not contain digits,\n" msgstr "" #: options.c:972 options.c:1003 #, c-format msgid "the symbol for the leading positive sign (`%c'),\n" msgstr "" #: options.c:974 options.c:1005 #, c-format msgid "the symbol for the leading negative sign (`%c'),\n" msgstr "" #: options.c:976 options.c:1007 #, c-format msgid "the decimal point (`%c'), or the thousands separator (`%c')\n" msgstr "" #: options.c:982 #, c-format msgid "The numeric format specified for the second file is illegal,\n" msgstr "" #: options.c:999 #, c-format msgid "The numeric format specified for the second file is illegal:\n" msgstr "" #: thrlist.c:341 #, c-format msgid "Fatal error occurred during comparison of two numerical fields\n" msgstr "" #: xalloc-die.c:35 msgid "memory exhausted" msgstr "" ./numdiff-5.8.1/util.c0000444000175000017500000002650612215353073013455 0ustar ivanoivano/* Support routines for GNU DIFF. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff 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. Numdiff 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 "numdiff.h" #include "linesplit.h" #include #include /* Use when a system call returns non-zero status. NAME should normally be the file name. */ void perror_with_name (char const *name) { error (0, errno, "%s", name); } /* Use when a system call returns non-zero status and that is fatal. */ void pfatal_with_name (char const *name) { int e = errno; error (EXIT_TROUBLE, e, "%s", name); abort (); } /* Compare two lines (typically one from each input file) according to the command line options. For efficiency, this is invoked only when the lines do not match exactly but an option like -i might cause us to ignore the difference. Return nonzero if the lines differ. */ /* * lines_differ() is used in "inout.c" to compare lines coming possibly * from the same file. */ extern char** def_ifs; bool lines_differ (char const *s1, char const *s2, int index1, int index2, argslist* argl) { const unsigned long fieldno_upper_limit = 8*FIELDMASK_SIZE; register char const *f1 = s1; register char const *f2 = s2; char *e1, *e2, ch1, ch2; unsigned long fieldno1, fieldno2; int f1_is_num, f2_is_num, f1_is_blurred, f2_is_blurred; /* Cache often-used quantities in local variables to help the compiler. */ int ignore_case = argl->optmask & _SI_MASK; const char** ifs = (const char**)((index1) ? argl->ifs2 : argl->ifs1); const struct numfmt* pnf = (index1) ? &argl->nf2 : &argl->nf1; unsigned char* ghostmask = (index1) ? argl->ghostmask2 : argl->ghostmask1; unsigned char* pblurmask = (index1) ? argl->pblurmask2 : argl->pblurmask1; unsigned char* tblurmask = (index1) ? argl->tblurmask2 : argl->tblurmask1; /* s1 */ const char** Ifs = (const char**)((index2) ? argl->ifs2 : argl->ifs1); const struct numfmt* Pnf = (index2) ? &argl->nf2 : &argl->nf1; unsigned char* Ghostmask = (index2) ? argl->ghostmask2 : argl->ghostmask1; unsigned char* Pblurmask = (index2) ? argl->pblurmask2 : argl->pblurmask1; unsigned char* Tblurmask = (index2) ? argl->tblurmask2 : argl->tblurmask1; /* s2 */ ifs = (!ifs) ? (const char**)def_ifs : ifs; Ifs = (!Ifs) ? (const char**)def_ifs : Ifs; f1 = string_spn (f1, ifs, '\n'); f2 = string_spn (f2, Ifs, '\n'); fieldno1 = fieldno2 = 0; while (*f1 != '\n' && *f2 != '\n') { /* Ignore the fields selected through the option -X */ while ( *f1 != '\n' && fieldno1 < fieldno_upper_limit && (ghostmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { /* First move `f1' to the begin of the next field */ e1 = string_cspn (f1, ifs, '\n'); f1 = string_spn (e1, ifs, '\n'); /* and then increment the field index */ fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } while ( *f2 != '\n' && fieldno2 < fieldno_upper_limit && (Ghostmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { /* First move `f2' to the begin of the next field */ e2 = string_cspn (f2, Ifs, '\n'); f2 = string_spn (e2, Ifs, '\n'); /* and then increment the field index */ fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } if (*f1 != '\n' && *f2 != '\n') { /* Find the ends of the fields */ e1 = string_cspn (f1, ifs, '\n'); e2 = string_cspn (f2, Ifs, '\n'); /* Mark the ends of the fields before calling acxnum(). But before doing this, save the original characters placed just after the fields. */ ch1 = *e1; ch2 = *e2; *e1 = *e2 = '\0'; /* Determine the types of the fields */ f1_is_num = acxnum (f1, pnf) >= e1; f2_is_num = acxnum (f2, Pnf) >= e2; /* Determine whether the fields are blurred or not */ f1_is_blurred = (tblurmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) || ((pblurmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) && (f1_is_num)); f2_is_blurred = (Tblurmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) || ((Pblurmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) && (f2_is_num)); if (f1_is_blurred != f2_is_blurred) return 1; else if ((f1_is_blurred)) { /* `f1' and `f2' are both blurred */ *e1 = ch1; *e2 = ch2; } else { /* Neither `f1' nor `f2' is blurred */ if (f1_is_num != f2_is_num) /* If one field is numeric but the other one not, then the two lines are surely different :) */ return 1; else if ( (f1_is_num) ) { /* If both fields are numeric, then perform a reduction to a standard numerical format before the byte-by-byte comparison. */ if ( (compare_numeric_strings (f1, pnf, f2, Pnf)) ) return 1; else { *e1 = ch1; *e2 = ch2; } } else { /* If the fields are not numeric, then go on with byte-by-byte comparison, */ *e1 = ch1; *e2 = ch2; if ((ignore_case)) for (; f1 < e1 && f2 < e2 && TOLOWER(*f1) == TOLOWER(*f2); f1++, f2++); else for (; f1 < e1 && f2 < e2 && *f1 == *f2; f1++, f2++); if (f1 < e1 || f2 < e2) return 1; /* else: We have automatically f1 == e1 && f2 == e2 */ } } /* Move to the next field and increase the field number */ f1 = string_spn (e1, ifs, '\n'); f2 = string_spn (e2, Ifs, '\n'); fieldno1++; fieldno2++; } /* End else --> if (*f1 != '\n' && *f2!= '\n') */ } /* end while (*f1 != '\n' && *f2 != '\n') */ /* Ignore the fields selected through the option -X */ while ( *f1 != '\n' && fieldno1 < fieldno_upper_limit && (ghostmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { /* First move `f1' to the begin of the next field */ e1 = string_cspn (f1, ifs, '\n'); f1 = string_spn (e1, ifs, '\n'); /* and then increment the field index */ fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } while ( *f2 != '\n' && fieldno2 < fieldno_upper_limit && (Ghostmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { /* First move `f2' to the begin of the next field */ e2 = string_cspn (f2, Ifs, '\n'); f2 = string_spn (e2, Ifs, '\n'); /* and then increment the field index */ fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } return (*f1 != *f2); } /* Divide SCRIPT into pieces by calling HUNKFUN and print each piece with PRINTFUN. Both functions take one arg, an edit script. HUNKFUN is called with the tail of the script and returns the last link that belongs together with the start of the tail. PRINTFUN takes a subscript which belongs together (with a null link at the end) and prints it. */ void print_script (struct change *script, void (*printfun) (struct change *)) { struct change *next = script; struct change *this; while ((next)) { this = next; /* Disconnect them from the rest of the changes, making them a hunk, and remember the rest for next iteration. */ next = this->link; this->link = 0; #ifdef _DEBUG_SCRIPT_ debug_script (this); #endif /* Print this hunk. */ (*printfun) (this); /* Reconnect the script so it will all be freed properly. */ this->link = next; } } /* Look at a hunk of edit script and report the range of lines in each file that it applies to. HUNK is the start of the hunk, which is a chain of `struct change'. The first and last line numbers of file 0 are stored in *FIRST0 and *LAST0, and likewise for file 1 in *FIRST1 and *LAST1. Note that these are internal line numbers that count from 0. If no lines from file 0 are deleted, then FIRST0 is LAST0+1. Return UNCHANGED if only ignorable lines are inserted or deleted, OLD if lines of file 0 are deleted, NEW if lines of file 1 are inserted, and CHANGED if both kinds of changes are found. */ enum changes analyze_hunk (struct change *hunk, lin *first0, lin *last0, lin *first1, lin *last1) { struct change *next; lin l0, l1; lin show_from, show_to; show_from = show_to = 0; *first0 = hunk->line0; *first1 = hunk->line1; next = hunk; do { l0 = next->line0 + next->deleted - 1; l1 = next->line1 + next->inserted - 1; show_from += next->deleted; show_to += next->inserted; } while ((next = next->link) != 0); *last0 = l0; *last1 = l1; return (show_from ? OLD : UNCHANGED) | (show_to ? NEW : UNCHANGED); } /* Yield a new block of SIZE bytes, initialized to zero. */ void * zalloc (size_t size) { void *p = xmalloc (size); memset (p, 0, size); return p; } #ifdef _DEBUG_SCRIPT_ void debug_script (struct change *sp) { fflush (stdout); for (; sp; sp = sp->link) { long line0 = sp->line0; long line1 = sp->line1; long deleted = sp->deleted; long inserted = sp->inserted; fprintf (stderr, "%3ld %3ld delete %ld insert %ld\n", line0, line1, deleted, inserted); } fflush (stderr); } #endif ./numdiff-5.8.1/unlocked-io.h0000644000175000017500000000503712215353073014714 0ustar ivanoivano/* Copyright 1992, 1993, 1994, 1997, 1999, 2000, 2001 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef UNLOCKED_IO_H # define UNLOCKED_IO_H 1 # ifndef USE_UNLOCKED_IO # define USE_UNLOCKED_IO 1 # endif # if USE_UNLOCKED_IO /* These are wrappers for functions/macros from GNU libc. The standard I/O functions are thread-safe. These *_unlocked ones are more efficient but not thread-safe. That they're not thread-safe is fine since all of the applications in this package are single threaded. */ # if HAVE_DECL_CLEARERR_UNLOCKED # undef clearerr # define clearerr(x) clearerr_unlocked (x) # endif # if HAVE_DECL_FEOF_UNLOCKED # undef feof # define feof(x) feof_unlocked (x) # endif # if HAVE_DECL_FERROR_UNLOCKED # undef ferror # define ferror(x) ferror_unlocked (x) # endif # if HAVE_DECL_FFLUSH_UNLOCKED # undef fflush # define fflush(x) fflush_unlocked (x) # endif # if HAVE_DECL_FGETS_UNLOCKED # undef fgets # define fgets(x,y,z) fgets_unlocked (x,y,z) # endif # if HAVE_DECL_FPUTC_UNLOCKED # undef fputc # define fputc(x,y) fputc_unlocked (x,y) # endif # if HAVE_DECL_FPUTS_UNLOCKED # undef fputs # define fputs(x,y) fputs_unlocked (x,y) # endif # if HAVE_DECL_FREAD_UNLOCKED # undef fread # define fread(w,x,y,z) fread_unlocked (w,x,y,z) # endif # if HAVE_DECL_FWRITE_UNLOCKED # undef fwrite # define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z) # endif # if HAVE_DECL_GETC_UNLOCKED # undef getc # define getc(x) getc_unlocked (x) # endif # if HAVE_DECL_GETCHAR_UNLOCKED # undef getchar # define getchar() getchar_unlocked () # endif # if HAVE_DECL_PUTC_UNLOCKED # undef putc # define putc(x,y) putc_unlocked (x,y) # endif # if HAVE_DECL_PUTCHAR_UNLOCKED # undef putchar # define putchar(x) putchar_unlocked (x) # endif # endif /* USE_UNLOCKED_IO */ #endif /* UNLOCKED_IO_H */ ./numdiff-5.8.1/BUGS0000444000175000017500000000221712215353073013010 0ustar ivanoivanoBug reports have to be sent to the address . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. ------------------------------------------------------------------------------- Known issues ============ If you use gcc 4.7.2 or clang 3.3 to compile and build Numdiff (but other versions of these compilers could also be affected by this issue), do not run "configure" with "--enable-optimization" and do not set the environment variable CFLAGS to -O, -O1, -O2, etc., unless you also use "--disable-gmp". If you enable the optimized build of the code while keeping GMP-based multiple precision arithmetic active, then the executable of Numdiff you get will not run properly (long execution time with overloading of the processor). ./numdiff-5.8.1/options.c0000444000175000017500000011042312215353073014163 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #define GDIFF_OPTIONS 1 /* Leave this inclusion at the begin, otherwise problems */ /* with the symbol __USE_FILE_OFFSET64 */ #include"numdiff.h" #include #include #include #include #include #include"getopt.h" #include"error.h" #include"linesplit.h" #include"xalloc.h" #ifdef _DMALLOC_ #include /* Useful only for the debugging */ #endif void print_version (const char* progname) { printf ("%s %s\n", progname, VERSION); printf ("Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 %s \n", /* TRANSLATORS: This is a proper name. See the gettext manual, section Names. Pronounciation is like "evaa-no pree-me". */ _("Ivano Primi")); printf (_("\ License GPLv3+: GNU GPL version 3 or later,\n\ see .\n\ This is free software: you are free to change and redistribute it.\n\ There is NO WARRANTY, to the extent permitted by law.\n")); #ifdef USE_GMP printf ("\n%s %s.\n", _("The software has been linked against\n\ the GNU Multiple Precision Arithmetic Library,\n\ version number"), gmp_version); #else /* not USE_GMP */ printf ("\n%s.\n", _("The software has been built with\n\ its own internal support for multiple precision arithmetic")); #endif /* not USE_GMP */ } void print_help (const char* progname) { puts (_("Usage:")); printf ("%s -h|--help|-v|--version %s\n\n", progname, _("or")); printf ("%s %s\n", progname, "[-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]][-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I][-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2][-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][-q][-S][-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]][-T][-B][-l PATH][-o PATH] FILE1 FILE2"); printf (_("\nCompare putatively similar files line by line and field by field,\nignoring small numeric differences or/and different numeric formats.\n\n")); printf (_("RANGE, RANGE1 and RANGE2 stay for a positive integer value or\nfor a range of integer values, like 1-, 3-5 or -7.\n")); printf ("%s\n%s\n%s\n\n%s\n\n", _("The two arguments after the options are the names of the files to compare."), _("The complete paths of the files should be given,\na directory name is not accepted."), _("The given paths cannot refer to the same file\nbut one of them can be \"-\", which refers to stdin."), _("Exit status: 1 if files differ, 0 if they are equal, -1 (255) in case of error")); /* %%% */ printf ("-s, --separators=IFS\n %s\n %s\n %s\n", _("Specify the set of characters to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)."), _("If IFS is prefixed with 1: or 2: then use the given delimiter set\n only for the lines from the first or the second file respectively")); printf ("-D, --delimiters=DELIMS\n %s\n %s\n %s\n", _("Specify the set of strings to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)."), _("If DELIMS is prefixed with 1: or 2: then use the given delimiter set\n only for the lines from the first or the second file respectively")); printf ("-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]\n %s\n %s\n %s\n", _("Set to THRVAL the maximum absolute difference permitted\n before that two numeric fields are regarded as different\n (The default value is zero)."), _("If a RANGE is given, use the specified\n threshold only when comparing fields whose positions lie in RANGE."), _("If both RANGE1 and RANGE2 are given and have the same length,\n then use the specified threshold when comparing a field of FILE1\n lying in RANGE1 with the corresponding field of FILE2 in RANGE2")); printf ("-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]\n %s\n %s\n %s\n", _("Set to THRVAL the maximum relative difference permitted\n before that two numeric fields are regarded as different\n (The default value is zero)."), _("If a RANGE is given, use the specified\n threshold only when comparing fields whose positions lie in RANGE."), _("If both RANGE1 and RANGE2 are given and have the same length,\n then use the specified threshold when comparing a field of FILE1\n lying in RANGE1 with the corresponding field of FILE2 in RANGE2")); printf ("-2, --strict\n %s\n", _("Consider two numerical values as equal only if\n both absolute and relative difference do not exceed\n the corresponding tolerance threshold")); printf ("-F, --formula=NUM\n %s\n %s\n %s\n %s\n", _("Use the formula indicated by NUM to compute the relative errors."), _("If \'NUM\' is 0 use the classic formula."), _("If \'NUM\' is 1 compute the relative errors by considering\n the values in FILE1 as sample values."), _("If \'NUM\' is 2 compute the relative errors by considering\n the values in FILE2 as sample values.")); printf ("-#, --digits=NUM\n %s\n", _("Set to NUM the number of digits in the significands\n used in multiple precision arithmetic")); printf ("-P, --positive-differences\n %s\n", _("Ignore all differences due to numeric fields of the second file that\n are less than the corresponding numeric fields in the first file")); printf ("-N, --negative-differences\n %s\n", _("Ignore all differences due to numeric fields of the second file that\n are greater than the corresponding numeric fields in the first file")); printf ("-I, --ignore-case\n %s\n", _("Ignore changes in case while doing literal comparisons")); printf ("-c, --currency=CURRNAME\n %s\n %s\n", _("Set to CURRNAME the currency name for the two files to compare."), _("CURRNAME must be prefixed with 1: or 2: to specify the\n currency name only for the first or the second file")); printf ("-d, --decimal-point=C1C2\n %s\n", _("Specify the characters representing the decimal point\n in the two files to compare")); printf ("-t, --thousands-separator=C1C2\n %s\n", _("Specify the characters representing the thousands separator\n in the two files to compare")); printf ("-g, --group-length=N1N2\n %s\n", _("Specify the number of digits forming each group of thousands\n in the two files to compare")); printf ("-p, --plus-prefix=C1C2\n %s\n", _("Specify the (optional) prefixes for positive values\n used in the two files to compare")); printf ("-n, --minus-prefix=C1C2\n %s\n", _("Specify the prefixes for negative values\n used in the two files to compare")); printf ("-e, --exponent-letter=C1C2\n %s\n", _("Specify the exponent letters\n used in the two files to compare")); printf ("-i, --imaginary-unit=C1C2\n %s\n", _("Specify the characters representing the imaginary unit\n in the two files to compare")); printf ("-X, --exclude=1:RANGE\n %s\n", _("Select the fields of the first file that have to be ignored")); printf ("-X, --exclude=2:RANGE\n %s\n", _("Select the fields of the second file that have to be ignored")); printf ("-E, --essential\n %s\n", _("While printing the differences between the two compared files\n show only the numerical ones")); printf ("-U, --dummy\n %s\n", _("While printing the differences between the two compared files\n neglect all the numerical ones (dummy mode)")); printf ("-b, --brief\n %s\n", _("Suppress all messages concerning the differences discovered\n in the structures of the two files")); printf ("-V, --verbose\n %s\n", _("For every couple of lines which differ in at least one field print\n an header to show how these lines appear in the two compared files")); printf ("-O, --overview[=NUM]\n %s\n %s\n %s\n %s\n", _("Display a side by side difference listing of the two files\n showing which lines are present only in one file, which\n lines are present in both files but with one or more differing fields,\n and which lines are identical."), _("If \'NUM\' is zero or is not specified, output at most 130 columns per line."), _("If \'NUM\' is a positive number, output at most \'NUM\' columns per line."), _("If \'NUM\' is a negative number, do not output common lines\n and display at most -\'NUM\' columns per line.")); printf ("-q, --quiet, --silent\n %s\n", _("Suppress all the standard output")); printf ("-S, --statistics\n %s\n", _("Add some statistics to the standard output")); printf ("-z, --blur-if-numerical=1:RANGE\n %s\n", _("Select the fields of the first file that have to be\n blurred during the synchronization procedure\n only if they turn out to be numeric")); printf ("-z, --blur-if-numerical=2:RANGE\n %s\n", _("Select the fields of the second file that have to be\n blurred during the synchronization procedure\n only if they turn out to be numeric")); printf ("-Z, --blur-unconditionally=1:RANGE\n %s\n", _("Select the fields of the first file that have to be\n unconditionally blurred during the synchronization procedure")); printf ("-Z, --blur-unconditionally=2:RANGE\n %s\n", _("Select the fields of the second file that have to be\n unconditionally blurred during the synchronization procedure")); printf ("-m, --minimal\n %s\n", _("During synchronization try hard to find a smaller set of changes")); printf ("-H, --speed-large-files\n %s\n", _("During synchronization assume large files and\n many scattered small changes")); printf ("-f, --test-filter[=NUM]\n %s\n %s\n %s\n %s\n", _("Run only the filter and then show the results of its\n attempt to synchronize the two files."), _("If \'NUM\' is zero or is not specified, output at most 130 columns per line."), _("If \'NUM\' is a positive number, output at most \'NUM\' columns per line."), _("If \'NUM\' is a negative number, do not output common lines\n and display at most -\'NUM\' columns per line.")); printf ("-T, --expand-tabs\n %s\n", _("Expand tabs to spaces in output while displaying the results of the\n synchronization procedure (meaningful only together with option -O or -f)")); printf ("-B, --binary\n %s\n", _("Treat both files as binary files (only meaningful under Doz/Windoz)")); printf ("-l, --warnings-to=PATH\n %s\n", _("Redirect warning and error messages from stderr to the indicated file")); printf ("-o, --output=PATH\n %s\n", _("Redirect output from stdout to the indicated file")); printf ("-h, --help\n %s\n", _("Show help message and predefined settings")); printf ("-v, --version\n %s\n", _("Show version number, Copyright, Distribution Terms and NO-Warranty")); /* %%% */ puts (_("\n Default numeric format (for both files to compare):\n")); printf (_("Currency name = \"%s\"\n"), CURRENCY); printf (_("Decimal point = `%c\'\n"), DP); printf (_("Thousands separator = `%c\'\n"), THSEP); printf (_("Number of digits in each thousands group = %u\n"), GROUPING); printf (_("Leading positive sign = `%c\'\n"), POS_SIGN); printf (_("Leading negative sign = `%c\'\n"), NEG_SIGN); printf (_("Prefix for decimal exponent = `%c\'\n"), ECH); printf (_("Symbol used to denote the imaginary unit = `%c\'\n\n"), IU); } static int nfset (int opt_ch, const char* opt_arg, argslist* arg_list) { if (strlen(opt_arg) <= 2) { char _1st = *opt_arg, _2nd = *(opt_arg+1); switch (opt_ch) { case 'd': if ( (is_punct(_1st)) && (_2nd == '\0' || is_punct(_2nd)) ) { arg_list->optmask |= _D_MASK; arg_list->nf1.dp = _1st; arg_list->nf2.dp = (_2nd) ? _2nd : _1st; return 0; } break; case 't': if ( (is_punct(_1st)) && (_2nd == '\0' || is_punct(_2nd)) ) { arg_list->optmask |= _T_MASK; arg_list->nf1.thsep = _1st; arg_list->nf2.thsep = (_2nd) ? _2nd : _1st; return 0; } break; case 'e': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { arg_list->optmask |= _E_MASK; arg_list->nf1.ech = _1st; arg_list->nf2.ech = (_2nd) ? _2nd : _1st; return 0; } break; case 'n': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { arg_list->optmask |= _N_MASK; arg_list->nf1.neg_sign = _1st; arg_list->nf2.neg_sign = (_2nd) ? _2nd : _1st; return 0; } break; case 'i': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { arg_list->optmask |= _I_MASK; arg_list->nf1.iu = _1st; arg_list->nf2.iu = (_2nd) ? _2nd : _1st; return 0; } break; case 'p': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { arg_list->optmask |= _P_MASK; arg_list->nf1.pos_sign = _1st; arg_list->nf2.pos_sign = (_2nd) ? _2nd : _1st; return 0; } break; case 'g': if ( (is_digit(_1st)) && (_2nd == '\0' || is_digit(_2nd)) ) { arg_list->optmask |= _G_MASK; arg_list->nf1.grouping = _1st - '0'; arg_list->nf2.grouping = (_2nd) ? _2nd - '0': _1st - '0'; return 0; } break; } } return -1; } static int fselect (const char* str, unsigned char* mask, int mask_size) { long beg, end; unsigned long n; char *ptr, *endptr; beg = end = -1; if (!str || !*str) return 0; /* no field selected */ /* If we arrive here we are sure that *str != '\0' ! */ if ( strcmp (str, "@") == 0 ) { /* select all fields */ for (mask_size /= 8; mask_size > 0; mask_size--, mask[mask_size] = 0xFF); return 1; } if ((beg = strtol (str, &endptr, 10)) == 0 || beg > mask_size || beg < -mask_size) return -1; /* illegal input */ else if (beg < 0) { if (*endptr == '\0') { end = -beg; beg = 1; } else return -1; } else if (*endptr == '\0') end = beg; else if (*endptr == '-') { if (*(ptr = endptr + 1) == '\0') end = mask_size; else { if ((end = strtol (ptr, &endptr, 10)) <= 0 || *endptr != '\0' || end > mask_size) return -1; /* illegal input */ } } if (beg > end) return -1; else { /* Remark: internally the field numbers start from zero, not from one */ for (n = beg - 1; n <= end - 1; n++) mask[n >> 3] |= 0x80 >> (n & 0x7); return 1; } } #define VALID_NUMFMT 0 #define INVALID_NUMFMT -1 #define INVALID_CURRENCY -2 static int is_numfmt_valid (const struct numfmt* pnf) { char store[NUMFMT_CHARS]; char *ptr; int i, j; for (ptr = pnf->currency; *ptr != '\0' && (!is_digit(*ptr)) && *ptr != pnf->dp && *ptr != pnf->thsep && *ptr != pnf->pos_sign && *ptr != pnf->neg_sign; ptr++); if (*ptr != '\0') return INVALID_CURRENCY; store[0] = pnf->dp; store[1] = pnf->thsep; store[2] = pnf->pos_sign; store[3] = pnf->neg_sign; store[4] = pnf->ech; store[5] = pnf->iu; for (i=0; i < NUMFMT_CHARS; i++) { for (j = i+1; j < NUMFMT_CHARS; j++) if (store[i] == store[j]) return INVALID_NUMFMT; } return VALID_NUMFMT; } extern int optind; int setargs (int argc, char* argv[], argslist *list) { const int mask_size = FIELDMASK_SIZE*8; const char *optstring = "h2F:bBVO::qUESIPNz:Z:mHT#:s:D:a:r:c:d:t:g:p:n:e:i:f::X:l:o:v"; struct option long_options[] = { {"help", 0, NULL, 'h'}, {"strict", 0, NULL, '2'}, {"formula", 1, NULL, 'F'}, {"brief", 0, NULL, 'b'}, {"binary", 0, NULL, 'B'}, {"verbose", 0, NULL, 'V'}, {"overview", 2, NULL, 'O'}, {"quiet", 0, NULL, 'q'}, {"silent", 0, NULL, 'q'}, {"dummy", 0, NULL, 'U'}, {"essential", 0, NULL, 'E'}, {"statistics", 0, NULL, 'S'}, {"ignore-case", 0, NULL, 'I'}, {"positive-differences", 0, NULL, 'P'}, {"negative-differences", 0, NULL, 'N'}, {"blur-if-numerical", 1, NULL, 'z'}, {"blur-unconditionally", 1, NULL, 'Z'}, {"minimal", 0, NULL, 'm'}, {"speed-large-files", 0, NULL, 'H'}, {"expand-tabs", 0, NULL, 'T'}, {"digits", 1, NULL, '#'}, {"separators", 1, NULL, 's'}, {"delimiters", 1, NULL, 'D'}, {"absolute-tolerance", 1, NULL, 'a'}, {"relative-tolerance", 1, NULL, 'r'}, {"currency", 1, NULL, 'c'}, {"decimal-point", 1, NULL, 'd'}, {"thousands-separator", 1, NULL, 't'}, {"group-length", 1, NULL, 'g'}, {"plus-prefix", 1, NULL, 'p'}, {"minus-prefix", 1, NULL, 'n'}, {"exponent-letter", 1, NULL, 'e'}, {"imaginary-unit", 1, NULL, 'i'}, {"test-filter", 2, NULL, 'f'}, {"exclude", 1, NULL, 'X'}, {"warnings-to", 1, NULL, 'l'}, {"output", 1, NULL, 'o'}, {"version", 0, NULL, 'v'}, {0, 0, 0, 0} }; int option_index=0; char *tail; int i, optch, off, rv; unsigned int t, file_id; long w; unsigned char *bitmask; /* We start by loading the default values for the user settable options. The initialization of the variables list->maxrelerr, list->maxabserr, list->Labserr, list->Crelerr, list->Lrelerr, list->Cabserr, list->N1abserr, list->N1disperr, list->N2abserr, list->N2disperr is done within main() through init_mpa_support(). */ binary = 0; suppress_common_lines = 0; ignore_white_space = IGNORE_NO_WHITE_SPACE; expand_tabs = 0; w = DEF_ATMOST_NCOLS; speed_large_files = 0; program_name = PACKAGE; list->optmask = 0x0; list->output_mode = OUTMODE_NORMAL; for (i=0; i < FIELDMASK_SIZE; list->ghostmask1[i] = list->ghostmask2[i] = list->tblurmask1[i] = list->tblurmask2[i] = list->pblurmask1[i] = list->pblurmask2[i] = 0x0, i++); list->relerr_formula = CLASSIC_FORMULA; list->Nentries = list->Ndisperr = 0; list->flag = 0; list->ifs1 = list->ifs2 = NULL; list->iscale = ISCALE; list->nf1.dp = DP; list->nf1.thsep = THSEP; list->nf1.grouping = GROUPING; list->nf1.pos_sign = POS_SIGN; list->nf1.neg_sign = NEG_SIGN; list->nf1.ech = ECH; list->nf1.iu = IU; list->file1 = list->file2 = NULL; list->nf2 = list->nf1; list->nf1.currency = get_separating_string (CURRENCY); list->nf2.currency = get_separating_string (CURRENCY); while ( (optch = getopt_long (argc, argv, optstring, long_options, &option_index)) != -1 ) { switch (optch) { case 'h': list->optmask |= _H_MASK; break; case '2': list->optmask |= _2_MASK; break; case 'F': if (strncmp ("0", optarg, 1) == 0) list->relerr_formula = CLASSIC_FORMULA; else if (strncmp ("1", optarg, 1) == 0) list->relerr_formula = WR_TO_FIRST_FILE; else if (strncmp ("2", optarg, 1) == 0) list->relerr_formula = WR_TO_SECOND_FILE; else { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } break; case 'b': list->optmask |= _B_MASK; break; case 'B': binary = 1; break; case 'V': list->optmask |= _SV_MASK; break; case 'q': list->optmask |= _Q_MASK; break; case 'U': list->optmask |= _SU_MASK; break; case 'E': list->optmask |= _SE_MASK; break; case 'S': list->optmask |= _SS_MASK; break; case 'I': list->optmask |= _SI_MASK; break; case 'P': list->optmask |= _SP_MASK; list->flag = 1; break; case 'N': list->optmask |= _SN_MASK; list->flag = -1; break; case 'z': if ( (i = strncmp (optarg, "1:", 2)) && (strncmp (optarg, "2:", 2)) ) { /* None of the prefixes 1: and 2: has been used, then we have to select fields for both files */ if (fselect (optarg, list->pblurmask1, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { fselect (optarg, list->pblurmask2, mask_size); list->optmask |= _Z_MASK; } } else { bitmask = i == 0 ? list->pblurmask1 : list->pblurmask2; if (fselect (optarg+2, bitmask, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else list->optmask |= _Z_MASK; } break; case 'Z': if ( (i = strncmp (optarg, "1:", 2)) && (strncmp (optarg, "2:", 2)) ) { /* None of the prefixes 1: and 2: has been used, then we have to select fields for both files */ if (fselect (optarg, list->tblurmask1, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { fselect (optarg, list->tblurmask2, mask_size); list->optmask |= _SZ_MASK; } } else { bitmask = i == 0 ? list->tblurmask1 : list->tblurmask2; if (fselect (optarg+2, bitmask, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else list->optmask |= _SZ_MASK; } break; case 'm': list->optmask |= _M_MASK; break; case 'H': list->optmask |= _SH_MASK; speed_large_files = 1; break; case 'T': expand_tabs = 1; break; case '#': list->iscale = strtol (optarg, &tail, 10); if (*tail != '\0' || list->iscale < 0 || list->iscale > MAX_ISCALE) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else list->optmask |= _X_MASK; break; case 's': if (*optarg == '1' && *(optarg+1) == ':') { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } list->ifs1 = ssplit_former_way (optarg+2); if (!list->ifs1) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else if (*optarg == '2' && *(optarg+1) == ':') { if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs2 = ssplit_former_way (optarg+2); if (!list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs1 = ssplit_former_way (optarg); list->ifs2 = ssplit_former_way (optarg); if (!list->ifs1 || !list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } if ( ((list->ifs1) && !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs1)) || ((list->ifs2) && !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs2)) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The list of field delimiters can not be empty and\n must always include the newline character (\'\\n\')\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs1); remove_duplicates_from_string_vector (list->ifs2); sort_string_vector (list->ifs1); /* This is not strictly necessary */ sort_string_vector (list->ifs2); /* This is not strictly necessary */ list->optmask |= _S_MASK; } break; case 'D': if (*optarg == '1' && *(optarg+1) == ':') { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } list->ifs1 = ssplit (optarg+2, I_DEF_SEP); if (!list->ifs1) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else if (*optarg == '2' && *(optarg+1) == ':') { if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs2 = ssplit (optarg+2, I_DEF_SEP); if (!list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs1 = ssplit (optarg, I_DEF_SEP); list->ifs2 = ssplit (optarg, I_DEF_SEP); if (!list->ifs1 || !list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } if ( ((list->ifs1) && is_char_in_vector(NEWLINE, (const char**) list->ifs1) != 1) || ((list->ifs2) && is_char_in_vector(NEWLINE, (const char**) list->ifs2) != 1) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The list of field delimiters cannot be empty and\n must always include the newline string (\"\\n\").\n Care that the newline character cannot appear\n in any other delimiter than the newline string\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs1); remove_duplicates_from_string_vector (list->ifs2); sort_string_vector (list->ifs1); sort_string_vector (list->ifs2); list->optmask |= _S_MASK; } break; case 'a': rv = thrlist_add (&list->maxabserr, optarg); if (rv == THRLIST_INVALID_FORMAT) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The format specification has not been respected\n")); return -1; } else if (rv == THRLIST_INVALID_RANGES) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The specified ranges do not have the same length\n")); return -1; } else list->optmask |= _A_MASK; break; case 'r': rv = thrlist_add (&list->maxrelerr, optarg); if (rv == THRLIST_INVALID_FORMAT) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The format specification has not been respected\n")); return -1; } else if (rv == THRLIST_INVALID_RANGES) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The specified ranges do not have the same length\n")); return -1; } else list->optmask |= _R_MASK; break; case 'c': file_id = 0x0; if (*optarg == '1' && *(optarg+1) == ':') { if ((list->nf1.currency)) free((void*)list->nf1.currency); list->nf1.currency = get_separating_string (optarg+2); file_id = 0x1; } else if (*optarg == '2' && *(optarg+1) == ':') { if ((list->nf2.currency)) free((void*)list->nf2.currency); list->nf2.currency = get_separating_string (optarg+2); file_id = 0x2; } else { if ((list->nf1.currency)) free((void*)list->nf1.currency); list->nf1.currency = get_separating_string (optarg); if ((list->nf2.currency)) free((void*)list->nf2.currency); list->nf2.currency = get_separating_string (optarg); file_id = 0x3; } if ( (strlen(list->nf1.currency) == 0 && ((file_id & 0x3) == 0x1)) || (strlen(list->nf2.currency) == 0 && ((file_id & 0x3) == 0x2)) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" you have missed to specify the currency name\n")); return -1; } break; case 'd': case 't': case 'g': case 'p': case 'n': case 'e': case 'i': if (nfset (optch, optarg, list) < 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } break; case 'f': case 'O': if (!(list->optmask & (_F_MASK | _SO_MASK))) { if(!optarg) { /* There is no optional argument, then set */ /* 'w' to 'DEF_ATMOST_NCOLS'. */ if (optch == 'f') list->optmask |= _F_MASK; else list->optmask |= _SO_MASK; w = DEF_ATMOST_NCOLS; } else { /* An argument follows */ w = strtol (optarg, &tail, 10); /* If the argument of the option is not a valid number, */ /* then exit after printing a suitable error message. */ if (*tail != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { if (optch == 'f') list->optmask |= _F_MASK; else list->optmask |= _SO_MASK; } /* Otherwise you have to set 'w' appropriately. */ /* If the given argument is less than -MAX_ATMOST_NCOLS */ /* then set 'w' to 'DEF_ATMOST_NCOLS' and 'suppress_common_lines' to 'TRUE'. */ if (w < -MAX_ATMOST_NCOLS) { w = DEF_ATMOST_NCOLS; suppress_common_lines = 1; } /* If the argument were negative, then remove the sign */ /* and set 'suppress_common_lines' to 'TRUE'. */ if (w < 0) { w *= -1; suppress_common_lines = 1; } /* If the given argument is too small or too big in absolute value, */ /* then set 'w' to 'DEF_ATMOST_NCOLS'. */ if (w < MIN_ATMOST_NCOLS || w > MAX_ATMOST_NCOLS) w = DEF_ATMOST_NCOLS; /* Otherwise leave 'w' set to the value of the argument. */ } /* end optarg != 0 */ } break; case 'X': if ( (i = strncmp (optarg, "1:", 2)) && (strncmp (optarg, "2:", 2)) ) { /* None of the prefixes 1: and 2: has been used, then we have to select fields for both files */ if (fselect (optarg, list->ghostmask1, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { fselect (optarg, list->ghostmask2, mask_size); list->optmask |= _SX_MASK; } } else { bitmask = i == 0 ? list->ghostmask1 : list->ghostmask2; if (fselect (optarg+2, bitmask, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else list->optmask |= _SX_MASK; } break; case 'l': if (!freopen (optarg, "w", stderr)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE, optarg); perror(0); return -1; } break; case 'o': if (!freopen (optarg, "w", stdout)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE, optarg); perror(0); return -1; } break; case 'v': list->optmask |= _V_MASK; break; default: /* fprintf (stderr, _("%s: unrecognized option `-%c\' \n"), PACKAGE, optch); */ return -1; } } t = expand_tabs ? 1 : TAB_WIDTH; off = (w + t + 3) / (2 * t) * t; sdiff_half_width = MAX (0, MIN (off - 3, w - off)), sdiff_column2_offset = sdiff_half_width ? off : w; if ( list->optmask & _SV_MASK ) list->output_mode = OUTMODE_VERBOSE; if ( list->optmask & _B_MASK ) list->output_mode = OUTMODE_BRIEF; if (list->optmask & _B_MASK && list->optmask & _SV_MASK) list->output_mode = OUTMODE_COINCISE; if ( list->optmask & _SO_MASK ) list->output_mode = OUTMODE_OVERVIEW; if ( list->optmask & _Q_MASK ) list->output_mode = OUTMODE_QUIET; if (!(list->optmask & (_H_MASK | _V_MASK)) && argc - optind != 2) { print_help (PACKAGE); return -1; } else if ( (rv = is_numfmt_valid(&list->nf1)) == INVALID_NUMFMT ) { fprintf (stderr, _("The numeric format specified for the first file is illegal,\n")); fprintf (stderr, _("the following symbols should be all different\nwhile two or more of them are actually equal:\n")); fprintf (stderr, _("\nDecimal point = `%c\'\n"), list->nf1.dp); fprintf (stderr, _("Thousands separator = `%c\'\n"), list->nf1.thsep); fprintf (stderr, _("Leading positive sign = `%c\'\n"), list->nf1.pos_sign); fprintf (stderr, _("Leading negative sign = `%c\'\n"), list->nf1.neg_sign); fprintf (stderr, _("Prefix for decimal exponent = `%c\'\n"), list->nf1.ech); fprintf (stderr, _("Symbol used to denote the imaginary unit = `%c\'\n\n"), list->nf1.iu); return -1; } else if ( rv == INVALID_CURRENCY ) { fprintf (stderr, _("The numeric format specified for the first file is illegal:\n")); fprintf (stderr, _("the name of the currency may not contain digits,\n")); fprintf (stderr, _("the symbol for the leading positive sign (`%c\'),\n"), list->nf1.pos_sign); fprintf (stderr, _("the symbol for the leading negative sign (`%c\'),\n"), list->nf1.neg_sign); fprintf (stderr, _("the decimal point (`%c\'), or the thousands separator (`%c\')\n"), list->nf1.dp, list->nf1.thsep); return -1; } else if ( (rv = is_numfmt_valid(&list->nf2)) == INVALID_NUMFMT ) { fprintf (stderr, _("The numeric format specified for the second file is illegal,\n")); fprintf (stderr, _("the following symbols should be all different\nwhile two or more of them are actually equal:\n")); fprintf (stderr, _("\nDecimal point = `%c\'\n"), list->nf2.dp); fprintf (stderr, _("Thousands separator = `%c\'\n"), list->nf2.thsep); fprintf (stderr, _("Leading positive sign = `%c\'\n"), list->nf2.pos_sign); fprintf (stderr, _("Leading negative sign = `%c\'\n"), list->nf2.neg_sign); fprintf (stderr, _("Prefix for decimal exponent = `%c\'\n"), list->nf2.ech); fprintf (stderr, _("Symbol used to denote the imaginary unit = `%c\'\n\n"), list->nf2.iu); return -1; } else if ( rv == INVALID_CURRENCY ) { fprintf (stderr, _("The numeric format specified for the second file is illegal:\n")); fprintf (stderr, _("the name of the currency may not contain digits,\n")); fprintf (stderr, _("the symbol for the leading positive sign (`%c\'),\n"), list->nf2.pos_sign); fprintf (stderr, _("the symbol for the leading negative sign (`%c\'),\n"), list->nf2.neg_sign); fprintf (stderr, _("the decimal point (`%c\'), or the thousands separator (`%c\')\n"), list->nf2.dp, list->nf2.thsep); return -1; } else { if( !(list->optmask & (_H_MASK | _V_MASK)) ) { list->file1 = (const char*) argv[optind]; list->file2 = (const char*) argv[optind+1]; } return 0; } } ./numdiff-5.8.1/config.h.in0000444000175000017500000002440712215353073014355 0ustar ivanoivano/* config.h.in. Generated from configure.ac by autoheader. */ /* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `bcopy' function. */ #undef HAVE_BCOPY /* Define to 1 if you have the `btowc' function. */ #undef HAVE_BTOWC /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if C supports variable-length arrays. */ #undef HAVE_C_VARARRAYS /* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_CLEARERR_UNLOCKED /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FEOF_UNLOCKED /* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FERROR_UNLOCKED /* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FFLUSH_UNLOCKED /* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FGETS_UNLOCKED /* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTC_UNLOCKED /* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTS_UNLOCKED /* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FREAD_UNLOCKED /* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FWRITE_UNLOCKED /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETCHAR_UNLOCKED /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETC_UNLOCKED /* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTCHAR_UNLOCKED /* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTC_UNLOCKED /* Define to 1 if you have the declaration of `strerror', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR_R /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if you have the `gmp' library (-lgmp). */ #undef HAVE_LIBGMP /* Define to 1 if you have the `localeconv' function. */ #undef HAVE_LOCALECONV /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the DOS-style `setmode' function. */ #undef HAVE_SETMODE_DOS /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if `st_blksize' is member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLKSIZE /* Define to 1 if `st_rdev' is member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_RDEV /* Define to 1 if your `struct stat' has `st_blksize'. Deprecated, use `HAVE_STRUCT_STAT_ST_BLKSIZE' instead. */ #undef HAVE_ST_BLKSIZE /* Define to 1 if your `struct stat' has `st_rdev'. Deprecated, use `HAVE_STRUCT_STAT_ST_RDEV' instead. */ #undef HAVE_ST_RDEV /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P /* Define to be the nanoseconds member of struct stat's st_mtim, if it exists. */ #undef ST_MTIM_NSEC /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Define to 1 if you want getc etc. to use unlocked I/O if available. Unlocked I/O can improve performance in unithreaded apps, but it is not safe for multithreaded apps. */ #undef USE_UNLOCKED_IO /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `int' if does not define. */ #undef pid_t /* Define to `int' if does not define. */ #undef ptrdiff_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define as `fork' if `vfork' does not work. */ #undef vfork /* Version + Release number */ #define VERSION "5.8.1" /* Number of decimal digits used in displaying the values */ /* for absolute and relative error. */ #define DEF_LIM 10 /* Size of the input buffer (used to read from file) */ #define BUFF_SIZE 1024 /* Size of the mask of fields. FIELDMASK_SIZE * 8 gives the */ /* largest index of field which can be passed to the -F option */ /* on the command line. */ #define FIELDMASK_SIZE 4096 #define HAVE_LONG_LONG 1 /* Line separator (output) */ #define LINE_SEP "----------------" /* End-of-File indicator */ #define EOF_INDICATOR "<<*>>" /* Hyphenation character */ #define HYPHEN '-' ./numdiff-5.8.1/AUTHORS0000444000175000017500000000107012215353073013371 0ustar ivanoivanoNumdiff Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 - Ivano Primi (Ivano Primi is also the author of the program) Note: Numdiff includes source code from * GNU BC 1.06, Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. * GNU C Library, Copyright (C) 1989-1994,1996-1999,2001,2003,2004 Free Software Foundation, Inc. and source code from GNU DIFF, Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. ./numdiff-5.8.1/new.c0000444000175000017500000002166512215353073013272 0ustar ivanoivano/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ivano Primi 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 . */ #include #include /* for isspace() */ #include #include"number.h" #include"numdiff.h" #ifdef _DMALLOC_ #include /* Useful only for debugging */ #endif #ifdef BC_A2NUM_DEBUG #define move_ahead(ptr) out_char_stderr(*ptr), ptr++ #define set(endptr,str) *endptr = (char*)str, fprintf (stderr, "tail: \"%s\"\n", *endptr) #else #define move_ahead(ptr) ptr++ #define set(endptr,str) *endptr = (char*)str #endif static bc_num bc_10_raised_to (long expn, int add_d_dig) { bc_num pw; if (expn >= 0) { pw = bc_new_num (1 + expn, 0); pw->n_value[0] = 1; } else { pw = bc_new_num (1, -expn + add_d_dig); pw->n_value[-expn] = 1; } #ifdef BC_10_DEBUG fprintf (stderr, "10^%ld = ", expn); pn_stderr (pw); #endif return pw; } static int bc_a2num (bc_num *num, const char *str, char **endptr, int scale, const struct numfmt* pnf) { char *ptr, *nptr; int digits, strscale; long expn; char zero_int; size_t length; #ifdef BC_A2NUM_DEBUG fprintf (stderr, "\n\"%s\"\n", str); #endif /* Check for valid number and count digits. */ ptr = (char*)str; digits = 0; strscale = 0; zero_int = FALSE; length = strlen(pnf->currency); if ( (*ptr == pnf->pos_sign) || (*ptr == pnf->neg_sign) ) move_ahead(ptr); /* Sign */ if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ if (pnf->grouping > 0) { while ( (is_digit((int)*ptr)) || *ptr == pnf->thsep ) { int first_sep = 1; if (*ptr == pnf->thsep) { unsigned i; char* ptr2; if ((first_sep)) { /* We have to check that before the separator there is */ /* at least one digit but no more than 'pnf->grouping' */ for (i=0, ptr2 = ptr; ptr2 > str && (is_digit ((int)*(ptr2-1))); i++, ptr2--); if (i == 0 || i > pnf->grouping) { if ((endptr)) set(endptr,str); return -1; } first_sep = 0; } /* We have to check that after the separator */ /* there are exactly 'pnf->grouping' digits */ for (i = 0, ptr2 = ptr + 1; (is_digit((int)*ptr2)); i++, ptr2++); if (i != pnf->grouping) { if ((endptr)) set(endptr,str); return -1; } ptr++; } else /* We have just found a new digit */ move_ahead(ptr), digits++; } } else /* pnf->grouping == 0 */ { while ( (is_digit((int)*ptr)) ) move_ahead(ptr), digits++; /* digits */ } /* OLD CODE */ /* while ( (is_digit((int)*ptr)) ) */ /* ptr++, digits++; */ if (*ptr == pnf->dp) move_ahead(ptr); /* decimal point */ while (is_digit((int)*ptr)) move_ahead(ptr), strscale++; /* digits */ if (digits+strscale == 0) { if ((endptr)) set(endptr,str); *num = bc_copy_num (_zero_); return -1; } if (TOLOWER(*ptr) == TOLOWER(pnf->ech) && !is_space (*(ptr+1))) { char *tail; expn = strtol (ptr + 1, &tail, 10); if (expn < MIN_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too small exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents smaller than %ld are not accepted,\n"), MIN_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if (expn > MAX_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too large exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents larger than %ld are not accepted,\n"), MAX_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if ((endptr)) *endptr = tail != ptr + 1 ? tail : ptr; } else { expn = 0; if ((endptr)) *endptr = ptr; } #ifdef BC_A2NUM_DEBUG fprintf (stderr, "%c%ld\n", pnf->ech, expn); #endif /* Adjust numbers and allocate storage and initialize fields. */ strscale = MIN(strscale, scale); if (digits == 0) { zero_int = TRUE; digits = 1; } *num = bc_new_num (digits, strscale); /* Build the whole number. */ ptr = (char*)str; if (*ptr == pnf->neg_sign) { (*num)->n_sign = MINUS; ptr++; } else { (*num)->n_sign = PLUS; if (*ptr == pnf->pos_sign) ptr++; } if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ nptr = (*num)->n_value; if ((zero_int)) { *nptr++ = 0; digits = 0; } for (; digits > 0; ptr++) { /* We have to take into account the presence of the thousands separator ! */ if (*ptr != pnf->thsep) { /* *ptr is a digit! */ *nptr++ = CH_VAL(*ptr); digits--; } } /* OLD CODE (to build the integer part) for (;digits > 0; digits--) *nptr++ = CH_VAL(*ptr++); */ /* Build the fractional part. */ if (strscale > 0) { ptr++; /* skip the decimal point! */ for (;strscale > 0; strscale--) *nptr++ = CH_VAL(*ptr++); } /* Take into account the exponent */ if((expn)) { bc_num Factor, Prod; bc_init_num (&Prod); Factor = expn > 0 ? bc_10_raised_to (expn, 0) : bc_10_raised_to (expn, scale); bc_multiply (*num, Factor, &Prod, strscale); *num = bc_copy_num (Prod); bc_free_num (&Factor); bc_free_num (&Prod); } #ifdef BC_A2NUM_DEBUG pn_stderr (*num); if((endptr)) fprintf (stderr, "tail: \"%s\"\n", *endptr); #endif return 0; } #define DIM 50 static void bc_print_num (bc_num num, void (* out_char)(int), int prec) { /* The negative sign if needed. */ if (num->n_sign == MINUS) (*out_char) ('-'); /* Output the number. */ if (num->n_value[0] == 10) { (*out_char) ('I'); (*out_char) ('n'); (*out_char) ('f'); } else if (bc_is_zero (num)) { (*out_char) ('0'); (*out_char) ('.'); for (; prec > 0; prec--) (*out_char) ('0'); } else { char *nptr; int index, ndig; signed char dig_list[DIM], *buffer, *p; long expn; assert ((buffer = calloc (prec + 1, sizeof (signed char)))); nptr = num->n_value; #ifdef __DEBUG__ pv ("nptr", nptr, num->n_len + num->n_scale); (*out_char)('\n'); #endif for (expn = num->n_len; expn > 0 && !*nptr; nptr++, expn--); /* Now expn == number of non-null digits */ /* in the integer part of the number */ if (expn == 0) { /* Now nptr points to the first digit */ /* of the fractional part. */ for (index = num->n_scale, expn = -1; !*nptr; index--, expn--, nptr++); /* Now expn is the exponent of the number */ /* in base 10. */ } else { expn--; /* Now expn is the exponent of the number */ /* in base 10. */ for (index = num->n_len + num->n_scale, nptr = num->n_value; !*nptr; index--, nptr++); } /* First we print the mantissa */ for (p = buffer, ndig = prec + 1; ndig > 0 && index > 0; ndig--, index--, p++, nptr++) *p = *nptr; if (ndig == 0 && index > 0) { /* Rounding */ if (*nptr >= 5) { for (--p; p > buffer && *p == 9; *p = 0, p--); if (p == buffer) { if (*p == 9) { *p = 1; expn++; } else (*p)++; } else (*p)++; } } (*out_char)(BCD_CHAR(*buffer)); (*out_char)('.'); for (index = 1; index <= prec; index++) (*out_char)(BCD_CHAR(buffer[index])); free((void*)buffer); /* Now it is the moment to print the exponent... */ (*out_char)('e'); if (expn < 0) { (*out_char) ('-'); expn = -expn; } else (*out_char) ('+'); for (index = 0; index < DIM; dig_list[index] = -1, index++); index = 0; do { dig_list[index] = expn % 10; expn /= 10; index++; } while ((expn)); for (index = 0; dig_list[index] >= 0; index++); for (--index; index >= 0; index--) (*out_char)(BCD_CHAR(dig_list[index])); /* .. done ! */ } /* End of num != 0 */ } ./numdiff-5.8.1/system.h0000444000175000017500000002515012215353073014023 0ustar ivanoivano/* System dependent declarations. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include /* Don't bother to support K&R C compilers any more; it's not worth the trouble. These macros prevent some library modules from being compiled in K&R C mode. */ #define PARAMS(Args) Args #define PROTOTYPES 1 /* Define `__attribute__' and `volatile' first so that they're used consistently in all system includes. */ #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__ # define __attribute__(x) #endif #if defined const && !defined volatile # define volatile #endif /* Verify a requirement at compile-time (unlike assert, which is runtime). */ #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } /* Determine whether an integer type is signed, and its bounds. This code assumes two's (or one's!) complement with no holes. */ /* The extra casts work around common compiler bugs, e.g. Cray C 5.0.3.0 when t == time_t. */ #ifndef TYPE_SIGNED # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) #endif #ifndef TYPE_MINIMUM # define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ : (t) 0)) #endif #ifndef TYPE_MAXIMUM # define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) #endif #include #include #if STAT_MACROS_BROKEN # undef S_ISBLK # undef S_ISCHR # undef S_ISDIR # undef S_ISFIFO # undef S_ISREG # undef S_ISSOCK #endif #ifndef S_ISDIR # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif #ifndef S_ISREG # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif #if !defined S_ISBLK && defined S_IFBLK # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) #endif #if !defined S_ISCHR && defined S_IFCHR # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) #endif #if !defined S_ISFIFO && defined S_IFFIFO # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO) #endif #if !defined S_ISSOCK && defined S_IFSOCK # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) #endif #ifndef S_IXUSR # define S_IXUSR 0100 #endif #ifndef S_IXGRP # define S_IXGRP 0010 #endif #ifndef S_IXOTH # define S_IXOTH 0001 #endif #if HAVE_UNISTD_H # include #endif #ifndef SEEK_SET # define SEEK_SET 0 #endif #ifndef SEEK_CUR # define SEEK_CUR 1 #endif #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO # define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO # define STDERR_FILENO 2 #endif #if HAVE_TIME_H # include #else # include #endif #if HAVE_FCNTL_H # include #else # if HAVE_SYS_FILE_H # include # endif #endif /* Commented out by Ivano Primi, 03.14.2009 */ /* #if !HAVE_DUP2 */ /* # define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t)) */ /* #endif */ #ifndef O_RDONLY # define O_RDONLY 0 #endif #ifndef O_RDWR # define O_RDWR 2 #endif #ifndef S_IRUSR # define S_IRUSR 0400 #endif #ifndef S_IWUSR # define S_IWUSR 0200 #endif #if HAVE_SYS_WAIT_H # include #endif #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif #ifndef STAT_BLOCKSIZE # if HAVE_STRUCT_STAT_ST_BLKSIZE # define STAT_BLOCKSIZE(s) ((s).st_blksize) # else # define STAT_BLOCKSIZE(s) (8 * 1024) # endif #endif #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen ((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) ((dirent)->d_namlen) # if HAVE_SYS_NDIR_H # include # endif # if HAVE_SYS_DIR_H # include # endif # if HAVE_NDIR_H # include # endif #endif #if HAVE_STDLIB_H # include #else # ifndef getenv char *getenv (); # endif #endif #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #if !EXIT_FAILURE # undef EXIT_FAILURE /* Sony NEWS-OS 4.0C defines EXIT_FAILURE to 0. */ # define EXIT_FAILURE 1 #endif #define EXIT_TROUBLE -1 #include #ifndef SSIZE_MAX # define SSIZE_MAX TYPE_MAXIMUM (ssize_t) #endif #if HAVE_INTTYPES_H # include #endif #ifndef PTRDIFF_MAX # define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t) #endif #ifndef SIZE_MAX # define SIZE_MAX TYPE_MAXIMUM (size_t) #endif #ifndef UINTMAX_MAX # define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t) #endif /* Commented out by Ivano Primi, 03.14.2009 */ /* #if ! HAVE_STRTOUMAX && ! defined strtoumax */ /* uintmax_t strtoumax (char const *, char **, int); */ /* #endif */ #include #if STDC_HEADERS || HAVE_STRING_H # include #else # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr (), *strrchr (); # if !HAVE_MEMCHR # define memcmp(s1, s2, n) bcmp (s1, s2, n) # define memcpy(d, s, n) bcopy (s, d, n) void *memchr (); # endif #endif #if HAVE_LOCALE_H # include #else # define setlocale(category, locale) #endif /* Commented out by Ivano Primi, 03.23.2008 #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid */ /* Added by Ivano Primi, 03.23.2008 */ /* This code was part of the file "numdiff.h" */ /* I18N and L10N support */ #ifdef ENABLE_NLS #include #define _(String) gettext (String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) #else #define _(String) (String) #define N_(String) String # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif /* End added code */ #include /* CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given as an argument to macros like `isspace'. */ #if STDC_HEADERS # define CTYPE_DOMAIN(c) 1 #else # define CTYPE_DOMAIN(c) ((unsigned int) (c) <= 0177) #endif #define ISPRINT(c) (CTYPE_DOMAIN (c) && isprint (c)) #define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c)) #if STDC_HEADERS # define TOLOWER(c) tolower (c) #else # ifndef _tolower # define _tolower(c) tolower (c) # endif # define TOLOWER(c) (CTYPE_DOMAIN (c) && isupper (c) ? _tolower (c) : (c)) #endif /* ISDIGIT differs from isdigit, as follows: - Its arg may be any int or unsigned int; it need not be an unsigned char. - It's guaranteed to evaluate its argument exactly once. - It's typically faster. POSIX 1003.1-2001 says that only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless it's important to use the locale's definition of `digit' even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) #include #if !STDC_HEADERS extern int errno; #endif #include #ifndef SA_RESTART # ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */ # define SA_RESTART SA_INTERRUPT # else # define SA_RESTART 0 # endif #endif #if !defined SIGCHLD && defined SIGCLD # define SIGCHLD SIGCLD #endif #undef MIN #undef MAX #define MIN(a, b) ((a) <= (b) ? (a) : (b)) #define MAX(a, b) ((a) >= (b) ? (a) : (b)) #if HAVE_STDBOOL_H # include #else # define bool unsigned char #endif #if HAVE_VFORK_H # include #endif #if ! HAVE_WORKING_VFORK # define vfork fork #endif /* Type used for fast comparison of several bytes at a time. */ #ifndef word # define word uintmax_t #endif /* The integer type of a line number. Since files are read into main memory, ptrdiff_t should be wide enough. */ typedef ptrdiff_t lin; #define LIN_MAX PTRDIFF_MAX verify (lin_is_signed, TYPE_SIGNED (lin)); verify (lin_is_wide_enough, sizeof (ptrdiff_t) <= sizeof (lin)); verify (lin_is_printable_as_long, sizeof (lin) <= sizeof (long)); /* This section contains POSIX-compliant defaults for macros that are meant to be overridden by hand in config.h as needed. */ #ifndef file_name_cmp # define file_name_cmp strcmp #endif #ifndef initialize_main # define initialize_main(argcp, argvp) #endif #ifndef NULL_DEVICE # define NULL_DEVICE "/dev/null" #endif /* Do struct stat *S, *T describe the same special file? */ #ifndef same_special_file # if HAVE_ST_RDEV && defined S_ISBLK && defined S_ISCHR # define same_special_file(s, t) \ (((S_ISBLK ((s)->st_mode) && S_ISBLK ((t)->st_mode)) \ || (S_ISCHR ((s)->st_mode) && S_ISCHR ((t)->st_mode))) \ && (s)->st_rdev == (t)->st_rdev) # else # define same_special_file(s, t) 0 # endif #endif /* Do struct stat *S, *T describe the same file? Answer -1 if unknown. */ #ifndef same_file # define same_file(s, t) \ ((((s)->st_ino == (t)->st_ino) && ((s)->st_dev == (t)->st_dev)) \ || same_special_file (s, t)) #endif /* Do struct stat *S, *T have the same file attributes? POSIX says that two files are identical if st_ino and st_dev are the same, but many filesystems incorrectly assign the same (device, inode) pair to two distinct files, including: - GNU/Linux NFS servers that export all local filesystems as a single NFS filesystem, if a local device number (st_dev) exceeds 255, or if a local inode number (st_ino) exceeds 16777215. - Network Appliance NFS servers in snapshot directories; see Network Appliance bug #195. - ClearCase MVFS; see bug id ATRia04618. Check whether two files that purport to be the same have the same attributes, to work around instances of this common bug. Do not inspect all attributes, only attributes useful in checking for this bug. It's possible for two distinct files on a buggy filesystem to have the same attributes, but it's not worth slowing down all implementations (or complicating the configuration) to cater to these rare cases in buggy implementations. */ #ifndef same_file_attributes # define same_file_attributes(s, t) \ ((s)->st_mode == (t)->st_mode \ && (s)->st_nlink == (t)->st_nlink \ && (s)->st_uid == (t)->st_uid \ && (s)->st_gid == (t)->st_gid \ && (s)->st_size == (t)->st_size \ && (s)->st_mtime == (t)->st_mtime \ && (s)->st_ctime == (t)->st_ctime) #endif